rubocop-rails 2.3.2 → 2.4.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 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.