audit: Port audit_caveats method to rubocop and add tests

This commit is contained in:
Gautham Goli 2017-05-22 13:09:49 +05:30
parent f9e8d84301
commit cf848a14d2
7 changed files with 80 additions and 23 deletions

View File

@ -11,6 +11,9 @@ require: ./Homebrew/rubocops.rb
FormulaAudit/Text: FormulaAudit/Text:
Enabled: true Enabled: true
FormulaAudit/Caveats:
Enabled: true
FormulaAuditStrict/BottleBlock: FormulaAuditStrict/BottleBlock:
Enabled: true Enabled: true

View File

@ -1148,11 +1148,6 @@ class FormulaAuditor
problem "Use pkgshare instead of (share#{$1}\"#{formula.name}\")" problem "Use pkgshare instead of (share#{$1}\"#{formula.name}\")"
end end
def audit_caveats
return unless formula.caveats.to_s.include?("setuid")
problem "Don't recommend setuid in the caveats, suggest sudo instead."
end
def audit_reverse_migration def audit_reverse_migration
# Only enforce for new formula being re-added to core and official taps # Only enforce for new formula being re-added to core and official taps
return unless @strict return unless @strict

View File

@ -4,3 +4,4 @@ require_relative "./rubocops/components_order_cop"
require_relative "./rubocops/components_redundancy_cop" require_relative "./rubocops/components_redundancy_cop"
require_relative "./rubocops/homepage_cop" require_relative "./rubocops/homepage_cop"
require_relative "./rubocops/text_cop" require_relative "./rubocops/text_cop"
require_relative "./rubocops/caveats_cop"

View File

@ -0,0 +1,16 @@
require_relative "./extend/formula_cop"
module RuboCop
module Cop
module FormulaAudit
class Caveats < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, _body_node)
caveats_strings.each do |n|
next unless regex_match_group(n, /\bsetuid\b/i)
problem "Don't recommend setuid in the caveats, suggest sudo instead."
end
end
end
end
end
end

View File

@ -24,7 +24,11 @@ module RuboCop
return unless match_object return unless match_object
node_begin_pos = start_column(node) node_begin_pos = start_column(node)
line_begin_pos = line_start_column(node) line_begin_pos = line_start_column(node)
if node_begin_pos == line_begin_pos
@column = node_begin_pos + match_object.begin(0) - line_begin_pos
else
@column = node_begin_pos + match_object.begin(0) - line_begin_pos + 1 @column = node_begin_pos + match_object.begin(0) - line_begin_pos + 1
end
@length = match_object.to_s.length @length = match_object.to_s.length
@line_no = line_number(node) @line_no = line_number(node)
@source_buf = source_buffer(node) @source_buf = source_buffer(node)
@ -33,6 +37,12 @@ module RuboCop
match_object match_object
end end
# Returns all string nodes among the descendants of given node
def find_strings(node)
return [] if node.nil?
node.each_descendant(:str)
end
# Returns method_node matching method_name # Returns method_node matching method_name
def find_node_method_by_name(node, method_name) def find_node_method_by_name(node, method_name)
return if node.nil? return if node.nil?
@ -233,6 +243,11 @@ module RuboCop
true true
end end
# Return all the caveats' string nodes in an array
def caveats_strings
find_strings(find_method_def(@body, :caveats))
end
# Returns the array of arguments of the method_node # Returns the array of arguments of the method_node
def parameters(method_node) def parameters(method_node)
return unless method_node.send_type? return unless method_node.send_type?
@ -308,6 +323,8 @@ module RuboCop
return node.each_child_node(:str).map(&:str_content).join("") if node.type == :dstr return node.each_child_node(:str).map(&:str_content).join("") if node.type == :dstr
when :const when :const
return node.const_name if node.type == :const return node.const_name if node.type == :const
else
""
end end
end end

View File

@ -305,23 +305,6 @@ describe FormulaAuditor do
end end
end end
specify "#audit_caveats" do
fa = formula_auditor "foo", <<-EOS.undent
class Foo < Formula
homepage "http://example.com/foo"
url "http://example.com/foo-1.0.tgz"
def caveats
"setuid"
end
end
EOS
fa.audit_caveats
expect(fa.problems)
.to eq(["Don't recommend setuid in the caveats, suggest sudo instead."])
end
describe "#audit_keg_only_style" do describe "#audit_keg_only_style" do
specify "keg_only_needs_downcasing" do specify "keg_only_needs_downcasing" do
fa = formula_auditor "foo", <<-EOS.undent, strict: true fa = formula_auditor "foo", <<-EOS.undent, strict: true

View File

@ -0,0 +1,42 @@
require "rubocop"
require "rubocop/rspec/support"
require_relative "../../extend/string"
require_relative "../../rubocops/caveats_cop"
describe RuboCop::Cop::FormulaAudit::Caveats do
subject(:cop) { described_class.new }
context "When auditing caveats" do
it "When there is setuid mentioned in caveats" do
source = <<-EOS.undent
class Foo < Formula
homepage "http://example.com/foo"
url "http://example.com/foo-1.0.tgz"
def caveats
"setuid"
end
end
EOS
expected_offenses = [{ message: "Don't recommend setuid in the caveats, suggest sudo instead.",
severity: :convention,
line: 6,
column: 5,
source: source }]
inspect_source(cop, source)
expected_offenses.zip(cop.offenses).each do |expected, actual|
expect_offense(expected, actual)
end
end
def expect_offense(expected, actual)
expect(actual.message).to eq(expected[:message])
expect(actual.severity).to eq(expected[:severity])
expect(actual.line).to eq(expected[:line])
expect(actual.column).to eq(expected[:column])
end
end
end