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:
parent
bd6e9e72a1
commit
9457a23430
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user