activerecord-postgres-composite-types 0.2.7 → 0.2.8
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 +4 -4
- data/.travis.yml +5 -4
- data/Gemfile +1 -2
- data/VERSION +1 -1
- data/activerecord-postgres-composite-types.gemspec +4 -7
- data/lib/activerecord-postgres-composite-types/oid/composite_type_4_2.rb +1 -1
- data/test/helper.rb +1 -3
- data/test/test_composite_type_class.rb +9 -9
- data/test/test_nested_types.rb +10 -10
- data/test/test_postgres_composite_types.rb +23 -7
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d16fab97f447570a87c19162c8f9d4f706c46ab
|
4
|
+
data.tar.gz: 84a4370a599af1d99f6666c6b1b5425382413b97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1786a5fc1abdcc38aa8427de7089daaaa691edc5f65493ad3a940f9716bddb750e57b7c007d16d1fda0f910b6fd68f028e8a237d9d1a0b75f6bf46984c42ff2
|
7
|
+
data.tar.gz: d8e39544995e95380b6f09a21d08da0128f039082bf3983ef876cf671db45ac29a46e853b571766acae8aa749721428a226014b71f79109e229975bd2709aeb6
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -7,12 +7,11 @@ gem 'pg', '>= 0.17.0'
|
|
7
7
|
|
8
8
|
group :development do
|
9
9
|
gem 'test-unit', '~> 2.1'
|
10
|
-
gem 'shoulda', '>= 0'
|
11
10
|
gem 'rdoc', '~> 3.12'
|
12
11
|
gem 'rake', '~> 10.3'
|
13
12
|
gem 'bundler', '~> 1.0'
|
14
13
|
gem 'jeweler', '~> 2.0.1' unless RUBY_PLATFORM =~ /mswin/
|
15
14
|
gem 'simplecov', '>= 0'
|
16
15
|
gem 'combustion', '~> 0.5.2'
|
17
|
-
gem 'tzinfo-data' if AR_VERSION
|
16
|
+
gem 'tzinfo-data' if AR_VERSION >= '4'
|
18
17
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.8
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: activerecord-postgres-composite-types 0.2.
|
5
|
+
# stub: activerecord-postgres-composite-types 0.2.8 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "activerecord-postgres-composite-types"
|
9
|
-
s.version = "0.2.
|
9
|
+
s.version = "0.2.8"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Rafal Bigaj"]
|
14
|
-
s.date = "2015-
|
14
|
+
s.date = "2015-07-17"
|
15
15
|
s.description = "This gem adds support to the ActiveRecord (3.x and 4.x) for composite types."
|
16
16
|
s.email = "rafal.bigaj@puzzleflow.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -48,7 +48,7 @@ Gem::Specification.new do |s|
|
|
48
48
|
]
|
49
49
|
s.homepage = "http://github.com/puzzleflow/activerecord-postgres-composite-types"
|
50
50
|
s.licenses = ["MIT"]
|
51
|
-
s.rubygems_version = "2.4.
|
51
|
+
s.rubygems_version = "2.4.8"
|
52
52
|
s.summary = "ActiveRecord composite types support"
|
53
53
|
|
54
54
|
if s.respond_to? :specification_version then
|
@@ -58,7 +58,6 @@ Gem::Specification.new do |s|
|
|
58
58
|
s.add_runtime_dependency(%q<activerecord>, [">= 3.2"])
|
59
59
|
s.add_runtime_dependency(%q<pg>, [">= 0.17.0"])
|
60
60
|
s.add_development_dependency(%q<test-unit>, ["~> 2.1"])
|
61
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
62
61
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
63
62
|
s.add_development_dependency(%q<rake>, ["~> 10.3"])
|
64
63
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
@@ -69,7 +68,6 @@ Gem::Specification.new do |s|
|
|
69
68
|
s.add_dependency(%q<activerecord>, [">= 3.2"])
|
70
69
|
s.add_dependency(%q<pg>, [">= 0.17.0"])
|
71
70
|
s.add_dependency(%q<test-unit>, ["~> 2.1"])
|
72
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
73
71
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
74
72
|
s.add_dependency(%q<rake>, ["~> 10.3"])
|
75
73
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
@@ -81,7 +79,6 @@ Gem::Specification.new do |s|
|
|
81
79
|
s.add_dependency(%q<activerecord>, [">= 3.2"])
|
82
80
|
s.add_dependency(%q<pg>, [">= 0.17.0"])
|
83
81
|
s.add_dependency(%q<test-unit>, ["~> 2.1"])
|
84
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
85
82
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
86
83
|
s.add_dependency(%q<rake>, ["~> 10.3"])
|
87
84
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
@@ -28,7 +28,7 @@ module ActiveRecord
|
|
28
28
|
|
29
29
|
def type_cast_for_database(object)
|
30
30
|
return object if object.is_a?(String) # already quoted by AREL visitor
|
31
|
-
return
|
31
|
+
return nil if object == nil
|
32
32
|
quoted_values = object.class.columns.collect do |column|
|
33
33
|
value = object.send(column.name)
|
34
34
|
if String === value
|
data/test/helper.rb
CHANGED
@@ -24,8 +24,6 @@ rescue Bundler::BundlerError => e
|
|
24
24
|
exit e.status_code
|
25
25
|
end
|
26
26
|
|
27
|
-
require 'shoulda'
|
28
|
-
|
29
27
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
30
28
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
31
29
|
|
@@ -40,7 +38,7 @@ Combustion.initialize! :active_record
|
|
40
38
|
|
41
39
|
ActiveRecord::Base.default_timezone = :utc
|
42
40
|
|
43
|
-
class
|
41
|
+
class ActiveSupport::TestCase
|
44
42
|
def connection
|
45
43
|
ActiveRecord::Base.connection
|
46
44
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class TestCompositeTypeClass <
|
3
|
+
class TestCompositeTypeClass < ActiveSupport::TestCase
|
4
4
|
|
5
5
|
PostgreSQLColumn = ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
6
6
|
|
@@ -8,7 +8,7 @@ class TestCompositeTypeClass < Test::Unit::TestCase
|
|
8
8
|
@my_type_column = connection.columns(:my_table).first
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
test "define accessors" do
|
12
12
|
assert MyType.method_defined?(:name)
|
13
13
|
assert MyType.method_defined?(:name=)
|
14
14
|
assert MyType.method_defined?(:number)
|
@@ -17,44 +17,44 @@ class TestCompositeTypeClass < Test::Unit::TestCase
|
|
17
17
|
assert MyType.method_defined?(:date=)
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
test "be created by adapter from string" do
|
21
21
|
value = PostgreSQLColumn.string_to_composite_type(MyType, "(text,5,2014-08-27 00:00:00)")
|
22
22
|
assert_equal 'text', value.name
|
23
23
|
assert_equal 5, value.number
|
24
24
|
assert_equal Time.parse('2014-08-27 00:00:00 UTC'), value.date
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
test "accept escaped string" do
|
28
28
|
value = PostgreSQLColumn.string_to_composite_type(MyType, '("text\'s",125,"2014-08-27 10:00:00")')
|
29
29
|
assert_equal "text's", value.name
|
30
30
|
assert_equal 125, value.number
|
31
31
|
assert_equal Time.parse('2014-08-27 10:00:00 UTC'), value.date
|
32
32
|
end
|
33
33
|
|
34
|
-
|
34
|
+
test "initialize with hash" do
|
35
35
|
value = MyType.new(number: 1, name: 'abc', date: Time.parse('2014-08-27 12:00:00 UTC'))
|
36
36
|
assert_equal 'abc', value.name
|
37
37
|
assert_equal 1, value.number
|
38
38
|
assert_equal Time.parse('2014-08-27 12:00:00 UTC'), value.date
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
test "cast to qouted string" do
|
42
42
|
value = MyType.new(number: 1, name: '"\'a\'bc[]*/\"', date: Time.parse('2014-08-27 12:00:00 UTC'))
|
43
43
|
quoted = connection.quote(value, @my_type_column).sub(':00.000000', ':00 UTC') # On AR ver < 4.2 time is quoted to format with milliseconds
|
44
44
|
assert_equal %Q{'("\\\"''a''bc[]*/\\\\\\\"",1,2014-08-27 12:00:00 UTC)'}, quoted
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
test "parse string and return array" do
|
48
48
|
result = PostgreSQLColumn::CompositeTypeParser.parse_data("(text,5,2014-08-27 00:00:00)")
|
49
49
|
assert_equal ["text", "5", "2014-08-27 00:00:00"], result
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
test "parse string and return array 2" do
|
53
53
|
result = PostgreSQLColumn::CompositeTypeParser.parse_data('(text,5,"(titi,tata)",2014-08-27 00:00:00)')
|
54
54
|
assert_equal ["text", "5", '(titi,tata)', "2014-08-27 00:00:00"], result
|
55
55
|
end
|
56
56
|
|
57
|
-
|
57
|
+
test "parse string and return array 3" do
|
58
58
|
result = PostgreSQLColumn::CompositeTypeParser.parse_data('(text,5,"(titi,tata,""(tutu""""tata,tete)"")",2014-08-27 00:00:00)')
|
59
59
|
assert_equal ["text", "5", '(titi,tata,"(tutu""tata,tete)")', "2014-08-27 00:00:00"], result
|
60
60
|
end
|
data/test/test_nested_types.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class TestNestedTypes <
|
3
|
+
class TestNestedTypes < ActiveSupport::TestCase
|
4
4
|
class Bar < ActiveRecord::Base
|
5
5
|
end
|
6
6
|
|
7
7
|
class Bar2 < ActiveRecord::Base
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
test "cast value properly" do
|
11
11
|
bars = Bar.order('(nested).comp.f1').all
|
12
12
|
assert_equal 2, bars.size
|
13
13
|
assert_kind_of NestedType, bars[0].nested
|
@@ -18,46 +18,46 @@ class TestNestedTypes < Test::Unit::TestCase
|
|
18
18
|
assert_equal 'blue', bars[1].nested.color
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
test "insert with nested type" do
|
22
22
|
bar = Bar.new(nested: {comp: Compfoo.new([2, 'bac']), color: 'red'})
|
23
23
|
bar.save
|
24
24
|
assert !bar.new_record?
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
test "build nested types from Hash" do
|
28
28
|
bar = Bar.new(nested: {comp: {f1: 2, f2: 'bac'}, color: 'red'})
|
29
29
|
assert_kind_of NestedType, bar.nested
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
test "build nested types from Array" do
|
33
33
|
bar = Bar.new(nested: [[2, 'bac'], 'red'])
|
34
34
|
assert_kind_of NestedType, bar.nested
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
test "insert with double nested type" do
|
38
38
|
bar = Bar2.new(nested: {nested: {comp: [1, 'dca'], color: 'blue'}, color: 'red'})
|
39
39
|
assert_kind_of NestedNestedType, bar.nested
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
test "select nested type" do
|
43
43
|
Bar2.create!(nested: {nested: {comp: [1, 'dca'], color: 'blue'}, color: 'red'})
|
44
44
|
assert !Bar2.where(nested: NestedNestedType.new(nested: {comp: [1, 'dca'], color: 'red'}, color: 'red')).exists?
|
45
45
|
assert Bar2.where(nested: NestedNestedType.new(nested: {comp: [1, 'dca'], color: 'blue'}, color: 'red')).exists?
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
test "parser test work when nested attribute contains parenthesis" do
|
49
49
|
Bar2.create!(nested: {nested: {comp: [1, 'dc)))a'], color: 'blue'}, color: 'red'})
|
50
50
|
assert_equal 'dc)))a', Bar2.all.to_a.last.nested.nested.comp.f2
|
51
51
|
assert Bar2.where(nested: NestedNestedType.new(nested: {comp: [1, 'dc)))a'], color: 'blue'}, color: 'red')).exists?
|
52
52
|
end
|
53
53
|
|
54
|
-
|
54
|
+
test "parser test work when nested attribute contains double quote" do
|
55
55
|
Bar2.create!(nested: {nested: {comp: [1, "dc\"a"], color: 'blue'}, color: 'blue'})
|
56
56
|
assert_equal 'blue', Bar2.all.to_a.last.nested.color
|
57
57
|
assert_equal 'dc"a', Bar2.all.to_a.last.nested.nested.comp.f2
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
test "parser test work when nested attribute contains backslash" do
|
61
61
|
Bar2.create!(nested: {nested: {comp: [1, "dc\\a"], color: 'blue'}, color: 'green'})
|
62
62
|
assert_equal 'green', Bar2.all.to_a.last.nested.color
|
63
63
|
assert_equal 'dc\\a', Bar2.all.to_a.last.nested.nested.comp.f2
|
@@ -1,11 +1,18 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class TestPostgresCompositeTypes <
|
3
|
+
class TestPostgresCompositeTypes < ActiveSupport::TestCase
|
4
4
|
class Foo < ActiveRecord::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
class MyValue < ActiveRecord::Base
|
8
|
+
self.table_name = 'my_table'
|
9
|
+
end
|
5
10
|
|
11
|
+
teardown do
|
12
|
+
Foo.delete_all '(comp).f1 NOT IN (0,1)'
|
6
13
|
end
|
7
14
|
|
8
|
-
|
15
|
+
test "cast value properly" do
|
9
16
|
foos = Foo.all
|
10
17
|
assert_equal 2, foos.size
|
11
18
|
assert_equal 0, foos[0].comp.f1
|
@@ -14,12 +21,12 @@ class TestPostgresCompositeTypes < Test::Unit::TestCase
|
|
14
21
|
assert_equal "a/b'c\\d e f", foos[1].comp.f2
|
15
22
|
end
|
16
23
|
|
17
|
-
|
24
|
+
test "accept composite type in where clausure" do
|
18
25
|
sql = Foo.where(comp: Compfoo.new([123, 'text 1'])).to_sql
|
19
26
|
assert_equal %Q(SELECT "foos".* FROM "foos" WHERE "foos"."comp" = '(123,"text 1")'::compfoo), sql.gsub(/ +/, ' ')
|
20
27
|
end
|
21
28
|
|
22
|
-
|
29
|
+
test "create new record with compound object" do
|
23
30
|
foo = Foo.create!(comp: Compfoo.new([123, 'text 1']))
|
24
31
|
|
25
32
|
assert_kind_of Compfoo, foo.comp
|
@@ -28,7 +35,7 @@ class TestPostgresCompositeTypes < Test::Unit::TestCase
|
|
28
35
|
assert Foo.where(comp: Compfoo.new([123, 'text 1'])).exists?
|
29
36
|
end
|
30
37
|
|
31
|
-
|
38
|
+
test "create new record with hash" do
|
32
39
|
foo = Foo.create!(comp: {f1: 321, f2: 'text 2'})
|
33
40
|
|
34
41
|
assert_kind_of Compfoo, foo.comp
|
@@ -37,7 +44,7 @@ class TestPostgresCompositeTypes < Test::Unit::TestCase
|
|
37
44
|
assert Foo.where(comp: Compfoo.new({f1: 321, f2: 'text 2'})).exists?
|
38
45
|
end
|
39
46
|
|
40
|
-
|
47
|
+
test "create new record with array" do
|
41
48
|
foo = Foo.create!(comp: [111, 'text 3'])
|
42
49
|
|
43
50
|
assert_kind_of Compfoo, foo.comp
|
@@ -46,10 +53,19 @@ class TestPostgresCompositeTypes < Test::Unit::TestCase
|
|
46
53
|
assert Foo.where(comp: Compfoo.new({f1: 111, f2: 'text 3'})).exists?
|
47
54
|
end
|
48
55
|
|
49
|
-
|
56
|
+
test 'make object nil' do
|
50
57
|
foo = Foo.create!(comp: [333, 'ala ma kota'])
|
51
58
|
foo.comp = nil
|
52
59
|
|
53
60
|
assert_nil foo.comp
|
61
|
+
|
62
|
+
Foo.where(comp: Compfoo.new([333, 'ala ma kota'])).delete_all
|
54
63
|
end
|
64
|
+
|
65
|
+
test 'accept nil value' do
|
66
|
+
mt = MyValue.create!(value: nil)
|
67
|
+
assert_nil mt.value
|
68
|
+
|
69
|
+
MyValue.where(value: nil).delete_all
|
70
|
+
end
|
55
71
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgres-composite-types
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafal Bigaj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.1'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: shoulda
|
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
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rdoc
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -205,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
205
191
|
version: '0'
|
206
192
|
requirements: []
|
207
193
|
rubyforge_project:
|
208
|
-
rubygems_version: 2.4.
|
194
|
+
rubygems_version: 2.4.8
|
209
195
|
signing_key:
|
210
196
|
specification_version: 4
|
211
197
|
summary: ActiveRecord composite types support
|