sevencop 0.24.3 → 0.25.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: 2de685c5ac228ea5d73a3e69cc4440d6f101f4defd72e6b2a48eb472b79cf7c7
4
- data.tar.gz: 99f300aba16238c5ec418dcae77d787dee4c7c5b8eaba4231b5515e84e66881e
3
+ metadata.gz: 922dc5655a1c67a3c6cbe88b4f5b4ca72fc6a504acb678451ca2aece5a7ac0b8
4
+ data.tar.gz: f00c654f92a7c6a26e4b6514dbaf68adc3a0a6c62efd7f113740675b0104a53f
5
5
  SHA512:
6
- metadata.gz: eb3ee7eedc5dcb05edb4ef88ead51db016ad9ca6e8e552c610b63285cb6b1de493bcec9b2951049253624f392949465eab8b0ddbda948c40a530171f041e1281
7
- data.tar.gz: cdb6c950a0264ccfb74aef21c03cc3a200365b0de3fc3dca785ef79ab781d70cae40d49182ca842e5a41e5d95ae6e48dc429a79c9864d56ee7906cb937cb83a4
6
+ metadata.gz: 6f21bb92a5a4409c777ba0770728f2e03d9ddc3fcebd75f5204f628155b99dbbf25006f37af1f5fdd58742cdce53400e201708194d5db46da5a53d5a269bc004
7
+ data.tar.gz: 7c1ecca97ecacebad51e38ff1005e7c500586b85f6d4ee3de816dc3ddb846cd0faeca19520ca5dd1edf1f0296b94a6fc631a53deaf8bb4745021f4fdfccdb08c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sevencop (0.24.3)
4
+ sevencop (0.25.0)
5
5
  activesupport
6
6
  rubocop
7
7
 
data/config/default.yml CHANGED
@@ -128,7 +128,7 @@ Sevencop/RequireOrdered:
128
128
 
129
129
  Sevencop/RSpecDescribeHttpEndpoint:
130
130
  Description: |
131
- Pass HTTP endpoint identifier to top-level `describe` on request-specs.
131
+ Pass HTTP endpoint identifier (e.g. `GET /users`) to top-level `describe` on request-specs.
132
132
  Enabled: false
133
133
  VersionAdded: '0.18'
134
134
  Include:
@@ -139,6 +139,7 @@ Sevencop/RSpecExamplesInSameGroup:
139
139
  Combine examples in the same groups in the time-consuming kinds of specs.
140
140
  Enabled: false
141
141
  VersionAdded: '0.17'
142
+ IncludeSharedExamples: false
142
143
  Include:
143
144
  - spec/controllers/**/*
144
145
  - spec/requests/**/*
@@ -3,7 +3,11 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Sevencop
6
- # Pass HTTP endpoint identifier to top-level `describe` on request-specs.
6
+ # Pass HTTP endpoint identifier (e.g. `GET /users`) to top-level `describe` on request-specs.
7
+ #
8
+ # In request-specs, one should be aware that it is a test type for endpoints at HTTP layer.
9
+ # Therefore it is good practice to put the HTTP method and path in the top-level description
10
+ # and to separate examples groups by each endpoint.
7
11
  #
8
12
  # @see https://github.com/r7kamura/rspec-request_describer
9
13
  #
@@ -14,7 +18,7 @@ module RuboCop
14
18
  # # good
15
19
  # RSpec.describe 'GET /users'
16
20
  class RSpecDescribeHttpEndpoint < Base
17
- MSG = 'Pass HTTP endpoint identifier to top-level `describe` on request-specs.'
21
+ MSG = 'Pass HTTP endpoint identifier (e.g. `GET /users`) to top-level `describe` on request-specs.'
18
22
 
19
23
  RESTRICT_ON_SEND = %i[
20
24
  describe
@@ -6,7 +6,6 @@ module RuboCop
6
6
  # Combine examples in same group in the time-consuming kinds of specs.
7
7
  #
8
8
  # @example
9
- #
10
9
  # # bad
11
10
  # context 'when user is logged in' do
12
11
  # it 'returns 200' do
@@ -27,20 +26,42 @@ module RuboCop
27
26
  # end
28
27
  # end
29
28
  #
29
+ # # bad - IncludeSharedExamples: true
30
+ # context 'when user is logged in' do
31
+ # it 'returns 200' do
32
+ # subject
33
+ # expect(response).to have_http_status(200)
34
+ # end
35
+ #
36
+ # includes_examples 'creates Foo'
37
+ # end
30
38
  class RSpecExamplesInSameGroup < Base
31
- EXAMPLE_METHOD_NAMES_REGULAR = ::Set[
39
+ METHOD_NAMES_FOR_REGULAR_EXAMPLE = ::Set[
40
+ :example,
32
41
  :it,
33
42
  :its,
34
- :specify,
35
- :example,
36
43
  :scenario,
44
+ :specify
37
45
  ].freeze
38
46
 
47
+ METHOD_NAMES_FOR_SHARED_EXAMPLES = ::Set[
48
+ :include_examples,
49
+ :it_behaves_like,
50
+ :it_should_behave_like
51
+ ]
52
+
39
53
  MSG = 'Combine examples in the same group in the time-consuming kinds of specs.'
40
54
 
41
- # @param node [RuboCop::AST::BlockNode]
55
+ RESTRICT_ON_SEND = [
56
+ *METHOD_NAMES_FOR_REGULAR_EXAMPLE,
57
+ *METHOD_NAMES_FOR_SHARED_EXAMPLES
58
+ ].freeze
59
+
60
+ # @param node [RuboCop::AST::SendNode]
42
61
  # @return [void]
43
- def on_block(node)
62
+ def on_send(node)
63
+ node = node.block_node || node
64
+
44
65
  return unless example?(node)
45
66
 
46
67
  previous_sibling_example = previous_sibling_example_of(node)
@@ -48,27 +69,45 @@ module RuboCop
48
69
 
49
70
  add_offense(node)
50
71
  end
51
- alias on_numblock on_block
52
72
 
53
73
  private
54
74
 
55
- # @!method example?(node)
56
- # @param node [RuboCop::AST::Node]
57
- # @return [Boolean]
58
- def_node_matcher :example?, <<~PATTERN
59
- (block
60
- (send nil? EXAMPLE_METHOD_NAMES_REGULAR ...)
61
- ...
62
- )
63
- PATTERN
75
+ # @param node [RuboCop::AST::BlockNode, RuboCop::AST::SendNode]
76
+ # @return [Boolean]
77
+ def example?(node)
78
+ if include_shared_examples?
79
+ regular_example?(node) || shared_example?(node)
80
+ else
81
+ regular_example?(node)
82
+ end
83
+ end
84
+
85
+ # @return [Boolean]
86
+ def include_shared_examples?
87
+ cop_config['IncludeSharedExamples']
88
+ end
64
89
 
65
- # @param node [RuboCop::AST::BlockNode]
66
- # @return [RuboCop::AST::BlockNode, nil]
90
+ # @param node [RuboCop::AST::BlockNode, RuboCop::AST::SendNode]
91
+ # @return [RuboCop::AST::BlockNode, RuboCop::AST::SendNode, nil]
67
92
  def previous_sibling_example_of(node)
93
+ return unless node.parent&.begin_type?
94
+
68
95
  node.left_siblings.find do |sibling|
69
96
  sibling.is_a?(::RuboCop::AST::Node) && example?(sibling)
70
97
  end
71
98
  end
99
+
100
+ # @param node [RuboCop::AST::BlockNode, RuboCop::AST::SendNode]
101
+ # @return [Boolean]
102
+ def regular_example?(node)
103
+ METHOD_NAMES_FOR_REGULAR_EXAMPLE.include?(node.method_name)
104
+ end
105
+
106
+ # @param node [RuboCop::AST::BlockNode, RuboCop::AST::SendNode]
107
+ # @return [Boolean]
108
+ def shared_example?(node)
109
+ METHOD_NAMES_FOR_SHARED_EXAMPLES.include?(node.method_name)
110
+ end
72
111
  end
73
112
  end
74
113
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sevencop
4
- VERSION = '0.24.3'
4
+ VERSION = '0.25.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sevencop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.24.3
4
+ version: 0.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-24 00:00:00.000000000 Z
11
+ date: 2022-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport