rubocop 1.50.2 → 1.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/config/default.yml +80 -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/location_line_equality_comparison.rb +3 -1
- 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 +27 -4
- 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/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -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 +9 -5
- 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 +111 -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 +130 -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/symbol_conversion.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 +57 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +30 -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/heredoc.rb +6 -2
- 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/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +10 -6
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- 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 +100 -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/style/yoda_condition.rb +4 -2
- 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 +47 -4
- 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 +231 -0
- data/lib/rubocop/lsp/runtime.rb +82 -0
- data/lib/rubocop/lsp/server.rb +66 -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: c223b2bb07266543894d986f949feb9b6b0470bb43e511e82c8cdf12e9d48872
|
|
4
|
+
data.tar.gz: a785917f1251d60ebe36a2c41680e62a4b789ff40977b1b81a07e09c562c233c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 56c5e545a2440c9994ea57547601d322f940f5dc3215d2e76fc6ef1b59b2bf0a9b73f49c370e9f6eebe1e449bcc71f0e018d8a3d6f70a40a6b585b9034d28aa0
|
|
7
|
+
data.tar.gz: 4c38b1ab3e73fc9cd1579f72331240f3eeebaad1f10ce126fe85f7f57bdba283476310104244b883d90d86c6b78fe1ad2b9ff17b6ff5eb8cc64cf0c3e341dc55
|
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.54', 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
|
@@ -30,6 +30,7 @@ AllCops:
|
|
|
30
30
|
- '**/*.rbx'
|
|
31
31
|
- '**/*.ru'
|
|
32
32
|
- '**/*.ruby'
|
|
33
|
+
- '**/*.schema'
|
|
33
34
|
- '**/*.spec'
|
|
34
35
|
- '**/*.thor'
|
|
35
36
|
- '**/*.watchr'
|
|
@@ -55,6 +56,7 @@ AllCops:
|
|
|
55
56
|
- '**/Puppetfile'
|
|
56
57
|
- '**/Rakefile'
|
|
57
58
|
- '**/rakefile'
|
|
59
|
+
- '**/Schemafile'
|
|
58
60
|
- '**/Snapfile'
|
|
59
61
|
- '**/Steepfile'
|
|
60
62
|
- '**/Thorfile'
|
|
@@ -140,7 +142,7 @@ AllCops:
|
|
|
140
142
|
# or gems.locked file. (Although the Ruby version is specified in the Gemfile
|
|
141
143
|
# or gems.rb file, RuboCop reads the final value from the lock file.) If the
|
|
142
144
|
# Ruby version is still unresolved, RuboCop will use the oldest officially
|
|
143
|
-
# supported Ruby version (currently Ruby 2.
|
|
145
|
+
# supported Ruby version (currently Ruby 2.7).
|
|
144
146
|
TargetRubyVersion: ~
|
|
145
147
|
# Determines if a notification for extension libraries should be shown when
|
|
146
148
|
# rubocop is run. Keys are the name of the extension, and values are an array
|
|
@@ -154,6 +156,7 @@ AllCops:
|
|
|
154
156
|
rubocop-rake: [rake]
|
|
155
157
|
rubocop-graphql: [graphql]
|
|
156
158
|
rubocop-capybara: [capybara]
|
|
159
|
+
rubocop-factory_bot: [factory_bot, factory_bot_rails]
|
|
157
160
|
# Enable/Disable checking the methods extended by Active Support.
|
|
158
161
|
ActiveSupportExtensionsEnabled: false
|
|
159
162
|
|
|
@@ -466,7 +469,9 @@ Layout/ClassStructure:
|
|
|
466
469
|
Description: 'Enforces a configured order of definitions within a class body.'
|
|
467
470
|
StyleGuide: '#consistent-classes'
|
|
468
471
|
Enabled: false
|
|
472
|
+
SafeAutoCorrect: false
|
|
469
473
|
VersionAdded: '0.52'
|
|
474
|
+
VersionChanged: '1.53'
|
|
470
475
|
Categories:
|
|
471
476
|
module_inclusion:
|
|
472
477
|
- include
|
|
@@ -574,6 +579,8 @@ Layout/EmptyLineBetweenDefs:
|
|
|
574
579
|
EmptyLineBetweenMethodDefs: true
|
|
575
580
|
EmptyLineBetweenClassDefs: true
|
|
576
581
|
EmptyLineBetweenModuleDefs: true
|
|
582
|
+
# `DefLikeMacros` takes the name of any macro that you want to treat like a def.
|
|
583
|
+
DefLikeMacros: []
|
|
577
584
|
# `AllowAdjacentOneLineDefs` means that single line method definitions don't
|
|
578
585
|
# need an empty line between them. `true` by default.
|
|
579
586
|
AllowAdjacentOneLineDefs: true
|
|
@@ -1529,7 +1536,6 @@ Lint/AmbiguousBlockAssociation:
|
|
|
1529
1536
|
Description: >-
|
|
1530
1537
|
Checks for ambiguous block association with method when param passed without
|
|
1531
1538
|
parentheses.
|
|
1532
|
-
StyleGuide: '#syntax'
|
|
1533
1539
|
Enabled: true
|
|
1534
1540
|
VersionAdded: '0.48'
|
|
1535
1541
|
VersionChanged: '1.13'
|
|
@@ -1987,9 +1993,16 @@ Lint/MissingSuper:
|
|
|
1987
1993
|
Checks for the presence of constructors and lifecycle callbacks
|
|
1988
1994
|
without calls to `super`.
|
|
1989
1995
|
Enabled: true
|
|
1996
|
+
AllowedParentClasses: []
|
|
1990
1997
|
VersionAdded: '0.89'
|
|
1991
1998
|
VersionChanged: '1.4'
|
|
1992
1999
|
|
|
2000
|
+
Lint/MixedCaseRange:
|
|
2001
|
+
Description: 'Checks for mixed-case character ranges since they include likely unintended characters.'
|
|
2002
|
+
Enabled: pending
|
|
2003
|
+
SafeAutoCorrect: false
|
|
2004
|
+
VersionAdded: '1.53'
|
|
2005
|
+
|
|
1993
2006
|
Lint/MixedRegexpCaptureTypes:
|
|
1994
2007
|
Description: 'Do not mix named captures and numbered captures in a Regexp literal.'
|
|
1995
2008
|
Enabled: true
|
|
@@ -2139,6 +2152,11 @@ Lint/RedundantDirGlobSort:
|
|
|
2139
2152
|
VersionChanged: '1.26'
|
|
2140
2153
|
SafeAutoCorrect: false
|
|
2141
2154
|
|
|
2155
|
+
Lint/RedundantRegexpQuantifiers:
|
|
2156
|
+
Description: 'Checks for redundant quantifiers in Regexps.'
|
|
2157
|
+
Enabled: pending
|
|
2158
|
+
VersionAdded: '1.53'
|
|
2159
|
+
|
|
2142
2160
|
Lint/RedundantRequireStatement:
|
|
2143
2161
|
Description: 'Checks for unnecessary `require` statement.'
|
|
2144
2162
|
Enabled: true
|
|
@@ -2343,6 +2361,9 @@ Lint/TopLevelReturnWithArgument:
|
|
|
2343
2361
|
Description: 'Detects top level return statements with argument.'
|
|
2344
2362
|
Enabled: true
|
|
2345
2363
|
VersionAdded: '0.89'
|
|
2364
|
+
# These codes are `eval`-ed in method and their return values may be used.
|
|
2365
|
+
Exclude:
|
|
2366
|
+
- '**/*.jb'
|
|
2346
2367
|
|
|
2347
2368
|
Lint/TrailingCommaInAttributeDeclaration:
|
|
2348
2369
|
Description: 'Checks for trailing commas in attribute declarations.'
|
|
@@ -2451,6 +2472,8 @@ Lint/UselessAssignment:
|
|
|
2451
2472
|
StyleGuide: '#underscore-unused-vars'
|
|
2452
2473
|
Enabled: true
|
|
2453
2474
|
VersionAdded: '0.11'
|
|
2475
|
+
VersionChanged: '1.51'
|
|
2476
|
+
SafeAutoCorrect: false
|
|
2454
2477
|
|
|
2455
2478
|
Lint/UselessElseWithoutRescue:
|
|
2456
2479
|
Description: 'Checks for useless `else` in `begin..end` without `rescue`.'
|
|
@@ -2478,10 +2501,9 @@ Lint/UselessRuby2Keywords:
|
|
|
2478
2501
|
Lint/UselessSetterCall:
|
|
2479
2502
|
Description: 'Checks for useless setter call to a local variable.'
|
|
2480
2503
|
Enabled: true
|
|
2481
|
-
|
|
2504
|
+
Safe: false
|
|
2482
2505
|
VersionAdded: '0.13'
|
|
2483
2506
|
VersionChanged: '1.2'
|
|
2484
|
-
Safe: false
|
|
2485
2507
|
|
|
2486
2508
|
Lint/UselessTimes:
|
|
2487
2509
|
Description: 'Checks for useless `Integer#times` calls.'
|
|
@@ -2942,7 +2964,9 @@ Naming/VariableNumber:
|
|
|
2942
2964
|
Security/CompoundHash:
|
|
2943
2965
|
Description: 'When overwriting Object#hash to combine values, prefer delegating to Array#hash over writing a custom implementation.'
|
|
2944
2966
|
Enabled: pending
|
|
2967
|
+
Safe: false
|
|
2945
2968
|
VersionAdded: '1.28'
|
|
2969
|
+
VersionChanged: '1.51'
|
|
2946
2970
|
|
|
2947
2971
|
Security/Eval:
|
|
2948
2972
|
Description: 'The use of eval represents a serious security risk.'
|
|
@@ -3355,6 +3379,7 @@ Style/CollectionCompact:
|
|
|
3355
3379
|
Safe: false
|
|
3356
3380
|
VersionAdded: '1.2'
|
|
3357
3381
|
VersionChanged: '1.3'
|
|
3382
|
+
AllowedReceivers: []
|
|
3358
3383
|
|
|
3359
3384
|
# Align with the style guide.
|
|
3360
3385
|
Style/CollectionMethods:
|
|
@@ -3515,7 +3540,9 @@ Style/DataInheritance:
|
|
|
3515
3540
|
Description: 'Checks for inheritance from Data.define.'
|
|
3516
3541
|
StyleGuide: '#no-extend-data-define'
|
|
3517
3542
|
Enabled: pending
|
|
3543
|
+
SafeAutoCorrect: false
|
|
3518
3544
|
VersionAdded: '1.49'
|
|
3545
|
+
VersionChanged: '1.51'
|
|
3519
3546
|
|
|
3520
3547
|
Style/DateTime:
|
|
3521
3548
|
Description: 'Use Time over DateTime.'
|
|
@@ -3706,6 +3733,11 @@ Style/EvenOdd:
|
|
|
3706
3733
|
VersionAdded: '0.12'
|
|
3707
3734
|
VersionChanged: '0.29'
|
|
3708
3735
|
|
|
3736
|
+
Style/ExactRegexpMatch:
|
|
3737
|
+
Description: 'Checks for exact regexp match inside Regexp literals.'
|
|
3738
|
+
Enabled: pending
|
|
3739
|
+
VersionAdded: '1.51'
|
|
3740
|
+
|
|
3709
3741
|
Style/ExpandPathArguments:
|
|
3710
3742
|
Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`."
|
|
3711
3743
|
Enabled: true
|
|
@@ -4092,8 +4124,6 @@ Style/InvertibleUnlessCondition:
|
|
|
4092
4124
|
# :blank?: :present?
|
|
4093
4125
|
# :include?: :exclude?
|
|
4094
4126
|
# :exclude?: :include?
|
|
4095
|
-
# :one?: :many?
|
|
4096
|
-
# :many?: :one?
|
|
4097
4127
|
|
|
4098
4128
|
Style/IpAddresses:
|
|
4099
4129
|
Description: "Don't include literal IP addresses in code."
|
|
@@ -4370,6 +4400,7 @@ Style/MultipleComparison:
|
|
|
4370
4400
|
VersionAdded: '0.49'
|
|
4371
4401
|
VersionChanged: '1.1'
|
|
4372
4402
|
AllowMethodComparison: true
|
|
4403
|
+
ComparisonsThreshold: 2
|
|
4373
4404
|
|
|
4374
4405
|
Style/MutableConstant:
|
|
4375
4406
|
Description: 'Do not assign mutable objects to constants.'
|
|
@@ -4624,7 +4655,9 @@ Style/OpenStructUse:
|
|
|
4624
4655
|
- https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
|
|
4625
4656
|
|
|
4626
4657
|
Enabled: pending
|
|
4658
|
+
Safe: false
|
|
4627
4659
|
VersionAdded: '1.23'
|
|
4660
|
+
VersionChanged: '1.51'
|
|
4628
4661
|
|
|
4629
4662
|
Style/OperatorMethodCall:
|
|
4630
4663
|
Description: 'Checks for redundant dot before operator method call.'
|
|
@@ -4790,6 +4823,11 @@ Style/RedundantArgument:
|
|
|
4790
4823
|
# String#chomp!
|
|
4791
4824
|
chomp!: "\n"
|
|
4792
4825
|
|
|
4826
|
+
Style/RedundantArrayConstructor:
|
|
4827
|
+
Description: 'Checks for the instantiation of array using redundant `Array` constructor.'
|
|
4828
|
+
Enabled: pending
|
|
4829
|
+
VersionAdded: '1.52'
|
|
4830
|
+
|
|
4793
4831
|
Style/RedundantAssignment:
|
|
4794
4832
|
Description: 'Checks for redundant assignment before returning.'
|
|
4795
4833
|
Enabled: true
|
|
@@ -4822,6 +4860,11 @@ Style/RedundantConstantBase:
|
|
|
4822
4860
|
Enabled: pending
|
|
4823
4861
|
VersionAdded: '1.40'
|
|
4824
4862
|
|
|
4863
|
+
Style/RedundantCurrentDirectoryInPath:
|
|
4864
|
+
Description: 'Checks for uses a redundant current directory in path.'
|
|
4865
|
+
Enabled: pending
|
|
4866
|
+
VersionAdded: '1.53'
|
|
4867
|
+
|
|
4825
4868
|
Style/RedundantDoubleSplatHashBraces:
|
|
4826
4869
|
Description: 'Checks for redundant uses of double splat hash braces.'
|
|
4827
4870
|
Enabled: pending
|
|
@@ -4861,6 +4904,13 @@ Style/RedundantFileExtensionInRequire:
|
|
|
4861
4904
|
Enabled: true
|
|
4862
4905
|
VersionAdded: '0.88'
|
|
4863
4906
|
|
|
4907
|
+
Style/RedundantFilterChain:
|
|
4908
|
+
Description: >-
|
|
4909
|
+
Identifies usages of `any?`, `empty?`, `none?` or `one?` predicate methods chained to
|
|
4910
|
+
`select`/`filter`/`find_all` and change them to use predicate method instead.
|
|
4911
|
+
Enabled: pending
|
|
4912
|
+
VersionAdded: '1.52'
|
|
4913
|
+
|
|
4864
4914
|
Style/RedundantFreeze:
|
|
4865
4915
|
Description: "Checks usages of Object#freeze on immutable objects."
|
|
4866
4916
|
Enabled: true
|
|
@@ -4903,11 +4953,21 @@ Style/RedundantPercentQ:
|
|
|
4903
4953
|
Enabled: true
|
|
4904
4954
|
VersionAdded: '0.76'
|
|
4905
4955
|
|
|
4956
|
+
Style/RedundantRegexpArgument:
|
|
4957
|
+
Description: 'Identifies places where argument can be replaced from a deterministic regexp to a string.'
|
|
4958
|
+
Enabled: pending
|
|
4959
|
+
VersionAdded: '1.53'
|
|
4960
|
+
|
|
4906
4961
|
Style/RedundantRegexpCharacterClass:
|
|
4907
4962
|
Description: 'Checks for unnecessary single-element Regexp character classes.'
|
|
4908
4963
|
Enabled: true
|
|
4909
4964
|
VersionAdded: '0.85'
|
|
4910
4965
|
|
|
4966
|
+
Style/RedundantRegexpConstructor:
|
|
4967
|
+
Description: 'Checks for the instantiation of regexp using redundant `Regexp.new` or `Regexp.compile`.'
|
|
4968
|
+
Enabled: pending
|
|
4969
|
+
VersionAdded: '1.52'
|
|
4970
|
+
|
|
4911
4971
|
Style/RedundantRegexpEscape:
|
|
4912
4972
|
Description: 'Checks for redundant escapes in Regexps.'
|
|
4913
4973
|
Enabled: true
|
|
@@ -5010,6 +5070,15 @@ Style/ReturnNil:
|
|
|
5010
5070
|
- return_nil
|
|
5011
5071
|
VersionAdded: '0.50'
|
|
5012
5072
|
|
|
5073
|
+
Style/ReturnNilInPredicateMethodDefinition:
|
|
5074
|
+
Description: 'Checks if uses of `return` or `return nil` in predicate method definition.'
|
|
5075
|
+
StyleGuide: '#bool-methods-qmark'
|
|
5076
|
+
Enabled: pending
|
|
5077
|
+
SafeAutoCorrect: false
|
|
5078
|
+
AllowedMethods: []
|
|
5079
|
+
AllowedPatterns: []
|
|
5080
|
+
VersionAdded: '1.53'
|
|
5081
|
+
|
|
5013
5082
|
Style/SafeNavigation:
|
|
5014
5083
|
Description: >-
|
|
5015
5084
|
Transforms usages of a method call safeguarded by
|
|
@@ -5494,6 +5563,11 @@ Style/WordArray:
|
|
|
5494
5563
|
# The regular expression `WordRegex` decides what is considered a word.
|
|
5495
5564
|
WordRegex: !ruby/regexp '/\A(?:\p{Word}|\p{Word}-\p{Word}|\n|\t)+\z/'
|
|
5496
5565
|
|
|
5566
|
+
Style/YAMLFileRead:
|
|
5567
|
+
Description: 'Checks for the use of `YAML.load`, `YAML.safe_load`, and `YAML.parse` with `File.read` argument.'
|
|
5568
|
+
Enabled: pending
|
|
5569
|
+
VersionAdded: '1.53'
|
|
5570
|
+
|
|
5497
5571
|
Style/YodaCondition:
|
|
5498
5572
|
Description: 'Forbid or enforce yoda conditions.'
|
|
5499
5573
|
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} ")
|
|
@@ -51,7 +51,9 @@ module RuboCop
|
|
|
51
51
|
|
|
52
52
|
def extract_receiver(node)
|
|
53
53
|
receiver = node.receiver
|
|
54
|
-
|
|
54
|
+
if receiver.send_type? && (receiver.method?(:loc) || receiver.method?(:source_range))
|
|
55
|
+
receiver = receiver.receiver
|
|
56
|
+
end
|
|
55
57
|
receiver.source
|
|
56
58
|
end
|
|
57
59
|
end
|
|
@@ -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)
|