rubocop 1.5.2 → 1.8.1
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/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/config/default.yml +112 -16
- data/config/obsoletion.yml +196 -0
- data/lib/rubocop.rb +20 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +16 -44
- data/lib/rubocop/comment_config.rb +6 -6
- data/lib/rubocop/config.rb +8 -5
- data/lib/rubocop/config_loader.rb +11 -7
- data/lib/rubocop/config_loader_resolver.rb +21 -4
- data/lib/rubocop/config_obsoletion.rb +64 -262
- data/lib/rubocop/config_obsoletion/changed_enforced_styles.rb +33 -0
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +21 -0
- data/lib/rubocop/config_obsoletion/cop_rule.rb +34 -0
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +44 -0
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +44 -0
- data/lib/rubocop/config_obsoletion/removed_cop.rb +41 -0
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +34 -0
- data/lib/rubocop/config_obsoletion/rule.rb +41 -0
- data/lib/rubocop/config_obsoletion/split_cop.rb +27 -0
- data/lib/rubocop/config_validator.rb +11 -4
- data/lib/rubocop/cop/base.rb +17 -15
- data/lib/rubocop/cop/cop.rb +2 -2
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +6 -8
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -2
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +145 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +19 -3
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +14 -0
- data/lib/rubocop/cop/layout/line_length.rb +6 -16
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +62 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -10
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +59 -0
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +7 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +75 -0
- data/lib/rubocop/cop/lint/duplicate_branch.rb +64 -2
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +44 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +10 -6
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +2 -1
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +50 -0
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +50 -17
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -11
- data/lib/rubocop/cop/lint/unreachable_loop.rb +17 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_identifiers.rb +18 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -10
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/string_help.rb +4 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +5 -1
- data/lib/rubocop/cop/naming/accessor_method_name.rb +15 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +59 -5
- data/lib/rubocop/cop/naming/variable_name.rb +2 -0
- data/lib/rubocop/cop/naming/variable_number.rb +1 -8
- data/lib/rubocop/cop/registry.rb +10 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -1
- data/lib/rubocop/cop/style/character_literal.rb +10 -11
- data/lib/rubocop/cop/style/collection_methods.rb +14 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +22 -5
- data/lib/rubocop/cop/style/empty_literal.rb +6 -2
- data/lib/rubocop/cop/style/endless_method.rb +102 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +10 -0
- data/lib/rubocop/cop/style/float_division.rb +44 -1
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/hash_except.rb +95 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +2 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +8 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +4 -0
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -2
- data/lib/rubocop/cop/style/lambda_call.rb +2 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -6
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +26 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +3 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +13 -3
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -0
- data/lib/rubocop/cop/style/perl_backrefs.rb +86 -9
- data/lib/rubocop/cop/style/raise_args.rb +5 -2
- data/lib/rubocop/cop/style/redundant_argument.rb +21 -2
- data/lib/rubocop/cop/style/redundant_freeze.rb +8 -4
- data/lib/rubocop/cop/style/redundant_return.rb +1 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +30 -7
- data/lib/rubocop/cop/style/single_line_methods.rb +34 -2
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +15 -9
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -13
- data/lib/rubocop/cop/style/string_concatenation.rb +20 -1
- data/lib/rubocop/cop/style/string_literals.rb +14 -8
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +4 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/style/while_until_modifier.rb +2 -4
- data/lib/rubocop/cop/util.rb +3 -1
- data/lib/rubocop/formatter/emacs_style_formatter.rb +2 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +2 -0
- data/lib/rubocop/formatter/tap_formatter.rb +2 -0
- data/lib/rubocop/lockfile.rb +40 -0
- data/lib/rubocop/options.rb +9 -9
- data/lib/rubocop/rspec/cop_helper.rb +0 -4
- data/lib/rubocop/rspec/expect_offense.rb +34 -22
- data/lib/rubocop/runner.rb +16 -1
- data/lib/rubocop/target_finder.rb +4 -2
- data/lib/rubocop/target_ruby.rb +47 -11
- data/lib/rubocop/util.rb +16 -0
- data/lib/rubocop/version.rb +8 -2
- metadata +28 -7
    
        data/lib/rubocop.rb
    CHANGED
    
    | @@ -7,7 +7,7 @@ require 'rainbow' | |
| 7 7 | 
             
            require 'set'
         | 
| 8 8 | 
             
            require 'forwardable'
         | 
| 9 9 | 
             
            require 'regexp_parser'
         | 
| 10 | 
            -
            require 'unicode/display_width | 
| 10 | 
            +
            require 'unicode/display_width'
         | 
| 11 11 |  | 
| 12 12 | 
             
            # we have to require RuboCop's version, before rubocop-ast's
         | 
| 13 13 | 
             
            require_relative 'rubocop/version'
         | 
| @@ -28,6 +28,7 @@ require_relative 'rubocop/name_similarity' | |
| 28 28 | 
             
            require_relative 'rubocop/string_interpreter'
         | 
| 29 29 | 
             
            require_relative 'rubocop/error'
         | 
| 30 30 | 
             
            require_relative 'rubocop/warning'
         | 
| 31 | 
            +
            require_relative 'rubocop/util'
         | 
| 31 32 |  | 
| 32 33 | 
             
            require_relative 'rubocop/cop/util'
         | 
| 33 34 | 
             
            require_relative 'rubocop/cop/offense'
         | 
| @@ -60,6 +61,7 @@ require_relative 'rubocop/cop/mixin/annotation_comment' | |
| 60 61 | 
             
            require_relative 'rubocop/cop/mixin/array_min_size'
         | 
| 61 62 | 
             
            require_relative 'rubocop/cop/mixin/array_syntax'
         | 
| 62 63 | 
             
            require_relative 'rubocop/cop/mixin/alignment'
         | 
| 64 | 
            +
            require_relative 'rubocop/cop/mixin/allowed_identifiers'
         | 
| 63 65 | 
             
            require_relative 'rubocop/cop/mixin/allowed_methods'
         | 
| 64 66 | 
             
            require_relative 'rubocop/cop/mixin/auto_corrector'
         | 
| 65 67 | 
             
            require_relative 'rubocop/cop/mixin/check_assignment'
         | 
| @@ -230,6 +232,7 @@ require_relative 'rubocop/cop/layout/space_around_keyword' | |
| 230 232 | 
             
            require_relative 'rubocop/cop/layout/space_around_method_call_operator'
         | 
| 231 233 | 
             
            require_relative 'rubocop/cop/layout/space_around_operators'
         | 
| 232 234 | 
             
            require_relative 'rubocop/cop/layout/space_before_block_braces'
         | 
| 235 | 
            +
            require_relative 'rubocop/cop/layout/space_before_brackets'
         | 
| 233 236 | 
             
            require_relative 'rubocop/cop/layout/space_before_comma'
         | 
| 234 237 | 
             
            require_relative 'rubocop/cop/layout/space_before_comment'
         | 
| 235 238 | 
             
            require_relative 'rubocop/cop/layout/space_before_first_arg'
         | 
| @@ -247,6 +250,7 @@ require_relative 'rubocop/cop/layout/space_inside_string_interpolation' | |
| 247 250 | 
             
            require_relative 'rubocop/cop/layout/trailing_empty_lines'
         | 
| 248 251 | 
             
            require_relative 'rubocop/cop/layout/trailing_whitespace'
         | 
| 249 252 |  | 
| 253 | 
            +
            require_relative 'rubocop/cop/lint/ambiguous_assignment'
         | 
| 250 254 | 
             
            require_relative 'rubocop/cop/lint/ambiguous_block_association'
         | 
| 251 255 | 
             
            require_relative 'rubocop/cop/lint/ambiguous_operator'
         | 
| 252 256 | 
             
            require_relative 'rubocop/cop/lint/ambiguous_regexp_literal'
         | 
| @@ -259,6 +263,7 @@ require_relative 'rubocop/cop/lint/constant_definition_in_block' | |
| 259 263 | 
             
            require_relative 'rubocop/cop/lint/constant_resolution'
         | 
| 260 264 | 
             
            require_relative 'rubocop/cop/lint/debugger'
         | 
| 261 265 | 
             
            require_relative 'rubocop/cop/lint/deprecated_class_methods'
         | 
| 266 | 
            +
            require_relative 'rubocop/cop/lint/deprecated_constants'
         | 
| 262 267 | 
             
            require_relative 'rubocop/cop/lint/deprecated_open_ssl_constant'
         | 
| 263 268 | 
             
            require_relative 'rubocop/cop/lint/disjunctive_assignment_in_constructor'
         | 
| 264 269 | 
             
            require_relative 'rubocop/cop/lint/duplicate_branch'
         | 
| @@ -292,6 +297,7 @@ require_relative 'rubocop/cop/lint/implicit_string_concatenation' | |
| 292 297 | 
             
            require_relative 'rubocop/cop/lint/inherit_exception'
         | 
| 293 298 | 
             
            require_relative 'rubocop/cop/lint/ineffective_access_modifier'
         | 
| 294 299 | 
             
            require_relative 'rubocop/cop/lint/interpolation_check'
         | 
| 300 | 
            +
            require_relative 'rubocop/cop/lint/lambda_without_literal_block'
         | 
| 295 301 | 
             
            require_relative 'rubocop/cop/lint/literal_as_condition'
         | 
| 296 302 | 
             
            require_relative 'rubocop/cop/lint/literal_in_interpolation'
         | 
| 297 303 | 
             
            require_relative 'rubocop/cop/lint/loop'
         | 
| @@ -315,6 +321,7 @@ require_relative 'rubocop/cop/lint/raise_exception' | |
| 315 321 | 
             
            require_relative 'rubocop/cop/lint/rand_one'
         | 
| 316 322 | 
             
            require_relative 'rubocop/cop/lint/redundant_cop_disable_directive'
         | 
| 317 323 | 
             
            require_relative 'rubocop/cop/lint/redundant_cop_enable_directive'
         | 
| 324 | 
            +
            require_relative 'rubocop/cop/lint/redundant_dir_glob_sort'
         | 
| 318 325 | 
             
            require_relative 'rubocop/cop/lint/redundant_require_statement'
         | 
| 319 326 | 
             
            require_relative 'rubocop/cop/lint/redundant_safe_navigation'
         | 
| 320 327 | 
             
            require_relative 'rubocop/cop/lint/redundant_splat_expansion'
         | 
| @@ -443,6 +450,7 @@ require_relative 'rubocop/cop/style/empty_else' | |
| 443 450 | 
             
            require_relative 'rubocop/cop/style/empty_lambda_parameter'
         | 
| 444 451 | 
             
            require_relative 'rubocop/cop/style/empty_literal'
         | 
| 445 452 | 
             
            require_relative 'rubocop/cop/style/empty_method'
         | 
| 453 | 
            +
            require_relative 'rubocop/cop/style/endless_method'
         | 
| 446 454 | 
             
            require_relative 'rubocop/cop/style/encoding'
         | 
| 447 455 | 
             
            require_relative 'rubocop/cop/style/end_block'
         | 
| 448 456 | 
             
            require_relative 'rubocop/cop/style/eval_with_location'
         | 
| @@ -460,6 +468,7 @@ require_relative 'rubocop/cop/style/global_vars' | |
| 460 468 | 
             
            require_relative 'rubocop/cop/style/guard_clause'
         | 
| 461 469 | 
             
            require_relative 'rubocop/cop/style/hash_as_last_array_item'
         | 
| 462 470 | 
             
            require_relative 'rubocop/cop/style/hash_each_methods'
         | 
| 471 | 
            +
            require_relative 'rubocop/cop/style/hash_except'
         | 
| 463 472 | 
             
            require_relative 'rubocop/cop/style/hash_like_case'
         | 
| 464 473 | 
             
            require_relative 'rubocop/cop/style/hash_syntax'
         | 
| 465 474 | 
             
            require_relative 'rubocop/cop/style/hash_transform_keys'
         | 
| @@ -632,9 +641,19 @@ require_relative 'rubocop/cached_data' | |
| 632 641 | 
             
            require_relative 'rubocop/config'
         | 
| 633 642 | 
             
            require_relative 'rubocop/config_loader_resolver'
         | 
| 634 643 | 
             
            require_relative 'rubocop/config_loader'
         | 
| 644 | 
            +
            require_relative 'rubocop/config_obsoletion/rule'
         | 
| 645 | 
            +
            require_relative 'rubocop/config_obsoletion/cop_rule'
         | 
| 646 | 
            +
            require_relative 'rubocop/config_obsoletion/parameter_rule'
         | 
| 647 | 
            +
            require_relative 'rubocop/config_obsoletion/changed_enforced_styles'
         | 
| 648 | 
            +
            require_relative 'rubocop/config_obsoletion/changed_parameter'
         | 
| 649 | 
            +
            require_relative 'rubocop/config_obsoletion/extracted_cop'
         | 
| 650 | 
            +
            require_relative 'rubocop/config_obsoletion/removed_cop'
         | 
| 651 | 
            +
            require_relative 'rubocop/config_obsoletion/renamed_cop'
         | 
| 652 | 
            +
            require_relative 'rubocop/config_obsoletion/split_cop'
         | 
| 635 653 | 
             
            require_relative 'rubocop/config_obsoletion'
         | 
| 636 654 | 
             
            require_relative 'rubocop/config_store'
         | 
| 637 655 | 
             
            require_relative 'rubocop/config_validator'
         | 
| 656 | 
            +
            require_relative 'rubocop/lockfile'
         | 
| 638 657 | 
             
            require_relative 'rubocop/target_finder'
         | 
| 639 658 | 
             
            require_relative 'rubocop/directive_comment'
         | 
| 640 659 | 
             
            require_relative 'rubocop/comment_config'
         | 
| @@ -3,7 +3,10 @@ | |
| 3 3 | 
             
            module RuboCop
         | 
| 4 4 | 
             
              class CLI
         | 
| 5 5 | 
             
                module Command
         | 
| 6 | 
            -
                  #  | 
| 6 | 
            +
                  # Suggest RuboCop extensions to install based on Gemfile dependencies.
         | 
| 7 | 
            +
                  # Only primary dependencies are evaluated, so if a dependency depends on a
         | 
| 8 | 
            +
                  # gem with an extension, it is not suggested. However, if an extension is
         | 
| 9 | 
            +
                  # a transitive dependency, it will not be suggested.
         | 
| 7 10 | 
             
                  # @api private
         | 
| 8 11 | 
             
                  class SuggestExtensions < Base
         | 
| 9 12 | 
             
                    # Combination of short and long formatter names.
         | 
| @@ -11,39 +14,6 @@ module RuboCop | |
| 11 14 |  | 
| 12 15 | 
             
                    self.command_name = :suggest_extensions
         | 
| 13 16 |  | 
| 14 | 
            -
                    class << self
         | 
| 15 | 
            -
                      # Gems that the current bundle depends on
         | 
| 16 | 
            -
                      # Suggestions are only made for gems that are 1st party dependencies
         | 
| 17 | 
            -
                      def dependent_gems
         | 
| 18 | 
            -
                        bundler do |gems|
         | 
| 19 | 
            -
                          gems.dependencies.map(&:name)
         | 
| 20 | 
            -
                        end
         | 
| 21 | 
            -
                      end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                      # All installed gems in the current bundle
         | 
| 24 | 
            -
                      # If a suggestion is installed but not depended on, it still should not
         | 
| 25 | 
            -
                      # be suggested.
         | 
| 26 | 
            -
                      def installed_gems
         | 
| 27 | 
            -
                        bundler do
         | 
| 28 | 
            -
                          # Load specs from the lockfile without trying to resolve them
         | 
| 29 | 
            -
                          return [] unless Bundler.default_lockfile
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                          lockfile = Bundler.read_file(Bundler.default_lockfile)
         | 
| 32 | 
            -
                          Bundler::LockfileParser.new(lockfile).specs.map(&:name)
         | 
| 33 | 
            -
                        end
         | 
| 34 | 
            -
                      end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                      private
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                      def bundler
         | 
| 39 | 
            -
                        return [] unless defined?(Bundler)
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                        yield Bundler.load
         | 
| 42 | 
            -
                      rescue Bundler::BundlerError
         | 
| 43 | 
            -
                        []
         | 
| 44 | 
            -
                      end
         | 
| 45 | 
            -
                    end
         | 
| 46 | 
            -
             | 
| 47 17 | 
             
                    def run
         | 
| 48 18 | 
             
                      return if skip? || extensions.none?
         | 
| 49 19 |  | 
| @@ -82,25 +52,27 @@ module RuboCop | |
| 82 52 | 
             
                    end
         | 
| 83 53 |  | 
| 84 54 | 
             
                    def extensions
         | 
| 85 | 
            -
                      return [] unless  | 
| 55 | 
            +
                      return [] unless lockfile.dependencies.any?
         | 
| 86 56 |  | 
| 87 | 
            -
                       | 
| 88 | 
            -
             | 
| 89 | 
            -
                        extensions.select { |_, v| (Array(v) & dependent_gems).any? }.keys - installed_gems
         | 
| 90 | 
            -
                      end
         | 
| 57 | 
            +
                      extensions = @config_store.for_pwd.for_all_cops['SuggestExtensions'] || {}
         | 
| 58 | 
            +
                      extensions.select { |_, v| (Array(v) & dependent_gems).any? }.keys - installed_gems
         | 
| 91 59 | 
             
                    end
         | 
| 92 60 |  | 
| 93 | 
            -
                    def  | 
| 94 | 
            -
                       | 
| 95 | 
            -
                      output.puts(*args)
         | 
| 61 | 
            +
                    def lockfile
         | 
| 62 | 
            +
                      @lockfile ||= Lockfile.new
         | 
| 96 63 | 
             
                    end
         | 
| 97 64 |  | 
| 98 65 | 
             
                    def dependent_gems
         | 
| 99 | 
            -
                       | 
| 66 | 
            +
                      lockfile.dependencies.map(&:name)
         | 
| 100 67 | 
             
                    end
         | 
| 101 68 |  | 
| 102 69 | 
             
                    def installed_gems
         | 
| 103 | 
            -
                       | 
| 70 | 
            +
                      lockfile.gems.map(&:name)
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    def puts(*args)
         | 
| 74 | 
            +
                      output = (@options[:stderr] ? $stderr : $stdout)
         | 
| 75 | 
            +
                      output.puts(*args)
         | 
| 104 76 | 
             
                    end
         | 
| 105 77 | 
             
                  end
         | 
| 106 78 | 
             
                end
         | 
| @@ -47,6 +47,12 @@ module RuboCop | |
| 47 47 | 
             
                  )
         | 
| 48 48 | 
             
                end
         | 
| 49 49 |  | 
| 50 | 
            +
                def comment_only_line?(line_number)
         | 
| 51 | 
            +
                  non_comment_token_line_numbers.none? do |non_comment_line_number|
         | 
| 52 | 
            +
                    non_comment_line_number == line_number
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 50 56 | 
             
                private
         | 
| 51 57 |  | 
| 52 58 | 
             
                def extra_enabled_comments_with_names(extras:, names:)
         | 
| @@ -166,12 +172,6 @@ module RuboCop | |
| 166 172 | 
             
                  @all_cop_names ||= Cop::Registry.global.names - [REDUNDANT_DISABLE]
         | 
| 167 173 | 
             
                end
         | 
| 168 174 |  | 
| 169 | 
            -
                def comment_only_line?(line_number)
         | 
| 170 | 
            -
                  non_comment_token_line_numbers.none? do |non_comment_line_number|
         | 
| 171 | 
            -
                    non_comment_line_number == line_number
         | 
| 172 | 
            -
                  end
         | 
| 173 | 
            -
                end
         | 
| 174 | 
            -
             | 
| 175 175 | 
             
                def non_comment_token_line_numbers
         | 
| 176 176 | 
             
                  @non_comment_token_line_numbers ||= begin
         | 
| 177 177 | 
             
                    non_comment_tokens = processed_source.tokens.reject(&:comment?)
         | 
    
        data/lib/rubocop/config.rb
    CHANGED
    
    | @@ -50,8 +50,8 @@ module RuboCop | |
| 50 50 | 
             
                  self
         | 
| 51 51 | 
             
                end
         | 
| 52 52 |  | 
| 53 | 
            -
                def_delegators :@hash, :[], :[]=, :delete, :each, :key?, :keys, :each_key,
         | 
| 54 | 
            -
                               :fetch, :map, :merge, :to_h, :to_hash, :transform_values
         | 
| 53 | 
            +
                def_delegators :@hash, :[], :[]=, :delete, :dig, :each, :key?, :keys, :each_key,
         | 
| 54 | 
            +
                               :fetch, :map, :merge, :replace, :to_h, :to_hash, :transform_values
         | 
| 55 55 | 
             
                def_delegators :@validator, :validate, :target_ruby_version
         | 
| 56 56 |  | 
| 57 57 | 
             
                def to_s
         | 
| @@ -281,6 +281,9 @@ module RuboCop | |
| 281 281 | 
             
                end
         | 
| 282 282 |  | 
| 283 283 | 
             
                def enable_cop?(qualified_cop_name, cop_options)
         | 
| 284 | 
            +
                  # If the cop is explicitly enabled, the other checks can be skipped.
         | 
| 285 | 
            +
                  return true if cop_options['Enabled'] == true
         | 
| 286 | 
            +
             | 
| 284 287 | 
             
                  department = department_of(qualified_cop_name)
         | 
| 285 288 | 
             
                  cop_enabled = cop_options.fetch('Enabled') do
         | 
| 286 289 | 
             
                    !for_all_cops['DisabledByDefault']
         | 
| @@ -292,10 +295,10 @@ module RuboCop | |
| 292 295 | 
             
                end
         | 
| 293 296 |  | 
| 294 297 | 
             
                def department_of(qualified_cop_name)
         | 
| 295 | 
            -
                  cop_department,  | 
| 296 | 
            -
                  return nil if  | 
| 298 | 
            +
                  *cop_department, _ = qualified_cop_name.split('/')
         | 
| 299 | 
            +
                  return nil if cop_department.empty?
         | 
| 297 300 |  | 
| 298 | 
            -
                  self[cop_department]
         | 
| 301 | 
            +
                  self[cop_department.join('/')]
         | 
| 299 302 | 
             
                end
         | 
| 300 303 | 
             
              end
         | 
| 301 304 | 
             
            end
         | 
| @@ -31,6 +31,7 @@ module RuboCop | |
| 31 31 |  | 
| 32 32 | 
             
                  def clear_options
         | 
| 33 33 | 
             
                    @debug = nil
         | 
| 34 | 
            +
                    @loaded_features = []
         | 
| 34 35 | 
             
                    FileFinder.root_level = nil
         | 
| 35 36 | 
             
                  end
         | 
| 36 37 |  | 
| @@ -174,15 +175,12 @@ module RuboCop | |
| 174 175 | 
             
                  end
         | 
| 175 176 |  | 
| 176 177 | 
             
                  def loaded_features
         | 
| 177 | 
            -
                    @loaded_features.flatten.compact
         | 
| 178 | 
            -
                  end
         | 
| 179 | 
            -
             | 
| 180 | 
            -
                  private
         | 
| 181 | 
            -
             | 
| 182 | 
            -
                  def file_path(file)
         | 
| 183 | 
            -
                    File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
         | 
| 178 | 
            +
                    @loaded_features.flatten.compact.uniq
         | 
| 184 179 | 
             
                  end
         | 
| 185 180 |  | 
| 181 | 
            +
                  # @api private
         | 
| 182 | 
            +
                  # Used to add features that were required inside a config or from
         | 
| 183 | 
            +
                  # the CLI using `--require`.
         | 
| 186 184 | 
             
                  def add_loaded_features(loaded_features)
         | 
| 187 185 | 
             
                    if instance_variable_defined?(:@loaded_features)
         | 
| 188 186 | 
             
                      instance_variable_get(:@loaded_features) << loaded_features
         | 
| @@ -191,6 +189,12 @@ module RuboCop | |
| 191 189 | 
             
                    end
         | 
| 192 190 | 
             
                  end
         | 
| 193 191 |  | 
| 192 | 
            +
                  private
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                  def file_path(file)
         | 
| 195 | 
            +
                    File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
         | 
| 196 | 
            +
                  end
         | 
| 197 | 
            +
             | 
| 194 198 | 
             
                  def find_project_dotfile(target_dir)
         | 
| 195 199 | 
             
                    find_file_upwards(DOTFILE, target_dir, project_root)
         | 
| 196 200 | 
             
                  end
         | 
| @@ -20,12 +20,13 @@ module RuboCop | |
| 20 20 | 
             
                  end
         | 
| 21 21 | 
             
                end
         | 
| 22 22 |  | 
| 23 | 
            -
                # rubocop:disable Metrics/MethodLength
         | 
| 24 | 
            -
                def resolve_inheritance(path, hash, file, debug)
         | 
| 23 | 
            +
                def resolve_inheritance(path, hash, file, debug) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
         | 
| 25 24 | 
             
                  inherited_files = Array(hash['inherit_from'])
         | 
| 26 25 | 
             
                  base_configs(path, inherited_files, file)
         | 
| 27 26 | 
             
                    .reverse.each_with_index do |base_config, index|
         | 
| 28 27 | 
             
                    override_department_setting_for_cops(base_config, hash)
         | 
| 28 | 
            +
                    override_enabled_for_disabled_departments(base_config, hash)
         | 
| 29 | 
            +
             | 
| 29 30 | 
             
                    base_config.each do |k, v|
         | 
| 30 31 | 
             
                      next unless v.is_a?(Hash)
         | 
| 31 32 |  | 
| @@ -39,7 +40,6 @@ module RuboCop | |
| 39 40 | 
             
                    end
         | 
| 40 41 | 
             
                  end
         | 
| 41 42 | 
             
                end
         | 
| 42 | 
            -
                # rubocop:enable Metrics/MethodLength
         | 
| 43 43 |  | 
| 44 44 | 
             
                def resolve_inheritance_from_gems(hash)
         | 
| 45 45 | 
             
                  gems = hash.delete('inherit_gem')
         | 
| @@ -75,6 +75,7 @@ module RuboCop | |
| 75 75 | 
             
                  end
         | 
| 76 76 |  | 
| 77 77 | 
             
                  config = handle_disabled_by_default(config, default_configuration) if disabled_by_default
         | 
| 78 | 
            +
                  override_enabled_for_disabled_departments(default_configuration, config)
         | 
| 78 79 |  | 
| 79 80 | 
             
                  opts = { inherit_mode: config['inherit_mode'] || {},
         | 
| 80 81 | 
             
                           unset_nil: unset_nil }
         | 
| @@ -122,10 +123,26 @@ module RuboCop | |
| 122 123 | 
             
                  end
         | 
| 123 124 | 
             
                end
         | 
| 124 125 |  | 
| 126 | 
            +
                # If a cop was previously explicitly enabled, but then superseded by the
         | 
| 127 | 
            +
                # department being disabled, disable it.
         | 
| 128 | 
            +
                def override_enabled_for_disabled_departments(base_hash, derived_hash)
         | 
| 129 | 
            +
                  cops_to_disable = derived_hash.each_key.with_object([]) do |key, cops|
         | 
| 130 | 
            +
                    next unless disabled?(derived_hash, key)
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    cops.concat(base_hash.keys.grep(Regexp.new("^#{key}/")))
         | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                  cops_to_disable.each do |cop_name|
         | 
| 136 | 
            +
                    next unless base_hash.dig(cop_name, 'Enabled') == true
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    derived_hash.replace(merge({ cop_name => { 'Enabled' => false } }, derived_hash))
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
             | 
| 125 142 | 
             
                private
         | 
| 126 143 |  | 
| 127 144 | 
             
                def disabled?(hash, department)
         | 
| 128 | 
            -
                  hash[department] && hash[department]['Enabled'] == false
         | 
| 145 | 
            +
                  hash[department].is_a?(Hash) && hash[department]['Enabled'] == false
         | 
| 129 146 | 
             
                end
         | 
| 130 147 |  | 
| 131 148 | 
             
                def duplicate_setting?(base_hash, derived_hash, key, inherited_file)
         | 
| @@ -4,233 +4,40 @@ module RuboCop | |
| 4 4 | 
             
              # This class handles obsolete configuration.
         | 
| 5 5 | 
             
              # @api private
         | 
| 6 6 | 
             
              class ConfigObsoletion
         | 
| 7 | 
            -
                 | 
| 8 | 
            -
             | 
| 9 | 
            -
                  ' | 
| 10 | 
            -
                  ' | 
| 11 | 
            -
                  ' | 
| 12 | 
            -
                  ' | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                  ' | 
| 16 | 
            -
                  ' | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                   | 
| 23 | 
            -
             | 
| 24 | 
            -
                   | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                  'Lint/StringConversionInInterpolation' => 'Lint/RedundantStringCoercion',
         | 
| 28 | 
            -
                  'Lint/UnneededCopDisableDirective' => 'Lint/RedundantCopDisableDirective',
         | 
| 29 | 
            -
                  'Lint/UnneededCopEnableDirective' => 'Lint/RedundantCopEnableDirective',
         | 
| 30 | 
            -
                  'Lint/UnneededRequireStatement' => 'Lint/RedundantRequireStatement',
         | 
| 31 | 
            -
                  'Lint/UnneededSplatExpansion' => 'Lint/RedundantSplatExpansion',
         | 
| 32 | 
            -
                  'Naming/UncommunicativeBlockParamName' => 'Naming/BlockParameterName',
         | 
| 33 | 
            -
                  'Naming/UncommunicativeMethodParamName' => 'Naming/MethodParameterName',
         | 
| 34 | 
            -
                  'Style/DeprecatedHashMethods' => 'Style/PreferredHashMethods',
         | 
| 35 | 
            -
                  'Style/MethodCallParentheses' => 'Style/MethodCallWithoutArgsParentheses',
         | 
| 36 | 
            -
                  'Style/OpMethod' => 'Naming/BinaryOperatorParameterName',
         | 
| 37 | 
            -
                  'Style/SingleSpaceBeforeFirstArg' => 'Layout/SpaceBeforeFirstArg',
         | 
| 38 | 
            -
                  'Style/UnneededCapitalW' => 'Style/RedundantCapitalW',
         | 
| 39 | 
            -
                  'Style/UnneededCondition' => 'Style/RedundantCondition',
         | 
| 40 | 
            -
                  'Style/UnneededInterpolation' => 'Style/RedundantInterpolation',
         | 
| 41 | 
            -
                  'Style/UnneededPercentQ' => 'Style/RedundantPercentQ',
         | 
| 42 | 
            -
                  'Style/UnneededSort' => 'Style/RedundantSort'
         | 
| 43 | 
            -
                }.map do |old_name, new_name|
         | 
| 44 | 
            -
                  [old_name, "The `#{old_name}` cop has been renamed to `#{new_name}`."]
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                MOVED_COPS = {
         | 
| 48 | 
            -
                  'Security' => 'Lint/Eval',
         | 
| 49 | 
            -
                  'Naming' => %w[Style/ClassAndModuleCamelCase Style/ConstantName
         | 
| 50 | 
            -
                                 Style/FileName Style/MethodName Style/PredicateName
         | 
| 51 | 
            -
                                 Style/VariableName Style/VariableNumber
         | 
| 52 | 
            -
                                 Style/AccessorMethodName Style/AsciiIdentifiers],
         | 
| 53 | 
            -
                  'Layout' => %w[Lint/BlockAlignment Lint/EndAlignment
         | 
| 54 | 
            -
                                 Lint/DefEndAlignment Metrics/LineLength],
         | 
| 55 | 
            -
                  'Lint' => 'Style/FlipFlop'
         | 
| 56 | 
            -
                }.map do |new_department, old_names|
         | 
| 57 | 
            -
                  Array(old_names).map do |old_name|
         | 
| 58 | 
            -
                    [old_name, "The `#{old_name}` cop has been moved to " \
         | 
| 59 | 
            -
                               "`#{new_department}/#{old_name.split('/').last}`."]
         | 
| 7 | 
            +
                DEFAULT_RULES_FILE = File.join(ConfigLoader::RUBOCOP_HOME, 'config', 'obsoletion.yml')
         | 
| 8 | 
            +
                COP_RULE_CLASSES = {
         | 
| 9 | 
            +
                  'renamed' => RenamedCop,
         | 
| 10 | 
            +
                  'removed' => RemovedCop,
         | 
| 11 | 
            +
                  'split' => SplitCop,
         | 
| 12 | 
            +
                  'extracted' => ExtractedCop
         | 
| 13 | 
            +
                }.freeze
         | 
| 14 | 
            +
                PARAMETER_RULE_CLASSES = {
         | 
| 15 | 
            +
                  'changed_parameters' => ChangedParameter,
         | 
| 16 | 
            +
                  'changed_enforced_styles' => ChangedEnforcedStyles
         | 
| 17 | 
            +
                }.freeze
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                attr_reader :rules, :warnings
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                class << self
         | 
| 22 | 
            +
                  attr_accessor :files
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def legacy_cop_names
         | 
| 25 | 
            +
                    # Used by DepartmentName#qualified_legacy_cop_name
         | 
| 26 | 
            +
                    new(Config.new).rules.select(&:cop_rule?).map(&:old_name)
         | 
| 60 27 | 
             
                  end
         | 
| 61 28 | 
             
                end
         | 
| 62 29 |  | 
| 63 | 
            -
                 | 
| 64 | 
            -
             | 
| 65 | 
            -
                  'Layout/SpaceBeforeModifierKeyword' => 'Layout/SpaceAroundKeyword',
         | 
| 66 | 
            -
                  'Lint/RescueWithoutErrorClass' => 'Style/RescueStandardError',
         | 
| 67 | 
            -
                  'Style/SpaceAfterControlKeyword' => 'Layout/SpaceAroundKeyword',
         | 
| 68 | 
            -
                  'Style/SpaceBeforeModifierKeyword' => 'Layout/SpaceAroundKeyword',
         | 
| 69 | 
            -
                  'Style/TrailingComma' => 'Style/TrailingCommaInArguments, ' \
         | 
| 70 | 
            -
                                           'Style/TrailingCommaInArrayLiteral, and/or ' \
         | 
| 71 | 
            -
                                           'Style/TrailingCommaInHashLiteral',
         | 
| 72 | 
            -
                  'Style/TrailingCommaInLiteral' => 'Style/TrailingCommaInArrayLiteral ' \
         | 
| 73 | 
            -
                                                    'and/or ' \
         | 
| 74 | 
            -
                                                    'Style/TrailingCommaInHashLiteral',
         | 
| 75 | 
            -
                  'Style/BracesAroundHashParameters' => nil
         | 
| 76 | 
            -
                }.map do |old_name, other_cops|
         | 
| 77 | 
            -
                  if other_cops
         | 
| 78 | 
            -
                    more = ". Please use #{other_cops} instead".gsub(%r{[A-Z]\w+/\w+},
         | 
| 79 | 
            -
                                                                     '`\&`')
         | 
| 80 | 
            -
                  end
         | 
| 81 | 
            -
                  [old_name, "The `#{old_name}` cop has been removed#{more}."]
         | 
| 82 | 
            -
                end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                REMOVED_COPS_WITH_REASON = {
         | 
| 85 | 
            -
                  'Lint/InvalidCharacterLiteral' => 'it was never being actually triggered',
         | 
| 86 | 
            -
                  'Lint/SpaceBeforeFirstArg' =>
         | 
| 87 | 
            -
                    'it was a duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
         | 
| 88 | 
            -
                    '`Layout/SpaceBeforeFirstArg` instead',
         | 
| 89 | 
            -
                  'Style/MethodMissingSuper' => 'it has been superseded by `Lint/MissingSuper`. Please use ' \
         | 
| 90 | 
            -
                    '`Lint/MissingSuper` instead',
         | 
| 91 | 
            -
                  'Lint/UselessComparison' => 'it has been superseded by '\
         | 
| 92 | 
            -
                    '`Lint/BinaryOperatorWithIdenticalOperands`. Please use '\
         | 
| 93 | 
            -
                    '`Lint/BinaryOperatorWithIdenticalOperands` instead'
         | 
| 94 | 
            -
                }.map do |cop_name, reason|
         | 
| 95 | 
            -
                  [cop_name, "The `#{cop_name}` cop has been removed since #{reason}."]
         | 
| 96 | 
            -
                end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                SPLIT_COPS = {
         | 
| 99 | 
            -
                  'Style/MethodMissing' =>
         | 
| 100 | 
            -
                    'The `Style/MethodMissing` cop has been split into ' \
         | 
| 101 | 
            -
                    '`Style/MethodMissingSuper` and `Style/MissingRespondToMissing`.'
         | 
| 102 | 
            -
                }.to_a
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                OBSOLETE_COPS = Hash[*(RENAMED_COPS + MOVED_COPS + REMOVED_COPS +
         | 
| 105 | 
            -
                                       REMOVED_COPS_WITH_REASON + SPLIT_COPS).flatten]
         | 
| 106 | 
            -
             | 
| 107 | 
            -
                # Parameters can be deprecated but not disabled by setting `severity: :warning`
         | 
| 108 | 
            -
                OBSOLETE_PARAMETERS = [
         | 
| 109 | 
            -
                  {
         | 
| 110 | 
            -
                    cops: %w[Layout/SpaceAroundOperators Style/SpaceAroundOperators],
         | 
| 111 | 
            -
                    parameters: 'MultiSpaceAllowedForOperators',
         | 
| 112 | 
            -
                    alternative: 'If your intention was to allow extra spaces for ' \
         | 
| 113 | 
            -
                                 'alignment, please use AllowForAlignment: true instead.'
         | 
| 114 | 
            -
                  },
         | 
| 115 | 
            -
                  {
         | 
| 116 | 
            -
                    cops: 'Style/Encoding',
         | 
| 117 | 
            -
                    parameters: %w[EnforcedStyle SupportedStyles
         | 
| 118 | 
            -
                                   AutoCorrectEncodingComment],
         | 
| 119 | 
            -
                    alternative: 'Style/Encoding no longer supports styles. ' \
         | 
| 120 | 
            -
                                 'The "never" behavior is always assumed.'
         | 
| 121 | 
            -
                  },
         | 
| 122 | 
            -
                  {
         | 
| 123 | 
            -
                    cops: 'Style/IfUnlessModifier',
         | 
| 124 | 
            -
                    parameters: 'MaxLineLength',
         | 
| 125 | 
            -
                    alternative: '`Style/IfUnlessModifier: MaxLineLength` has been ' \
         | 
| 126 | 
            -
                                 'removed. Use `Layout/LineLength: Max` instead'
         | 
| 127 | 
            -
                  },
         | 
| 128 | 
            -
                  {
         | 
| 129 | 
            -
                    cops: 'Style/WhileUntilModifier',
         | 
| 130 | 
            -
                    parameters: 'MaxLineLength',
         | 
| 131 | 
            -
                    alternative: '`Style/WhileUntilModifier: MaxLineLength` has been ' \
         | 
| 132 | 
            -
                                 'removed. Use `Layout/LineLength: Max` instead'
         | 
| 133 | 
            -
                  },
         | 
| 134 | 
            -
                  {
         | 
| 135 | 
            -
                    cops: 'AllCops',
         | 
| 136 | 
            -
                    parameters: 'RunRailsCops',
         | 
| 137 | 
            -
                    alternative: "Use the following configuration instead:\n" \
         | 
| 138 | 
            -
                                 "Rails:\n  Enabled: true"
         | 
| 139 | 
            -
                  },
         | 
| 140 | 
            -
                  {
         | 
| 141 | 
            -
                    cops: 'Layout/CaseIndentation',
         | 
| 142 | 
            -
                    parameters: 'IndentWhenRelativeTo',
         | 
| 143 | 
            -
                    alternative: '`IndentWhenRelativeTo` has been renamed to ' \
         | 
| 144 | 
            -
                                 '`EnforcedStyle`'
         | 
| 145 | 
            -
                  },
         | 
| 146 | 
            -
                  {
         | 
| 147 | 
            -
                    cops: %w[Lint/BlockAlignment Layout/BlockAlignment Lint/EndAlignment
         | 
| 148 | 
            -
                             Layout/EndAlignment Lint/DefEndAlignment
         | 
| 149 | 
            -
                             Layout/DefEndAlignment],
         | 
| 150 | 
            -
                    parameters: 'AlignWith',
         | 
| 151 | 
            -
                    alternative: '`AlignWith` has been renamed to `EnforcedStyleAlignWith`'
         | 
| 152 | 
            -
                  },
         | 
| 153 | 
            -
                  {
         | 
| 154 | 
            -
                    cops: 'Rails/UniqBeforePluck',
         | 
| 155 | 
            -
                    parameters: 'EnforcedMode',
         | 
| 156 | 
            -
                    alternative: '`EnforcedMode` has been renamed to `EnforcedStyle`'
         | 
| 157 | 
            -
                  },
         | 
| 158 | 
            -
                  {
         | 
| 159 | 
            -
                    cops: 'Style/MethodCallWithArgsParentheses',
         | 
| 160 | 
            -
                    parameters: 'IgnoredMethodPatterns',
         | 
| 161 | 
            -
                    alternative: '`IgnoredMethodPatterns` has been renamed to ' \
         | 
| 162 | 
            -
                                 '`IgnoredPatterns`'
         | 
| 163 | 
            -
                  },
         | 
| 164 | 
            -
                  {
         | 
| 165 | 
            -
                    cops: %w[Performance/Count Performance/Detect],
         | 
| 166 | 
            -
                    parameters: 'SafeMode',
         | 
| 167 | 
            -
                    alternative: '`SafeMode` has been removed. ' \
         | 
| 168 | 
            -
                                 'Use `SafeAutoCorrect` instead.'
         | 
| 169 | 
            -
                  },
         | 
| 170 | 
            -
                  {
         | 
| 171 | 
            -
                    cops: 'Bundler/GemComment',
         | 
| 172 | 
            -
                    parameters: 'Whitelist',
         | 
| 173 | 
            -
                    alternative: '`Whitelist` has been renamed to `IgnoredGems`.'
         | 
| 174 | 
            -
                  },
         | 
| 175 | 
            -
                  {
         | 
| 176 | 
            -
                    cops: %w[
         | 
| 177 | 
            -
                      Lint/SafeNavigationChain Lint/SafeNavigationConsistency
         | 
| 178 | 
            -
                      Style/NestedParenthesizedCalls Style/SafeNavigation
         | 
| 179 | 
            -
                      Style/TrivialAccessors
         | 
| 180 | 
            -
                    ],
         | 
| 181 | 
            -
                    parameters: 'Whitelist',
         | 
| 182 | 
            -
                    alternative: '`Whitelist` has been renamed to `AllowedMethods`.'
         | 
| 183 | 
            -
                  },
         | 
| 184 | 
            -
                  {
         | 
| 185 | 
            -
                    cops: 'Style/IpAddresses',
         | 
| 186 | 
            -
                    parameters: 'Whitelist',
         | 
| 187 | 
            -
                    alternative: '`Whitelist` has been renamed to `AllowedAddresses`.'
         | 
| 188 | 
            -
                  },
         | 
| 189 | 
            -
                  {
         | 
| 190 | 
            -
                    cops: 'Naming/HeredocDelimiterNaming',
         | 
| 191 | 
            -
                    parameters: 'Blacklist',
         | 
| 192 | 
            -
                    alternative: '`Blacklist` has been renamed to `ForbiddenDelimiters`.'
         | 
| 193 | 
            -
                  },
         | 
| 194 | 
            -
                  {
         | 
| 195 | 
            -
                    cops: 'Naming/PredicateName',
         | 
| 196 | 
            -
                    parameters: 'NamePrefixBlacklist',
         | 
| 197 | 
            -
                    alternative: '`NamePrefixBlacklist` has been renamed to ' \
         | 
| 198 | 
            -
                                 '`ForbiddenPrefixes`.'
         | 
| 199 | 
            -
                  },
         | 
| 200 | 
            -
                  {
         | 
| 201 | 
            -
                    cops: 'Naming/PredicateName',
         | 
| 202 | 
            -
                    parameters: 'NameWhitelist',
         | 
| 203 | 
            -
                    alternative: '`NameWhitelist` has been renamed to ' \
         | 
| 204 | 
            -
                                 '`AllowedMethods`.'
         | 
| 205 | 
            -
                  },
         | 
| 206 | 
            -
                  {
         | 
| 207 | 
            -
                    cops: %w[Metrics/BlockLength Metrics/MethodLength],
         | 
| 208 | 
            -
                    parameters: 'ExcludedMethods',
         | 
| 209 | 
            -
                    alternative: '`ExcludedMethods` has been renamed to `IgnoredMethods`.',
         | 
| 210 | 
            -
                    severity: :warning
         | 
| 211 | 
            -
                  }
         | 
| 212 | 
            -
                ].freeze
         | 
| 213 | 
            -
             | 
| 214 | 
            -
                OBSOLETE_ENFORCED_STYLES = [
         | 
| 215 | 
            -
                  {
         | 
| 216 | 
            -
                    cop: 'Layout/IndentationConsistency',
         | 
| 217 | 
            -
                    parameter: 'EnforcedStyle',
         | 
| 218 | 
            -
                    enforced_style: 'rails',
         | 
| 219 | 
            -
                    alternative: '`EnforcedStyle: rails` has been renamed to ' \
         | 
| 220 | 
            -
                                 '`EnforcedStyle: indented_internal_methods`'
         | 
| 221 | 
            -
                  }
         | 
| 222 | 
            -
                ].freeze
         | 
| 223 | 
            -
             | 
| 224 | 
            -
                attr_reader :warnings
         | 
| 30 | 
            +
                # Can be extended by extension libraries to add their own obsoletions
         | 
| 31 | 
            +
                self.files = [DEFAULT_RULES_FILE]
         | 
| 225 32 |  | 
| 226 33 | 
             
                def initialize(config)
         | 
| 227 34 | 
             
                  @config = config
         | 
| 35 | 
            +
                  @rules = load_rules
         | 
| 228 36 | 
             
                  @warnings = []
         | 
| 229 37 | 
             
                end
         | 
| 230 38 |  | 
| 231 | 
            -
                def  | 
| 232 | 
            -
                  messages =  | 
| 233 | 
            -
                              obsolete_enforced_style].flatten.compact
         | 
| 39 | 
            +
                def reject_obsolete!
         | 
| 40 | 
            +
                  messages = obsoletions.flatten.compact
         | 
| 234 41 | 
             
                  return if messages.empty?
         | 
| 235 42 |  | 
| 236 43 | 
             
                  raise ValidationError, messages.join("\n")
         | 
| @@ -238,64 +45,59 @@ module RuboCop | |
| 238 45 |  | 
| 239 46 | 
             
                private
         | 
| 240 47 |  | 
| 241 | 
            -
                 | 
| 242 | 
            -
             | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 245 | 
            -
             | 
| 246 | 
            -
             | 
| 247 | 
            -
             | 
| 48 | 
            +
                # Default rules for obsoletions are in config/obsoletion.yml
         | 
| 49 | 
            +
                # Additional rules files can be added with `RuboCop::ConfigObsoletion.files << filename`
         | 
| 50 | 
            +
                def load_rules
         | 
| 51 | 
            +
                  rules = self.class.files.each_with_object({}) do |filename, hash|
         | 
| 52 | 
            +
                    hash.merge!(YAML.safe_load(File.read(filename))) do |_key, first, second|
         | 
| 53 | 
            +
                      first.merge(second)
         | 
| 54 | 
            +
                    end
         | 
| 248 55 | 
             
                  end
         | 
| 249 | 
            -
                end
         | 
| 250 56 |  | 
| 251 | 
            -
             | 
| 252 | 
            -
                   | 
| 253 | 
            -
                    obsolete_enforced_style_message(params[:cop], params[:parameter],
         | 
| 254 | 
            -
                                                    params[:enforced_style],
         | 
| 255 | 
            -
                                                    params[:alternative])
         | 
| 256 | 
            -
                  end
         | 
| 257 | 
            -
                end
         | 
| 57 | 
            +
                  cop_rules = rules.slice(*COP_RULE_CLASSES.keys)
         | 
| 58 | 
            +
                  parameter_rules = rules.slice(*PARAMETER_RULE_CLASSES.keys)
         | 
| 258 59 |  | 
| 259 | 
            -
             | 
| 260 | 
            -
             | 
| 60 | 
            +
                  load_cop_rules(cop_rules).concat(load_parameter_rules(parameter_rules))
         | 
| 61 | 
            +
                end
         | 
| 261 62 |  | 
| 262 | 
            -
             | 
| 63 | 
            +
                # Cop rules are keyed by the name of the original cop
         | 
| 64 | 
            +
                def load_cop_rules(rules)
         | 
| 65 | 
            +
                  rules.flat_map do |rule_type, data|
         | 
| 66 | 
            +
                    data.map do |cop_name, configuration|
         | 
| 67 | 
            +
                      next unless configuration # allow configurations to be disabled with `CopName: ~`
         | 
| 263 68 |  | 
| 264 | 
            -
             | 
| 265 | 
            -
             | 
| 69 | 
            +
                      COP_RULE_CLASSES[rule_type].new(@config, cop_name, configuration)
         | 
| 70 | 
            +
                    end.compact
         | 
| 71 | 
            +
                  end
         | 
| 266 72 | 
             
                end
         | 
| 267 73 |  | 
| 268 | 
            -
                 | 
| 269 | 
            -
             | 
| 270 | 
            -
             | 
| 271 | 
            -
             | 
| 272 | 
            -
             | 
| 273 | 
            -
                     | 
| 274 | 
            -
             | 
| 275 | 
            -
                       | 
| 276 | 
            -
             | 
| 74 | 
            +
                # Parameter rules may apply to multiple cops and multiple parameters
         | 
| 75 | 
            +
                # and are given as an array. Each combination is turned into a separate
         | 
| 76 | 
            +
                # rule object.
         | 
| 77 | 
            +
                def load_parameter_rules(rules)
         | 
| 78 | 
            +
                  rules.flat_map do |rule_type, data|
         | 
| 79 | 
            +
                    data.flat_map do |configuration|
         | 
| 80 | 
            +
                      cops = Array(configuration['cops'])
         | 
| 81 | 
            +
                      parameters = Array(configuration['parameters'])
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                      cops.product(parameters).map do |cop, parameter|
         | 
| 84 | 
            +
                        PARAMETER_RULE_CLASSES[rule_type].new(@config, cop, parameter, configuration)
         | 
| 85 | 
            +
                      end
         | 
| 277 86 | 
             
                    end
         | 
| 278 | 
            -
             | 
| 279 | 
            -
                    messages
         | 
| 280 87 | 
             
                  end
         | 
| 281 88 | 
             
                end
         | 
| 282 89 |  | 
| 283 | 
            -
                def  | 
| 284 | 
            -
                   | 
| 285 | 
            -
                     | 
| 286 | 
            -
                      @config[cop]&.key?(param)
         | 
| 287 | 
            -
                    end
         | 
| 288 | 
            -
                    next if obsolete_parameters.empty?
         | 
| 90 | 
            +
                def obsoletions
         | 
| 91 | 
            +
                  rules.map do |rule|
         | 
| 92 | 
            +
                    next unless rule.violated?
         | 
| 289 93 |  | 
| 290 | 
            -
                     | 
| 291 | 
            -
                       | 
| 292 | 
            -
                       | 
| 94 | 
            +
                    if rule.warning?
         | 
| 95 | 
            +
                      @warnings.push(rule.message)
         | 
| 96 | 
            +
                      next
         | 
| 293 97 | 
             
                    end
         | 
| 294 | 
            -
                  end
         | 
| 295 | 
            -
                end
         | 
| 296 98 |  | 
| 297 | 
            -
             | 
| 298 | 
            -
                   | 
| 99 | 
            +
                    rule.message
         | 
| 100 | 
            +
                  end
         | 
| 299 101 | 
             
                end
         | 
| 300 102 | 
             
              end
         | 
| 301 103 | 
             
            end
         |