rubocop-rails 2.3.2 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26d2ede1a06dce0e42d2bcbfe3963745a159fc1ecdcc21ac55c3b9bf93e6acd4
4
- data.tar.gz: 2c39a124756afd14f69febf84ab357f45fc720e68af45a16ba8e2668151a0664
3
+ metadata.gz: eac129cae1115b4038b4731039495db93945c73a041fb762d7412521d4ec3619
4
+ data.tar.gz: 5a68473da7c7799e223d0c5de4c10609751a633b6db573cb155d41c942dfb755
5
5
  SHA512:
6
- metadata.gz: 4b3d56057f612bf09a155255925aa8c85909866f4320629ce4bbf0657a81cfb4e39683e2daae6b87a37966a85882e549891271a73908ccf8ee66a0e40db09b14
7
- data.tar.gz: 6bf0f0d6ae2d223368c44b80bb9a7c888603f06186e58d4fcacb085ac240d8877ce1717d9e694f8846c5ab06e3ffaeeea74b388f98f5ff3188184abceb3a029a
6
+ metadata.gz: 6f0efc72cd3569bfe93874a5f77113186e73947bc9d6665fbf926a4e9724e9e4390a312541b628d305c8ea733a94ce94212f38f80db71ec4be3d291d63029f1f
7
+ data.tar.gz: ae2d76dd0b58c09108b15cf83f363262904c698a8f0839532838f39d969b101885329228674ed237fcafc10a63732be8a6a8c2a1a800339bb7e4a4bd18fb759b
@@ -49,11 +49,21 @@ Rails/ActiveSupportAliases:
49
49
  Enabled: true
50
50
  VersionAdded: '0.48'
51
51
 
52
+ Rails/ApplicationController:
53
+ Description: 'Check that controllers subclass ApplicationController.'
54
+ Enabled: true
55
+ VersionAdded: '2.4'
56
+
52
57
  Rails/ApplicationJob:
53
58
  Description: 'Check that jobs subclass ApplicationJob.'
54
59
  Enabled: true
55
60
  VersionAdded: '0.49'
56
61
 
62
+ Rails/ApplicationMailer:
63
+ Description: 'Check that mailers subclass ApplicationMailer.'
64
+ Enabled: true
65
+ VersionAdded: '2.4'
66
+
57
67
  Rails/ApplicationRecord:
58
68
  Description: 'Check that models subclass ApplicationRecord.'
59
69
  Enabled: true
@@ -183,8 +193,8 @@ Rails/FilePath:
183
193
  Description: 'Use `Rails.root.join` for file path joining.'
184
194
  Enabled: true
185
195
  VersionAdded: '0.47'
186
- VersionChanged: '0.57'
187
- EnforcedStyle: arguments
196
+ VersionChanged: '2.4'
197
+ EnforcedStyle: slashes
188
198
  SupportedStyles:
189
199
  - slashes
190
200
  - arguments
@@ -323,6 +333,15 @@ Rails/Present:
323
333
  # Convert usages of `unless blank?` to `if present?`
324
334
  UnlessBlank: true
325
335
 
336
+ Rails/RakeEnvironment:
337
+ Description: 'Set `:environment` task as a dependency to all rake task.'
338
+ Enabled: true
339
+ Safe: false
340
+ VersionAdded: '2.4'
341
+ Include:
342
+ - '**/Rakefile'
343
+ - '**/*.rake'
344
+
326
345
  Rails/ReadWriteAttribute:
327
346
  Description: >-
328
347
  Checks for read_attribute(:attr) and
@@ -395,6 +414,18 @@ Rails/SafeNavigation:
395
414
  # implement the intended method. `try` will not raise an exception for this.
396
415
  ConvertTry: false
397
416
 
417
+ Rails/SafeNavigationWithBlank:
418
+ Description: 'Avoid `foo&.blank?` in conditionals.'
419
+ Enabled: true
420
+ VersionAdded: '2.4'
421
+ # While the safe navigation operator is generally a good idea, when
422
+ # checking `foo&.blank?` in a conditional, `foo` being `nil` will actually
423
+ # do the opposite of what the author intends.
424
+ #
425
+ # foo&.blank? #=> nil
426
+ # foo.blank? #=> true
427
+ SafeAutoCorrect: false
428
+
398
429
  Rails/SaveBang:
399
430
  Description: 'Identifies possible cases where Active Record save! or related should be used.'
400
431
  StyleGuide: 'https://rails.rubystyle.guide#save-bang'
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks that controllers subclass ApplicationController.
7
+ #
8
+ # @example
9
+ #
10
+ # # good
11
+ # class MyController < ApplicationController
12
+ # # ...
13
+ # end
14
+ #
15
+ # # bad
16
+ # class MyController < ActionController::Base
17
+ # # ...
18
+ # end
19
+ class ApplicationController < Cop
20
+ MSG = 'Controllers should subclass `ApplicationController`.'
21
+ SUPERCLASS = 'ApplicationController'
22
+ BASE_PATTERN = '(const (const nil? :ActionController) :Base)'
23
+
24
+ # rubocop:disable Layout/ClassStructure
25
+ include RuboCop::Cop::EnforceSuperclass
26
+ # rubocop:enable Layout/ClassStructure
27
+
28
+ def autocorrect(node)
29
+ lambda do |corrector|
30
+ corrector.replace(node.source_range, self.class::SUPERCLASS)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks that mailers subclass ApplicationMailer with Rails 5.0.
7
+ #
8
+ # @example
9
+ #
10
+ # # good
11
+ # class MyMailer < ApplicationMailer
12
+ # # ...
13
+ # end
14
+ #
15
+ # # bad
16
+ # class MyMailer < ActionMailer::Base
17
+ # # ...
18
+ # end
19
+ class ApplicationMailer < Cop
20
+ extend TargetRailsVersion
21
+
22
+ minimum_target_rails_version 5.0
23
+
24
+ MSG = 'Mailers should subclass `ApplicationMailer`.'
25
+ SUPERCLASS = 'ApplicationMailer'
26
+ BASE_PATTERN = '(const (const nil? :ActionMailer) :Base)'
27
+
28
+ # rubocop:disable Layout/ClassStructure
29
+ include RuboCop::Cop::EnforceSuperclass
30
+ # rubocop:enable Layout/ClassStructure
31
+
32
+ def autocorrect(node)
33
+ lambda do |corrector|
34
+ corrector.replace(node.source_range, self.class::SUPERCLASS)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -85,7 +85,7 @@ module RuboCop
85
85
 
86
86
  def check_deprecated_methods(node)
87
87
  DEPRECATED_METHODS.each do |relevant:, deprecated:|
88
- next unless node.method_name == deprecated.to_sym
88
+ next unless node.method?(deprecated.to_sym)
89
89
 
90
90
  add_offense(node, location: :selector,
91
91
  message: format(DEPRECATED_MSG,
@@ -71,7 +71,7 @@ module RuboCop
71
71
  delegation = ["delegate :#{node.body.method_name}",
72
72
  "to: :#{node.body.receiver.method_name}"]
73
73
 
74
- if node.method_name == prefixed_method_name(node.body)
74
+ if node.method?(prefixed_method_name(node.body))
75
75
  delegation << ['prefix: true']
76
76
  end
77
77
 
@@ -41,13 +41,11 @@ module RuboCop
41
41
  end
42
42
 
43
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
44
+ hash = node.children.each_with_index.map do |elem, index|
45
+ "#{elem.source} => #{index}"
46
+ end.join(', ')
49
47
 
50
- ->(corrector) { corrector.replace(range, hash.to_s) }
48
+ ->(corrector) { corrector.replace(node.loc.expression, "{#{hash}}") }
51
49
  end
52
50
 
53
51
  private
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # to use `Rails.root.join` clause. It is used to add uniformity when
8
8
  # joining paths.
9
9
  #
10
- # @example EnforcedStyle: arguments (default)
10
+ # @example EnforcedStyle: arguments
11
11
  # # bad
12
12
  # Rails.root.join('app/models/goober')
13
13
  # File.join(Rails.root, 'app/models/goober')
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # # good
17
17
  # Rails.root.join('app', 'models', 'goober')
18
18
  #
19
- # @example EnforcedStyle: slashes
19
+ # @example EnforcedStyle: slashes (default)
20
20
  # # bad
21
21
  # Rails.root.join('app', 'models', 'goober')
22
22
  # File.join(Rails.root, 'app/models/goober')
@@ -129,7 +129,7 @@ module RuboCop
129
129
  end
130
130
 
131
131
  def build_source_for_or_method(other)
132
- if other.parenthesized? || !other.arguments?
132
+ if other.parenthesized? || other.method?('[]') || !other.arguments?
133
133
  " || #{other.source}"
134
134
  else
135
135
  method = range_between(
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks rake task definition without `environment` dependency.
7
+ # `environment` dependency is important because it loads application code
8
+ # for the rake task. The rake task cannot use application code, such as
9
+ # models, without `environment` dependency.
10
+ #
11
+ # You can ignore the offense if the task satisfies at least one of the
12
+ # following conditions:
13
+ #
14
+ # * The task does not need application code.
15
+ # * The task invokes :environment task.
16
+ #
17
+ # @example
18
+ # # bad
19
+ # task :foo do
20
+ # do_something
21
+ # end
22
+ #
23
+ # # good
24
+ # task foo: :environment do
25
+ # do_something
26
+ # end
27
+ #
28
+ class RakeEnvironment < Cop
29
+ MSG = 'Set `:environment` task as a dependency to all rake task.'
30
+
31
+ def_node_matcher :task_definition?, <<-PATTERN
32
+ (send nil? :task ...)
33
+ PATTERN
34
+
35
+ def on_send(node)
36
+ return unless task_definition?(node)
37
+ return if task_name(node) == :default
38
+ return if with_dependencies?(node)
39
+
40
+ add_offense(node)
41
+ end
42
+
43
+ private
44
+
45
+ def task_name(node)
46
+ first_arg = node.arguments[0]
47
+ case first_arg&.type
48
+ when :sym, :str
49
+ first_arg.value.to_sym
50
+ when :hash
51
+ return nil if first_arg.children.size != 1
52
+
53
+ pair = first_arg.children.first
54
+ key = pair.children.first
55
+ case key.type
56
+ when :sym, :str
57
+ key.value.to_sym
58
+ end
59
+ end
60
+ end
61
+
62
+ def with_dependencies?(node)
63
+ first_arg = node.arguments[0]
64
+ return false unless first_arg
65
+
66
+ if first_arg.hash_type?
67
+ with_hash_style_dependencies?(first_arg)
68
+ else
69
+ task_args = node.arguments[1]
70
+ return false unless task_args
71
+ return false unless task_args.hash_type?
72
+
73
+ with_hash_style_dependencies?(task_args)
74
+ end
75
+ end
76
+
77
+ def with_hash_style_dependencies?(hash_node)
78
+ deps = hash_node.pairs.first&.value
79
+ return false unless deps
80
+
81
+ case deps.type
82
+ when :array
83
+ !deps.values.empty?
84
+ else
85
+ true
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  '`allow_nil: false` is redundant when `allow_blank` is true.'
37
37
 
38
38
  def on_send(node)
39
- return unless node.method_name == :validates
39
+ return unless node.method?(:validates)
40
40
 
41
41
  allow_nil, allow_blank = find_allow_nil_and_allow_blank(node)
42
42
  return unless allow_nil && allow_blank
@@ -127,22 +127,15 @@ module RuboCop
127
127
  # @see https://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html
128
128
  class ReversibleMigration < Cop
129
129
  MSG = '%<action>s is not reversible.'
130
- IRREVERSIBLE_CHANGE_TABLE_CALLS = %i[
131
- change change_default remove
132
- ].freeze
133
130
 
134
131
  def_node_matcher :irreversible_schema_statement_call, <<-PATTERN
135
- (send nil? ${:change_table_comment :execute :remove_belongs_to} ...)
132
+ (send nil? ${:execute :remove_belongs_to} ...)
136
133
  PATTERN
137
134
 
138
135
  def_node_matcher :drop_table_call, <<-PATTERN
139
136
  (send nil? :drop_table ...)
140
137
  PATTERN
141
138
 
142
- def_node_matcher :change_column_default_call, <<-PATTERN
143
- (send nil? :change_column_default {[(sym _) (sym _)] (splat _)} $...)
144
- PATTERN
145
-
146
139
  def_node_matcher :remove_column_call, <<-PATTERN
147
140
  (send nil? :remove_column $...)
148
141
  PATTERN
@@ -161,7 +154,7 @@ module RuboCop
161
154
 
162
155
  check_irreversible_schema_statement_node(node)
163
156
  check_drop_table_node(node)
164
- check_change_column_default_node(node)
157
+ check_reversible_hash_node(node)
165
158
  check_remove_column_node(node)
166
159
  check_remove_foreign_key_node(node)
167
160
  end
@@ -193,17 +186,15 @@ module RuboCop
193
186
  end
194
187
  end
195
188
 
196
- def check_change_column_default_node(node)
197
- change_column_default_call(node) do |args|
198
- unless all_hash_key?(args.last, :from, :to)
199
- add_offense(
200
- node,
201
- message: format(
202
- MSG, action: 'change_column_default(without :from and :to)'
203
- )
204
- )
205
- end
206
- end
189
+ def check_reversible_hash_node(node)
190
+ return if reversible_change_table_call?(node)
191
+
192
+ add_offense(
193
+ node,
194
+ message: format(
195
+ MSG, action: "#{node.method_name}(without :from and :to)"
196
+ )
197
+ )
207
198
  end
208
199
 
209
200
  def check_remove_column_node(node)
@@ -244,7 +235,7 @@ module RuboCop
244
235
  def check_change_table_offense(receiver, node)
245
236
  method_name = node.method_name
246
237
  return if receiver != node.receiver &&
247
- !IRREVERSIBLE_CHANGE_TABLE_CALLS.include?(method_name)
238
+ reversible_change_table_call?(node)
248
239
 
249
240
  add_offense(
250
241
  node,
@@ -252,6 +243,18 @@ module RuboCop
252
243
  )
253
244
  end
254
245
 
246
+ def reversible_change_table_call?(node)
247
+ case node.method_name
248
+ when :change, :remove
249
+ false
250
+ when :change_default, :change_column_default, :change_table_comment,
251
+ :change_column_comment
252
+ all_hash_key?(node.arguments.last, :from, :to)
253
+ else
254
+ true
255
+ end
256
+ end
257
+
255
258
  def within_change_method?(node)
256
259
  node.each_ancestor(:def).any? do |ancestor|
257
260
  ancestor.method?(:change)
@@ -6,38 +6,36 @@ module RuboCop
6
6
  # This cop converts usages of `try!` to `&.`. It can also be configured
7
7
  # to convert `try`. It will convert code to use safe navigation.
8
8
  #
9
- # @example
10
- # # ConvertTry: false
11
- # # bad
12
- # foo.try!(:bar)
13
- # foo.try!(:bar, baz)
14
- # foo.try!(:bar) { |e| e.baz }
9
+ # @example ConvertTry: false (default)
10
+ # # bad
11
+ # foo.try!(:bar)
12
+ # foo.try!(:bar, baz)
13
+ # foo.try!(:bar) { |e| e.baz }
15
14
  #
16
- # foo.try!(:[], 0)
15
+ # foo.try!(:[], 0)
17
16
  #
18
- # # good
19
- # foo.try(:bar)
20
- # foo.try(:bar, baz)
21
- # foo.try(:bar) { |e| e.baz }
17
+ # # good
18
+ # foo.try(:bar)
19
+ # foo.try(:bar, baz)
20
+ # foo.try(:bar) { |e| e.baz }
22
21
  #
23
- # foo&.bar
24
- # foo&.bar(baz)
25
- # foo&.bar { |e| e.baz }
22
+ # foo&.bar
23
+ # foo&.bar(baz)
24
+ # foo&.bar { |e| e.baz }
26
25
  #
26
+ # @example ConvertTry: true
27
+ # # bad
28
+ # foo.try!(:bar)
29
+ # foo.try!(:bar, baz)
30
+ # foo.try!(:bar) { |e| e.baz }
31
+ # foo.try(:bar)
32
+ # foo.try(:bar, baz)
33
+ # foo.try(:bar) { |e| e.baz }
27
34
  #
28
- # # ConvertTry: true
29
- # # bad
30
- # foo.try!(:bar)
31
- # foo.try!(:bar, baz)
32
- # foo.try!(:bar) { |e| e.baz }
33
- # foo.try(:bar)
34
- # foo.try(:bar, baz)
35
- # foo.try(:bar) { |e| e.baz }
36
- #
37
- # # good
38
- # foo&.bar
39
- # foo&.bar(baz)
40
- # foo&.bar { |e| e.baz }
35
+ # # good
36
+ # foo&.bar
37
+ # foo&.bar(baz)
38
+ # foo&.bar { |e| e.baz }
41
39
  class SafeNavigation < Cop
42
40
  include RangeHelp
43
41
 
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks to make sure safe navigation isn't used with `blank?` in
7
+ # a conditional.
8
+ #
9
+ # While the safe navigation operator is generally a good idea, when
10
+ # checking `foo&.blank?` in a conditional, `foo` being `nil` will actually
11
+ # do the opposite of what the author intends.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # do_something if foo&.blank?
16
+ # do_something unless foo&.blank?
17
+ #
18
+ # # good
19
+ # do_something if foo.blank?
20
+ # do_something unless foo.blank?
21
+ #
22
+ class SafeNavigationWithBlank < Cop
23
+ MSG =
24
+ 'Avoid calling `blank?` with the safe navigation operator ' \
25
+ 'in conditionals.'
26
+
27
+ def_node_matcher :safe_navigation_blank_in_conditional?, <<-PATTERN
28
+ (if $(csend ... :blank?) ...)
29
+ PATTERN
30
+
31
+ def on_if(node)
32
+ return unless safe_navigation_blank_in_conditional?(node)
33
+
34
+ add_offense(node)
35
+ end
36
+
37
+ def autocorrect(node)
38
+ lambda do |corrector|
39
+ corrector.replace(
40
+ safe_navigation_blank_in_conditional?(node).location.dot,
41
+ '.'
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -141,7 +141,7 @@ module RuboCop
141
141
  return unless persist_method?(node)
142
142
  return if return_value_assigned?(node)
143
143
  return if implicit_return?(node)
144
- return if check_used_in_conditional(node)
144
+ return if check_used_in_condition_or_compound_boolean(node)
145
145
  return if argument?(node)
146
146
  return if explicit_return?(node)
147
147
 
@@ -211,8 +211,8 @@ module RuboCop
211
211
  array
212
212
  end
213
213
 
214
- def check_used_in_conditional(node)
215
- return false unless conditional?(node)
214
+ def check_used_in_condition_or_compound_boolean(node)
215
+ return false unless in_condition_or_compound_boolean?(node)
216
216
 
217
217
  unless MODIFY_PERSIST_METHODS.include?(node.method_name)
218
218
  add_offense_for_node(node, CREATE_CONDITIONAL_MSG)
@@ -221,15 +221,21 @@ module RuboCop
221
221
  true
222
222
  end
223
223
 
224
- def conditional?(node) # rubocop:disable Metrics/CyclomaticComplexity
224
+ def in_condition_or_compound_boolean?(node)
225
225
  node = node.block_node || node
226
+ parent = node.parent
227
+ return false unless parent
226
228
 
227
- condition = node.parent
228
- return false unless condition
229
+ operator_or_single_negative?(parent) ||
230
+ (conditional?(parent) && node == parent.condition)
231
+ end
232
+
233
+ def operator_or_single_negative?(node)
234
+ node.or_type? || node.and_type? || single_negative?(node)
235
+ end
229
236
 
230
- condition.if_type? || condition.case_type? ||
231
- condition.or_type? || condition.and_type? ||
232
- single_negative?(condition)
237
+ def conditional?(parent)
238
+ parent.if_type? || parent.case_type?
233
239
  end
234
240
 
235
241
  def allowed_receiver?(node)
@@ -249,7 +255,7 @@ module RuboCop
249
255
  if node.variable?
250
256
  node.node_parts.first == receiver_part.to_sym
251
257
  elsif node.send_type?
252
- node.method_name == receiver_part.to_sym
258
+ node.method?(receiver_part.to_sym)
253
259
  elsif node.const_type?
254
260
  const_matches?(node.const_name, receiver_part)
255
261
  end
@@ -188,7 +188,7 @@ module RuboCop
188
188
  selector_node = node
189
189
 
190
190
  while node&.send_type?
191
- break if node.method_name == :localtime
191
+ break if node.method?(:localtime)
192
192
 
193
193
  node = node.parent
194
194
  end
@@ -9,9 +9,11 @@ module RuboCop
9
9
  # @example
10
10
  # # bad
11
11
  # Rails.env.proudction?
12
+ # Rails.env == 'proudction'
12
13
  #
13
14
  # # good
14
15
  # Rails.env.production?
16
+ # Rails.env == 'production'
15
17
  class UnknownEnv < Cop
16
18
  include NameSimilarity
17
19
 
@@ -19,28 +21,43 @@ module RuboCop
19
21
  MSG_SIMILAR = 'Unknown environment `%<name>s`. ' \
20
22
  'Did you mean `%<similar>s`?'
21
23
 
22
- def_node_matcher :unknown_environment?, <<-PATTERN
24
+ def_node_matcher :rails_env?, <<~PATTERN
23
25
  (send
24
- (send
25
- {(const nil? :Rails) (const (cbase) :Rails)}
26
- :env)
27
- $#unknown_env_name?)
26
+ {(const nil? :Rails) (const (cbase) :Rails)}
27
+ :env)
28
+ PATTERN
29
+
30
+ def_node_matcher :unknown_environment_predicate?, <<~PATTERN
31
+ (send #rails_env? $#unknown_env_predicate?)
32
+ PATTERN
33
+
34
+ def_node_matcher :unknown_environment_equal?, <<-PATTERN
35
+ {
36
+ (send #rails_env? {:== :===} $(str #unknown_env_name?))
37
+ (send $(str #unknown_env_name?) {:== :===} #rails_env?)
38
+ }
28
39
  PATTERN
29
40
 
30
41
  def on_send(node)
31
- unknown_environment?(node) do |name|
42
+ unknown_environment_predicate?(node) do |name|
32
43
  add_offense(node, location: :selector, message: message(name))
33
44
  end
45
+
46
+ unknown_environment_equal?(node) do |str_node|
47
+ name = str_node.value
48
+ add_offense(str_node, message: message(name))
49
+ end
34
50
  end
35
51
 
36
52
  private
37
53
 
38
54
  def collect_variable_like_names(_scope)
39
- environments.map { |env| env + '?' }
55
+ environments
40
56
  end
41
57
 
42
58
  def message(name)
43
- similar = find_similar_name(name.to_s, [])
59
+ name = name.to_s.chomp('?')
60
+ similar = find_similar_name(name, [])
44
61
  if similar
45
62
  format(MSG_SIMILAR, name: name, similar: similar)
46
63
  else
@@ -48,12 +65,16 @@ module RuboCop
48
65
  end
49
66
  end
50
67
 
51
- def unknown_env_name?(name)
68
+ def unknown_env_predicate?(name)
52
69
  name = name.to_s
53
70
  name.end_with?('?') &&
54
71
  !environments.include?(name[0..-2])
55
72
  end
56
73
 
74
+ def unknown_env_name?(name)
75
+ !environments.include?(name)
76
+ end
77
+
57
78
  def environments
58
79
  cop_config['Environments']
59
80
  end
@@ -6,7 +6,9 @@ require_relative 'rails/action_filter'
6
6
  require_relative 'rails/active_record_aliases'
7
7
  require_relative 'rails/active_record_override'
8
8
  require_relative 'rails/active_support_aliases'
9
+ require_relative 'rails/application_controller'
9
10
  require_relative 'rails/application_job'
11
+ require_relative 'rails/application_mailer'
10
12
  require_relative 'rails/application_record'
11
13
  require_relative 'rails/assert_not'
12
14
  require_relative 'rails/belongs_to'
@@ -39,6 +41,7 @@ require_relative 'rails/output_safety'
39
41
  require_relative 'rails/pluralization_grammar'
40
42
  require_relative 'rails/presence'
41
43
  require_relative 'rails/present'
44
+ require_relative 'rails/rake_environment'
42
45
  require_relative 'rails/read_write_attribute'
43
46
  require_relative 'rails/redundant_allow_nil'
44
47
  require_relative 'rails/redundant_receiver_in_with_options'
@@ -48,6 +51,7 @@ require_relative 'rails/relative_date_constant'
48
51
  require_relative 'rails/request_referer'
49
52
  require_relative 'rails/reversible_migration'
50
53
  require_relative 'rails/safe_navigation'
54
+ require_relative 'rails/safe_navigation_with_blank'
51
55
  require_relative 'rails/save_bang'
52
56
  require_relative 'rails/scope_args'
53
57
  require_relative 'rails/skips_model_validations'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Rails
5
5
  # This module holds the RuboCop Rails version information.
6
6
  module Version
7
- STRING = '2.3.2'
7
+ STRING = '2.4.0'
8
8
  end
9
9
  end
10
10
  end
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.3.2
4
+ version: 2.4.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-09-01 00:00:00.000000000 Z
13
+ date: 2019-11-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -60,7 +60,9 @@ files:
60
60
  - lib/rubocop/cop/rails/active_record_aliases.rb
61
61
  - lib/rubocop/cop/rails/active_record_override.rb
62
62
  - lib/rubocop/cop/rails/active_support_aliases.rb
63
+ - lib/rubocop/cop/rails/application_controller.rb
63
64
  - lib/rubocop/cop/rails/application_job.rb
65
+ - lib/rubocop/cop/rails/application_mailer.rb
64
66
  - lib/rubocop/cop/rails/application_record.rb
65
67
  - lib/rubocop/cop/rails/assert_not.rb
66
68
  - lib/rubocop/cop/rails/belongs_to.rb
@@ -93,6 +95,7 @@ files:
93
95
  - lib/rubocop/cop/rails/pluralization_grammar.rb
94
96
  - lib/rubocop/cop/rails/presence.rb
95
97
  - lib/rubocop/cop/rails/present.rb
98
+ - lib/rubocop/cop/rails/rake_environment.rb
96
99
  - lib/rubocop/cop/rails/read_write_attribute.rb
97
100
  - lib/rubocop/cop/rails/redundant_allow_nil.rb
98
101
  - lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb
@@ -102,6 +105,7 @@ files:
102
105
  - lib/rubocop/cop/rails/request_referer.rb
103
106
  - lib/rubocop/cop/rails/reversible_migration.rb
104
107
  - lib/rubocop/cop/rails/safe_navigation.rb
108
+ - lib/rubocop/cop/rails/safe_navigation_with_blank.rb
105
109
  - lib/rubocop/cop/rails/save_bang.rb
106
110
  - lib/rubocop/cop/rails/scope_args.rb
107
111
  - lib/rubocop/cop/rails/skips_model_validations.rb
@@ -137,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
141
  - !ruby/object:Gem::Version
138
142
  version: '0'
139
143
  requirements: []
140
- rubygems_version: 3.0.6
144
+ rubygems_version: 3.0.3
141
145
  signing_key:
142
146
  specification_version: 4
143
147
  summary: Automatic Rails code style checking tool.