rubocop 1.50.2 → 1.53.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 -3
 - data/config/default.yml +76 -6
 - data/lib/rubocop/cli/command/lsp.rb +19 -0
 - data/lib/rubocop/cli.rb +3 -0
 - data/lib/rubocop/config.rb +4 -0
 - data/lib/rubocop/config_loader_resolver.rb +4 -3
 - data/lib/rubocop/config_obsoletion.rb +2 -2
 - data/lib/rubocop/cop/base.rb +5 -1
 - data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
 - data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
 - data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
 - data/lib/rubocop/cop/gemspec/dependency_version.rb +2 -2
 - data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
 - data/lib/rubocop/cop/internal_affairs/cop_description.rb +32 -8
 - data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
 - data/lib/rubocop/cop/layout/class_structure.rb +7 -0
 - data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -2
 - data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
 - data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
 - data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
 - data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
 - data/lib/rubocop/cop/layout/indentation_width.rb +2 -2
 - data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -1
 - data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -0
 - data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
 - data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
 - data/lib/rubocop/cop/lint/debugger.rb +1 -1
 - data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
 - data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +46 -19
 - data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -4
 - data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
 - data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
 - data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
 - data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
 - data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
 - data/lib/rubocop/cop/lint/missing_super.rb +34 -5
 - data/lib/rubocop/cop/lint/mixed_case_range.rb +109 -0
 - data/lib/rubocop/cop/lint/number_conversion.rb +5 -0
 - data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
 - data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
 - data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
 - data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +120 -0
 - data/lib/rubocop/cop/lint/redundant_require_statement.rb +8 -3
 - data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
 - data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
 - data/lib/rubocop/cop/lint/shadowed_exception.rb +5 -11
 - data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
 - data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
 - data/lib/rubocop/cop/lint/useless_assignment.rb +59 -1
 - data/lib/rubocop/cop/lint/void.rb +63 -7
 - data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
 - data/lib/rubocop/cop/migration/department_name.rb +2 -2
 - data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
 - data/lib/rubocop/cop/mixin/comments_help.rb +7 -3
 - data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
 - data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
 - data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
 - data/lib/rubocop/cop/naming/block_forwarding.rb +1 -1
 - data/lib/rubocop/cop/naming/constant_name.rb +1 -1
 - data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -10
 - data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -3
 - data/lib/rubocop/cop/naming/variable_name.rb +6 -1
 - data/lib/rubocop/cop/style/accessor_grouping.rb +5 -1
 - data/lib/rubocop/cop/style/attr.rb +11 -1
 - data/lib/rubocop/cop/style/begin_block.rb +1 -2
 - data/lib/rubocop/cop/style/block_comments.rb +1 -1
 - data/lib/rubocop/cop/style/block_delimiters.rb +3 -3
 - data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
 - data/lib/rubocop/cop/style/class_equality_comparison.rb +17 -39
 - data/lib/rubocop/cop/style/collection_compact.rb +16 -6
 - data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
 - data/lib/rubocop/cop/style/combinable_loops.rb +26 -6
 - data/lib/rubocop/cop/style/conditional_assignment.rb +5 -3
 - data/lib/rubocop/cop/style/copyright.rb +5 -2
 - data/lib/rubocop/cop/style/dir.rb +1 -1
 - data/lib/rubocop/cop/style/dir_empty.rb +8 -14
 - data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
 - data/lib/rubocop/cop/style/documentation.rb +1 -1
 - data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
 - data/lib/rubocop/cop/style/exact_regexp_match.rb +68 -0
 - data/lib/rubocop/cop/style/file_read.rb +2 -2
 - data/lib/rubocop/cop/style/guard_clause.rb +2 -0
 - data/lib/rubocop/cop/style/hash_each_methods.rb +1 -22
 - data/lib/rubocop/cop/style/hash_except.rb +19 -8
 - data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
 - data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
 - data/lib/rubocop/cop/style/identical_conditional_branches.rb +6 -2
 - data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
 - data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -0
 - data/lib/rubocop/cop/style/invertible_unless_condition.rb +10 -6
 - data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +3 -4
 - data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
 - data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
 - data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
 - data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
 - data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +38 -0
 - data/lib/rubocop/cop/style/redundant_filter_chain.rb +101 -0
 - data/lib/rubocop/cop/style/redundant_line_continuation.rb +7 -3
 - data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_regexp_argument.rb +86 -0
 - data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
 - data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -1
 - data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +3 -1
 - data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -0
 - data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
 - data/lib/rubocop/cop/style/require_order.rb +11 -5
 - data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
 - data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +81 -0
 - data/lib/rubocop/cop/style/select_by_regexp.rb +15 -5
 - data/lib/rubocop/cop/style/semicolon.rb +12 -1
 - data/lib/rubocop/cop/style/signal_exception.rb +1 -1
 - data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
 - data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
 - data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
 - data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
 - data/lib/rubocop/cop/team.rb +1 -1
 - data/lib/rubocop/cop/util.rb +1 -1
 - data/lib/rubocop/cop/utils/regexp_ranges.rb +100 -0
 - data/lib/rubocop/cop/variable_force/assignment.rb +33 -1
 - data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
 - data/lib/rubocop/cop/variable_force.rb +1 -0
 - data/lib/rubocop/cops_documentation_generator.rb +1 -1
 - data/lib/rubocop/ext/regexp_parser.rb +4 -1
 - data/lib/rubocop/lsp/logger.rb +22 -0
 - data/lib/rubocop/lsp/routes.rb +223 -0
 - data/lib/rubocop/lsp/runtime.rb +79 -0
 - data/lib/rubocop/lsp/server.rb +62 -0
 - data/lib/rubocop/lsp/severity.rb +27 -0
 - data/lib/rubocop/options.rb +11 -1
 - data/lib/rubocop/result_cache.rb +1 -1
 - data/lib/rubocop/rspec/cop_helper.rb +1 -1
 - data/lib/rubocop/server/client_command/exec.rb +2 -1
 - data/lib/rubocop/target_ruby.rb +3 -2
 - data/lib/rubocop/version.rb +10 -6
 - data/lib/rubocop.rb +13 -0
 - metadata +38 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 63ade8f6d7d93161d739cd557220bea89fc0320a2f8923f41cc092015dbcadef
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: bb608b076e84d18f317b1690a6f5ad0b0ecea1232977107ebca57b04d32b6abb
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: '0178518d0c9ab5eb1425395c4047f603f92e9d17ae9ef23d7e52ef9c9cfc51e8dda9abd0b08d39b84014c6f59f238673b5fe73de3c2eb649cd166c39cfc58081'
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 752ee645c95115d20848ff2f00731597bd6106738bb6bded350a3348b392a471890d6f607e475245f81aae7746c23389ffd302e7884b2cba8476ca66d4d07ec7
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -53,7 +53,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi 
     | 
|
| 
       53 
53 
     | 
    
         
             
            in your `Gemfile`:
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
       55 
55 
     | 
    
         
             
            ```rb
         
     | 
| 
       56 
     | 
    
         
            -
            gem 'rubocop', '~> 1. 
     | 
| 
      
 56 
     | 
    
         
            +
            gem 'rubocop', '~> 1.53', require: false
         
     | 
| 
       57 
57 
     | 
    
         
             
            ```
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
       59 
59 
     | 
    
         
             
            See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
         
     | 
| 
         @@ -75,8 +75,8 @@ You can read a lot more about RuboCop in its [official docs](https://docs.ruboco 
     | 
|
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
            RuboCop officially supports the following runtime Ruby implementations:
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
            * MRI 2. 
     | 
| 
       79 
     | 
    
         
            -
            * JRuby 9. 
     | 
| 
      
 78 
     | 
    
         
            +
            * MRI 2.7+
         
     | 
| 
      
 79 
     | 
    
         
            +
            * JRuby 9.4+
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
            Targets Ruby 2.0+ code analysis.
         
     | 
| 
       82 
82 
     | 
    
         | 
    
        data/config/default.yml
    CHANGED
    
    | 
         @@ -140,7 +140,7 @@ AllCops: 
     | 
|
| 
       140 
140 
     | 
    
         
             
              # or gems.locked file. (Although the Ruby version is specified in the Gemfile
         
     | 
| 
       141 
141 
     | 
    
         
             
              # or gems.rb file, RuboCop reads the final value from the lock file.) If the
         
     | 
| 
       142 
142 
     | 
    
         
             
              # Ruby version is still unresolved, RuboCop will use the oldest officially
         
     | 
| 
       143 
     | 
    
         
            -
              # supported Ruby version (currently Ruby 2. 
     | 
| 
      
 143 
     | 
    
         
            +
              # supported Ruby version (currently Ruby 2.7).
         
     | 
| 
       144 
144 
     | 
    
         
             
              TargetRubyVersion: ~
         
     | 
| 
       145 
145 
     | 
    
         
             
              # Determines if a notification for extension libraries should be shown when
         
     | 
| 
       146 
146 
     | 
    
         
             
              # rubocop is run. Keys are the name of the extension, and values are an array
         
     | 
| 
         @@ -154,6 +154,7 @@ AllCops: 
     | 
|
| 
       154 
154 
     | 
    
         
             
                rubocop-rake: [rake]
         
     | 
| 
       155 
155 
     | 
    
         
             
                rubocop-graphql: [graphql]
         
     | 
| 
       156 
156 
     | 
    
         
             
                rubocop-capybara: [capybara]
         
     | 
| 
      
 157 
     | 
    
         
            +
                rubocop-factory_bot: [factory_bot, factory_bot_rails]
         
     | 
| 
       157 
158 
     | 
    
         
             
              # Enable/Disable checking the methods extended by Active Support.
         
     | 
| 
       158 
159 
     | 
    
         
             
              ActiveSupportExtensionsEnabled: false
         
     | 
| 
       159 
160 
     | 
    
         | 
| 
         @@ -466,7 +467,9 @@ Layout/ClassStructure: 
     | 
|
| 
       466 
467 
     | 
    
         
             
              Description: 'Enforces a configured order of definitions within a class body.'
         
     | 
| 
       467 
468 
     | 
    
         
             
              StyleGuide: '#consistent-classes'
         
     | 
| 
       468 
469 
     | 
    
         
             
              Enabled: false
         
     | 
| 
      
 470 
     | 
    
         
            +
              SafeAutoCorrect: false
         
     | 
| 
       469 
471 
     | 
    
         
             
              VersionAdded: '0.52'
         
     | 
| 
      
 472 
     | 
    
         
            +
              VersionChanged: '1.53'
         
     | 
| 
       470 
473 
     | 
    
         
             
              Categories:
         
     | 
| 
       471 
474 
     | 
    
         
             
                module_inclusion:
         
     | 
| 
       472 
475 
     | 
    
         
             
                  - include
         
     | 
| 
         @@ -1529,7 +1532,6 @@ Lint/AmbiguousBlockAssociation: 
     | 
|
| 
       1529 
1532 
     | 
    
         
             
              Description: >-
         
     | 
| 
       1530 
1533 
     | 
    
         
             
                             Checks for ambiguous block association with method when param passed without
         
     | 
| 
       1531 
1534 
     | 
    
         
             
                             parentheses.
         
     | 
| 
       1532 
     | 
    
         
            -
              StyleGuide: '#syntax'
         
     | 
| 
       1533 
1535 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       1534 
1536 
     | 
    
         
             
              VersionAdded: '0.48'
         
     | 
| 
       1535 
1537 
     | 
    
         
             
              VersionChanged: '1.13'
         
     | 
| 
         @@ -1987,9 +1989,16 @@ Lint/MissingSuper: 
     | 
|
| 
       1987 
1989 
     | 
    
         
             
                              Checks for the presence of constructors and lifecycle callbacks
         
     | 
| 
       1988 
1990 
     | 
    
         
             
                              without calls to `super`.
         
     | 
| 
       1989 
1991 
     | 
    
         
             
              Enabled: true
         
     | 
| 
      
 1992 
     | 
    
         
            +
              AllowedParentClasses: []
         
     | 
| 
       1990 
1993 
     | 
    
         
             
              VersionAdded: '0.89'
         
     | 
| 
       1991 
1994 
     | 
    
         
             
              VersionChanged: '1.4'
         
     | 
| 
       1992 
1995 
     | 
    
         | 
| 
      
 1996 
     | 
    
         
            +
            Lint/MixedCaseRange:
         
     | 
| 
      
 1997 
     | 
    
         
            +
              Description: 'Checks for mixed-case character ranges since they include likely unintended characters.'
         
     | 
| 
      
 1998 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 1999 
     | 
    
         
            +
              SafeAutoCorrect: false
         
     | 
| 
      
 2000 
     | 
    
         
            +
              VersionAdded: '1.53'
         
     | 
| 
      
 2001 
     | 
    
         
            +
             
     | 
| 
       1993 
2002 
     | 
    
         
             
            Lint/MixedRegexpCaptureTypes:
         
     | 
| 
       1994 
2003 
     | 
    
         
             
              Description: 'Do not mix named captures and numbered captures in a Regexp literal.'
         
     | 
| 
       1995 
2004 
     | 
    
         
             
              Enabled: true
         
     | 
| 
         @@ -2139,6 +2148,11 @@ Lint/RedundantDirGlobSort: 
     | 
|
| 
       2139 
2148 
     | 
    
         
             
              VersionChanged: '1.26'
         
     | 
| 
       2140 
2149 
     | 
    
         
             
              SafeAutoCorrect: false
         
     | 
| 
       2141 
2150 
     | 
    
         | 
| 
      
 2151 
     | 
    
         
            +
            Lint/RedundantRegexpQuantifiers:
         
     | 
| 
      
 2152 
     | 
    
         
            +
              Description: 'Checks for redundant quantifiers in Regexps.'
         
     | 
| 
      
 2153 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 2154 
     | 
    
         
            +
              VersionAdded: '1.53'
         
     | 
| 
      
 2155 
     | 
    
         
            +
             
     | 
| 
       2142 
2156 
     | 
    
         
             
            Lint/RedundantRequireStatement:
         
     | 
| 
       2143 
2157 
     | 
    
         
             
              Description: 'Checks for unnecessary `require` statement.'
         
     | 
| 
       2144 
2158 
     | 
    
         
             
              Enabled: true
         
     | 
| 
         @@ -2343,6 +2357,9 @@ Lint/TopLevelReturnWithArgument: 
     | 
|
| 
       2343 
2357 
     | 
    
         
             
              Description: 'Detects top level return statements with argument.'
         
     | 
| 
       2344 
2358 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       2345 
2359 
     | 
    
         
             
              VersionAdded: '0.89'
         
     | 
| 
      
 2360 
     | 
    
         
            +
              # These codes are `eval`-ed in method and their return values may be used.
         
     | 
| 
      
 2361 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 2362 
     | 
    
         
            +
                - '**/*.jb'
         
     | 
| 
       2346 
2363 
     | 
    
         | 
| 
       2347 
2364 
     | 
    
         
             
            Lint/TrailingCommaInAttributeDeclaration:
         
     | 
| 
       2348 
2365 
     | 
    
         
             
              Description: 'Checks for trailing commas in attribute declarations.'
         
     | 
| 
         @@ -2451,6 +2468,8 @@ Lint/UselessAssignment: 
     | 
|
| 
       2451 
2468 
     | 
    
         
             
              StyleGuide: '#underscore-unused-vars'
         
     | 
| 
       2452 
2469 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       2453 
2470 
     | 
    
         
             
              VersionAdded: '0.11'
         
     | 
| 
      
 2471 
     | 
    
         
            +
              VersionChanged: '1.51'
         
     | 
| 
      
 2472 
     | 
    
         
            +
              SafeAutoCorrect: false
         
     | 
| 
       2454 
2473 
     | 
    
         | 
| 
       2455 
2474 
     | 
    
         
             
            Lint/UselessElseWithoutRescue:
         
     | 
| 
       2456 
2475 
     | 
    
         
             
              Description: 'Checks for useless `else` in `begin..end` without `rescue`.'
         
     | 
| 
         @@ -2478,10 +2497,9 @@ Lint/UselessRuby2Keywords: 
     | 
|
| 
       2478 
2497 
     | 
    
         
             
            Lint/UselessSetterCall:
         
     | 
| 
       2479 
2498 
     | 
    
         
             
              Description: 'Checks for useless setter call to a local variable.'
         
     | 
| 
       2480 
2499 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       2481 
     | 
    
         
            -
               
     | 
| 
      
 2500 
     | 
    
         
            +
              Safe: false
         
     | 
| 
       2482 
2501 
     | 
    
         
             
              VersionAdded: '0.13'
         
     | 
| 
       2483 
2502 
     | 
    
         
             
              VersionChanged: '1.2'
         
     | 
| 
       2484 
     | 
    
         
            -
              Safe: false
         
     | 
| 
       2485 
2503 
     | 
    
         | 
| 
       2486 
2504 
     | 
    
         
             
            Lint/UselessTimes:
         
     | 
| 
       2487 
2505 
     | 
    
         
             
              Description: 'Checks for useless `Integer#times` calls.'
         
     | 
| 
         @@ -2942,7 +2960,9 @@ Naming/VariableNumber: 
     | 
|
| 
       2942 
2960 
     | 
    
         
             
            Security/CompoundHash:
         
     | 
| 
       2943 
2961 
     | 
    
         
             
              Description: 'When overwriting Object#hash to combine values, prefer delegating to Array#hash over writing a custom implementation.'
         
     | 
| 
       2944 
2962 
     | 
    
         
             
              Enabled: pending
         
     | 
| 
      
 2963 
     | 
    
         
            +
              Safe: false
         
     | 
| 
       2945 
2964 
     | 
    
         
             
              VersionAdded: '1.28'
         
     | 
| 
      
 2965 
     | 
    
         
            +
              VersionChanged: '1.51'
         
     | 
| 
       2946 
2966 
     | 
    
         | 
| 
       2947 
2967 
     | 
    
         
             
            Security/Eval:
         
     | 
| 
       2948 
2968 
     | 
    
         
             
              Description: 'The use of eval represents a serious security risk.'
         
     | 
| 
         @@ -3355,6 +3375,7 @@ Style/CollectionCompact: 
     | 
|
| 
       3355 
3375 
     | 
    
         
             
              Safe: false
         
     | 
| 
       3356 
3376 
     | 
    
         
             
              VersionAdded: '1.2'
         
     | 
| 
       3357 
3377 
     | 
    
         
             
              VersionChanged: '1.3'
         
     | 
| 
      
 3378 
     | 
    
         
            +
              AllowedReceivers: []
         
     | 
| 
       3358 
3379 
     | 
    
         | 
| 
       3359 
3380 
     | 
    
         
             
            # Align with the style guide.
         
     | 
| 
       3360 
3381 
     | 
    
         
             
            Style/CollectionMethods:
         
     | 
| 
         @@ -3515,7 +3536,9 @@ Style/DataInheritance: 
     | 
|
| 
       3515 
3536 
     | 
    
         
             
              Description: 'Checks for inheritance from Data.define.'
         
     | 
| 
       3516 
3537 
     | 
    
         
             
              StyleGuide: '#no-extend-data-define'
         
     | 
| 
       3517 
3538 
     | 
    
         
             
              Enabled: pending
         
     | 
| 
      
 3539 
     | 
    
         
            +
              SafeAutoCorrect: false
         
     | 
| 
       3518 
3540 
     | 
    
         
             
              VersionAdded: '1.49'
         
     | 
| 
      
 3541 
     | 
    
         
            +
              VersionChanged: '1.51'
         
     | 
| 
       3519 
3542 
     | 
    
         | 
| 
       3520 
3543 
     | 
    
         
             
            Style/DateTime:
         
     | 
| 
       3521 
3544 
     | 
    
         
             
              Description: 'Use Time over DateTime.'
         
     | 
| 
         @@ -3706,6 +3729,11 @@ Style/EvenOdd: 
     | 
|
| 
       3706 
3729 
     | 
    
         
             
              VersionAdded: '0.12'
         
     | 
| 
       3707 
3730 
     | 
    
         
             
              VersionChanged: '0.29'
         
     | 
| 
       3708 
3731 
     | 
    
         | 
| 
      
 3732 
     | 
    
         
            +
            Style/ExactRegexpMatch:
         
     | 
| 
      
 3733 
     | 
    
         
            +
              Description: 'Checks for exact regexp match inside Regexp literals.'
         
     | 
| 
      
 3734 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 3735 
     | 
    
         
            +
              VersionAdded: '1.51'
         
     | 
| 
      
 3736 
     | 
    
         
            +
             
     | 
| 
       3709 
3737 
     | 
    
         
             
            Style/ExpandPathArguments:
         
     | 
| 
       3710 
3738 
     | 
    
         
             
              Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`."
         
     | 
| 
       3711 
3739 
     | 
    
         
             
              Enabled: true
         
     | 
| 
         @@ -4092,8 +4120,6 @@ Style/InvertibleUnlessCondition: 
     | 
|
| 
       4092 
4120 
     | 
    
         
             
                # :blank?: :present?
         
     | 
| 
       4093 
4121 
     | 
    
         
             
                # :include?: :exclude?
         
     | 
| 
       4094 
4122 
     | 
    
         
             
                # :exclude?: :include?
         
     | 
| 
       4095 
     | 
    
         
            -
                # :one?: :many?
         
     | 
| 
       4096 
     | 
    
         
            -
                # :many?: :one?
         
     | 
| 
       4097 
4123 
     | 
    
         | 
| 
       4098 
4124 
     | 
    
         
             
            Style/IpAddresses:
         
     | 
| 
       4099 
4125 
     | 
    
         
             
              Description: "Don't include literal IP addresses in code."
         
     | 
| 
         @@ -4370,6 +4396,7 @@ Style/MultipleComparison: 
     | 
|
| 
       4370 
4396 
     | 
    
         
             
              VersionAdded: '0.49'
         
     | 
| 
       4371 
4397 
     | 
    
         
             
              VersionChanged: '1.1'
         
     | 
| 
       4372 
4398 
     | 
    
         
             
              AllowMethodComparison: true
         
     | 
| 
      
 4399 
     | 
    
         
            +
              ComparisonsThreshold: 2
         
     | 
| 
       4373 
4400 
     | 
    
         | 
| 
       4374 
4401 
     | 
    
         
             
            Style/MutableConstant:
         
     | 
| 
       4375 
4402 
     | 
    
         
             
              Description: 'Do not assign mutable objects to constants.'
         
     | 
| 
         @@ -4624,7 +4651,9 @@ Style/OpenStructUse: 
     | 
|
| 
       4624 
4651 
     | 
    
         
             
                - https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
         
     | 
| 
       4625 
4652 
     | 
    
         | 
| 
       4626 
4653 
     | 
    
         
             
              Enabled: pending
         
     | 
| 
      
 4654 
     | 
    
         
            +
              Safe: false
         
     | 
| 
       4627 
4655 
     | 
    
         
             
              VersionAdded: '1.23'
         
     | 
| 
      
 4656 
     | 
    
         
            +
              VersionChanged: '1.51'
         
     | 
| 
       4628 
4657 
     | 
    
         | 
| 
       4629 
4658 
     | 
    
         
             
            Style/OperatorMethodCall:
         
     | 
| 
       4630 
4659 
     | 
    
         
             
              Description: 'Checks for redundant dot before operator method call.'
         
     | 
| 
         @@ -4790,6 +4819,11 @@ Style/RedundantArgument: 
     | 
|
| 
       4790 
4819 
     | 
    
         
             
                # String#chomp!
         
     | 
| 
       4791 
4820 
     | 
    
         
             
                chomp!: "\n"
         
     | 
| 
       4792 
4821 
     | 
    
         | 
| 
      
 4822 
     | 
    
         
            +
            Style/RedundantArrayConstructor:
         
     | 
| 
      
 4823 
     | 
    
         
            +
              Description: 'Checks for the instantiation of array using redundant `Array` constructor.'
         
     | 
| 
      
 4824 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 4825 
     | 
    
         
            +
              VersionAdded: '1.52'
         
     | 
| 
      
 4826 
     | 
    
         
            +
             
     | 
| 
       4793 
4827 
     | 
    
         
             
            Style/RedundantAssignment:
         
     | 
| 
       4794 
4828 
     | 
    
         
             
              Description: 'Checks for redundant assignment before returning.'
         
     | 
| 
       4795 
4829 
     | 
    
         
             
              Enabled: true
         
     | 
| 
         @@ -4822,6 +4856,11 @@ Style/RedundantConstantBase: 
     | 
|
| 
       4822 
4856 
     | 
    
         
             
              Enabled: pending
         
     | 
| 
       4823 
4857 
     | 
    
         
             
              VersionAdded: '1.40'
         
     | 
| 
       4824 
4858 
     | 
    
         | 
| 
      
 4859 
     | 
    
         
            +
            Style/RedundantCurrentDirectoryInPath:
         
     | 
| 
      
 4860 
     | 
    
         
            +
              Description: 'Checks for uses a redundant current directory in path.'
         
     | 
| 
      
 4861 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 4862 
     | 
    
         
            +
              VersionAdded: '1.53'
         
     | 
| 
      
 4863 
     | 
    
         
            +
             
     | 
| 
       4825 
4864 
     | 
    
         
             
            Style/RedundantDoubleSplatHashBraces:
         
     | 
| 
       4826 
4865 
     | 
    
         
             
              Description: 'Checks for redundant uses of double splat hash braces.'
         
     | 
| 
       4827 
4866 
     | 
    
         
             
              Enabled: pending
         
     | 
| 
         @@ -4861,6 +4900,13 @@ Style/RedundantFileExtensionInRequire: 
     | 
|
| 
       4861 
4900 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       4862 
4901 
     | 
    
         
             
              VersionAdded: '0.88'
         
     | 
| 
       4863 
4902 
     | 
    
         | 
| 
      
 4903 
     | 
    
         
            +
            Style/RedundantFilterChain:
         
     | 
| 
      
 4904 
     | 
    
         
            +
              Description: >-
         
     | 
| 
      
 4905 
     | 
    
         
            +
                              Identifies usages of `any?`, `empty?`, `none?` or `one?` predicate methods chained to
         
     | 
| 
      
 4906 
     | 
    
         
            +
                              `select`/`filter`/`find_all` and change them to use predicate method instead.
         
     | 
| 
      
 4907 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 4908 
     | 
    
         
            +
              VersionAdded: '1.52'
         
     | 
| 
      
 4909 
     | 
    
         
            +
             
     | 
| 
       4864 
4910 
     | 
    
         
             
            Style/RedundantFreeze:
         
     | 
| 
       4865 
4911 
     | 
    
         
             
              Description: "Checks usages of Object#freeze on immutable objects."
         
     | 
| 
       4866 
4912 
     | 
    
         
             
              Enabled: true
         
     | 
| 
         @@ -4903,11 +4949,21 @@ Style/RedundantPercentQ: 
     | 
|
| 
       4903 
4949 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       4904 
4950 
     | 
    
         
             
              VersionAdded: '0.76'
         
     | 
| 
       4905 
4951 
     | 
    
         | 
| 
      
 4952 
     | 
    
         
            +
            Style/RedundantRegexpArgument:
         
     | 
| 
      
 4953 
     | 
    
         
            +
              Description: 'Identifies places where argument can be replaced from a deterministic regexp to a string.'
         
     | 
| 
      
 4954 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 4955 
     | 
    
         
            +
              VersionAdded: '1.53'
         
     | 
| 
      
 4956 
     | 
    
         
            +
             
     | 
| 
       4906 
4957 
     | 
    
         
             
            Style/RedundantRegexpCharacterClass:
         
     | 
| 
       4907 
4958 
     | 
    
         
             
              Description: 'Checks for unnecessary single-element Regexp character classes.'
         
     | 
| 
       4908 
4959 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       4909 
4960 
     | 
    
         
             
              VersionAdded: '0.85'
         
     | 
| 
       4910 
4961 
     | 
    
         | 
| 
      
 4962 
     | 
    
         
            +
            Style/RedundantRegexpConstructor:
         
     | 
| 
      
 4963 
     | 
    
         
            +
              Description: 'Checks for the instantiation of regexp using redundant `Regexp.new` or `Regexp.compile`.'
         
     | 
| 
      
 4964 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 4965 
     | 
    
         
            +
              VersionAdded: '1.52'
         
     | 
| 
      
 4966 
     | 
    
         
            +
             
     | 
| 
       4911 
4967 
     | 
    
         
             
            Style/RedundantRegexpEscape:
         
     | 
| 
       4912 
4968 
     | 
    
         
             
              Description: 'Checks for redundant escapes in Regexps.'
         
     | 
| 
       4913 
4969 
     | 
    
         
             
              Enabled: true
         
     | 
| 
         @@ -5010,6 +5066,15 @@ Style/ReturnNil: 
     | 
|
| 
       5010 
5066 
     | 
    
         
             
                - return_nil
         
     | 
| 
       5011 
5067 
     | 
    
         
             
              VersionAdded: '0.50'
         
     | 
| 
       5012 
5068 
     | 
    
         | 
| 
      
 5069 
     | 
    
         
            +
            Style/ReturnNilInPredicateMethodDefinition:
         
     | 
| 
      
 5070 
     | 
    
         
            +
              Description: 'Checks if uses of `return` or `return nil` in predicate method definition.'
         
     | 
| 
      
 5071 
     | 
    
         
            +
              StyleGuide: '#bool-methods-qmark'
         
     | 
| 
      
 5072 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 5073 
     | 
    
         
            +
              SafeAutoCorrect: false
         
     | 
| 
      
 5074 
     | 
    
         
            +
              AllowedMethods: []
         
     | 
| 
      
 5075 
     | 
    
         
            +
              AllowedPatterns: []
         
     | 
| 
      
 5076 
     | 
    
         
            +
              VersionAdded: '1.53'
         
     | 
| 
      
 5077 
     | 
    
         
            +
             
     | 
| 
       5013 
5078 
     | 
    
         
             
            Style/SafeNavigation:
         
     | 
| 
       5014 
5079 
     | 
    
         
             
              Description: >-
         
     | 
| 
       5015 
5080 
     | 
    
         
             
                              Transforms usages of a method call safeguarded by
         
     | 
| 
         @@ -5494,6 +5559,11 @@ Style/WordArray: 
     | 
|
| 
       5494 
5559 
     | 
    
         
             
              # The regular expression `WordRegex` decides what is considered a word.
         
     | 
| 
       5495 
5560 
     | 
    
         
             
              WordRegex: !ruby/regexp '/\A(?:\p{Word}|\p{Word}-\p{Word}|\n|\t)+\z/'
         
     | 
| 
       5496 
5561 
     | 
    
         | 
| 
      
 5562 
     | 
    
         
            +
            Style/YAMLFileRead:
         
     | 
| 
      
 5563 
     | 
    
         
            +
              Description: 'Checks for the use of `YAML.load`, `YAML.safe_load`, and `YAML.parse` with `File.read` argument.'
         
     | 
| 
      
 5564 
     | 
    
         
            +
              Enabled: pending
         
     | 
| 
      
 5565 
     | 
    
         
            +
              VersionAdded: '1.53'
         
     | 
| 
      
 5566 
     | 
    
         
            +
             
     | 
| 
       5497 
5567 
     | 
    
         
             
            Style/YodaCondition:
         
     | 
| 
       5498 
5568 
     | 
    
         
             
              Description: 'Forbid or enforce yoda conditions.'
         
     | 
| 
       5499 
5569 
     | 
    
         
             
              Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions'
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative '../../lsp/server'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module RuboCop
         
     | 
| 
      
 6 
     | 
    
         
            +
              class CLI
         
     | 
| 
      
 7 
     | 
    
         
            +
                module Command
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # Start Language Server Protocol of RuboCop.
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class Lsp < Base
         
     | 
| 
      
 11 
     | 
    
         
            +
                    self.command_name = :lsp
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    def run
         
     | 
| 
      
 14 
     | 
    
         
            +
                      RuboCop::Lsp::Server.new(@config_store).start
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/rubocop/cli.rb
    CHANGED
    
    | 
         @@ -174,14 +174,17 @@ module RuboCop 
     | 
|
| 
       174 
174 
     | 
    
         
             
                  ConfigLoader.ignore_unrecognized_cops = @options[:ignore_unrecognized_cops]
         
     | 
| 
       175 
175 
     | 
    
         
             
                end
         
     | 
| 
       176 
176 
     | 
    
         | 
| 
      
 177 
     | 
    
         
            +
                # rubocop:disable Metrics/CyclomaticComplexity
         
     | 
| 
       177 
178 
     | 
    
         
             
                def handle_exiting_options
         
     | 
| 
       178 
179 
     | 
    
         
             
                  return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o }
         
     | 
| 
       179 
180 
     | 
    
         | 
| 
       180 
181 
     | 
    
         
             
                  run_command(:version) if @options[:version] || @options[:verbose_version]
         
     | 
| 
       181 
182 
     | 
    
         
             
                  run_command(:show_cops) if @options[:show_cops]
         
     | 
| 
       182 
183 
     | 
    
         
             
                  run_command(:show_docs_url) if @options[:show_docs_url]
         
     | 
| 
      
 184 
     | 
    
         
            +
                  run_command(:lsp) if @options[:lsp]
         
     | 
| 
       183 
185 
     | 
    
         
             
                  raise Finished
         
     | 
| 
       184 
186 
     | 
    
         
             
                end
         
     | 
| 
      
 187 
     | 
    
         
            +
                # rubocop:enable Metrics/CyclomaticComplexity
         
     | 
| 
       185 
188 
     | 
    
         | 
| 
       186 
189 
     | 
    
         
             
                def apply_default_formatter
         
     | 
| 
       187 
190 
     | 
    
         
             
                  # This must be done after the options have already been processed,
         
     | 
    
        data/lib/rubocop/config.rb
    CHANGED
    
    
| 
         @@ -33,7 +33,7 @@ module RuboCop 
     | 
|
| 
       33 
33 
     | 
    
         
             
                                  inherit_mode: determine_inherit_mode(hash, k))
         
     | 
| 
       34 
34 
     | 
    
         
             
                      end
         
     | 
| 
       35 
35 
     | 
    
         
             
                      hash[k] = v
         
     | 
| 
       36 
     | 
    
         
            -
                      fix_include_paths(base_config.loaded_path, hash, k, v) if v.key?('Include')
         
     | 
| 
      
 36 
     | 
    
         
            +
                      fix_include_paths(base_config.loaded_path, hash, path, k, v) if v.key?('Include')
         
     | 
| 
       37 
37 
     | 
    
         
             
                    end
         
     | 
| 
       38 
38 
     | 
    
         
             
                  end
         
     | 
| 
       39 
39 
     | 
    
         
             
                end
         
     | 
| 
         @@ -42,12 +42,13 @@ module RuboCop 
     | 
|
| 
       42 
42 
     | 
    
         
             
                # base configuration are relative to the directory where the base configuration file is. For the
         
     | 
| 
       43 
43 
     | 
    
         
             
                # derived configuration, we need to make those paths relative to where the derived configuration
         
     | 
| 
       44 
44 
     | 
    
         
             
                # file is.
         
     | 
| 
       45 
     | 
    
         
            -
                def fix_include_paths(base_config_path, hash, key, value)
         
     | 
| 
      
 45 
     | 
    
         
            +
                def fix_include_paths(base_config_path, hash, path, key, value)
         
     | 
| 
       46 
46 
     | 
    
         
             
                  return unless File.basename(base_config_path).start_with?('.rubocop')
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
                  base_dir = File.dirname(base_config_path)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  derived_dir = File.dirname(path)
         
     | 
| 
       49 
50 
     | 
    
         
             
                  hash[key]['Include'] = value['Include'].map do |include_path|
         
     | 
| 
       50 
     | 
    
         
            -
                    PathUtil.relative_path(File.join(base_dir, include_path),  
     | 
| 
      
 51 
     | 
    
         
            +
                    PathUtil.relative_path(File.join(base_dir, include_path), derived_dir)
         
     | 
| 
       51 
52 
     | 
    
         
             
                  end
         
     | 
| 
       52 
53 
     | 
    
         
             
                end
         
     | 
| 
       53 
54 
     | 
    
         | 
| 
         @@ -68,11 +68,11 @@ module RuboCop 
     | 
|
| 
       68 
68 
     | 
    
         
             
                # Cop rules are keyed by the name of the original cop
         
     | 
| 
       69 
69 
     | 
    
         
             
                def load_cop_rules(rules)
         
     | 
| 
       70 
70 
     | 
    
         
             
                  rules.flat_map do |rule_type, data|
         
     | 
| 
       71 
     | 
    
         
            -
                    data. 
     | 
| 
      
 71 
     | 
    
         
            +
                    data.filter_map do |cop_name, configuration|
         
     | 
| 
       72 
72 
     | 
    
         
             
                      next unless configuration # allow configurations to be disabled with `CopName: ~`
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
74 
     | 
    
         
             
                      COP_RULE_CLASSES[rule_type].new(@config, cop_name, configuration)
         
     | 
| 
       75 
     | 
    
         
            -
                    end 
     | 
| 
      
 75 
     | 
    
         
            +
                    end
         
     | 
| 
       76 
76 
     | 
    
         
             
                  end
         
     | 
| 
       77 
77 
     | 
    
         
             
                end
         
     | 
| 
       78 
78 
     | 
    
         | 
    
        data/lib/rubocop/cop/base.rb
    CHANGED
    
    | 
         @@ -284,7 +284,7 @@ module RuboCop 
     | 
|
| 
       284 
284 
     | 
    
         
             
                  # @api private
         
     | 
| 
       285 
285 
     | 
    
         
             
                  def self.callbacks_needed
         
     | 
| 
       286 
286 
     | 
    
         
             
                    @callbacks_needed ||= public_instance_methods.select do |m|
         
     | 
| 
       287 
     | 
    
         
            -
                      m. 
     | 
| 
      
 287 
     | 
    
         
            +
                      m.start_with?(/on_|after_/) &&
         
     | 
| 
       288 
288 
     | 
    
         
             
                        !Base.method_defined?(m) # exclude standard "callbacks" like 'on_begin_investigation'
         
     | 
| 
       289 
289 
     | 
    
         
             
                    end
         
     | 
| 
       290 
290 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -305,6 +305,10 @@ module RuboCop 
     | 
|
| 
       305 
305 
     | 
    
         
             
                    @current_original = original
         
     | 
| 
       306 
306 
     | 
    
         
             
                  end
         
     | 
| 
       307 
307 
     | 
    
         | 
| 
      
 308 
     | 
    
         
            +
                  def inspect # :nodoc:
         
     | 
| 
      
 309 
     | 
    
         
            +
                    "#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
         
     | 
| 
      
 310 
     | 
    
         
            +
                  end
         
     | 
| 
      
 311 
     | 
    
         
            +
             
     | 
| 
       308 
312 
     | 
    
         
             
                  private
         
     | 
| 
       309 
313 
     | 
    
         | 
| 
       310 
314 
     | 
    
         
             
                  ### Reserved for Cop::Cop
         
     | 
| 
         @@ -150,7 +150,7 @@ module RuboCop 
     | 
|
| 
       150 
150 
     | 
    
         
             
                    # Version specifications that restrict all updates going forward. This excludes versions
         
     | 
| 
       151 
151 
     | 
    
         
             
                    # like ">= 1.0" or "!= 2.0.3".
         
     | 
| 
       152 
152 
     | 
    
         
             
                    def restrictive_version_specified_gem?(node)
         
     | 
| 
       153 
     | 
    
         
            -
                      return unless version_specified_gem?(node)
         
     | 
| 
      
 153 
     | 
    
         
            +
                      return false unless version_specified_gem?(node)
         
     | 
| 
       154 
154 
     | 
    
         | 
| 
       155 
155 
     | 
    
         
             
                      node.arguments[1..]
         
     | 
| 
       156 
156 
     | 
    
         
             
                          .any? { |arg| arg&.str_type? && RESTRICTIVE_VERSION_PATTERN.match?(arg.value) }
         
     | 
| 
         @@ -105,13 +105,13 @@ module RuboCop 
     | 
|
| 
       105 
105 
     | 
    
         
             
                    end
         
     | 
| 
       106 
106 
     | 
    
         | 
| 
       107 
107 
     | 
    
         
             
                    def required_offense?(node)
         
     | 
| 
       108 
     | 
    
         
            -
                      return unless required_style?
         
     | 
| 
      
 108 
     | 
    
         
            +
                      return false unless required_style?
         
     | 
| 
       109 
109 
     | 
    
         | 
| 
       110 
110 
     | 
    
         
             
                      !includes_version_specification?(node) && !includes_commit_reference?(node)
         
     | 
| 
       111 
111 
     | 
    
         
             
                    end
         
     | 
| 
       112 
112 
     | 
    
         | 
| 
       113 
113 
     | 
    
         
             
                    def forbidden_offense?(node)
         
     | 
| 
       114 
     | 
    
         
            -
                      return unless forbidden_style?
         
     | 
| 
      
 114 
     | 
    
         
            +
                      return false unless forbidden_style?
         
     | 
| 
       115 
115 
     | 
    
         | 
| 
       116 
116 
     | 
    
         
             
                      includes_version_specification?(node) || includes_commit_reference?(node)
         
     | 
| 
       117 
117 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -54,7 +54,7 @@ module RuboCop 
     | 
|
| 
       54 
54 
     | 
    
         
             
                    def inside_string_ranges(node)
         
     | 
| 
       55 
55 
     | 
    
         
             
                      return [] unless node.is_a?(Parser::AST::Node)
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                      node.each_node(:str, :dstr, :xstr). 
     | 
| 
      
 57 
     | 
    
         
            +
                      node.each_node(:str, :dstr, :xstr).filter_map { |n| inside_string_range(n) }
         
     | 
| 
       58 
58 
     | 
    
         
             
                    end
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
                    def inside_string_range(node)
         
     | 
| 
         @@ -126,13 +126,13 @@ module RuboCop 
     | 
|
| 
       126 
126 
     | 
    
         
             
                    end
         
     | 
| 
       127 
127 
     | 
    
         | 
| 
       128 
128 
     | 
    
         
             
                    def required_offense?(node)
         
     | 
| 
       129 
     | 
    
         
            -
                      return unless required_style?
         
     | 
| 
      
 129 
     | 
    
         
            +
                      return false unless required_style?
         
     | 
| 
       130 
130 
     | 
    
         | 
| 
       131 
131 
     | 
    
         
             
                      !includes_version_specification?(node) && !includes_commit_reference?(node)
         
     | 
| 
       132 
132 
     | 
    
         
             
                    end
         
     | 
| 
       133 
133 
     | 
    
         | 
| 
       134 
134 
     | 
    
         
             
                    def forbidden_offense?(node)
         
     | 
| 
       135 
     | 
    
         
            -
                      return unless forbidden_style?
         
     | 
| 
      
 135 
     | 
    
         
            +
                      return false unless forbidden_style?
         
     | 
| 
       136 
136 
     | 
    
         | 
| 
       137 
137 
     | 
    
         
             
                      includes_version_specification?(node) || includes_commit_reference?(node)
         
     | 
| 
       138 
138 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -75,7 +75,7 @@ module RuboCop 
     | 
|
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
                    # @!method add_development_dependency?(node)
         
     | 
| 
       77 
77 
     | 
    
         
             
                    def_node_matcher :add_development_dependency?, <<~PATTERN
         
     | 
| 
       78 
     | 
    
         
            -
                      (send _ :add_development_dependency (str #forbidden_gem? ...))
         
     | 
| 
      
 78 
     | 
    
         
            +
                      (send _ :add_development_dependency (str #forbidden_gem? ...) _? _?)
         
     | 
| 
       79 
79 
     | 
    
         
             
                    PATTERN
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
                    # @!method gem?(node)
         
     | 
| 
         @@ -12,6 +12,13 @@ module RuboCop 
     | 
|
| 
       12 
12 
     | 
    
         
             
                  #     ....
         
     | 
| 
       13 
13 
     | 
    
         
             
                  #   end
         
     | 
| 
       14 
14 
     | 
    
         
             
                  #
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #   #
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #   # Checks ...
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #   class SomeCop < Base
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #     ...
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #   end
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #
         
     | 
| 
       15 
22 
     | 
    
         
             
                  #   # good
         
     | 
| 
       16 
23 
     | 
    
         
             
                  #   # Checks ...
         
     | 
| 
       17 
24 
     | 
    
         
             
                  #   class SomeCop < Base
         
     | 
| 
         @@ -21,27 +28,47 @@ module RuboCop 
     | 
|
| 
       21 
28 
     | 
    
         
             
                  class CopDescription < Base
         
     | 
| 
       22 
29 
     | 
    
         
             
                    extend AutoCorrector
         
     | 
| 
       23 
30 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                     
     | 
| 
      
 31 
     | 
    
         
            +
                    MSG_STARTS_WITH_WRONG_WORD =
         
     | 
| 
      
 32 
     | 
    
         
            +
                      'Description should be started with %<suggestion>s instead of `This cop ...`.'
         
     | 
| 
      
 33 
     | 
    
         
            +
                    MSG_STARTS_WITH_EMPTY_COMMENT_LINE =
         
     | 
| 
      
 34 
     | 
    
         
            +
                      'Description should not start with an empty comment line.'
         
     | 
| 
       25 
35 
     | 
    
         | 
| 
       26 
36 
     | 
    
         
             
                    SPECIAL_WORDS = %w[is can could should will would must may].freeze
         
     | 
| 
       27 
37 
     | 
    
         
             
                    COP_DESC_OFFENSE_REGEX =
         
     | 
| 
       28 
38 
     | 
    
         
             
                      /^\s+# This cop (?<special>#{SPECIAL_WORDS.join('|')})?\s*(?<word>.+?) .*/.freeze
         
     | 
| 
       29 
39 
     | 
    
         
             
                    REPLACEMENT_REGEX = /^\s+# This cop (#{SPECIAL_WORDS.join('|')})?\s*(.+?) /.freeze
         
     | 
| 
      
 40 
     | 
    
         
            +
                    EMPTY_COMMENT_LINE_REGEX = /\A\s*#\s*\n\z/.freeze
         
     | 
| 
       30 
41 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                    # rubocop:disable Metrics/CyclomaticComplexity
         
     | 
| 
       32 
42 
     | 
    
         
             
                    def on_class(node)
         
     | 
| 
       33 
43 
     | 
    
         
             
                      return unless (module_node = node.parent) && node.parent_class
         
     | 
| 
       34 
44 
     | 
    
         | 
| 
       35 
45 
     | 
    
         
             
                      description_beginning = first_comment_line(module_node)
         
     | 
| 
       36 
46 
     | 
    
         
             
                      return unless description_beginning
         
     | 
| 
       37 
47 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                       
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
      
 48 
     | 
    
         
            +
                      if description_beginning.match?(EMPTY_COMMENT_LINE_REGEX)
         
     | 
| 
      
 49 
     | 
    
         
            +
                        register_offense_for_empty_comment_line(module_node, description_beginning)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      else
         
     | 
| 
      
 51 
     | 
    
         
            +
                        start_with_subject = description_beginning.match(COP_DESC_OFFENSE_REGEX)
         
     | 
| 
      
 52 
     | 
    
         
            +
                        return unless start_with_subject
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                        register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
         
     | 
| 
      
 55 
     | 
    
         
            +
                      end
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                    private
         
     | 
| 
       40 
59 
     | 
    
         | 
| 
      
 60 
     | 
    
         
            +
                    def register_offense_for_empty_comment_line(module_node, description_beginning)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      range = range(module_node, description_beginning)
         
     | 
| 
      
 62 
     | 
    
         
            +
                      add_offense(range, message: MSG_STARTS_WITH_EMPTY_COMMENT_LINE) do |corrector|
         
     | 
| 
      
 63 
     | 
    
         
            +
                        corrector.remove(range)
         
     | 
| 
      
 64 
     | 
    
         
            +
                      end
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                    def register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
         
     | 
| 
       41 
68 
     | 
    
         
             
                      suggestion = start_with_subject['word']&.capitalize
         
     | 
| 
       42 
69 
     | 
    
         
             
                      range = range(module_node, description_beginning)
         
     | 
| 
       43 
70 
     | 
    
         
             
                      suggestion_for_message = suggestion_for_message(suggestion, start_with_subject)
         
     | 
| 
       44 
     | 
    
         
            -
                      message = format( 
     | 
| 
      
 71 
     | 
    
         
            +
                      message = format(MSG_STARTS_WITH_WRONG_WORD, suggestion: suggestion_for_message)
         
     | 
| 
       45 
72 
     | 
    
         | 
| 
       46 
73 
     | 
    
         
             
                      add_offense(range, message: message) do |corrector|
         
     | 
| 
       47 
74 
     | 
    
         
             
                        if suggestion && !start_with_subject['special']
         
     | 
| 
         @@ -49,9 +76,6 @@ module RuboCop 
     | 
|
| 
       49 
76 
     | 
    
         
             
                        end
         
     | 
| 
       50 
77 
     | 
    
         
             
                      end
         
     | 
| 
       51 
78 
     | 
    
         
             
                    end
         
     | 
| 
       52 
     | 
    
         
            -
                    # rubocop:enable Metrics/CyclomaticComplexity
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                    private
         
     | 
| 
       55 
79 
     | 
    
         | 
| 
       56 
80 
     | 
    
         
             
                    def replace_with_suggestion(corrector, range, suggestion, description_beginning)
         
     | 
| 
       57 
81 
     | 
    
         
             
                      replacement = description_beginning.gsub(REPLACEMENT_REGEX, "#{suggestion} ")
         
     | 
| 
         @@ -59,12 +59,12 @@ module RuboCop 
     | 
|
| 
       59 
59 
     | 
    
         
             
                    def method_directives(node)
         
     | 
| 
       60 
60 
     | 
    
         
             
                      comments = processed_source.ast_with_comments[node]
         
     | 
| 
       61 
61 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
                      comments. 
     | 
| 
      
 62 
     | 
    
         
            +
                      comments.filter_map do |comment|
         
     | 
| 
       63 
63 
     | 
    
         
             
                        match = comment.text.match(REGEXP)
         
     | 
| 
       64 
64 
     | 
    
         
             
                        next unless match
         
     | 
| 
       65 
65 
     | 
    
         | 
| 
       66 
66 
     | 
    
         
             
                        { node: comment, method_name: match[:method_name], args: match[:args] }
         
     | 
| 
       67 
     | 
    
         
            -
                      end 
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
       68 
68 
     | 
    
         
             
                    end
         
     | 
| 
       69 
69 
     | 
    
         | 
| 
       70 
70 
     | 
    
         
             
                    def too_many_directives(node)
         
     | 
| 
         @@ -117,11 +117,11 @@ module RuboCop 
     | 
|
| 
       117 
117 
     | 
    
         
             
                    def add_newline?(node)
         
     | 
| 
       118 
118 
     | 
    
         
             
                      # Determine if a blank line should be inserted before the new directive
         
     | 
| 
       119 
119 
     | 
    
         
             
                      # in order to spread out pattern matchers
         
     | 
| 
       120 
     | 
    
         
            -
                      return if node.sibling_index&.zero?
         
     | 
| 
       121 
     | 
    
         
            -
                      return unless node.parent
         
     | 
| 
      
 120 
     | 
    
         
            +
                      return false if node.sibling_index&.zero?
         
     | 
| 
      
 121 
     | 
    
         
            +
                      return false unless node.parent
         
     | 
| 
       122 
122 
     | 
    
         | 
| 
       123 
123 
     | 
    
         
             
                      prev_sibling = node.parent.child_nodes[node.sibling_index - 1]
         
     | 
| 
       124 
     | 
    
         
            -
                      return unless prev_sibling && pattern_matcher?(prev_sibling)
         
     | 
| 
      
 124 
     | 
    
         
            +
                      return false unless prev_sibling && pattern_matcher?(prev_sibling)
         
     | 
| 
       125 
125 
     | 
    
         | 
| 
       126 
126 
     | 
    
         
             
                      node.loc.line == last_line(prev_sibling) + 1
         
     | 
| 
       127 
127 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -68,6 +68,13 @@ module RuboCop 
     | 
|
| 
       68 
68 
     | 
    
         
             
                  #        - extend
         
     | 
| 
       69 
69 
     | 
    
         
             
                  # ----
         
     | 
| 
       70 
70 
     | 
    
         
             
                  #
         
     | 
| 
      
 71 
     | 
    
         
            +
                  # @safety
         
     | 
| 
      
 72 
     | 
    
         
            +
                  #   Autocorrection is unsafe because class methods and module inclusion
         
     | 
| 
      
 73 
     | 
    
         
            +
                  #   can behave differently, based on which methods or constants have
         
     | 
| 
      
 74 
     | 
    
         
            +
                  #   already been defined.
         
     | 
| 
      
 75 
     | 
    
         
            +
                  #
         
     | 
| 
      
 76 
     | 
    
         
            +
                  #   Constants will only be moved when they are assigned with literals.
         
     | 
| 
      
 77 
     | 
    
         
            +
                  #
         
     | 
| 
       71 
78 
     | 
    
         
             
                  # @example
         
     | 
| 
       72 
79 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       73 
80 
     | 
    
         
             
                  #   # Expect extend be before constant
         
     | 
| 
         @@ -3,7 +3,6 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module RuboCop
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Cop
         
     | 
| 
       5 
5 
     | 
    
         
             
                module Layout
         
     | 
| 
       6 
     | 
    
         
            -
                  #
         
     | 
| 
       7 
6 
     | 
    
         
             
                  # Checks the indentation of here document closings.
         
     | 
| 
       8 
7 
     | 
    
         
             
                  #
         
     | 
| 
       9 
8 
     | 
    
         
             
                  # @example
         
     | 
| 
         @@ -73,7 +72,7 @@ module RuboCop 
     | 
|
| 
       73 
72 
     | 
    
         
             
                    end
         
     | 
| 
       74 
73 
     | 
    
         | 
| 
       75 
74 
     | 
    
         
             
                    def argument_indentation_correct?(node)
         
     | 
| 
       76 
     | 
    
         
            -
                      return unless node.argument? || node.chained?
         
     | 
| 
      
 75 
     | 
    
         
            +
                      return false unless node.argument? || node.chained?
         
     | 
| 
       77 
76 
     | 
    
         | 
| 
       78 
77 
     | 
    
         
             
                      opening_indentation(
         
     | 
| 
       79 
78 
     | 
    
         
             
                        find_node_used_heredoc_argument(node.parent)
         
     | 
| 
         @@ -228,9 +228,9 @@ module RuboCop 
     | 
|
| 
       228 
228 
     | 
    
         
             
                    end
         
     | 
| 
       229 
229 
     | 
    
         | 
| 
       230 
230 
     | 
    
         
             
                    def find_most_bottom_of_heredoc_end(arguments)
         
     | 
| 
       231 
     | 
    
         
            -
                      arguments. 
     | 
| 
      
 231 
     | 
    
         
            +
                      arguments.filter_map do |argument|
         
     | 
| 
       232 
232 
     | 
    
         
             
                        argument.loc.heredoc_end.end_pos if argument.loc.respond_to?(:heredoc_end)
         
     | 
| 
       233 
     | 
    
         
            -
                      end. 
     | 
| 
      
 233 
     | 
    
         
            +
                      end.max
         
     | 
| 
       234 
234 
     | 
    
         
             
                    end
         
     | 
| 
       235 
235 
     | 
    
         | 
| 
       236 
236 
     | 
    
         
             
                    # Internal trailing comma helpers.
         
     | 
| 
         @@ -76,7 +76,7 @@ module RuboCop 
     | 
|
| 
       76 
76 
     | 
    
         | 
| 
       77 
77 
     | 
    
         
             
                    def autocorrect_lambda_for_tabs(corrector, range)
         
     | 
| 
       78 
78 
     | 
    
         
             
                      spaces = ' ' * configured_indentation_width
         
     | 
| 
       79 
     | 
    
         
            -
                      corrector.replace(range, range.source.gsub( 
     | 
| 
      
 79 
     | 
    
         
            +
                      corrector.replace(range, range.source.gsub("\t", spaces))
         
     | 
| 
       80 
80 
     | 
    
         
             
                    end
         
     | 
| 
       81 
81 
     | 
    
         | 
| 
       82 
82 
     | 
    
         
             
                    def autocorrect_lambda_for_spaces(corrector, range)
         
     | 
| 
         @@ -366,10 +366,10 @@ module RuboCop 
     | 
|
| 
       366 
366 
     | 
    
         
             
                    end
         
     | 
| 
       367 
367 
     | 
    
         | 
| 
       368 
368 
     | 
    
         
             
                    def starts_with_access_modifier?(body_node)
         
     | 
| 
       369 
     | 
    
         
            -
                      return unless body_node.begin_type?
         
     | 
| 
      
 369 
     | 
    
         
            +
                      return false unless body_node.begin_type?
         
     | 
| 
       370 
370 
     | 
    
         | 
| 
       371 
371 
     | 
    
         
             
                      starting_node = body_node.children.first
         
     | 
| 
       372 
     | 
    
         
            -
                      return unless starting_node
         
     | 
| 
      
 372 
     | 
    
         
            +
                      return false unless starting_node
         
     | 
| 
       373 
373 
     | 
    
         | 
| 
       374 
374 
     | 
    
         
             
                      starting_node.send_type? && starting_node.bare_access_modifier?
         
     | 
| 
       375 
375 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -99,7 +99,7 @@ module RuboCop 
     | 
|
| 
       99 
99 
     | 
    
         
             
                    def suitable_as_single_line?(node)
         
     | 
| 
       100 
100 
     | 
    
         
             
                      !comment_within?(node) &&
         
     | 
| 
       101 
101 
     | 
    
         
             
                        node.each_descendant(:if, :case, :kwbegin, :def).none? &&
         
     | 
| 
       102 
     | 
    
         
            -
                        node.each_descendant(:dstr, :str).none? 
     | 
| 
      
 102 
     | 
    
         
            +
                        node.each_descendant(:dstr, :str).none? { |n| n.heredoc? || n.value.include?("\n") } &&
         
     | 
| 
       103 
103 
     | 
    
         
             
                        node.each_descendant(:begin).none? { |b| !b.single_line? }
         
     | 
| 
       104 
104 
     | 
    
         
             
                    end
         
     | 
| 
       105 
105 
     | 
    
         | 
| 
         @@ -236,6 +236,8 @@ module RuboCop 
     | 
|
| 
       236 
236 
     | 
    
         
             
                    end
         
     | 
| 
       237 
237 
     | 
    
         | 
| 
       238 
238 
     | 
    
         
             
                    def offense(begin_pos, end_pos, msg, style_param = 'EnforcedStyle')
         
     | 
| 
      
 239 
     | 
    
         
            +
                      return if begin_pos > end_pos
         
     | 
| 
      
 240 
     | 
    
         
            +
             
     | 
| 
       239 
241 
     | 
    
         
             
                      range = range_between(begin_pos, end_pos)
         
     | 
| 
       240 
242 
     | 
    
         
             
                      add_offense(range, message: msg) do |corrector|
         
     | 
| 
       241 
243 
     | 
    
         
             
                        case range.source
         
     |