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.12.5 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.12.4 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.12.3 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.12.2 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.12.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.12.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.11.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.10.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.9.5 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.9.4 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.9.3 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.9.2 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.9.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.9.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.8.1 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.8.0 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.7.5 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.7.4 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.7.3 lib/simplycop/custom_cops/timecop_without_block.rb
simplycop-1.7.2 lib/simplycop/custom_cops/timecop_without_block.rb