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
|