From fb85ed01bc170e389dd62a2a2872d962b7dad5a6 Mon Sep 17 00:00:00 2001 From: Gautham Goli Date: Sat, 2 Dec 2017 17:03:11 +0530 Subject: [PATCH] lines_cop: Convert ARGV audit to negative look ahead --- Library/Homebrew/rubocops/extend/formula_cop.rb | 16 ++++++++++++++++ Library/Homebrew/rubocops/lines_cop.rb | 7 +++---- Library/Homebrew/test/rubocops/lines_cop_spec.rb | 4 ++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/rubocops/extend/formula_cop.rb b/Library/Homebrew/rubocops/extend/formula_cop.rb index 1e7160bbd4..9d16db36d5 100644 --- a/Library/Homebrew/rubocops/extend/formula_cop.rb +++ b/Library/Homebrew/rubocops/extend/formula_cop.rb @@ -127,6 +127,22 @@ module RuboCop end end + # Matches receiver part of method, + # EX: to match `ARGV.()` + # call `find_instance_call(node, "ARGV")` + # yields to a block with parent node of receiver + def find_instance_call(node, name) + node.each_descendant(:send) do |method_node| + next if method_node.receiver.nil? + next if method_node.receiver.const_name != name && + method_node.receiver.method_name != name + @offense_source_range = method_node.receiver.source_range + @offensive_node = method_node.receiver + return true unless block_given? + yield method_node + end + end + # Returns nil if does not depend on dependency_name # args: node - dependency_name - dependency's name def depends_on?(dependency_name, *types) diff --git a/Library/Homebrew/rubocops/lines_cop.rb b/Library/Homebrew/rubocops/lines_cop.rb index d9e40c2de5..fdc31078f3 100644 --- a/Library/Homebrew/rubocops/lines_cop.rb +++ b/Library/Homebrew/rubocops/lines_cop.rb @@ -162,10 +162,9 @@ module RuboCop end end - [:debug?, :verbose?, :value].each do |method_name| - find_instance_method_call(body_node, "ARGV", method_name) do - problem "Use build instead of ARGV to check options" - end + find_instance_call(body_node, "ARGV") do |method_node| + next if [:debug?, :verbose?, :value].index(method_node.method_name) + problem "Use build instead of ARGV to check options" end find_instance_method_call(body_node, :man, :+) do |method| diff --git a/Library/Homebrew/test/rubocops/lines_cop_spec.rb b/Library/Homebrew/test/rubocops/lines_cop_spec.rb index de79fd7de8..0d2146339c 100644 --- a/Library/Homebrew/test/rubocops/lines_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_cop_spec.rb @@ -541,13 +541,12 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do end it "Using ARGV to check options" do - expect_offense(<<~RUBY) + expect_no_offenses(<<~RUBY) class Foo < Formula desc "foo" url 'http://example.com/foo-1.0.tgz' def install verbose = ARGV.verbose? - ^^^^^^^^^^^^^ Use build instead of ARGV to check options end end RUBY @@ -739,6 +738,7 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do test do head = ARGV.include? "--HEAD" ^^^^^^ Use "if build.head?" instead + ^^^^ Use build instead of ARGV to check options end end RUBY