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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: de47f750eacb36eb55191fedfa48c4171fbb76c9
4
- data.tar.gz: 19e51a34cb362de1f4e7943f53c46725cc0e4965
2
+ SHA256:
3
+ metadata.gz: f19f9f54c7b8a7641d6adb7527d9f9054ad131d015af8aec346cac61711129f7
4
+ data.tar.gz: 6ac27b9292e3003db26a709ac7b4c78f18b1e5d7c0c35c0f9f1e47a7f7132763
5
5
  SHA512:
6
- metadata.gz: 4ee67e7884c39f127c8df23b6bbd25b25ceee9b6de60a81c328f79d1ed191a61efdd07980afd0a8e4476c7333ee22e89e7d31007a65fc8a0ccfac042fee68b9e
7
- data.tar.gz: ba0e2b25e96905833c11b9d4be7f00de95e2bbeda2fe15693adf3c5ab78c3260d5309628f8655a4f006877e8a6e34098cf6e2d0c0ad8e4ef59aae4e6c405aa03
6
+ metadata.gz: 85ac0c4b0cd645f05703685bfcf3d64158a409db01d37eda4bf85c0e65c57029a2d656a1830fce754b150a901533ee5f4f60e152fce632926805c8f88ccd0e3b
7
+ data.tar.gz: bab85c29b564da957bb9088000bf4da689e937ba86caacbc4290d910480d4bf620e44ba68c0f1f9acc6eccaca57a5513474bbf553ba402d70d0709f8a9a76c37
@@ -2,10 +2,13 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.3.1
6
- - 2.2.5
5
+ - 2.6.6
6
+ before_install:
7
+ - gem update --system
7
8
  gemfile:
8
- - gemfiles/rails_5.gemfile
9
- - gemfiles/rails_4.gemfile
10
-
11
- script: 'bundle exec rake'
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
- appraise 'rails-4' do
2
- gem 'activerecord', '~> 4.0'
3
- gem 'activesupport', '~> 4.0'
4
- end
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
- appraise 'rails-5' do
7
- gem 'activerecord', '~> 5.0'
8
- gem 'activesupport', '~> 5.0'
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
@@ -1,8 +1,3 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in auto_increment.gemspec
4
3
  gemspec
5
-
6
- group :development do
7
- gem 'appraisal'
8
- end
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 in Rails 4 and Rails 5.
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
- gem "auto_increment"
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
- before_create :set_code
23
- def set_code
24
- max_code = Operation.maximum(:code)
25
- self.code = max_code.to_i + 1
26
- end
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
- auto_increment :code
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
- auto_increment :letter, scope: [:account_id, :job_id], initial: 'C', force: true, lock: false
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 and Rails 5 in Ruby 2.2.5 and Ruby 2.3.1
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. Copyright 2011 29sul Tecnologia da Informação <http://www.29sul.com.br/>
65
+ [MIT License](LICENSE.txt)
@@ -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 = ['felipediesel@gmail.com']
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', '< 5.1'
22
- s.add_dependency 'activesupport', '>= 4.0', '< 5.1'
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
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "4.2.11.1"
6
+ gem "activesupport", "4.2.11.1"
7
+ gem "sqlite3", "1.3.13"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "5.0.7.2"
6
+ gem "activesupport", "5.0.7.2"
7
+ gem "sqlite3", "1.3.13"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "5.1.6.2"
6
+ gem "activesupport", "5.1.6.2"
7
+ gem "sqlite3", "1.3.13"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "5.2.2.1"
6
+ gem "activesupport", "5.2.2.1"
7
+ gem "sqlite3", "1.3.13"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.0.3.4"
6
+ gem "activesupport", "6.0.3.4"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.1.0"
6
+ gem "activesupport", "6.1.0"
7
+
8
+ gemspec path: "../"
@@ -6,7 +6,11 @@ module AutoIncrement
6
6
  # +AutoIncrement::ActiveRecord::ClassMethods+
7
7
  module ClassMethods
8
8
  def auto_increment(column = nil, options = {})
9
- before_create Incrementor.new(column, options)
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 scope: nil, initial: 1, force: false
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 @record.class
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
- .order("LENGTH(#{@column}) DESC, #{@column} DESC")
48
- .first.try :max
59
+ .order(Arel.sql("LENGTH(#{@column}) DESC, #{@column} DESC"))
60
+ .first.try :max
49
61
  else
50
62
  query.maximum @column
51
63
  end
@@ -1,4 +1,4 @@
1
1
  # +AutoIncrement::VERSION+
2
2
  module AutoIncrement
3
- VERSION = '1.3.0'
3
+ VERSION = '1.5.2'.freeze
4
4
  end
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
- @user_account1 = @account1.users.create name: 'Felipe', letter_code: 'Z'
11
- @user_account2 = @account2.users.create name: 'Daniel'
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(@user_account1.letter_code).to eq 'A' }
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(@user_account2.letter_code).to eq 'A' }
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(@user_account1.letter_code).to eq 'A' }
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
@@ -1,6 +1,6 @@
1
1
  # Spec +Account+
2
2
  class Account < ActiveRecord::Base
3
- auto_increment :code
3
+ auto_increment :code, before: :validation
4
4
 
5
5
  has_many :users
6
6
  end
@@ -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
- lock: true
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.3.0
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: 2016-07-19 00:00:00.000000000 Z
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: sqlite3
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
- - felipediesel@gmail.com
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/rails_4.gemfile
212
- - gemfiles/rails_5.gemfile
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
- rubyforge_project:
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
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "http://rubygems.org"
4
-
5
- gem "activerecord", "~> 4.0"
6
- gem "activesupport", "~> 4.0"
7
-
8
- group :development do
9
- gem "appraisal"
10
- end
11
-
12
- gemspec :path => "../"
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "http://rubygems.org"
4
-
5
- gem "activerecord", "~> 5.0"
6
- gem "activesupport", "~> 5.0"
7
-
8
- group :development do
9
- gem "appraisal"
10
- end
11
-
12
- gemspec :path => "../"