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) cask_block = RuboCop::Cask::AST::CaskBlock.new(block_node, comments)
on_cask(cask_block) on_cask(cask_block)
end 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 end
end end

View File

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

View File

@ -6,7 +6,7 @@ require "forwardable"
module RuboCop module RuboCop
module Cop module Cop
module Cask 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 # @see https://docs.brew.sh/Cask-Cookbook#stanza-order
class StanzaGrouping < Base class StanzaGrouping < Base
extend Forwardable extend Forwardable
@ -14,7 +14,6 @@ module RuboCop
include CaskHelp include CaskHelp
include RangeHelp include RangeHelp
ON_SYSTEM_METHODS = RuboCop::Cask::Constants::ON_SYSTEM_METHODS
MISSING_LINE_MSG = "stanza groups should be separated by a single empty line" 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" 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 cask_stanzas = cask_block.toplevel_stanzas
add_offenses(cask_stanzas) add_offenses(cask_stanzas)
# If present, check grouping of stanzas within `on_*` blocks. return unless (on_blocks = on_system_methods(cask_stanzas)).any?
return if (on_blocks = cask_stanzas.select { |s| ON_SYSTEM_METHODS.include?(s.stanza_name) }).none?
on_blocks.map(&:method_node).each do |on_block| on_blocks.map(&:method_node).select(&:block_type?).each do |on_block|
next unless on_block.block_type? stanzas = inner_stanzas(on_block, processed_source.comments)
add_offenses(stanzas)
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)
end end
end end

View File

@ -6,29 +6,24 @@ require "forwardable"
module RuboCop module RuboCop
module Cop module Cop
module Cask 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 # @see https://docs.brew.sh/Cask-Cookbook#stanza-order
class StanzaOrder < Base class StanzaOrder < Base
extend Forwardable extend Forwardable
extend AutoCorrector extend AutoCorrector
include CaskHelp include CaskHelp
ON_SYSTEM_METHODS = RuboCop::Cask::Constants::ON_SYSTEM_METHODS
MESSAGE = "`%<stanza>s` stanza out of order" MESSAGE = "`%<stanza>s` stanza out of order"
def on_cask(cask_block) def on_cask(cask_block)
@cask_block = cask_block @cask_block = cask_block
add_offenses(toplevel_stanzas) 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| on_blocks.map(&:method_node).select(&:block_type?).each do |on_block|
next unless on_block.block_type? stanzas = inner_stanzas(on_block, processed_source.comments)
add_offenses(stanzas, inner: true)
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)
end end
end end