Add node pattern methods to handle dependency audits in a better way
This commit is contained in:
parent
8e89b9d9d0
commit
a3219ca09c
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user