Skip to content

Commit

Permalink
rubocops: handle empty formula body in various cops
Browse files Browse the repository at this point in the history
  • Loading branch information
Bo98 committed Nov 5, 2022
1 parent a54b7a8 commit 6ede5d2
Show file tree
Hide file tree
Showing 13 changed files with 54 additions and 3 deletions.
3 changes: 2 additions & 1 deletion Library/Homebrew/rubocops/class.rb
Expand Up @@ -75,9 +75,10 @@ module FormulaAuditStrict
#
# @api private
class TestPresent < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
def audit_formula(_node, class_node, _parent_class_node, body_node)
return if find_block(body_node, :test)

offending_node(class_node) if body_node.nil?
problem "A `test do` test block should be added"
end
end
Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/rubocops/components_order.rb
Expand Up @@ -15,6 +15,8 @@ class ComponentsOrder < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

@present_components, @offensive_nodes = check_order(FORMULA_COMPONENT_PRECEDENCE_LIST, body_node)

component_problem @offensive_nodes[0], @offensive_nodes[1] if @offensive_nodes
Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/rubocops/components_redundancy.rb
Expand Up @@ -20,6 +20,8 @@ class ComponentsRedundancy < FormulaCop
STABLE_MSG = "`stable do` should not be present without a `head` spec"

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

urls = find_method_calls_by_name(body_node, :url)

urls.each do |url|
Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/rubocops/conflicts.rb
Expand Up @@ -15,6 +15,8 @@ class Conflicts < FormulaCop
"Use `keg_only :versioned_formula` instead."

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

find_method_calls_by_name(body_node, :conflicts_with).each do |conflicts_with_call|
next unless parameters(conflicts_with_call).last.respond_to? :values

Expand Down
4 changes: 4 additions & 0 deletions Library/Homebrew/rubocops/extend/formula.rb
Expand Up @@ -50,6 +50,8 @@ def audit_urls(urls, regex)
#
# @param dependency_name dependency's name
def depends_on?(dependency_name, *types)
return if @body.nil?

types = [:any] if types.empty?
dependency_nodes = find_every_method_call_by_name(@body, :depends_on)
idx = dependency_nodes.index do |n|
Expand Down Expand Up @@ -106,6 +108,8 @@ def depends_on_name_type?(node, name = nil, type = :required)

# Return all the caveats' string nodes in an array.
def caveats_strings
return [] if @body.nil?

find_strings(find_method_def(@body, :caveats))
end

Expand Down
3 changes: 2 additions & 1 deletion Library/Homebrew/rubocops/formula_desc.rb
Expand Up @@ -14,9 +14,10 @@ class Desc < FormulaCop
include DescHelper
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
def audit_formula(_node, class_node, _parent_class_node, body_node)
@name = @formula_name
desc_call = find_node_method_by_name(body_node, :desc)
offending_node(class_node) if body_node.nil?
audit_desc(:formula, @name, desc_call)
end
end
Expand Down
3 changes: 2 additions & 1 deletion Library/Homebrew/rubocops/homepage.rb
Expand Up @@ -10,10 +10,11 @@ module FormulaAudit
class Homepage < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
def audit_formula(_node, class_node, _parent_class_node, body_node)
homepage_node = find_node_method_by_name(body_node, :homepage)

if homepage_node.nil?
offending_node(class_node) if body_node.nil?
problem "Formula should have a homepage."
return
end
Expand Down
20 changes: 20 additions & 0 deletions Library/Homebrew/rubocops/lines.rb
Expand Up @@ -91,6 +91,8 @@ def audit_formula(_node, _class_node, _parent_class_node, _body_node)
# @api private
class AssertStatements < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

find_every_method_call_by_name(body_node, :assert).each do |method|
if method_called_ever?(method, :include?) && !method_called_ever?(method, :!)
problem "Use `assert_match` instead of `assert ...include?`"
Expand All @@ -116,6 +118,8 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node)
# @api private
class OptionDeclarations < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

problem "Use new-style option definitions" if find_method_def(body_node, :options)

if formula_tap == "homebrew-core"
Expand Down Expand Up @@ -201,6 +205,8 @@ class MpiCheck < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

# Enforce use of OpenMPI for MPI dependency in core
return unless formula_tap == "homebrew-core"

Expand All @@ -219,6 +225,8 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node)
# @api private
class PyoxidizerCheck < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

# Disallow use of PyOxidizer as a dependency in core
return unless formula_tap == "homebrew-core"

Expand Down Expand Up @@ -246,6 +254,8 @@ class SafePopenCommands < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

test = find_block(body_node, :test)

[:popen_read, :popen_write].each do |unsafe_command|
Expand Down Expand Up @@ -275,6 +285,8 @@ class ShellVariables < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

popen_commands = [
:popen,
:popen_read,
Expand Down Expand Up @@ -305,6 +317,8 @@ class LicenseArrays < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

license_node = find_node_method_by_name(body_node, :license)
return unless license_node

Expand All @@ -322,6 +336,8 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node)
# @api private
class Licenses < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

license_node = find_node_method_by_name(body_node, :license)
return unless license_node
return if license_node.source.include?("\n")
Expand All @@ -345,6 +361,8 @@ class PythonVersions < FormulaCop
extend AutoCorrector

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

python_formula_node = find_every_method_call_by_name(body_node, :depends_on).find do |dep|
string_content(parameters(dep).first).start_with? "python@"
end
Expand Down Expand Up @@ -565,6 +583,8 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node)
# @api private
class Miscellaneous < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

# FileUtils is included in Formula
# encfs modifies a file with this name, so check for some leading characters
find_instance_method_call(body_node, "FileUtils", nil) do |method_node|
Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/rubocops/options.rb
Expand Up @@ -15,6 +15,8 @@ class Options < FormulaCop
OPTION = "Formulae in homebrew/core should not use `option`."

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

option_call_nodes = find_every_method_call_by_name(body_node, :option)
option_call_nodes.each do |option_call|
option = parameters(option_call).first
Expand Down
2 changes: 2 additions & 0 deletions Library/Homebrew/rubocops/patches.rb
Expand Up @@ -16,6 +16,8 @@ class Patches < FormulaCop
def audit_formula(node, _class_node, _parent_class_node, body)
@full_source_content = source_buffer(node).source

return if body.nil?

external_patches = find_all_blocks(body, :patch)
external_patches.each do |patch_block|
url_node = find_every_method_call_by_name(patch_block, :url).first
Expand Down
4 changes: 4 additions & 0 deletions Library/Homebrew/rubocops/text.rb
Expand Up @@ -22,6 +22,8 @@ def audit_formula(node, _class_node, _parent_class_node, body_node)
end
end

return if body_node.nil?

if !find_node_method_by_name(body_node, :plist_options) &&
find_method_def(body_node, :plist)
problem "Please set plist_options when using a formula-defined plist."
Expand Down Expand Up @@ -106,6 +108,8 @@ module FormulaAuditStrict
# @api private
class Text < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

find_method_with_args(body_node, :go_resource) do
problem "`go_resource`s are deprecated. Please ask upstream to implement Go vendoring"
end
Expand Down
6 changes: 6 additions & 0 deletions Library/Homebrew/rubocops/urls.rb
Expand Up @@ -11,6 +11,8 @@ module FormulaAudit
# @api private
class Urls < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

urls = find_every_func_call_by_name(body_node, :url)
mirrors = find_every_func_call_by_name(body_node, :mirror)

Expand Down Expand Up @@ -262,6 +264,8 @@ class PyPiUrls < FormulaCop
extend T::Sig

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

urls = find_every_func_call_by_name(body_node, :url)
mirrors = find_every_func_call_by_name(body_node, :mirror)
urls += mirrors
Expand Down Expand Up @@ -292,6 +296,7 @@ def get_pypi_url(url)
# @api private
class GitUrls < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?
return unless formula_tap == "homebrew-core"

find_method_calls_by_name(body_node, :url).each do |url|
Expand All @@ -315,6 +320,7 @@ module FormulaAuditStrict
# @api private
class GitUrls < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?
return unless formula_tap == "homebrew-core"

find_method_calls_by_name(body_node, :url).each do |url|
Expand Down
4 changes: 4 additions & 0 deletions Library/Homebrew/rubocops/uses_from_macos.rb
Expand Up @@ -61,6 +61,8 @@ class ProvidedByMacos < FormulaCop
].freeze

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

find_method_with_args(body_node, :keg_only, :provided_by_macos) do
return if PROVIDED_BY_MACOS_FORMULAE.include? @formula_name

Expand Down Expand Up @@ -94,6 +96,8 @@ class UsesFromMacos < FormulaCop
].freeze

def audit_formula(_node, _class_node, _parent_class_node, body_node)
return if body_node.nil?

find_method_with_args(body_node, :uses_from_macos, /^"(.+)"/).each do |method|
dep = if parameters(method).first.instance_of?(RuboCop::AST::StrNode)
parameters(method).first
Expand Down

0 comments on commit 6ede5d2

Please sign in to comment.