rubocop-rails 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/default.yml +23 -10
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
- data/lib/rubocop/cop/rails/enum_hash.rb +66 -0
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +28 -8
- data/lib/rubocop/cop/rails/save_bang.rb +13 -4
- data/lib/rubocop/cop/rails/time_zone.rb +1 -1
- data/lib/rubocop/cop/rails_cops.rb +1 -0
- data/lib/rubocop/rails/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f18a288648626076787a00773149df97edce3b5330a5dc650cf662af46214bd5
|
4
|
+
data.tar.gz: f945d031d0a5bc98eb0af95a6cdf8e931cb5a469a1c1ced6ab11c1fb20f09bb5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24f03fcf8cd683c5ed3e2afc9243f113afaa8641fc5cbd938d5d2ff916b7eeed95a994b69b48509b20618341c5b5c39286bde009f1dc5b369f94dc249a65b148
|
7
|
+
data.tar.gz: 57d3fff4181c71750d0eccdde094607ad63f79b7a6b273f698224dcc687a707879df82a264df063b4ac8f133fff3f4fe23dfcb820b4d2863cbae6792c6e38906
|
data/config/default.yml
CHANGED
@@ -9,6 +9,9 @@ AllCops:
|
|
9
9
|
# application. If neither of those files exist, RuboCop will use Rails 5.0
|
10
10
|
# as the default.
|
11
11
|
TargetRailsVersion: ~
|
12
|
+
# When specifying style guide URLs, any paths and/or fragments will be
|
13
|
+
# evaluated relative to the base URL.
|
14
|
+
StyleGuideBaseURL: https://rails.rubystyle.guide
|
12
15
|
|
13
16
|
Rails/ActionFilter:
|
14
17
|
Description: 'Enforces consistent use of action filter methods.'
|
@@ -28,6 +31,7 @@ Rails/ActiveRecordAliases:
|
|
28
31
|
Use `update!` instead of `update_attributes!`.
|
29
32
|
Enabled: true
|
30
33
|
VersionAdded: '0.53'
|
34
|
+
SafeAutoCorrect: false
|
31
35
|
|
32
36
|
Rails/ActiveRecordOverride:
|
33
37
|
Description: >-
|
@@ -136,12 +140,20 @@ Rails/DelegateAllowBlank:
|
|
136
140
|
|
137
141
|
Rails/DynamicFindBy:
|
138
142
|
Description: 'Use `find_by` instead of dynamic `find_by_*`.'
|
139
|
-
StyleGuide: '
|
143
|
+
StyleGuide: '#find_by'
|
140
144
|
Enabled: true
|
141
145
|
VersionAdded: '0.44'
|
142
146
|
Whitelist:
|
143
147
|
- find_by_sql
|
144
148
|
|
149
|
+
Rails/EnumHash:
|
150
|
+
Description: 'Prefer hash syntax over array syntax when defining enums.'
|
151
|
+
StyleGuide: '#enums'
|
152
|
+
Enabled: true
|
153
|
+
VersionAdded: '2.3'
|
154
|
+
Include:
|
155
|
+
- app/models/**/*.rb
|
156
|
+
|
145
157
|
Rails/EnumUniqueness:
|
146
158
|
Description: 'Avoid duplicate integers in hash-syntax `enum` declaration.'
|
147
159
|
Enabled: true
|
@@ -180,7 +192,7 @@ Rails/FilePath:
|
|
180
192
|
|
181
193
|
Rails/FindBy:
|
182
194
|
Description: 'Prefer find_by over where.first.'
|
183
|
-
StyleGuide: '
|
195
|
+
StyleGuide: '#find_by'
|
184
196
|
Enabled: true
|
185
197
|
VersionAdded: '0.30'
|
186
198
|
Include:
|
@@ -188,7 +200,7 @@ Rails/FindBy:
|
|
188
200
|
|
189
201
|
Rails/FindEach:
|
190
202
|
Description: 'Prefer all.find_each over all.find.'
|
191
|
-
StyleGuide: '
|
203
|
+
StyleGuide: '#find-each'
|
192
204
|
Enabled: true
|
193
205
|
VersionAdded: '0.30'
|
194
206
|
Include:
|
@@ -196,7 +208,7 @@ Rails/FindEach:
|
|
196
208
|
|
197
209
|
Rails/HasAndBelongsToMany:
|
198
210
|
Description: 'Prefer has_many :through to has_and_belongs_to_many.'
|
199
|
-
StyleGuide: '
|
211
|
+
StyleGuide: '#has-many-through'
|
200
212
|
Enabled: true
|
201
213
|
VersionAdded: '0.12'
|
202
214
|
Include:
|
@@ -204,7 +216,7 @@ Rails/HasAndBelongsToMany:
|
|
204
216
|
|
205
217
|
Rails/HasManyOrHasOneDependent:
|
206
218
|
Description: 'Define the dependent option to the has_many and has_one associations.'
|
207
|
-
StyleGuide: '
|
219
|
+
StyleGuide: '#has_many-has_one-dependent-option'
|
208
220
|
Enabled: true
|
209
221
|
VersionAdded: '0.50'
|
210
222
|
Include:
|
@@ -251,7 +263,7 @@ Rails/InverseOf:
|
|
251
263
|
|
252
264
|
Rails/LexicallyScopedActionFilter:
|
253
265
|
Description: "Checks that methods specified in the filter's `only` or `except` options are explicitly defined in the controller."
|
254
|
-
StyleGuide: '
|
266
|
+
StyleGuide: '#lexically-scoped-action-filter'
|
255
267
|
Enabled: true
|
256
268
|
Safe: false
|
257
269
|
VersionAdded: '0.52'
|
@@ -316,7 +328,7 @@ Rails/ReadWriteAttribute:
|
|
316
328
|
Description: >-
|
317
329
|
Checks for read_attribute(:attr) and
|
318
330
|
write_attribute(:attr, val).
|
319
|
-
StyleGuide: '
|
331
|
+
StyleGuide: '#read-attribute'
|
320
332
|
Enabled: true
|
321
333
|
VersionAdded: '0.20'
|
322
334
|
VersionChanged: '0.29'
|
@@ -367,7 +379,7 @@ Rails/RequestReferer:
|
|
367
379
|
|
368
380
|
Rails/ReversibleMigration:
|
369
381
|
Description: 'Checks whether the change method of the migration file is reversible.'
|
370
|
-
StyleGuide: '
|
382
|
+
StyleGuide: '#reversible-migration'
|
371
383
|
Reference: 'https://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html'
|
372
384
|
Enabled: true
|
373
385
|
VersionAdded: '0.47'
|
@@ -386,12 +398,13 @@ Rails/SafeNavigation:
|
|
386
398
|
|
387
399
|
Rails/SaveBang:
|
388
400
|
Description: 'Identifies possible cases where Active Record save! or related should be used.'
|
389
|
-
StyleGuide: '
|
401
|
+
StyleGuide: '#save-bang'
|
390
402
|
Enabled: false
|
391
403
|
VersionAdded: '0.42'
|
392
404
|
VersionChanged: '0.59'
|
393
405
|
AllowImplicitReturn: true
|
394
406
|
AllowedReceivers: []
|
407
|
+
SafeAutoCorrect: false
|
395
408
|
|
396
409
|
Rails/ScopeArgs:
|
397
410
|
Description: 'Checks the arguments of ActiveRecord scopes.'
|
@@ -424,7 +437,7 @@ Rails/SkipsModelValidations:
|
|
424
437
|
|
425
438
|
Rails/TimeZone:
|
426
439
|
Description: 'Checks the correct usage of time zone aware methods.'
|
427
|
-
StyleGuide: '
|
440
|
+
StyleGuide: '#time'
|
428
441
|
Reference: 'http://danilenko.org/2012/7/6/rails_timezones'
|
429
442
|
Enabled: true
|
430
443
|
Safe: false
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop looks for enums written with array syntax.
|
7
|
+
#
|
8
|
+
# When using array syntax, adding an element in a
|
9
|
+
# position other than the last causes all previous
|
10
|
+
# definitions to shift. Explicitly specifying the
|
11
|
+
# value for each key prevents this from happening.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# # bad
|
15
|
+
# enum status: [:active, :archived]
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# enum status: { active: 0, archived: 1 }
|
19
|
+
#
|
20
|
+
class EnumHash < Cop
|
21
|
+
MSG = 'Enum defined as an array found in `%<enum>s` enum declaration. '\
|
22
|
+
'Use hash syntax instead.'
|
23
|
+
|
24
|
+
def_node_matcher :enum?, <<~PATTERN
|
25
|
+
(send nil? :enum (hash $...))
|
26
|
+
PATTERN
|
27
|
+
|
28
|
+
def_node_matcher :array_pair?, <<~PATTERN
|
29
|
+
(pair $_ $array)
|
30
|
+
PATTERN
|
31
|
+
|
32
|
+
def on_send(node)
|
33
|
+
enum?(node) do |pairs|
|
34
|
+
pairs.each do |pair|
|
35
|
+
key, array = array_pair?(pair)
|
36
|
+
next unless key
|
37
|
+
|
38
|
+
add_offense(array, message: format(MSG, enum: enum_name(key)))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def autocorrect(node)
|
44
|
+
range = node.loc.expression
|
45
|
+
hash = node
|
46
|
+
.children
|
47
|
+
.each_with_index
|
48
|
+
.map { |elem, index| [elem.children.first, index] }.to_h
|
49
|
+
|
50
|
+
->(corrector) { corrector.replace(range, hash.to_s) }
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def enum_name(key)
|
56
|
+
case key.type
|
57
|
+
when :sym, :str
|
58
|
+
key.value
|
59
|
+
else
|
60
|
+
key.source
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -23,22 +23,42 @@ module RuboCop
|
|
23
23
|
MSG = 'Duplicate value `%<value>s` found in `%<enum>s` ' \
|
24
24
|
'enum declaration.'
|
25
25
|
|
26
|
-
def_node_matcher :
|
27
|
-
(send nil? :enum (hash
|
26
|
+
def_node_matcher :enum?, <<~PATTERN
|
27
|
+
(send nil? :enum (hash $...))
|
28
|
+
PATTERN
|
29
|
+
|
30
|
+
def_node_matcher :enum_values, <<~PATTERN
|
31
|
+
(pair $_ ${array hash})
|
28
32
|
PATTERN
|
29
33
|
|
30
34
|
def on_send(node)
|
31
|
-
|
32
|
-
|
35
|
+
enum?(node) do |pairs|
|
36
|
+
pairs.each do |pair|
|
37
|
+
enum_values(pair) do |key, args|
|
38
|
+
items = args.values
|
33
39
|
|
34
|
-
|
40
|
+
next unless duplicates?(items)
|
35
41
|
|
36
|
-
|
37
|
-
|
38
|
-
|
42
|
+
consecutive_duplicates(items).each do |item|
|
43
|
+
add_offense(item, message: format(
|
44
|
+
MSG, value: item.source, enum: enum_name(key)
|
45
|
+
))
|
46
|
+
end
|
47
|
+
end
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def enum_name(key)
|
55
|
+
case key.type
|
56
|
+
when :sym, :str
|
57
|
+
key.value
|
58
|
+
else
|
59
|
+
key.source
|
60
|
+
end
|
61
|
+
end
|
42
62
|
end
|
43
63
|
end
|
44
64
|
end
|
@@ -8,6 +8,7 @@ module RuboCop
|
|
8
8
|
# save and an exception is better than unhandled failure.
|
9
9
|
#
|
10
10
|
# This will allow:
|
11
|
+
#
|
11
12
|
# - update or save calls, assigned to a variable,
|
12
13
|
# or used as a condition in an if/unless/case statement.
|
13
14
|
# - create calls, assigned to a variable that then has a
|
@@ -107,7 +108,7 @@ module RuboCop
|
|
107
108
|
CREATE_CONDITIONAL_MSG = '`%<current>s` returns a model which is ' \
|
108
109
|
'always truthy.'
|
109
110
|
|
110
|
-
CREATE_PERSIST_METHODS = %i[create
|
111
|
+
CREATE_PERSIST_METHODS = %i[create create_or_find_by
|
111
112
|
first_or_create find_or_create_by].freeze
|
112
113
|
MODIFY_PERSIST_METHODS = %i[save
|
113
114
|
update update_attributes destroy].freeze
|
@@ -139,9 +140,9 @@ module RuboCop
|
|
139
140
|
def on_send(node) # rubocop:disable Metrics/CyclomaticComplexity
|
140
141
|
return unless persist_method?(node)
|
141
142
|
return if return_value_assigned?(node)
|
143
|
+
return if implicit_return?(node)
|
142
144
|
return if check_used_in_conditional(node)
|
143
145
|
return if argument?(node)
|
144
|
-
return if implicit_return?(node)
|
145
146
|
return if explicit_return?(node)
|
146
147
|
|
147
148
|
add_offense_for_node(node)
|
@@ -276,10 +277,18 @@ module RuboCop
|
|
276
277
|
return false unless cop_config['AllowImplicitReturn']
|
277
278
|
|
278
279
|
node = assignable_node(node)
|
279
|
-
method = node.parent
|
280
|
+
method, sibling_index = find_method_with_sibling_index(node.parent)
|
280
281
|
return unless method && (method.def_type? || method.block_type?)
|
281
282
|
|
282
|
-
method.children.size == node.sibling_index +
|
283
|
+
method.children.size == node.sibling_index + sibling_index
|
284
|
+
end
|
285
|
+
|
286
|
+
def find_method_with_sibling_index(node, sibling_index = 1)
|
287
|
+
return node, sibling_index unless node&.or_type?
|
288
|
+
|
289
|
+
sibling_index += 1
|
290
|
+
|
291
|
+
find_method_with_sibling_index(node.parent, sibling_index)
|
283
292
|
end
|
284
293
|
|
285
294
|
def argument?(node)
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Rails
|
6
6
|
# This cop checks for the use of Time methods without zone.
|
7
7
|
#
|
8
|
-
# Built on top of Ruby on Rails style guide (https://
|
8
|
+
# Built on top of Ruby on Rails style guide (https://rails.rubystyle.guide#time)
|
9
9
|
# and the article http://danilenko.org/2012/7/6/rails_timezones/
|
10
10
|
#
|
11
11
|
# Two styles are supported for this cop. When EnforcedStyle is 'strict'
|
@@ -17,6 +17,7 @@ require_relative 'rails/date'
|
|
17
17
|
require_relative 'rails/delegate'
|
18
18
|
require_relative 'rails/delegate_allow_blank'
|
19
19
|
require_relative 'rails/dynamic_find_by'
|
20
|
+
require_relative 'rails/enum_hash'
|
20
21
|
require_relative 'rails/enum_uniqueness'
|
21
22
|
require_relative 'rails/environment_comparison'
|
22
23
|
require_relative 'rails/exit'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-08-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- lib/rubocop/cop/rails/delegate.rb
|
72
72
|
- lib/rubocop/cop/rails/delegate_allow_blank.rb
|
73
73
|
- lib/rubocop/cop/rails/dynamic_find_by.rb
|
74
|
+
- lib/rubocop/cop/rails/enum_hash.rb
|
74
75
|
- lib/rubocop/cop/rails/enum_uniqueness.rb
|
75
76
|
- lib/rubocop/cop/rails/environment_comparison.rb
|
76
77
|
- lib/rubocop/cop/rails/exit.rb
|