rubocop-infinum 0.5.1 → 0.8.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: abf5743e5f9cb860ccccd40aa99cc051b583115693c6b4e69be6d39eb0346c72
4
- data.tar.gz: 9d9c6d46dae69c7f86cf1f8b43d0c475691870ac672354b7ebae9171de4a714a
3
+ metadata.gz: eb4cbafaa4d31485e68abafcf382d32ab840d0487c8414d260f40411b7017090
4
+ data.tar.gz: a0016264cc32af54cfde8fe31688f45cf189724c2df52fe462f91a947959a181
5
5
  SHA512:
6
- metadata.gz: 492842a441bb84e5b77fce3b5041dc7b81a529798f68f8ddd07dca6ca3e127475e20a8a6508deafde9a35d0650a630a4b108d3a977fd1e25096fd50462fd4b58
7
- data.tar.gz: 925d8a1e346acd5dd9d710ed0ab28788f83f50b17e4e1caae8ec1bc9765753657f792578604f6336ba6c0f4f97543ee9eccfd0ae6f64d2157084ece54aa95225
6
+ metadata.gz: 90182373858f8f363ca0789478382a645a046df2588f55a41301e1bd1e8812781e97f261fc2c3832a7907855de189d4d965b25a5c18acbc6942bac03b3a791a1
7
+ data.tar.gz: f3cb86e550f0e7ed51419ddf30b18f80f26b1354879506f9e17241c1e7b1133fd46aaae7409b941f8dfbf3ded5af049605c146ac190135049256f2ffcabaa837
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # RuboCop Infinum Change Log
2
2
 
3
+ ## 0.8.0 (May 11th, 2022)
4
+
5
+ - Remove TargetRubyVersion from rubocop yml template (@cilim)
6
+
7
+ ## 0.7.0 (Apr 28th, 2022)
8
+
9
+ - Rename Layout/LineLength IgnoredPatterns to AllowedPatterns (@vlakre)
10
+
11
+ ## 0.6.0 (Feb 18th, 2022)
12
+
13
+ - Create FactoryBotAssociation cop (@Benaaaaa)
14
+ - Fix issue with second optional parameter and refactor attribute_default_block_value cop (@Benaaaaa)
15
+
3
16
  ## 0.5.1 (Sep 16th, 2021)
4
17
 
5
18
  - Enforce separated accessor grouping (@d4be4st)
@@ -22,21 +22,21 @@ module RuboCop
22
22
  MSG = 'Pass method in a block to `:default` option.'
23
23
 
24
24
  def_node_matcher :default_attribute, <<~PATTERN
25
- (send nil? :attribute _ _ (hash <$#attribute ...>))
25
+ (send nil? :attribute _ ?_ (hash <$#attribute ...>))
26
26
  PATTERN
27
27
 
28
28
  def_node_matcher :attribute, '(pair (sym :default) $_)'
29
29
 
30
30
  def on_send(node)
31
- default_attribute(node) do |attribute|
32
- value = attribute.children.last
31
+ default_attribute(node) do |hash_pair|
32
+ value = attribute(hash_pair)
33
33
 
34
34
  add_offense(node, location: value) if value.send_type?
35
35
  end
36
36
  end
37
37
 
38
38
  def autocorrect(node)
39
- expression = default_attribute(node).children.last
39
+ expression = attribute(default_attribute(node))
40
40
 
41
41
  lambda do |corrector|
42
42
  corrector.replace(expression, "-> { #{expression.source} }")
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop'
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Infinum
8
+ # This cop looks for 'association' in factories that specify a ':factory' option
9
+ # and tells you to use explicit build reference which improves the performance
10
+ # as cascading factories will not be saved unless needed to
11
+ #
12
+ # @example
13
+ # #bad
14
+ # FactoryBot.define do
15
+ # factory :book do
16
+ # title { 'Lord of the Rings' }
17
+ # association :author
18
+ # end
19
+ # end
20
+ #
21
+ # FactoryBoy.define do
22
+ # factory :book do
23
+ # title {'Lord of the Rings'}
24
+ # author { association :author }
25
+ # end
26
+ # end
27
+ #
28
+ # #good
29
+ # FactoryBot.define do
30
+ # factory :book do
31
+ # title { 'Lord of the Rings' }
32
+ # author { build(:author) }
33
+ # end
34
+ # end
35
+ #
36
+ # FactoryBot.define do
37
+ # factory :author do
38
+ # name { 'J. R. R. Tolkien' }
39
+ # end
40
+ # end
41
+ class FactoryBotAssociation < ::RuboCop::Cop::Cop
42
+ MSG = 'Use %<association_name>s { build(:%<factory_name>s) } instead'
43
+
44
+ def_node_matcher :association_definition, <<~PATTERN
45
+ (send nil? :association (:sym $_) (hash (pair (sym :factory) (:sym $_))) ?)
46
+ PATTERN
47
+
48
+ def_node_matcher :inline_association_definition, <<~PATTERN
49
+ (block (send nil? $_) (args) (send nil? :association (sym $_)))
50
+ PATTERN
51
+
52
+ def on_block(node)
53
+ inline_association_definition(node) do |association_name, factory_name|
54
+ message = format(MSG, association_name: association_name.to_s, factory_name: factory_name.to_s)
55
+
56
+ add_offense(node, location: node, message: message)
57
+ end
58
+ end
59
+
60
+ def on_send(node)
61
+ return unless corrections.empty?
62
+
63
+ association_definition(node) do |association_name, factory_name|
64
+ factory_name = [association_name] if factory_name.empty?
65
+
66
+ message = format(MSG, association_name: association_name.to_s, factory_name: factory_name.first.to_s)
67
+
68
+ add_offense(node, location: node, message: message)
69
+ end
70
+ end
71
+
72
+ def autocorrect(node)
73
+ lambda do |corrector|
74
+ if expression(node).size == 1
75
+ corrector.replace(node, "#{expression(node)[0]} { build(:#{expression(node)[0]}) }")
76
+ else
77
+ corrector.replace(node, "#{expression(node)[0]} { build(:#{expression(node)[1]}) }")
78
+ end
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def expression(node)
85
+ @expression = if node.block_type?
86
+ inline_association_definition(node)
87
+ else
88
+ association_definition(node).flatten
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'infinum/attribute_default_block_value'
4
+ require_relative 'infinum/factory_bot_association'
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RuboCop
4
4
  module Infinum
5
- VERSION = '0.5.1'
5
+ VERSION = '0.8.0'
6
6
  end
7
7
  end
@@ -5,7 +5,7 @@ require_relative 'lib/rubocop/infinum/version'
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'rubocop-infinum'
7
7
  spec.version = RuboCop::Infinum::VERSION
8
- spec.authors = ['Marko Ćilimković', 'Stjepan Hađić']
8
+ spec.authors = ['Marko Ćilimković', 'Stjepan Hađić', 'Tin Benaković']
9
9
  spec.email = ['team.backend@infinum.com']
10
10
 
11
11
  spec.summary = 'Automatic Infinum code style checking tool.'
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency('pry-byebug', '< 4')
31
31
  spec.add_development_dependency('rspec', '~> 3.9')
32
32
 
33
- spec.add_runtime_dependency('rubocop')
33
+ spec.add_runtime_dependency('rubocop', '>= 1.28.0')
34
34
  spec.add_runtime_dependency('rubocop-rails')
35
35
  spec.add_runtime_dependency('rubocop-rspec')
36
36
  spec.add_runtime_dependency('rubocop-performance')
data/rubocop.yml CHANGED
@@ -5,7 +5,7 @@ require:
5
5
 
6
6
  Layout/LineLength:
7
7
  Max: 120
8
- IgnoredPatterns: ['\A#']
8
+ AllowedPatterns: ['\A#']
9
9
 
10
10
  Naming/InclusiveLanguage:
11
11
  Enabled: false
@@ -42,7 +42,6 @@ Metrics/BlockLength:
42
42
  - 'spec/**/*_spec.rb'
43
43
 
44
44
  AllCops:
45
- TargetRubyVersion: 2.5
46
45
  Exclude:
47
46
  - 'db/schema.rb'
48
47
  - 'db/migrate/*.rb'
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-infinum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marko Ćilimković
8
8
  - Stjepan Hađić
9
+ - Tin Benaković
9
10
  autorequire:
10
11
  bindir: exe
11
12
  cert_chain: []
12
- date: 2021-09-16 00:00:00.000000000 Z
13
+ date: 2022-05-11 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: pry-byebug
@@ -45,14 +46,14 @@ dependencies:
45
46
  requirements:
46
47
  - - ">="
47
48
  - !ruby/object:Gem::Version
48
- version: '0'
49
+ version: 1.28.0
49
50
  type: :runtime
50
51
  prerelease: false
51
52
  version_requirements: !ruby/object:Gem::Requirement
52
53
  requirements:
53
54
  - - ">="
54
55
  - !ruby/object:Gem::Version
55
- version: '0'
56
+ version: 1.28.0
56
57
  - !ruby/object:Gem::Dependency
57
58
  name: rubocop-rails
58
59
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +114,7 @@ files:
113
114
  - bin/setup
114
115
  - lib/rubocop-infinum.rb
115
116
  - lib/rubocop/cop/infinum/attribute_default_block_value.rb
117
+ - lib/rubocop/cop/infinum/factory_bot_association.rb
116
118
  - lib/rubocop/cop/infinum_cops.rb
117
119
  - lib/rubocop/infinum.rb
118
120
  - lib/rubocop/infinum/version.rb