rubocop 1.31.2 → 1.34.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +74 -16
  4. data/config/obsoletion.yml +23 -1
  5. data/lib/rubocop/cache_config.rb +29 -0
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  7. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +53 -15
  9. data/lib/rubocop/cli.rb +1 -0
  10. data/lib/rubocop/config.rb +1 -1
  11. data/lib/rubocop/config_finder.rb +68 -0
  12. data/lib/rubocop/config_loader.rb +12 -40
  13. data/lib/rubocop/config_loader_resolver.rb +1 -5
  14. data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
  15. data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
  16. data/lib/rubocop/config_obsoletion.rb +7 -2
  17. data/lib/rubocop/cop/cop.rb +1 -1
  18. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +28 -0
  19. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +61 -0
  20. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +7 -1
  21. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  22. data/lib/rubocop/cop/layout/block_end_newline.rb +33 -5
  23. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -1
  24. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +57 -13
  25. data/lib/rubocop/cop/layout/line_length.rb +2 -0
  26. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  27. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -1
  28. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
  29. data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
  30. data/lib/rubocop/cop/legacy/corrector.rb +1 -1
  31. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +26 -6
  32. data/lib/rubocop/cop/lint/debugger.rb +26 -16
  33. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +10 -4
  34. data/lib/rubocop/cop/lint/empty_conditional_body.rb +65 -1
  35. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +55 -24
  36. data/lib/rubocop/cop/lint/number_conversion.rb +28 -6
  37. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +7 -0
  38. data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
  39. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +35 -1
  40. data/lib/rubocop/cop/lint/shadowed_exception.rb +15 -0
  41. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +9 -1
  42. data/lib/rubocop/cop/metrics/abc_size.rb +3 -1
  43. data/lib/rubocop/cop/metrics/block_length.rb +6 -6
  44. data/lib/rubocop/cop/metrics/method_length.rb +8 -7
  45. data/lib/rubocop/cop/mixin/allowed_methods.rb +15 -1
  46. data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -1
  47. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -0
  48. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  49. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
  50. data/lib/rubocop/cop/mixin/method_complexity.rb +4 -9
  51. data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
  52. data/lib/rubocop/cop/mixin/range_help.rb +2 -2
  53. data/lib/rubocop/cop/naming/predicate_name.rb +30 -1
  54. data/lib/rubocop/cop/style/block_delimiters.rb +26 -7
  55. data/lib/rubocop/cop/style/class_and_module_children.rb +4 -4
  56. data/lib/rubocop/cop/style/class_equality_comparison.rb +50 -3
  57. data/lib/rubocop/cop/style/double_negation.rb +2 -0
  58. data/lib/rubocop/cop/style/empty_else.rb +37 -0
  59. data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
  60. data/lib/rubocop/cop/style/fetch_env_var.rb +10 -177
  61. data/lib/rubocop/cop/style/format_string_token.rb +25 -6
  62. data/lib/rubocop/cop/style/hash_except.rb +0 -4
  63. data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
  64. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  65. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -1
  66. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -7
  67. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +19 -2
  68. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -0
  69. data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
  70. data/lib/rubocop/cop/style/numeric_predicate.rb +43 -9
  71. data/lib/rubocop/cop/style/redundant_condition.rb +19 -4
  72. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -22
  73. data/lib/rubocop/cop/style/redundant_sort.rb +21 -6
  74. data/lib/rubocop/cop/style/semicolon.rb +27 -3
  75. data/lib/rubocop/cop/style/sole_nested_conditional.rb +14 -3
  76. data/lib/rubocop/cop/style/symbol_array.rb +2 -3
  77. data/lib/rubocop/cop/style/symbol_proc.rb +40 -7
  78. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -13
  79. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -0
  80. data/lib/rubocop/cop/style/trivial_accessors.rb +3 -0
  81. data/lib/rubocop/cop/style/word_array.rb +2 -3
  82. data/lib/rubocop/ext/range.rb +15 -0
  83. data/lib/rubocop/feature_loader.rb +88 -0
  84. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  85. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  86. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  87. data/lib/rubocop/formatter/markdown_formatter.rb +1 -1
  88. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  89. data/lib/rubocop/options.rb +3 -6
  90. data/lib/rubocop/result_cache.rb +22 -20
  91. data/lib/rubocop/rspec/shared_contexts.rb +14 -14
  92. data/lib/rubocop/rspec/support.rb +14 -0
  93. data/lib/rubocop/runner.rb +4 -0
  94. data/lib/rubocop/server/cache.rb +33 -1
  95. data/lib/rubocop/server/cli.rb +19 -2
  96. data/lib/rubocop/server/client_command/base.rb +1 -1
  97. data/lib/rubocop/version.rb +1 -1
  98. data/lib/rubocop.rb +5 -1
  99. metadata +16 -9
  100. data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 998eb88b2df9c70d2b432d79cd43901b7e72d33714c2a1ac1e1ebf3f64d75b85
4
- data.tar.gz: 335fd1c15204af498ebee7200f2958902ccfd96923f9530b589517a857967a72
3
+ metadata.gz: d1c7a1f010764e941e11b523804a06d0fa77002769d763a4b1de81b459808c98
4
+ data.tar.gz: 28014c651859698a9a8fbdc122ba93159095f8a3182ac8bed497fbd9c2362c8e
5
5
  SHA512:
6
- metadata.gz: ceda90af46b2317f03cc4a86ea8aba7c63a96f12d55d6bea533ae2537d68bdc75a647f2d2a1f5103c1799f2dda6ec0f923351891050915a237919df241d39e1e
7
- data.tar.gz: 8a0c5273cf612ca4717d619ce33b37dc2206beb4c6d247c3b501a67ec364861e18c24878b513c37b67e499084162cb70ab618e6e090f7876fda8da37c93d45d1
6
+ metadata.gz: 9cf155f34f4e1a5520a03668455234518417a154029bafa1f8ee43713fd83f3d1745267abff56fcb487ad8254653cf55bb3d902f93eef8cac5f31fc01430d2f9
7
+ data.tar.gz: 0f5349bb191f7a321136cfe349497b2e3edb847849039cc4d6a9b520332388cf2538e62ec65ab70fc8572dac8d354d276b8a77674562e7ddd54cefaa44a317d4
data/README.md CHANGED
@@ -46,14 +46,14 @@ If you'd rather install RuboCop using `bundler`, add a line for it in your `Gemf
46
46
  gem 'rubocop', require: false
47
47
  ```
48
48
 
49
- RuboCop is stable between major versions, both in terms of API and cop configuration.
49
+ RuboCop is stable between minor versions, both in terms of API and cop configuration.
50
50
  We aim to ease the maintenance of RuboCop extensions and the upgrades between RuboCop
51
51
  releases. All big changes are reserved for major releases.
52
52
  To prevent an unwanted RuboCop update you might want to use a conservative version lock
53
53
  in your `Gemfile`:
54
54
 
55
55
  ```rb
56
- gem 'rubocop', '~> 1.31', require: false
56
+ gem 'rubocop', '~> 1.34', require: false
57
57
  ```
58
58
 
59
59
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
data/config/default.yml CHANGED
@@ -977,6 +977,11 @@ Layout/LineContinuationLeadingSpace:
977
977
  AutoCorrect: false
978
978
  SafeAutoCorrect: false
979
979
  VersionAdded: '1.31'
980
+ VersionChanged: '1.32'
981
+ EnforcedStyle: trailing
982
+ SupportedStyles:
983
+ - leading
984
+ - trailing
980
985
 
981
986
  Layout/LineContinuationSpacing:
982
987
  Description: 'Checks the spacing in front of backslash in line continuations.'
@@ -1153,6 +1158,13 @@ Layout/MultilineMethodDefinitionBraceLayout:
1153
1158
  - new_line
1154
1159
  - same_line
1155
1160
 
1161
+ Layout/MultilineMethodParameterLineBreaks:
1162
+ Description: >-
1163
+ Checks that each parameter in a multi-line method definition
1164
+ starts on a separate line.
1165
+ Enabled: false
1166
+ VersionAdded: '1.32'
1167
+
1156
1168
  Layout/MultilineOperationIndentation:
1157
1169
  Description: >-
1158
1170
  Checks indentation of binary operations that span more than
@@ -1490,7 +1502,9 @@ Lint/AmbiguousBlockAssociation:
1490
1502
  Enabled: true
1491
1503
  VersionAdded: '0.48'
1492
1504
  VersionChanged: '1.13'
1493
- IgnoredMethods: []
1505
+ AllowedMethods: []
1506
+ AllowedPatterns: []
1507
+ IgnoredMethods: [] # deprecated
1494
1508
 
1495
1509
  Lint/AmbiguousOperator:
1496
1510
  Description: >-
@@ -1590,6 +1604,7 @@ Lint/Debugger:
1590
1604
  # a user's configuration, but are otherwise not significant.
1591
1605
  Kernel:
1592
1606
  - binding.irb
1607
+ - Kernel.binding.irb
1593
1608
  Byebug:
1594
1609
  - byebug
1595
1610
  - remote_byebug
@@ -1607,6 +1622,9 @@ Lint/Debugger:
1607
1622
  - binding.pry
1608
1623
  - binding.remote_pry
1609
1624
  - binding.pry_remote
1625
+ - Kernel.binding.pry
1626
+ - Kernel.binding.remote_pry
1627
+ - Kernel.binding.pry_remote
1610
1628
  - Pry.rescue
1611
1629
  Rails:
1612
1630
  - debugger
@@ -1739,8 +1757,10 @@ Lint/EmptyClass:
1739
1757
  Lint/EmptyConditionalBody:
1740
1758
  Description: 'Checks for the presence of `if`, `elsif` and `unless` branches without a body.'
1741
1759
  Enabled: true
1760
+ SafeAutoCorrect: false
1742
1761
  AllowComments: true
1743
1762
  VersionAdded: '0.89'
1763
+ VersionChanged: '1.34'
1744
1764
 
1745
1765
  Lint/EmptyEnsure:
1746
1766
  Description: 'Checks for empty ensure block.'
@@ -1958,6 +1978,7 @@ Lint/NoReturnInBeginEndBlocks:
1958
1978
 
1959
1979
  Lint/NonAtomicFileOperation:
1960
1980
  Description: Checks for non-atomic file operations.
1981
+ StyleGuide: '#atomic-file-operations'
1961
1982
  Enabled: pending
1962
1983
  VersionAdded: '1.31'
1963
1984
  SafeAutoCorrect: false
@@ -1979,7 +2000,9 @@ Lint/NumberConversion:
1979
2000
  VersionAdded: '0.53'
1980
2001
  VersionChanged: '1.1'
1981
2002
  SafeAutoCorrect: false
1982
- IgnoredMethods: []
2003
+ AllowedMethods: []
2004
+ AllowedPatterns: []
2005
+ IgnoredMethods: [] # deprecated
1983
2006
  IgnoredClasses:
1984
2007
  - Time
1985
2008
  - DateTime
@@ -2128,6 +2151,11 @@ Lint/RequireParentheses:
2128
2151
  Enabled: true
2129
2152
  VersionAdded: '0.18'
2130
2153
 
2154
+ Lint/RequireRangeParentheses:
2155
+ Description: 'Checks that a range literal is enclosed in parentheses when the end of the range is at a line break.'
2156
+ Enabled: pending
2157
+ VersionAdded: '1.32'
2158
+
2131
2159
  Lint/RequireRelativeSelfPath:
2132
2160
  Description: 'Checks for uses a file requiring itself with `require_relative`.'
2133
2161
  Enabled: pending
@@ -2426,7 +2454,9 @@ Metrics/AbcSize:
2426
2454
  VersionChanged: '1.5'
2427
2455
  # The ABC size is a calculated magnitude, so this number can be an Integer or
2428
2456
  # a Float.
2429
- IgnoredMethods: []
2457
+ AllowedMethods: []
2458
+ AllowedPatterns: []
2459
+ IgnoredMethods: [] # deprecated
2430
2460
  CountRepeatedAttributes: true
2431
2461
  Max: 17
2432
2462
 
@@ -2439,10 +2469,12 @@ Metrics/BlockLength:
2439
2469
  Max: 25
2440
2470
  CountAsOne: []
2441
2471
  ExcludedMethods: [] # deprecated, retained for backwards compatibility
2442
- IgnoredMethods:
2472
+ AllowedMethods:
2443
2473
  # By default, exclude the `#refine` method, as it tends to have larger
2444
2474
  # associated blocks.
2445
2475
  - refine
2476
+ AllowedPatterns: []
2477
+ IgnoredMethods: [] # deprecated
2446
2478
  Exclude:
2447
2479
  - '**/*.gemspec'
2448
2480
 
@@ -2472,7 +2504,9 @@ Metrics/CyclomaticComplexity:
2472
2504
  Enabled: true
2473
2505
  VersionAdded: '0.25'
2474
2506
  VersionChanged: '0.81'
2475
- IgnoredMethods: []
2507
+ AllowedMethods: []
2508
+ AllowedPatterns: []
2509
+ IgnoredMethods: [] # deprecated
2476
2510
  Max: 7
2477
2511
 
2478
2512
  Metrics/MethodLength:
@@ -2485,7 +2519,9 @@ Metrics/MethodLength:
2485
2519
  Max: 10
2486
2520
  CountAsOne: []
2487
2521
  ExcludedMethods: [] # deprecated, retained for backwards compatibility
2488
- IgnoredMethods: []
2522
+ AllowedMethods: []
2523
+ AllowedPatterns: []
2524
+ IgnoredMethods: [] # deprecated
2489
2525
 
2490
2526
  Metrics/ModuleLength:
2491
2527
  Description: 'Avoid modules longer than 100 lines of code.'
@@ -2513,7 +2549,9 @@ Metrics/PerceivedComplexity:
2513
2549
  Enabled: true
2514
2550
  VersionAdded: '0.25'
2515
2551
  VersionChanged: '0.81'
2516
- IgnoredMethods: []
2552
+ AllowedMethods: []
2553
+ AllowedPatterns: []
2554
+ IgnoredMethods: [] # deprecated
2517
2555
  Max: 8
2518
2556
 
2519
2557
  ################## Migration #############################
@@ -3044,7 +3082,7 @@ Style/BlockDelimiters:
3044
3082
  # This looks at the usage of a block's method to determine its type (e.g. is
3045
3083
  # the result of a `map` assigned to a variable or passed to another
3046
3084
  # method) but exceptions are permitted in the `ProceduralMethods`,
3047
- # `FunctionalMethods` and `IgnoredMethods` sections below.
3085
+ # `FunctionalMethods` and `AllowedMethods` sections below.
3048
3086
  - semantic
3049
3087
  # The `braces_for_chaining` style enforces braces around single line blocks
3050
3088
  # and do..end around multi-line blocks, except for multi-line blocks whose
@@ -3085,7 +3123,7 @@ Style/BlockDelimiters:
3085
3123
  - let!
3086
3124
  - subject
3087
3125
  - watch
3088
- IgnoredMethods:
3126
+ AllowedMethods:
3089
3127
  # Methods that can be either procedural or functional and cannot be
3090
3128
  # categorised from their usage alone, e.g.
3091
3129
  #
@@ -3102,6 +3140,8 @@ Style/BlockDelimiters:
3102
3140
  - lambda
3103
3141
  - proc
3104
3142
  - it
3143
+ AllowedPatterns: []
3144
+ IgnoredMethods: [] # deprecated
3105
3145
  # The AllowBracesOnProceduralOneLiners option is ignored unless the
3106
3146
  # EnforcedStyle is set to `semantic`. If so:
3107
3147
  #
@@ -3205,10 +3245,12 @@ Style/ClassEqualityComparison:
3205
3245
  StyleGuide: '#instance-of-vs-class-comparison'
3206
3246
  Enabled: true
3207
3247
  VersionAdded: '0.93'
3208
- IgnoredMethods:
3248
+ AllowedMethods:
3209
3249
  - ==
3210
3250
  - equal?
3211
3251
  - eql?
3252
+ AllowedPatterns: []
3253
+ IgnoredMethods: [] # deprecated
3212
3254
 
3213
3255
  Style/ClassMethods:
3214
3256
  Description: 'Use self when defining module/class methods.'
@@ -3495,6 +3537,12 @@ Style/EmptyElse:
3495
3537
  - empty
3496
3538
  - nil
3497
3539
  - both
3540
+ AllowComments: false
3541
+
3542
+ Style/EmptyHeredoc:
3543
+ Description: 'Checks for using empty heredoc to reduce redundancy.'
3544
+ Enabled: pending
3545
+ VersionAdded: '1.32'
3498
3546
 
3499
3547
  Style/EmptyLambdaParameter:
3500
3548
  Description: 'Omit parens for empty lambda parameters.'
@@ -3664,7 +3712,9 @@ Style/FormatStringToken:
3664
3712
  MaxUnannotatedPlaceholdersAllowed: 1
3665
3713
  VersionAdded: '0.49'
3666
3714
  VersionChanged: '1.0'
3667
- IgnoredMethods: []
3715
+ AllowedMethods: []
3716
+ AllowedPatterns: []
3717
+ IgnoredMethods: [] # deprecated
3668
3718
 
3669
3719
  Style/FrozenStringLiteralComment:
3670
3720
  Description: >-
@@ -3983,7 +4033,8 @@ Style/MethodCallWithArgsParentheses:
3983
4033
  VersionAdded: '0.47'
3984
4034
  VersionChanged: '1.7'
3985
4035
  IgnoreMacros: true
3986
- IgnoredMethods: []
4036
+ AllowedMethods: []
4037
+ IgnoredMethods: [] # deprecated
3987
4038
  AllowedPatterns: []
3988
4039
  IgnoredPatterns: [] # deprecated
3989
4040
  IncludedMacros: []
@@ -4000,7 +4051,9 @@ Style/MethodCallWithoutArgsParentheses:
4000
4051
  Description: 'Do not use parentheses for method calls with no arguments.'
4001
4052
  StyleGuide: '#method-invocation-parens'
4002
4053
  Enabled: true
4003
- IgnoredMethods: []
4054
+ AllowedMethods: []
4055
+ AllowedPatterns: []
4056
+ IgnoredMethods: [] # deprecated
4004
4057
  VersionAdded: '0.47'
4005
4058
  VersionChanged: '0.55'
4006
4059
 
@@ -4352,6 +4405,7 @@ Style/NumericLiterals:
4352
4405
  Strict: false
4353
4406
  # You can specify allowed numbers. (e.g. port number 3000, 8080, and etc)
4354
4407
  AllowedNumbers: []
4408
+ AllowedPatterns: []
4355
4409
 
4356
4410
  Style/NumericPredicate:
4357
4411
  Description: >-
@@ -4370,7 +4424,9 @@ Style/NumericPredicate:
4370
4424
  SupportedStyles:
4371
4425
  - predicate
4372
4426
  - comparison
4373
- IgnoredMethods: []
4427
+ AllowedMethods: []
4428
+ AllowedPatterns: []
4429
+ IgnoredMethods: [] # deprecated
4374
4430
  # Exclude RSpec specs because assertions like `expect(1).to be > 0` cause
4375
4431
  # false positives.
4376
4432
  Exclude:
@@ -5007,11 +5063,13 @@ Style/SymbolProc:
5007
5063
  VersionAdded: '0.26'
5008
5064
  VersionChanged: '1.28'
5009
5065
  AllowMethodsWithArguments: false
5010
- # A list of method names to be ignored by the check.
5066
+ # A list of method names to be always allowed by the check.
5011
5067
  # The names should be fairly unique, otherwise you'll end up ignoring lots of code.
5012
- IgnoredMethods:
5068
+ AllowedMethods:
5013
5069
  - respond_to
5014
5070
  - define_method
5071
+ AllowedPatterns: []
5072
+ IgnoredMethods: [] # deprecated
5015
5073
  AllowComments: false
5016
5074
 
5017
5075
  Style/TernaryParentheses:
@@ -187,7 +187,9 @@ changed_parameters:
187
187
  - Metrics/BlockLength
188
188
  - Metrics/MethodLength
189
189
  parameters: ExcludedMethods
190
- alternative: IgnoredMethods
190
+ alternatives:
191
+ - AllowedMethods
192
+ - AllowedPatterns
191
193
  severity: warning
192
194
  - cops: Lint/Debugger
193
195
  parameters: DebuggerReceivers
@@ -202,6 +204,26 @@ changed_parameters:
202
204
  parameters: IgnoredPatterns
203
205
  alternative: AllowedPatterns
204
206
  severity: warning
207
+ - cops:
208
+ - Lint/AmbiguousBlockAssociation
209
+ - Lint/NumberConversion
210
+ - Metrics/AbcSize
211
+ - Metrics/BlockLength
212
+ - Metrics/CyclomaticComplexity
213
+ - Metrics/MethodLength
214
+ - Metrics/PerceivedComplexity
215
+ - Style/BlockDelimiters
216
+ - Style/ClassEqualityComparison
217
+ - Style/FormatStringToken
218
+ - Style/MethodCallWithArgsParentheses
219
+ - Style/MethodCallWithoutArgsParentheses
220
+ - Style/NumericPredicate
221
+ - Style/SymbolLiteral
222
+ parameters: IgnoredMethods
223
+ alternatives:
224
+ - AllowedMethods
225
+ - AllowedPatterns
226
+ severity: warning
205
227
 
206
228
  # Enforced styles that have been removed or replaced
207
229
  changed_enforced_styles:
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # This class represents the cache config of the caching RuboCop runs.
5
+ # @api private
6
+ class CacheConfig
7
+ def self.root_dir
8
+ root = ENV.fetch('RUBOCOP_CACHE_ROOT', nil)
9
+ root ||= yield
10
+ root ||= if ENV.key?('XDG_CACHE_HOME')
11
+ # Include user ID in the path to make sure the user has write
12
+ # access.
13
+ File.join(ENV.fetch('XDG_CACHE_HOME'), Process.uid.to_s)
14
+ else
15
+ # On FreeBSD, the /home path is a symbolic link to /usr/home
16
+ # and the $HOME environment variable returns the /home path.
17
+ #
18
+ # As $HOME is a built-in environment variable, FreeBSD users
19
+ # always get a warning message.
20
+ #
21
+ # To avoid raising warn log messages on FreeBSD, we retrieve
22
+ # the real path of the home folder.
23
+ File.join(File.realpath(Dir.home), '.cache')
24
+ end
25
+
26
+ File.join(root, 'rubocop_cache')
27
+ end
28
+ end
29
+ end
@@ -98,7 +98,7 @@ module RuboCop
98
98
  def add_inheritance_from_auto_generated_file(config_file)
99
99
  file_string = " #{relative_path_to_todo_from_options_config}"
100
100
 
101
- config_file ||= ConfigLoader::DOTFILE
101
+ config_file ||= ConfigFinder::DOTFILE
102
102
 
103
103
  if File.exist?(config_file)
104
104
  files = Array(ConfigLoader.load_yaml_configuration(config_file)['inherit_from'])
@@ -113,7 +113,7 @@ module RuboCop
113
113
  write_config_file(config_file, file_string, rubocop_yml_contents)
114
114
 
115
115
  puts "Added inheritance from `#{relative_path_to_todo_from_options_config}` " \
116
- "in `#{ConfigLoader::DOTFILE}`."
116
+ "in `#{ConfigFinder::DOTFILE}`."
117
117
  end
118
118
 
119
119
  def existing_configuration(config_file)
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Generate a .rubocop.yml file in the current directory.
7
7
  # @api private
8
8
  class InitDotfile < Base
9
- DOTFILE = ConfigLoader::DOTFILE
9
+ DOTFILE = ConfigFinder::DOTFILE
10
10
 
11
11
  self.command_name = :init
12
12
 
@@ -17,20 +17,10 @@ module RuboCop
17
17
  def run
18
18
  return if skip? || extensions.none?
19
19
 
20
- puts
21
- puts 'Tip: Based on detected gems, the following ' \
22
- 'RuboCop extension libraries might be helpful:'
23
-
24
- extensions.sort.each do |extension|
25
- puts " * #{extension} (https://rubygems.org/gems/#{extension})"
26
- end
20
+ print_install_suggestions if not_installed_extensions.any?
21
+ print_load_suggestions if installed_and_not_loaded_extensions.any?
27
22
 
28
- puts
29
- puts 'You can opt out of this message by adding the following to your config ' \
30
- '(see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions ' \
31
- 'for more options):'
32
- puts ' AllCops:'
33
- puts ' SuggestExtensions: false'
23
+ print_opt_out_instruction
34
24
 
35
25
  puts if @options[:display_time]
36
26
  end
@@ -48,15 +38,63 @@ module RuboCop
48
38
  !INCLUDED_FORMATTERS.include?(current_formatter)
49
39
  end
50
40
 
41
+ def print_install_suggestions
42
+ puts
43
+ puts 'Tip: Based on detected gems, the following ' \
44
+ 'RuboCop extension libraries might be helpful:'
45
+
46
+ not_installed_extensions.sort.each do |extension|
47
+ puts " * #{extension} (https://rubygems.org/gems/#{extension})"
48
+ end
49
+ end
50
+
51
+ def print_load_suggestions
52
+ puts
53
+ puts 'The following RuboCop extension libraries are installed but not loaded in config:'
54
+
55
+ installed_and_not_loaded_extensions.sort.each do |extension|
56
+ puts " * #{extension}"
57
+ end
58
+ end
59
+
60
+ def print_opt_out_instruction
61
+ puts
62
+ puts 'You can opt out of this message by adding the following to your config ' \
63
+ '(see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions ' \
64
+ 'for more options):'
65
+ puts ' AllCops:'
66
+ puts ' SuggestExtensions: false'
67
+ end
68
+
51
69
  def current_formatter
52
70
  @options[:format] || @config_store.for_pwd.for_all_cops['DefaultFormatter'] || 'p'
53
71
  end
54
72
 
55
- def extensions
73
+ def all_extensions
56
74
  return [] unless lockfile.dependencies.any?
57
75
 
58
76
  extensions = @config_store.for_pwd.for_all_cops['SuggestExtensions'] || {}
59
- extensions.select { |_, v| (Array(v) & dependent_gems).any? }.keys - installed_gems
77
+ extensions.select { |_, v| (Array(v) & dependent_gems).any? }.keys
78
+ end
79
+
80
+ def extensions
81
+ not_installed_extensions + installed_and_not_loaded_extensions
82
+ end
83
+
84
+ def installed_extensions
85
+ all_extensions & installed_gems
86
+ end
87
+
88
+ def not_installed_extensions
89
+ all_extensions - installed_gems
90
+ end
91
+
92
+ def loaded_extensions
93
+ @config_store.for_pwd.loaded_features.to_a
94
+ end
95
+
96
+ def installed_and_not_loaded_extensions
97
+ installed_extensions - loaded_extensions
60
98
  end
61
99
 
62
100
  def lockfile
data/lib/rubocop/cli.rb CHANGED
@@ -12,6 +12,7 @@ module RuboCop
12
12
  color debug display_style_guide display_time display_only_fail_level_offenses
13
13
  display_only_failed except extra_details fail_level fix_layout format
14
14
  ignore_disable_comments lint only only_guide_cops require safe
15
+ autocorrect safe_autocorrect autocorrect_all
15
16
  ].freeze
16
17
 
17
18
  class Finished < StandardError; end
@@ -25,7 +25,7 @@ module RuboCop
25
25
  @loaded_path = loaded_path
26
26
  @for_cop = Hash.new do |h, cop|
27
27
  qualified_cop_name = Cop::Registry.qualified_cop_name(cop, loaded_path)
28
- cop_options = self[qualified_cop_name] || {}
28
+ cop_options = self[qualified_cop_name].dup || {}
29
29
  cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
30
30
  h[cop] = cop_options
31
31
  end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'file_finder'
4
+
5
+ module RuboCop
6
+ # This class has methods related to finding configuration path.
7
+ # @api private
8
+ class ConfigFinder
9
+ DOTFILE = '.rubocop.yml'
10
+ XDG_CONFIG = 'config.yml'
11
+ RUBOCOP_HOME = File.realpath(File.join(File.dirname(__FILE__), '..', '..'))
12
+ DEFAULT_FILE = File.join(RUBOCOP_HOME, 'config', 'default.yml')
13
+
14
+ class << self
15
+ include FileFinder
16
+
17
+ attr_writer :project_root
18
+
19
+ def find_config_path(target_dir)
20
+ find_project_dotfile(target_dir) || find_user_dotfile || find_user_xdg_config ||
21
+ DEFAULT_FILE
22
+ end
23
+
24
+ # Returns the path RuboCop inferred as the root of the project. No file
25
+ # searches will go past this directory.
26
+ def project_root
27
+ @project_root ||= find_project_root
28
+ end
29
+
30
+ private
31
+
32
+ def find_project_root
33
+ pwd = Dir.pwd
34
+ gems_file = find_last_file_upwards('Gemfile', pwd) || find_last_file_upwards('gems.rb', pwd)
35
+ return unless gems_file
36
+
37
+ File.dirname(gems_file)
38
+ end
39
+
40
+ def find_project_dotfile(target_dir)
41
+ find_file_upwards(DOTFILE, target_dir, project_root)
42
+ end
43
+
44
+ def find_user_dotfile
45
+ return unless ENV.key?('HOME')
46
+
47
+ file = File.join(Dir.home, DOTFILE)
48
+
49
+ return file if File.exist?(file)
50
+ end
51
+
52
+ def find_user_xdg_config
53
+ xdg_config_home = expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config'))
54
+ xdg_config = File.join(xdg_config_home, 'rubocop', XDG_CONFIG)
55
+
56
+ return xdg_config if File.exist?(xdg_config)
57
+ end
58
+
59
+ def expand_path(path)
60
+ File.expand_path(path)
61
+ rescue ArgumentError
62
+ # Could happen because HOME or ID could not be determined. Fall back on
63
+ # using the path literally in that case.
64
+ path
65
+ end
66
+ end
67
+ end
68
+ end
@@ -3,6 +3,7 @@
3
3
  require 'erb'
4
4
  require 'yaml'
5
5
  require 'pathname'
6
+ require_relative 'config_finder'
6
7
 
7
8
  module RuboCop
8
9
  # Raised when a RuboCop configuration file is not found.
@@ -15,8 +16,7 @@ module RuboCop
15
16
  # during a run of the rubocop program, if files in several
16
17
  # directories are inspected.
17
18
  class ConfigLoader
18
- DOTFILE = '.rubocop.yml'
19
- XDG_CONFIG = 'config.yml'
19
+ DOTFILE = ConfigFinder::DOTFILE
20
20
  RUBOCOP_HOME = File.realpath(File.join(File.dirname(__FILE__), '..', '..'))
21
21
  DEFAULT_FILE = File.join(RUBOCOP_HOME, 'config', 'default.yml')
22
22
 
@@ -25,7 +25,7 @@ module RuboCop
25
25
 
26
26
  attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
27
27
  :ignore_unrecognized_cops
28
- attr_writer :default_configuration, :project_root
28
+ attr_writer :default_configuration
29
29
  attr_reader :loaded_features
30
30
 
31
31
  alias debug? debug
@@ -95,8 +95,7 @@ module RuboCop
95
95
  # user's home directory is checked. If there's no .rubocop.yml
96
96
  # there either, the path to the default file is returned.
97
97
  def configuration_file_for(target_dir)
98
- find_project_dotfile(target_dir) || find_user_dotfile ||
99
- find_user_xdg_config || DEFAULT_FILE
98
+ ConfigFinder.find_config_path(target_dir)
100
99
  end
101
100
 
102
101
  def configuration_from_file(config_file, check: true)
@@ -122,7 +121,7 @@ module RuboCop
122
121
  end
123
122
 
124
123
  def add_excludes_from_files(config, config_file)
125
- exclusion_file = find_last_file_upwards(DOTFILE, config_file, project_root)
124
+ exclusion_file = find_last_file_upwards(DOTFILE, config_file, ConfigFinder.project_root)
126
125
 
127
126
  return unless exclusion_file
128
127
  return if PathUtil.relative_path(exclusion_file) == PathUtil.relative_path(config_file)
@@ -140,8 +139,14 @@ module RuboCop
140
139
 
141
140
  # Returns the path RuboCop inferred as the root of the project. No file
142
141
  # searches will go past this directory.
142
+ # @deprecated Use `RuboCop::ConfigFinder.project_root` instead.
143
143
  def project_root
144
- @project_root ||= find_project_root
144
+ warn Rainbow(<<~WARNING).yellow
145
+ `RuboCop::ConfigLoader.project_root` is deprecated and will be removed in RuboCop 2.0. \
146
+ Use `RuboCop::ConfigFinder.project_root` instead.
147
+ WARNING
148
+
149
+ ConfigFinder.project_root
145
150
  end
146
151
 
147
152
  PENDING_BANNER = <<~BANNER
@@ -187,39 +192,6 @@ module RuboCop
187
192
  File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
188
193
  end
189
194
 
190
- def find_project_dotfile(target_dir)
191
- find_file_upwards(DOTFILE, target_dir, project_root)
192
- end
193
-
194
- def find_project_root
195
- pwd = Dir.pwd
196
- gems_file = find_last_file_upwards('Gemfile', pwd) || find_last_file_upwards('gems.rb', pwd)
197
- return unless gems_file
198
-
199
- File.dirname(gems_file)
200
- end
201
-
202
- def find_user_dotfile
203
- return unless ENV.key?('HOME')
204
-
205
- file = File.join(Dir.home, DOTFILE)
206
- return file if File.exist?(file)
207
- end
208
-
209
- def find_user_xdg_config
210
- xdg_config_home = expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config'))
211
- xdg_config = File.join(xdg_config_home, 'rubocop', XDG_CONFIG)
212
- return xdg_config if File.exist?(xdg_config)
213
- end
214
-
215
- def expand_path(path)
216
- File.expand_path(path)
217
- rescue ArgumentError
218
- # Could happen because HOME or ID could not be determined. Fall back on
219
- # using the path literally in that case.
220
- path
221
- end
222
-
223
195
  def resolver
224
196
  @resolver ||= ConfigLoaderResolver.new
225
197
  end
@@ -11,11 +11,7 @@ module RuboCop
11
11
  config_dir = File.dirname(path)
12
12
  hash.delete('require').tap do |loaded_features|
13
13
  Array(loaded_features).each do |feature|
14
- if feature.start_with?('.')
15
- require(File.join(config_dir, feature))
16
- else
17
- require(feature)
18
- end
14
+ FeatureLoader.load(config_directory_path: config_dir, feature: feature)
19
15
  end
20
16
  end
21
17
  end