Extract methods for checking for on_* blocks and their contents

- The same code to do the same thing was getting a bit repetitive in
  `Cask/StanzaOrder`, `Cask/StanzaGrouping` and `Cask/NoOverrides`
  cops.
This commit is contained in:
Issy Long 2023-04-15 22:55:12 +01:00 committed by Markus Reiter
parent bd6e9e72a1
commit 9457a23430
No known key found for this signature in database
GPG Key ID: 245293B51702655B
4 changed files with 23 additions and 29 deletions

View File

@ -22,6 +22,16 @@ module RuboCop
cask_block = RuboCop::Cask::AST::CaskBlock.new(block_node, comments)
on_cask(cask_block)
end
def on_system_methods(cask_stanzas)
cask_stanzas.select { |s| RuboCop::Cask::Constants::ON_SYSTEM_METHODS.include?(s.stanza_name) }
end
def inner_stanzas(block_node, comments)
block_contents = block_node.child_nodes.select(&:begin_type?)
inner_nodes = block_contents.map(&:child_nodes).flatten.select(&:send_type?)
inner_nodes.map { |n| RuboCop::Cask::AST::Stanza.new(n, comments) }
end
end
end
end

View File

@ -7,7 +7,6 @@ module RuboCop
class NoOverrides < Base
include CaskHelp
ON_SYSTEM_METHODS = RuboCop::Cask::Constants::ON_SYSTEM_METHODS
# These stanzas can be overridden by `on_*` blocks, so take them into account.
# TODO: Update this list if new stanzas are added to `Cask::DSL` that call `set_unique_stanza`.
OVERRIDEABLE_METHODS = [
@ -22,8 +21,7 @@ module RuboCop
def on_cask(cask_block)
cask_stanzas = cask_block.toplevel_stanzas
# Skip if there are no `on_*` blocks.
return if (on_blocks = cask_stanzas.select { |s| ON_SYSTEM_METHODS.include?(s.stanza_name) }).none?
return unless (on_blocks = on_system_methods(cask_stanzas)).any?
stanzas_in_blocks = on_system_stanzas(on_blocks)
@ -40,9 +38,7 @@ module RuboCop
def on_system_stanzas(on_system)
names = Set.new
method_nodes = on_system.map(&:method_node)
method_nodes.each do |node|
next unless node.block_type?
method_nodes.select(&:block_type?).each do |node|
node.child_nodes.each do |child|
child.each_node(:send) do |send_node|
# Skip (nested) livecheck blocks as its `url` is different to a download `url`.
@ -51,7 +47,7 @@ module RuboCop
if send_node.ancestors.drop_while { |a| !a.begin_type? }.any? { |a| a.dstr_type? || a.regexp_type? }
next
end
next if ON_SYSTEM_METHODS.include?(send_node.method_name)
next if RuboCop::Cask::Constants::ON_SYSTEM_METHODS.include?(send_node.method_name)
names.add(send_node.method_name)
end

View File

@ -6,7 +6,7 @@ require "forwardable"
module RuboCop
module Cop
module Cask
# This cop checks that a cask's stanzas are grouped correctly.
# This cop checks that a cask's stanzas are grouped correctly, including nested within `on_*` blocks.
# @see https://docs.brew.sh/Cask-Cookbook#stanza-order
class StanzaGrouping < Base
extend Forwardable
@ -14,7 +14,6 @@ module RuboCop
include CaskHelp
include RangeHelp
ON_SYSTEM_METHODS = RuboCop::Cask::Constants::ON_SYSTEM_METHODS
MISSING_LINE_MSG = "stanza groups should be separated by a single empty line"
EXTRA_LINE_MSG = "stanzas within the same group should have no lines between them"
@ -24,17 +23,11 @@ module RuboCop
cask_stanzas = cask_block.toplevel_stanzas
add_offenses(cask_stanzas)
# If present, check grouping of stanzas within `on_*` blocks.
return if (on_blocks = cask_stanzas.select { |s| ON_SYSTEM_METHODS.include?(s.stanza_name) }).none?
return unless (on_blocks = on_system_methods(cask_stanzas)).any?
on_blocks.map(&:method_node).each do |on_block|
next unless on_block.block_type?
block_contents = on_block.child_nodes.select(&:begin_type?)
inner_nodes = block_contents.map(&:child_nodes).flatten.select(&:send_type?)
inner_stanzas = inner_nodes.map { |node| RuboCop::Cask::AST::Stanza.new(node, processed_source.comments) }
add_offenses(inner_stanzas)
on_blocks.map(&:method_node).select(&:block_type?).each do |on_block|
stanzas = inner_stanzas(on_block, processed_source.comments)
add_offenses(stanzas)
end
end

View File

@ -6,29 +6,24 @@ require "forwardable"
module RuboCop
module Cop
module Cask
# This cop checks that a cask's stanzas are ordered correctly.
# This cop checks that a cask's stanzas are ordered correctly, including nested within `on_*` blocks.
# @see https://docs.brew.sh/Cask-Cookbook#stanza-order
class StanzaOrder < Base
extend Forwardable
extend AutoCorrector
include CaskHelp
ON_SYSTEM_METHODS = RuboCop::Cask::Constants::ON_SYSTEM_METHODS
MESSAGE = "`%<stanza>s` stanza out of order"
def on_cask(cask_block)
@cask_block = cask_block
add_offenses(toplevel_stanzas)
return unless (on_blocks = toplevel_stanzas.select { |s| ON_SYSTEM_METHODS.include?(s.stanza_name) }).any?
return unless (on_blocks = on_system_methods(toplevel_stanzas)).any?
on_blocks.map(&:method_node).each do |on_block|
next unless on_block.block_type?
block_contents = on_block.child_nodes.select(&:begin_type?)
inner_nodes = block_contents.map(&:child_nodes).flatten.select(&:send_type?)
inner_stanzas = inner_nodes.map { |node| RuboCop::Cask::AST::Stanza.new(node, processed_source.comments) }
add_offenses(inner_stanzas, inner: true)
on_blocks.map(&:method_node).select(&:block_type?).each do |on_block|
stanzas = inner_stanzas(on_block, processed_source.comments)
add_offenses(stanzas, inner: true)
end
end