sevencop 0.3.0 → 0.4.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: 18546d00ceb4ff7f756715ecdbe89e7941a51855df542b4ad2a8a05843ebc46a
4
- data.tar.gz: b968132f755f723217b47fd81126bb11242e0702b267fcc9ef49eac054c9c22a
3
+ metadata.gz: b2c9e682c02d43b65dbeefd01c07c467881b43bb8a1344289f85584f21e998c9
4
+ data.tar.gz: fd1dd656e25801d5748b28edcb85d0286c042d29d3b2d065761fa030876c492c
5
5
  SHA512:
6
- metadata.gz: d1e87a57863fe1881b6fc0c923213d9d563cdeba24c1ab92715bab58004efbdaf3b011319b1ddc3215b5b20f443a40c99cd515754312a0ba920ff601cd6eb7ab
7
- data.tar.gz: ae482542aa0d259384cba3bfd04932ae1811b9ed686245ebd3de5f1e1fa7deac48a90fcea0b2f0276afcd9244846b7b59fd4ba1ceef846d1217b505b183877c4
6
+ metadata.gz: 60b0f9acd29d904cc77cc7fbc20023fdc050298ef51022802e815287e9fd8ea5a3823f849a718a2b76fe1a563c3932c5e5e553be9e18cdac16cb22d813ff9e30
7
+ data.tar.gz: ada45750a1964ee08629bdac329029b169f77aa68999c8c7bf3cd0d983e8eacadb9925d0140fb418a1e9cd0f071b9c1d75f0f8b4dd36ff07e0984c0e21c0a673
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.4.0 - 2022-06-18
6
+
7
+ ### Added
8
+
9
+ - Add `Sevencop/OrderField` cop.
10
+
11
+ ### Changed
12
+
13
+ - Improve performance of `Sevencop/UniquenessValidatorExplicitCaseSensitivity` cop.
14
+ - Improve offense location of `Sevencop/UniquenessValidatorExplicitCaseSensitivity` cop.
15
+
5
16
  ## 0.3.0 - 2022-06-18
6
17
 
7
18
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sevencop (0.3.0)
4
+ sevencop (0.4.0)
5
5
  rubocop (>= 1.27)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -35,6 +35,26 @@ require:
35
35
 
36
36
  ## Cops
37
37
 
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
+
38
58
  ### `Sevencop/RedundantExistenceCheck`
39
59
 
40
60
  Identifies redundant existent check before file operation.
@@ -76,4 +96,4 @@ validates :name, uniqueness: { allow_nil: true, scope: :user_id, case_sensitive:
76
96
 
77
97
  Useful to keep the same behavior between Rails 6.0 and 6.1 where case insensitive collation is used in MySQL.
78
98
 
79
- Note that this cop is `Enabled: false` by default.
99
+ `Enabled: false` by default.
data/Rakefile CHANGED
@@ -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,3 +1,9 @@
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
@@ -0,0 +1,60 @@
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
+ (str /field\(.+\)/)
41
+ ...
42
+ )
43
+ PATTERN
44
+
45
+ # @param [RuboCop::AST::SendNode] node
46
+ def on_send(node)
47
+ return unless order_with_field?(node)
48
+
49
+ first_argument_node = node.arguments.first
50
+ add_offense(first_argument_node) do |corrector|
51
+ corrector.replace(
52
+ node.arguments.first,
53
+ "Arel.sql(#{first_argument_node.source})"
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -31,6 +31,8 @@ module RuboCop
31
31
 
32
32
  MSG = 'Specify :case_sensitivity option on use of UniquenessValidator.'
33
33
 
34
+ RESTRICT_ON_SEND = %i[validates].freeze
35
+
34
36
  def_node_matcher :validates_uniqueness?, <<~PATTERN
35
37
  (send nil? :validates
36
38
  _
@@ -65,8 +67,8 @@ module RuboCop
65
67
  def on_send(node)
66
68
  return unless validates_uniqueness?(node) && !validates_uniqueness_with_case_sensitivity?(node)
67
69
 
68
- add_offense(node) do |corrector|
69
- uniqueness_value = find_uniqueness_value(node)
70
+ uniqueness_value = find_uniqueness_value(node)
71
+ add_offense(uniqueness_value) do |corrector|
70
72
  if uniqueness_value.true_type?
71
73
  corrector.replace(
72
74
  uniqueness_value.source_range,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sevencop
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
data/lib/sevencop.rb CHANGED
@@ -6,6 +6,7 @@ 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'
10
11
  require_relative 'rubocop/cop/sevencop/uniqueness_validator_explicit_case_sensitivity'
11
12
 
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.3.0
4
+ version: 0.4.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-17 00:00:00.000000000 Z
11
+ date: 2022-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -41,6 +41,7 @@ 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
45
46
  - lib/rubocop/cop/sevencop/uniqueness_validator_explicit_case_sensitivity.rb
46
47
  - lib/sevencop.rb