rubocop-rspec 2.27.1 → 2.29.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.
@@ -4,98 +4,35 @@ module RuboCop
4
4
  module Cop
5
5
  module RSpec
6
6
  module Rails
7
- # Enforces use of `be_invalid` or `not_to` for negated be_valid.
8
- #
9
- # @safety
10
- # This cop is unsafe because it cannot guarantee that
11
- # the test target is an instance of `ActiveModel::Validations``.
12
- #
13
- # @example EnforcedStyle: not_to (default)
14
- # # bad
15
- # expect(foo).to be_invalid
16
- #
17
- # # good
18
- # expect(foo).not_to be_valid
19
- #
20
- # # good (with method chain)
21
- # expect(foo).to be_invalid.and be_odd
22
- #
23
- # @example EnforcedStyle: be_invalid
24
- # # bad
25
- # expect(foo).not_to be_valid
26
- #
27
- # # good
28
- # expect(foo).to be_invalid
29
- #
30
- # # good (with method chain)
31
- # expect(foo).to be_invalid.or be_even
32
- #
33
- class NegationBeValid < Base
34
- extend AutoCorrector
35
- include ConfigurableEnforcedStyle
36
-
37
- MSG = 'Use `expect(...).%<runner>s %<matcher>s`.'
38
- RESTRICT_ON_SEND = %i[be_valid be_invalid].freeze
39
-
40
- # @!method not_to?(node)
41
- def_node_matcher :not_to?, <<~PATTERN
42
- (send ... :not_to (send nil? :be_valid ...))
43
- PATTERN
44
-
45
- # @!method be_invalid?(node)
46
- def_node_matcher :be_invalid?, <<~PATTERN
47
- (send ... :to (send nil? :be_invalid ...))
48
- PATTERN
49
-
50
- def on_send(node)
51
- return unless offense?(node.parent)
52
-
53
- add_offense(offense_range(node),
54
- message: message(node.method_name)) do |corrector|
55
- corrector.replace(node.parent.loc.selector, replaced_runner)
56
- corrector.replace(node.loc.selector, replaced_matcher)
57
- end
58
- end
59
-
60
- private
61
-
62
- def offense?(node)
63
- case style
64
- when :not_to
65
- be_invalid?(node)
66
- when :be_invalid
67
- not_to?(node)
68
- end
69
- end
70
-
71
- def offense_range(node)
72
- node.parent.loc.selector.with(end_pos: node.loc.selector.end_pos)
73
- end
74
-
75
- def message(_matcher)
76
- format(MSG,
77
- runner: replaced_runner,
78
- matcher: replaced_matcher)
79
- end
80
-
81
- def replaced_runner
82
- case style
83
- when :not_to
84
- 'not_to'
85
- when :be_invalid
86
- 'to'
87
- end
88
- end
89
-
90
- def replaced_matcher
91
- case style
92
- when :not_to
93
- 'be_valid'
94
- when :be_invalid
95
- 'be_invalid'
96
- end
97
- end
98
- end
7
+ # @!parse
8
+ # # Enforces use of `be_invalid` or `not_to` for negated be_valid.
9
+ # #
10
+ # # @safety
11
+ # # This cop is unsafe because it cannot guarantee that
12
+ # # the test target is an instance of `ActiveModel::Validations``.
13
+ # #
14
+ # # @example EnforcedStyle: not_to (default)
15
+ # # # bad
16
+ # # expect(foo).to be_invalid
17
+ # #
18
+ # # # good
19
+ # # expect(foo).not_to be_valid
20
+ # #
21
+ # # # good (with method chain)
22
+ # # expect(foo).to be_invalid.and be_odd
23
+ # #
24
+ # # @example EnforcedStyle: be_invalid
25
+ # # # bad
26
+ # # expect(foo).not_to be_valid
27
+ # #
28
+ # # # good
29
+ # # expect(foo).to be_invalid
30
+ # #
31
+ # # # good (with method chain)
32
+ # # expect(foo).to be_invalid.or be_even
33
+ # #
34
+ # class NegationBeValid < RuboCop::Cop::RSpec::Base; end
35
+ NegationBeValid = ::RuboCop::Cop::RSpecRails::NegationBeValid
99
36
  end
100
37
  end
101
38
  end
@@ -4,88 +4,30 @@ module RuboCop
4
4
  module Cop
5
5
  module RSpec
6
6
  module Rails
7
- # Prefer to travel in `before` rather than `around`.
8
- #
9
- # @safety
10
- # This cop is unsafe because the automatic `travel_back` is only run
11
- # on test cases that are considered as Rails related.
12
- #
13
- # And also, this cop's autocorrection is unsafe because the order of
14
- # execution will change if other steps exist before traveling in
15
- # `around`.
16
- #
17
- # @example
18
- # # bad
19
- # around do |example|
20
- # freeze_time do
21
- # example.run
22
- # end
23
- # end
24
- #
25
- # # good
26
- # before { freeze_time }
27
- class TravelAround < Base
28
- extend AutoCorrector
29
-
30
- MSG = 'Prefer to travel in `before` rather than `around`.'
31
-
32
- TRAVEL_METHOD_NAMES = %i[
33
- freeze_time
34
- travel
35
- travel_to
36
- ].to_set.freeze
37
-
38
- # @!method extract_run_in_travel(node)
39
- def_node_matcher :extract_run_in_travel, <<~PATTERN
40
- (block
41
- $(send nil? TRAVEL_METHOD_NAMES ...)
42
- (args ...)
43
- (send _ :run)
44
- )
45
- PATTERN
46
-
47
- # @!method match_around_each?(node)
48
- def_node_matcher :match_around_each?, <<~PATTERN
49
- (block
50
- (send _ :around (sym :each)?)
51
- ...
52
- )
53
- PATTERN
54
-
55
- def on_block(node)
56
- run_node = extract_run_in_travel(node)
57
- return unless run_node
58
-
59
- around_node = extract_surrounding_around_block(run_node)
60
- return unless around_node
61
-
62
- add_offense(node) do |corrector|
63
- autocorrect(corrector, node, run_node, around_node)
64
- end
65
- end
66
- alias on_numblock on_block
67
-
68
- private
69
-
70
- def autocorrect(corrector, node, run_node, around_node)
71
- corrector.replace(
72
- node,
73
- node.body.source
74
- )
75
- corrector.insert_before(
76
- around_node,
77
- "before { #{run_node.source} }\n\n"
78
- )
79
- end
80
-
81
- # @param node [RuboCop::AST::BlockNode]
82
- # @return [RuboCop::AST::BlockNode, nil]
83
- def extract_surrounding_around_block(node)
84
- node.each_ancestor(:block).find do |ancestor|
85
- match_around_each?(ancestor)
86
- end
87
- end
88
- end
7
+ # @!parse
8
+ # # Prefer to travel in `before` rather than `around`.
9
+ # #
10
+ # # @safety
11
+ # # This cop is unsafe because the automatic `travel_back` is only
12
+ # # run on test cases that are considered as Rails related.
13
+ # #
14
+ # # And also, this cop's autocorrection is unsafe because the order
15
+ # # of execution will change if other steps exist before traveling
16
+ # # in `around`.
17
+ # #
18
+ # # @example
19
+ # # # bad
20
+ # # around do |example|
21
+ # # freeze_time do
22
+ # # example.run
23
+ # # end
24
+ # # end
25
+ # #
26
+ # # # good
27
+ # # before { freeze_time }
28
+ # #
29
+ # class TravelAround < RuboCop::Cop::RSpec::Base; end
30
+ TravelAround = ::RuboCop::Cop::RSpecRails::TravelAround
89
31
  end
90
32
  end
91
33
  end
@@ -7,13 +7,13 @@ module RuboCop
7
7
  #
8
8
  # @example
9
9
  #
10
- # it 'is valid' do
11
- # expect(user).to be_valid
12
- # end
10
+ # it 'is valid' do
11
+ # expect(user).to be_valid
12
+ # end
13
13
  #
14
- # it 'validates the user' do
15
- # expect(user).to be_valid
16
- # end
14
+ # it 'validates the user' do
15
+ # expect(user).to be_valid
16
+ # end
17
17
  #
18
18
  class RepeatedExample < Base
19
19
  MSG = "Don't repeat examples within an example group."
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # Description should be descriptive.
7
+ #
8
+ # If example group or example contains only `execute string`, numbers
9
+ # and regular expressions, the description is not clear.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # describe `time` do
14
+ # # ...
15
+ # end
16
+ #
17
+ # # bad
18
+ # context /when foo/ do
19
+ # # ...
20
+ # end
21
+ #
22
+ # # bad
23
+ # it 10000 do
24
+ # # ...
25
+ # end
26
+ #
27
+ # # good
28
+ # describe Foo do
29
+ # # ...
30
+ # end
31
+ #
32
+ # # good
33
+ # describe '#foo' do
34
+ # # ...
35
+ # end
36
+ #
37
+ # # good
38
+ # context "when #{foo} is bar" do
39
+ # # ...
40
+ # end
41
+ #
42
+ # # good
43
+ # it 'does something' do
44
+ # # ...
45
+ # end
46
+ #
47
+ class UndescriptiveLiteralsDescription < Base
48
+ MSG = 'Description should be descriptive.'
49
+
50
+ # @!method example_groups_or_example?(node)
51
+ def_node_matcher :example_groups_or_example?, <<~PATTERN
52
+ (block (send #rspec? {#ExampleGroups.all #Examples.all} $_) ...)
53
+ PATTERN
54
+
55
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
56
+ example_groups_or_example?(node) do |arg|
57
+ add_offense(arg) if offense?(arg)
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def offense?(node)
64
+ %i[xstr int regexp].include?(node.type)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -18,14 +18,10 @@ require_relative 'rspec/factory_bot/syntax_methods'
18
18
 
19
19
  require_relative 'rspec/rails/avoid_setup_hook'
20
20
  require_relative 'rspec/rails/have_http_status'
21
- require_relative 'rspec/rails/negation_be_valid'
22
- begin
23
- require_relative 'rspec/rails/http_status'
24
- rescue LoadError
25
- # Rails/HttpStatus cannot be loaded if rack/utils is unavailable.
26
- end
21
+ require_relative 'rspec/rails/http_status'
27
22
  require_relative 'rspec/rails/inferred_spec_type'
28
23
  require_relative 'rspec/rails/minitest_assertions'
24
+ require_relative 'rspec/rails/negation_be_valid'
29
25
  require_relative 'rspec/rails/travel_around'
30
26
 
31
27
  require_relative 'rspec/align_left_let_brace'
@@ -58,6 +54,7 @@ require_relative 'rspec/empty_line_after_final_let'
58
54
  require_relative 'rspec/empty_line_after_hook'
59
55
  require_relative 'rspec/empty_line_after_subject'
60
56
  require_relative 'rspec/empty_metadata'
57
+ require_relative 'rspec/empty_output'
61
58
  require_relative 'rspec/eq'
62
59
  require_relative 'rspec/example_length'
63
60
  require_relative 'rspec/example_without_description'
@@ -128,6 +125,7 @@ require_relative 'rspec/spec_file_path_suffix'
128
125
  require_relative 'rspec/stubbed_mock'
129
126
  require_relative 'rspec/subject_declaration'
130
127
  require_relative 'rspec/subject_stub'
128
+ require_relative 'rspec/undescriptive_literals_description'
131
129
  require_relative 'rspec/unspecified_exception'
132
130
  require_relative 'rspec/variable_definition'
133
131
  require_relative 'rspec/variable_name'
@@ -22,6 +22,13 @@ module RuboCop
22
22
  RSpec/FactoryBot/FactoryClassName
23
23
  RSpec/FactoryBot/FactoryNameStyle
24
24
  RSpec/FactoryBot/SyntaxMethods
25
+ RSpec/Rails/AvoidSetupHook
26
+ RSpec/Rails/HaveHttpStatus
27
+ RSpec/Rails/HttpStatus
28
+ RSpec/Rails/InferredSpecType
29
+ RSpec/Rails/MinitestAssertions
30
+ RSpec/Rails/NegationBeValid
31
+ RSpec/Rails/TravelAround
25
32
  )
26
33
  AMENDMENTS = %(Metrics/BlockLength)
27
34
  COP_DOC_BASE_URL = 'https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/'
@@ -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.27.1'
7
+ STRING = '2.29.0'
8
8
  end
9
9
  end
10
10
  end
data/lib/rubocop-rspec.rb CHANGED
@@ -39,6 +39,9 @@ require_relative 'rubocop/rspec/example'
39
39
  require_relative 'rubocop/rspec/example_group'
40
40
  require_relative 'rubocop/rspec/hook'
41
41
 
42
+ # need after `require 'rubocop/cop/rspec/base'``
43
+ require 'rubocop-rspec_rails'
44
+
42
45
  RuboCop::RSpec::Inject.defaults!
43
46
 
44
47
  require_relative 'rubocop/cop/rspec_cops'
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.27.1
4
+ version: 2.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Backus
8
8
  - Ian MacLeod
9
9
  - Nils Gemeinhardt
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-03-03 00:00:00.000000000 Z
13
+ date: 2024-04-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -54,6 +54,20 @@ dependencies:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
56
  version: '2.22'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rubocop-rspec_rails
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '2.28'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '2.28'
57
71
  description: |
58
72
  Code style checking for RSpec files.
59
73
  A plugin for the RuboCop code style enforcing & linting tool.
@@ -113,6 +127,7 @@ files:
113
127
  - lib/rubocop/cop/rspec/empty_line_after_hook.rb
114
128
  - lib/rubocop/cop/rspec/empty_line_after_subject.rb
115
129
  - lib/rubocop/cop/rspec/empty_metadata.rb
130
+ - lib/rubocop/cop/rspec/empty_output.rb
116
131
  - lib/rubocop/cop/rspec/eq.rb
117
132
  - lib/rubocop/cop/rspec/example_length.rb
118
133
  - lib/rubocop/cop/rspec/example_without_description.rb
@@ -207,6 +222,7 @@ files:
207
222
  - lib/rubocop/cop/rspec/stubbed_mock.rb
208
223
  - lib/rubocop/cop/rspec/subject_declaration.rb
209
224
  - lib/rubocop/cop/rspec/subject_stub.rb
225
+ - lib/rubocop/cop/rspec/undescriptive_literals_description.rb
210
226
  - lib/rubocop/cop/rspec/unspecified_exception.rb
211
227
  - lib/rubocop/cop/rspec/variable_definition.rb
212
228
  - lib/rubocop/cop/rspec/variable_name.rb
@@ -238,7 +254,7 @@ metadata:
238
254
  changelog_uri: https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md
239
255
  documentation_uri: https://docs.rubocop.org/rubocop-rspec/
240
256
  rubygems_mfa_required: 'true'
241
- post_install_message:
257
+ post_install_message:
242
258
  rdoc_options: []
243
259
  require_paths:
244
260
  - lib
@@ -253,8 +269,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
269
  - !ruby/object:Gem::Version
254
270
  version: '0'
255
271
  requirements: []
256
- rubygems_version: 3.4.21
257
- signing_key:
272
+ rubygems_version: 3.5.3
273
+ signing_key:
258
274
  specification_version: 4
259
275
  summary: Code style checking for RSpec files
260
276
  test_files: []