rubocop-rspec 2.6.0 → 2.7.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: ec6f02aa20957826bdff135547211062ac19bdac9b260d2a008c45973944ff16
4
- data.tar.gz: 57454e8f60b40062ad5da0ef9e4ce83c8539aea78d13d8412af24f43c01c2e1d
3
+ metadata.gz: f73bb98579faf4e173aa834c1a3aa5fc1c9b6aa7c8790d3fcef2451594fadc78
4
+ data.tar.gz: e66399f76cea55c1eed9b348f3015ab726fb5df49b2f1a391bbf043b45b18507
5
5
  SHA512:
6
- metadata.gz: 51333677ad7c458afd2446b21c6e900c5f4ba597d2659cc2e389e5c9e223fe1885e54c8d427a8213519bd9176c0bfbc146910d6cd3c5dea7c9a69450ac34ce97
7
- data.tar.gz: 5f6cffcb89273ddca1615907f8de6e619697c63c1255b630320b3852a9266aef4d260d295a6ee57ea1c91e862ad584750fac2784a2a536aea37887f829a14bd5
6
+ metadata.gz: 44ba849ca8fd9ad7cb65355c78046bd5702f9d5b1f5df305fda876c6d7feb5947ea15e6fdb3749e32c1ae18b089703abefc074991fc780d6147b2295f3202a05
7
+ data.tar.gz: 5281f8fa3c1cb64028dd54544fc2f26fe25f382a5f842fa0dfe5040dbb6ea3627e74a386a596806cd6a0f56d8353d749fbec713c48c19d45f55840f9983cf755
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Master (Unreleased)
4
4
 
5
+ ## 2.7.0 (2021-12-26)
6
+
7
+ * Add new `RSpec/FactoryBot/SyntaxMethods` cop. ([@leoarnold][])
8
+ * Exclude `task` type specs from `RSpec/DescribeClass` cop. ([@harry-graham][])
9
+
5
10
  ## 2.6.0 (2021-11-08)
6
11
 
7
12
  * Fix merging RSpec DSL configuration from third-party gems. ([@pirj][])
@@ -651,3 +656,5 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
651
656
  [@dswij]: https://github.com/dswij
652
657
  [@francois-ferrandis]: https://github.com/francois-ferrandis
653
658
  [@r7kamura]: https://github.com/r7kamura
659
+ [@leoarnold]: https://github.com/leoarnold
660
+ [@harry-graham]: https://github.com/harry-graham
data/config/default.yml CHANGED
@@ -196,8 +196,9 @@ RSpec/DescribeClass:
196
196
  - system
197
197
  - mailbox
198
198
  - aruba
199
+ - task
199
200
  VersionAdded: '1.0'
200
- VersionChanged: '2.5'
201
+ VersionChanged: '2.7'
201
202
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/DescribeClass
202
203
 
203
204
  RSpec/DescribeMethod:
@@ -816,6 +817,13 @@ RSpec/FactoryBot/FactoryClassName:
816
817
  VersionChanged: '2.0'
817
818
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/FactoryBot/FactoryClassName
818
819
 
820
+ RSpec/FactoryBot/SyntaxMethods:
821
+ Description: Use shorthands from `FactoryBot::Syntax::Methods` in your specs.
822
+ Enabled: pending
823
+ SafeAutoCorrect: false
824
+ VersionAdded: '2.7'
825
+ StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/FactoryBot/SyntaxMethods
826
+
819
827
  RSpec/Rails:
820
828
  Enabled: true
821
829
  Include: *1
@@ -42,6 +42,7 @@ module RuboCop
42
42
  # end
43
43
  class FeatureMethods < Base
44
44
  extend AutoCorrector
45
+ include InsideExampleGroup
45
46
 
46
47
  MSG = 'Use `%<replacement>s` instead of `%<method>s`.'
47
48
 
@@ -60,13 +61,6 @@ module RuboCop
60
61
  {#{MAP.keys.map(&:inspect).join(' ')}}
61
62
  PATTERN
62
63
 
63
- # @!method spec?(node)
64
- def_node_matcher :spec?, <<-PATTERN
65
- (block
66
- (send #rspec? {:describe :feature} ...)
67
- ...)
68
- PATTERN
69
-
70
64
  # @!method feature_method(node)
71
65
  def_node_matcher :feature_method, <<-PATTERN
72
66
  (block
@@ -75,7 +69,7 @@ module RuboCop
75
69
  PATTERN
76
70
 
77
71
  def on_block(node)
78
- return unless inside_spec?(node)
72
+ return unless inside_example_group?(node)
79
73
 
80
74
  feature_method(node) do |send_node, match|
81
75
  next if enabled?(match)
@@ -93,21 +87,6 @@ module RuboCop
93
87
 
94
88
  private
95
89
 
96
- def inside_spec?(node)
97
- return spec?(node) if root_node?(node)
98
-
99
- root = node.ancestors.find { |parent| root_node?(parent) }
100
- spec?(root)
101
- end
102
-
103
- def root_node?(node)
104
- node.parent.nil? || root_with_siblings?(node.parent)
105
- end
106
-
107
- def root_with_siblings?(node)
108
- node.begin_type? && node.parent.nil?
109
- end
110
-
111
90
  def enabled?(method_name)
112
91
  enabled_methods.include?(method_name)
113
92
  end
@@ -27,6 +27,7 @@ module RuboCop
27
27
  class CreateList < Base
28
28
  extend AutoCorrector
29
29
  include ConfigurableEnforcedStyle
30
+ include RuboCop::RSpec::FactoryBot::Language
30
31
 
31
32
  MSG_CREATE_LIST = 'Prefer create_list.'
32
33
  MSG_N_TIMES = 'Prefer %<number>s.times.'
@@ -43,12 +44,12 @@ module RuboCop
43
44
 
44
45
  # @!method factory_call(node)
45
46
  def_node_matcher :factory_call, <<-PATTERN
46
- (send ${(const nil? {:FactoryGirl :FactoryBot}) nil?} :create (sym $_) $...)
47
+ (send ${nil? #factory_bot?} :create (sym $_) $...)
47
48
  PATTERN
48
49
 
49
50
  # @!method factory_list_call(node)
50
51
  def_node_matcher :factory_list_call, <<-PATTERN
51
- (send {(const nil? {:FactoryGirl :FactoryBot}) nil?} :create_list (sym _) (int $_) ...)
52
+ (send {nil? #factory_bot?} :create_list (sym _) (int $_) ...)
52
53
  PATTERN
53
54
 
54
55
  def on_block(node)
@@ -160,7 +161,7 @@ module RuboCop
160
161
  def call_with_block_replacement(node)
161
162
  block = node.body
162
163
  arguments = build_arguments(block, node.receiver.source)
163
- replacement = format_receiver(block.send_node.receiver)
164
+ replacement = format_receiver(block.receiver)
164
165
  replacement += format_method_call(block, 'create_list', arguments)
165
166
  replacement += format_block(block)
166
167
  replacement
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ module FactoryBot
7
+ # Use shorthands from `FactoryBot::Syntax::Methods` in your specs.
8
+ #
9
+ # @safety
10
+ # The auto-correction is marked as unsafe because the cop
11
+ # cannot verify whether you already include
12
+ # `FactoryBot::Syntax::Methods` in your test suite.
13
+ #
14
+ # If you're using Rails, add the following configuration to
15
+ # `spec/support/factory_bot.rb` and be sure to require that file in
16
+ # `rails_helper.rb`:
17
+ #
18
+ # [source,ruby]
19
+ # ----
20
+ # RSpec.configure do |config|
21
+ # config.include FactoryBot::Syntax::Methods
22
+ # end
23
+ # ----
24
+ #
25
+ # If you're not using Rails:
26
+ #
27
+ # [source,ruby]
28
+ # ----
29
+ # RSpec.configure do |config|
30
+ # config.include FactoryBot::Syntax::Methods
31
+ #
32
+ # config.before(:suite) do
33
+ # FactoryBot.find_definitions
34
+ # end
35
+ # end
36
+ # ----
37
+ #
38
+ # @example
39
+ # # bad
40
+ # FactoryBot.create(:bar)
41
+ # FactoryBot.build(:bar)
42
+ # FactoryBot.attributes_for(:bar)
43
+ #
44
+ # # good
45
+ # create(:bar)
46
+ # build(:bar)
47
+ # attributes_for(:bar)
48
+ #
49
+ class SyntaxMethods < Base
50
+ extend AutoCorrector
51
+ include InsideExampleGroup
52
+ include RangeHelp
53
+ include RuboCop::RSpec::FactoryBot::Language
54
+
55
+ MSG = 'Use `%<method>s` from `FactoryBot::Syntax::Methods`.'
56
+
57
+ RESTRICT_ON_SEND = %i[
58
+ attributes_for
59
+ attributes_for_list
60
+ attributes_for_pair
61
+ build
62
+ build_list
63
+ build_pair
64
+ build_stubbed
65
+ build_stubbed_list
66
+ build_stubbed_pair
67
+ create
68
+ create_list
69
+ create_pair
70
+ generate
71
+ generate_list
72
+ null
73
+ null_list
74
+ null_pair
75
+ ].to_set.freeze
76
+
77
+ def on_send(node)
78
+ return unless factory_bot?(node.receiver)
79
+ return unless inside_example_group?(node)
80
+
81
+ message = format(MSG, method: node.method_name)
82
+
83
+ add_offense(crime_scene(node), message: message) do |corrector|
84
+ corrector.remove(offense(node))
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def crime_scene(node)
91
+ range_between(
92
+ node.loc.expression.begin_pos,
93
+ node.loc.selector.end_pos
94
+ )
95
+ end
96
+
97
+ def offense(node)
98
+ range_between(
99
+ node.loc.expression.begin_pos,
100
+ node.loc.selector.begin_pos
101
+ )
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Helps you identify whether a given node
7
+ # is within an example group or not.
8
+ module InsideExampleGroup
9
+ private
10
+
11
+ def inside_example_group?(node)
12
+ return example_group?(node) if example_group_root?(node)
13
+
14
+ root = node.ancestors.find { |parent| example_group_root?(parent) }
15
+
16
+ example_group?(root)
17
+ end
18
+
19
+ def example_group_root?(node)
20
+ node.parent.nil? || example_group_root_with_siblings?(node.parent)
21
+ end
22
+
23
+ def example_group_root_with_siblings?(node)
24
+ node.begin_type? && node.parent.nil?
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -7,6 +7,7 @@ require_relative 'rspec/capybara/visibility_matcher'
7
7
  require_relative 'rspec/factory_bot/attribute_defined_statically'
8
8
  require_relative 'rspec/factory_bot/create_list'
9
9
  require_relative 'rspec/factory_bot/factory_class_name'
10
+ require_relative 'rspec/factory_bot/syntax_methods'
10
11
 
11
12
  require_relative 'rspec/rails/avoid_setup_hook'
12
13
  begin
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module RSpec
5
+ module FactoryBot
6
+ # Contains node matchers for common FactoryBot DSL.
7
+ module Language
8
+ extend RuboCop::NodePattern::Macros
9
+
10
+ # @!method factory_bot?(node)
11
+ def_node_matcher :factory_bot?, <<~PATTERN
12
+ (const {nil? cbase} {:FactoryGirl :FactoryBot})
13
+ PATTERN
14
+ end
15
+ end
16
+ end
17
+ end
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module RSpec
5
5
  # Version information for the RSpec RuboCop plugin.
6
6
  module Version
7
- STRING = '2.6.0'
7
+ STRING = '2.7.0'
8
8
  end
9
9
  end
10
10
  end
data/lib/rubocop-rspec.rb CHANGED
@@ -12,11 +12,14 @@ require_relative 'rubocop/rspec/wording'
12
12
  require_relative 'rubocop/rspec/language/node_pattern'
13
13
  require_relative 'rubocop/rspec/language'
14
14
 
15
+ require_relative 'rubocop/rspec/factory_bot/language'
16
+
15
17
  require_relative 'rubocop/cop/rspec/mixin/top_level_group'
16
18
  require_relative 'rubocop/cop/rspec/mixin/variable'
17
19
  require_relative 'rubocop/cop/rspec/mixin/final_end_location'
18
20
  require_relative 'rubocop/cop/rspec/mixin/comments_help'
19
21
  require_relative 'rubocop/cop/rspec/mixin/empty_line_separation'
22
+ require_relative 'rubocop/cop/rspec/mixin/inside_example_group'
20
23
 
21
24
  require_relative 'rubocop/rspec/concept'
22
25
  require_relative 'rubocop/rspec/example_group'
@@ -31,8 +34,8 @@ RuboCop::RSpec::Inject.defaults!
31
34
 
32
35
  require_relative 'rubocop/cop/rspec_cops'
33
36
 
34
- # We have to register our autocorrect incompatibilies in RuboCop's cops as well
35
- # so we do not hit infinite loops
37
+ # We have to register our autocorrect incompatibilities in RuboCop's cops
38
+ # as well so we do not hit infinite loops
36
39
 
37
40
  module RuboCop
38
41
  module Cop
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Backus
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-11-08 00:00:00.000000000 Z
13
+ date: 2021-12-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -166,6 +166,7 @@ files:
166
166
  - lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
167
167
  - lib/rubocop/cop/rspec/factory_bot/create_list.rb
168
168
  - lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
169
+ - lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb
169
170
  - lib/rubocop/cop/rspec/file_path.rb
170
171
  - lib/rubocop/cop/rspec/focus.rb
171
172
  - lib/rubocop/cop/rspec/hook_argument.rb
@@ -189,6 +190,7 @@ files:
189
190
  - lib/rubocop/cop/rspec/mixin/comments_help.rb
190
191
  - lib/rubocop/cop/rspec/mixin/empty_line_separation.rb
191
192
  - lib/rubocop/cop/rspec/mixin/final_end_location.rb
193
+ - lib/rubocop/cop/rspec/mixin/inside_example_group.rb
192
194
  - lib/rubocop/cop/rspec/mixin/top_level_group.rb
193
195
  - lib/rubocop/cop/rspec/mixin/variable.rb
194
196
  - lib/rubocop/cop/rspec/multiple_describes.rb
@@ -234,6 +236,7 @@ files:
234
236
  - lib/rubocop/rspec/example.rb
235
237
  - lib/rubocop/rspec/example_group.rb
236
238
  - lib/rubocop/rspec/factory_bot.rb
239
+ - lib/rubocop/rspec/factory_bot/language.rb
237
240
  - lib/rubocop/rspec/hook.rb
238
241
  - lib/rubocop/rspec/inject.rb
239
242
  - lib/rubocop/rspec/language.rb
@@ -247,6 +250,7 @@ licenses:
247
250
  metadata:
248
251
  changelog_uri: https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md
249
252
  documentation_uri: https://docs.rubocop.org/rubocop-rspec/
253
+ rubygems_mfa_required: 'true'
250
254
  post_install_message:
251
255
  rdoc_options: []
252
256
  require_paths:
@@ -262,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
262
266
  - !ruby/object:Gem::Version
263
267
  version: '0'
264
268
  requirements: []
265
- rubygems_version: 3.2.29
269
+ rubygems_version: 3.3.1
266
270
  signing_key:
267
271
  specification_version: 4
268
272
  summary: Code style checking for RSpec files