Sha256: bf3efc648bbd9fe12dcb3d59f5fa33b52ac71f8582ee553077e78a9c56cc7a0d
Contents?: true
Size: 1.18 KB
Versions: 35
Compression:
Stored size: 1.18 KB
Contents
# frozen_string_literal: true module CustomCops class TimecopWithoutBlock < RuboCop::Cop::Cop MSG = 'Avoid using `Timecop.%<method>s` without providing a block.' def_node_matcher :timecop_method, '(send (const nil? :Timecop) ${:travel :freeze} ...)' def on_send(node) timecop_method(node) do |method_name| return if !method_name || first_child_of_block?(node) || last_child_is_a_block(node) add_offense(node, location: :selector, message: format(MSG, method: method_name)) end end private # Checks if the given node's parent is a block, and the given node is its first child, # which would mean that the block is supplied to the given node (i.e `node { block }`) def first_child_of_block?(node) return false unless (parent = node.parent) return false unless parent.type == :block parent.children.first == node end # Checks whether the last child of the given node is a block. # this denotes the following structure: # `Timecop.method(arg1, arg2, &block)`, which is also a valid way of passing in a block def last_child_is_a_block(node) node.children.last&.type == :block_pass end end end
Version data entries
35 entries across 35 versions & 1 rubygems