rubocop-rspec 1.41.0 → 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/rubocop/cop/rspec/align_left_let_brace.rb +11 -18
- data/lib/rubocop/cop/rspec/align_right_let_brace.rb +11 -18
- data/lib/rubocop/cop/rspec/be.rb +1 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +5 -5
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +18 -16
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +8 -9
- data/lib/rubocop/cop/rspec/context_method.rb +5 -7
- data/lib/rubocop/cop/rspec/cop.rb +1 -1
- data/lib/rubocop/cop/rspec/described_class.rb +10 -7
- data/lib/rubocop/cop/rspec/dialect.rb +4 -11
- data/lib/rubocop/cop/rspec/empty_hook.rb +5 -9
- data/lib/rubocop/cop/rspec/empty_line_after_example.rb +5 -3
- data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +5 -5
- data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +4 -1
- data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +5 -5
- data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +4 -1
- data/lib/rubocop/cop/rspec/example_wording.rb +6 -7
- data/lib/rubocop/cop/rspec/expect_actual.rb +7 -10
- data/lib/rubocop/cop/rspec/expect_change.rb +9 -34
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +2 -2
- data/lib/rubocop/cop/rspec/expect_output.rb +1 -1
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +18 -18
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +10 -16
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +6 -7
- data/lib/rubocop/cop/rspec/hook_argument.rb +11 -17
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +12 -13
- data/lib/rubocop/cop/rspec/implicit_expect.rb +6 -14
- data/lib/rubocop/cop/rspec/implicit_subject.rb +8 -5
- data/lib/rubocop/cop/rspec/instance_spy.rb +17 -11
- data/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb +2 -5
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +4 -5
- data/lib/rubocop/cop/rspec/leading_subject.rb +13 -13
- data/lib/rubocop/cop/rspec/let_before_examples.rb +12 -10
- data/lib/rubocop/cop/rspec/message_chain.rb +6 -5
- data/lib/rubocop/cop/rspec/message_expectation.rb +1 -1
- data/lib/rubocop/cop/rspec/message_spies.rb +1 -2
- data/lib/rubocop/cop/rspec/multiple_subjects.rb +17 -18
- data/lib/rubocop/cop/rspec/named_subject.rb +1 -1
- data/lib/rubocop/cop/rspec/not_to_not.rb +4 -5
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +23 -53
- data/lib/rubocop/cop/rspec/rails/http_status.rb +4 -8
- data/lib/rubocop/cop/rspec/receive_counts.rb +14 -16
- data/lib/rubocop/cop/rspec/receive_never.rb +10 -10
- data/lib/rubocop/cop/rspec/return_from_stub.rb +8 -19
- data/lib/rubocop/cop/rspec/scattered_let.rb +7 -10
- data/lib/rubocop/cop/rspec/shared_context.rb +7 -20
- data/lib/rubocop/cop/rspec/shared_examples.rb +5 -8
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +14 -17
- data/lib/rubocop/cop/rspec/yield.rb +13 -10
- data/lib/rubocop/rspec/blank_line_separation.rb +0 -8
- data/lib/rubocop/rspec/version.rb +1 -1
- metadata +4 -4
| @@ -34,6 +34,7 @@ module RuboCop | |
| 34 34 | 
             
                  #   it { does_something }
         | 
| 35 35 | 
             
                  #
         | 
| 36 36 | 
             
                  class EmptyLineAfterHook < Cop
         | 
| 37 | 
            +
                    extend AutoCorrector
         | 
| 37 38 | 
             
                    include RuboCop::RSpec::BlankLineSeparation
         | 
| 38 39 |  | 
| 39 40 | 
             
                    MSG = 'Add an empty line after `%<hook>s`.'
         | 
| @@ -43,11 +44,10 @@ module RuboCop | |
| 43 44 | 
             
                      return if last_child?(node)
         | 
| 44 45 |  | 
| 45 46 | 
             
                      missing_separating_line(node) do |location|
         | 
| 46 | 
            -
                         | 
| 47 | 
            -
             | 
| 48 | 
            -
                          location | 
| 49 | 
            -
             | 
| 50 | 
            -
                        )
         | 
| 47 | 
            +
                        msg = format(MSG, hook: node.method_name)
         | 
| 48 | 
            +
                        add_offense(location, message: msg) do |corrector|
         | 
| 49 | 
            +
                          corrector.insert_after(location.end, "\n")
         | 
| 50 | 
            +
                        end
         | 
| 51 51 | 
             
                      end
         | 
| 52 52 | 
             
                    end
         | 
| 53 53 | 
             
                  end
         | 
| @@ -15,6 +15,7 @@ module RuboCop | |
| 15 15 | 
             
                  #
         | 
| 16 16 | 
             
                  #   let(:foo) { bar }
         | 
| 17 17 | 
             
                  class EmptyLineAfterSubject < Cop
         | 
| 18 | 
            +
                    extend AutoCorrector
         | 
| 18 19 | 
             
                    include RuboCop::RSpec::BlankLineSeparation
         | 
| 19 20 |  | 
| 20 21 | 
             
                    MSG = 'Add empty line after `subject`.'
         | 
| @@ -24,7 +25,9 @@ module RuboCop | |
| 24 25 | 
             
                      return if last_child?(node)
         | 
| 25 26 |  | 
| 26 27 | 
             
                      missing_separating_line(node) do |location|
         | 
| 27 | 
            -
                        add_offense( | 
| 28 | 
            +
                        add_offense(location) do |corrector|
         | 
| 29 | 
            +
                          corrector.insert_after(location.end, "\n")
         | 
| 30 | 
            +
                        end
         | 
| 28 31 | 
             
                      end
         | 
| 29 32 | 
             
                    end
         | 
| 30 33 |  | 
| @@ -30,6 +30,8 @@ module RuboCop | |
| 30 30 | 
             
                  #   it 'does things' do
         | 
| 31 31 | 
             
                  #   end
         | 
| 32 32 | 
             
                  class ExampleWording < Cop
         | 
| 33 | 
            +
                    extend AutoCorrector
         | 
| 34 | 
            +
             | 
| 33 35 | 
             
                    MSG_SHOULD = 'Do not use should when describing your tests.'
         | 
| 34 36 | 
             
                    MSG_IT     = "Do not repeat 'it' when describing your tests."
         | 
| 35 37 |  | 
| @@ -53,16 +55,13 @@ module RuboCop | |
| 53 55 | 
             
                      end
         | 
| 54 56 | 
             
                    end
         | 
| 55 57 |  | 
| 56 | 
            -
                    def autocorrect(node)
         | 
| 57 | 
            -
                      lambda do |corrector|
         | 
| 58 | 
            -
                        corrector.replace(docstring(node), replacement_text(node))
         | 
| 59 | 
            -
                      end
         | 
| 60 | 
            -
                    end
         | 
| 61 | 
            -
             | 
| 62 58 | 
             
                    private
         | 
| 63 59 |  | 
| 64 60 | 
             
                    def add_wording_offense(node, message)
         | 
| 65 | 
            -
                       | 
| 61 | 
            +
                      docstring = docstring(node)
         | 
| 62 | 
            +
                      add_offense(docstring, message: message) do |corrector|
         | 
| 63 | 
            +
                        corrector.replace(docstring, replacement_text(node))
         | 
| 64 | 
            +
                      end
         | 
| 66 65 | 
             
                    end
         | 
| 67 66 |  | 
| 68 67 | 
             
                    def docstring(node)
         | 
| @@ -17,6 +17,8 @@ module RuboCop | |
| 17 17 | 
             
                  #   expect(name).to eq("John")
         | 
| 18 18 | 
             
                  #
         | 
| 19 19 | 
             
                  class ExpectActual < Cop
         | 
| 20 | 
            +
                    extend AutoCorrector
         | 
| 21 | 
            +
             | 
| 20 22 | 
             
                    MSG = 'Provide the actual you are testing to `expect(...)`.'
         | 
| 21 23 |  | 
| 22 24 | 
             
                    SIMPLE_LITERALS = %i[
         | 
| @@ -55,17 +57,12 @@ module RuboCop | |
| 55 57 | 
             
                    PATTERN
         | 
| 56 58 |  | 
| 57 59 | 
             
                    def on_send(node)
         | 
| 58 | 
            -
                      expect_literal(node) do | | 
| 59 | 
            -
                        add_offense( | 
| 60 | 
            -
             | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                    def autocorrect(node)
         | 
| 64 | 
            -
                      actual, matcher, expected = expect_literal(node)
         | 
| 65 | 
            -
                      lambda do |corrector|
         | 
| 66 | 
            -
                        return unless SUPPORTED_MATCHERS.include?(matcher)
         | 
| 60 | 
            +
                      expect_literal(node) do |actual, matcher, expected|
         | 
| 61 | 
            +
                        add_offense(actual.source_range) do |corrector|
         | 
| 62 | 
            +
                          next unless SUPPORTED_MATCHERS.include?(matcher)
         | 
| 67 63 |  | 
| 68 | 
            -
             | 
| 64 | 
            +
                          swap(corrector, actual, expected)
         | 
| 65 | 
            +
                        end
         | 
| 69 66 | 
             
                      end
         | 
| 70 67 | 
             
                    end
         | 
| 71 68 |  | 
| @@ -30,6 +30,7 @@ module RuboCop | |
| 30 30 | 
             
                  #   expect { run }.to change { user.reload.name }
         | 
| 31 31 | 
             
                  #
         | 
| 32 32 | 
             
                  class ExpectChange < Cop
         | 
| 33 | 
            +
                    extend AutoCorrector
         | 
| 33 34 | 
             
                    include ConfigurableEnforcedStyle
         | 
| 34 35 |  | 
| 35 36 | 
             
                    MSG_BLOCK = 'Prefer `change(%<obj>s, :%<attr>s)`.'
         | 
| @@ -51,10 +52,11 @@ module RuboCop | |
| 51 52 | 
             
                      return unless style == :block
         | 
| 52 53 |  | 
| 53 54 | 
             
                      expect_change_with_arguments(node) do |receiver, message|
         | 
| 54 | 
            -
                         | 
| 55 | 
            -
             | 
| 56 | 
            -
                           | 
| 57 | 
            -
             | 
| 55 | 
            +
                        msg = format(MSG_CALL, obj: receiver, attr: message)
         | 
| 56 | 
            +
                        add_offense(node, message: msg) do |corrector|
         | 
| 57 | 
            +
                          replacement = "change { #{receiver}.#{message} }"
         | 
| 58 | 
            +
                          corrector.replace(node, replacement)
         | 
| 59 | 
            +
                        end
         | 
| 58 60 | 
             
                      end
         | 
| 59 61 | 
             
                    end
         | 
| 60 62 |  | 
| @@ -62,37 +64,10 @@ module RuboCop | |
| 62 64 | 
             
                      return unless style == :method_call
         | 
| 63 65 |  | 
| 64 66 | 
             
                      expect_change_with_block(node) do |receiver, message|
         | 
| 65 | 
            -
                         | 
| 66 | 
            -
             | 
| 67 | 
            -
                          message: format(MSG_BLOCK, obj: receiver, attr: message)
         | 
| 68 | 
            -
                        )
         | 
| 69 | 
            -
                      end
         | 
| 70 | 
            -
                    end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                    def autocorrect(node)
         | 
| 73 | 
            -
                      if style == :block
         | 
| 74 | 
            -
                        autocorrect_method_call_to_block(node)
         | 
| 75 | 
            -
                      else
         | 
| 76 | 
            -
                        autocorrect_block_to_method_call(node)
         | 
| 77 | 
            -
                      end
         | 
| 78 | 
            -
                    end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                    private
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                    def autocorrect_method_call_to_block(node)
         | 
| 83 | 
            -
                      lambda do |corrector|
         | 
| 84 | 
            -
                        expect_change_with_arguments(node) do |receiver, message|
         | 
| 85 | 
            -
                          replacement = "change { #{receiver}.#{message} }"
         | 
| 86 | 
            -
                          corrector.replace(node.loc.expression, replacement)
         | 
| 87 | 
            -
                        end
         | 
| 88 | 
            -
                      end
         | 
| 89 | 
            -
                    end
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                    def autocorrect_block_to_method_call(node)
         | 
| 92 | 
            -
                      lambda do |corrector|
         | 
| 93 | 
            -
                        expect_change_with_block(node) do |receiver, message|
         | 
| 67 | 
            +
                        msg = format(MSG_BLOCK, obj: receiver, attr: message)
         | 
| 68 | 
            +
                        add_offense(node, message: msg) do |corrector|
         | 
| 94 69 | 
             
                          replacement = "change(#{receiver}, :#{message})"
         | 
| 95 | 
            -
                          corrector.replace(node | 
| 70 | 
            +
                          corrector.replace(node, replacement)
         | 
| 96 71 | 
             
                        end
         | 
| 97 72 | 
             
                      end
         | 
| 98 73 | 
             
                    end
         | 
| @@ -27,7 +27,7 @@ module RuboCop | |
| 27 27 | 
             
                      name = variable_name[1..-1]
         | 
| 28 28 | 
             
                      return unless name.eql?('stdout') || name.eql?('stderr')
         | 
| 29 29 |  | 
| 30 | 
            -
                      add_offense(node | 
| 30 | 
            +
                      add_offense(node.loc.name, message: format(MSG, name: name))
         | 
| 31 31 | 
             
                    end
         | 
| 32 32 |  | 
| 33 33 | 
             
                    private
         | 
| @@ -25,6 +25,8 @@ module RuboCop | |
| 25 25 | 
             
                    #   # good
         | 
| 26 26 | 
             
                    #   count { 1 }
         | 
| 27 27 | 
             
                    class AttributeDefinedStatically < Cop
         | 
| 28 | 
            +
                      extend AutoCorrector
         | 
| 29 | 
            +
             | 
| 28 30 | 
             
                      MSG = 'Use a block to declare attribute values.'
         | 
| 29 31 |  | 
| 30 32 | 
             
                      def_node_matcher :value_matcher, <<-PATTERN
         | 
| @@ -43,20 +45,22 @@ module RuboCop | |
| 43 45 | 
             
                          next unless offensive_receiver?(attribute.receiver, node)
         | 
| 44 46 | 
             
                          next if proc?(attribute) || association?(attribute.first_argument)
         | 
| 45 47 |  | 
| 46 | 
            -
                          add_offense(attribute)
         | 
| 48 | 
            +
                          add_offense(attribute) do |corrector|
         | 
| 49 | 
            +
                            autocorrect(corrector, attribute)
         | 
| 50 | 
            +
                          end
         | 
| 47 51 | 
             
                        end
         | 
| 48 52 | 
             
                      end
         | 
| 49 53 |  | 
| 50 | 
            -
                       | 
| 54 | 
            +
                      private
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                      def autocorrect(corrector, node)
         | 
| 51 57 | 
             
                        if node.parenthesized?
         | 
| 52 | 
            -
                          autocorrect_replacing_parens(node)
         | 
| 58 | 
            +
                          autocorrect_replacing_parens(corrector, node)
         | 
| 53 59 | 
             
                        else
         | 
| 54 | 
            -
                          autocorrect_without_parens(node)
         | 
| 60 | 
            +
                          autocorrect_without_parens(corrector, node)
         | 
| 55 61 | 
             
                        end
         | 
| 56 62 | 
             
                      end
         | 
| 57 63 |  | 
| 58 | 
            -
                      private
         | 
| 59 | 
            -
             | 
| 60 64 | 
             
                      def offensive_receiver?(receiver, node)
         | 
| 61 65 | 
             
                        receiver.nil? ||
         | 
| 62 66 | 
             
                          receiver.self_type? ||
         | 
| @@ -77,24 +81,20 @@ module RuboCop | |
| 77 81 |  | 
| 78 82 | 
             
                      def_node_matcher :association?, '(hash <(pair (sym :factory) _) ...>)'
         | 
| 79 83 |  | 
| 80 | 
            -
                      def autocorrect_replacing_parens(node)
         | 
| 84 | 
            +
                      def autocorrect_replacing_parens(corrector, node)
         | 
| 81 85 | 
             
                        left_braces, right_braces = braces(node)
         | 
| 82 86 |  | 
| 83 | 
            -
                         | 
| 84 | 
            -
             | 
| 85 | 
            -
                          corrector.replace(node.location.end, right_braces)
         | 
| 86 | 
            -
                        end
         | 
| 87 | 
            +
                        corrector.replace(node.location.begin, ' ' + left_braces)
         | 
| 88 | 
            +
                        corrector.replace(node.location.end, right_braces)
         | 
| 87 89 | 
             
                      end
         | 
| 88 90 |  | 
| 89 | 
            -
                      def autocorrect_without_parens(node)
         | 
| 91 | 
            +
                      def autocorrect_without_parens(corrector, node)
         | 
| 90 92 | 
             
                        left_braces, right_braces = braces(node)
         | 
| 91 93 |  | 
| 92 | 
            -
                         | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
                          corrector.insert_after(expression, right_braces)
         | 
| 97 | 
            -
                        end
         | 
| 94 | 
            +
                        argument = node.first_argument
         | 
| 95 | 
            +
                        expression = argument.location.expression
         | 
| 96 | 
            +
                        corrector.insert_before(expression, left_braces)
         | 
| 97 | 
            +
                        corrector.insert_after(expression, right_braces)
         | 
| 98 98 | 
             
                      end
         | 
| 99 99 |  | 
| 100 100 | 
             
                      def braces(node)
         | 
| @@ -25,6 +25,7 @@ module RuboCop | |
| 25 25 | 
             
                    #   # good
         | 
| 26 26 | 
             
                    #   3.times { create :user }
         | 
| 27 27 | 
             
                    class CreateList < Cop
         | 
| 28 | 
            +
                      extend AutoCorrector
         | 
| 28 29 | 
             
                      include ConfigurableEnforcedStyle
         | 
| 29 30 |  | 
| 30 31 | 
             
                      MSG_CREATE_LIST = 'Prefer create_list.'
         | 
| @@ -51,26 +52,19 @@ module RuboCop | |
| 51 52 | 
             
                        return unless n_times_block_without_arg?(node)
         | 
| 52 53 | 
             
                        return unless contains_only_factory?(node.body)
         | 
| 53 54 |  | 
| 54 | 
            -
                        add_offense(node.send_node, message: MSG_CREATE_LIST)
         | 
| 55 | 
            +
                        add_offense(node.send_node, message: MSG_CREATE_LIST) do |corrector|
         | 
| 56 | 
            +
                          CreateListCorrector.new(node.send_node).call(corrector)
         | 
| 57 | 
            +
                        end
         | 
| 55 58 | 
             
                      end
         | 
| 56 59 |  | 
| 57 60 | 
             
                      def on_send(node)
         | 
| 58 61 | 
             
                        return unless style == :n_times
         | 
| 59 62 |  | 
| 60 63 | 
             
                        factory_list_call(node) do |_receiver, _factory, count, _|
         | 
| 61 | 
            -
                           | 
| 62 | 
            -
             | 
| 63 | 
            -
                             | 
| 64 | 
            -
             | 
| 65 | 
            -
                          )
         | 
| 66 | 
            -
                        end
         | 
| 67 | 
            -
                      end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                      def autocorrect(node)
         | 
| 70 | 
            -
                        if style == :create_list
         | 
| 71 | 
            -
                          CreateListCorrector.new(node)
         | 
| 72 | 
            -
                        else
         | 
| 73 | 
            -
                          TimesCorrector.new(node)
         | 
| 64 | 
            +
                          message = format(MSG_N_TIMES, number: count)
         | 
| 65 | 
            +
                          add_offense(node.loc.selector, message: message) do |corrector|
         | 
| 66 | 
            +
                            TimesCorrector.new(node).call(corrector)
         | 
| 67 | 
            +
                          end
         | 
| 74 68 | 
             
                        end
         | 
| 75 69 | 
             
                      end
         | 
| 76 70 |  | 
| @@ -115,7 +109,7 @@ module RuboCop | |
| 115 109 |  | 
| 116 110 | 
             
                        def call(corrector)
         | 
| 117 111 | 
             
                          replacement = generate_n_times_block(node)
         | 
| 118 | 
            -
                          corrector.replace(node | 
| 112 | 
            +
                          corrector.replace(node, replacement)
         | 
| 119 113 | 
             
                        end
         | 
| 120 114 |  | 
| 121 115 | 
             
                        private
         | 
| @@ -148,7 +142,7 @@ module RuboCop | |
| 148 142 | 
             
                                          call_replacement(node)
         | 
| 149 143 | 
             
                                        end
         | 
| 150 144 |  | 
| 151 | 
            -
                          corrector.replace(node | 
| 145 | 
            +
                          corrector.replace(node, replacement)
         | 
| 152 146 | 
             
                        end
         | 
| 153 147 |  | 
| 154 148 | 
             
                        private
         | 
| @@ -20,6 +20,8 @@ module RuboCop | |
| 20 20 | 
             
                    #   factory :foo, class: 'Foo' do
         | 
| 21 21 | 
             
                    #   end
         | 
| 22 22 | 
             
                    class FactoryClassName < Cop
         | 
| 23 | 
            +
                      extend AutoCorrector
         | 
| 24 | 
            +
             | 
| 23 25 | 
             
                      MSG = "Pass '%<class_name>s' string instead of `%<class_name>s` " \
         | 
| 24 26 | 
             
                            'constant.'
         | 
| 25 27 | 
             
                      ALLOWED_CONSTANTS = %w[Hash OpenStruct].freeze
         | 
| @@ -32,13 +34,10 @@ module RuboCop | |
| 32 34 | 
             
                        class_name(node) do |cn|
         | 
| 33 35 | 
             
                          next if allowed?(cn.const_name)
         | 
| 34 36 |  | 
| 35 | 
            -
                           | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
                      def autocorrect(node)
         | 
| 40 | 
            -
                        lambda do |corrector|
         | 
| 41 | 
            -
                          corrector.replace(node.loc.expression, "'#{node.source}'")
         | 
| 37 | 
            +
                          msg = format(MSG, class_name: cn.const_name)
         | 
| 38 | 
            +
                          add_offense(cn, message: msg) do |corrector|
         | 
| 39 | 
            +
                            corrector.replace(cn, "'#{cn.source}'")
         | 
| 40 | 
            +
                          end
         | 
| 42 41 | 
             
                        end
         | 
| 43 42 | 
             
                      end
         | 
| 44 43 |  | 
| @@ -58,6 +58,7 @@ module RuboCop | |
| 58 58 | 
             
                  #     # ...
         | 
| 59 59 | 
             
                  #   end
         | 
| 60 60 | 
             
                  class HookArgument < Cop
         | 
| 61 | 
            +
                    extend AutoCorrector
         | 
| 61 62 | 
             
                    include ConfigurableEnforcedStyle
         | 
| 62 63 |  | 
| 63 64 | 
             
                    IMPLICIT_MSG = 'Omit the default `%<scope>p` ' \
         | 
| @@ -78,18 +79,11 @@ module RuboCop | |
| 78 79 | 
             
                        return check_implicit(method_send) unless scope_name
         | 
| 79 80 |  | 
| 80 81 | 
             
                        style_detected(scope_name)
         | 
| 81 | 
            -
                         | 
| 82 | 
            -
             | 
| 83 | 
            -
                           | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
                    end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                    def autocorrect(node)
         | 
| 89 | 
            -
                      scope = implicit_style? ? '' : "(#{style.inspect})"
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                      lambda do |corrector|
         | 
| 92 | 
            -
                        corrector.replace(argument_range(node), scope)
         | 
| 82 | 
            +
                        msg = explicit_message(scope_name)
         | 
| 83 | 
            +
                        add_offense(method_send, message: msg) do |corrector|
         | 
| 84 | 
            +
                          scope = implicit_style? ? '' : "(#{style.inspect})"
         | 
| 85 | 
            +
                          corrector.replace(argument_range(method_send), scope)
         | 
| 86 | 
            +
                        end
         | 
| 93 87 | 
             
                      end
         | 
| 94 88 | 
             
                    end
         | 
| 95 89 |  | 
| @@ -99,11 +93,11 @@ module RuboCop | |
| 99 93 | 
             
                      style_detected(:implicit)
         | 
| 100 94 | 
             
                      return if implicit_style?
         | 
| 101 95 |  | 
| 102 | 
            -
                       | 
| 103 | 
            -
             | 
| 104 | 
            -
                         | 
| 105 | 
            -
                         | 
| 106 | 
            -
                       | 
| 96 | 
            +
                      msg = explicit_message(nil)
         | 
| 97 | 
            +
                      add_offense(method_send.loc.selector, message: msg) do |corrector|
         | 
| 98 | 
            +
                        scope = "(#{style.inspect})"
         | 
| 99 | 
            +
                        corrector.replace(argument_range(method_send), scope)
         | 
| 100 | 
            +
                      end
         | 
| 107 101 | 
             
                    end
         | 
| 108 102 |  | 
| 109 103 | 
             
                    def explicit_message(scope)
         | 
| @@ -24,6 +24,8 @@ module RuboCop | |
| 24 24 | 
             
                  #   end
         | 
| 25 25 | 
             
                  #
         | 
| 26 26 | 
             
                  class HooksBeforeExamples < Cop
         | 
| 27 | 
            +
                    extend AutoCorrector
         | 
| 28 | 
            +
             | 
| 27 29 | 
             
                    MSG = 'Move `%<hook>s` above the examples in the group.'
         | 
| 28 30 |  | 
| 29 31 | 
             
                    def_node_matcher :example_or_group?, <<-PATTERN
         | 
| @@ -39,15 +41,6 @@ module RuboCop | |
| 39 41 | 
             
                      check_hooks(node.body) if multiline_block?(node.body)
         | 
| 40 42 | 
             
                    end
         | 
| 41 43 |  | 
| 42 | 
            -
                    def autocorrect(node)
         | 
| 43 | 
            -
                      lambda do |corrector|
         | 
| 44 | 
            -
                        first_example = find_first_example(node.parent)
         | 
| 45 | 
            -
                        RuboCop::RSpec::Corrector::MoveNode.new(
         | 
| 46 | 
            -
                          node, corrector, processed_source
         | 
| 47 | 
            -
                        ).move_before(first_example)
         | 
| 48 | 
            -
                      end
         | 
| 49 | 
            -
                    end
         | 
| 50 | 
            -
             | 
| 51 44 | 
             
                    private
         | 
| 52 45 |  | 
| 53 46 | 
             
                    def multiline_block?(block)
         | 
| @@ -62,16 +55,22 @@ module RuboCop | |
| 62 55 | 
             
                        next if child.sibling_index < first_example.sibling_index
         | 
| 63 56 | 
             
                        next unless hook?(child)
         | 
| 64 57 |  | 
| 65 | 
            -
                         | 
| 66 | 
            -
             | 
| 67 | 
            -
                           | 
| 68 | 
            -
                         | 
| 58 | 
            +
                        msg = format(MSG, hook: child.method_name)
         | 
| 59 | 
            +
                        add_offense(child, message: msg) do |corrector|
         | 
| 60 | 
            +
                          autocorrect(corrector, child, first_example)
         | 
| 61 | 
            +
                        end
         | 
| 69 62 | 
             
                      end
         | 
| 70 63 | 
             
                    end
         | 
| 71 64 |  | 
| 72 65 | 
             
                    def find_first_example(node)
         | 
| 73 66 | 
             
                      node.children.find { |sibling| example_or_group?(sibling) }
         | 
| 74 67 | 
             
                    end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    def autocorrect(corrector, node, first_example)
         | 
| 70 | 
            +
                      RuboCop::RSpec::Corrector::MoveNode.new(
         | 
| 71 | 
            +
                        node, corrector, processed_source
         | 
| 72 | 
            +
                      ).move_before(first_example)
         | 
| 73 | 
            +
                    end
         | 
| 75 74 | 
             
                  end
         | 
| 76 75 | 
             
                end
         | 
| 77 76 | 
             
              end
         |