rubocop 0.74.0 → 0.78.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/README.md +3 -2
 - data/config/default.yml +366 -318
 - data/lib/rubocop.rb +48 -32
 - data/lib/rubocop/ast/builder.rb +1 -0
 - data/lib/rubocop/ast/node.rb +5 -1
 - data/lib/rubocop/ast/node/block_node.rb +2 -0
 - data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
 - data/lib/rubocop/ast/node/return_node.rb +24 -0
 - data/lib/rubocop/cli.rb +11 -227
 - data/lib/rubocop/cli/command.rb +21 -0
 - data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
 - data/lib/rubocop/cli/command/base.rb +33 -0
 - data/lib/rubocop/cli/command/execute_runner.rb +76 -0
 - data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
 - data/lib/rubocop/cli/command/show_cops.rb +73 -0
 - data/lib/rubocop/cli/command/version.rb +17 -0
 - data/lib/rubocop/cli/environment.rb +21 -0
 - data/lib/rubocop/comment_config.rb +5 -4
 - data/lib/rubocop/config.rb +12 -1
 - data/lib/rubocop/config_loader.rb +21 -3
 - data/lib/rubocop/config_loader_resolver.rb +4 -3
 - data/lib/rubocop/config_obsoletion.rb +85 -11
 - data/lib/rubocop/config_validator.rb +28 -19
 - data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
 - data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
 - data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
 - data/lib/rubocop/cop/commissioner.rb +15 -7
 - data/lib/rubocop/cop/cop.rb +35 -9
 - data/lib/rubocop/cop/corrector.rb +8 -7
 - data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
 - data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
 - data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
 - data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
 - data/lib/rubocop/cop/generator.rb +3 -3
 - data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
 - data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
 - data/lib/rubocop/cop/internal_affairs.rb +1 -0
 - data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
 - data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
 - data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
 - data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
 - data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
 - data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
 - data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
 - data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
 - data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
 - data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
 - data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
 - data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
 - data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
 - data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
 - data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
 - data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
 - data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
 - data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
 - data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
 - data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
 - data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
 - data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
 - data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
 - data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
 - data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
 - data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
 - data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
 - data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
 - data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
 - data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
 - data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
 - data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
 - data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
 - data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
 - data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
 - data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
 - data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
 - data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
 - data/lib/rubocop/cop/lint/debugger.rb +1 -1
 - data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
 - data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
 - data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
 - data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
 - data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
 - data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
 - data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
 - data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
 - data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
 - data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
 - data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
 - data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
 - data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
 - data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
 - data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
 - data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
 - data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
 - data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
 - data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
 - data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
 - data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
 - data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
 - data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
 - data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
 - data/lib/rubocop/cop/lint/void.rb +7 -26
 - data/lib/rubocop/cop/message_annotator.rb +16 -7
 - data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
 - data/lib/rubocop/cop/metrics/method_length.rb +1 -1
 - data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
 - data/lib/rubocop/cop/migration/department_name.rb +44 -0
 - data/lib/rubocop/cop/mixin/alignment.rb +2 -2
 - data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
 - data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
 - data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
 - data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
 - data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
 - data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
 - data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
 - data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
 - data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
 - data/lib/rubocop/cop/naming/file_name.rb +12 -5
 - data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
 - data/lib/rubocop/cop/naming/method_name.rb +12 -1
 - data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
 - data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
 - data/lib/rubocop/cop/naming/variable_name.rb +1 -0
 - data/lib/rubocop/cop/offense.rb +29 -7
 - data/lib/rubocop/cop/registry.rb +22 -1
 - data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
 - data/lib/rubocop/cop/style/alias.rb +1 -1
 - data/lib/rubocop/cop/style/array_join.rb +1 -1
 - data/lib/rubocop/cop/style/attr.rb +10 -2
 - data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
 - data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
 - data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
 - data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
 - data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
 - data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
 - data/lib/rubocop/cop/style/copyright.rb +11 -7
 - data/lib/rubocop/cop/style/documentation_method.rb +44 -0
 - data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
 - data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
 - data/lib/rubocop/cop/style/empty_literal.rb +2 -2
 - data/lib/rubocop/cop/style/empty_method.rb +5 -5
 - data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
 - data/lib/rubocop/cop/style/even_odd.rb +1 -1
 - data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
 - data/lib/rubocop/cop/style/format_string.rb +10 -7
 - data/lib/rubocop/cop/style/format_string_token.rb +19 -68
 - data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
 - data/lib/rubocop/cop/style/guard_clause.rb +3 -2
 - data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
 - data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
 - data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
 - data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
 - data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
 - data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
 - data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
 - data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
 - data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
 - data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
 - data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
 - data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
 - data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
 - data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
 - data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
 - data/lib/rubocop/cop/style/next.rb +5 -5
 - data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
 - data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
 - data/lib/rubocop/cop/style/option_hash.rb +3 -3
 - data/lib/rubocop/cop/style/or_assignment.rb +6 -1
 - data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
 - data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
 - data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
 - data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
 - data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
 - data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
 - data/lib/rubocop/cop/style/redundant_return.rb +39 -29
 - data/lib/rubocop/cop/style/redundant_self.rb +18 -1
 - data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
 - data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
 - data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
 - data/lib/rubocop/cop/style/semicolon.rb +13 -2
 - data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
 - data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
 - data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
 - data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
 - data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
 - data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
 - data/lib/rubocop/cop/team.rb +5 -0
 - data/lib/rubocop/cop/util.rb +1 -1
 - data/lib/rubocop/cop/utils/format_string.rb +120 -0
 - data/lib/rubocop/cop/variable_force.rb +7 -5
 - data/lib/rubocop/cop/variable_force/variable.rb +15 -2
 - data/lib/rubocop/core_ext/string.rb +0 -24
 - data/lib/rubocop/formatter/base_formatter.rb +2 -2
 - data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
 - data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
 - data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
 - data/lib/rubocop/formatter/formatter_set.rb +16 -15
 - data/lib/rubocop/formatter/json_formatter.rb +6 -5
 - data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
 - data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
 - data/lib/rubocop/formatter/tap_formatter.rb +18 -7
 - data/lib/rubocop/magic_comment.rb +4 -0
 - data/lib/rubocop/node_pattern.rb +4 -2
 - data/lib/rubocop/options.rb +21 -26
 - data/lib/rubocop/processed_source.rb +1 -1
 - data/lib/rubocop/rake_task.rb +1 -0
 - data/lib/rubocop/result_cache.rb +24 -8
 - data/lib/rubocop/runner.rb +60 -33
 - data/lib/rubocop/target_finder.rb +12 -6
 - data/lib/rubocop/version.rb +1 -1
 - metadata +48 -33
 - data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
 - data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
 
| 
         @@ -6,21 +6,34 @@ module RuboCop 
     | 
|
| 
       6 
6 
     | 
    
         
             
                  # This cop checks for assignments in the conditions of
         
     | 
| 
       7 
7 
     | 
    
         
             
                  # if/while/until.
         
     | 
| 
       8 
8 
     | 
    
         
             
                  #
         
     | 
| 
       9 
     | 
    
         
            -
                  #  
     | 
| 
      
 9 
     | 
    
         
            +
                  # `AllowSafeAssignment` option for safe assignment.
         
     | 
| 
      
 10 
     | 
    
         
            +
                  # By safe assignment we mean putting parentheses around
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # an assignment to indicate "I know I'm using an assignment
         
     | 
| 
      
 12 
     | 
    
         
            +
                  # as a condition. It's not a mistake."
         
     | 
| 
       10 
13 
     | 
    
         
             
                  #
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # @example
         
     | 
| 
       11 
15 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       12 
     | 
    
         
            -
                  #
         
     | 
| 
       13 
16 
     | 
    
         
             
                  #   if some_var = true
         
     | 
| 
       14 
17 
     | 
    
         
             
                  #     do_something
         
     | 
| 
       15 
18 
     | 
    
         
             
                  #   end
         
     | 
| 
       16 
19 
     | 
    
         
             
                  #
         
     | 
| 
       17 
     | 
    
         
            -
                  #  
     | 
| 
      
 20 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #   if some_var == true
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #     do_something
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #   end
         
     | 
| 
       18 
24 
     | 
    
         
             
                  #
         
     | 
| 
      
 25 
     | 
    
         
            +
                  # @example AllowSafeAssignment: true (default)
         
     | 
| 
       19 
26 
     | 
    
         
             
                  #   # good
         
     | 
| 
      
 27 
     | 
    
         
            +
                  #   if (some_var = true)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  #     do_something
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #   end
         
     | 
| 
       20 
30 
     | 
    
         
             
                  #
         
     | 
| 
       21 
     | 
    
         
            -
                  # 
     | 
| 
      
 31 
     | 
    
         
            +
                  # @example AllowSafeAssignment: false
         
     | 
| 
      
 32 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 33 
     | 
    
         
            +
                  #   if (some_var = true)
         
     | 
| 
       22 
34 
     | 
    
         
             
                  #     do_something
         
     | 
| 
       23 
35 
     | 
    
         
             
                  #   end
         
     | 
| 
      
 36 
     | 
    
         
            +
                  #
         
     | 
| 
       24 
37 
     | 
    
         
             
                  class AssignmentInCondition < Cop
         
     | 
| 
       25 
38 
     | 
    
         
             
                    include SafeAssignment
         
     | 
| 
       26 
39 
     | 
    
         | 
| 
         @@ -43,7 +43,7 @@ module RuboCop 
     | 
|
| 
       43 
43 
     | 
    
         
             
                    PATTERN
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
45 
     | 
    
         
             
                    def_node_matcher :debugger_call?, <<~PATTERN
         
     | 
| 
       46 
     | 
    
         
            -
                      {(send {nil? #kernel?} {:debugger :byebug} ...)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      {(send {nil? #kernel?} {:debugger :byebug :remote_byebug} ...)
         
     | 
| 
       47 
47 
     | 
    
         
             
                       (send (send {#kernel? nil?} :binding)
         
     | 
| 
       48 
48 
     | 
    
         
             
                         {:pry :remote_pry :pry_remote} ...)
         
     | 
| 
       49 
49 
     | 
    
         
             
                       (send (const {nil? (cbase)} :Pry) :rescue ...)
         
     | 
| 
         @@ -22,7 +22,7 @@ module RuboCop 
     | 
|
| 
       22 
22 
     | 
    
         
             
                  #   num = 0
         
     | 
| 
       23 
23 
     | 
    
         
             
                  #   sum = numbers.each_with_object(num) { |e, a| a += e }
         
     | 
| 
       24 
24 
     | 
    
         
             
                  class EachWithObjectArgument < Cop
         
     | 
| 
       25 
     | 
    
         
            -
                    MSG = 'The argument to each_with_object  
     | 
| 
      
 25 
     | 
    
         
            +
                    MSG = 'The argument to each_with_object cannot be immutable.'
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                    def_node_matcher :each_with_object?, <<~PATTERN
         
     | 
| 
       28 
28 
     | 
    
         
             
                      ({send csend} _ :each_with_object $_)
         
     | 
| 
         @@ -86,13 +86,13 @@ module RuboCop 
     | 
|
| 
       86 
86 
     | 
    
         
             
                      erb_new_with_non_keyword_arguments(node) do |arguments|
         
     | 
| 
       87 
87 
     | 
    
         
             
                        return if correct_arguments?(arguments)
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
                        1. 
     | 
| 
       90 
     | 
    
         
            -
                          next if ! 
     | 
| 
      
 89 
     | 
    
         
            +
                        arguments[1..3].each_with_index do |argument, i|
         
     | 
| 
      
 90 
     | 
    
         
            +
                          next if !argument || argument.hash_type?
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
       92 
     | 
    
         
            -
                          message = format(MESSAGES[i 
     | 
| 
      
 92 
     | 
    
         
            +
                          message = format(MESSAGES[i], arg_value: argument.source)
         
     | 
| 
       93 
93 
     | 
    
         | 
| 
       94 
94 
     | 
    
         
             
                          add_offense(
         
     | 
| 
       95 
     | 
    
         
            -
                            node, location:  
     | 
| 
      
 95 
     | 
    
         
            +
                            node, location: argument.source_range, message: message
         
     | 
| 
       96 
96 
     | 
    
         
             
                          )
         
     | 
| 
       97 
97 
     | 
    
         
             
                        end
         
     | 
| 
       98 
98 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -138,14 +138,15 @@ module RuboCop 
     | 
|
| 
       138 
138 
     | 
    
         
             
                    end
         
     | 
| 
       139 
139 
     | 
    
         | 
| 
       140 
140 
     | 
    
         
             
                    def override_by_legacy_args(kwargs, node)
         
     | 
| 
      
 141 
     | 
    
         
            +
                      arguments = node.arguments
         
     | 
| 
       141 
142 
     | 
    
         
             
                      overridden_kwargs = kwargs.dup
         
     | 
| 
       142 
143 
     | 
    
         | 
| 
       143 
     | 
    
         
            -
                      if  
     | 
| 
       144 
     | 
    
         
            -
                        overridden_kwargs[0] = "trim_mode: #{ 
     | 
| 
      
 144 
     | 
    
         
            +
                      if arguments[2]
         
     | 
| 
      
 145 
     | 
    
         
            +
                        overridden_kwargs[0] = "trim_mode: #{arguments[2].source}"
         
     | 
| 
       145 
146 
     | 
    
         
             
                      end
         
     | 
| 
       146 
147 
     | 
    
         | 
| 
       147 
     | 
    
         
            -
                      if  
     | 
| 
       148 
     | 
    
         
            -
                        overridden_kwargs[1] = "eoutvar: #{ 
     | 
| 
      
 148 
     | 
    
         
            +
                      if arguments[3] && !arguments[3].hash_type?
         
     | 
| 
      
 149 
     | 
    
         
            +
                        overridden_kwargs[1] = "eoutvar: #{arguments[3].source}"
         
     | 
| 
       149 
150 
     | 
    
         
             
                      end
         
     | 
| 
       150 
151 
     | 
    
         | 
| 
       151 
152 
     | 
    
         
             
                      overridden_kwargs
         
     | 
| 
         @@ -22,16 +22,10 @@ module RuboCop 
     | 
|
| 
       22 
22 
     | 
    
         
             
                    # http://rubular.com/r/CvpbxkcTzy
         
     | 
| 
       23 
23 
     | 
    
         
             
                    MSG = "Number of arguments (%<arg_num>i) to `%<method>s` doesn't " \
         
     | 
| 
       24 
24 
     | 
    
         
             
                          'match the number of fields (%<field_num>i).'
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                      /(%(([\s#+-0\*]*)(\d*)?(\.\d+)?[bBdiouxXeEfgGaAcps]|%))/.freeze
         
     | 
| 
       27 
     | 
    
         
            -
                    NAMED_FIELD_REGEX = /%\{[_a-zA-Z][_a-zA-Z]+\}/.freeze
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       28 
26 
     | 
    
         
             
                    KERNEL = 'Kernel'
         
     | 
| 
       29 
27 
     | 
    
         
             
                    SHOVEL = '<<'
         
     | 
| 
       30 
     | 
    
         
            -
                    PERCENT = '%'
         
     | 
| 
       31 
     | 
    
         
            -
                    PERCENT_PERCENT = '%%'
         
     | 
| 
       32 
     | 
    
         
            -
                    DIGIT_DOLLAR_FLAG = /%(\d+)\$/.freeze
         
     | 
| 
       33 
28 
     | 
    
         
             
                    STRING_TYPES = %i[str dstr].freeze
         
     | 
| 
       34 
     | 
    
         
            -
                    NAMED_INTERPOLATION = /%(?:<\w+>|\{\w+\})/.freeze
         
     | 
| 
       35 
29 
     | 
    
         | 
| 
       36 
30 
     | 
    
         
             
                    def on_send(node)
         
     | 
| 
       37 
31 
     | 
    
         
             
                      return unless offending_node?(node)
         
     | 
| 
         @@ -44,7 +38,7 @@ module RuboCop 
     | 
|
| 
       44 
38 
     | 
    
         
             
                    def offending_node?(node)
         
     | 
| 
       45 
39 
     | 
    
         
             
                      return false unless called_on_string?(node)
         
     | 
| 
       46 
40 
     | 
    
         
             
                      return false unless method_with_format_args?(node)
         
     | 
| 
       47 
     | 
    
         
            -
                      return false if  
     | 
| 
      
 41 
     | 
    
         
            +
                      return false if splat_args?(node)
         
     | 
| 
       48 
42 
     | 
    
         | 
| 
       49 
43 
     | 
    
         
             
                      num_of_format_args, num_of_expected_fields = count_matches(node)
         
     | 
| 
       50 
44 
     | 
    
         | 
| 
         @@ -70,16 +64,6 @@ module RuboCop 
     | 
|
| 
       70 
64 
     | 
    
         
             
                      sprintf?(node) || format?(node) || percent?(node)
         
     | 
| 
       71 
65 
     | 
    
         
             
                    end
         
     | 
| 
       72 
66 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
                    def named_mode?(node)
         
     | 
| 
       74 
     | 
    
         
            -
                      relevant_node = if sprintf?(node) || format?(node)
         
     | 
| 
       75 
     | 
    
         
            -
                                        node.first_argument
         
     | 
| 
       76 
     | 
    
         
            -
                                      elsif percent?(node)
         
     | 
| 
       77 
     | 
    
         
            -
                                        node.receiver
         
     | 
| 
       78 
     | 
    
         
            -
                                      end
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                      !relevant_node.source.scan(NAMED_FIELD_REGEX).empty?
         
     | 
| 
       81 
     | 
    
         
            -
                    end
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
67 
     | 
    
         
             
                    def splat_args?(node)
         
     | 
| 
       84 
68 
     | 
    
         
             
                      return false if percent?(node)
         
     | 
| 
       85 
69 
     | 
    
         | 
| 
         @@ -127,27 +111,17 @@ module RuboCop 
     | 
|
| 
       127 
111 
     | 
    
         | 
| 
       128 
112 
     | 
    
         
             
                    def expected_fields_count(node)
         
     | 
| 
       129 
113 
     | 
    
         
             
                      return :unknown unless node.str_type?
         
     | 
| 
       130 
     | 
    
         
            -
                      return 1 if node.source =~ NAMED_INTERPOLATION
         
     | 
| 
       131 
114 
     | 
    
         | 
| 
       132 
     | 
    
         
            -
                       
     | 
| 
       133 
     | 
    
         
            -
                      return  
     | 
| 
      
 115 
     | 
    
         
            +
                      format_string = RuboCop::Cop::Utils::FormatString.new(node.source)
         
     | 
| 
      
 116 
     | 
    
         
            +
                      return 1 if format_string.named_interpolation?
         
     | 
| 
       134 
117 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                       
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
                        .scan(FIELD_REGEX)
         
     | 
| 
       138 
     | 
    
         
            -
                        .reject { |x| x.first == PERCENT_PERCENT }
         
     | 
| 
       139 
     | 
    
         
            -
                        .reduce(0) { |acc, elem| acc + arguments_count(elem[2]) }
         
     | 
| 
       140 
     | 
    
         
            -
                    end
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
                    def max_digit_dollar_num(node)
         
     | 
| 
       143 
     | 
    
         
            -
                      node.source.scan(DIGIT_DOLLAR_FLAG).map do |digit_dollar_num|
         
     | 
| 
       144 
     | 
    
         
            -
                        digit_dollar_num.first.to_i
         
     | 
| 
       145 
     | 
    
         
            -
                      end.max
         
     | 
| 
       146 
     | 
    
         
            -
                    end
         
     | 
| 
      
 118 
     | 
    
         
            +
                      max_digit_dollar_num = format_string.max_digit_dollar_num
         
     | 
| 
      
 119 
     | 
    
         
            +
                      return max_digit_dollar_num if max_digit_dollar_num&.nonzero?
         
     | 
| 
       147 
120 
     | 
    
         | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
       149 
     | 
    
         
            -
             
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
      
 121 
     | 
    
         
            +
                      format_string
         
     | 
| 
      
 122 
     | 
    
         
            +
                        .format_sequences
         
     | 
| 
      
 123 
     | 
    
         
            +
                        .reject(&:percent?)
         
     | 
| 
      
 124 
     | 
    
         
            +
                        .reduce(0) { |acc, seq| acc + seq.arity }
         
     | 
| 
       151 
125 
     | 
    
         
             
                    end
         
     | 
| 
       152 
126 
     | 
    
         | 
| 
       153 
127 
     | 
    
         
             
                    def format?(node)
         
     | 
| 
         @@ -117,7 +117,7 @@ module RuboCop 
     | 
|
| 
       117 
117 
     | 
    
         
             
                    end
         
     | 
| 
       118 
118 
     | 
    
         | 
| 
       119 
119 
     | 
    
         
             
                    def correct_visibility?(node, modifier, ignored_methods)
         
     | 
| 
       120 
     | 
    
         
            -
                      return true if modifier.nil? || modifier. 
     | 
| 
      
 120 
     | 
    
         
            +
                      return true if modifier.nil? || modifier.method?(:public)
         
     | 
| 
       121 
121 
     | 
    
         | 
| 
       122 
122 
     | 
    
         
             
                      ignored_methods.include?(node.method_name)
         
     | 
| 
       123 
123 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            # rubocop:disable Lint/ 
     | 
| 
      
 3 
     | 
    
         
            +
            # rubocop:disable Lint/RedundantCopDisableDirective
         
     | 
| 
       4 
4 
     | 
    
         
             
            module RuboCop
         
     | 
| 
       5 
5 
     | 
    
         
             
              module Cop
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Lint
         
     | 
| 
         @@ -81,4 +81,4 @@ module RuboCop 
     | 
|
| 
       81 
81 
     | 
    
         
             
                end
         
     | 
| 
       82 
82 
     | 
    
         
             
              end
         
     | 
| 
       83 
83 
     | 
    
         
             
            end
         
     | 
| 
       84 
     | 
    
         
            -
            # rubocop:enable Lint/ 
     | 
| 
      
 84 
     | 
    
         
            +
            # rubocop:enable Lint/RedundantCopDisableDirective, Layout/SpaceAroundOperators
         
     | 
| 
         @@ -0,0 +1,89 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module RuboCop
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Cop
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Lint
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # `Dir[...]` and `Dir.glob(...)` do not make any guarantees about
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # the order in which files are returned. The final order is
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # determined by the operating system and file system.
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # This means that using them in cases where the order matters,
         
     | 
| 
      
 10 
     | 
    
         
            +
                  # such as requiring files, can lead to intermittent failures
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # that are hard to debug. To ensure this doesn't happen,
         
     | 
| 
      
 12 
     | 
    
         
            +
                  # always sort the list.
         
     | 
| 
      
 13 
     | 
    
         
            +
                  #
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # @example
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #   Dir["./lib/**/*.rb"].each do |file|
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #     require file
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 22 
     | 
    
         
            +
                  #   Dir["./lib/**/*.rb"].sort.each do |file|
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #     require file
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  #
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # @example
         
     | 
| 
      
 27 
     | 
    
         
            +
                  #
         
     | 
| 
      
 28 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #   Dir.glob(Rails.root.join(__dir__, 'test', '*.rb')) do |file|
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #     require file
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 32 
     | 
    
         
            +
                  #
         
     | 
| 
      
 33 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 34 
     | 
    
         
            +
                  #   Dir.glob(Rails.root.join(__dir__, 'test', '*.rb')).sort.each do |file|
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #     require file
         
     | 
| 
      
 36 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #
         
     | 
| 
      
 38 
     | 
    
         
            +
                  class NonDeterministicRequireOrder < Cop
         
     | 
| 
      
 39 
     | 
    
         
            +
                    MSG = 'Sort files before requiring them.'
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                    def on_block(node)
         
     | 
| 
      
 42 
     | 
    
         
            +
                      return unless node.body
         
     | 
| 
      
 43 
     | 
    
         
            +
                      return unless unsorted_dir_loop?(node.send_node)
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                      loop_variable(node.arguments) do |var_name|
         
     | 
| 
      
 46 
     | 
    
         
            +
                        return unless var_is_required?(node.body, var_name)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                        add_offense(node.send_node)
         
     | 
| 
      
 49 
     | 
    
         
            +
                      end
         
     | 
| 
      
 50 
     | 
    
         
            +
                    end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                    def autocorrect(node)
         
     | 
| 
      
 53 
     | 
    
         
            +
                      if unsorted_dir_block?(node)
         
     | 
| 
      
 54 
     | 
    
         
            +
                        lambda do |corrector|
         
     | 
| 
      
 55 
     | 
    
         
            +
                          corrector.replace(node.loc.expression, "#{node.source}.sort.each")
         
     | 
| 
      
 56 
     | 
    
         
            +
                        end
         
     | 
| 
      
 57 
     | 
    
         
            +
                      else
         
     | 
| 
      
 58 
     | 
    
         
            +
                        lambda do |corrector|
         
     | 
| 
      
 59 
     | 
    
         
            +
                          source = node.receiver.source
         
     | 
| 
      
 60 
     | 
    
         
            +
                          corrector.replace(node.loc.expression, "#{source}.sort.each")
         
     | 
| 
      
 61 
     | 
    
         
            +
                        end
         
     | 
| 
      
 62 
     | 
    
         
            +
                      end
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                    private
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                    def unsorted_dir_loop?(node)
         
     | 
| 
      
 68 
     | 
    
         
            +
                      unsorted_dir_block?(node) || unsorted_dir_each?(node)
         
     | 
| 
      
 69 
     | 
    
         
            +
                    end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                    def_node_matcher :unsorted_dir_block?, <<~PATTERN
         
     | 
| 
      
 72 
     | 
    
         
            +
                      (send (const nil? :Dir) :glob ...)
         
     | 
| 
      
 73 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                    def_node_matcher :unsorted_dir_each?, <<~PATTERN
         
     | 
| 
      
 76 
     | 
    
         
            +
                      (send (send (const nil? :Dir) {:[] :glob} ...) :each)
         
     | 
| 
      
 77 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                    def_node_matcher :loop_variable, <<~PATTERN
         
     | 
| 
      
 80 
     | 
    
         
            +
                      (args (arg $_))
         
     | 
| 
      
 81 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                    def_node_search :var_is_required?, <<~PATTERN
         
     | 
| 
      
 84 
     | 
    
         
            +
                      (send nil? :require (lvar %1))
         
     | 
| 
      
 85 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb}
    RENAMED
    
    | 
         @@ -1,8 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            # The Lint/ 
     | 
| 
       4 
     | 
    
         
            -
            # to be able to provide a (bad) example of  
     | 
| 
       5 
     | 
    
         
            -
            # rubocop:disable Lint/ 
     | 
| 
      
 3 
     | 
    
         
            +
            # The Lint/RedundantCopDisableDirective cop needs to be disabled so as
         
     | 
| 
      
 4 
     | 
    
         
            +
            # to be able to provide a (bad) example of a redundant disable.
         
     | 
| 
      
 5 
     | 
    
         
            +
            # rubocop:disable Lint/RedundantCopDisableDirective
         
     | 
| 
       6 
6 
     | 
    
         
             
            module RuboCop
         
     | 
| 
       7 
7 
     | 
    
         
             
              module Cop
         
     | 
| 
       8 
8 
     | 
    
         
             
                module Lint
         
     | 
| 
         @@ -19,27 +19,27 @@ module RuboCop 
     | 
|
| 
       19 
19 
     | 
    
         
             
                  #
         
     | 
| 
       20 
20 
     | 
    
         
             
                  # @example
         
     | 
| 
       21 
21 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       22 
     | 
    
         
            -
                  #   # rubocop:disable  
     | 
| 
      
 22 
     | 
    
         
            +
                  #   # rubocop:disable Layout/LineLength
         
     | 
| 
       23 
23 
     | 
    
         
             
                  #   x += 1
         
     | 
| 
       24 
     | 
    
         
            -
                  #   # rubocop:enable  
     | 
| 
      
 24 
     | 
    
         
            +
                  #   # rubocop:enable Layout/LineLength
         
     | 
| 
       25 
25 
     | 
    
         
             
                  #
         
     | 
| 
       26 
26 
     | 
    
         
             
                  #   # good
         
     | 
| 
       27 
27 
     | 
    
         
             
                  #   x += 1
         
     | 
| 
       28 
     | 
    
         
            -
                  class  
     | 
| 
      
 28 
     | 
    
         
            +
                  class RedundantCopDisableDirective < Cop
         
     | 
| 
       29 
29 
     | 
    
         
             
                    include NameSimilarity
         
     | 
| 
       30 
30 
     | 
    
         
             
                    include RangeHelp
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                    COP_NAME = 'Lint/ 
     | 
| 
      
 32 
     | 
    
         
            +
                    COP_NAME = 'Lint/RedundantCopDisableDirective'
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                    def check(offenses, cop_disabled_line_ranges, comments)
         
     | 
| 
       35 
     | 
    
         
            -
                       
     | 
| 
      
 35 
     | 
    
         
            +
                      redundant_cops = Hash.new { |h, k| h[k] = Set.new }
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                       
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                         
     | 
| 
      
 37 
     | 
    
         
            +
                      each_redundant_disable(cop_disabled_line_ranges,
         
     | 
| 
      
 38 
     | 
    
         
            +
                                             offenses, comments) do |comment, redundant_cop|
         
     | 
| 
      
 39 
     | 
    
         
            +
                        redundant_cops[comment].add(redundant_cop)
         
     | 
| 
       40 
40 
     | 
    
         
             
                      end
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                      add_offenses( 
     | 
| 
      
 42 
     | 
    
         
            +
                      add_offenses(redundant_cops)
         
     | 
| 
       43 
43 
     | 
    
         
             
                    end
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
45 
     | 
    
         
             
                    def autocorrect(args)
         
     | 
| 
         @@ -89,8 +89,8 @@ module RuboCop 
     | 
|
| 
       89 
89 
     | 
    
         
             
                                                   newlines: false)
         
     | 
| 
       90 
90 
     | 
    
         
             
                    end
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
       92 
     | 
    
         
            -
                    def  
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
      
 92 
     | 
    
         
            +
                    def each_redundant_disable(cop_disabled_line_ranges, offenses, comments,
         
     | 
| 
      
 93 
     | 
    
         
            +
                                               &block)
         
     | 
| 
       94 
94 
     | 
    
         
             
                      disabled_ranges = cop_disabled_line_ranges[COP_NAME] || [0..0]
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
       96 
96 
     | 
    
         
             
                      cop_disabled_line_ranges.each do |cop, line_ranges|
         
     | 
| 
         @@ -110,9 +110,9 @@ module RuboCop 
     | 
|
| 
       110 
110 
     | 
    
         
             
                        comment = comments.find { |c| c.loc.line == line_range.begin }
         
     | 
| 
       111 
111 
     | 
    
         
             
                        next if ignore_offense?(disabled_ranges, line_range)
         
     | 
| 
       112 
112 
     | 
    
         | 
| 
       113 
     | 
    
         
            -
                         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                        yield comment,  
     | 
| 
      
 113 
     | 
    
         
            +
                        redundant_cop = find_redundant(comment, offenses, cop, line_range,
         
     | 
| 
      
 114 
     | 
    
         
            +
                                                       line_ranges[ix + 1])
         
     | 
| 
      
 115 
     | 
    
         
            +
                        yield comment, redundant_cop if redundant_cop
         
     | 
| 
       116 
116 
     | 
    
         
             
                      end
         
     | 
| 
       117 
117 
     | 
    
         
             
                    end
         
     | 
| 
       118 
118 
     | 
    
         | 
| 
         @@ -123,24 +123,24 @@ module RuboCop 
     | 
|
| 
       123 
123 
     | 
    
         | 
| 
       124 
124 
     | 
    
         
             
                        # If a cop is disabled in a range that begins on the same line as
         
     | 
| 
       125 
125 
     | 
    
         
             
                        # the end of the previous range, it means that the cop was
         
     | 
| 
       126 
     | 
    
         
            -
                        # already disabled by an earlier comment. So it's  
     | 
| 
      
 126 
     | 
    
         
            +
                        # already disabled by an earlier comment. So it's redundant
         
     | 
| 
       127 
127 
     | 
    
         
             
                        # whether there are offenses or not.
         
     | 
| 
       128 
     | 
    
         
            -
                         
     | 
| 
      
 128 
     | 
    
         
            +
                        redundant_comment = comments.find do |c|
         
     | 
| 
       129 
129 
     | 
    
         
             
                          c.loc.line == range.begin &&
         
     | 
| 
       130 
130 
     | 
    
         
             
                            # Comments disabling all cops don't count since it's reasonable
         
     | 
| 
       131 
131 
     | 
    
         
             
                            # to disable a few select cops first and then all cops further
         
     | 
| 
       132 
132 
     | 
    
         
             
                            # down in the code.
         
     | 
| 
       133 
133 
     | 
    
         
             
                            !all_disabled?(c)
         
     | 
| 
       134 
134 
     | 
    
         
             
                        end
         
     | 
| 
       135 
     | 
    
         
            -
                        yield  
     | 
| 
      
 135 
     | 
    
         
            +
                        yield redundant_comment if redundant_comment
         
     | 
| 
       136 
136 
     | 
    
         
             
                      end
         
     | 
| 
       137 
137 
     | 
    
         
             
                    end
         
     | 
| 
       138 
138 
     | 
    
         | 
| 
       139 
     | 
    
         
            -
                    def  
     | 
| 
      
 139 
     | 
    
         
            +
                    def find_redundant(comment, offenses, cop, line_range, next_line_range)
         
     | 
| 
       140 
140 
     | 
    
         
             
                      if all_disabled?(comment)
         
     | 
| 
       141 
141 
     | 
    
         
             
                        # If there's a disable all comment followed by a comment
         
     | 
| 
       142 
142 
     | 
    
         
             
                        # specifically disabling `cop`, we don't report the `all`
         
     | 
| 
       143 
     | 
    
         
            -
                        # comment. If the disable all comment is truly  
     | 
| 
      
 143 
     | 
    
         
            +
                        # comment. If the disable all comment is truly redundant, we will
         
     | 
| 
       144 
144 
     | 
    
         
             
                        # detect that when examining the comments of another cop, and we
         
     | 
| 
       145 
145 
     | 
    
         
             
                        # get the full line range for the disable all.
         
     | 
| 
       146 
146 
     | 
    
         
             
                        if (next_line_range.nil? ||
         
     | 
| 
         @@ -155,7 +155,7 @@ module RuboCop 
     | 
|
| 
       155 
155 
     | 
    
         
             
                    end
         
     | 
| 
       156 
156 
     | 
    
         | 
| 
       157 
157 
     | 
    
         
             
                    def all_disabled?(comment)
         
     | 
| 
       158 
     | 
    
         
            -
                      comment.text =~ /rubocop\s*:\s*disable\s+all\b/
         
     | 
| 
      
 158 
     | 
    
         
            +
                      comment.text =~ /rubocop\s*:\s*(?:disable|todo)\s+all\b/
         
     | 
| 
       159 
159 
     | 
    
         
             
                    end
         
     | 
| 
       160 
160 
     | 
    
         | 
| 
       161 
161 
     | 
    
         
             
                    def ignore_offense?(disabled_ranges, line_range)
         
     | 
| 
         @@ -170,8 +170,8 @@ module RuboCop 
     | 
|
| 
       170 
170 
     | 
    
         
             
                      cops_string.split(/,\s*/).size
         
     | 
| 
       171 
171 
     | 
    
         
             
                    end
         
     | 
| 
       172 
172 
     | 
    
         | 
| 
       173 
     | 
    
         
            -
                    def add_offenses( 
     | 
| 
       174 
     | 
    
         
            -
                       
     | 
| 
      
 173 
     | 
    
         
            +
                    def add_offenses(redundant_cops)
         
     | 
| 
      
 174 
     | 
    
         
            +
                      redundant_cops.each do |comment, cops|
         
     | 
| 
       175 
175 
     | 
    
         
             
                        if all_disabled?(comment) ||
         
     | 
| 
       176 
176 
     | 
    
         
             
                           directive_count(comment) == cops.size
         
     | 
| 
       177 
177 
     | 
    
         
             
                          add_offense_for_entire_comment(comment, cops)
         
     | 
| 
         @@ -260,4 +260,4 @@ module RuboCop 
     | 
|
| 
       260 
260 
     | 
    
         
             
                end
         
     | 
| 
       261 
261 
     | 
    
         
             
              end
         
     | 
| 
       262 
262 
     | 
    
         
             
            end
         
     | 
| 
       263 
     | 
    
         
            -
            # rubocop:enable Lint/ 
     | 
| 
      
 263 
     | 
    
         
            +
            # rubocop:enable Lint/RedundantCopDisableDirective
         
     |