auto_increment 1.3.0 → 1.5.2
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 +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