rubocop-github 0.27.0 → 0.29.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.
@@ -1,3 +1,7 @@
1
1
  GitHub/InsecureHashAlgorithm:
2
2
  Description: 'Encourage usage of secure hash algorithms'
3
3
  Enabled: pending
4
+
5
+ GitHub/UnreliableSubclasses:
6
+ Description: "Avoid `Class#subclasses` and `Class#descendants`; they miss not-yet-autoloaded classes and depend on GC timing."
7
+ Enabled: pending
@@ -1,116 +1 @@
1
- Lint/DuplicateMagicComment: # new in 1.37
2
- Enabled: false
3
- Style/OperatorMethodCall: # new in 1.37
4
- Enabled: false
5
- Style/RedundantStringEscape: # new in 1.37
6
- Enabled: false
7
- Gemspec/DevelopmentDependencies: # new in 1.44
8
- Enabled: false
9
- Lint/DuplicateMatchPattern: # new in 1.50
10
- Enabled: false
11
- Lint/ItWithoutArgumentsInBlock: # new in 1.59
12
- Enabled: false
13
- Lint/LiteralAssignmentInCondition: # new in 1.58
14
- Enabled: false
15
- Lint/MixedCaseRange: # new in 1.53
16
- Enabled: false
17
- Lint/RedundantRegexpQuantifiers: # new in 1.53
18
- Enabled: false
19
- Lint/UselessRescue: # new in 1.43
20
- Enabled: false
21
- Metrics/CollectionLiteralLength: # new in 1.47
22
- Enabled: false
23
- Style/ArrayIntersect: # new in 1.40
24
- Enabled: false
25
- Style/ComparableClamp: # new in 1.44
26
- Enabled: false
27
- Style/ConcatArrayLiterals: # new in 1.41
28
- Enabled: false
29
- Style/DataInheritance: # new in 1.49
30
- Enabled: false
31
- Style/DirEmpty: # new in 1.48
32
- Enabled: false
33
- Style/ExactRegexpMatch: # new in 1.51
34
- Enabled: false
35
- Style/FileEmpty: # new in 1.48
36
- Enabled: false
37
- Style/MapIntoArray: # new in 1.63
38
- Enabled: false
39
- Style/MapToSet: # new in 1.42
40
- Enabled: false
41
- Style/MinMaxComparison: # new in 1.42
42
- Enabled: false
43
- Style/RedundantArrayConstructor: # new in 1.52
44
- Enabled: false
45
- Style/RedundantConstantBase: # new in 1.40
46
- Enabled: false
47
- Style/RedundantCurrentDirectoryInPath: # new in 1.53
48
- Enabled: false
49
- Style/RedundantDoubleSplatHashBraces: # new in 1.41
50
- Enabled: false
51
- Style/RedundantEach: # new in 1.38
52
- Enabled: false
53
- Style/RedundantFilterChain: # new in 1.52
54
- Enabled: false
55
- Style/RedundantHeredocDelimiterQuotes: # new in 1.45
56
- Enabled: false
57
- Style/RedundantLineContinuation: # new in 1.49
58
- Enabled: false
59
- Style/RedundantRegexpArgument: # new in 1.53
60
- Enabled: false
61
- Style/RedundantRegexpConstructor: # new in 1.52
62
- Enabled: false
63
- Style/ReturnNilInPredicateMethodDefinition: # new in 1.53
64
- Enabled: false
65
- Style/SingleLineDoEndBlock: # new in 1.57
66
- Enabled: false
67
- Style/SuperWithArgsParentheses: # new in 1.58
68
- Enabled: false
69
- Style/YAMLFileRead: # new in 1.53
70
- Enabled: false
71
- Performance/MapMethodChain: # new in 1.19
72
- Enabled: false
73
- Gemspec/AddRuntimeDependency: # new in 1.65
74
- Enabled: false
75
- Lint/ConstantReassignment: # new in 1.70
76
- Enabled: false
77
- Lint/DuplicateSetElement: # new in 1.67
78
- Enabled: false
79
- Lint/HashNewWithKeywordArgumentsAsDefault: # new in 1.69
80
- Enabled: false
81
- Lint/NumericOperationWithConstantResult: # new in 1.69
82
- Enabled: false
83
- Lint/SharedMutableDefault: # new in 1.70
84
- Enabled: false
85
- Lint/UnescapedBracketInRegexp: # new in 1.68
86
- Enabled: false
87
- Lint/UselessDefined: # new in 1.69
88
- Enabled: false
89
- Lint/UselessNumericOperation: # new in 1.66
90
- Enabled: false
91
- Style/AmbiguousEndlessMethodDefinition: # new in 1.68
92
- Enabled: false
93
- Style/BitwisePredicate: # new in 1.68
94
- Enabled: false
95
- Style/CombinableDefined: # new in 1.68
96
- Enabled: false
97
- Style/DigChain: # new in 1.69
98
- Enabled: false
99
- Style/FileNull: # new in 1.69
100
- Enabled: false
101
- Style/FileTouch: # new in 1.69
102
- Enabled: false
103
- Style/ItAssignment: # new in 1.70
104
- Enabled: false
105
- Style/KeywordArgumentsMerging: # new in 1.68
106
- Enabled: false
107
- Style/RedundantInterpolationUnfreeze: # new in 1.66
108
- Enabled: false
109
- Style/SafeNavigationChainLength: # new in 1.68
110
- Enabled: false
111
- Style/SendWithLiteralMethodName: # new in 1.64
112
- Enabled: false
113
- Style/SuperArguments: # new in 1.64
114
- Enabled: false
115
- Performance/StringBytesize: # new in 1.23
116
- Enabled: false
1
+ # Newly introduced cops awaiting an explicit enabled or disabled decision.
data/config/rails.yml CHANGED
@@ -60,12 +60,18 @@ Lint/UselessAccessModifier:
60
60
  ContextCreatingMethods:
61
61
  - concerning
62
62
 
63
+ Rails/ActionControllerFlashBeforeRender:
64
+ Enabled: true
65
+
63
66
  Rails/ActionControllerTestCase:
64
67
  Enabled: false
65
68
 
66
69
  Rails/ActionFilter:
67
70
  Enabled: false
68
71
 
72
+ Rails/ActionOrder:
73
+ Enabled: false
74
+
69
75
  Rails/ActiveRecordAliases:
70
76
  Enabled: false
71
77
 
@@ -78,6 +84,9 @@ Rails/ActiveRecordOverride:
78
84
  Rails/ActiveSupportAliases:
79
85
  Enabled: false
80
86
 
87
+ Rails/ActiveSupportOnLoad:
88
+ Enabled: true
89
+
81
90
  Rails/AddColumnIndex:
82
91
  Enabled: false
83
92
 
@@ -123,6 +132,9 @@ Rails/ContentTag:
123
132
  Rails/CreateTableWithTimestamps:
124
133
  Enabled: false
125
134
 
135
+ Rails/DangerousColumnNames:
136
+ Enabled: true
137
+
126
138
  Rails/Date:
127
139
  Enabled: false
128
140
 
@@ -159,6 +171,9 @@ Rails/EagerEvaluationLogMessage:
159
171
  Rails/EnumHash:
160
172
  Enabled: false
161
173
 
174
+ Rails/EnumSyntax:
175
+ Enabled: true
176
+
162
177
  Rails/EnumUniqueness:
163
178
  Enabled: false
164
179
 
@@ -168,6 +183,9 @@ Rails/EnvironmentComparison:
168
183
  Rails/EnvironmentVariableAccess:
169
184
  Enabled: false
170
185
 
186
+ Rails/EnvLocal:
187
+ Enabled: true
188
+
171
189
  Rails/Exit:
172
190
  Enabled: false
173
191
 
@@ -183,9 +201,15 @@ Rails/FindBy:
183
201
  Rails/FindById:
184
202
  Enabled: false
185
203
 
204
+ Rails/FindByOrAssignmentMemoization:
205
+ Enabled: true
206
+
186
207
  Rails/FindEach:
187
208
  Enabled: false
188
209
 
210
+ Rails/FreezeTime:
211
+ Enabled: true
212
+
189
213
  Rails/HasAndBelongsToMany:
190
214
  Enabled: false
191
215
 
@@ -201,6 +225,9 @@ Rails/HttpPositionalArguments:
201
225
  Rails/HttpStatus:
202
226
  Enabled: false
203
227
 
228
+ Rails/HttpStatusNameConsistency:
229
+ Enabled: false
230
+
204
231
  Rails/I18nLazyLookup:
205
232
  Enabled: false
206
233
 
@@ -210,6 +237,9 @@ Rails/I18nLocaleAssignment:
210
237
  Rails/I18nLocaleTexts:
211
238
  Enabled: false
212
239
 
240
+ Rails/IgnoredColumnsAssignment:
241
+ Enabled: true
242
+
213
243
  Rails/IgnoredSkipActionFilterOption:
214
244
  Enabled: false
215
245
 
@@ -240,12 +270,18 @@ Rails/MatchRoute:
240
270
  Rails/MigrationClassName:
241
271
  Enabled: false
242
272
 
273
+ Rails/MultipleRoutePaths:
274
+ Enabled: true
275
+
243
276
  Rails/NegateInclude:
244
277
  Enabled: false
245
278
 
246
279
  Rails/NotNullColumn:
247
280
  Enabled: false
248
281
 
282
+ Rails/OrderArguments:
283
+ Enabled: false
284
+
249
285
  Rails/OrderById:
250
286
  Enabled: false
251
287
 
@@ -282,6 +318,12 @@ Rails/RakeEnvironment:
282
318
  Rails/ReadWriteAttribute:
283
319
  Enabled: false
284
320
 
321
+ Rails/RedirectBackOrTo:
322
+ Enabled: true
323
+
324
+ Rails/RedundantActiveRecordAllMethod:
325
+ Enabled: false
326
+
285
327
  Rails/RedundantAllowNil:
286
328
  Enabled: false
287
329
 
@@ -325,9 +367,15 @@ Rails/ReversibleMigration:
325
367
  Rails/ReversibleMigrationMethodDefinition:
326
368
  Enabled: false
327
369
 
370
+ Rails/ResponseParsedBody:
371
+ Enabled: false
372
+
328
373
  Rails/RootJoinChain:
329
374
  Enabled: false
330
375
 
376
+ Rails/RootPathnameMethods:
377
+ Enabled: false
378
+
331
379
  Rails/RootPublicPath:
332
380
  Enabled: false
333
381
 
@@ -358,9 +406,15 @@ Rails/SquishedSQLHeredocs:
358
406
  Rails/StripHeredoc:
359
407
  Enabled: false
360
408
 
409
+ Rails/StrongParametersExpect:
410
+ Enabled: true
411
+
361
412
  Rails/TableNameAssignment:
362
413
  Enabled: false
363
414
 
415
+ Rails/ThreeStateBooleanColumn:
416
+ Enabled: true
417
+
364
418
  Rails/TimeZone:
365
419
  Enabled: false
366
420
 
@@ -370,6 +424,12 @@ Rails/TimeZoneAssignment:
370
424
  Rails/ToFormattedS:
371
425
  Enabled: false
372
426
 
427
+ Rails/TopLevelHashWithIndifferentAccess:
428
+ Enabled: true
429
+
430
+ Rails/ToSWithArgument:
431
+ Enabled: true
432
+
373
433
  Rails/TransactionExitStatement:
374
434
  Enabled: false
375
435
 
@@ -385,6 +445,9 @@ Rails/UnknownEnv:
385
445
  Rails/UnusedIgnoredColumns:
386
446
  Enabled: false
387
447
 
448
+ Rails/UnusedRenderContent:
449
+ Enabled: true
450
+
388
451
  Rails/Validation:
389
452
  Enabled: false
390
453
 
@@ -394,9 +457,18 @@ Rails/WhereEquals:
394
457
  Rails/WhereExists:
395
458
  Enabled: false
396
459
 
460
+ Rails/WhereMissing:
461
+ Enabled: true
462
+
397
463
  Rails/WhereNot:
398
464
  Enabled: false
399
465
 
466
+ Rails/WhereNotWithMultipleConditions:
467
+ Enabled: true
468
+
469
+ Rails/WhereRange:
470
+ Enabled: true
471
+
400
472
  Style/For:
401
473
  Exclude:
402
474
  - "**/*.erb"
@@ -1,102 +1 @@
1
- Rails/ActionControllerFlashBeforeRender: # new in 2.16
2
- Enabled: false
3
- Rails/ActionOrder: # new in 2.17
4
- Enabled: false
5
- Rails/ActiveSupportOnLoad: # new in 2.16
6
- Enabled: false
7
- Rails/FreezeTime: # new in 2.16
8
- Enabled: false
9
- Rails/IgnoredColumnsAssignment: # new in 2.17
10
- Enabled: false
11
- Rails/RootPathnameMethods: # new in 2.16
12
- Enabled: false
13
- Rails/ToSWithArgument: # new in 2.16
14
- Enabled: false
15
- Rails/TopLevelHashWithIndifferentAccess: # new in 2.16
16
- Enabled: false
17
- Rails/WhereMissing: # new in 2.16
18
- Enabled: false
19
- Rails/WhereNotWithMultipleConditions: # new in 2.17
20
- Enabled: false
21
- Gemspec/DevelopmentDependencies: # new in 1.44
22
- Enabled: false
23
- Lint/DuplicateMatchPattern: # new in 1.50
24
- Enabled: false
25
- Lint/ItWithoutArgumentsInBlock: # new in 1.59
26
- Enabled: false
27
- Lint/LiteralAssignmentInCondition: # new in 1.58
28
- Enabled: false
29
- Lint/MixedCaseRange: # new in 1.53
30
- Enabled: false
31
- Lint/RedundantRegexpQuantifiers: # new in 1.53
32
- Enabled: false
33
- Lint/UselessRescue: # new in 1.43
34
- Enabled: false
35
- Metrics/CollectionLiteralLength: # new in 1.47
36
- Enabled: false
37
- Style/ArrayIntersect: # new in 1.40
38
- Enabled: false
39
- Style/ComparableClamp: # new in 1.44
40
- Enabled: false
41
- Style/ConcatArrayLiterals: # new in 1.41
42
- Enabled: false
43
- Style/DataInheritance: # new in 1.49
44
- Enabled: false
45
- Style/DirEmpty: # new in 1.48
46
- Enabled: false
47
- Style/ExactRegexpMatch: # new in 1.51
48
- Enabled: false
49
- Style/FileEmpty: # new in 1.48
50
- Enabled: false
51
- Style/MapIntoArray: # new in 1.63
52
- Enabled: false
53
- Style/MapToSet: # new in 1.42
54
- Enabled: false
55
- Style/MinMaxComparison: # new in 1.42
56
- Enabled: false
57
- Style/RedundantArrayConstructor: # new in 1.52
58
- Enabled: false
59
- Style/RedundantConstantBase: # new in 1.40
60
- Enabled: false
61
- Style/RedundantCurrentDirectoryInPath: # new in 1.53
62
- Enabled: false
63
- Style/RedundantDoubleSplatHashBraces: # new in 1.41
64
- Enabled: false
65
- Style/RedundantEach: # new in 1.38
66
- Enabled: false
67
- Style/RedundantFilterChain: # new in 1.52
68
- Enabled: false
69
- Style/RedundantHeredocDelimiterQuotes: # new in 1.45
70
- Enabled: false
71
- Style/RedundantLineContinuation: # new in 1.49
72
- Enabled: false
73
- Style/RedundantRegexpArgument: # new in 1.53
74
- Enabled: false
75
- Style/RedundantRegexpConstructor: # new in 1.52
76
- Enabled: false
77
- Style/ReturnNilInPredicateMethodDefinition: # new in 1.53
78
- Enabled: false
79
- Style/SingleLineDoEndBlock: # new in 1.57
80
- Enabled: false
81
- Style/SuperWithArgsParentheses: # new in 1.58
82
- Enabled: false
83
- Style/YAMLFileRead: # new in 1.53
84
- Enabled: false
85
- Performance/MapMethodChain: # new in 1.19
86
- Enabled: false
87
- Rails/DangerousColumnNames: # new in 2.21
88
- Enabled: false
89
- Rails/EnvLocal: # new in 2.22
90
- Enabled: false
91
- Rails/RedundantActiveRecordAllMethod: # new in 2.21
92
- Enabled: false
93
- Rails/ResponseParsedBody: # new in 2.18
94
- Enabled: false
95
- Rails/ThreeStateBooleanColumn: # new in 2.19
96
- Enabled: false
97
- Rails/UnusedRenderContent: # new in 2.21
98
- Enabled: false
99
- Rails/EnumSyntax: # new in 2.26
100
- Enabled: false
101
- Rails/WhereRange: # new in 2.25
102
- Enabled: false
1
+ # Newly introduced cops awaiting an explicit enabled or disabled decision.
@@ -52,6 +52,7 @@ module RuboCop
52
52
  return
53
53
  end
54
54
 
55
+ # `many?` is an ActiveSupport extension, but this cop runs without ActiveSupport.
55
56
  if render_literal?(node) && node.arguments.count > 1
56
57
  locals = node.arguments[1]
57
58
  elsif option_pairs = render_with_options?(node)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubocop"
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module GitHub
8
+ # Inform people when they reach for Class#subclasses (Ruby) or
9
+ # Class#descendants (ActiveSupport).
10
+ #
11
+ # two reasons these can be unreliable:
12
+ # 1. autoload hasn't run yet, so half the tree is invisible
13
+ # 2. GC may have eaten dynamically-defined classes (i.e. in test suites)
14
+ #
15
+ # If you really need it, add a rubocop:disable on the line with a note
16
+ # explaining why future-you won't be sad.
17
+ class UnreliableSubclasses < Base
18
+ MSG = "Avoid `%<method>s` here. It may miss not-yet-autoloaded classes and depends on GC timing. " \
19
+ "Prefer an explicit registry or eager loading."
20
+
21
+ RESTRICT_ON_SEND = %i[descendants subclasses].freeze
22
+
23
+ # matches Foo.descendants, Foo::Bar.subclasses, self.descendants
24
+ # receiver has to be a constant or `self`
25
+ def_node_matcher :unreliable_call?, <<~PATTERN
26
+ (send {const self} {:descendants :subclasses})
27
+ PATTERN
28
+
29
+ # the same thing but with safe navigation operator
30
+ def_node_matcher :unreliable_csend?, <<~PATTERN
31
+ (csend {const self} {:descendants :subclasses})
32
+ PATTERN
33
+
34
+ def on_send(node)
35
+ return unless unreliable_call?(node)
36
+
37
+ add_offense(node, message: format(MSG, method: node.method_name))
38
+ end
39
+
40
+ def on_csend(node)
41
+ return unless unreliable_csend?(node)
42
+
43
+ add_offense(node, message: format(MSG, method: node.method_name))
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -8,3 +8,4 @@ RuboCop::GitHub::Inject.default_defaults!
8
8
 
9
9
  require "rubocop/cop/github/avoid_object_send_with_dynamic_method"
10
10
  require "rubocop/cop/github/insecure_hash_algorithm"
11
+ require "rubocop/cop/github/unreliable_subclasses"
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- VERSION = "0.27.0"
3
+ VERSION = "0.29.0"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-github
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.0
4
+ version: 0.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-03-13 00:00:00.000000000 Z
10
+ date: 2026-10-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rubocop
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '1.76'
18
+ version: '1.91'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '1.76'
25
+ version: '1.91'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rubocop-performance
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -43,28 +43,28 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '2.23'
46
+ version: '2.34'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '2.23'
53
+ version: '2.34'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: actionview
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 7.2.3
60
+ version: 8.1.3
61
61
  type: :development
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 7.2.3
67
+ version: 8.1.3
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: minitest
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -124,6 +124,7 @@ files:
124
124
  - lib/rubocop/cop/github/rails_view_render_paths_exist.rb
125
125
  - lib/rubocop/cop/github/rails_view_render_shorthand.rb
126
126
  - lib/rubocop/cop/github/render_literal_helpers.rb
127
+ - lib/rubocop/cop/github/unreliable_subclasses.rb
127
128
  - lib/rubocop/github.rb
128
129
  - lib/rubocop/github/inject.rb
129
130
  - lib/version.rb
@@ -141,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
142
  requirements:
142
143
  - - ">="
143
144
  - !ruby/object:Gem::Version
144
- version: 3.3.0
145
+ version: 3.4.2
145
146
  required_rubygems_version: !ruby/object:Gem::Requirement
146
147
  requirements:
147
148
  - - ">="