auto_increment 1.3.0 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +9 -6
- data/Appraisals +16 -7
- data/Gemfile +1 -6
- data/README.md +21 -13
- data/auto_increment.gemspec +5 -4
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/rails_4.2.11.1.gemfile +9 -0
- data/gemfiles/rails_5.0.7.2.gemfile +9 -0
- data/gemfiles/rails_5.1.6.2.gemfile +9 -0
- data/gemfiles/rails_5.2.2.1.gemfile +9 -0
- data/gemfiles/rails_6.0.3.4.gemfile +8 -0
- data/gemfiles/rails_6.1.0.gemfile +8 -0
- data/lib/auto_increment/active_record.rb +5 -1
- data/lib/auto_increment/incrementor.rb +16 -4
- data/lib/auto_increment/version.rb +1 -1
- data/spec/db/sync.db +0 -0
- data/spec/lib/active_record_spec.rb +18 -5
- data/spec/models/account.rb +1 -1
- data/spec/models/user.rb +5 -1
- metadata +26 -20
- data/gemfiles/rails_4.gemfile +0 -12
- data/gemfiles/rails_5.gemfile +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f19f9f54c7b8a7641d6adb7527d9f9054ad131d015af8aec346cac61711129f7
|
4
|
+
data.tar.gz: 6ac27b9292e3003db26a709ac7b4c78f18b1e5d7c0c35c0f9f1e47a7f7132763
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85ac0c4b0cd645f05703685bfcf3d64158a409db01d37eda4bf85c0e65c57029a2d656a1830fce754b150a901533ee5f4f60e152fce632926805c8f88ccd0e3b
|
7
|
+
data.tar.gz: bab85c29b564da957bb9088000bf4da689e937ba86caacbc4290d910480d4bf620e44ba68c0f1f9acc6eccaca57a5513474bbf553ba402d70d0709f8a9a76c37
|
data/.travis.yml
CHANGED
@@ -2,10 +2,13 @@ language: ruby
|
|
2
2
|
sudo: false
|
3
3
|
cache: bundler
|
4
4
|
rvm:
|
5
|
-
- 2.
|
6
|
-
|
5
|
+
- 2.6.6
|
6
|
+
before_install:
|
7
|
+
- gem update --system
|
7
8
|
gemfile:
|
8
|
-
- gemfiles/
|
9
|
-
- gemfiles/
|
10
|
-
|
11
|
-
|
9
|
+
- gemfiles/rails_4.2.11.1.gemfile
|
10
|
+
- gemfiles/rails_5.0.7.2.gemfile
|
11
|
+
- gemfiles/rails_5.1.6.2.gemfile
|
12
|
+
- gemfiles/rails_5.2.2.1.gemfile
|
13
|
+
- gemfiles/rails_6.0.3.4.gemfile
|
14
|
+
- gemfiles/rails_6.1.0.gemfile
|
data/Appraisals
CHANGED
@@ -1,9 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
RAILS_VERSIONS = %w(
|
2
|
+
4.2.11.1
|
3
|
+
5.0.7.2
|
4
|
+
5.1.6.2
|
5
|
+
5.2.2.1
|
6
|
+
6.0.3.4
|
7
|
+
6.1.0
|
8
|
+
)
|
5
9
|
|
6
|
-
|
7
|
-
|
8
|
-
|
10
|
+
RAILS_VERSIONS.each do |version|
|
11
|
+
appraise "rails_#{version}" do
|
12
|
+
gem 'activerecord', version
|
13
|
+
gem 'activesupport', version
|
14
|
+
if version.split('.').first.to_i < 6
|
15
|
+
gem 'sqlite3', '1.3.13'
|
16
|
+
end
|
17
|
+
end
|
9
18
|
end
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -8,50 +8,58 @@ auto_increment provides automatic incrementation for a integer or string fields
|
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
|
-
You can use auto_increment as a gem
|
11
|
+
You can use auto_increment as a gem from Rails 4.2 to Rails 6.1.
|
12
12
|
|
13
13
|
To use the gem version, put the following gem requirement in your `Gemfile`:
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
```rb
|
16
|
+
gem "auto_increment"
|
17
|
+
```
|
17
18
|
|
18
19
|
## Usage
|
19
20
|
|
20
21
|
To work with a auto increment column you used to do something like this in your model:
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
```rb
|
24
|
+
before_create :set_code
|
25
|
+
def set_code
|
26
|
+
max_code = Operation.maximum(:code)
|
27
|
+
self.code = max_code.to_i + 1
|
28
|
+
end
|
29
|
+
```
|
27
30
|
|
28
31
|
Looks fine, but not when you need to do it over and over again. In fact auto_increment does it under the cover.
|
29
32
|
|
30
33
|
All you need to do is this:
|
31
34
|
|
32
|
-
|
35
|
+
```rb
|
36
|
+
auto_increment :code
|
37
|
+
```
|
33
38
|
|
34
39
|
And your code field will be incremented
|
35
40
|
|
36
|
-
|
37
41
|
## Customizing
|
38
42
|
|
39
43
|
So you have a different column or need a scope. auto_increment provides options. You can use it like this:
|
40
44
|
|
41
|
-
|
45
|
+
```rb
|
46
|
+
auto_increment :letter, scope: [:account_id, :job_id], model_scope: :in_account, initial: 'C', force: true, lock: false, before: :create
|
47
|
+
```
|
42
48
|
|
43
49
|
First argument is the column that will be incremented. Can be integer or string.
|
44
50
|
|
45
51
|
* scope: you can define columns that will be scoped and you can use as many as you want (default: nil)
|
52
|
+
* model_scope: you can define model scopes that will be executed and you can use as many as you want (default: nil)
|
46
53
|
* initial: initial value of column (default: 1)
|
47
54
|
* force: you can set a value before create and auto_increment will not change that, but if you do want this, set force to true (default: false)
|
48
55
|
* lock: you can set a lock on the max query. (default: false)
|
56
|
+
* before: you can choose a different callback to be used (:create, :save, :validation) (default: create)
|
49
57
|
|
50
58
|
|
51
59
|
## Compatibility
|
52
60
|
|
53
|
-
Tested with Rails 4
|
61
|
+
Tested with Rails 6.1.0, 6.0.3.4, 5.2.2.1, 5.1.6.2, 5.0.7.2 and 4.2.11.1 in Ruby 2.6.6.
|
54
62
|
|
55
63
|
## License
|
56
64
|
|
57
|
-
MIT License.
|
65
|
+
[MIT License](LICENSE.txt)
|
data/auto_increment.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.licenses = 'MIT'
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.authors = ['Felipe Diesel']
|
11
|
-
s.email = ['
|
11
|
+
s.email = ['diesel@hey.com']
|
12
12
|
s.homepage = 'http://github.com/felipediesel/auto_increment'
|
13
13
|
s.summary = 'Auto increment a string or integer field'
|
14
14
|
s.description = 'Automaticaly increments a string or integer field ' \
|
@@ -18,8 +18,8 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.require_paths = ['lib']
|
20
20
|
|
21
|
-
s.add_dependency 'activerecord', '>= 4.0'
|
22
|
-
s.add_dependency 'activesupport', '>= 4.0'
|
21
|
+
s.add_dependency 'activerecord', '>= 4.0'
|
22
|
+
s.add_dependency 'activesupport', '>= 4.0'
|
23
23
|
|
24
24
|
s.add_development_dependency 'bundler'
|
25
25
|
s.add_development_dependency 'rake'
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_development_dependency 'fuubar'
|
32
32
|
s.add_development_dependency 'coveralls'
|
33
33
|
s.add_development_dependency 'database_cleaner'
|
34
|
+
s.add_development_dependency 'appraisal'
|
34
35
|
|
35
|
-
s.add_development_dependency 'sqlite3'
|
36
|
+
s.add_development_dependency 'sqlite3', '>= 1.3.13'
|
36
37
|
end
|
@@ -6,7 +6,11 @@ module AutoIncrement
|
|
6
6
|
# +AutoIncrement::ActiveRecord::ClassMethods+
|
7
7
|
module ClassMethods
|
8
8
|
def auto_increment(column = nil, options = {})
|
9
|
-
|
9
|
+
options.reverse_merge! before: :create
|
10
|
+
|
11
|
+
callback = "before_#{options[:before]}"
|
12
|
+
|
13
|
+
send callback, Incrementor.new(column, options)
|
10
14
|
end
|
11
15
|
end
|
12
16
|
end
|
@@ -9,8 +9,9 @@ module AutoIncrement
|
|
9
9
|
end
|
10
10
|
|
11
11
|
@column = column || options[:column] || :code
|
12
|
-
@options = options.reverse_merge
|
12
|
+
@options = options.reverse_merge initial: 1, force: false
|
13
13
|
@options[:scope] = [@options[:scope]] unless @options[:scope].is_a? Array
|
14
|
+
@options[:model_scope] = [@options[:model_scope]] unless @options[:model_scope].is_a? Array
|
14
15
|
end
|
15
16
|
|
16
17
|
def before_create(record)
|
@@ -18,6 +19,9 @@ module AutoIncrement
|
|
18
19
|
write if can_write?
|
19
20
|
end
|
20
21
|
|
22
|
+
alias before_validation before_create
|
23
|
+
alias before_save before_create
|
24
|
+
|
21
25
|
private
|
22
26
|
|
23
27
|
def can_write?
|
@@ -38,14 +42,22 @@ module AutoIncrement
|
|
38
42
|
query
|
39
43
|
end
|
40
44
|
|
45
|
+
def build_model_scope(query)
|
46
|
+
@options[:model_scope].reject(&:nil?).each do |scope|
|
47
|
+
query = query.send(scope)
|
48
|
+
end
|
49
|
+
|
50
|
+
query
|
51
|
+
end
|
52
|
+
|
41
53
|
def maximum
|
42
|
-
query = build_scopes
|
54
|
+
query = build_scopes(build_model_scope(@record.class))
|
43
55
|
query.lock if lock?
|
44
56
|
|
45
57
|
if string?
|
46
58
|
query.select("#{@column} max")
|
47
|
-
|
48
|
-
|
59
|
+
.order(Arel.sql("LENGTH(#{@column}) DESC, #{@column} DESC"))
|
60
|
+
.first.try :max
|
49
61
|
else
|
50
62
|
query.maximum @column
|
51
63
|
end
|
data/spec/db/sync.db
CHANGED
Binary file
|
@@ -7,17 +7,19 @@ describe AutoIncrement do
|
|
7
7
|
@account1 = Account.create name: 'My Account'
|
8
8
|
@account2 = Account.create name: 'Another Account', code: 50
|
9
9
|
|
10
|
-
@
|
11
|
-
@
|
10
|
+
@user1_account1 = @account1.users.create name: 'Felipe', letter_code: 'Z'
|
11
|
+
@user1_account2 = @account2.users.create name: 'Daniel'
|
12
|
+
@user2_account2 = @account2.users.create name: 'Mark'
|
13
|
+
@user3_account2 = @account2.users.create name: 'Robert'
|
12
14
|
end
|
13
15
|
|
14
16
|
describe 'initial' do
|
15
17
|
it { expect(@account1.code).to eq 1 }
|
16
|
-
it { expect(@
|
18
|
+
it { expect(@user1_account1.letter_code).to eq 'A' }
|
17
19
|
end
|
18
20
|
|
19
21
|
describe 'do not increment outside scope' do
|
20
|
-
it { expect(@
|
22
|
+
it { expect(@user1_account2.letter_code).to eq 'A' }
|
21
23
|
end
|
22
24
|
|
23
25
|
describe 'not set column if is already set' do
|
@@ -25,7 +27,7 @@ describe AutoIncrement do
|
|
25
27
|
end
|
26
28
|
|
27
29
|
describe 'set column if option force is used' do
|
28
|
-
it { expect(@
|
30
|
+
it { expect(@user1_account1.letter_code).to eq 'A' }
|
29
31
|
end
|
30
32
|
|
31
33
|
describe 'locks query for increment' do
|
@@ -53,4 +55,15 @@ describe AutoIncrement do
|
|
53
55
|
it { expect(@accounts.size).to eq 25 }
|
54
56
|
it { expect(account_last_letter_code).to eq 'Y' }
|
55
57
|
end
|
58
|
+
|
59
|
+
describe 'set before validation' do
|
60
|
+
account3 = Account.new
|
61
|
+
account3.valid?
|
62
|
+
|
63
|
+
it { expect(account3.code).not_to be_nil }
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'uses model scopes' do
|
67
|
+
it { expect(@user3_account2.letter_code).to eq('C') }
|
68
|
+
end
|
56
69
|
end
|
data/spec/models/account.rb
CHANGED
data/spec/models/user.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
# + Spec +User+
|
2
2
|
class User < ActiveRecord::Base
|
3
3
|
auto_increment :letter_code, scope: :account_id, initial: 'A', force: true,
|
4
|
-
|
4
|
+
lock: true, model_scope: :with_mark
|
5
5
|
|
6
6
|
belongs_to :account
|
7
|
+
|
8
|
+
default_scope -> { where 'name <> ?', 'Mark' }
|
9
|
+
|
10
|
+
scope :with_mark, -> { unscoped }
|
7
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auto_increment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felipe Diesel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -17,9 +17,6 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.0'
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '5.1'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,9 +24,6 @@ dependencies:
|
|
27
24
|
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '4.0'
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '5.1'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: activesupport
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,9 +31,6 @@ dependencies:
|
|
37
31
|
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
33
|
version: '4.0'
|
40
|
-
- - "<"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '5.1'
|
43
34
|
type: :runtime
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -47,9 +38,6 @@ dependencies:
|
|
47
38
|
- - ">="
|
48
39
|
- !ruby/object:Gem::Version
|
49
40
|
version: '4.0'
|
50
|
-
- - "<"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '5.1'
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
42
|
name: bundler
|
55
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,7 +165,7 @@ dependencies:
|
|
177
165
|
- !ruby/object:Gem::Version
|
178
166
|
version: '0'
|
179
167
|
- !ruby/object:Gem::Dependency
|
180
|
-
name:
|
168
|
+
name: appraisal
|
181
169
|
requirement: !ruby/object:Gem::Requirement
|
182
170
|
requirements:
|
183
171
|
- - ">="
|
@@ -190,9 +178,23 @@ dependencies:
|
|
190
178
|
- - ">="
|
191
179
|
- !ruby/object:Gem::Version
|
192
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sqlite3
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 1.3.13
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 1.3.13
|
193
195
|
description: Automaticaly increments a string or integer field in ActiveRecord.
|
194
196
|
email:
|
195
|
-
-
|
197
|
+
- diesel@hey.com
|
196
198
|
executables: []
|
197
199
|
extensions: []
|
198
200
|
extra_rdoc_files: []
|
@@ -208,8 +210,13 @@ files:
|
|
208
210
|
- README.md
|
209
211
|
- Rakefile
|
210
212
|
- auto_increment.gemspec
|
211
|
-
- gemfiles/
|
212
|
-
- gemfiles/
|
213
|
+
- gemfiles/.bundle/config
|
214
|
+
- gemfiles/rails_4.2.11.1.gemfile
|
215
|
+
- gemfiles/rails_5.0.7.2.gemfile
|
216
|
+
- gemfiles/rails_5.1.6.2.gemfile
|
217
|
+
- gemfiles/rails_5.2.2.1.gemfile
|
218
|
+
- gemfiles/rails_6.0.3.4.gemfile
|
219
|
+
- gemfiles/rails_6.1.0.gemfile
|
213
220
|
- lib/auto_increment.rb
|
214
221
|
- lib/auto_increment/active_record.rb
|
215
222
|
- lib/auto_increment/incrementor.rb
|
@@ -241,8 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
241
248
|
- !ruby/object:Gem::Version
|
242
249
|
version: '0'
|
243
250
|
requirements: []
|
244
|
-
|
245
|
-
rubygems_version: 2.5.1
|
251
|
+
rubygems_version: 3.1.4
|
246
252
|
signing_key:
|
247
253
|
specification_version: 4
|
248
254
|
summary: Auto increment a string or integer field
|
data/gemfiles/rails_4.gemfile
DELETED