Merge pull request #5635 from Homebrew/dependabot/bundler/Library/Homebrew/vendor/rubocop-rspec-1.32.0
Bump rubocop-rspec from 1.31.0 to 1.32.0 in /Library/Homebrew/vendor
This commit is contained in:
		
						commit
						5866c2b00a
					
				
							
								
								
									
										2
									
								
								Library/Homebrew/vendor/Gemfile.lock
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Library/Homebrew/vendor/Gemfile.lock
									
									
									
									
										vendored
									
									
								
							@ -27,7 +27,7 @@ GEM
 | 
			
		||||
      rainbow (>= 2.2.2, < 4.0)
 | 
			
		||||
      ruby-progressbar (~> 1.7)
 | 
			
		||||
      unicode-display_width (~> 1.4.0)
 | 
			
		||||
    rubocop-rspec (1.31.0)
 | 
			
		||||
    rubocop-rspec (1.32.0)
 | 
			
		||||
      rubocop (>= 0.60.0)
 | 
			
		||||
    ruby-macho (2.1.0)
 | 
			
		||||
    ruby-progressbar (1.10.0)
 | 
			
		||||
 | 
			
		||||
@ -22,5 +22,5 @@ $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rainbow-3.0.0/lib"
 | 
			
		||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ruby-progressbar-1.10.0/lib"
 | 
			
		||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/unicode-display_width-1.4.1/lib"
 | 
			
		||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-0.63.1/lib"
 | 
			
		||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-rspec-1.31.0/lib"
 | 
			
		||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-rspec-1.32.0/lib"
 | 
			
		||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ruby-macho-2.1.0/lib"
 | 
			
		||||
 | 
			
		||||
@ -1,150 +0,0 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module RuboCop
 | 
			
		||||
  module Cop
 | 
			
		||||
    module RSpec
 | 
			
		||||
      module FactoryBot
 | 
			
		||||
        # Checks for create_list usage.
 | 
			
		||||
        #
 | 
			
		||||
        # This cop can be configured using the `EnforcedStyle` option
 | 
			
		||||
        #
 | 
			
		||||
        # @example `EnforcedStyle: create_list`
 | 
			
		||||
        #   # bad
 | 
			
		||||
        #   3.times { create :user }
 | 
			
		||||
        #
 | 
			
		||||
        #   # good
 | 
			
		||||
        #   create_list :user, 3
 | 
			
		||||
        #
 | 
			
		||||
        #   # good
 | 
			
		||||
        #   3.times { |n| create :user, created_at: n.months.ago }
 | 
			
		||||
        #
 | 
			
		||||
        # @example `EnforcedStyle: n_times`
 | 
			
		||||
        #   # bad
 | 
			
		||||
        #   create_list :user, 3
 | 
			
		||||
        #
 | 
			
		||||
        #   # good
 | 
			
		||||
        #   3.times { create :user }
 | 
			
		||||
        class CreateList < Cop
 | 
			
		||||
          include ConfigurableEnforcedStyle
 | 
			
		||||
 | 
			
		||||
          MSG_CREATE_LIST = 'Prefer create_list.'.freeze
 | 
			
		||||
          MSG_N_TIMES = 'Prefer %<number>s.times.'.freeze
 | 
			
		||||
 | 
			
		||||
          def_node_matcher :n_times_block_without_arg?, <<-PATTERN
 | 
			
		||||
            (block
 | 
			
		||||
              (send (int _) :times)
 | 
			
		||||
              (args)
 | 
			
		||||
              ...
 | 
			
		||||
            )
 | 
			
		||||
          PATTERN
 | 
			
		||||
 | 
			
		||||
          def_node_matcher :factory_call, <<-PATTERN
 | 
			
		||||
            (send ${(const nil? {:FactoryGirl :FactoryBot}) nil?} :create (sym $_) $...)
 | 
			
		||||
          PATTERN
 | 
			
		||||
 | 
			
		||||
          def_node_matcher :factory_list_call, <<-PATTERN
 | 
			
		||||
            (send ${(const nil? {:FactoryGirl :FactoryBot}) nil?} :create_list (sym $_) (int $_) $...)
 | 
			
		||||
          PATTERN
 | 
			
		||||
 | 
			
		||||
          def on_block(node)
 | 
			
		||||
            return unless style == :create_list
 | 
			
		||||
            return unless n_times_block_without_arg?(node)
 | 
			
		||||
            return unless contains_only_factory?(node.body)
 | 
			
		||||
 | 
			
		||||
            add_offense(node.send_node,
 | 
			
		||||
                        location: :expression, message: MSG_CREATE_LIST)
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def on_send(node)
 | 
			
		||||
            return unless style == :n_times
 | 
			
		||||
 | 
			
		||||
            factory_list_call(node) do |_receiver, _factory, count, _|
 | 
			
		||||
              add_offense(
 | 
			
		||||
                node,
 | 
			
		||||
                location: :selector,
 | 
			
		||||
                message: format(MSG_N_TIMES, number: count)
 | 
			
		||||
              )
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def autocorrect(node)
 | 
			
		||||
            if style == :create_list
 | 
			
		||||
              autocorrect_n_times_to_create_list(node)
 | 
			
		||||
            else
 | 
			
		||||
              autocorrect_create_list_to_n_times(node)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          private
 | 
			
		||||
 | 
			
		||||
          def contains_only_factory?(node)
 | 
			
		||||
            if node.block_type?
 | 
			
		||||
              factory_call(node.send_node)
 | 
			
		||||
            else
 | 
			
		||||
              factory_call(node)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def autocorrect_n_times_to_create_list(node)
 | 
			
		||||
            block = node.parent
 | 
			
		||||
            count = block.receiver.source
 | 
			
		||||
            replacement = factory_call_replacement(block.body, count)
 | 
			
		||||
 | 
			
		||||
            lambda do |corrector|
 | 
			
		||||
              corrector.replace(block.loc.expression, replacement)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def autocorrect_create_list_to_n_times(node)
 | 
			
		||||
            replacement = generate_n_times_block(node)
 | 
			
		||||
            lambda do |corrector|
 | 
			
		||||
              corrector.replace(node.loc.expression, replacement)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def generate_n_times_block(node)
 | 
			
		||||
            receiver, factory, count, options = *factory_list_call(node)
 | 
			
		||||
 | 
			
		||||
            arguments = ":#{factory}"
 | 
			
		||||
            options = build_options_string(options)
 | 
			
		||||
            arguments += ", #{options}" unless options.empty?
 | 
			
		||||
 | 
			
		||||
            replacement = format_receiver(receiver)
 | 
			
		||||
            replacement += format_method_call(node, 'create', arguments)
 | 
			
		||||
            "#{count}.times { #{replacement} }"
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def factory_call_replacement(body, count)
 | 
			
		||||
            receiver, factory, options = *factory_call(body)
 | 
			
		||||
 | 
			
		||||
            arguments = ":#{factory}, #{count}"
 | 
			
		||||
            options = build_options_string(options)
 | 
			
		||||
            arguments += ", #{options}" unless options.empty?
 | 
			
		||||
 | 
			
		||||
            replacement = format_receiver(receiver)
 | 
			
		||||
            replacement += format_method_call(body, 'create_list', arguments)
 | 
			
		||||
            replacement
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def build_options_string(options)
 | 
			
		||||
            options.map(&:source).join(', ')
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def format_method_call(node, method, arguments)
 | 
			
		||||
            if node.parenthesized?
 | 
			
		||||
              "#{method}(#{arguments})"
 | 
			
		||||
            else
 | 
			
		||||
              "#{method} #{arguments}"
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def format_receiver(receiver)
 | 
			
		||||
            return '' unless receiver
 | 
			
		||||
 | 
			
		||||
            "#{receiver.source}."
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -417,6 +417,11 @@ RSpec/VoidExpect:
 | 
			
		||||
  Enabled: true
 | 
			
		||||
  StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VoidExpect
 | 
			
		||||
 | 
			
		||||
RSpec/Yield:
 | 
			
		||||
  Description: This cop checks for calling a block within a stub.
 | 
			
		||||
  Enabled: true
 | 
			
		||||
  StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Yield
 | 
			
		||||
 | 
			
		||||
Capybara/CurrentPathExpectation:
 | 
			
		||||
  Description: Checks that no expectations are set on Capybara's `current_path`.
 | 
			
		||||
  Enabled: true
 | 
			
		||||
@ -0,0 +1,214 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module RuboCop
 | 
			
		||||
  module Cop
 | 
			
		||||
    module RSpec
 | 
			
		||||
      module FactoryBot
 | 
			
		||||
        # Checks for create_list usage.
 | 
			
		||||
        #
 | 
			
		||||
        # This cop can be configured using the `EnforcedStyle` option
 | 
			
		||||
        #
 | 
			
		||||
        # @example `EnforcedStyle: create_list`
 | 
			
		||||
        #   # bad
 | 
			
		||||
        #   3.times { create :user }
 | 
			
		||||
        #
 | 
			
		||||
        #   # good
 | 
			
		||||
        #   create_list :user, 3
 | 
			
		||||
        #
 | 
			
		||||
        #   # good
 | 
			
		||||
        #   3.times { |n| create :user, created_at: n.months.ago }
 | 
			
		||||
        #
 | 
			
		||||
        # @example `EnforcedStyle: n_times`
 | 
			
		||||
        #   # bad
 | 
			
		||||
        #   create_list :user, 3
 | 
			
		||||
        #
 | 
			
		||||
        #   # good
 | 
			
		||||
        #   3.times { create :user }
 | 
			
		||||
        class CreateList < Cop
 | 
			
		||||
          include ConfigurableEnforcedStyle
 | 
			
		||||
 | 
			
		||||
          MSG_CREATE_LIST = 'Prefer create_list.'.freeze
 | 
			
		||||
          MSG_N_TIMES = 'Prefer %<number>s.times.'.freeze
 | 
			
		||||
 | 
			
		||||
          def_node_matcher :n_times_block_without_arg?, <<-PATTERN
 | 
			
		||||
            (block
 | 
			
		||||
              (send (int _) :times)
 | 
			
		||||
              (args)
 | 
			
		||||
              ...
 | 
			
		||||
            )
 | 
			
		||||
          PATTERN
 | 
			
		||||
 | 
			
		||||
          def_node_matcher :factory_call, <<-PATTERN
 | 
			
		||||
            (send ${(const nil? {:FactoryGirl :FactoryBot}) nil?} :create (sym $_) $...)
 | 
			
		||||
          PATTERN
 | 
			
		||||
 | 
			
		||||
          def_node_matcher :factory_list_call, <<-PATTERN
 | 
			
		||||
            (send ${(const nil? {:FactoryGirl :FactoryBot}) nil?} :create_list (sym $_) (int $_) $...)
 | 
			
		||||
          PATTERN
 | 
			
		||||
 | 
			
		||||
          def on_block(node)
 | 
			
		||||
            return unless style == :create_list
 | 
			
		||||
            return unless n_times_block_without_arg?(node)
 | 
			
		||||
            return unless contains_only_factory?(node.body)
 | 
			
		||||
 | 
			
		||||
            add_offense(node.send_node,
 | 
			
		||||
                        location: :expression, message: MSG_CREATE_LIST)
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def on_send(node)
 | 
			
		||||
            return unless style == :n_times
 | 
			
		||||
 | 
			
		||||
            factory_list_call(node) do |_receiver, _factory, count, _|
 | 
			
		||||
              add_offense(
 | 
			
		||||
                node,
 | 
			
		||||
                location: :selector,
 | 
			
		||||
                message: format(MSG_N_TIMES, number: count)
 | 
			
		||||
              )
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          def autocorrect(node)
 | 
			
		||||
            if style == :create_list
 | 
			
		||||
              CreateListCorrector.new(node)
 | 
			
		||||
            else
 | 
			
		||||
              TimesCorrector.new(node)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          private
 | 
			
		||||
 | 
			
		||||
          def contains_only_factory?(node)
 | 
			
		||||
            if node.block_type?
 | 
			
		||||
              factory_call(node.send_node)
 | 
			
		||||
            else
 | 
			
		||||
              factory_call(node)
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          # :nodoc
 | 
			
		||||
          class Corrector
 | 
			
		||||
            private
 | 
			
		||||
 | 
			
		||||
            def build_options_string(options)
 | 
			
		||||
              options.map(&:source).join(', ')
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def format_method_call(node, method, arguments)
 | 
			
		||||
              if node.block_type? || node.parenthesized?
 | 
			
		||||
                "#{method}(#{arguments})"
 | 
			
		||||
              else
 | 
			
		||||
                "#{method} #{arguments}"
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def format_receiver(receiver)
 | 
			
		||||
              return '' unless receiver
 | 
			
		||||
 | 
			
		||||
              "#{receiver.source}."
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          # :nodoc
 | 
			
		||||
          class TimesCorrector < Corrector
 | 
			
		||||
            def initialize(node)
 | 
			
		||||
              @node = node
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def call(corrector)
 | 
			
		||||
              replacement = generate_n_times_block(node)
 | 
			
		||||
              corrector.replace(node.loc.expression, replacement)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            private
 | 
			
		||||
 | 
			
		||||
            attr_reader :node
 | 
			
		||||
 | 
			
		||||
            def generate_n_times_block(node)
 | 
			
		||||
              factory, count, *options = node.arguments
 | 
			
		||||
 | 
			
		||||
              arguments = factory.source
 | 
			
		||||
              options = build_options_string(options)
 | 
			
		||||
              arguments += ", #{options}" unless options.empty?
 | 
			
		||||
 | 
			
		||||
              replacement = format_receiver(node.receiver)
 | 
			
		||||
              replacement += format_method_call(node, 'create', arguments)
 | 
			
		||||
              "#{count.source}.times { #{replacement} }"
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          # :nodoc:
 | 
			
		||||
          class CreateListCorrector < Corrector
 | 
			
		||||
            def initialize(node)
 | 
			
		||||
              @node = node.parent
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def call(corrector)
 | 
			
		||||
              replacement = if node.body.block_type?
 | 
			
		||||
                              call_with_block_replacement(node)
 | 
			
		||||
                            else
 | 
			
		||||
                              call_replacement(node)
 | 
			
		||||
                            end
 | 
			
		||||
 | 
			
		||||
              corrector.replace(node.loc.expression, replacement)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            private
 | 
			
		||||
 | 
			
		||||
            attr_reader :node
 | 
			
		||||
 | 
			
		||||
            def call_with_block_replacement(node)
 | 
			
		||||
              block = node.body
 | 
			
		||||
              arguments = build_arguments(block, node.receiver.source)
 | 
			
		||||
              replacement = format_receiver(block.send_node.receiver)
 | 
			
		||||
              replacement += format_method_call(block, 'create_list', arguments)
 | 
			
		||||
              replacement += format_block(block)
 | 
			
		||||
              replacement
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def build_arguments(node, count)
 | 
			
		||||
              factory, *options = *node.send_node.arguments
 | 
			
		||||
 | 
			
		||||
              arguments = ":#{factory.value}, #{count}"
 | 
			
		||||
              options = build_options_string(options)
 | 
			
		||||
              arguments += ", #{options}" unless options.empty?
 | 
			
		||||
              arguments
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def call_replacement(node)
 | 
			
		||||
              block = node.body
 | 
			
		||||
              factory, *options = *block.arguments
 | 
			
		||||
 | 
			
		||||
              arguments = "#{factory.source}, #{node.receiver.source}"
 | 
			
		||||
              options = build_options_string(options)
 | 
			
		||||
              arguments += ", #{options}" unless options.empty?
 | 
			
		||||
 | 
			
		||||
              replacement = format_receiver(block.receiver)
 | 
			
		||||
              replacement += format_method_call(block, 'create_list', arguments)
 | 
			
		||||
              replacement
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def format_block(node)
 | 
			
		||||
              if node.body.begin_type?
 | 
			
		||||
                format_multiline_block(node)
 | 
			
		||||
              else
 | 
			
		||||
                format_singeline_block(node)
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def format_multiline_block(node)
 | 
			
		||||
              indent = ' ' * node.body.loc.column
 | 
			
		||||
              indent_end = ' ' * node.parent.loc.column
 | 
			
		||||
              " do #{node.arguments.source}\n" \
 | 
			
		||||
              "#{indent}#{node.body.source}\n" \
 | 
			
		||||
              "#{indent_end}end"
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            def format_singeline_block(node)
 | 
			
		||||
              " { #{node.arguments.source} #{node.body.source} }"
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -36,8 +36,8 @@ module RuboCop
 | 
			
		||||
        FOCUS_TRUE   = s(:pair, FOCUS_SYMBOL, s(:true))
 | 
			
		||||
 | 
			
		||||
        def_node_matcher :metadata, <<-PATTERN
 | 
			
		||||
          {(send nil? #{FOCUSABLE_SELECTORS} ... (hash $...))
 | 
			
		||||
           (send nil? #{FOCUSABLE_SELECTORS} $...)}
 | 
			
		||||
          {(send {(const nil? :RSpec) nil?} #{FOCUSABLE_SELECTORS} ... (hash $...))
 | 
			
		||||
           (send {(const nil? :RSpec) nil?} #{FOCUSABLE_SELECTORS} $...)}
 | 
			
		||||
        PATTERN
 | 
			
		||||
 | 
			
		||||
        def_node_matcher :focused_block?, focused.send_pattern
 | 
			
		||||
@ -37,8 +37,8 @@ module RuboCop
 | 
			
		||||
        PENDING_SYMBOL = s(:sym, :pending)
 | 
			
		||||
 | 
			
		||||
        def_node_matcher :metadata, <<-PATTERN
 | 
			
		||||
          {(send nil? #{SKIPPABLE_SELECTORS} ... (hash $...))
 | 
			
		||||
           (send nil? #{SKIPPABLE_SELECTORS} $...)}
 | 
			
		||||
          {(send {(const nil? :RSpec) nil?} #{SKIPPABLE_SELECTORS} ... (hash $...))
 | 
			
		||||
           (send {(const nil? :RSpec) nil?} #{SKIPPABLE_SELECTORS} $...)}
 | 
			
		||||
        PATTERN
 | 
			
		||||
 | 
			
		||||
        def_node_matcher :pending_block?, PENDING_EXAMPLES.send_pattern
 | 
			
		||||
@ -30,8 +30,12 @@ module RuboCop
 | 
			
		||||
          (send $(send _ {:exactly :at_least :at_most} (int {1 2})) :times)
 | 
			
		||||
        PATTERN
 | 
			
		||||
 | 
			
		||||
        def_node_search :stub?, '(send nil? :receive ...)'
 | 
			
		||||
 | 
			
		||||
        def on_send(node)
 | 
			
		||||
          receive_counts(node) do |offending_node|
 | 
			
		||||
            return unless stub?(offending_node.receiver)
 | 
			
		||||
 | 
			
		||||
            offending_range = range(node, offending_node)
 | 
			
		||||
 | 
			
		||||
            add_offense(
 | 
			
		||||
@ -48,10 +52,9 @@ module RuboCop
 | 
			
		||||
              node.method_name,
 | 
			
		||||
              node.first_argument.source.to_i
 | 
			
		||||
            )
 | 
			
		||||
            corrector.replace(
 | 
			
		||||
              range(node.parent, node),
 | 
			
		||||
              replacement
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            original = range(node.parent, node)
 | 
			
		||||
            corrector.replace(original, replacement)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,77 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module RuboCop
 | 
			
		||||
  module Cop
 | 
			
		||||
    module RSpec
 | 
			
		||||
      # This cop checks for calling a block within a stub.
 | 
			
		||||
      #
 | 
			
		||||
      # @example
 | 
			
		||||
      #   # bad
 | 
			
		||||
      #   allow(foo).to receive(:bar) { |&block| block.call(1) }
 | 
			
		||||
      #
 | 
			
		||||
      #   # good
 | 
			
		||||
      #   expect(foo).to be(:bar).and_yield(1)
 | 
			
		||||
      class Yield < Cop
 | 
			
		||||
        include RangeHelp
 | 
			
		||||
 | 
			
		||||
        MSG = 'Use `.and_yield`.'.freeze
 | 
			
		||||
 | 
			
		||||
        def_node_search :method_on_stub?, '(send nil? :receive ...)'
 | 
			
		||||
 | 
			
		||||
        def_node_matcher :block_arg, '(args (blockarg $_))'
 | 
			
		||||
 | 
			
		||||
        def_node_matcher :block_call?, '(send (lvar %) :call ...)'
 | 
			
		||||
 | 
			
		||||
        def on_block(node)
 | 
			
		||||
          return unless method_on_stub?(node.send_node)
 | 
			
		||||
 | 
			
		||||
          block_arg(node.arguments) do |block|
 | 
			
		||||
            if calling_block?(node.body, block)
 | 
			
		||||
              add_offense(node, location: block_range(node))
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def autocorrect(node)
 | 
			
		||||
          lambda do |corrector|
 | 
			
		||||
            node_range = range_with_surrounding_space(
 | 
			
		||||
              range: block_range(node), side: :left
 | 
			
		||||
            )
 | 
			
		||||
            corrector.replace(node_range, generate_replacement(node.body))
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        private
 | 
			
		||||
 | 
			
		||||
        def calling_block?(node, block)
 | 
			
		||||
          if node.begin_type?
 | 
			
		||||
            node.each_child_node.all? { |child| block_call?(child, block) }
 | 
			
		||||
          else
 | 
			
		||||
            block_call?(node, block)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def block_range(node)
 | 
			
		||||
          block_start = node.loc.begin.begin_pos
 | 
			
		||||
          block_end = node.loc.end.end_pos
 | 
			
		||||
          range_between(block_start, block_end)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def generate_replacement(node)
 | 
			
		||||
          if node.begin_type?
 | 
			
		||||
            node.children.map { |child| convert_block_to_yield(child) }.join
 | 
			
		||||
          else
 | 
			
		||||
            convert_block_to_yield(node)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        def convert_block_to_yield(node)
 | 
			
		||||
          args = node.arguments
 | 
			
		||||
          replacement = '.and_yield'
 | 
			
		||||
          replacement += "(#{args.map(&:source).join(', ')})" if args.any?
 | 
			
		||||
          replacement
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -75,3 +75,4 @@ require_relative 'rspec/subject_stub'
 | 
			
		||||
require_relative 'rspec/unspecified_exception'
 | 
			
		||||
require_relative 'rspec/verified_doubles'
 | 
			
		||||
require_relative 'rspec/void_expect'
 | 
			
		||||
require_relative 'rspec/yield'
 | 
			
		||||
@ -4,7 +4,7 @@ module RuboCop
 | 
			
		||||
  module RSpec
 | 
			
		||||
    # Version information for the RSpec RuboCop plugin.
 | 
			
		||||
    module Version
 | 
			
		||||
      STRING = '1.31.0'.freeze
 | 
			
		||||
      STRING = '1.32.0'.freeze
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user