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
	 Issy Long
						Issy Long