sevencop 0.26.2 → 0.28.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: b77d2e545ac1a1e5b85a636130c793c0268ff8740636b7a8a99e419d1991477d
4
- data.tar.gz: df0ee08ada7246f370bb32da744ea1d2482fb196eb103de0ea2546ad433517aa
3
+ metadata.gz: 79bb602015c9eea9c89de44bfbd22274ef1197412a420f274280cc3cac7fe8c5
4
+ data.tar.gz: 8fe918f1ad6031ec0b4886a778e5333d9574ecf23c5658f133e32423349d2a28
5
5
  SHA512:
6
- metadata.gz: b1eaf0aea17f94ec3cdada0afc664724104d3da9abf190ea11ada7db715f39175bbc3471046af08dfc71fa5fe6841a8678becd8d9b4b85d9f2f3a071af491ed0
7
- data.tar.gz: 5c2419f1ea701a95478a872c57f40e0a8af77cdf85f2ae154f4e75ae7a0e1981d7da7fe0d57152a20ee96937f4cdb7f2aff2c431a94ea1fb222203891d74ce69
6
+ metadata.gz: 0bdc4d1d137ea5c3a3b2048e8c1aa37bfff81672aef0b10d75cc361f4ff10938d9327ec1193f7936b6180b8fc2e2f6e51909723a9b036279c2852d76e810990b
7
+ data.tar.gz: 4235669bbd83b5f460663877b3e47272bffa0aadec21e1f413a7e957c6f0bdafe851443d0bbff5985553978b495e4b8c0d418b7736b9ebc9f2ee941859885f85
data/.rubocop.yml CHANGED
@@ -16,6 +16,10 @@ Gemspec/RequireMFA:
16
16
  Layout/LineLength:
17
17
  Enabled: false
18
18
 
19
+ Lint/UselessAccessModifier:
20
+ MethodCreatingMethods:
21
+ - def_node_matcher
22
+
19
23
  Metrics:
20
24
  Enabled: false
21
25
 
@@ -32,7 +36,10 @@ RSpec/ExampleLength:
32
36
  RSpec/FilePath:
33
37
  CustomTransform:
34
38
  RSpecDescribeHttpEndpoint: rspec_describe_http_endpoint
39
+ RSpecEmptyLineAfterLet: rspec_empty_line_after_let
35
40
  RSpecExamplesInSameGroup: rspec_examples_in_same_group
41
+ RSpecMemoizedHelperBlockDelimiter: rspec_memoized_helper_block_delimiter
42
+ RSpecRailsResponseParsedBody: rspec_rails_response_parsed_body
36
43
 
37
44
  RSpec/MultipleExpectations:
38
45
  Enabled: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sevencop (0.26.2)
4
+ sevencop (0.28.0)
5
5
  activesupport
6
6
  rubocop
7
7
 
data/README.md CHANGED
@@ -45,7 +45,10 @@ Note that all cops are `Enabled: false` by default.
45
45
  - [Sevencop/RailsWhereNot](lib/rubocop/cop/sevencop/rails_where_not.rb)
46
46
  - [Sevencop/RequireOrdered](lib/rubocop/cop/sevencop/require_ordered.rb)
47
47
  - [Sevencop/RSpecDescribeHttpEndpoint](lib/rubocop/cop/sevencop/rspec_describe_http_endpoint.rb)
48
+ - [Sevencop/RSpecEmptyLineAfterLet](lib/rubocop/cop/sevencop/rspec_empty_line_after_let.rb)
48
49
  - [Sevencop/RSpecExamplesInSameGroup](lib/rubocop/cop/sevencop/rspec_examples_in_same_group.rb)
50
+ - [Sevencop/RSpecMemoizedHelperBlockDelimiter](lib/rubocop/cop/sevencop/rspec_memoized_helper_block_delimiter.rb)
51
+ - [Sevencop/RSpecRailsResponseParsedBody](lib/rubocop/cop/sevencop/rspec_rails_response_parsed_body.rb)
49
52
 
50
53
  ## Notes
51
54
 
data/config/default.yml CHANGED
@@ -141,6 +141,14 @@ Sevencop/RSpecDescribeHttpEndpoint:
141
141
  Include:
142
142
  - spec/requests/**/*.rb
143
143
 
144
+ Sevencop/RSpecEmptyLineAfterLet:
145
+ Description: |
146
+ Insert empty line after `let`.
147
+ Enabled: false
148
+ VersionAdded: '0.27'
149
+ Include:
150
+ - spec/**/*
151
+
144
152
  Sevencop/RSpecExamplesInSameGroup:
145
153
  Description: |
146
154
  Combine examples in the same groups in the time-consuming kinds of specs.
@@ -150,3 +158,21 @@ Sevencop/RSpecExamplesInSameGroup:
150
158
  Include:
151
159
  - spec/controllers/**/*
152
160
  - spec/requests/**/*
161
+
162
+ Sevencop/RSpecMemoizedHelperBlockDelimiter:
163
+ Description: |
164
+ Use do-end block delimiter on RSpec memoized helper.
165
+ Enabled: false
166
+ VersionAdded: '0.27'
167
+ Include:
168
+ - spec/**/*
169
+
170
+ Sevencop/RSpecRailsResponseParsedBody:
171
+ Description: |
172
+ Prefer `response.parsed_body` to `JSON.parse(response.body)`.
173
+ Enabled: false
174
+ Safe: false
175
+ VersionAdded: '0.28'
176
+ Include:
177
+ - spec/controllers/**/*
178
+ - spec/requests/**/*
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # Prefer ActiveSupport date and time helper.
9
9
  #
10
10
  # @safety
11
- # This cop is unsafe becuase it considers that `n.days` is a Duration,
11
+ # This cop is unsafe because it considers that `n.days` is a Duration,
12
12
  # and `date` in `date == Date.current` is a Date, but there is no guarantee.
13
13
  #
14
14
  # @example
@@ -71,7 +71,7 @@ module RuboCop
71
71
  _
72
72
  _
73
73
  _*
74
- ({ hash | kwargs }
74
+ (hash
75
75
  (pair ...)*
76
76
  $(pair (sym :type) sym)
77
77
  (pair ...)*
@@ -22,7 +22,7 @@ module RuboCop
22
22
  def_node_matcher :rails_where_not_with_multiple_elements_hash?, <<~PATTERN
23
23
  (send
24
24
  (send _ :where) :not
25
- ({ hash | kwargs }
25
+ (hash
26
26
  (pair _ _)
27
27
  (pair _ _)+))
28
28
  PATTERN
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Sevencop
8
+ # Insert empty line after `let`.
9
+ #
10
+ # Since `let` defines a method, it should be written in the same style as `def`.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # context 'with something' do
15
+ # let(:foo) do
16
+ # 'foo'
17
+ # end
18
+ # let(:bar) do
19
+ # 'bar'
20
+ # end
21
+ # end
22
+ #
23
+ # # good
24
+ # context 'with something' do
25
+ # let(:foo) do
26
+ # 'foo'
27
+ # end
28
+ #
29
+ # let(:bar) do
30
+ # 'bar'
31
+ # end
32
+ # end
33
+ #
34
+ # # good
35
+ # context 'with something' do
36
+ # let(:foo) do
37
+ # 'foo'
38
+ # end
39
+ # end
40
+ class RSpecEmptyLineAfterLet < Base
41
+ extend AutoCorrector
42
+
43
+ MSG = 'Insert empty line after `let`.'
44
+
45
+ # @param node [RuboCop::AST::BlockNode]
46
+ # @return [void]
47
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
48
+ return unless bad?(node)
49
+
50
+ add_offense(node) do |corrector|
51
+ corrector.insert_after(node.location.end, "\n")
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ # @!method let?(node)
58
+ # @param node [RuboCop::AST::BlockNode]
59
+ # @return [Boolean]
60
+ def_node_matcher :let?, <<~PATTERN
61
+ (block
62
+ (send
63
+ nil?
64
+ {:let :let!}
65
+ ...
66
+ )
67
+ ...
68
+ )
69
+ PATTERN
70
+
71
+ # @param node [RuboCop::AST::BlockNode]
72
+ # @return [Boolean]
73
+ def bad?(node)
74
+ let?(node) &&
75
+ !empty_line_after?(node) &&
76
+ !last_child?(node)
77
+ end
78
+
79
+ # @param node [RuboCop::AST::BlockNode]
80
+ # @return [Boolean]
81
+ def empty_line_after?(node)
82
+ processed_source[node.location.end.line].strip.empty?
83
+ end
84
+
85
+ # @param node [RuboCop::AST::BlockNode]
86
+ # @return [Boolean]
87
+ def last_child?(node)
88
+ !node.parent&.begin_type? ||
89
+ node.equal?(node.parent.children.last)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Sevencop
8
+ # Use do-end block delimiter on RSpec memoized helper.
9
+ #
10
+ # Since these helpers define methods, they should be written in the same style as `def`.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # let(:foo) { 'bar' }
15
+ #
16
+ # # good
17
+ # let(:foo) do
18
+ # 'bar'
19
+ # end
20
+ #
21
+ # # bad
22
+ # subject(:foo) { 'bar' }
23
+ #
24
+ # # good
25
+ # subject(:foo) do
26
+ # 'bar'
27
+ # end
28
+ class RSpecMemoizedHelperBlockDelimiter < Base
29
+ extend AutoCorrector
30
+
31
+ include ConfigurableEnforcedStyle
32
+ include RangeHelp
33
+
34
+ MSG = 'Use do-end block delimiter on RSpec memoized helper.'
35
+
36
+ # @param node [RuboCop::AST::BlockNode]
37
+ # @return [void]
38
+ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
39
+ return unless bad?(node)
40
+
41
+ add_offense(
42
+ node.location.begin.with(
43
+ end_pos: node.location.end.end_pos
44
+ )
45
+ ) do |corrector|
46
+ autocorrect(corrector, node)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ # @!method memoized_helper?(node)
53
+ # @param node [RuboCop::AST::Node]
54
+ # @return [Boolean]
55
+ def_node_matcher :memoized_helper?, <<~PATTERN
56
+ (block
57
+ (send
58
+ nil?
59
+ {
60
+ :let
61
+ :let!
62
+ :subject
63
+ }
64
+ ...
65
+ )
66
+ ...
67
+ )
68
+ PATTERN
69
+
70
+ # @param corrector [RuboCop::Cop::Corrector]
71
+ # @param node [RuboCop::AST::BlockNode]
72
+ # @return [void]
73
+ def autocorrect(
74
+ corrector,
75
+ node
76
+ )
77
+ corrector.insert_before(node.location.begin, ' ') unless whitespace_before?(node.location.begin)
78
+ corrector.replace(node.location.begin, 'do')
79
+ corrector.replace(node.location.end, 'end')
80
+ wrap_in_newlines(corrector, node) if node.single_line?
81
+ end
82
+
83
+ # @param node [RuboCop::AST::BlockNode]
84
+ # @return [Boolean]
85
+ def bad?(node)
86
+ memoized_helper?(node) && node.braces?
87
+ end
88
+
89
+ # @param range [Parser::Source::Range]
90
+ # @return [Boolean]
91
+ def whitespace_before?(range)
92
+ range.source_buffer.source[range.begin_pos - 1].match?(/\s/)
93
+ end
94
+
95
+ # @param corrector [RuboCop::Cop::Corrector]
96
+ # @param node [RuboCop::AST::BlockNode]
97
+ # @return [void]
98
+ def wrap_in_newlines(
99
+ corrector,
100
+ node
101
+ )
102
+ corrector.wrap(
103
+ node.location.begin.with(
104
+ begin_pos: node.location.begin.end_pos,
105
+ end_pos: node.location.end.begin_pos
106
+ ),
107
+ "\n",
108
+ "\n"
109
+ )
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sevencop
6
+ # Prefer `response.parsed_body` to `JSON.parse(response.body)`.
7
+ #
8
+ # @safety
9
+ # This cop is unsafe because Content-Type may not be `application/json`.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # JSON.parse(response.body)
14
+ #
15
+ # # good
16
+ # response.parsed_body
17
+ class RSpecRailsResponseParsedBody < Base
18
+ extend AutoCorrector
19
+
20
+ MSG = 'Prefer `response.parsed_body` to `JSON.parse(response.body)`.'
21
+
22
+ RESTRICT_ON_SEND = %i[parse].freeze
23
+
24
+ # @param node [RuboCop::AST::SendNode]
25
+ # @return [void]
26
+ def on_send(node)
27
+ return unless bad?(node)
28
+
29
+ add_offense(node) do |corrector|
30
+ autocorrect(corrector, node)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ # @!method json_parse_response_body?(node)
37
+ # @param node [RuboCop::AST::Node]
38
+ # @return [Boolean]
39
+ def_node_matcher :json_parse_response_body?, <<~PATTERN
40
+ (send
41
+ (const
42
+ {nil? cbase}
43
+ :JSON
44
+ )
45
+ :parse
46
+ (send
47
+ (send
48
+ nil?
49
+ :response
50
+ )
51
+ :body
52
+ )
53
+ )
54
+ PATTERN
55
+ alias bad? json_parse_response_body?
56
+
57
+ # @param corrector [RuboCop::Cop::Corrector]
58
+ # @param node [RuboCop::AST::SendNode]
59
+ # @return [void]
60
+ def autocorrect(
61
+ corrector,
62
+ node
63
+ )
64
+ corrector.replace(node, 'response.parsed_body')
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sevencop
4
- VERSION = '0.26.2'
4
+ VERSION = '0.28.0'
5
5
  end
data/lib/sevencop.rb CHANGED
@@ -21,4 +21,7 @@ require_relative 'rubocop/cop/sevencop/rails_uniqueness_validator_explicit_case_
21
21
  require_relative 'rubocop/cop/sevencop/rails_where_not'
22
22
  require_relative 'rubocop/cop/sevencop/require_ordered'
23
23
  require_relative 'rubocop/cop/sevencop/rspec_describe_http_endpoint'
24
+ require_relative 'rubocop/cop/sevencop/rspec_empty_line_after_let'
24
25
  require_relative 'rubocop/cop/sevencop/rspec_examples_in_same_group'
26
+ require_relative 'rubocop/cop/sevencop/rspec_memoized_helper_block_delimiter'
27
+ require_relative 'rubocop/cop/sevencop/rspec_rails_response_parsed_body'
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.26.2
4
+ version: 0.28.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-11-01 00:00:00.000000000 Z
11
+ date: 2022-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -73,7 +73,10 @@ files:
73
73
  - lib/rubocop/cop/sevencop/rails_where_not.rb
74
74
  - lib/rubocop/cop/sevencop/require_ordered.rb
75
75
  - lib/rubocop/cop/sevencop/rspec_describe_http_endpoint.rb
76
+ - lib/rubocop/cop/sevencop/rspec_empty_line_after_let.rb
76
77
  - lib/rubocop/cop/sevencop/rspec_examples_in_same_group.rb
78
+ - lib/rubocop/cop/sevencop/rspec_memoized_helper_block_delimiter.rb
79
+ - lib/rubocop/cop/sevencop/rspec_rails_response_parsed_body.rb
77
80
  - lib/sevencop.rb
78
81
  - lib/sevencop/config_loader.rb
79
82
  - lib/sevencop/cop_concerns.rb