postgres_ext 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +15 -5
- data/CHANGELOG.md +3 -0
- data/Gemfile +2 -2
- data/README.md +4 -0
- data/docs/type_casting.md +19 -0
- data/lib/postgres_ext/active_record/connection_adapters/postgres_adapter.rb +149 -3
- data/lib/postgres_ext/active_record/relation/predicate_builder.rb +1 -1
- data/lib/postgres_ext/version.rb +1 -1
- data/spec/columns/array_spec.rb +3 -4
- data/spec/columns/ranges/daterange_spec.rb +37 -0
- data/spec/columns/ranges/int4range_spec.rb +38 -0
- data/spec/columns/ranges/int8range_spec.rb +38 -0
- data/spec/columns/ranges/numrange_spec.rb +37 -0
- data/spec/columns/ranges/tsrange_spec.rb +37 -0
- data/spec/dummy/app/models/person.rb +1 -1
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/20120501163758_create_people.rb +1 -0
- data/spec/dummy/db/schema.rb +9 -8
- data/spec/migrations/array_spec.rb +20 -0
- data/spec/migrations/ranges/daterange_spec.rb +27 -0
- data/spec/migrations/ranges/int4range_spec.rb +27 -0
- data/spec/migrations/ranges/int8range_spec.rb +27 -0
- data/spec/migrations/ranges/numrange_spec.rb +27 -0
- data/spec/migrations/ranges/tsrange_spec.rb +27 -0
- data/spec/migrations/ranges/tstzrange_spec.rb +27 -0
- data/spec/models/ranges/daterange_spec.rb +88 -0
- data/spec/models/ranges/int4range_spec.rb +85 -0
- data/spec/models/ranges/int8range_spec.rb +85 -0
- data/spec/models/ranges/numrange_spec.rb +85 -0
- data/spec/models/ranges/tsrange_spec.rb +89 -0
- data/spec/models/ranges/tstzrange_spec.rb +89 -0
- data/spec/queries/sanity_spec.rb +1 -0
- data/spec/schema_dumper/array_spec.rb +1 -1
- data/spec/schema_dumper/ranges/daterange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/int4range_spec.rb +18 -0
- data/spec/schema_dumper/ranges/int8range_spec.rb +18 -0
- data/spec/schema_dumper/ranges/numrange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/tsrange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/tstzrange_spec.rb +17 -0
- metadata +53 -27
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Models with int4range range columns' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
|
6
|
+
context 'no default value, range' do
|
7
|
+
before do
|
8
|
+
adapter.create_table :int4_rangers, :force => true do |t|
|
9
|
+
t.int4range :best_estimate
|
10
|
+
end
|
11
|
+
class Int4Ranger < ActiveRecord::Base
|
12
|
+
attr_accessible :best_estimate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
adapter.drop_table :int4_rangers
|
18
|
+
Object.send(:remove_const, :Int4Ranger)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#create' do
|
22
|
+
it 'creates an record when there is no assignment' do
|
23
|
+
range = Int4Ranger.create()
|
24
|
+
range.reload
|
25
|
+
range.best_estimate.should eq nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates an record with a range' do
|
29
|
+
range = Int4Ranger.create( :best_estimate => 0..4)
|
30
|
+
range.reload
|
31
|
+
range.best_estimate.should eq 0...5
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'range assignment' do
|
36
|
+
it 'updates an record with an range string' do
|
37
|
+
range = Int4Ranger.create( :best_estimate => 0..4)
|
38
|
+
range.best_estimate = 0...9
|
39
|
+
range.save
|
40
|
+
|
41
|
+
range.reload
|
42
|
+
range.best_estimate.should eq 0...9
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'converts empty strings to nil' do
|
46
|
+
range = Int4Ranger.create
|
47
|
+
range.best_estimate = ''
|
48
|
+
range.save
|
49
|
+
|
50
|
+
range.reload
|
51
|
+
range.best_estimate.should eq nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'default value, int4 range' do
|
57
|
+
before do
|
58
|
+
adapter.create_table :int4_default_rangers, :force => true do |t|
|
59
|
+
t.int4range :best_estimate, :default => 0..5
|
60
|
+
end
|
61
|
+
class Int4DefaultRanger < ActiveRecord::Base
|
62
|
+
attr_accessible :best_estimate
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
after do
|
67
|
+
adapter.drop_table :int4_default_rangers
|
68
|
+
Object.send(:remove_const, :Int4DefaultRanger)
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#create' do
|
72
|
+
it 'creates an record when there is no assignment' do
|
73
|
+
range = Int4DefaultRanger.create()
|
74
|
+
range.reload
|
75
|
+
range.best_estimate.should eq 0...6
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'creates an record with a range' do
|
79
|
+
range = Int4DefaultRanger.create( :best_estimate => 0..4)
|
80
|
+
range.reload
|
81
|
+
range.best_estimate.should eq 0...5
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Models with int8range columns' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
|
6
|
+
context 'no default value, range' do
|
7
|
+
before do
|
8
|
+
adapter.create_table :int8_rangers, :force => true do |t|
|
9
|
+
t.int8range :best_estimate
|
10
|
+
end
|
11
|
+
class Int8Ranger < ActiveRecord::Base
|
12
|
+
attr_accessible :best_estimate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
adapter.drop_table :int8_rangers
|
18
|
+
Object.send(:remove_const, :Int8Ranger)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#create' do
|
22
|
+
it 'creates an record when there is no assignment' do
|
23
|
+
range = Int8Ranger.create()
|
24
|
+
range.reload
|
25
|
+
range.best_estimate.should eq nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates an record with a range' do
|
29
|
+
range = Int8Ranger.create( :best_estimate => 0..4)
|
30
|
+
range.reload
|
31
|
+
range.best_estimate.should eq 0...5
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'range assignment' do
|
36
|
+
it 'updates an record with an range string' do
|
37
|
+
range = Int8Ranger.create( :best_estimate => 0..4)
|
38
|
+
range.best_estimate = 0...9
|
39
|
+
range.save
|
40
|
+
|
41
|
+
range.reload
|
42
|
+
range.best_estimate.should eq 0...9
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'converts empty strings to nil' do
|
46
|
+
range = Int8Ranger.create
|
47
|
+
range.best_estimate = ''
|
48
|
+
range.save
|
49
|
+
|
50
|
+
range.reload
|
51
|
+
range.best_estimate.should eq nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'default value, int8 range' do
|
57
|
+
before do
|
58
|
+
adapter.create_table :int8_default_rangers, :force => true do |t|
|
59
|
+
t.int8range :best_estimate, :default => 0..5
|
60
|
+
end
|
61
|
+
class Int8DefaultRanger < ActiveRecord::Base
|
62
|
+
attr_accessible :best_estimate
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
after do
|
67
|
+
adapter.drop_table :int8_default_rangers
|
68
|
+
Object.send(:remove_const, :Int8DefaultRanger)
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#create' do
|
72
|
+
it 'creates an record when there is no assignment' do
|
73
|
+
range = Int8DefaultRanger.create()
|
74
|
+
range.reload
|
75
|
+
range.best_estimate.should eq 0...6
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'creates an record with a range' do
|
79
|
+
range = Int8DefaultRanger.create( :best_estimate => 0..4)
|
80
|
+
range.reload
|
81
|
+
range.best_estimate.should eq 0...5
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Models with numeric range columns' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
|
6
|
+
context 'no default value, range' do
|
7
|
+
before do
|
8
|
+
adapter.create_table :rangers, :force => true do |t|
|
9
|
+
t.numrange :best_estimate
|
10
|
+
end
|
11
|
+
class Ranger < ActiveRecord::Base
|
12
|
+
attr_accessible :best_estimate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
adapter.drop_table :rangers
|
18
|
+
Object.send(:remove_const, :Ranger)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#create' do
|
22
|
+
it 'creates an record when there is no assignment' do
|
23
|
+
range = Ranger.create()
|
24
|
+
range.reload
|
25
|
+
range.best_estimate.should eq nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates an record with a range' do
|
29
|
+
range = Ranger.create( :best_estimate => 0..4)
|
30
|
+
range.reload
|
31
|
+
range.best_estimate.should eq 0..4
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'range assignment' do
|
36
|
+
it 'updates an record with an range string' do
|
37
|
+
range = Ranger.create( :best_estimate => 0..4)
|
38
|
+
range.best_estimate = 0...9
|
39
|
+
range.save
|
40
|
+
|
41
|
+
range.reload
|
42
|
+
range.best_estimate.should eq 0...9
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'converts empty strings to nil' do
|
46
|
+
range = Ranger.create
|
47
|
+
range.best_estimate = ''
|
48
|
+
range.save
|
49
|
+
|
50
|
+
range.reload
|
51
|
+
range.best_estimate.should eq nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'default value, numeric range' do
|
57
|
+
before do
|
58
|
+
adapter.create_table :default_rangers, :force => true do |t|
|
59
|
+
t.numrange :best_estimate, :default => 0..5
|
60
|
+
end
|
61
|
+
class DefaultRanger < ActiveRecord::Base
|
62
|
+
attr_accessible :best_estimate
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
after do
|
67
|
+
adapter.drop_table :default_rangers
|
68
|
+
Object.send(:remove_const, :DefaultRanger)
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#create' do
|
72
|
+
it 'creates an record when there is no assignment' do
|
73
|
+
range = DefaultRanger.create()
|
74
|
+
range.reload
|
75
|
+
range.best_estimate.should eq 0..5
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'creates an record with a range' do
|
79
|
+
range = DefaultRanger.create( :best_estimate => 0..4)
|
80
|
+
range.reload
|
81
|
+
range.best_estimate.should eq 0..4
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Models with tsrange columns' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
|
6
|
+
context 'no default value, range' do
|
7
|
+
before do
|
8
|
+
adapter.create_table :ts_rangers, :force => true do |t|
|
9
|
+
t.tsrange :best_estimate
|
10
|
+
end
|
11
|
+
class TsRanger < ActiveRecord::Base
|
12
|
+
attr_accessible :best_estimate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
adapter.drop_table :ts_rangers
|
18
|
+
Object.send(:remove_const, :TsRanger)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#create' do
|
22
|
+
it 'creates an record when there is no assignment' do
|
23
|
+
range = TsRanger.create()
|
24
|
+
range.reload
|
25
|
+
range.best_estimate.should eq nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates an record with a range' do
|
29
|
+
ts_range = Time.new(2011, 01, 01, 12, 34)..Time.new(2012, 01, 31, 8, 0, 1)
|
30
|
+
range = TsRanger.create( :best_estimate => ts_range)
|
31
|
+
range.reload
|
32
|
+
range.best_estimate.should eq ts_range
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'range assignment' do
|
37
|
+
it 'updates an record with an range string' do
|
38
|
+
ts_range = Time.new(2011, 01, 01, 12, 34)..Time.new(2012, 01, 31, 8, 0, 1)
|
39
|
+
new_ts_range = Time.new(2012, 01, 01, 11, 0, 0)..Time.new(2012, 02, 01, 13, 0, 0)
|
40
|
+
range = TsRanger.create( :best_estimate => ts_range)
|
41
|
+
range.best_estimate = new_ts_range
|
42
|
+
range.save
|
43
|
+
|
44
|
+
range.reload
|
45
|
+
range.best_estimate.should eq new_ts_range
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'converdate empty strings to nil' do
|
49
|
+
range = TsRanger.create
|
50
|
+
range.best_estimate = ''
|
51
|
+
range.save
|
52
|
+
|
53
|
+
range.reload
|
54
|
+
range.best_estimate.should eq nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'default value, ts range' do
|
60
|
+
before do
|
61
|
+
adapter.create_table :ts_default_rangers, :force => true do |t|
|
62
|
+
t.tsrange :best_estimate, :default => Time.new(2011, 01, 01, 12, 34)..Time.new(2011, 01, 31, 1, 0)
|
63
|
+
end
|
64
|
+
class TsDefaultRanger < ActiveRecord::Base
|
65
|
+
attr_accessible :best_estimate
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
after do
|
70
|
+
adapter.drop_table :ts_default_rangers
|
71
|
+
Object.send(:remove_const, :TsDefaultRanger)
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#create' do
|
75
|
+
it 'creates an record when there is no assignment' do
|
76
|
+
range = TsDefaultRanger.create()
|
77
|
+
range.reload
|
78
|
+
range.best_estimate.should eq Time.new(2011, 01, 01, 12, 34)..Time.new(2011, 01, 31, 1, 0)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'creates an record with a range' do
|
82
|
+
new_ts_range = Time.new(2012, 01, 01, 9, 0, 0)..Time.new(2012, 12, 31, 9, 0, 0)
|
83
|
+
range = TsDefaultRanger.create(:best_estimate => new_ts_range)
|
84
|
+
range.reload
|
85
|
+
range.best_estimate.should eq new_ts_range
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Models with tstzrange columns' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
|
6
|
+
context 'no default value, range' do
|
7
|
+
before do
|
8
|
+
adapter.create_table :tstz_rangers, :force => true do |t|
|
9
|
+
t.tstzrange :best_estimate
|
10
|
+
end
|
11
|
+
class TstzRanger < ActiveRecord::Base
|
12
|
+
attr_accessible :best_estimate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
adapter.drop_table :tstz_rangers
|
18
|
+
Object.send(:remove_const, :TstzRanger)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#create' do
|
22
|
+
it 'creates an record when there is no assignment' do
|
23
|
+
range = TstzRanger.create()
|
24
|
+
range.reload
|
25
|
+
range.best_estimate.should eq nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates an record with a range' do
|
29
|
+
ts_range = Time.new(2011, 01, 01, 12, 34)..Time.new(2012, 01, 31, 8, 0, 1)
|
30
|
+
range = TstzRanger.create( :best_estimate => ts_range)
|
31
|
+
range.reload
|
32
|
+
range.best_estimate.should eq ts_range
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'range assignment' do
|
37
|
+
it 'updates an record with an range string' do
|
38
|
+
ts_range = Time.new(2011, 01, 01, 12, 34)..Time.new(2012, 01, 31, 8, 0, 1)
|
39
|
+
new_ts_range = Time.new(2012, 01, 01, 11, 0, 0)..Time.new(2012, 02, 01, 13, 0, 0)
|
40
|
+
range = TstzRanger.create( :best_estimate => ts_range)
|
41
|
+
range.best_estimate = new_ts_range
|
42
|
+
range.save
|
43
|
+
|
44
|
+
range.reload
|
45
|
+
range.best_estimate.should eq new_ts_range
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'converdate empty strings to nil' do
|
49
|
+
range = TstzRanger.create
|
50
|
+
range.best_estimate = ''
|
51
|
+
range.save
|
52
|
+
|
53
|
+
range.reload
|
54
|
+
range.best_estimate.should eq nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'default value, ts range' do
|
60
|
+
before do
|
61
|
+
adapter.create_table :tstz_default_rangers, :force => true do |t|
|
62
|
+
t.tstzrange :best_estimate, :default => Time.new(2011, 01, 01, 12, 34, 0, '-07:00')..Time.new(2011, 01, 31, 1, 0, 0, '-07:00')
|
63
|
+
end
|
64
|
+
class TstzDefaultRanger < ActiveRecord::Base
|
65
|
+
attr_accessible :best_estimate
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
after do
|
70
|
+
adapter.drop_table :tstz_default_rangers
|
71
|
+
Object.send(:remove_const, :TstzDefaultRanger)
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#create' do
|
75
|
+
it 'creates an record when there is no assignment' do
|
76
|
+
range = TstzDefaultRanger.create()
|
77
|
+
range.reload
|
78
|
+
range.best_estimate.should eq Time.new(2011, 01, 01, 12, 34,0, '-07:00')..Time.new(2011, 01, 31, 1, 0, 0, '-07:00')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'creates an record with a range' do
|
82
|
+
new_ts_range = Time.new(2012, 01, 01, 9, 0, 0, '-05:00')..Time.new(2012, 12, 31, 9, 0, 0, '-05:00')
|
83
|
+
range = TstzDefaultRanger.create(:best_estimate => new_ts_range)
|
84
|
+
range.reload
|
85
|
+
range.best_estimate.should eq new_ts_range
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|