rubocop-rspec 2.3.0 → 2.7.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: 4a953b5fa50cd545314cbe25e453b476b670cd2a4eb2d60c75109354ed7c333c
4
- data.tar.gz: be5782eb1c0f8e4ca86b28ed39fba908719afe73dd544a161885719485853a89
3
+ metadata.gz: f73bb98579faf4e173aa834c1a3aa5fc1c9b6aa7c8790d3fcef2451594fadc78
4
+ data.tar.gz: e66399f76cea55c1eed9b348f3015ab726fb5df49b2f1a391bbf043b45b18507
5
5
  SHA512:
6
- metadata.gz: e859b8c055f4502d3156595c8293decfe10883a6bea0f61a21558b9acc771b1231699439611a3da3ccb0841495ad7c1a5af3ec1c6d3e948fbb29b70a0b77289d
7
- data.tar.gz: a817dcdbcd1850d4888f4d5fc58837a1c8c59fa754f10dff0aa3eebf24013e88230d84719592115b3339551ac2c932240d01bac1b8a5094982943f1a9e960908
6
+ metadata.gz: 44ba849ca8fd9ad7cb65355c78046bd5702f9d5b1f5df305fda876c6d7feb5947ea15e6fdb3749e32c1ae18b089703abefc074991fc780d6147b2295f3202a05
7
+ data.tar.gz: 5281f8fa3c1cb64028dd54544fc2f26fe25f382a5f842fa0dfe5040dbb6ea3627e74a386a596806cd6a0f56d8353d749fbec713c48c19d45f55840f9983cf755
data/CHANGELOG.md CHANGED
@@ -2,6 +2,40 @@
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
+
10
+ ## 2.6.0 (2021-11-08)
11
+
12
+ * Fix merging RSpec DSL configuration from third-party gems. ([@pirj][])
13
+ * Fix `RSpec/ExcessiveDocstringSpacing` false positive for multi-line indented strings. ([@G-Rath][])
14
+ * Fix `Include` configuration for sub-departments. ([@pirj][])
15
+ * Ignore heredocs in `RSpec/ExcessiveDocstringSpacing`. ([@G-Rath][])
16
+ * Stop `RSpec/ExampleWording` from trying to correct heredocs. ([@G-Rath][])
17
+ * Add autocorrect support for `RSpec/VariableDefinition`. ([@r7kamura][])
18
+
19
+ ## 2.5.0 (2021-09-21)
20
+
21
+ * Declare autocorrect as unsafe for `ExpectChange`. ([@francois-ferrandis][])
22
+ * Fix each example for `RSpec/HookArgument`. ([@lokhi][])
23
+ * Exclude unrelated Rails directories from `RSpec/DescribeClass`. ([@MothOnMars][])
24
+ * Add `RSpec/ExcessiveDocstringSpacing` cop. ([@G-Rath][])
25
+ * Add `RSpec/SubjectDeclaration` cop. ([@dswij][])
26
+ * Fix excessive whitespace removal in `RSpec/EmptyHook` autocorrection. ([@pirj][])
27
+ * Bump RuboCop requirement to v1.19.0. ([@pirj][])
28
+ * Fix false positive in `RSpec/IteratedExpectation` when there is single, non-expectation statement in the block body. ([@Darhazer][])
29
+
30
+ ## 2.4.0 (2021-06-09)
31
+
32
+ * Update `RSpec/FilePath` to check suffix when given a non-constant top-level node (e.g. features). ([@topalovic][])
33
+ * Add missing documentation for `single_statement_only` style of `RSpec/ImplicitSubject` cop. ([@tejasbubane][])
34
+ * Fix an exception in `DescribedClass` when accessing a constant on a variable in a spec that is nested in a namespace. ([@rrosenblum][])
35
+ * Add new `RSpec/IdenticalEqualityAssertion` cop. ([@tejasbubane][])
36
+ * Add `RSpec/Rails/AvoidSetupHook` cop. ([@paydaylight][])
37
+ * Fix false negative in `RSpec/ExpectChange` cop with block style and chained method call. ([@tejasbubane][])
38
+
5
39
  ## 2.3.0 (2021-04-28)
6
40
 
7
41
  * Allow `RSpec/ContextWording` to accept multi-word prefixes. ([@hosamaly][])
@@ -613,3 +647,14 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features.
613
647
  [@hosamaly]: https://github.com/hosamaly
614
648
  [@stephannv]: https://github.com/stephannv
615
649
  [@Tietew]: https://github.com/Tietew
650
+ [@rrosenblum]: https://github.com/rrosenblum
651
+ [@paydaylight]: https://github.com/paydaylight
652
+ [@topalovic]: https://github.com/topalovic
653
+ [@lokhi]: https://github.com/lokhi
654
+ [@MothOnMars]: https://github.com/MothOnMars
655
+ [@G-Rath]: https://github.com/G-Rath
656
+ [@dswij]: https://github.com/dswij
657
+ [@francois-ferrandis]: https://github.com/francois-ferrandis
658
+ [@r7kamura]: https://github.com/r7kamura
659
+ [@leoarnold]: https://github.com/leoarnold
660
+ [@harry-graham]: https://github.com/harry-graham
data/README.md CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  [![Join the chat at https://gitter.im/rubocop-rspec/Lobby](https://badges.gitter.im/rubocop-rspec/Lobby.svg)](https://gitter.im/rubocop-rspec/Lobby)
4
4
  [![Gem Version](https://badge.fury.io/rb/rubocop-rspec.svg)](https://rubygems.org/gems/rubocop-rspec)
5
- [![CircleCI](https://circleci.com/gh/rubocop/rubocop-rspec.svg?style=svg)](https://circleci.com/gh/rubocop/rubocop-rspec)
6
- [![Test Coverage](https://api.codeclimate.com/v1/badges/8ffaabf633c968c22bdd/test_coverage)](https://codeclimate.com/github/rubocop-hq/rubocop-rspec/test_coverage)
7
- [![Maintainability](https://api.codeclimate.com/v1/badges/8ffaabf633c968c22bdd/maintainability)](https://codeclimate.com/github/rubocop-hq/rubocop-rspec/maintainability)
5
+ ![CI](https://github.com/rubocop-hq/rubocop-rspec/workflows/CI/badge.svg)
8
6
 
9
7
  RSpec-specific analysis for your projects, as an extension to
10
8
  [RuboCop](https://github.com/rubocop/rubocop).
@@ -67,7 +65,7 @@ end
67
65
 
68
66
  ### Code Climate
69
67
 
70
- rubocop-rspec is available on Code Climate as part of the rubocop engine. [Learn More](https://codeclimate.com/changelog/55a433bbe30ba00852000fac).
68
+ rubocop-rspec is available on Code Climate as part of the rubocop engine. [Learn More](https://marketing.codeclimate.com/changelog/55a433bbe30ba00852000fac/).
71
69
 
72
70
  ## Documentation
73
71
 
data/config/default.yml CHANGED
@@ -1,11 +1,24 @@
1
1
  ---
2
2
  RSpec:
3
3
  Enabled: true
4
- Include:
4
+ Include: &1
5
5
  - "**/*_spec.rb"
6
6
  - "**/spec/**/*"
7
- Language:
7
+ Language: &2
8
+ inherit_mode:
9
+ merge:
10
+ - Expectations
11
+ - Helpers
12
+ - Hooks
13
+ - HookScopes
14
+ - Runners
15
+ - Subjects
8
16
  ExampleGroups:
17
+ inherit_mode:
18
+ merge:
19
+ - Regular
20
+ - Skipped
21
+ - Focused
9
22
  Regular:
10
23
  - describe
11
24
  - context
@@ -20,6 +33,12 @@ RSpec:
20
33
  - fcontext
21
34
  - ffeature
22
35
  Examples:
36
+ inherit_mode:
37
+ merge:
38
+ - Regular
39
+ - Skipped
40
+ - Focused
41
+ - Pending
23
42
  Regular:
24
43
  - it
25
44
  - specify
@@ -62,6 +81,10 @@ RSpec:
62
81
  - all
63
82
  - suite
64
83
  Includes:
84
+ inherit_mode:
85
+ merge:
86
+ - Examples
87
+ - Context
65
88
  Examples:
66
89
  - it_behaves_like
67
90
  - it_should_behave_like
@@ -73,6 +96,10 @@ RSpec:
73
96
  - to_not
74
97
  - not_to
75
98
  SharedGroups:
99
+ inherit_mode:
100
+ merge:
101
+ - Examples
102
+ - Context
76
103
  Examples:
77
104
  - shared_examples
78
105
  - shared_examples_for
@@ -148,6 +175,12 @@ RSpec/ContextWording:
148
175
  RSpec/DescribeClass:
149
176
  Description: Check that the first argument to the top-level describe is a constant.
150
177
  Enabled: true
178
+ Exclude:
179
+ - "**/spec/features/**/*"
180
+ - "**/spec/requests/**/*"
181
+ - "**/spec/routing/**/*"
182
+ - "**/spec/system/**/*"
183
+ - "**/spec/views/**/*"
151
184
  IgnoredMetadata:
152
185
  type:
153
186
  - channel
@@ -163,8 +196,9 @@ RSpec/DescribeClass:
163
196
  - system
164
197
  - mailbox
165
198
  - aruba
199
+ - task
166
200
  VersionAdded: '1.0'
167
- VersionChanged: '1.44'
201
+ VersionChanged: '2.7'
168
202
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/DescribeClass
169
203
 
170
204
  RSpec/DescribeMethod:
@@ -269,6 +303,12 @@ RSpec/ExampleWithoutDescription:
269
303
  VersionAdded: '1.22'
270
304
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExampleWithoutDescription
271
305
 
306
+ RSpec/ExcessiveDocstringSpacing:
307
+ Description: Checks for excessive whitespace in example descriptions.
308
+ Enabled: pending
309
+ VersionAdded: '2.5'
310
+ StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExcessiveDocstringSpacing
311
+
272
312
  RSpec/ExampleWording:
273
313
  Description: Checks for common mistakes in example descriptions.
274
314
  Enabled: true
@@ -297,7 +337,9 @@ RSpec/ExpectChange:
297
337
  SupportedStyles:
298
338
  - method_call
299
339
  - block
340
+ SafeAutoCorrect: false
300
341
  VersionAdded: '1.22'
342
+ VersionChanged: '2.5'
301
343
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ExpectChange
302
344
 
303
345
  RSpec/ExpectInHook:
@@ -351,6 +393,12 @@ RSpec/HooksBeforeExamples:
351
393
  VersionAdded: '1.29'
352
394
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/HooksBeforeExamples
353
395
 
396
+ RSpec/IdenticalEqualityAssertion:
397
+ Description: Checks for equality assertions with identical expressions on both sides.
398
+ Enabled: pending
399
+ VersionAdded: '2.4'
400
+ StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/IdenticalEqualityAssertion
401
+
354
402
  RSpec/ImplicitBlockExpectation:
355
403
  Description: Check that implicit block expectation syntax is not used.
356
404
  Enabled: true
@@ -637,6 +685,12 @@ RSpec/StubbedMock:
637
685
  VersionAdded: '1.44'
638
686
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/StubbedMock
639
687
 
688
+ RSpec/SubjectDeclaration:
689
+ Description: Ensure that subject is defined using subject helper.
690
+ Enabled: pending
691
+ VersionAdded: '2.5'
692
+ StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/SubjectDeclaration
693
+
640
694
  RSpec/SubjectStub:
641
695
  Description: Checks for stubbed test subjects.
642
696
  Enabled: true
@@ -692,6 +746,11 @@ RSpec/Yield:
692
746
  VersionAdded: '1.32'
693
747
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Yield
694
748
 
749
+ RSpec/Capybara:
750
+ Enabled: true
751
+ Include: *1
752
+ Language: *2
753
+
695
754
  RSpec/Capybara/CurrentPathExpectation:
696
755
  Description: Checks that no expectations are set on Capybara's `current_path`.
697
756
  Enabled: true
@@ -714,6 +773,11 @@ RSpec/Capybara/VisibilityMatcher:
714
773
  VersionChanged: '2.0'
715
774
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Capybara/VisibilityMatcher
716
775
 
776
+ RSpec/FactoryBot:
777
+ Enabled: true
778
+ Include: *1
779
+ Language: *2
780
+
717
781
  RSpec/FactoryBot/AttributeDefinedStatically:
718
782
  Description: Always declare attribute values as blocks.
719
783
  Enabled: true
@@ -753,6 +817,24 @@ RSpec/FactoryBot/FactoryClassName:
753
817
  VersionChanged: '2.0'
754
818
  StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/FactoryBot/FactoryClassName
755
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
+
827
+ RSpec/Rails:
828
+ Enabled: true
829
+ Include: *1
830
+ Language: *2
831
+
832
+ RSpec/Rails/AvoidSetupHook:
833
+ Description: Checks that tests use RSpec `before` hook over Rails `setup` method.
834
+ Enabled: pending
835
+ VersionAdded: '2.4'
836
+ StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Rails/AvoidSetupHook
837
+
756
838
  RSpec/Rails/HttpStatus:
757
839
  Description: Enforces use of symbolic or numeric value to describe HTTP status.
758
840
  Enabled: true
@@ -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
@@ -203,7 +203,7 @@ module RuboCop
203
203
  [name]
204
204
  elsif namespace.const_type?
205
205
  [*const_name(namespace), name]
206
- elsif namespace.lvar_type? || namespace.cbase_type?
206
+ elsif %i[lvar cbase send].include?(namespace.type)
207
207
  [nil, name]
208
208
  end
209
209
  end
@@ -36,7 +36,10 @@ module RuboCop
36
36
  def on_block(node)
37
37
  empty_hook?(node) do |hook|
38
38
  add_offense(hook) do |corrector|
39
- range = range_with_surrounding_space(range: node.loc.expression)
39
+ range = range_with_surrounding_space(
40
+ range: node.loc.expression,
41
+ side: :left
42
+ )
40
43
  corrector.remove(range)
41
44
  end
42
45
  end
@@ -60,7 +60,10 @@ module RuboCop
60
60
 
61
61
  def add_wording_offense(node, message)
62
62
  docstring = docstring(node)
63
+
63
64
  add_offense(docstring, message: message) do |corrector|
65
+ next if node.heredoc?
66
+
64
67
  corrector.replace(docstring, replacement_text(node))
65
68
  end
66
69
  end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Checks for excessive whitespace in example descriptions.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # it ' has excessive spacing ' do
11
+ # end
12
+ #
13
+ # # good
14
+ # it 'has excessive spacing' do
15
+ # end
16
+ #
17
+ # @example
18
+ # # bad
19
+ # context ' when a condition is met ' do
20
+ # end
21
+ #
22
+ # # good
23
+ # context 'when a condition is met' do
24
+ # end
25
+ class ExcessiveDocstringSpacing < Base
26
+ extend AutoCorrector
27
+
28
+ MSG = 'Excessive whitespace.'
29
+
30
+ # @!method example_description(node)
31
+ def_node_matcher :example_description, <<-PATTERN
32
+ (send _ {#Examples.all #ExampleGroups.all} ${
33
+ $str
34
+ $(dstr ({str dstr `sym} ...) ...)
35
+ } ...)
36
+ PATTERN
37
+
38
+ def on_send(node)
39
+ example_description(node) do |description_node, message|
40
+ return if description_node.heredoc?
41
+
42
+ text = text(message)
43
+
44
+ return unless excessive_whitespace?(text)
45
+
46
+ add_whitespace_offense(description_node, text)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ # @param text [String]
53
+ def excessive_whitespace?(text)
54
+ return true if text.start_with?(' ') || text.end_with?(' ')
55
+
56
+ text.match?(/[^\n ] +[^ ]/)
57
+ end
58
+
59
+ # @param text [String]
60
+ def strip_excessive_whitespace(text)
61
+ text.strip.gsub(/ +/, ' ')
62
+ end
63
+
64
+ # @param node [RuboCop::AST::Node]
65
+ # @param text [String]
66
+ def add_whitespace_offense(node, text)
67
+ docstring = docstring(node)
68
+ corrected = strip_excessive_whitespace(text)
69
+
70
+ add_offense(docstring) do |corrector|
71
+ corrector.replace(docstring, corrected)
72
+ end
73
+ end
74
+
75
+ def docstring(node)
76
+ expr = node.loc.expression
77
+
78
+ Parser::Source::Range.new(
79
+ expr.source_buffer,
80
+ expr.begin_pos + 1,
81
+ expr.end_pos - 1
82
+ )
83
+ end
84
+
85
+ # Recursive processing is required to process nested dstr nodes
86
+ # that is the case for \-separated multiline strings with interpolation.
87
+ def text(node)
88
+ case node.type
89
+ when :dstr
90
+ node.node_parts.map { |child_node| text(child_node) }.join
91
+ when :str, :sym
92
+ node.value
93
+ when :begin
94
+ node.source
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -39,7 +39,7 @@ module RuboCop
39
39
 
40
40
  # @!method expect_change_with_arguments(node)
41
41
  def_node_matcher :expect_change_with_arguments, <<-PATTERN
42
- (send nil? :change ({const send} nil? $_) (sym $_))
42
+ (send nil? :change $_ (sym $_))
43
43
  PATTERN
44
44
 
45
45
  # @!method expect_change_with_block(node)
@@ -55,9 +55,9 @@ module RuboCop
55
55
  return unless style == :block
56
56
 
57
57
  expect_change_with_arguments(node) do |receiver, message|
58
- msg = format(MSG_CALL, obj: receiver, attr: message)
58
+ msg = format(MSG_CALL, obj: receiver.source, attr: message)
59
59
  add_offense(node, message: msg) do |corrector|
60
- replacement = "change { #{receiver}.#{message} }"
60
+ replacement = "change { #{receiver.source}.#{message} }"
61
61
  corrector.replace(node, replacement)
62
62
  end
63
63
  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
@@ -61,10 +61,10 @@ module RuboCop
61
61
 
62
62
  MSG = 'Spec path should end with `%<suffix>s`.'
63
63
 
64
- # @!method const_described(node)
65
- def_node_matcher :const_described, <<~PATTERN
64
+ # @!method example_group(node)
65
+ def_node_matcher :example_group, <<~PATTERN
66
66
  (block
67
- $(send #rspec? _example_group $(const ...) $...) ...
67
+ $(send #rspec? _example_group $_ $...) ...
68
68
  )
69
69
  PATTERN
70
70
 
@@ -74,17 +74,17 @@ module RuboCop
74
74
  def on_top_level_example_group(node)
75
75
  return unless top_level_groups.one?
76
76
 
77
- const_described(node) do |send_node, described_class, arguments|
77
+ example_group(node) do |send_node, example_group, arguments|
78
78
  next if routing_spec?(arguments)
79
79
 
80
- ensure_correct_file_path(send_node, described_class, arguments)
80
+ ensure_correct_file_path(send_node, example_group, arguments)
81
81
  end
82
82
  end
83
83
 
84
84
  private
85
85
 
86
- def ensure_correct_file_path(send_node, described_class, arguments)
87
- pattern = pattern_for(described_class, arguments.first)
86
+ def ensure_correct_file_path(send_node, example_group, arguments)
87
+ pattern = pattern_for(example_group, arguments.first)
88
88
  return if filename_ends_with?(pattern)
89
89
 
90
90
  # For the suffix shown in the offense message, modify the regular
@@ -99,11 +99,13 @@ module RuboCop
99
99
  args.any?(&method(:routing_metadata?))
100
100
  end
101
101
 
102
- def pattern_for(described_class, method_name)
103
- return pattern_for_spec_suffix_only? if spec_suffix_only?
102
+ def pattern_for(example_group, method_name)
103
+ if spec_suffix_only? || !example_group.const_type?
104
+ return pattern_for_spec_suffix_only?
105
+ end
104
106
 
105
107
  [
106
- expected_path(described_class),
108
+ expected_path(example_group),
107
109
  name_pattern(method_name),
108
110
  '[^/]*_spec\.rb'
109
111
  ].join
@@ -32,7 +32,7 @@ module RuboCop
32
32
  # # ...
33
33
  # end
34
34
  #
35
- # # good
35
+ # # bad
36
36
  # before do
37
37
  # # ...
38
38
  # end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Checks for equality assertions with identical expressions on both sides.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # expect(foo.bar).to eq(foo.bar)
12
+ # expect(foo.bar).to eql(foo.bar)
13
+ #
14
+ # # good
15
+ # expect(foo.bar).to eq(2)
16
+ # expect(foo.bar).to eql(2)
17
+ #
18
+ class IdenticalEqualityAssertion < Base
19
+ MSG = 'Identical expressions on both sides of the equality ' \
20
+ 'may indicate a flawed test.'
21
+ RESTRICT_ON_SEND = %i[to].freeze
22
+
23
+ # @!method equality_check?(node)
24
+ def_node_matcher :equality_check?, <<~PATTERN
25
+ (send (send nil? :expect $_) :to
26
+ {(send nil? {:eql :eq :be} $_)
27
+ (send (send nil? :be) :== $_)})
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ equality_check?(node) do |left, right|
32
+ add_offense(node) if left == right
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -7,7 +7,7 @@ module RuboCop
7
7
  #
8
8
  # This cop can be configured using the `EnforcedStyle` option
9
9
  #
10
- # @example `EnforcedStyle: single_line_only`
10
+ # @example `EnforcedStyle: single_line_only` (default)
11
11
  # # bad
12
12
  # it do
13
13
  # is_expected.to be_truthy
@@ -19,6 +19,22 @@ module RuboCop
19
19
  # expect(subject).to be_truthy
20
20
  # end
21
21
  #
22
+ # @example `EnforcedStyle: single_statement_only`
23
+ # # bad
24
+ # it do
25
+ # foo = 1
26
+ # is_expected.to be_truthy
27
+ # end
28
+ #
29
+ # # good
30
+ # it do
31
+ # foo = 1
32
+ # expect(subject).to be_truthy
33
+ # end
34
+ # it do
35
+ # is_expected.to be_truthy
36
+ # end
37
+ #
22
38
  # @example `EnforcedStyle: disallow`
23
39
  # # bad
24
40
  # it { is_expected.to be_truthy }
@@ -48,6 +48,8 @@ module RuboCop
48
48
  end
49
49
 
50
50
  def only_expectations?(body, arg)
51
+ return false unless body.each_child_node.any?
52
+
51
53
  body.each_child_node.all? { |child| expectation?(child, arg) }
52
54
  end
53
55
  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
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks for nested example groups.
7
7
  #
8
8
  # This cop is configurable using the `Max` option
9
- # and supports `--auto-gen-config
9
+ # and supports `--auto-gen-config`.
10
10
  #
11
11
  # @example
12
12
  # # bad
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ module Rails
7
+ # Checks that tests use RSpec `before` hook over Rails `setup` method.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad
12
+ # setup do
13
+ # allow(foo).to receive(:bar)
14
+ # end
15
+ #
16
+ # # good
17
+ # before do
18
+ # allow(foo).to receive(:bar)
19
+ # end
20
+ #
21
+ class AvoidSetupHook < Base
22
+ extend AutoCorrector
23
+
24
+ MSG = 'Use `before` instead of `setup`.'
25
+
26
+ # @!method setup_call(node)
27
+ def_node_matcher :setup_call, <<-PATTERN
28
+ (block
29
+ $(send nil? :setup)
30
+ (args) _)
31
+ PATTERN
32
+
33
+ def on_block(node)
34
+ setup_call(node) do |setup|
35
+ add_offense(node) do |corrector|
36
+ corrector.replace setup, 'before'
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Ensure that subject is defined using subject helper.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # let(:subject) { foo }
12
+ # let!(:subject) { foo }
13
+ # subject(:subject) { foo }
14
+ # subject!(:subject) { foo }
15
+ #
16
+ # # bad
17
+ # block = -> {}
18
+ # let(:subject, &block)
19
+ #
20
+ # # good
21
+ # subject(:test_subject) { foo }
22
+ #
23
+ class SubjectDeclaration < Base
24
+ MSG_LET = 'Use subject explicitly rather than using let'
25
+ MSG_REDUNDANT = 'Ambiguous declaration of subject'
26
+
27
+ # @!method offensive_subject_declaration?(node)
28
+ def_node_matcher :offensive_subject_declaration?, <<~PATTERN
29
+ (send nil? ${#Subjects.all #Helpers.all} {(sym :subject) (str "subject")} ...)
30
+ PATTERN
31
+
32
+ def on_send(node)
33
+ offense = offensive_subject_declaration?(node)
34
+ return unless offense
35
+
36
+ add_offense(node, message: message_for(offense))
37
+ end
38
+
39
+ private
40
+
41
+ def message_for(offense)
42
+ Helpers.all(offense) ? MSG_LET : MSG_REDUNDANT
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -23,6 +23,7 @@ module RuboCop
23
23
  # subject('user') { create_user }
24
24
  # let('user_name') { 'Adam' }
25
25
  class VariableDefinition < Base
26
+ extend AutoCorrector
26
27
  include ConfigurableEnforcedStyle
27
28
  include Variable
28
29
 
@@ -30,14 +31,30 @@ module RuboCop
30
31
 
31
32
  def on_send(node)
32
33
  variable_definition?(node) do |variable|
33
- if style_violation?(variable)
34
- add_offense(variable, message: format(MSG, style: style))
34
+ next unless style_violation?(variable)
35
+
36
+ add_offense(
37
+ variable,
38
+ message: format(MSG, style: style)
39
+ ) do |corrector|
40
+ corrector.replace(variable, correct_variable(variable))
35
41
  end
36
42
  end
37
43
  end
38
44
 
39
45
  private
40
46
 
47
+ def correct_variable(variable)
48
+ case variable.type
49
+ when :dsym
50
+ variable.source[1..-1]
51
+ when :sym
52
+ variable.value.to_s.inspect
53
+ else
54
+ variable.value.to_sym.inspect
55
+ end
56
+ end
57
+
41
58
  def style_violation?(variable)
42
59
  style == :symbols && string?(variable) ||
43
60
  style == :strings && symbol?(variable)
@@ -7,7 +7,9 @@ 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
 
12
+ require_relative 'rspec/rails/avoid_setup_hook'
11
13
  begin
12
14
  require_relative 'rspec/rails/http_status'
13
15
  rescue LoadError
@@ -39,6 +41,7 @@ require_relative 'rspec/empty_line_after_subject'
39
41
  require_relative 'rspec/example_length'
40
42
  require_relative 'rspec/example_without_description'
41
43
  require_relative 'rspec/example_wording'
44
+ require_relative 'rspec/excessive_docstring_spacing'
42
45
  require_relative 'rspec/expect_actual'
43
46
  require_relative 'rspec/expect_change'
44
47
  require_relative 'rspec/expect_in_hook'
@@ -47,6 +50,7 @@ require_relative 'rspec/file_path'
47
50
  require_relative 'rspec/focus'
48
51
  require_relative 'rspec/hook_argument'
49
52
  require_relative 'rspec/hooks_before_examples'
53
+ require_relative 'rspec/identical_equality_assertion'
50
54
  require_relative 'rspec/implicit_block_expectation'
51
55
  require_relative 'rspec/implicit_expect'
52
56
  require_relative 'rspec/implicit_subject'
@@ -86,6 +90,7 @@ require_relative 'rspec/shared_context'
86
90
  require_relative 'rspec/shared_examples'
87
91
  require_relative 'rspec/single_argument_message_chain'
88
92
  require_relative 'rspec/stubbed_mock'
93
+ require_relative 'rspec/subject_declaration'
89
94
  require_relative 'rspec/subject_stub'
90
95
  require_relative 'rspec/unspecified_exception'
91
96
  require_relative 'rspec/variable_definition'
@@ -5,6 +5,7 @@ module RuboCop
5
5
  # Shared behavior for aligning braces for single line lets
6
6
  class AlignLetBrace
7
7
  include RuboCop::RSpec::Language
8
+ include RuboCop::Cop::Util
8
9
 
9
10
  def initialize(root, token)
10
11
  @root = root
@@ -34,7 +35,7 @@ module RuboCop
34
35
  def let_group_for(let)
35
36
  adjacent_let_chunks.detect do |chunk|
36
37
  chunk.any? do |member|
37
- member == let && member.loc.line == let.loc.line
38
+ member == let && same_line?(member, let)
38
39
  end
39
40
  end
40
41
  end
@@ -7,6 +7,7 @@ module RuboCop
7
7
  # Builds a YAML config file from two config hashes
8
8
  class ConfigFormatter
9
9
  EXTENSION_ROOT_DEPARTMENT = %r{^(RSpec/)}.freeze
10
+ SUBDEPARTMENTS = %(RSpec/Capybara RSpec/FactoryBot RSpec/Rails)
10
11
  STYLE_GUIDE_BASE_URL = 'https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/'
11
12
 
12
13
  def initialize(config, descriptions)
@@ -24,6 +25,8 @@ module RuboCop
24
25
 
25
26
  def unified_config
26
27
  cops.each_with_object(config.dup) do |cop, unified|
28
+ next if SUBDEPARTMENTS.include?(cop)
29
+
27
30
  unified[cop] = config.fetch(cop)
28
31
  .merge(descriptions.fetch(cop))
29
32
  .merge('StyleGuide' => STYLE_GUIDE_BASE_URL + cop.sub('RSpec/', ''))
@@ -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.3.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.3.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-04-28 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
@@ -18,28 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: '1.0'
21
+ version: '1.19'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: '1.0'
29
- - !ruby/object:Gem::Dependency
30
- name: rubocop-ast
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: 1.1.0
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 1.1.0
28
+ version: '1.19'
43
29
  - !ruby/object:Gem::Dependency
44
30
  name: rack
45
31
  requirement: !ruby/object:Gem::Requirement
@@ -97,19 +83,19 @@ dependencies:
97
83
  - !ruby/object:Gem::Version
98
84
  version: '1.7'
99
85
  - !ruby/object:Gem::Dependency
100
- name: simplecov
86
+ name: rubocop-rake
101
87
  requirement: !ruby/object:Gem::Requirement
102
88
  requirements:
103
- - - "<"
89
+ - - "~>"
104
90
  - !ruby/object:Gem::Version
105
- version: '0.18'
91
+ version: '0.6'
106
92
  type: :development
107
93
  prerelease: false
108
94
  version_requirements: !ruby/object:Gem::Requirement
109
95
  requirements:
110
- - - "<"
96
+ - - "~>"
111
97
  - !ruby/object:Gem::Version
112
- version: '0.18'
98
+ version: '0.6'
113
99
  - !ruby/object:Gem::Dependency
114
100
  name: yard
115
101
  requirement: !ruby/object:Gem::Requirement
@@ -172,6 +158,7 @@ files:
172
158
  - lib/rubocop/cop/rspec/example_length.rb
173
159
  - lib/rubocop/cop/rspec/example_without_description.rb
174
160
  - lib/rubocop/cop/rspec/example_wording.rb
161
+ - lib/rubocop/cop/rspec/excessive_docstring_spacing.rb
175
162
  - lib/rubocop/cop/rspec/expect_actual.rb
176
163
  - lib/rubocop/cop/rspec/expect_change.rb
177
164
  - lib/rubocop/cop/rspec/expect_in_hook.rb
@@ -179,10 +166,12 @@ files:
179
166
  - lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb
180
167
  - lib/rubocop/cop/rspec/factory_bot/create_list.rb
181
168
  - lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
169
+ - lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb
182
170
  - lib/rubocop/cop/rspec/file_path.rb
183
171
  - lib/rubocop/cop/rspec/focus.rb
184
172
  - lib/rubocop/cop/rspec/hook_argument.rb
185
173
  - lib/rubocop/cop/rspec/hooks_before_examples.rb
174
+ - lib/rubocop/cop/rspec/identical_equality_assertion.rb
186
175
  - lib/rubocop/cop/rspec/implicit_block_expectation.rb
187
176
  - lib/rubocop/cop/rspec/implicit_expect.rb
188
177
  - lib/rubocop/cop/rspec/implicit_subject.rb
@@ -201,6 +190,7 @@ files:
201
190
  - lib/rubocop/cop/rspec/mixin/comments_help.rb
202
191
  - lib/rubocop/cop/rspec/mixin/empty_line_separation.rb
203
192
  - lib/rubocop/cop/rspec/mixin/final_end_location.rb
193
+ - lib/rubocop/cop/rspec/mixin/inside_example_group.rb
204
194
  - lib/rubocop/cop/rspec/mixin/top_level_group.rb
205
195
  - lib/rubocop/cop/rspec/mixin/variable.rb
206
196
  - lib/rubocop/cop/rspec/multiple_describes.rb
@@ -213,6 +203,7 @@ files:
213
203
  - lib/rubocop/cop/rspec/overwriting_setup.rb
214
204
  - lib/rubocop/cop/rspec/pending.rb
215
205
  - lib/rubocop/cop/rspec/predicate_matcher.rb
206
+ - lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb
216
207
  - lib/rubocop/cop/rspec/rails/http_status.rb
217
208
  - lib/rubocop/cop/rspec/receive_counts.rb
218
209
  - lib/rubocop/cop/rspec/receive_never.rb
@@ -228,6 +219,7 @@ files:
228
219
  - lib/rubocop/cop/rspec/shared_examples.rb
229
220
  - lib/rubocop/cop/rspec/single_argument_message_chain.rb
230
221
  - lib/rubocop/cop/rspec/stubbed_mock.rb
222
+ - lib/rubocop/cop/rspec/subject_declaration.rb
231
223
  - lib/rubocop/cop/rspec/subject_stub.rb
232
224
  - lib/rubocop/cop/rspec/unspecified_exception.rb
233
225
  - lib/rubocop/cop/rspec/variable_definition.rb
@@ -244,6 +236,7 @@ files:
244
236
  - lib/rubocop/rspec/example.rb
245
237
  - lib/rubocop/rspec/example_group.rb
246
238
  - lib/rubocop/rspec/factory_bot.rb
239
+ - lib/rubocop/rspec/factory_bot/language.rb
247
240
  - lib/rubocop/rspec/hook.rb
248
241
  - lib/rubocop/rspec/inject.rb
249
242
  - lib/rubocop/rspec/language.rb
@@ -257,6 +250,7 @@ licenses:
257
250
  metadata:
258
251
  changelog_uri: https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md
259
252
  documentation_uri: https://docs.rubocop.org/rubocop-rspec/
253
+ rubygems_mfa_required: 'true'
260
254
  post_install_message:
261
255
  rdoc_options: []
262
256
  require_paths:
@@ -272,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
266
  - !ruby/object:Gem::Version
273
267
  version: '0'
274
268
  requirements: []
275
- rubygems_version: 3.2.16
269
+ rubygems_version: 3.3.1
276
270
  signing_key:
277
271
  specification_version: 4
278
272
  summary: Code style checking for RSpec files