auto_increment 1.0.0 → 1.1.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
  SHA1:
3
- metadata.gz: 2d10c327e17646c875c89c2eb2c225e59085de41
4
- data.tar.gz: 3c0c3584f65e534a755fe89e152d926135ba60a7
3
+ metadata.gz: 0439d87a127d0cb45c1592caac145430c05dbc59
4
+ data.tar.gz: 50e0088319d2961b17516b52f7754af6c2f4a427
5
5
  SHA512:
6
- metadata.gz: 9a2973f0afd4736371b1b9b844cfb9e9b22318ef4f229d9a9a62dedb032d5dfd9c8cd2fd9489c64fb67cbc83da73bfcc091adcf943bcaca6628f27fd1cf0a09e
7
- data.tar.gz: ee1005cd6e16fdd8b30ff6a302f05ad3ccf4e7a62ecac69d2fb33f013af7122efec2215edc2d84cd2596baa7f29e813930f7b291c604928711432ea4c06d199e
6
+ metadata.gz: 01a2efcda6def8029290507fb47a4c32f3955e8240b7d43c81b17e6f44ab41b848aac306dffa37c0059cd4c547e98bd38a39dff97ed68917fa1e93ec282df384
7
+ data.tar.gz: d80e3f47ec2fafe1b0f337dba037d4269d2074d9d7a0e26884bf4370c0472c1a0791e89be0f6866a367053d1bde4e4799d56b1c6e9b60a93c5d36230f42a1128
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore CHANGED
@@ -1,6 +1,35 @@
1
1
  *.gem
2
- .bundle
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /vendor/bundle
26
+ /lib/bundler/man/
27
+
28
+ # for a library or gem, you might want to ignore these files since the code is
29
+ # intended to run in multiple environments; otherwise, check them in:
3
30
  Gemfile.lock
4
- pkg/*
31
+ .ruby-version
32
+ .ruby-gemset
5
33
 
6
- test/app/log/*
34
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --drb
2
+ --format Fuubar
3
+ --color
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ rvm:
5
+ - 2.0.0
6
+
7
+ script: 'bundle exec rake'
8
+
9
+ notifications:
10
+ email:
11
+ recipients:
12
+ - felipe@29sul.com.br
13
+ - elton@29sul.com.br
14
+ on_failure: change # [always|never|change]
15
+ on_success: change # [always|never|change]
@@ -0,0 +1,5 @@
1
+ guard :rspec, cmd: 'bundle exec rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
@@ -1,20 +1,21 @@
1
- auto_increment
2
- ==============
1
+ # auto_increment
3
2
 
4
- auto_increment provides automatic incrementation for a string or integer fields in Rails.
3
+ [![Build Status](https://travis-ci.org/felipediesel/auto_increment.svg?branch=master)](https://travis-ci.org/felipediesel/auto_increment)
4
+ [![Coverage Status](https://coveralls.io/repos/felipediesel/auto_increment/badge.svg?branch=master)](https://coveralls.io/r/felipediesel/auto_increment?branch=master)
5
+ [![Code Climate](https://codeclimate.com/github/felipediesel/auto_increment/badges/gpa.svg)](https://codeclimate.com/github/felipediesel/auto_increment)
5
6
 
6
- Installation
7
- ------------
7
+ auto_increment provides automatic incrementation for a integer or string fields in Rails.
8
8
 
9
- You can use auto_increment as a gem in Rails 3.
9
+ ## Installation
10
+
11
+ You can use auto_increment as a gem in Rails 4.
10
12
 
11
13
  To use the gem version, put the following gem requirement in your `Gemfile`:
12
14
 
13
15
  gem "auto_increment"
14
16
 
15
17
 
16
- Usage
17
- -----
18
+ ## Usage
18
19
 
19
20
  To work with a auto increment column you used to do sometihng like this in your model:
20
21
 
@@ -33,11 +34,11 @@ All you need to do is this:
33
34
  And your code field will be incremented
34
35
 
35
36
 
36
- ### Customizing
37
+ ## Customizing
37
38
 
38
39
  So you have a different column or need a scope. auto_increment provides options. You can use it like this:
39
40
 
40
- auto_increment :column => :letter, :scope => [:account_id, :job_id], :initial => 'C', :force => true
41
+ auto_increment column: :letter, scope: [:account_id, :job_id], initial: 'C', force: true
41
42
 
42
43
  * column: the column that will be incremented. Can be integer os string (default: code)
43
44
  * scope: you can define columns that will be scoped and you can use as many as you want (default: nil)
@@ -45,9 +46,10 @@ So you have a different column or need a scope. auto_increment provides options.
45
46
  * 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)
46
47
 
47
48
 
48
- ### Compatibility
49
+ ## Compatibility
50
+
51
+ Tested with Rails 4.0.13 in Ruby 2.0.0
49
52
 
50
- * Tested with Rails 3.0.4 in Ruby 1.8.7 and Ruby 1.9.2
53
+ ## License
51
54
 
52
- ### License
53
55
  MIT License. Copyright 2011 29sul Tecnologia da Informação <http://www.29sul.com.br/>
data/Rakefile CHANGED
@@ -1,15 +1,6 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
3
 
4
+ RSpec::Core::RakeTask.new(:spec)
4
5
 
5
- require 'rake'
6
- require 'rake/testtask'
7
- require 'rake/rdoctask'
8
-
9
- desc 'Run Devise unit tests.'
10
- Rake::TestTask.new(:test) do |t|
11
- t.libs << 'lib'
12
- t.libs << 'test'
13
- t.pattern = 'test/**/*_test.rb'
14
- t.verbose = true
15
- end
6
+ task default: :spec
@@ -2,20 +2,36 @@
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
3
  require "auto_increment/version"
4
4
 
5
- Gem::Specification.new do |s|
6
- s.name = "auto_increment"
7
- s.version = AutoIncrement::VERSION
8
- s.platform = Gem::Platform::RUBY
9
- s.authors = ["Felipe Diesel"]
10
- s.email = ["felipediesel@gmail.com"]
11
- s.homepage = "http://github.com/felipediesel/auto_increment"
12
- s.summary = %q{Auto increment a string or integer field}
13
- s.description = %q{Automaticaly increments a string or integer field in ActiveRecord.}
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "auto_increment"
7
+ spec.version = AutoIncrement::VERSION
8
+ spec.licenses = %w(MIT)
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ["Felipe Diesel"]
11
+ spec.email = ["felipediesel@gmail.com"]
12
+ spec.homepage = "http://github.com/felipediesel/auto_increment"
13
+ spec.summary = %q{Auto increment a string or integer field}
14
+ spec.description = %q{Automaticaly increments a string or integer field in ActiveRecord.}
14
15
 
15
- s.rubyforge_project = "auto_increment"
16
+ spec.rubyforge_project = "auto_increment"
16
17
 
17
- s.files = `git ls-files`.split("\n")
18
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.require_paths = ["lib"]
18
+ spec.files = `git ls-files`.split("\n")
19
+ spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_dependency "activerecord", "~> 4.0"
24
+ spec.add_dependency "activesupport", "~> 4.0"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.3"
27
+ spec.add_development_dependency "rake"
28
+
29
+ spec.add_development_dependency "rspec"
30
+ spec.add_development_dependency "rspec-nc"
31
+ spec.add_development_dependency "guard"
32
+ spec.add_development_dependency "guard-rspec"
33
+ spec.add_development_dependency "fuubar"
34
+ spec.add_development_dependency "coveralls"
35
+
36
+ spec.add_development_dependency 'sqlite3'
21
37
  end
@@ -1 +1,13 @@
1
- require 'auto_increment/active_record'
1
+ require "date"
2
+ require "i18n"
3
+ require "active_record"
4
+ require "active_support"
5
+ require "active_support/time_with_zone"
6
+ require "auto_increment/version"
7
+
8
+ module AutoIncrement
9
+ autoload :Incrementor, "auto_increment/incrementor"
10
+ autoload :ActiveRecord , "auto_increment/active_record"
11
+ end
12
+
13
+ ActiveRecord::Base.send :include, AutoIncrement::ActiveRecord
@@ -1,38 +1,11 @@
1
- require 'active_record'
2
-
3
1
  module AutoIncrement
4
- def auto_increment(options = {})
5
- raise ArgumentError, "Hash expected, got #{options.class.name}" if not options.is_a?(Hash) and not options.empty?
6
-
7
- options.reverse_merge! column: :code, scope: nil, initial: 1, force: false
8
-
9
- options[:scope] = [ options[:scope] ] unless options[:scope].is_a? Array
10
-
11
- method_name = "auto_increment_#{options[:column]}"
12
-
13
- before_create method_name
14
-
15
- define_method method_name do
16
- return if send(options[:column]).present? and !options[:force]
2
+ module ActiveRecord
3
+ extend ActiveSupport::Concern
17
4
 
18
- query = self.class.all
19
-
20
- options[:scope].each do |scope|
21
- if scope.present? and respond_to?(scope)
22
- query = query.where(scope => send(scope))
23
- end
24
- end
25
-
26
- if options[:initial].class == String
27
- max = query.select("#{options[:column]} max").order("LENGTH(#{options[:column]}) DESC, #{options[:column]} DESC").first
28
- max = max.max if max.present?
29
- else
30
- max = query.maximum options[:column]
5
+ module ClassMethods
6
+ def auto_increment(options = {})
7
+ before_create Incrementor.new(options)
31
8
  end
32
-
33
- max = max.blank? ? options[:initial] : max.next
34
-
35
- write_attribute options[:column], max
36
9
  end
37
10
  end
38
11
  end
@@ -0,0 +1,49 @@
1
+ module AutoIncrement
2
+ class Incrementor
3
+ def initialize(options = {})
4
+ @options = options.reverse_merge column: :code, scope: nil, initial: 1, force: false
5
+ @options[:scope] = [ @options[:scope] ] unless @options[:scope].is_a? Array
6
+ end
7
+
8
+ def before_create(record)
9
+ @record = record
10
+ write if can_write?
11
+ end
12
+
13
+ private
14
+
15
+ def can_write?
16
+ @record.send(@options[:column]).blank? or @options[:force]
17
+ end
18
+
19
+ def write
20
+ @record.send :write_attribute, @options[:column], increment
21
+ end
22
+
23
+ def build_scopes(query)
24
+ @options[:scope].each do |scope|
25
+ if scope.present? and @record.respond_to?(scope)
26
+ query = query.where(scope => @record.send(scope))
27
+ end
28
+ end
29
+
30
+ query
31
+ end
32
+
33
+ def maximum
34
+ query = build_scopes @record.class
35
+
36
+ if @options[:initial].class == String
37
+ query.select("#{@options[:column]} max").order("LENGTH(#{@options[:column]}) DESC, #{@options[:column]} DESC").first.try :max
38
+ else
39
+ query.maximum @options[:column]
40
+ end
41
+ end
42
+
43
+ def increment
44
+ max = maximum
45
+
46
+ max.blank? ? @options[:initial] : max.next
47
+ end
48
+ end
49
+ end
@@ -1,3 +1,3 @@
1
1
  module AutoIncrement
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'models/account'
3
+ require 'models/user'
4
+
5
+ describe AutoIncrement do
6
+ before :all do
7
+ @account1 = Account.create name: 'My Account'
8
+ @account2 = Account.create name: 'Another Account', code: 50
9
+
10
+ @user_account1 = @account1.users.create name: 'Felipe', letter_code: 'Z'
11
+ @user_account2 = @account2.users.create name: 'Daniel'
12
+ end
13
+
14
+ describe 'initial' do
15
+ it { expect(@account1.code).to eq 1 }
16
+ it { expect(@user_account1.letter_code).to eq 'A' }
17
+ end
18
+
19
+ describe "do not increment outside scope" do
20
+ it { expect(@user_account2.letter_code).to eq 'A' }
21
+ end
22
+
23
+ describe "not set column if is already set" do
24
+ it { expect(@account2.code).to eq 50 }
25
+ end
26
+
27
+ describe "set column if option force is used" do
28
+ it { expect(@user_account1.letter_code).to eq 'A' }
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe AutoIncrement::Incrementor do
4
+ {
5
+ nil => 1, 0 => 1, 1 => 2, 'A' => 'B', 'Z' => 'AA', 'AA' => 'AB', 'AAAAA' => 'AAAAB'
6
+ }.each do |previous_value, next_value|
7
+ describe "increment value for #{previous_value}" do
8
+ it {
9
+ allow(subject).to receive(:maximum) { previous_value }
10
+ expect(subject.send(:increment)).to eq next_value
11
+ }
12
+ end
13
+ end
14
+
15
+ describe "initial value of string" do
16
+ subject {
17
+ AutoIncrement::Incrementor.new initial: 'A'
18
+ }
19
+
20
+ it {
21
+ allow(subject).to receive(:maximum) { nil }
22
+ expect(subject.send(:increment)).to eq 'A'
23
+ }
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ class Account < ActiveRecord::Base
2
+ auto_increment
3
+
4
+ has_many :users
5
+ end
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+ auto_increment column: :letter_code, scope: :account_id, initial: 'A', force: true
3
+
4
+ belongs_to :account
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'pry'
5
+ require 'auto_increment'
6
+
7
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
8
+
9
+ require 'support/active_record'
@@ -0,0 +1,10 @@
1
+ ActiveRecord::Migration.create_table :accounts do |t|
2
+ t.string :name
3
+ t.date :code
4
+ end
5
+
6
+ ActiveRecord::Migration.create_table :users do |t|
7
+ t.string :name
8
+ t.integer :account_id
9
+ t.string :letter_code
10
+ end
metadata CHANGED
@@ -1,15 +1,169 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auto_increment
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felipe Diesel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-30 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2015-03-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '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'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-nc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: fuubar
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: coveralls
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sqlite3
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
13
167
  description: Automaticaly increments a string or integer field in ActiveRecord.
14
168
  email:
15
169
  - felipediesel@gmail.com
@@ -17,29 +171,28 @@ executables: []
17
171
  extensions: []
18
172
  extra_rdoc_files: []
19
173
  files:
174
+ - .coveralls.yml
20
175
  - .gitignore
176
+ - .rspec
177
+ - .travis.yml
21
178
  - Gemfile
22
- - README.markdown
179
+ - Guardfile
180
+ - README.md
23
181
  - Rakefile
24
182
  - auto_increment.gemspec
25
183
  - lib/auto_increment.rb
26
184
  - lib/auto_increment/active_record.rb
185
+ - lib/auto_increment/incrementor.rb
27
186
  - lib/auto_increment/version.rb
28
- - test/app/Gemfile
29
- - test/app/app/controllers/application_controller.rb
30
- - test/app/app/helpers/application_helper.rb
31
- - test/app/app/views/layouts/application.html.erb
32
- - test/app/config.ru
33
- - test/app/config/application.rb
34
- - test/app/config/boot.rb
35
- - test/app/config/environment.rb
36
- - test/app/config/environments/development.rb
37
- - test/app/config/environments/production.rb
38
- - test/app/config/environments/test.rb
39
- - test/auto_increment_test.rb
40
- - test/test_helper.rb
187
+ - spec/lib/active_record_spec.rb
188
+ - spec/lib/incrementor_spec.rb
189
+ - spec/models/account.rb
190
+ - spec/models/user.rb
191
+ - spec/spec_helper.rb
192
+ - spec/support/active_record.rb
41
193
  homepage: http://github.com/felipediesel/auto_increment
42
- licenses: []
194
+ licenses:
195
+ - MIT
43
196
  metadata: {}
44
197
  post_install_message:
45
198
  rdoc_options: []
@@ -57,21 +210,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
210
  version: '0'
58
211
  requirements: []
59
212
  rubyforge_project: auto_increment
60
- rubygems_version: 2.1.11
213
+ rubygems_version: 2.4.4
61
214
  signing_key:
62
215
  specification_version: 4
63
216
  summary: Auto increment a string or integer field
64
217
  test_files:
65
- - test/app/Gemfile
66
- - test/app/app/controllers/application_controller.rb
67
- - test/app/app/helpers/application_helper.rb
68
- - test/app/app/views/layouts/application.html.erb
69
- - test/app/config.ru
70
- - test/app/config/application.rb
71
- - test/app/config/boot.rb
72
- - test/app/config/environment.rb
73
- - test/app/config/environments/development.rb
74
- - test/app/config/environments/production.rb
75
- - test/app/config/environments/test.rb
76
- - test/auto_increment_test.rb
77
- - test/test_helper.rb
218
+ - spec/lib/active_record_spec.rb
219
+ - spec/lib/incrementor_spec.rb
220
+ - spec/models/account.rb
221
+ - spec/models/user.rb
222
+ - spec/spec_helper.rb
223
+ - spec/support/active_record.rb
224
+ has_rdoc:
@@ -1,31 +0,0 @@
1
- source 'http://rubygems.org'
2
-
3
- gem 'rails', '3.0.4'
4
-
5
- # Bundle edge Rails instead:
6
- # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
-
8
- gem 'sqlite3'
9
-
10
- # Use unicorn as the web server
11
- # gem 'unicorn'
12
-
13
- # Deploy with Capistrano
14
- # gem 'capistrano'
15
-
16
- # To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
17
- # gem 'ruby-debug'
18
- # gem 'ruby-debug19'
19
-
20
- # Bundle the extra gems:
21
- # gem 'bj'
22
- # gem 'nokogiri'
23
- # gem 'sqlite3-ruby', :require => 'sqlite3'
24
- # gem 'aws-s3', :require => 'aws/s3'
25
-
26
- # Bundle gems for the local environment. Make sure to
27
- # put test-only gems in this group so their generators
28
- # and rake tasks are available in development mode:
29
- # group :development, :test do
30
- # gem 'webrat'
31
- # end
@@ -1,3 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- protect_from_forgery
3
- end
@@ -1,2 +0,0 @@
1
- module ApplicationHelper
2
- end
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>App</title>
5
- <%= stylesheet_link_tag :all %>
6
- <%= javascript_include_tag :defaults %>
7
- <%= csrf_meta_tag %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,4 +0,0 @@
1
- # This file is used by Rack-based servers to start the application.
2
-
3
- require ::File.expand_path('../config/environment', __FILE__)
4
- run App::Application
@@ -1,42 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require 'rails/all'
4
-
5
- # If you have a Gemfile, require the gems listed there, including any gems
6
- # you've limited to :test, :development, or :production.
7
- Bundler.require(:default, Rails.env) if defined?(Bundler)
8
-
9
- module App
10
- class Application < Rails::Application
11
- # Settings in config/environments/* take precedence over those specified here.
12
- # Application configuration should go into files in config/initializers
13
- # -- all .rb files in that directory are automatically loaded.
14
-
15
- # Custom directories with classes and modules you want to be autoloadable.
16
- # config.autoload_paths += %W(#{config.root}/extras)
17
-
18
- # Only load the plugins named here, in the order given (default is alphabetical).
19
- # :all can be used as a placeholder for all plugins not explicitly named.
20
- # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
21
-
22
- # Activate observers that should always be running.
23
- # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
24
-
25
- # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
26
- # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
27
- # config.time_zone = 'Central Time (US & Canada)'
28
-
29
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
30
- # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
31
- # config.i18n.default_locale = :de
32
-
33
- # JavaScript files you want as :defaults (application.js is always included).
34
- # config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
35
-
36
- # Configure the default encoding used in templates for Ruby 1.9.
37
- config.encoding = "utf-8"
38
-
39
- # Configure sensitive parameters which will be filtered from the log file.
40
- config.filter_parameters += [:password]
41
- end
42
- end
@@ -1,6 +0,0 @@
1
- require 'rubygems'
2
-
3
- # Set up gems listed in the Gemfile.
4
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
5
-
6
- require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
@@ -1,5 +0,0 @@
1
- # Load the rails application
2
- require File.expand_path('../application', __FILE__)
3
-
4
- # Initialize the rails application
5
- App::Application.initialize!
@@ -1,26 +0,0 @@
1
- App::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # In the development environment your application's code is reloaded on
5
- # every request. This slows down response time but is perfect for development
6
- # since you don't have to restart the webserver when you make code changes.
7
- config.cache_classes = false
8
-
9
- # Log error messages when you accidentally call methods on nil.
10
- config.whiny_nils = true
11
-
12
- # Show full error reports and disable caching
13
- config.consider_all_requests_local = true
14
- config.action_view.debug_rjs = true
15
- config.action_controller.perform_caching = false
16
-
17
- # Don't care if the mailer can't send
18
- config.action_mailer.raise_delivery_errors = false
19
-
20
- # Print deprecation notices to the Rails logger
21
- config.active_support.deprecation = :log
22
-
23
- # Only use best-standards-support built into browsers
24
- config.action_dispatch.best_standards_support = :builtin
25
- end
26
-
@@ -1,49 +0,0 @@
1
- App::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # The production environment is meant for finished, "live" apps.
5
- # Code is not reloaded between requests
6
- config.cache_classes = true
7
-
8
- # Full error reports are disabled and caching is turned on
9
- config.consider_all_requests_local = false
10
- config.action_controller.perform_caching = true
11
-
12
- # Specifies the header that your server uses for sending files
13
- config.action_dispatch.x_sendfile_header = "X-Sendfile"
14
-
15
- # For nginx:
16
- # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
17
-
18
- # If you have no front-end server that supports something like X-Sendfile,
19
- # just comment this out and Rails will serve the files
20
-
21
- # See everything in the log (default is :info)
22
- # config.log_level = :debug
23
-
24
- # Use a different logger for distributed setups
25
- # config.logger = SyslogLogger.new
26
-
27
- # Use a different cache store in production
28
- # config.cache_store = :mem_cache_store
29
-
30
- # Disable Rails's static asset server
31
- # In production, Apache or nginx will already do this
32
- config.serve_static_assets = false
33
-
34
- # Enable serving of images, stylesheets, and javascripts from an asset server
35
- # config.action_controller.asset_host = "http://assets.example.com"
36
-
37
- # Disable delivery errors, bad email addresses will be ignored
38
- # config.action_mailer.raise_delivery_errors = false
39
-
40
- # Enable threaded mode
41
- # config.threadsafe!
42
-
43
- # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
44
- # the I18n.default_locale when a translation can not be found)
45
- config.i18n.fallbacks = true
46
-
47
- # Send deprecation notices to registered listeners
48
- config.active_support.deprecation = :notify
49
- end
@@ -1,35 +0,0 @@
1
- App::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # The test environment is used exclusively to run your application's
5
- # test suite. You never need to work with it otherwise. Remember that
6
- # your test database is "scratch space" for the test suite and is wiped
7
- # and recreated between test runs. Don't rely on the data there!
8
- config.cache_classes = true
9
-
10
- # Log error messages when you accidentally call methods on nil.
11
- config.whiny_nils = true
12
-
13
- # Show full error reports and disable caching
14
- config.consider_all_requests_local = true
15
- config.action_controller.perform_caching = false
16
-
17
- # Raise exceptions instead of rendering exception templates
18
- config.action_dispatch.show_exceptions = false
19
-
20
- # Disable request forgery protection in test environment
21
- config.action_controller.allow_forgery_protection = false
22
-
23
- # Tell Action Mailer not to deliver emails to the real world.
24
- # The :test delivery method accumulates sent emails in the
25
- # ActionMailer::Base.deliveries array.
26
- config.action_mailer.delivery_method = :test
27
-
28
- # Use SQL instead of Active Record's schema dumper when creating the test database.
29
- # This is necessary if your schema can't be completely dumped by the schema dumper,
30
- # like if you have constraints or database-specific column types
31
- # config.active_record.schema_format = :sql
32
-
33
- # Print deprecation notices to the stderr
34
- config.active_support.deprecation = :stderr
35
- end
@@ -1,66 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
4
-
5
- class AutoIncrementActiveRecordTest < ActiveRecord::TestCase
6
- def setup
7
- @account1 = Account.create :name => 'My Account'
8
- @account2 = Account.create :name => 'My Second Account'
9
- @user1 = @account1.users.create :name => 'Felipe'
10
- @user2 = @account1.users.create :name => 'Sabrina'
11
-
12
- @user_account2 = @account2.users.create :name => 'Daniel'
13
-
14
- @user3 = @account1.users.create :name => 'Paulo'
15
- @user3.letter_code = 'Z'
16
- @user3.save
17
-
18
- @user4 = @account1.users.create :name => 'Marlene'
19
- @user4.save
20
-
21
- @user5 = @account1.users.create :name => 'Patricia'
22
- @user5.save
23
-
24
- end
25
-
26
- test "use initial" do
27
- assert_equal 1, @account1.code
28
-
29
- assert_equal 'A', @user1.letter_code
30
- end
31
-
32
- test "increments numbers" do
33
- assert_equal 2, @account2.code
34
- end
35
-
36
- test "increments letters" do
37
- assert_equal 'B', @user2.letter_code
38
- end
39
-
40
- test "do not increment outside scope" do
41
- assert_equal 'A', @user_account2.letter_code
42
- end
43
-
44
- test "Z increments to AA" do
45
- assert_equal 'AA', @user4.letter_code
46
- end
47
-
48
- test "AA increments to AB" do
49
- assert_equal 'AB', @user5.letter_code
50
- end
51
-
52
- test "not set column if is already set" do
53
- account = Account.new :name => 'Another Account', :code => 50
54
- account.save
55
-
56
- assert_equal account.code, 50
57
- end
58
-
59
- test "set column if option force is used" do
60
- User.destroy_all
61
- user = User.new :name => 'Maria', :letter_code => 'Z'
62
- user.save
63
-
64
- assert_equal user.letter_code, 'A'
65
- end
66
- end
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ENV["RAILS_ENV"] = "test"
4
- require File.expand_path('../app/config/environment', __FILE__)
5
- require 'rails/test_help'
6
-
7
- require File.expand_path('../../lib/auto_increment', __FILE__)
8
-
9
-
10
- config = YAML.load_file(File.dirname(__FILE__) + '/database.yml')
11
- ActiveRecord::Base.establish_connection(config['test'])
12
-
13
- ActiveRecord::Base.connection.create_table :accounts do |t|
14
- t.string :name
15
- t.date :code
16
- end
17
-
18
- ActiveRecord::Base.connection.create_table :users do |t|
19
- t.string :name
20
- t.integer :account_id
21
- t.string :letter_code
22
- end
23
-
24
-
25
- class Account < ActiveRecord::Base
26
- auto_increment
27
-
28
- has_many :users
29
- end
30
-
31
- class User < ActiveRecord::Base
32
- auto_increment :column => :letter_code, :scope => :account_id, :initial => 'A', :force => true
33
-
34
- belongs_to :account
35
- end