98 lines
2.9 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require "rubocops/extend/formula"
module RuboCop
module Cop
module FormulaAudit
class ClassName < FormulaCop
DEPRECATED_CLASSES = %w[
GithubGistFormula
ScriptFileFormula
AmazonWebServicesFormula
].freeze
def audit_formula(_node, _class_node, parent_class_node, _body_node)
parent_class = class_name(parent_class_node)
return unless DEPRECATED_CLASSES.include?(parent_class)
2018-09-17 02:45:00 +02:00
problem "#{parent_class} is deprecated, use Formula instead"
end
def autocorrect(node)
lambda do |corrector|
corrector.replace(node.source_range, "Formula")
end
end
end
2018-08-15 19:29:22 -04:00
class TestCalls < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
test = find_block(body_node, :test)
return unless test
test_calls(test) do |node, params|
2018-08-15 19:29:22 -04:00
p1, p2 = params
if match = string_content(p1).match(%r{(/usr/local/(s?bin))})
offending_node(p1)
problem "use \#{#{match[2]}} instead of #{match[1]} in #{node}"
end
if node == :shell_output && node_equals?(p2, 0)
offending_node(p2)
problem "Passing 0 to shell_output() is redundant"
end
end
end
def autocorrect(node)
lambda do |corrector|
case node.type
when :str, :dstr
2020-03-13 21:15:06 +00:00
# Rubocop: intentionally outputted non-interpolated strings
corrector.replace(node.source_range,
node.source.to_s.sub(%r{(/usr/local/(s?bin))},
2020-03-13 21:15:06 +00:00
'#{\2}')) # rubocop:disable Lint/InterpolationCheck
when :int
corrector.remove(
range_with_surrounding_comma(
range_with_surrounding_space(range: node.source_range,
2018-11-02 17:18:07 +00:00
side: :left),
),
)
end
end
end
2018-08-15 19:29:22 -04:00
def_node_search :test_calls, <<~EOS
(send nil? ${:system :shell_output :pipe_output} $...)
EOS
end
end
module FormulaAudit
# - `test do ..end` should be meaningfully defined in the formula.
class Test < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
2018-08-07 03:04:42 +01:00
test = find_block(body_node, :test)
unless test
problem "A `test do` test block should be added"
return
end
if test.body.nil?
problem "`test do` should not be empty"
return
end
2020-04-11 14:18:40 +01:00
return unless test.body.single_line?
return if test.body.source.to_s != "true"
2018-09-17 02:45:00 +02:00
2018-08-07 03:04:42 +01:00
problem "`test do` should contain a real test"
end
end
end
end
end