sevencop 0.2.0 → 0.4.1

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: ef38866fd82173f9e717566ed4ddacaa43571eda5760cc72b37ec615256e32cc
4
+ data.tar.gz: cf4aa55ea75a1eeebfae8a1d4ac311e83611a54b365911d4bf8d244fafbc587d
5
5
  SHA512:
6
- metadata.gz: 1ad6a03a60543e5171f8d41a0d8b257d7fe7b0141c1f2922556b89e8b1e068e3e68ea5db5ef1a941acdb4b2674898d25077e98c5f1c6e0abebb0d73b3aa7ffc2
7
- data.tar.gz: af5b8df28c323361fe79082e26dc6d3910b1bc1d7bf8f1bb9d6d9321ba2a525615bc5fc65cbc24e47a5fccab2cd2a1271315c461cf32495b55a9494363c2b934
6
+ metadata.gz: 744673cf9ae424e870f5a7526a61c19f3b124597e83554c81967544cfdf617992bc2d46c464347cef5f654a5aca1654486511abb85afb0c3123719b6214411f6
7
+ data.tar.gz: 81873ee0905b64eb4aa51cf7d0f93e62a87d2fd616a8c18756fe8d1ac68f023e0e8c0d5b6a2e77847bdf482edee2036956afc15248975292c10f1965488009d5
data/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.4.1 - 2022-06-23
6
+
7
+ ### Fixed
8
+
9
+ - Fix `Sevencop/OrderField` on dstr.
10
+
11
+ ## 0.4.0 - 2022-06-18
12
+
13
+ ### Added
14
+
15
+ - Add `Sevencop/OrderField` cop.
16
+
17
+ ### Changed
18
+
19
+ - Improve performance of `Sevencop/UniquenessValidatorExplicitCaseSensitivity` cop.
20
+ - Improve offense location of `Sevencop/UniquenessValidatorExplicitCaseSensitivity` cop.
21
+
22
+ ## 0.3.0 - 2022-06-18
23
+
24
+ ### Added
25
+
26
+ - Add `Sevencop/UniquenessValidatorExplicitCaseSensitivity` cop.
27
+
5
28
  ## 0.2.0 - 2022-06-07
6
29
 
7
30
  ### 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.4.1)
5
5
  rubocop (>= 1.27)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -35,7 +35,27 @@ require:
35
35
 
36
36
  ## Cops
37
37
 
38
- ### `Sevencop/RedundantExistenceCheck`
38
+ ### Sevencop/OrderField
39
+
40
+ Identifies a String including "field" is passed to `order` or `reorder`.
41
+
42
+ ```ruby
43
+ # bad
44
+ articles.order('field(id, ?)', a)
45
+
46
+ # good
47
+ articles.order(Arel.sql('field(id, ?)'), a)
48
+
49
+ # bad
50
+ reorder('field(id, ?)', a)
51
+
52
+ # good
53
+ reorder(Arel.sql('field(id, ?)'), a)
54
+ ```
55
+
56
+ `Enabled: false` by default.
57
+
58
+ ### Sevencop/RedundantExistenceCheck
39
59
 
40
60
  Identifies redundant existent check before file operation.
41
61
 
@@ -44,11 +64,36 @@ Identifies redundant existent check before file operation.
44
64
  FileUtils.mkdir(a) unless FileTest.exist?(a)
45
65
 
46
66
  # good
47
- FileUtils.mkdir(a)
67
+ FileUtils.mkdir_p(a)
48
68
 
49
69
  # bad
50
70
  FileUtils.rm(a) if FileTest.exist?(a)
51
71
 
52
72
  # good
53
- FileUtils.rm(a)
73
+ FileUtils.rm_f(a)
54
74
  ```
75
+
76
+ ### Sevencop/UniquenessValidatorExplicitCaseSensitivity
77
+
78
+ Identifies use of UniquenessValidator without :case_sensitive option.
79
+
80
+ ```ruby
81
+ # bad
82
+ validates :name, uniqueness: true
83
+
84
+ # good
85
+ validates :name, uniqueness: { case_sensitive: true }
86
+
87
+ # good
88
+ validates :name, uniqueness: { case_sensitive: false }
89
+
90
+ # bad
91
+ validates :name, uniqueness: { allow_nil: true, scope: :user_id }
92
+
93
+ # good
94
+ validates :name, uniqueness: { allow_nil: true, scope: :user_id, case_sensitive: true }
95
+ ```
96
+
97
+ Useful to keep the same behavior between Rails 6.0 and 6.1 where case insensitive collation is used in MySQL.
98
+
99
+ `Enabled: false` by default.
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ task :new_cop, [:cop] do |_task, args|
16
16
  require 'rubocop'
17
17
 
18
18
  cop_name = args.fetch(:cop) do
19
- warn 'usage: bundle exec rake new_cop[Department/Name]'
19
+ warn "usage: bundle exec rake 'new_cop[Department/Name]'"
20
20
  exit!
21
21
  end
22
22
 
@@ -24,7 +24,7 @@ task :new_cop, [:cop] do |_task, args|
24
24
 
25
25
  generator.write_source
26
26
  generator.write_spec
27
- generator.inject_require(root_file_path: 'lib/rubocop/cop/rails_deprecation_cops.rb')
27
+ generator.inject_require(root_file_path: 'lib/sevencop.rb')
28
28
  generator.inject_config(config_file_path: 'config/default.yml')
29
29
 
30
30
  puts generator.todo
data/config/default.yml CHANGED
@@ -1,5 +1,17 @@
1
+ Sevencop/OrderField:
2
+ Description: Wrap safe SQL String by `Arel.sql`.
3
+ Enabled: false
4
+ Safe: false
5
+ VersionAdded: '0.4'
6
+
1
7
  Sevencop/RedundantExistenceCheck:
2
8
  Description: Avoid redundant existent check before file operation.
3
9
  Enabled: true
4
10
  Safe: false
5
11
  VersionAdded: '0.1'
12
+
13
+ Sevencop/UniquenessValidatorExplicitCaseSensitivity:
14
+ Description: Specify :case_sensitivity option on use of UniquenessValidator.
15
+ Enabled: false
16
+ Safe: false
17
+ VersionAdded: '0.3'
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sevencop
6
+ # Identifies a String including "field" is passed to `order` or `reorder`.
7
+ #
8
+ # @safety
9
+ # This cop is unsafe because it can register a false positive.
10
+ #
11
+ # @example
12
+ #
13
+ # # bad
14
+ # articles.order('field(id, ?)', a)
15
+ #
16
+ # # good
17
+ # articles.order(Arel.sql('field(id, ?)'), a)
18
+ #
19
+ # # bad
20
+ # reorder('field(id, ?)', a)
21
+ #
22
+ # # good
23
+ # reorder(Arel.sql('field(id, ?)'), a)
24
+ #
25
+ class OrderField < Base
26
+ extend AutoCorrector
27
+
28
+ MSG = 'Wrap safe SQL String by `Arel.sql`.'
29
+
30
+ RESTRICT_ON_SEND = %i[
31
+ order
32
+ reorder
33
+ ].freeze
34
+
35
+ ORDER_METHOD_NAMES = RESTRICT_ON_SEND.to_set.freeze
36
+
37
+ def_node_matcher :order_with_field?, <<~PATTERN
38
+ (send
39
+ _ ORDER_METHOD_NAMES
40
+ {
41
+ (str /field\(.+\)/) |
42
+ (dstr <(str /field\(.+\)/) ...>)
43
+ }
44
+ ...
45
+ )
46
+ PATTERN
47
+
48
+ # @param [RuboCop::AST::SendNode] node
49
+ def on_send(node)
50
+ return unless order_with_field?(node)
51
+
52
+ first_argument_node = node.arguments.first
53
+ add_offense(first_argument_node) do |corrector|
54
+ corrector.replace(
55
+ node.arguments.first,
56
+ "Arel.sql(#{first_argument_node.source})"
57
+ )
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,94 @@
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
+ RESTRICT_ON_SEND = %i[validates].freeze
35
+
36
+ def_node_matcher :validates_uniqueness?, <<~PATTERN
37
+ (send nil? :validates
38
+ _
39
+ (hash
40
+ <
41
+ (pair
42
+ (sym :uniqueness)
43
+ {true | (hash ...)}
44
+ )
45
+ >
46
+ ...
47
+ )
48
+ )
49
+ PATTERN
50
+
51
+ def_node_matcher :validates_uniqueness_with_case_sensitivity?, <<~PATTERN
52
+ (send nil? :validates
53
+ _
54
+ (hash
55
+ <
56
+ (pair
57
+ (sym :uniqueness)
58
+ (hash <(pair (sym :case_sensitive) _) ...>)
59
+ )
60
+ ...
61
+ >
62
+ )
63
+ )
64
+ PATTERN
65
+
66
+ # @param [RuboCop::AST::SendNode] node
67
+ def on_send(node)
68
+ return unless validates_uniqueness?(node) && !validates_uniqueness_with_case_sensitivity?(node)
69
+
70
+ uniqueness_value = find_uniqueness_value(node)
71
+ add_offense(uniqueness_value) do |corrector|
72
+ if uniqueness_value.true_type?
73
+ corrector.replace(
74
+ uniqueness_value.source_range,
75
+ '{ case_sensitive: true }'
76
+ )
77
+ else
78
+ corrector.insert_after(
79
+ uniqueness_value.pairs.last.source_range,
80
+ ', case_sensitive: true'
81
+ )
82
+ end
83
+ end
84
+ end
85
+
86
+ # @param [RuboCop::AST::SendNode] node
87
+ # @param [RuboCop::AST::Node]
88
+ def find_uniqueness_value(node)
89
+ node.arguments[1].pairs.find { |pair| pair.key.value == :uniqueness }.value
90
+ end
91
+ end
92
+ end
93
+ end
94
+ 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.4.1'
5
5
  end
data/lib/sevencop.rb CHANGED
@@ -6,7 +6,9 @@ require 'yaml'
6
6
  require_relative 'sevencop/inject'
7
7
  require_relative 'sevencop/version'
8
8
 
9
+ require_relative 'rubocop/cop/sevencop/order_field'
9
10
  require_relative 'rubocop/cop/sevencop/redundant_existence_check'
11
+ require_relative 'rubocop/cop/sevencop/uniqueness_validator_explicit_case_sensitivity'
10
12
 
11
13
  module Sevencop
12
14
  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.4.1
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-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -41,11 +41,13 @@ files:
41
41
  - README.md
42
42
  - Rakefile
43
43
  - config/default.yml
44
+ - lib/rubocop/cop/sevencop/order_field.rb
44
45
  - lib/rubocop/cop/sevencop/redundant_existence_check.rb
46
+ - lib/rubocop/cop/sevencop/uniqueness_validator_explicit_case_sensitivity.rb
45
47
  - lib/sevencop.rb
46
48
  - lib/sevencop/inject.rb
47
49
  - lib/sevencop/version.rb
48
- - rubocop-rails_deprecation.gemspec
50
+ - sevencop.gemspec
49
51
  homepage: https://github.com/r7kamura/sevencop
50
52
  licenses:
51
53
  - MIT
@@ -69,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
71
  - !ruby/object:Gem::Version
70
72
  version: '0'
71
73
  requirements: []
72
- rubygems_version: 3.3.7
74
+ rubygems_version: 3.2.32
73
75
  signing_key:
74
76
  specification_version: 4
75
77
  summary: Custom cops for RuboCop.