rubocop-sequel 0.1.0 → 0.3.3

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
- SHA1:
3
- metadata.gz: a6bd53027cc6d6df7b1d67153a46c9ac5325509b
4
- data.tar.gz: 32b4aa5476643d2c82d4c5495b77ba5cd3fcab02
2
+ SHA256:
3
+ metadata.gz: dc0c293a2da37b5ef89b4b0e7d6a6639c4edcc99b5f5a476adeaba27924baf84
4
+ data.tar.gz: 37d04d0e24b6aabc08a97ec6d713bfa00db61e755eb1d6a6254cf09d305149c8
5
5
  SHA512:
6
- metadata.gz: 75952359885f37ceafdc126f9df5b102f3f64d06ed761308085a6fe3498d68382a28bdfef00a6658c14af589f98900a70076fce221d425eb8167b3f2de1d8ed0
7
- data.tar.gz: 2016916ef31f9459cc2ad51b4180534563d7c38f901a72e060db218716ddbad3ef9dfc2e35970333bb1877f7ea2d6f6e69018df4c5af37f5ce2de2bd188e5031
6
+ metadata.gz: 26fdd03e129d3636db9f348a7825c608eeefd7d5d1d715cdce4413120446ee93fda09afe5cb192e6074c02f33e03a5f8a7f87891e4ddb961e07ecc104fe44817
7
+ data.tar.gz: b55b4773c476338c93699771bf9066aedb261a2c8bb259177ec0b6b9b436475ac3243d476697d3edebd93474fe821f609e6a34548b1e5b4720cb4f84c3ac36c8
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: /
5
+ schedule:
6
+ interval: "weekly"
@@ -1,5 +1,5 @@
1
1
  name: CI
2
- on: push
2
+ on: [push, pull_request]
3
3
 
4
4
  jobs:
5
5
  main:
@@ -8,10 +8,10 @@ jobs:
8
8
  strategy:
9
9
  matrix:
10
10
  ruby:
11
- - 2.4
12
11
  - 2.5
13
12
  - 2.6
14
13
  - 2.7
14
+ - 3.0
15
15
  steps:
16
16
  - uses: actions/checkout@v2
17
17
 
data/.rubocop.yml CHANGED
@@ -2,7 +2,8 @@ require:
2
2
  - rubocop-rspec
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.4
5
+ TargetRubyVersion: 2.5
6
+ NewCops: enable
6
7
 
7
8
  # Offense count: 1
8
9
  # Configuration parameters: CountComments, ExcludedMethods.
@@ -7,3 +7,4 @@ require 'rubocop/cop/sequel/concurrent_index'
7
7
  require 'rubocop/cop/sequel/json_column'
8
8
  require 'rubocop/cop/sequel/migration_name'
9
9
  require 'rubocop/cop/sequel/save_changes'
10
+ require 'rubocop/cop/sequel/partial_constraint'
@@ -4,8 +4,9 @@ module RuboCop
4
4
  module Cop
5
5
  module Sequel
6
6
  # ColumnDefault looks for column creation with a default value.
7
- class ColumnDefault < Cop
7
+ class ColumnDefault < Base
8
8
  MSG = "Don't create new column with default values"
9
+ RESTRICT_ON_SEND = %i[add_column].freeze
9
10
 
10
11
  def_node_matcher :add_column_default?, <<-MATCHER
11
12
  (send _ :add_column ... (hash (pair (sym :default) _)))
@@ -14,7 +15,7 @@ module RuboCop
14
15
  def on_send(node)
15
16
  return unless add_column_default?(node)
16
17
 
17
- add_offense(node, location: :selector, message: MSG)
18
+ add_offense(node.loc.selector, message: MSG)
18
19
  end
19
20
  end
20
21
  end
@@ -4,8 +4,9 @@ module RuboCop
4
4
  module Cop
5
5
  module Sequel
6
6
  # ConcurrentIndex looks for non-concurrent index creation.
7
- class ConcurrentIndex < Cop
7
+ class ConcurrentIndex < Base
8
8
  MSG = 'Prefer creating or dropping new index concurrently'
9
+ RESTRICT_ON_SEND = %i[add_index drop_index].freeze
9
10
 
10
11
  def_node_matcher :indexes?, <<-MATCHER
11
12
  (send _ {:add_index :drop_index} $...)
@@ -13,7 +14,7 @@ module RuboCop
13
14
 
14
15
  def on_send(node)
15
16
  indexes?(node) do |args|
16
- add_offense(node, location: :selector, message: MSG) if offensive?(args)
17
+ add_offense(node.loc.selector, message: MSG) if offensive?(args)
17
18
  end
18
19
  end
19
20
 
@@ -4,8 +4,9 @@ module RuboCop
4
4
  module Cop
5
5
  module Sequel
6
6
  # JSONColumn looks for non-JSONB columns.
7
- class JSONColumn < Cop
7
+ class JSONColumn < Base
8
8
  MSG = 'Use JSONB rather than JSON or hstore'
9
+ RESTRICT_ON_SEND = %i[add_column].freeze
9
10
 
10
11
  def_node_matcher :json_or_hstore?, <<-MATCHER
11
12
  (send _ :add_column ... (sym {:json :hstore}))
@@ -22,7 +23,7 @@ module RuboCop
22
23
  def on_send(node)
23
24
  return unless json_or_hstore?(node)
24
25
 
25
- add_offense(node, location: :selector, message: MSG)
26
+ add_offense(node.loc.selector, message: MSG)
26
27
  end
27
28
 
28
29
  def on_block(node)
@@ -31,7 +32,7 @@ module RuboCop
31
32
  node.each_node(:send) do |method|
32
33
  next unless column_method?(method) || column_type?(method)
33
34
 
34
- add_offense(method, location: :selector, message: MSG)
35
+ add_offense(method.loc.selector, message: MSG)
35
36
  end
36
37
  end
37
38
  end
@@ -4,19 +4,19 @@ module RuboCop
4
4
  module Cop
5
5
  module Sequel
6
6
  # MigrationName looks for migration files named with a default name.
7
- class MigrationName < Cop
7
+ class MigrationName < Base
8
8
  include RangeHelp
9
9
 
10
10
  MSG = 'Migration files should not use default name.'
11
11
 
12
- def investigate(processed_source)
12
+ def on_new_investigation
13
13
  file_path = processed_source.buffer.name
14
14
  return if config.file_to_include?(file_path)
15
15
 
16
16
  return unless filename_bad?(file_path)
17
17
 
18
18
  location = source_range(processed_source.buffer, 1, 0)
19
- add_offense(nil, location: location)
19
+ add_offense(location)
20
20
  end
21
21
 
22
22
  private
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Sequel
6
+ # PartialConstraint looks for missed usage of partial indexes.
7
+ class PartialConstraint < Base
8
+ MSG = "Constraint can't be partial, use where argument with index"
9
+ RESTRICT_ON_SEND = %i[add_unique_constraint].freeze
10
+
11
+ def_node_matcher :add_partial_constraint?, <<-MATCHER
12
+ (send _ :add_unique_constraint ... (hash (pair (sym :where) _)))
13
+ MATCHER
14
+
15
+ def on_send(node)
16
+ return unless add_partial_constraint?(node)
17
+
18
+ add_offense(node.loc.selector, message: MSG)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,9 +4,12 @@ module RuboCop
4
4
  module Cop
5
5
  module Sequel
6
6
  # SaveChanges promotes the use of save_changes.
7
- class SaveChanges < Cop
7
+ class SaveChanges < Base
8
+ extend AutoCorrector
9
+
8
10
  MSG = 'Use `Sequel::Model#save_changes` instead of '\
9
- '`Sequel::Model#save`.'
11
+ '`Sequel::Model#save`.'
12
+ RESTRICT_ON_SEND = %i[save].freeze
10
13
 
11
14
  def_node_matcher :model_save?, <<-MATCHER
12
15
  (send _ :save)
@@ -15,11 +18,11 @@ module RuboCop
15
18
  def on_send(node)
16
19
  return unless model_save?(node)
17
20
 
18
- add_offense(node, location: :selector, message: MSG)
19
- end
21
+ range = node.loc.selector
20
22
 
21
- def autocorrect(node)
22
- ->(corrector) { corrector.replace(node.loc.selector, 'save_changes') }
23
+ add_offense(range, message: MSG) do |corrector|
24
+ corrector.replace(range, 'save_changes')
25
+ end
23
26
  end
24
27
  end
25
28
  end
@@ -13,16 +13,17 @@ Gem::Specification.new do |gem|
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = 'rubocop-sequel'
15
15
  gem.require_paths = ['lib']
16
- gem.version = '0.1.0'
16
+ gem.version = '0.3.3'
17
17
 
18
- gem.required_ruby_version = '~> 2.4'
18
+ gem.required_ruby_version = '>= 2.5'
19
19
 
20
20
  gem.add_runtime_dependency 'rubocop', '~> 1.0'
21
21
 
22
- gem.add_development_dependency 'rake', '~> 12.3.0'
22
+ gem.add_development_dependency 'rake', '~> 13.0.6'
23
23
  gem.add_development_dependency 'rspec', '~> 3.7'
24
+ gem.add_development_dependency 'rubocop-rake', '~> 0.6.0'
24
25
  gem.add_development_dependency 'rubocop-rspec', '~> 2.0'
25
- gem.add_development_dependency 'sequel', '~> 4.49'
26
+ gem.add_development_dependency 'sequel', '~> 5.47'
26
27
  gem.add_development_dependency 'simplecov', '~> 0.16'
27
28
  gem.add_development_dependency 'sqlite3', '~> 1.3', '>= 1.3.12'
28
29
  end
@@ -6,12 +6,12 @@ describe RuboCop::Cop::Sequel::ColumnDefault do
6
6
  subject(:cop) { described_class.new }
7
7
 
8
8
  it 'registers an offense when setting a default' do
9
- inspect_source('add_column(:products, :type, :text, default: "cop")')
10
- expect(cop.offenses.size).to eq(1)
9
+ offenses = inspect_source('add_column(:products, :type, :text, default: "cop")')
10
+ expect(offenses.size).to eq(1)
11
11
  end
12
12
 
13
13
  it 'does not register an offense when not setting a default' do
14
- inspect_source('add_column(:products, :type, :text)')
15
- expect(cop.offenses).to be_empty
14
+ offenses = inspect_source('add_column(:products, :type, :text)')
15
+ expect(offenses).to be_empty
16
16
  end
17
17
  end
@@ -7,35 +7,35 @@ describe RuboCop::Cop::Sequel::ConcurrentIndex do
7
7
 
8
8
  context 'without the concurrent option' do
9
9
  it 'registers an offense without options' do
10
- inspect_source(<<~SOURCE)
10
+ offenses = inspect_source(<<~SOURCE)
11
11
  add_index(:products, :name)
12
12
  drop_index(:products, :name)
13
13
  SOURCE
14
- expect(cop.offenses.size).to eq(2)
14
+ expect(offenses.size).to eq(2)
15
15
  end
16
16
 
17
17
  it 'registers an offense with other options' do
18
- inspect_source(<<~SOURCE)
18
+ offenses = inspect_source(<<~SOURCE)
19
19
  add_index(:products, :name, unique: true)
20
20
  drop_index(:products, :name, unique: true)
21
21
  SOURCE
22
- expect(cop.offenses.size).to eq(2)
22
+ expect(offenses.size).to eq(2)
23
23
  end
24
24
 
25
25
  it 'registers an offense with composite index' do
26
- inspect_source(<<~SOURCE)
26
+ offenses = inspect_source(<<~SOURCE)
27
27
  add_index(:products, [:name, :price], unique: true)
28
28
  drop_index(:products, [:name, :price])
29
29
  SOURCE
30
- expect(cop.offenses.size).to eq(2)
30
+ expect(offenses.size).to eq(2)
31
31
  end
32
32
  end
33
33
 
34
34
  it 'does not register an offense when using concurrent option' do
35
- inspect_source(<<~SOURCE)
35
+ offenses = inspect_source(<<~SOURCE)
36
36
  add_index(:products, :name, unique: true, concurrently: true)
37
37
  drop_index(:products, :name, concurrently: true)
38
38
  SOURCE
39
- expect(cop.offenses).to be_empty
39
+ expect(offenses).to be_empty
40
40
  end
41
41
  end
@@ -7,45 +7,45 @@ describe RuboCop::Cop::Sequel::JSONColumn do
7
7
 
8
8
  context 'with add_column' do
9
9
  it 'registers an offense when using json type' do
10
- inspect_source('add_column(:products, :type, :json)')
11
- expect(cop.offenses.size).to eq(1)
10
+ offenses = inspect_source('add_column(:products, :type, :json)')
11
+ expect(offenses.size).to eq(1)
12
12
  end
13
13
 
14
14
  it 'registers an offense when using hstore type' do
15
- inspect_source('add_column(:products, :type, :hstore)')
16
- expect(cop.offenses.size).to eq(1)
15
+ offenses = inspect_source('add_column(:products, :type, :hstore)')
16
+ expect(offenses.size).to eq(1)
17
17
  end
18
18
 
19
19
  it 'does not register an offense when using jsonb' do
20
- inspect_source('add_column(:products, :type, :jsonb)')
21
- expect(cop.offenses).to be_empty
20
+ offenses = inspect_source('add_column(:products, :type, :jsonb)')
21
+ expect(offenses).to be_empty
22
22
  end
23
23
  end
24
24
 
25
25
  context 'with create_table' do
26
26
  it 'registers an offense when using json as a method' do
27
- inspect_source('create_table(:products) { json :type, default: {} }')
28
- expect(cop.offenses.size).to eq(1)
27
+ offenses = inspect_source('create_table(:products) { json :type, default: {} }')
28
+ expect(offenses.size).to eq(1)
29
29
  end
30
30
 
31
31
  it 'registers an offense when using the column method with hstore' do
32
- inspect_source('create_table(:products) { column :type, :hstore }')
33
- expect(cop.offenses.size).to eq(1)
32
+ offenses = inspect_source('create_table(:products) { column :type, :hstore }')
33
+ expect(offenses.size).to eq(1)
34
34
  end
35
35
 
36
36
  it 'does not register an offense when using jsonb as column type`' do
37
- inspect_source('create_table(:products) { column :type, :jsonb }')
38
- expect(cop.offenses).to be_empty
37
+ offenses = inspect_source('create_table(:products) { column :type, :jsonb }')
38
+ expect(offenses).to be_empty
39
39
  end
40
40
 
41
41
  it 'does not register an offense when using jsonb' do
42
- inspect_source('create_table(:products) { jsonb :type }')
43
- expect(cop.offenses).to be_empty
42
+ offenses = inspect_source('create_table(:products) { jsonb :type }')
43
+ expect(offenses).to be_empty
44
44
  end
45
45
 
46
46
  it 'does not register an offense when using a simple type' do
47
- inspect_source('create_table(:products) { integer :type, default: 0 }')
48
- expect(cop.offenses).to be_empty
47
+ offenses = inspect_source('create_table(:products) { integer :type, default: 0 }')
48
+ expect(offenses).to be_empty
49
49
  end
50
50
  end
51
51
  end
@@ -17,13 +17,13 @@ describe RuboCop::Cop::Sequel::MigrationName, :config do
17
17
  let(:cop_config) { {} }
18
18
 
19
19
  it 'registers an offense when using the default name' do
20
- inspect_source('', 'new_migration.rb')
21
- expect(cop.offenses.size).to eq(1)
20
+ offenses = inspect_source('', 'new_migration.rb')
21
+ expect(offenses.size).to eq(1)
22
22
  end
23
23
 
24
24
  it 'does not register an offense when using a specific name' do
25
- inspect_source('', 'add_index.rb')
26
- expect(cop.offenses).to be_empty
25
+ offenses = inspect_source('', 'add_index.rb')
26
+ expect(offenses).to be_empty
27
27
  end
28
28
  end
29
29
 
@@ -31,13 +31,13 @@ describe RuboCop::Cop::Sequel::MigrationName, :config do
31
31
  let(:cop_config) { { 'DefaultName' => 'add_migration' } }
32
32
 
33
33
  it 'registers an offense when using the default name' do
34
- inspect_source('', 'add_migration.rb')
35
- expect(cop.offenses.size).to eq(1)
34
+ offenses = inspect_source('', 'add_migration.rb')
35
+ expect(offenses.size).to eq(1)
36
36
  end
37
37
 
38
38
  it 'does not register an offense when using a specific name' do
39
- inspect_source('', 'add_index.rb')
40
- expect(cop.offenses).to be_empty
39
+ offenses = inspect_source('', 'add_index.rb')
40
+ expect(offenses).to be_empty
41
41
  end
42
42
  end
43
43
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RuboCop::Cop::Sequel::PartialConstraint do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offense when using where for constraint' do
9
+ offenses = inspect_source(<<~RUBY)
10
+ add_unique_constraint %i[col_1 col_2], where: "state != 'deleted'"
11
+ RUBY
12
+
13
+ expect(offenses.size).to eq(1)
14
+ end
15
+ end
@@ -6,13 +6,13 @@ describe RuboCop::Cop::Sequel::SaveChanges do
6
6
  subject(:cop) { described_class.new }
7
7
 
8
8
  it 'registers an offense when using save' do
9
- inspect_source('favorite.save')
10
- expect(cop.offenses.size).to eq(1)
9
+ offenses = inspect_source('favorite.save')
10
+ expect(offenses.size).to eq(1)
11
11
  end
12
12
 
13
13
  it 'does not register an offense when using save_changes' do
14
- inspect_source('favorite.save_changes')
15
- expect(cop.offenses).to be_empty
14
+ offenses = inspect_source('favorite.save_changes')
15
+ expect(offenses).to be_empty
16
16
  end
17
17
 
18
18
  it 'auto-corrects by using save_changes' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timothée Peignier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-23 00:00:00.000000000 Z
11
+ date: 2021-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 12.3.0
33
+ version: 13.0.6
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 12.3.0
40
+ version: 13.0.6
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.6.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop-rspec
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +86,14 @@ dependencies:
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '4.49'
89
+ version: '5.47'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '4.49'
96
+ version: '5.47'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: simplecov
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -121,6 +135,7 @@ executables: []
121
135
  extensions: []
122
136
  extra_rdoc_files: []
123
137
  files:
138
+ - ".github/dependabot.yml"
124
139
  - ".github/workflows/actions.yml"
125
140
  - ".gitignore"
126
141
  - ".rspec"
@@ -133,6 +148,7 @@ files:
133
148
  - lib/rubocop/cop/sequel/concurrent_index.rb
134
149
  - lib/rubocop/cop/sequel/json_column.rb
135
150
  - lib/rubocop/cop/sequel/migration_name.rb
151
+ - lib/rubocop/cop/sequel/partial_constraint.rb
136
152
  - lib/rubocop/cop/sequel/save_changes.rb
137
153
  - lib/rubocop/sequel.rb
138
154
  - rubocop-sequel.gemspec
@@ -140,6 +156,7 @@ files:
140
156
  - spec/rubocop/cop/sequel/concurrent_index_spec.rb
141
157
  - spec/rubocop/cop/sequel/json_column_spec.rb
142
158
  - spec/rubocop/cop/sequel/migration_name_spec.rb
159
+ - spec/rubocop/cop/sequel/partial_constraint_spec.rb
143
160
  - spec/rubocop/cop/sequel/save_changes_spec.rb
144
161
  - spec/spec_helper.rb
145
162
  homepage: https://github.com/rubocop-hq/rubocop-sequel
@@ -152,17 +169,16 @@ require_paths:
152
169
  - lib
153
170
  required_ruby_version: !ruby/object:Gem::Requirement
154
171
  requirements:
155
- - - "~>"
172
+ - - ">="
156
173
  - !ruby/object:Gem::Version
157
- version: '2.4'
174
+ version: '2.5'
158
175
  required_rubygems_version: !ruby/object:Gem::Requirement
159
176
  requirements:
160
177
  - - ">="
161
178
  - !ruby/object:Gem::Version
162
179
  version: '0'
163
180
  requirements: []
164
- rubyforge_project:
165
- rubygems_version: 2.6.11
181
+ rubygems_version: 3.2.3
166
182
  signing_key:
167
183
  specification_version: 4
168
184
  summary: A Sequel plugin for RuboCop
@@ -171,5 +187,6 @@ test_files:
171
187
  - spec/rubocop/cop/sequel/concurrent_index_spec.rb
172
188
  - spec/rubocop/cop/sequel/json_column_spec.rb
173
189
  - spec/rubocop/cop/sequel/migration_name_spec.rb
190
+ - spec/rubocop/cop/sequel/partial_constraint_spec.rb
174
191
  - spec/rubocop/cop/sequel/save_changes_spec.rb
175
192
  - spec/spec_helper.rb