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

Version Path
simplycop-1.7.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.7.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.6.4 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.6.3 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.6.2 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.6.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.6.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.5.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.4.2 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.4.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.4.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.3.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.2.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.1.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.0.0.pre lib/simplycop/custom_cops/timecop_without_block.rb