sevencop 0.2.0 → 0.3.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: 6671a53ba1051be4f4ea86dc41b3c4d4adfef282c8ca1078ea4271161e0e54ac
4
- data.tar.gz: aea5e2be6ae30fe9ca7ba5237e3444cebe5e71ab7352b03f2929fef8c71fccd9
3
+ metadata.gz: 18546d00ceb4ff7f756715ecdbe89e7941a51855df542b4ad2a8a05843ebc46a
4
+ data.tar.gz: b968132f755f723217b47fd81126bb11242e0702b267fcc9ef49eac054c9c22a
5
5
  SHA512:
6
- metadata.gz: 1ad6a03a60543e5171f8d41a0d8b257d7fe7b0141c1f2922556b89e8b1e068e3e68ea5db5ef1a941acdb4b2674898d25077e98c5f1c6e0abebb0d73b3aa7ffc2
7
- data.tar.gz: af5b8df28c323361fe79082e26dc6d3910b1bc1d7bf8f1bb9d6d9321ba2a525615bc5fc65cbc24e47a5fccab2cd2a1271315c461cf32495b55a9494363c2b934
6
+ metadata.gz: d1e87a57863fe1881b6fc0c923213d9d563cdeba24c1ab92715bab58004efbdaf3b011319b1ddc3215b5b20f443a40c99cd515754312a0ba920ff601cd6eb7ab
7
+ data.tar.gz: ae482542aa0d259384cba3bfd04932ae1811b9ed686245ebd3de5f1e1fa7deac48a90fcea0b2f0276afcd9244846b7b59fd4ba1ceef846d1217b505b183877c4
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.0 - 2022-06-18
6
+
7
+ ### Added
8
+
9
+ - Add `Sevencop/UniquenessValidatorExplicitCaseSensitivity` cop.
10
+
5
11
  ## 0.2.0 - 2022-06-07
6
12
 
7
13
  ### Changed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sevencop (0.2.0)
4
+ sevencop (0.3.0)
5
5
  rubocop (>= 1.27)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -44,11 +44,36 @@ Identifies redundant existent check before file operation.
44
44
  FileUtils.mkdir(a) unless FileTest.exist?(a)
45
45
 
46
46
  # good
47
- FileUtils.mkdir(a)
47
+ FileUtils.mkdir_p(a)
48
48
 
49
49
  # bad
50
50
  FileUtils.rm(a) if FileTest.exist?(a)
51
51
 
52
52
  # good
53
- FileUtils.rm(a)
53
+ FileUtils.rm_f(a)
54
54
  ```
55
+
56
+ ### `Sevencop/UniquenessValidatorExplicitCaseSensitivity`
57
+
58
+ Identifies use of UniquenessValidator without :case_sensitive option.
59
+
60
+ ```ruby
61
+ # bad
62
+ validates :name, uniqueness: true
63
+
64
+ # good
65
+ validates :name, uniqueness: { case_sensitive: true }
66
+
67
+ # good
68
+ validates :name, uniqueness: { case_sensitive: false }
69
+
70
+ # bad
71
+ validates :name, uniqueness: { allow_nil: true, scope: :user_id }
72
+
73
+ # good
74
+ validates :name, uniqueness: { allow_nil: true, scope: :user_id, case_sensitive: true }
75
+ ```
76
+
77
+ Useful to keep the same behavior between Rails 6.0 and 6.1 where case insensitive collation is used in MySQL.
78
+
79
+ Note that this cop is `Enabled: false` by default.
data/config/default.yml CHANGED
@@ -3,3 +3,9 @@ Sevencop/RedundantExistenceCheck:
3
3
  Enabled: true
4
4
  Safe: false
5
5
  VersionAdded: '0.1'
6
+
7
+ Sevencop/UniquenessValidatorExplicitCaseSensitivity:
8
+ Description: Specify :case_sensitivity option on use of UniquenessValidator.
9
+ Enabled: false
10
+ Safe: false
11
+ VersionAdded: '0.3'
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sevencop
6
+ # Identifies use of UniquenessValidator without :case_sensitive option.
7
+ # This is useful to keep the same behavior between Rails 6.0 and 6.1 where case insensitive collation is used in MySQL.
8
+ #
9
+ # @safety
10
+ # This cop is unsafe because it can register a false positive.
11
+ #
12
+ # @example
13
+ #
14
+ # # bad
15
+ # validates :name, uniqueness: true
16
+ #
17
+ # # good
18
+ # validates :name, uniqueness: { case_sensitive: true }
19
+ #
20
+ # # good
21
+ # validates :name, uniqueness: { case_sensitive: false }
22
+ #
23
+ # # bad
24
+ # validates :name, uniqueness: { allow_nil: true, scope: :user_id }
25
+ #
26
+ # # good
27
+ # validates :name, uniqueness: { allow_nil: true, scope: :user_id, case_sensitive: true }
28
+ #
29
+ class UniquenessValidatorExplicitCaseSensitivity < Base
30
+ extend AutoCorrector
31
+
32
+ MSG = 'Specify :case_sensitivity option on use of UniquenessValidator.'
33
+
34
+ def_node_matcher :validates_uniqueness?, <<~PATTERN
35
+ (send nil? :validates
36
+ _
37
+ (hash
38
+ <
39
+ (pair
40
+ (sym :uniqueness)
41
+ {true | (hash ...)}
42
+ )
43
+ >
44
+ ...
45
+ )
46
+ )
47
+ PATTERN
48
+
49
+ def_node_matcher :validates_uniqueness_with_case_sensitivity?, <<~PATTERN
50
+ (send nil? :validates
51
+ _
52
+ (hash
53
+ <
54
+ (pair
55
+ (sym :uniqueness)
56
+ (hash <(pair (sym :case_sensitive) _) ...>)
57
+ )
58
+ ...
59
+ >
60
+ )
61
+ )
62
+ PATTERN
63
+
64
+ # @param [RuboCop::AST::SendNode] node
65
+ def on_send(node)
66
+ return unless validates_uniqueness?(node) && !validates_uniqueness_with_case_sensitivity?(node)
67
+
68
+ add_offense(node) do |corrector|
69
+ uniqueness_value = find_uniqueness_value(node)
70
+ if uniqueness_value.true_type?
71
+ corrector.replace(
72
+ uniqueness_value.source_range,
73
+ '{ case_sensitive: true }'
74
+ )
75
+ else
76
+ corrector.insert_after(
77
+ uniqueness_value.pairs.last.source_range,
78
+ ', case_sensitive: true'
79
+ )
80
+ end
81
+ end
82
+ end
83
+
84
+ # @param [RuboCop::AST::SendNode] node
85
+ # @param [RuboCop::AST::Node]
86
+ def find_uniqueness_value(node)
87
+ node.arguments[1].pairs.find { |pair| pair.key.value == :uniqueness }.value
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sevencop
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/sevencop.rb CHANGED
@@ -7,6 +7,7 @@ require_relative 'sevencop/inject'
7
7
  require_relative 'sevencop/version'
8
8
 
9
9
  require_relative 'rubocop/cop/sevencop/redundant_existence_check'
10
+ require_relative 'rubocop/cop/sevencop/uniqueness_validator_explicit_case_sensitivity'
10
11
 
11
12
  module Sevencop
12
13
  PROJECT_ROOT = ::Pathname.new(__dir__).parent.expand_path.freeze
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.2.0
4
+ version: 0.3.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-06-07 00:00:00.000000000 Z
11
+ date: 2022-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -42,6 +42,7 @@ files:
42
42
  - Rakefile
43
43
  - config/default.yml
44
44
  - lib/rubocop/cop/sevencop/redundant_existence_check.rb
45
+ - lib/rubocop/cop/sevencop/uniqueness_validator_explicit_case_sensitivity.rb
45
46
  - lib/sevencop.rb
46
47
  - lib/sevencop/inject.rb
47
48
  - lib/sevencop/version.rb