sevencop 0.9.3 → 0.11.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: 3d3ab099568a85aea228ce2fcf282f4e0bc7a2e2c6f3315191c2e9e14367a173
4
- data.tar.gz: aeba9572d3eeb74d5d4da5473b30b62d291b0e01d8f5644f041ca41ecd43994f
3
+ metadata.gz: '0977a1a38e5da28e989cde731824234e1a8aaa2f926cf416d31c4acbe9fb4a3d'
4
+ data.tar.gz: 3bbf77f3ad02d92ed82ca989908deb42cbced1e8ff7b9cd830a8a3b4b46c40e2
5
5
  SHA512:
6
- metadata.gz: 643b778e5c44256e590b1a7344825f46c1057a18d3e424076583b522a21f957ca1acf37e2ba6f59d58b72a66e929e2aada551c627cf039d065dbea2646d4e485
7
- data.tar.gz: 723e43f5d54dab22c1be3d02bb1074d6899783aec74c64c1fa6ead9294b01ffde02d5aae1b1792e483082d5d297f784de393a20285d34a303e892febc2522ae6
6
+ metadata.gz: 327acfe1f5b8d48ec9d11f369e32287b13972efdbe69c7e85f7f7a0ea7dfb520c5ac6d1be803e0b727bff6de6e231096d35c5b6a8e516aa0b3dfd98f1aec0eac
7
+ data.tar.gz: 6eb86ca1c5caa944ad099e556dcbc5d881b8c8be7c63e1d4bd6cccbc14d5fdfadfd4808e03c8461726f5f9e1ba97e0dcc247f0c34874eb8dc01152f6243ad14f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sevencop (0.9.3)
4
+ sevencop (0.11.0)
5
5
  rubocop
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -67,6 +67,25 @@ belongs_to :group, options
67
67
 
68
68
  This is useful for migration of `config.active_record.belongs_to_required_by_default`.
69
69
 
70
+ ### Sevencop/FactoryBotCreateList
71
+
72
+ Finds possible substitutions for `FactoryBot.create_list`.
73
+
74
+ ```ruby
75
+ # bad
76
+ Array.new(2) do
77
+ create(:user)
78
+ end
79
+
80
+ # good
81
+ create_list(:user, 2)
82
+
83
+ # good
84
+ Array.new(2) do |i|
85
+ create(:user, order: i)
86
+ end
87
+ ```
88
+
70
89
  ### Sevencop/HashLiteralOrder
71
90
 
72
91
  Sort Hash literal entries by key.
@@ -105,6 +124,26 @@ RSpec.describe User
105
124
  RSpec.describe User, type: :request
106
125
  ```
107
126
 
127
+ ### Sevencop/MethodDefinitionMultilineArguments
128
+
129
+ Inserts new lines between method definition parameters.
130
+
131
+ ```ruby
132
+ # bad
133
+ def foo(a, b)
134
+ end
135
+
136
+ # good
137
+ def foo(
138
+ a,
139
+ b
140
+ )
141
+
142
+ # good
143
+ def foo(a)
144
+ end
145
+ ```
146
+
108
147
  ### Sevencop/OrderField
109
148
 
110
149
  Identifies a String including "field" is passed to `order` or `reorder`.
data/config/default.yml CHANGED
@@ -5,6 +5,12 @@ Sevencop/BelongsToOptional:
5
5
  Safe: false
6
6
  VersionAdded: '0.5'
7
7
 
8
+ Sevencop/FactoryBotCreateList:
9
+ Description: |
10
+ Finds possible substitutions for `FactoryBot.create_list`.
11
+ Enabled: false
12
+ VersionAdded: '0.10'
13
+
8
14
  Sevencop/HashLiteralOrder:
9
15
  Description: |
10
16
  Sort Hash literal entries by key.
@@ -17,6 +23,12 @@ Sevencop/InferredSpecType:
17
23
  Enabled: false
18
24
  VersionAdded: '0.9'
19
25
 
26
+ Sevencop/MethodDefinitionMultilineArguments:
27
+ Description: |
28
+ Inserts new lines between method definition parameters.
29
+ Enabled: false
30
+ VersionAdded: '0.11'
31
+
20
32
  Sevencop/OrderField:
21
33
  Description: |
22
34
  Wrap safe SQL String by `Arel.sql`.
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sevencop
6
+ # Finds possible substitutions for `FactoryBot.create_list`.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # Array.new(2) do
12
+ # create(:user)
13
+ # end
14
+ #
15
+ # # good
16
+ # create_list(:user, 2)
17
+ #
18
+ # # good
19
+ # Array.new(2) do |i|
20
+ # create(:user, order: i)
21
+ # end
22
+ #
23
+ # @note
24
+ # This cop does not support `Integer#times` intentionally because it
25
+ # should be treated by `Performance/TimesMap` cop.
26
+ #
27
+ class FactoryBotCreateList < Base
28
+ extend AutoCorrector
29
+
30
+ MSG = 'Use `create_list` instead.'
31
+
32
+ # @param node [RuboCop::AST::BlockNode]
33
+ # @return [void]
34
+ def on_block(node)
35
+ count_node, factory_name_node, extra_argument_nodes = extract(node)
36
+ return unless count_node
37
+
38
+ add_offense(node) do |corrector|
39
+ corrector.replace(
40
+ node,
41
+ format(
42
+ 'create_list(%<arguments>s)',
43
+ arguments: [
44
+ factory_name_node,
45
+ count_node,
46
+ *extra_argument_nodes
47
+ ].map(&:source).join(', ')
48
+ )
49
+ )
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ # @!method extract(node)
56
+ # @param node [RuboCop::AST::BlockNode]
57
+ # @return [Array(Integer, RuboCop::AST::SendNode)]
58
+ def_node_matcher :extract, <<~PATTERN
59
+ (block
60
+ (send
61
+ (const {nil? | cbase} :Array)
62
+ :new
63
+ $(int _)
64
+ )
65
+ (args)
66
+ (send
67
+ nil?
68
+ :create
69
+ $(sym _) $(...)?
70
+ )
71
+ )
72
+ PATTERN
73
+
74
+ # @param corrector [RuboCop::Cop::Corrector]
75
+ # @param node [RuboCop::AST::BlockNode]
76
+ # @return [void]
77
+ def autocorrect(corrector, node)
78
+ count_node, factory_name_node, extra_argument_nodes = extract(node)
79
+ corrector.replace(
80
+ node,
81
+ format(
82
+ 'create_list(%<arguments>s)',
83
+ arguments: [
84
+ factory_name_node,
85
+ count_node,
86
+ *extra_argument_nodes
87
+ ].map(&:source).join(', ')
88
+ )
89
+ )
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sevencop
6
+ # Inserts new lines between method definition parameters.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # def foo(a, b)
11
+ # end
12
+ #
13
+ # # good
14
+ # def foo(
15
+ # a,
16
+ # b
17
+ # )
18
+ #
19
+ # # good
20
+ # def foo(a)
21
+ # end
22
+ class MethodDefinitionMultilineArguments < Base
23
+ extend AutoCorrector
24
+
25
+ MSG = 'Insert new lines between method definition parameters.'
26
+
27
+ # @param node [RuboCop::AST::ArgsNode]
28
+ def on_args(node)
29
+ return if method_args?(node) && multilined?(node)
30
+
31
+ add_offense(node) do |corrector|
32
+ autocorrect(corrector, node)
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ # @param corrector [RuboCop::AST::Corrector]
39
+ # @param node [RuboCop::AST::ArgsNode]
40
+ # @return [String]
41
+ def autocorrect(corrector, node)
42
+ indent = ' ' * node.parent.location.expression.column
43
+
44
+ corrector.replace(
45
+ node.location.expression.with(
46
+ begin_pos: node.parent.location.name.end_pos
47
+ ),
48
+ [
49
+ "(\n#{indent} ",
50
+ node.children.map(&:source).join(",\n#{indent} "),
51
+ "\n#{indent})"
52
+ ].join
53
+ )
54
+ end
55
+
56
+ # @param node [RuboCop::AST::ArgsNode]
57
+ # @return [Boolean]
58
+ def multilined?(node)
59
+ node.children.map do |child|
60
+ child.location.expression.line
61
+ end.uniq.length == node.children.length
62
+ end
63
+
64
+ # @return [Boolean]
65
+ def method_args?(node)
66
+ !node.parent.nil? && node.parent.def_type?
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sevencop
4
- VERSION = '0.9.3'
4
+ VERSION = '0.11.0'
5
5
  end
data/lib/sevencop.rb CHANGED
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'pathname'
4
- require 'yaml'
5
-
6
3
  require_relative 'sevencop/rubocop_extension'
7
4
  require_relative 'sevencop/version'
8
5
 
9
6
  require_relative 'rubocop/cop/sevencop/belongs_to_optional'
7
+ require_relative 'rubocop/cop/sevencop/factory_bot_create_list'
10
8
  require_relative 'rubocop/cop/sevencop/hash_literal_order'
11
9
  require_relative 'rubocop/cop/sevencop/inferred_spec_type'
10
+ require_relative 'rubocop/cop/sevencop/method_definition_multiline_arguments'
12
11
  require_relative 'rubocop/cop/sevencop/order_field'
13
12
  require_relative 'rubocop/cop/sevencop/redundant_existence_check'
14
13
  require_relative 'rubocop/cop/sevencop/to_s_with_argument'
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.9.3
4
+ version: 0.11.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-08-27 00:00:00.000000000 Z
11
+ date: 2022-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -42,8 +42,10 @@ files:
42
42
  - Rakefile
43
43
  - config/default.yml
44
44
  - lib/rubocop/cop/sevencop/belongs_to_optional.rb
45
+ - lib/rubocop/cop/sevencop/factory_bot_create_list.rb
45
46
  - lib/rubocop/cop/sevencop/hash_literal_order.rb
46
47
  - lib/rubocop/cop/sevencop/inferred_spec_type.rb
48
+ - lib/rubocop/cop/sevencop/method_definition_multiline_arguments.rb
47
49
  - lib/rubocop/cop/sevencop/order_field.rb
48
50
  - lib/rubocop/cop/sevencop/redundant_existence_check.rb
49
51
  - lib/rubocop/cop/sevencop/to_s_with_argument.rb