rubocop 1.18.3 → 1.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +46 -7
  4. data/lib/rubocop/cli.rb +18 -0
  5. data/lib/rubocop/config_loader.rb +2 -2
  6. data/lib/rubocop/config_loader_resolver.rb +21 -6
  7. data/lib/rubocop/config_validator.rb +18 -5
  8. data/lib/rubocop/cop/bundler/gem_filename.rb +103 -0
  9. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  10. data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
  11. data/lib/rubocop/cop/documentation.rb +1 -1
  12. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  13. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
  14. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
  15. data/lib/rubocop/cop/internal_affairs.rb +2 -0
  16. data/lib/rubocop/cop/layout/class_structure.rb +5 -1
  17. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -0
  18. data/lib/rubocop/cop/layout/end_alignment.rb +10 -2
  19. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
  20. data/lib/rubocop/cop/layout/hash_alignment.rb +22 -18
  21. data/lib/rubocop/cop/layout/heredoc_indentation.rb +0 -7
  22. data/lib/rubocop/cop/layout/indentation_style.rb +2 -2
  23. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  24. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +33 -14
  25. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +3 -0
  26. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +22 -9
  27. data/lib/rubocop/cop/layout/space_around_operators.rb +8 -1
  28. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
  29. data/lib/rubocop/cop/layout/space_inside_parens.rb +5 -5
  30. data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
  31. data/lib/rubocop/cop/lint/ambiguous_range.rb +105 -0
  32. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +5 -2
  33. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  34. data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -1
  35. data/lib/rubocop/cop/lint/duplicate_methods.rb +8 -5
  36. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
  37. data/lib/rubocop/cop/mixin/annotation_comment.rb +57 -34
  38. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  39. data/lib/rubocop/cop/mixin/documentation_comment.rb +5 -2
  40. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +14 -1
  41. data/lib/rubocop/cop/mixin/hash_transform_method.rb +6 -1
  42. data/lib/rubocop/cop/mixin/heredoc.rb +7 -0
  43. data/lib/rubocop/cop/mixin/percent_array.rb +13 -7
  44. data/lib/rubocop/cop/mixin/require_library.rb +59 -0
  45. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  46. data/lib/rubocop/cop/naming/inclusive_language.rb +18 -1
  47. data/lib/rubocop/cop/style/block_delimiters.rb +39 -6
  48. data/lib/rubocop/cop/style/comment_annotation.rb +25 -39
  49. data/lib/rubocop/cop/style/commented_keyword.rb +2 -1
  50. data/lib/rubocop/cop/style/conditional_assignment.rb +19 -5
  51. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
  52. data/lib/rubocop/cop/style/double_negation.rb +12 -1
  53. data/lib/rubocop/cop/style/encoding.rb +26 -15
  54. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  55. data/lib/rubocop/cop/style/explicit_block_argument.rb +32 -7
  56. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  57. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
  58. data/lib/rubocop/cop/style/hash_except.rb +4 -3
  59. data/lib/rubocop/cop/style/hash_transform_keys.rb +0 -3
  60. data/lib/rubocop/cop/style/identical_conditional_branches.rb +30 -5
  61. data/lib/rubocop/cop/style/method_def_parentheses.rb +10 -1
  62. data/lib/rubocop/cop/style/missing_else.rb +7 -0
  63. data/lib/rubocop/cop/style/mutable_constant.rb +73 -13
  64. data/lib/rubocop/cop/style/redundant_begin.rb +25 -0
  65. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -3
  66. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +83 -0
  67. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  68. data/lib/rubocop/cop/style/semicolon.rb +32 -24
  69. data/lib/rubocop/cop/style/single_line_block_params.rb +3 -1
  70. data/lib/rubocop/cop/style/single_line_methods.rb +14 -9
  71. data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -0
  72. data/lib/rubocop/cop/style/special_global_vars.rb +21 -0
  73. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -0
  74. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  75. data/lib/rubocop/cop/style/word_array.rb +23 -5
  76. data/lib/rubocop/cop/util.rb +7 -2
  77. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -1
  78. data/lib/rubocop/magic_comment.rb +44 -15
  79. data/lib/rubocop/options.rb +1 -1
  80. data/lib/rubocop/version.rb +1 -1
  81. data/lib/rubocop.rb +6 -1
  82. metadata +12 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6123e3d35feebac08e838afcff3f912fa24f7abcc71403f6368fffb346fa9bc
4
- data.tar.gz: 40f3ff08e0efc288e7a11af7016d702f743b8ab343de0c3fd045035c7ac7605f
3
+ metadata.gz: e89a054e431c4e739e8e4b0bcdc36452704f1cffd6bda1e5710241e6712161a9
4
+ data.tar.gz: 632d9503cddcb39443ad8fc8b31bd1f1576803e9490ae77d22ee06f34d40784b
5
5
  SHA512:
6
- metadata.gz: 3ac2d860eccd7ac0d655649d36f64cf52ed1587357b2ef35707a1c2ced408cf645d1a8be2dd6e660c5e338c298adef876814fdf35b22f5c71da4ec5bc830e388
7
- data.tar.gz: adab3ee6563260ced11848bc9b1c62ff2641a28a6b4aca80cb703ef9136562bbdc6a2efff4670d12dee329cc7cf5306a8c9d11106ff13d9cbf5539b5094ba388
6
+ metadata.gz: b765c92c6118f7e8e958d0787714764c392453efa450048629002a69634fe032648a6f88654afc522d9ca01b2fb2c7f70c573d6bd9a227e85168cfcbe5613091
7
+ data.tar.gz: 22d0b80509def399c10586f579f08520e47c1d03a7eab14e0c9b998d9fea0b7a477333677c0af2aed3e768bb9c9d6a30f51a88f7d9e4973acd8057389ac01357
data/README.md CHANGED
@@ -54,7 +54,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
54
54
  in your `Gemfile`:
55
55
 
56
56
  ```rb
57
- gem 'rubocop', '~> 1.18', require: false
57
+ gem 'rubocop', '~> 1.20', require: false
58
58
  ```
59
59
 
60
60
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
data/config/default.yml CHANGED
@@ -174,6 +174,20 @@ Bundler/GemComment:
174
174
  IgnoredGems: []
175
175
  OnlyFor: []
176
176
 
177
+ Bundler/GemFilename:
178
+ Description: 'Enforces the filename for managing gems.'
179
+ Enabled: true
180
+ VersionAdded: '1.20'
181
+ EnforcedStyle: 'Gemfile'
182
+ SupportedStyles:
183
+ - 'Gemfile'
184
+ - 'gems.rb'
185
+ Include:
186
+ - '**/Gemfile'
187
+ - '**/gems.rb'
188
+ - '**/Gemfile.lock'
189
+ - '**/gems.locked'
190
+
177
191
  Bundler/GemVersion:
178
192
  Description: 'Requires or forbids specifying gem versions.'
179
193
  Enabled: false
@@ -1434,6 +1448,13 @@ Lint/AmbiguousOperator:
1434
1448
  VersionAdded: '0.17'
1435
1449
  VersionChanged: '0.83'
1436
1450
 
1451
+ Lint/AmbiguousRange:
1452
+ Description: Checks for ranges with ambiguous boundaries.
1453
+ Enabled: pending
1454
+ VersionAdded: '1.19'
1455
+ SafeAutoCorrect: false
1456
+ RequireParenthesesForMethodChains: false
1457
+
1437
1458
  Lint/AmbiguousRegexpLiteral:
1438
1459
  Description: >-
1439
1460
  Checks for ambiguous regexp literals in the first argument of
@@ -1512,6 +1533,11 @@ Lint/Debugger:
1512
1533
  Capybara:
1513
1534
  - save_and_open_page
1514
1535
  - save_and_open_screenshot
1536
+ debug.rb:
1537
+ - binding.b
1538
+ - binding.break
1539
+ - Kernel.binding.b
1540
+ - Kernel.binding.break
1515
1541
  Pry:
1516
1542
  - binding.pry
1517
1543
  - binding.remote_pry
@@ -1520,6 +1546,8 @@ Lint/Debugger:
1520
1546
  Rails:
1521
1547
  - debugger
1522
1548
  - Kernel.debugger
1549
+ RubyJard:
1550
+ - jard
1523
1551
  WebConsole:
1524
1552
  - binding.console
1525
1553
 
@@ -1824,7 +1852,6 @@ Lint/MultipleComparison:
1824
1852
  Enabled: true
1825
1853
  VersionAdded: '0.47'
1826
1854
  VersionChanged: '1.1'
1827
- AllowMethodComparison: true
1828
1855
 
1829
1856
  Lint/NestedMethodDefinition:
1830
1857
  Description: 'Do not use nested method definitions.'
@@ -2557,6 +2584,7 @@ Naming/InclusiveLanguage:
2557
2584
  - denylist
2558
2585
  - block
2559
2586
  slave:
2587
+ WholeWord: true
2560
2588
  Suggestions: ['replica', 'secondary', 'follower']
2561
2589
 
2562
2590
  Naming/MemoizedInstanceVariableName:
@@ -3142,7 +3170,7 @@ Style/CommentAnnotation:
3142
3170
  StyleGuide: '#annotate-keywords'
3143
3171
  Enabled: true
3144
3172
  VersionAdded: '0.10'
3145
- VersionChanged: '1.3'
3173
+ VersionChanged: '1.20'
3146
3174
  Keywords:
3147
3175
  - TODO
3148
3176
  - FIXME
@@ -3155,8 +3183,9 @@ Style/CommentAnnotation:
3155
3183
  Style/CommentedKeyword:
3156
3184
  Description: 'Do not place comments on the same line as certain keywords.'
3157
3185
  Enabled: true
3186
+ SafeAutoCorrect: false
3158
3187
  VersionAdded: '0.51'
3159
- VersionChanged: '1.7'
3188
+ VersionChanged: '1.19'
3160
3189
 
3161
3190
  Style/ConditionalAssignment:
3162
3191
  Description: >-
@@ -3603,8 +3632,9 @@ Style/IdenticalConditionalBranches:
3603
3632
  line at the end of each branch, which can validly be moved
3604
3633
  out of the conditional.
3605
3634
  Enabled: true
3635
+ SafeAutoCorrect: false
3606
3636
  VersionAdded: '0.36'
3607
- VersionChanged: '1.16'
3637
+ VersionChanged: '1.19'
3608
3638
 
3609
3639
  Style/IfInsideElse:
3610
3640
  Description: 'Finds if nodes inside else, which can be converted to elsif.'
@@ -3929,6 +3959,7 @@ Style/MultipleComparison:
3929
3959
  Enabled: true
3930
3960
  VersionAdded: '0.49'
3931
3961
  VersionChanged: '1.1'
3962
+ AllowMethodComparison: true
3932
3963
 
3933
3964
  Style/MutableConstant:
3934
3965
  Description: 'Do not assign mutable objects to constants.'
@@ -4152,6 +4183,7 @@ Style/OptionHash:
4152
4183
  - args
4153
4184
  - params
4154
4185
  - parameters
4186
+ Allowlist: []
4155
4187
 
4156
4188
  Style/OptionalArguments:
4157
4189
  Description: >-
@@ -4404,6 +4436,11 @@ Style/RedundantSelfAssignment:
4404
4436
  Safe: false
4405
4437
  VersionAdded: '0.90'
4406
4438
 
4439
+ Style/RedundantSelfAssignmentBranch:
4440
+ Description: 'Checks for places where conditional branch makes redundant self-assignment.'
4441
+ Enabled: pending
4442
+ VersionAdded: '1.19'
4443
+
4407
4444
  Style/RedundantSort:
4408
4445
  Description: >-
4409
4446
  Use `min` instead of `sort.first`,
@@ -4575,6 +4612,7 @@ Style/SpecialGlobalVars:
4575
4612
  VersionAdded: '0.13'
4576
4613
  VersionChanged: '0.36'
4577
4614
  SafeAutoCorrect: false
4615
+ RequireEnglish: true
4578
4616
  EnforcedStyle: use_english_names
4579
4617
  SupportedStyles:
4580
4618
  - use_perl_names
@@ -4675,8 +4713,9 @@ Style/StructInheritance:
4675
4713
  Description: 'Checks for inheritance from Struct.new.'
4676
4714
  StyleGuide: '#no-extend-struct-new'
4677
4715
  Enabled: true
4716
+ SafeAutoCorrect: false
4678
4717
  VersionAdded: '0.29'
4679
- VersionChanged: '0.86'
4718
+ VersionChanged: '1.20'
4680
4719
 
4681
4720
  Style/SwapValues:
4682
4721
  Description: 'This cop enforces the use of shorthand-style swapping of 2 variables.'
@@ -4895,7 +4934,7 @@ Style/VariableInterpolation:
4895
4934
 
4896
4935
  Style/WhenThen:
4897
4936
  Description: 'Use when x then ... for one-line cases.'
4898
- StyleGuide: '#one-line-cases'
4937
+ StyleGuide: '#no-when-semicolons'
4899
4938
  Enabled: true
4900
4939
  VersionAdded: '0.9'
4901
4940
 
@@ -4919,7 +4958,7 @@ Style/WordArray:
4919
4958
  StyleGuide: '#percent-w'
4920
4959
  Enabled: true
4921
4960
  VersionAdded: '0.9'
4922
- VersionChanged: '0.36'
4961
+ VersionChanged: '1.19'
4923
4962
  EnforcedStyle: percent
4924
4963
  SupportedStyles:
4925
4964
  # percent style: %w(word1 word2)
data/lib/rubocop/cli.rb CHANGED
@@ -8,6 +8,11 @@ module RuboCop
8
8
  STATUS_OFFENSES = 1
9
9
  STATUS_ERROR = 2
10
10
  STATUS_INTERRUPTED = 128 + Signal.list['INT']
11
+ DEFAULT_PARALLEL_OPTIONS = %i[
12
+ color debug display_style_guide display_time display_only_fail_level_offenses
13
+ display_only_failed except extra_details fail_level fix_layout format
14
+ ignore_disable_comments lint only only_guide_cops require safe
15
+ ].freeze
11
16
 
12
17
  class Finished < RuntimeError; end
13
18
 
@@ -37,6 +42,7 @@ module RuboCop
37
42
  else
38
43
  act_on_options
39
44
  validate_options_vs_config
45
+ parallel_by_default!
40
46
  apply_default_formatter
41
47
  execute_runners
42
48
  end
@@ -84,6 +90,18 @@ module RuboCop
84
90
  'with AllCops: UseCache: false is not allowed.'
85
91
  end
86
92
 
93
+ def parallel_by_default!
94
+ # See https://github.com/rubocop/rubocop/pull/4537 for JRuby and Windows constraints.
95
+ return if RUBY_ENGINE != 'ruby' || RuboCop::Platform.windows?
96
+
97
+ if (@options.keys - DEFAULT_PARALLEL_OPTIONS).empty? &&
98
+ @config_store.for_pwd.for_all_cops['UseCache'] != false
99
+ puts 'Use parallel by default.' if @options[:debug]
100
+
101
+ @options[:parallel] = true
102
+ end
103
+ end
104
+
87
105
  def act_on_options
88
106
  set_options_to_config_loader
89
107
 
@@ -143,7 +143,7 @@ module RuboCop
143
143
  PENDING_BANNER = <<~BANNER
144
144
  The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
145
145
 
146
- Please also note that can also opt-in to new cops by default by adding this to your config:
146
+ Please also note that you can opt-in to new cops by default by adding this to your config:
147
147
  AllCops:
148
148
  NewCops: enable
149
149
  BANNER
@@ -161,7 +161,7 @@ module RuboCop
161
161
  def warn_pending_cop(cop)
162
162
  version = cop.metadata['VersionAdded'] || 'N/A'
163
163
 
164
- warn Rainbow("#{cop.name}: # (new in #{version})").yellow
164
+ warn Rainbow("#{cop.name}: # new in #{version}").yellow
165
165
  warn Rainbow(' Enabled: true').yellow
166
166
  end
167
167
 
@@ -108,7 +108,7 @@ module RuboCop
108
108
  result.delete(key)
109
109
  elsif merge_hashes?(base_hash, derived_hash, key)
110
110
  result[key] = merge(base_hash[key], derived_hash[key], **opts)
111
- elsif should_union?(base_hash, key, opts[:inherit_mode])
111
+ elsif should_union?(derived_hash, base_hash, opts[:inherit_mode], key)
112
112
  result[key] = base_hash[key] | derived_hash[key]
113
113
  elsif opts[:debug]
114
114
  warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
@@ -183,11 +183,26 @@ module RuboCop
183
183
  local_inherit || hash['inherit_mode'] || {}
184
184
  end
185
185
 
186
- def should_union?(base_hash, key, inherit_mode)
187
- base_hash[key].is_a?(Array) &&
188
- inherit_mode &&
189
- inherit_mode['merge'] &&
190
- inherit_mode['merge'].include?(key)
186
+ def should_union?(derived_hash, base_hash, root_mode, key)
187
+ return false unless base_hash[key].is_a?(Array)
188
+
189
+ derived_mode = derived_hash['inherit_mode']
190
+ return false if should_override?(derived_mode, key)
191
+ return true if should_merge?(derived_mode, key)
192
+
193
+ base_mode = base_hash['inherit_mode']
194
+ return false if should_override?(base_mode, key)
195
+ return true if should_merge?(base_mode, key)
196
+
197
+ should_merge?(root_mode, key)
198
+ end
199
+
200
+ def should_merge?(mode, key)
201
+ mode && mode['merge'] && mode['merge'].include?(key)
202
+ end
203
+
204
+ def should_override?(mode, key)
205
+ mode && mode['override'] && mode['override'].include?(key)
191
206
  end
192
207
 
193
208
  def merge_hashes?(base_hash, derived_hash, key)
@@ -104,12 +104,9 @@ module RuboCop
104
104
  # to do so than to pass the value around to various methods.
105
105
  next if name == 'inherit_mode'
106
106
 
107
- suggestions = NameSimilarity.find_similar_names(name, Cop::Registry.global.map(&:cop_name))
108
- suggestion = "Did you mean `#{suggestions.join('`, `')}`?" if suggestions.any?
109
-
110
107
  message = <<~MESSAGE.rstrip
111
- unrecognized cop #{name} found in #{smart_loaded_path}
112
- #{suggestion}
108
+ unrecognized cop or department #{name} found in #{smart_loaded_path}
109
+ #{suggestion(name)}
113
110
  MESSAGE
114
111
 
115
112
  unknown_cops << message
@@ -117,6 +114,22 @@ module RuboCop
117
114
  raise ValidationError, unknown_cops.join("\n") if unknown_cops.any?
118
115
  end
119
116
 
117
+ def suggestion(name)
118
+ registry = Cop::Registry.global
119
+ departments = registry.departments.map(&:to_s)
120
+ suggestions = NameSimilarity.find_similar_names(name, departments + registry.map(&:cop_name))
121
+ if suggestions.any?
122
+ "Did you mean `#{suggestions.join('`, `')}`?"
123
+ else
124
+ # Department names can contain slashes, e.g. Chef/Correctness, but there's no support for
125
+ # the concept of higher level departments in RuboCop. It's a flat structure. So if the user
126
+ # tries to configure a "top level department", we hint that it's the bottom level
127
+ # departments that should be configured.
128
+ suggestions = departments.select { |department| department.start_with?("#{name}/") }
129
+ "#{name} is not a department. Use `#{suggestions.join('`, `')}`." if suggestions.any?
130
+ end
131
+ end
132
+
120
133
  def validate_syntax_cop
121
134
  syntax_config = @config['Lint/Syntax']
122
135
  default_config = ConfigLoader.default_configuration['Lint/Syntax']
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Bundler
6
+ # This cop verifies that a project contains Gemfile or gems.rb file and correct
7
+ # associated lock file based on the configuration.
8
+ #
9
+ # @example EnforcedStyle: Gemfile (default)
10
+ # # bad
11
+ # Project contains gems.rb and gems.locked files
12
+ #
13
+ # # bad
14
+ # Project contains Gemfile and gems.locked file
15
+ #
16
+ # # good
17
+ # Project contains Gemfile and Gemfile.lock
18
+ #
19
+ # @example EnforcedStyle: gems.rb
20
+ # # bad
21
+ # Project contains Gemfile and Gemfile.lock files
22
+ #
23
+ # # bad
24
+ # Project contains gems.rb and Gemfile.lock file
25
+ #
26
+ # # good
27
+ # Project contains gems.rb and gems.locked files
28
+ class GemFilename < Base
29
+ include ConfigurableEnforcedStyle
30
+ include RangeHelp
31
+
32
+ MSG_GEMFILE_REQUIRED = '`gems.rb` file was found but `Gemfile` is required '\
33
+ '(file path: %<file_path>s).'
34
+ MSG_GEMS_RB_REQUIRED = '`Gemfile` was found but `gems.rb` file is required '\
35
+ '(file path: %<file_path>s).'
36
+ MSG_GEMFILE_MISMATCHED = 'Expected a `Gemfile.lock` with `Gemfile` but found '\
37
+ '`gems.locked` file (file path: %<file_path>s).'
38
+ MSG_GEMS_RB_MISMATCHED = 'Expected a `gems.locked` file with `gems.rb` but found '\
39
+ '`Gemfile.lock` (file path: %<file_path>s).'
40
+ GEMFILE_FILES = %w[Gemfile Gemfile.lock].freeze
41
+ GEMS_RB_FILES = %w[gems.rb gems.locked].freeze
42
+
43
+ def on_new_investigation
44
+ file_path = processed_source.file_path
45
+ basename = File.basename(file_path)
46
+ return if expected_gemfile?(basename)
47
+
48
+ register_offense(file_path, basename)
49
+ end
50
+
51
+ private
52
+
53
+ def register_offense(file_path, basename)
54
+ register_gemfile_offense(file_path, basename) if gemfile_offense?(basename)
55
+ register_gems_rb_offense(file_path, basename) if gems_rb_offense?(basename)
56
+ end
57
+
58
+ def register_gemfile_offense(file_path, basename)
59
+ message = case basename
60
+ when 'gems.rb'
61
+ MSG_GEMFILE_REQUIRED
62
+ when 'gems.locked'
63
+ MSG_GEMFILE_MISMATCHED
64
+ end
65
+
66
+ add_global_offense(format(message, file_path: file_path))
67
+ end
68
+
69
+ def register_gems_rb_offense(file_path, basename)
70
+ message = case basename
71
+ when 'Gemfile'
72
+ MSG_GEMS_RB_REQUIRED
73
+ when 'Gemfile.lock'
74
+ MSG_GEMS_RB_MISMATCHED
75
+ end
76
+
77
+ add_global_offense(format(message, file_path: file_path))
78
+ end
79
+
80
+ def gemfile_offense?(basename)
81
+ gemfile_required? && GEMS_RB_FILES.include?(basename)
82
+ end
83
+
84
+ def gems_rb_offense?(basename)
85
+ gems_rb_required? && GEMFILE_FILES.include?(basename)
86
+ end
87
+
88
+ def expected_gemfile?(basename)
89
+ (gemfile_required? && GEMFILE_FILES.include?(basename)) ||
90
+ (gems_rb_required? && GEMS_RB_FILES.include?(basename))
91
+ end
92
+
93
+ def gemfile_required?
94
+ style == :Gemfile
95
+ end
96
+
97
+ def gems_rb_required?
98
+ style == :'gems.rb'
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # gem 'rubocop'
25
25
  # # For tests
26
26
  # gem 'rspec'
27
- class OrderedGems < Cop
27
+ class OrderedGems < Cop # rubocop:disable InternalAffairs/InheritDeprecatedCopClass
28
28
  include ConfigurableEnforcedStyle
29
29
  include OrderedGemNode
30
30
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # This class ensures a require statement is present for a standard library
6
+ # determined by the variable library_name
7
+ class RequireLibraryCorrector
8
+ extend RangeHelp
9
+
10
+ class << self
11
+ def correct(corrector, node, library_name)
12
+ node = node.parent while node.parent?
13
+ node = node.children.first if node.begin_type?
14
+ corrector.insert_before(node, require_statement(library_name))
15
+ end
16
+
17
+ def require_statement(library_name)
18
+ "require '#{library_name}'\n"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end