diff --git a/Library/.rubocop.yml b/Library/.rubocop.yml index 6bfb669fd3..db7a05d877 100644 --- a/Library/.rubocop.yml +++ b/Library/.rubocop.yml @@ -21,6 +21,9 @@ FormulaAudit/ChecksumCase: FormulaAudit/Conflicts: Enabled: true +FormulaAudit/Options: + Enabled: true + FormulaAuditStrict/BottleBlock: Enabled: true diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 3bbfa461af..6a7292ea7d 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -555,10 +555,6 @@ class FormulaAuditor def audit_options formula.options.each do |o| - if o.name == "32-bit" - problem "macOS has been 64-bit only since 10.6 so 32-bit options are deprecated." - end - next unless @strict if o.name == "universal" diff --git a/Library/Homebrew/rubocops.rb b/Library/Homebrew/rubocops.rb index 81ea2fcf28..f673720a64 100644 --- a/Library/Homebrew/rubocops.rb +++ b/Library/Homebrew/rubocops.rb @@ -8,3 +8,4 @@ require_relative "./rubocops/caveats_cop" require_relative "./rubocops/checksum_cop" require_relative "./rubocops/legacy_patches_cop" require_relative "./rubocops/conflicts_cop" +require_relative "./rubocops/options_cop" diff --git a/Library/Homebrew/rubocops/extend/formula_cop.rb b/Library/Homebrew/rubocops/extend/formula_cop.rb index ddfb507d27..7165ee3548 100644 --- a/Library/Homebrew/rubocops/extend/formula_cop.rb +++ b/Library/Homebrew/rubocops/extend/formula_cop.rb @@ -102,14 +102,11 @@ module RuboCop # Returns nil if does not depend on dependency_name # args: node - dependency_name - dependency's name - def depends_on?(dependency_name) + def depends_on?(dependency_name, *types) + types = [:required, :build, :optional, :recommended, :run] if types.empty? dependency_nodes = find_every_method_call_by_name(@body, :depends_on) idx = dependency_nodes.index do |n| - depends_on_name_type?(n, dependency_name, :required) || - depends_on_name_type?(n, dependency_name, :build) || - depends_on_name_type?(n, dependency_name, :optional) || - depends_on_name_type?(n, dependency_name, :recommended) || - depends_on_name_type?(n, dependency_name, :run) + types.any? { |type| depends_on_name_type?(n, dependency_name, type) } end return if idx.nil? @offense_source_range = dependency_nodes[idx].source_range @@ -138,6 +135,8 @@ module RuboCop if type_match && !name_match name_match = node_equals?(node.method_args.first.keys.first.children.first, name) end + else + type_match = false end if type_match || name_match @@ -334,11 +333,13 @@ module RuboCop def string_content(node) case node.type when :str - return node.str_content if node.type == :str + node.str_content when :dstr - return node.each_child_node(:str).map(&:str_content).join("") if node.type == :dstr + node.each_child_node(:str).map(&:str_content).join("") when :const - return node.const_name if node.type == :const + node.const_name + when :sym + node.children.first.to_s else "" end diff --git a/Library/Homebrew/rubocops/options_cop.rb b/Library/Homebrew/rubocops/options_cop.rb new file mode 100644 index 0000000000..83d853f107 --- /dev/null +++ b/Library/Homebrew/rubocops/options_cop.rb @@ -0,0 +1,20 @@ +require_relative "./extend/formula_cop" + +module RuboCop + module Cop + module FormulaAudit + # This cop audits `options` in Formulae + class Options < FormulaCop + DEPRECATION_MSG = "macOS has been 64-bit only since 10.6 so 32-bit options are deprecated.".freeze + + def audit_formula(_node, _class_node, _parent_class_node, body_node) + option_call_nodes = find_every_method_call_by_name(body_node, :option) + option_call_nodes.each do |option_call| + option = parameters(option_call).first + problem DEPRECATION_MSG if regex_match_group(option, /32-bit/) + end + end + end + end + end +end diff --git a/Library/Homebrew/test/rubocops/options_cop_spec.rb b/Library/Homebrew/test/rubocops/options_cop_spec.rb new file mode 100644 index 0000000000..0ed3a9741e --- /dev/null +++ b/Library/Homebrew/test/rubocops/options_cop_spec.rb @@ -0,0 +1,31 @@ +require "rubocop" +require "rubocop/rspec/support" +require_relative "../../extend/string" +require_relative "../../rubocops/options_cop" + +describe RuboCop::Cop::FormulaAudit::Options do + subject(:cop) { described_class.new } + + context "When auditing options" do + it "32-bit" do + source = <<-EOS.undent + class Foo < Formula + url 'http://example.com/foo-1.0.tgz' + option "32-bit", "with 32-bit" + end + EOS + + expected_offenses = [{ message: described_class::DEPRECATION_MSG, + severity: :convention, + line: 3, + column: 10, + source: source }] + + inspect_source(cop, source) + + expected_offenses.zip(cop.offenses).each do |expected, actual| + expect_offense(expected, actual) + end + end + end +end