Add node pattern methods to handle dependency audits in a better way

This commit is contained in:
Gautham Goli 2017-08-06 14:48:39 +05:30
parent 8e89b9d9d0
commit a3219ca09c
2 changed files with 69 additions and 7 deletions

View File

@ -1,4 +1,5 @@
require "parser/current" require "parser/current"
require_relative "../../extend/string"
module RuboCop module RuboCop
module Cop module Cop
@ -138,17 +139,14 @@ module RuboCop
case type case type
when :required when :required
type_match = !node.method_args.nil? && type_match = required_dependency?(node)
(node.method_args.first.str_type? || node.method_args.first.sym_type?)
if type_match && !name_match if type_match && !name_match
name_match = node_equals?(node.method_args.first, name) name_match = required_dependency_name?(node, name)
end end
when :build, :optional, :recommended, :run when :build, :optional, :recommended, :run
type_match = !node.method_args.nil? && type_match = dependency_type_hash_match?(node, type)
node.method_args.first.hash_type? &&
node.method_args.first.values.first.children.first == type
if type_match && !name_match if type_match && !name_match
name_match = node_equals?(node.method_args.first.keys.first.children.first, name) name_match = dependency_name_hash_match?(node, name)
end end
else else
type_match = false type_match = false
@ -161,6 +159,22 @@ module RuboCop
type_match && name_match type_match && name_match
end end
def_node_search :required_dependency?, <<-EOS.undent
(send nil :depends_on ({str sym} _))
EOS
def_node_search :required_dependency_name?, <<-EOS.undent
(send nil :depends_on ({str sym} %1))
EOS
def_node_search :dependency_type_hash_match?, <<-EOS.undent
(hash (pair ({str sym} _) ({str sym} %1)))
EOS
def_node_search :dependency_name_hash_match?, <<-EOS.undent
(hash (pair ({str sym} %1) ({str sym} _)))
EOS
# To compare node with appropriate Ruby variable # To compare node with appropriate Ruby variable
def node_equals?(node, var) def node_equals?(node, var)
node == Parser::CurrentRuby.parse(var.inspect) node == Parser::CurrentRuby.parse(var.inspect)

View File

@ -7,6 +7,54 @@ describe RuboCop::Cop::FormulaAudit::Text do
subject(:cop) { described_class.new } subject(:cop) { described_class.new }
context "When auditing formula text" do context "When auditing formula text" do
it "with both openssl and libressl optional dependencies" do
source = <<-EOS.undent
class Foo < Formula
url "http://example.com/foo-1.0.tgz"
homepage "http://example.com"
depends_on "openssl"
depends_on "libressl" => :optional
end
EOS
expected_offenses = [{ message: "Formulae should not depend on both OpenSSL and LibreSSL (even optionally).",
severity: :convention,
line: 6,
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 both openssl and libressl dependencies" do
source = <<-EOS.undent
class Foo < Formula
url "http://example.com/foo-1.0.tgz"
homepage "http://example.com"
depends_on "openssl"
depends_on "libressl"
end
EOS
expected_offenses = [{ message: "Formulae should not depend on both OpenSSL and LibreSSL (even optionally).",
severity: :convention,
line: 6,
column: 2,
source: source }]
inspect_source(cop, source)
expected_offenses.zip(cop.offenses).each do |expected, actual|
expect_offense(expected, actual)
end
end
it "When xcodebuild is called without SYMROOT" do it "When xcodebuild is called without SYMROOT" do
source = <<-EOS.undent source = <<-EOS.undent
class Foo < Formula class Foo < Formula