From 17b0493e183edfb90453d12fa79b5ce5a1b0e803 Mon Sep 17 00:00:00 2001 From: Sam Ford <1584702+samford@users.noreply.github.com> Date: Sun, 7 Jul 2024 15:18:29 -0400 Subject: [PATCH] Use struct for `#audit_formula` args Adding type signatures to `#audit_formula` methods in formula cops would lead to verbose, repetitive signatures across the existing ~63 instances. This reworks `#audit_formula` to use a `T::Struct` for its arguments, which allows us to use a one-line signature for these methods. --- Library/Homebrew/rubocops/bottle.rb | 20 ++-- Library/Homebrew/rubocops/caveats.rb | 3 +- Library/Homebrew/rubocops/checksum.rb | 12 +-- Library/Homebrew/rubocops/class.rb | 16 ++- Library/Homebrew/rubocops/components_order.rb | 5 +- .../rubocops/components_redundancy.rb | 5 +- Library/Homebrew/rubocops/conflicts.rb | 5 +- Library/Homebrew/rubocops/dependency_order.rb | 5 +- .../Homebrew/rubocops/deprecate_disable.rb | 10 +- Library/Homebrew/rubocops/desc.rb | 7 +- .../Homebrew/rubocops/extend/formula_cop.rb | 21 ++-- Library/Homebrew/rubocops/files.rb | 5 +- Library/Homebrew/rubocops/homepage.rb | 6 +- Library/Homebrew/rubocops/keg_only.rb | 5 +- Library/Homebrew/rubocops/lines.rb | 100 +++++++++++------- Library/Homebrew/rubocops/livecheck.rb | 34 +++--- Library/Homebrew/rubocops/options.rb | 5 +- Library/Homebrew/rubocops/patches.rb | 12 ++- .../resource_requires_dependencies.rb | 5 +- Library/Homebrew/rubocops/service.rb | 5 +- Library/Homebrew/rubocops/text.rb | 11 +- Library/Homebrew/rubocops/urls.rb | 20 ++-- Library/Homebrew/rubocops/uses_from_macos.rb | 10 +- Library/Homebrew/rubocops/version.rb | 5 +- 24 files changed, 204 insertions(+), 128 deletions(-) diff --git a/Library/Homebrew/rubocops/bottle.rb b/Library/Homebrew/rubocops/bottle.rb index ddbbff8331..567702bd82 100644 --- a/Library/Homebrew/rubocops/bottle.rb +++ b/Library/Homebrew/rubocops/bottle.rb @@ -10,8 +10,9 @@ module RuboCop class BottleFormat < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - bottle_node = find_block(body_node, :bottle) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + bottle_node = find_block(formula_nodes.body_node, :bottle) return if bottle_node.nil? sha256_nodes = find_method_calls_by_name(bottle_node.body, :sha256) @@ -55,8 +56,9 @@ module RuboCop class BottleTagIndentation < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - bottle_node = find_block(body_node, :bottle) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + bottle_node = find_block(formula_nodes.body_node, :bottle) return if bottle_node.nil? sha256_nodes = find_method_calls_by_name(bottle_node.body, :sha256) @@ -89,8 +91,9 @@ module RuboCop class BottleDigestIndentation < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - bottle_node = find_block(body_node, :bottle) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + bottle_node = find_block(formula_nodes.body_node, :bottle) return if bottle_node.nil? sha256_nodes = find_method_calls_by_name(bottle_node.body, :sha256) @@ -123,8 +126,9 @@ module RuboCop class BottleOrder < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - bottle_node = find_block(body_node, :bottle) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + bottle_node = find_block(formula_nodes.body_node, :bottle) return if bottle_node.nil? return if bottle_node.child_nodes.blank? diff --git a/Library/Homebrew/rubocops/caveats.rb b/Library/Homebrew/rubocops/caveats.rb index b1a6926606..bc0ab272c5 100644 --- a/Library/Homebrew/rubocops/caveats.rb +++ b/Library/Homebrew/rubocops/caveats.rb @@ -26,7 +26,8 @@ module RuboCop # end # ``` class Caveats < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, _body_node) + sig { override.params(_formula_nodes: FormulaNodes).void } + def audit_formula(_formula_nodes) caveats_strings.each do |n| if regex_match_group(n, /\bsetuid\b/i) problem "Don't recommend `setuid` in the caveats, suggest `sudo` instead." diff --git a/Library/Homebrew/rubocops/checksum.rb b/Library/Homebrew/rubocops/checksum.rb index d2bf8310b1..de661974ab 100644 --- a/Library/Homebrew/rubocops/checksum.rb +++ b/Library/Homebrew/rubocops/checksum.rb @@ -8,8 +8,9 @@ module RuboCop module FormulaAudit # This cop makes sure that deprecated checksums are not used. class Checksum < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node problem "MD5 checksums are deprecated, please use SHA-256" if method_called_ever?(body_node, :md5) @@ -44,10 +45,9 @@ module RuboCop class ChecksumCase < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? - - sha256_calls = find_every_method_call_by_name(body_node, :sha256) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + sha256_calls = find_every_method_call_by_name(formula_nodes.body_node, :sha256) sha256_calls.each do |sha256_call| checksum = get_checksum_node(sha256_call) next if checksum.nil? diff --git a/Library/Homebrew/rubocops/class.rb b/Library/Homebrew/rubocops/class.rb index 22947b8268..5239c0b157 100644 --- a/Library/Homebrew/rubocops/class.rb +++ b/Library/Homebrew/rubocops/class.rb @@ -16,7 +16,10 @@ module RuboCop AmazonWebServicesFormula ].freeze - def audit_formula(_node, _class_node, parent_class_node, _body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + parent_class_node = formula_nodes.parent_class_node + parent_class = class_name(parent_class_node) return unless DEPRECATED_CLASSES.include?(parent_class) @@ -30,8 +33,9 @@ module RuboCop class Test < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - test = find_block(body_node, :test) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + test = find_block(formula_nodes.body_node, :test) return unless test if test.body.nil? @@ -69,11 +73,13 @@ module RuboCop module FormulaAuditStrict # This cop makes sure that a `test` block exists. class TestPresent < FormulaCop - def audit_formula(_node, class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node return if find_block(body_node, :test) return if find_node_method_by_name(body_node, :disable!) - offending_node(class_node) if body_node.nil? + offending_node(formula_nodes.class_node) if body_node.nil? problem "A `test do` test block should be added" end end diff --git a/Library/Homebrew/rubocops/components_order.rb b/Library/Homebrew/rubocops/components_order.rb index 50c0949a47..900d751fb9 100644 --- a/Library/Homebrew/rubocops/components_order.rb +++ b/Library/Homebrew/rubocops/components_order.rb @@ -14,8 +14,9 @@ module RuboCop class ComponentsOrder < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? @present_components, @offensive_nodes = check_order(FORMULA_COMPONENT_PRECEDENCE_LIST, body_node) diff --git a/Library/Homebrew/rubocops/components_redundancy.rb b/Library/Homebrew/rubocops/components_redundancy.rb index 463bf3da5d..b6f6a7c097 100644 --- a/Library/Homebrew/rubocops/components_redundancy.rb +++ b/Library/Homebrew/rubocops/components_redundancy.rb @@ -20,8 +20,9 @@ module RuboCop STABLE_MSG = "`stable do` should not be present without a `head` spec" STABLE_BLOCK_METHODS = [:url, :sha256, :mirror, :version].freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? urls = find_method_calls_by_name(body_node, :url) diff --git a/Library/Homebrew/rubocops/conflicts.rb b/Library/Homebrew/rubocops/conflicts.rb index 899625ab83..e1cb4caa89 100644 --- a/Library/Homebrew/rubocops/conflicts.rb +++ b/Library/Homebrew/rubocops/conflicts.rb @@ -13,8 +13,9 @@ module RuboCop MSG = "Versioned formulae should not use `conflicts_with`. " \ "Use `keg_only :versioned_formula` instead." - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? find_method_calls_by_name(body_node, :conflicts_with).each do |conflicts_with_call| next unless parameters(conflicts_with_call).last.respond_to? :values diff --git a/Library/Homebrew/rubocops/dependency_order.rb b/Library/Homebrew/rubocops/dependency_order.rb index 062d30d662..0085d6f141 100644 --- a/Library/Homebrew/rubocops/dependency_order.rb +++ b/Library/Homebrew/rubocops/dependency_order.rb @@ -13,7 +13,10 @@ module RuboCop class DependencyOrder < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node + check_dependency_nodes_order(body_node) check_uses_from_macos_nodes_order(body_node) ([:head, :stable] + on_system_methods).each do |block_name| diff --git a/Library/Homebrew/rubocops/deprecate_disable.rb b/Library/Homebrew/rubocops/deprecate_disable.rb index ca06376bd3..ff6e02cdc8 100644 --- a/Library/Homebrew/rubocops/deprecate_disable.rb +++ b/Library/Homebrew/rubocops/deprecate_disable.rb @@ -10,7 +10,10 @@ module RuboCop class DeprecateDisableDate < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node + [:deprecate!, :disable!].each do |method| node = find_node_method_by_name(body_node, method) @@ -39,7 +42,10 @@ module RuboCop PUNCTUATION_MARKS = %w[. ! ?].freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node + [:deprecate!, :disable!].each do |method| node = find_node_method_by_name(body_node, method) diff --git a/Library/Homebrew/rubocops/desc.rb b/Library/Homebrew/rubocops/desc.rb index 8fb342d3f9..3f69f08461 100644 --- a/Library/Homebrew/rubocops/desc.rb +++ b/Library/Homebrew/rubocops/desc.rb @@ -13,10 +13,13 @@ module RuboCop include DescHelper extend AutoCorrector - def audit_formula(_node, class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node + @name = @formula_name desc_call = find_node_method_by_name(body_node, :desc) - offending_node(class_node) if body_node.nil? + offending_node(formula_nodes.class_node) if body_node.nil? audit_desc(:formula, @name, desc_call) end end diff --git a/Library/Homebrew/rubocops/extend/formula_cop.rb b/Library/Homebrew/rubocops/extend/formula_cop.rb index b443c5e615..602384e20c 100644 --- a/Library/Homebrew/rubocops/extend/formula_cop.rb +++ b/Library/Homebrew/rubocops/extend/formula_cop.rb @@ -18,6 +18,13 @@ module RuboCop @registry = Cop.registry + class FormulaNodes < T::Struct + prop :node, RuboCop::AST::ClassNode + prop :class_node, RuboCop::AST::ConstNode + prop :parent_class_node, RuboCop::AST::ConstNode + prop :body_node, RuboCop::AST::Node + end + # This method is called by RuboCop and is the main entry point. def on_class(node) @file_path = processed_source.file_path @@ -27,19 +34,11 @@ module RuboCop class_node, parent_class_node, @body = *node @formula_name = Pathname.new(@file_path).basename(".rb").to_s @tap_style_exceptions = nil - audit_formula(node, class_node, parent_class_node, @body) + audit_formula(FormulaNodes.new(node:, class_node:, parent_class_node:, body_node: @body)) end - sig { - abstract - .params( - node: RuboCop::AST::ClassNode, - class_node: RuboCop::AST::ConstNode, - parent_class_node: RuboCop::AST::ConstNode, - body_node: RuboCop::AST::Node, - ).void - } - def audit_formula(node, class_node, parent_class_node, body_node); end + sig { abstract.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes); end # Yields to block when there is a match. # diff --git a/Library/Homebrew/rubocops/files.rb b/Library/Homebrew/rubocops/files.rb index abce494eb7..f6e9022d5a 100644 --- a/Library/Homebrew/rubocops/files.rb +++ b/Library/Homebrew/rubocops/files.rb @@ -8,13 +8,14 @@ module RuboCop module FormulaAudit # This cop makes sure that a formula's file permissions are correct. class Files < FormulaCop - def audit_formula(node, _class_node, _parent_class_node, _body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) return unless file_path # Codespaces routinely screws up all permissions so don't complain there. return if ENV["CODESPACES"] || ENV["HOMEBREW_CODESPACES"] - offending_node(node) + offending_node(formula_nodes.node) actual_mode = File.stat(file_path).mode # Check that the file is world-readable. if actual_mode & 0444 != 0444 diff --git a/Library/Homebrew/rubocops/homepage.rb b/Library/Homebrew/rubocops/homepage.rb index 4ceab11763..8e2b8f867b 100644 --- a/Library/Homebrew/rubocops/homepage.rb +++ b/Library/Homebrew/rubocops/homepage.rb @@ -12,11 +12,13 @@ module RuboCop include HomepageHelper extend AutoCorrector - def audit_formula(_node, class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node homepage_node = find_node_method_by_name(body_node, :homepage) if homepage_node.nil? - offending_node(class_node) if body_node.nil? + offending_node(formula_nodes.class_node) if body_node.nil? problem "Formula should have a homepage." return end diff --git a/Library/Homebrew/rubocops/keg_only.rb b/Library/Homebrew/rubocops/keg_only.rb index 4072247962..98ce1c0611 100644 --- a/Library/Homebrew/rubocops/keg_only.rb +++ b/Library/Homebrew/rubocops/keg_only.rb @@ -10,8 +10,9 @@ module RuboCop class KegOnly < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - keg_only_node = find_node_method_by_name(body_node, :keg_only) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + keg_only_node = find_node_method_by_name(formula_nodes.body_node, :keg_only) return unless keg_only_node allowlist = %w[ diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb index 6d51e275d5..92ab99517d 100644 --- a/Library/Homebrew/rubocops/lines.rb +++ b/Library/Homebrew/rubocops/lines.rb @@ -10,7 +10,8 @@ module RuboCop module FormulaAudit # This cop checks for various miscellaneous Homebrew coding styles. class Lines < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, _body_node) + sig { override.params(_formula_nodes: FormulaNodes).void } + def audit_formula(_formula_nodes) [:automake, :ant, :autoconf, :emacs, :expat, :libtool, :mysql, :perl, :postgresql, :python, :python3, :rbenv, :ruby].each do |dependency| next unless depends_on?(dependency) @@ -31,9 +32,11 @@ module RuboCop # This cop makes sure that a space is used for class inheritance. class ClassInheritance < FormulaCop - def audit_formula(_node, class_node, parent_class_node, _body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + parent_class_node = formula_nodes.parent_class_node begin_pos = start_column(parent_class_node) - end_pos = end_column(class_node) + end_pos = end_column(formula_nodes.class_node) return if begin_pos-end_pos == 3 problem "Use a space in class inheritance: " \ @@ -43,7 +46,8 @@ module RuboCop # This cop makes sure that template comments are removed. class Comments < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, _body_node) + sig { override.params(_formula_nodes: FormulaNodes).void } + def audit_formula(_formula_nodes) audit_comments do |comment| [ "# PLEASE REMOVE", @@ -82,8 +86,9 @@ module RuboCop # This cop makes sure that idiomatic `assert_*` statements are used. class AssertStatements < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? find_every_method_call_by_name(body_node, :assert).each do |method| if method_called_ever?(method, :include?) && !method_called_ever?(method, :!) @@ -107,8 +112,9 @@ module RuboCop # This cop makes sure that `option`s are used idiomatically. class OptionDeclarations < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? problem "Use new-style option definitions" if find_method_def(body_node, :options) @@ -192,8 +198,9 @@ module RuboCop class MpiCheck < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? # Enforce use of OpenMPI for MPI dependency in core return if formula_tap != "homebrew-core" @@ -211,8 +218,9 @@ module RuboCop class QuicTLSCheck < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? # Enforce use of OpenSSL for TLS dependency in core return if formula_tap != "homebrew-core" @@ -229,8 +237,9 @@ module RuboCop # This cop makes sure that formulae do not depend on `pyoxidizer` at build-time # or run-time. class PyoxidizerCheck < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if formula_nodes.body_node.nil? # Disallow use of PyOxidizer as a dependency in core return if formula_tap != "homebrew-core" return unless depends_on?("pyoxidizer") @@ -243,8 +252,9 @@ module RuboCop class SafePopenCommands < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? test = find_block(body_node, :test) @@ -272,8 +282,9 @@ module RuboCop class ShellVariables < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? popen_commands = [ :popen, @@ -302,8 +313,9 @@ module RuboCop class LicenseArrays < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? license_node = find_node_method_by_name(body_node, :license) return unless license_node @@ -319,8 +331,9 @@ module RuboCop # This cop makes sure that nested `license` declarations are split onto multiple lines. class Licenses < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? license_node = find_node_method_by_name(body_node, :license) return unless license_node @@ -342,8 +355,9 @@ module RuboCop class PythonVersions < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? python_formula_node = find_every_method_call_by_name(body_node, :depends_on).find do |dep| string_content(parameters(dep).first).start_with? "python@" @@ -390,7 +404,10 @@ module RuboCop NO_ON_SYSTEM_METHOD_NAMES = [:install, :post_install].freeze NO_ON_SYSTEM_BLOCK_NAMES = [:service, :test].freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node + NO_ON_SYSTEM_METHOD_NAMES.each do |formula_method_name| method_node = find_method_def(body_node, formula_method_name) audit_on_system_blocks(method_node, formula_method_name) if method_node @@ -427,8 +444,9 @@ module RuboCop ON_MACOS_BLOCKS = [:macos, *MACOS_VERSION_OPTIONS].map { |os| :"on_#{os}" }.freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) - audit_macos_references(body_node, + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + audit_macos_references(formula_nodes.body_node, allowed_methods: OnSystemConditionals::NO_ON_SYSTEM_METHOD_NAMES, allowed_blocks: OnSystemConditionals::NO_ON_SYSTEM_BLOCK_NAMES + ON_MACOS_BLOCKS) end @@ -438,8 +456,9 @@ module RuboCop class GenerateCompletionsDSL < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - install = find_method_def(body_node, :install) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + install = find_method_def(formula_nodes.body_node, :install) return if install.blank? correctable_shell_completion_node(install) do |node, shell, base_name, executable, subcmd, shell_parameter| @@ -519,8 +538,9 @@ module RuboCop class SingleGenerateCompletionsDSLCall < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - install = find_method_def(body_node, :install) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + install = find_method_def(formula_nodes.body_node, :install) return if install.blank? methods = find_every_method_call_by_name(install, :generate_completions_from_executable) @@ -577,8 +597,9 @@ module RuboCop # This cop checks for other miscellaneous style violations. class Miscellaneous < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? # FileUtils is included in Formula # encfs modifies a file with this name, so check for some leading characters @@ -846,11 +867,12 @@ module RuboCop module FormulaAuditStrict # This cop makes sure that no build-time checks are performed. class MakeCheck < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) return if formula_tap != "homebrew-core" # Avoid build-time checks in homebrew/core - find_every_method_call_by_name(body_node, :system).each do |method| + find_every_method_call_by_name(formula_nodes.body_node, :system).each do |method| next if @formula_name.start_with?("lib") next if tap_style_exception? :make_check_allowlist @@ -870,7 +892,8 @@ module RuboCop # This cop ensures that new formulae depending on removed Requirements are not used class Requirements < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, _body_node) + sig { override.params(_formula_nodes: FormulaNodes).void } + def audit_formula(_formula_nodes) problem "Formulae should depend on a versioned `openjdk` instead of :java" if depends_on? :java problem "Formulae should depend on specific X libraries instead of :x11" if depends_on? :x11 problem "Formulae should not depend on :osxfuse" if depends_on? :osxfuse @@ -882,8 +905,9 @@ module RuboCop class RustCheck < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? # Enforce use of `rust` for rust dependency in core return if formula_tap != "homebrew-core" diff --git a/Library/Homebrew/rubocops/livecheck.rb b/Library/Homebrew/rubocops/livecheck.rb index 7a974fdcf8..03e009940e 100644 --- a/Library/Homebrew/rubocops/livecheck.rb +++ b/Library/Homebrew/rubocops/livecheck.rb @@ -11,8 +11,9 @@ module RuboCop class LivecheckSkip < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - livecheck_node = find_block(body_node, :livecheck) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + livecheck_node = find_block(formula_nodes.body_node, :livecheck) return if livecheck_node.blank? skip = find_every_method_call_by_name(livecheck_node, :skip).first @@ -39,8 +40,9 @@ module RuboCop # This cop ensures that a `url` is specified in the `livecheck` block. class LivecheckUrlProvided < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - livecheck_node = find_block(body_node, :livecheck) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + livecheck_node = find_block(formula_nodes.body_node, :livecheck) return unless livecheck_node url_node = find_every_method_call_by_name(livecheck_node, :url).first @@ -62,7 +64,9 @@ module RuboCop class LivecheckUrlSymbol < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + body_node = formula_nodes.body_node livecheck_node = find_block(body_node, :livecheck) return if livecheck_node.blank? @@ -117,8 +121,9 @@ module RuboCop class LivecheckRegexParentheses < FormulaCop extend AutoCorrector - def audit_formula(_node, _class_node, _parent_class_node, body_node) - livecheck_node = find_block(body_node, :livecheck) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + livecheck_node = find_block(formula_nodes.body_node, :livecheck) return if livecheck_node.blank? skip = find_every_method_call_by_name(livecheck_node, :skip).first.present? @@ -144,8 +149,9 @@ module RuboCop TAR_PATTERN = /\\?\.t(ar|(g|l|x)z$|[bz2]{2,4}$)(\\?\.((g|l|x)z)|[bz2]{2,4}|Z)?$/i - def audit_formula(_node, _class_node, _parent_class_node, body_node) - livecheck_node = find_block(body_node, :livecheck) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + livecheck_node = find_block(formula_nodes.body_node, :livecheck) return if livecheck_node.blank? skip = find_every_method_call_by_name(livecheck_node, :skip).first.present? @@ -171,8 +177,9 @@ module RuboCop # This cop ensures that a `regex` is provided when `strategy :page_match` is specified # in the `livecheck` block. class LivecheckRegexIfPageMatch < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - livecheck_node = find_block(body_node, :livecheck) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + livecheck_node = find_block(formula_nodes.body_node, :livecheck) return if livecheck_node.blank? skip = find_every_method_call_by_name(livecheck_node, :skip).first.present? @@ -199,10 +206,11 @@ module RuboCop MSG = "Regexes should be case-insensitive unless sensitivity is explicitly required for proper matching." - def audit_formula(_node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) return if tap_style_exception? :regex_case_sensitive_allowlist - livecheck_node = find_block(body_node, :livecheck) + livecheck_node = find_block(formula_nodes.body_node, :livecheck) return if livecheck_node.blank? skip = find_every_method_call_by_name(livecheck_node, :skip).first.present? diff --git a/Library/Homebrew/rubocops/options.rb b/Library/Homebrew/rubocops/options.rb index a7eadd55bb..2116fe3cf4 100644 --- a/Library/Homebrew/rubocops/options.rb +++ b/Library/Homebrew/rubocops/options.rb @@ -14,8 +14,9 @@ module RuboCop DEP_OPTION = "Formulae in homebrew/core should not use `deprecated_option`." OPTION = "Formulae in homebrew/core should not use `option`." - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? option_call_nodes = find_every_method_call_by_name(body_node, :option) option_call_nodes.each do |option_call| diff --git a/Library/Homebrew/rubocops/patches.rb b/Library/Homebrew/rubocops/patches.rb index 10ef997e25..784e7b18a2 100644 --- a/Library/Homebrew/rubocops/patches.rb +++ b/Library/Homebrew/rubocops/patches.rb @@ -11,19 +11,21 @@ module RuboCop class Patches < FormulaCop extend AutoCorrector - def audit_formula(node, _class_node, _parent_class_node, body) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + node = formula_nodes.node @full_source_content = source_buffer(node).source - return if body.nil? + return if (body_node = formula_nodes.body_node).nil? - external_patches = find_all_blocks(body, :patch) + external_patches = find_all_blocks(body_node, :patch) external_patches.each do |patch_block| url_node = find_every_method_call_by_name(patch_block, :url).first url_string = parameters(url_node).first patch_problems(url_string) end - inline_patches = find_every_method_call_by_name(body, :patch) + inline_patches = find_every_method_call_by_name(body_node, :patch) inline_patches.each { |patch| inline_patch_problems(patch) } if inline_patches.empty? && patch_end? @@ -31,7 +33,7 @@ module RuboCop add_offense(@offense_source_range, message: "patch is missing 'DATA'") end - patches_node = find_method_def(body, :patches) + patches_node = find_method_def(body_node, :patches) return if patches_node.nil? legacy_patches = find_strings(patches_node) diff --git a/Library/Homebrew/rubocops/resource_requires_dependencies.rb b/Library/Homebrew/rubocops/resource_requires_dependencies.rb index ec2d15a104..56136f3d49 100644 --- a/Library/Homebrew/rubocops/resource_requires_dependencies.rb +++ b/Library/Homebrew/rubocops/resource_requires_dependencies.rb @@ -10,8 +10,9 @@ module RuboCop # to ensure that they also have the correct `uses_from_macos` # dependencies. class ResourceRequiresDependencies < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? resource_nodes = find_every_method_call_by_name(body_node, :resource) return if resource_nodes.empty? diff --git a/Library/Homebrew/rubocops/service.rb b/Library/Homebrew/rubocops/service.rb index e63a0a9917..be21177c5b 100644 --- a/Library/Homebrew/rubocops/service.rb +++ b/Library/Homebrew/rubocops/service.rb @@ -22,8 +22,9 @@ module RuboCop # At least one of these methods must be defined in a service block. REQUIRED_METHOD_CALLS = [:run, :name].freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) - service_node = find_block(body_node, :service) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + service_node = find_block(formula_nodes.body_node, :service) return if service_node.blank? method_calls = service_node.each_descendant(:send).group_by(&:method_name) diff --git a/Library/Homebrew/rubocops/text.rb b/Library/Homebrew/rubocops/text.rb index 3c6113c8b8..3932c42757 100644 --- a/Library/Homebrew/rubocops/text.rb +++ b/Library/Homebrew/rubocops/text.rb @@ -10,7 +10,9 @@ module RuboCop class Text < FormulaCop extend AutoCorrector - def audit_formula(node, _class_node, _parent_class_node, body_node) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + node = formula_nodes.node full_source_content = source_buffer(node).source if (match = full_source_content.match(/^require ['"]formula['"]$/)) @@ -20,7 +22,7 @@ module RuboCop end end - return if body_node.nil? + return if (body_node = formula_nodes.body_node).nil? if find_method_def(body_node, :plist) problem "`def plist` is deprecated. Please use services instead: https://docs.brew.sh/Formula-Cookbook#service-files" @@ -113,8 +115,9 @@ module RuboCop module FormulaAuditStrict # This cop contains stricter checks for various problems in a formula's source code. class Text < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? find_method_with_args(body_node, :go_resource) do problem "`go_resource`s are deprecated. Please ask upstream to implement Go vendoring" diff --git a/Library/Homebrew/rubocops/urls.rb b/Library/Homebrew/rubocops/urls.rb index c1e0680da2..79acd18116 100644 --- a/Library/Homebrew/rubocops/urls.rb +++ b/Library/Homebrew/rubocops/urls.rb @@ -11,8 +11,9 @@ module RuboCop class Urls < FormulaCop include UrlHelper - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? urls = find_every_func_call_by_name(body_node, :url) mirrors = find_every_func_call_by_name(body_node, :mirror) @@ -42,8 +43,9 @@ module RuboCop # This cop makes sure that the correct format for PyPI URLs is used. class PyPiUrls < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? urls = find_every_func_call_by_name(body_node, :url) mirrors = find_every_func_call_by_name(body_node, :mirror) @@ -72,8 +74,9 @@ module RuboCop # This cop makes sure that git URLs have a `revision`. class GitUrls < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? return if formula_tap != "homebrew-core" find_method_calls_by_name(body_node, :url).each do |url| @@ -94,8 +97,9 @@ module RuboCop module FormulaAuditStrict # This cop makes sure that git URLs have a `tag`. class GitUrls < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? return if formula_tap != "homebrew-core" find_method_calls_by_name(body_node, :url).each do |url| diff --git a/Library/Homebrew/rubocops/uses_from_macos.rb b/Library/Homebrew/rubocops/uses_from_macos.rb index d2efc9fe1e..34f46ef49b 100644 --- a/Library/Homebrew/rubocops/uses_from_macos.rb +++ b/Library/Homebrew/rubocops/uses_from_macos.rb @@ -59,8 +59,9 @@ module RuboCop zlib ].freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? find_method_with_args(body_node, :keg_only, :provided_by_macos) do return if PROVIDED_BY_MACOS_FORMULAE.include? @formula_name @@ -95,8 +96,9 @@ module RuboCop zsh ].freeze - def audit_formula(_node, _class_node, _parent_class_node, body_node) - return if body_node.nil? + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + return if (body_node = formula_nodes.body_node).nil? depends_on_linux = depends_on?(:linux) diff --git a/Library/Homebrew/rubocops/version.rb b/Library/Homebrew/rubocops/version.rb index e2ba8069a8..aa5dfe6861 100644 --- a/Library/Homebrew/rubocops/version.rb +++ b/Library/Homebrew/rubocops/version.rb @@ -8,8 +8,9 @@ module RuboCop module FormulaAudit # This cop makes sure that a `version` is in the correct format. class Version < FormulaCop - def audit_formula(_node, _class_node, _parent_class_node, body_node) - version_node = find_node_method_by_name(body_node, :version) + sig { override.params(formula_nodes: FormulaNodes).void } + def audit_formula(formula_nodes) + version_node = find_node_method_by_name(formula_nodes.body_node, :version) return unless version_node version = string_content(parameters(version_node).first)