Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

audit: Port audit_options strict rules to rubocop and add tests #2901

Merged
merged 1 commit into from
Jul 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions Library/.rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ FormulaAudit/Conflicts:
FormulaAudit/Options:
Enabled: true

FormulaAuditStrict/Options:
Enabled: true

FormulaAuditStrict/BottleBlock:
Enabled: true

Expand Down
17 changes: 0 additions & 17 deletions Library/Homebrew/dev-cmd/audit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -554,23 +554,6 @@ def audit_keg_only_style
end

def audit_options
formula.options.each do |o|
next unless @strict

if o.name == "universal"
problem "macOS has been 64-bit only since 10.6 so universal options are deprecated."
end

if o.name !~ /with(out)?-/ && o.name != "c++11" && o.name != "universal"
problem "Options should begin with with/without. Migrate '--#{o.name}' with `deprecated_option`."
end

next unless o.name =~ /^with(out)?-(?:checks?|tests)$/
unless formula.deps.any? { |d| d.name == "check" && (d.optional? || d.recommended?) }
problem "Use '--with#{Regexp.last_match(1)}-test' instead of '--#{o.name}'. Migrate '--#{o.name}' with `deprecated_option`."
end
end

return unless @new_formula
return if formula.deprecated_options.empty?
return if formula.versioned_formula?
Expand Down
27 changes: 27 additions & 0 deletions Library/Homebrew/rubocops/options_cop.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,32 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node)
end
end
end

module FormulaAuditStrict
class Options < FormulaCop
DEPRECATION_MSG = "macOS has been 64-bit only since 10.6 so universal 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|
offending_node(option_call)
option = string_content(parameters(option_call).first)
problem DEPRECATION_MSG if option == "universal"

if option !~ /with(out)?-/ &&
option != "cxx11" &&
option != "universal"
problem "Options should begin with with/without."\
" Migrate '--#{option}' with `deprecated_option`."
end

next unless option =~ /^with(out)?-(?:checks?|tests)$/
next if depends_on?("check", :optional, :recommended)
problem "Use '--with#{Regexp.last_match(1)}-test' instead of '--#{option}'."\
" Migrate '--#{option}' with `deprecated_option`."
end
end
end
end
end
end
74 changes: 74 additions & 0 deletions Library/Homebrew/test/rubocops/options_cop_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,77 @@ class Foo < Formula
end
end
end

describe RuboCop::Cop::FormulaAuditStrict::Options do
subject(:cop) { described_class.new }

context "When auditing options strictly" do
it "with universal" do
source = <<-EOS.undent
class Foo < Formula
url 'http://example.com/foo-1.0.tgz'
option :universal
end
EOS

expected_offenses = [{ message: described_class::DEPRECATION_MSG,
severity: :convention,
line: 3,
column: 2,
source: source }]

inspect_source(cop, source)

expected_offenses.zip(cop.offenses).each do |expected, actual|
expect_offense(expected, actual)
end
end

it "with deprecated options" do
source = <<-EOS.undent
class Foo < Formula
url 'http://example.com/foo-1.0.tgz'
option :cxx11
option "examples", "with-examples"
end
EOS

MSG_1 = "Options should begin with with/without."\
" Migrate '--examples' with `deprecated_option`.".freeze
expected_offenses = [{ message: MSG_1,
severity: :convention,
line: 4,
column: 2,
source: source }]

inspect_source(cop, source)

expected_offenses.zip(cop.offenses).each do |expected, actual|
expect_offense(expected, actual)
end
end

it "with misc deprecated options" do
source = <<-EOS.undent
class Foo < Formula
url 'http://example.com/foo-1.0.tgz'
option "without-check"
end
EOS

MSG_2 = "Use '--without-test' instead of '--without-check'."\
" Migrate '--without-check' with `deprecated_option`.".freeze
expected_offenses = [{ message: MSG_2,
severity: :convention,
line: 3,
column: 2,
source: source }]

inspect_source(cop, source)

expected_offenses.zip(cop.offenses).each do |expected, actual|
expect_offense(expected, actual)
end
end
end
end