activerecord-postgres-composite-types 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.travis.yml +7 -0
- data/Gemfile +18 -0
- data/LICENSE +21 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +67 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/activerecord-postgres-composite-types.gemspec +92 -0
- data/activerecord-postgres-custom-types.gemspec +91 -0
- data/lib/activerecord-postgres-composite-types.rb +13 -0
- data/lib/activerecord-postgres-composite-types/active_record.rb +166 -0
- data/lib/activerecord-postgres-composite-types/active_record_3.rb +104 -0
- data/lib/activerecord-postgres-composite-types/active_record_4.rb +103 -0
- data/lib/activerecord-postgres-composite-types/composite_type_parser.rb +95 -0
- data/lib/activerecord-postgres-composite-types/postgres_composite_type.rb +75 -0
- data/lib/activerecord-postgres-composite-types/railties.rb +16 -0
- data/test/composite_types.rb +16 -0
- data/test/helper.rb +44 -0
- data/test/internal/config/database.yml +5 -0
- data/test/internal/config/database.yml.travis +4 -0
- data/test/internal/db/schema.rb +19 -0
- data/test/test_composite_type_class.rb +41 -0
- data/test/test_nested_types.rb +18 -0
- data/test/test_postgres_composite_types.rb +48 -0
- metadata +212 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
require "activerecord-postgres-composite-types/active_record"
|
2
|
+
|
3
|
+
ActiveRecord::Schema.define do
|
4
|
+
execute "CREATE TYPE compfoo AS (f1 int, f2 text)"
|
5
|
+
execute "CREATE TYPE my_type AS (name varchar, number int, date timestamp)"
|
6
|
+
execute "CREATE DOMAIN rgb_color AS TEXT CHECK(VALUE IN ('red', 'green', 'blue'))"
|
7
|
+
execute "CREATE TYPE nested_type AS (comp compfoo, color rgb_color)"
|
8
|
+
|
9
|
+
create_table :foos, :id => false do |t|
|
10
|
+
t.column :comp, :compfoo, default: "(0,\"\")"
|
11
|
+
end
|
12
|
+
|
13
|
+
create_table :bars, :id => false do |t|
|
14
|
+
t.column :nested, :nested_type
|
15
|
+
end
|
16
|
+
|
17
|
+
execute "INSERT INTO foos VALUES ((0,'abc')), ((1,'a/b''c\\d e f'))"
|
18
|
+
execute "INSERT INTO bars VALUES (((0,'abc'),'red')), (((1,'cba'),'blue'))"
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestCompositeTypeClass < Test::Unit::TestCase
|
4
|
+
|
5
|
+
PostgreSQLColumn = ActiveRecord::ConnectionAdapters::PostgreSQLColumn
|
6
|
+
|
7
|
+
should "define accessors" do
|
8
|
+
assert MyType.method_defined?(:name)
|
9
|
+
assert MyType.method_defined?(:name=)
|
10
|
+
assert MyType.method_defined?(:number)
|
11
|
+
assert MyType.method_defined?(:number=)
|
12
|
+
assert MyType.method_defined?(:date)
|
13
|
+
assert MyType.method_defined?(:date=)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "be created by adapter from string" do
|
17
|
+
value = PostgreSQLColumn.string_to_composite_type(MyType, "(text,5,2014-08-27 00:00:00)")
|
18
|
+
assert_equal 'text', value.name
|
19
|
+
assert_equal 5, value.number
|
20
|
+
assert_equal Time.parse('2014-08-27 00:00:00 UTC'), value.date
|
21
|
+
end
|
22
|
+
|
23
|
+
should "accept escaped string" do
|
24
|
+
value = PostgreSQLColumn.string_to_composite_type(MyType, '("text\'s",125,"2014-08-27 10:00:00")')
|
25
|
+
assert_equal "text's", value.name
|
26
|
+
assert_equal 125, value.number
|
27
|
+
assert_equal Time.parse('2014-08-27 10:00:00 UTC'), value.date
|
28
|
+
end
|
29
|
+
|
30
|
+
should "initialize with hash" do
|
31
|
+
value = MyType.new(number: 1, name: 'abc', date: Time.parse('2014-08-27 12:00:00 UTC'))
|
32
|
+
assert_equal 'abc', value.name
|
33
|
+
assert_equal 1, value.number
|
34
|
+
assert_equal Time.parse('2014-08-27 12:00:00 UTC'), value.date
|
35
|
+
end
|
36
|
+
|
37
|
+
should "cast to qouted string" do
|
38
|
+
value = MyType.new(number: 1, name: '"\'a\'bc[]*/\"', date: Time.parse('2014-08-27 12:00:00 UTC'))
|
39
|
+
assert_equal %Q{'("\\\"''a''bc[]*/\\\\\\\"",1,2014-08-27 12:00:00.000000)'}, connection.quote(value)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestNestedTypes < Test::Unit::TestCase
|
4
|
+
class Bar < ActiveRecord::Base
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
should "cast value properly" do
|
9
|
+
bars = Bar.order('(nested).comp.f1').all
|
10
|
+
assert_equal 2, bars.size
|
11
|
+
assert_kind_of NestedType, bars[0].nested
|
12
|
+
assert_equal Compfoo.new([0,'abc']), bars[0].nested.comp
|
13
|
+
assert_equal 'red', bars[0].nested.color
|
14
|
+
assert_kind_of NestedType, bars[1].nested
|
15
|
+
assert_equal Compfoo.new([1,'cba']), bars[1].nested.comp
|
16
|
+
assert_equal 'blue', bars[1].nested.color
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestPostgresCompositeTypes < Test::Unit::TestCase
|
4
|
+
class Foo < ActiveRecord::Base
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
should "cast value properly" do
|
9
|
+
foos = Foo.all
|
10
|
+
assert_equal 2, foos.size
|
11
|
+
assert_equal 0, foos[0].comp.f1
|
12
|
+
assert_equal "abc", foos[0].comp.f2
|
13
|
+
assert_equal 1, foos[1].comp.f1
|
14
|
+
assert_equal "a/b'c\\d e f", foos[1].comp.f2
|
15
|
+
end
|
16
|
+
|
17
|
+
should "accept composite type in where clausure" do
|
18
|
+
sql = Foo.where(comp: Compfoo.new([123, 'text 1'])).to_sql
|
19
|
+
assert_equal %Q(SELECT "foos".* FROM "foos" WHERE "foos"."comp" = '(123,"text 1")'::compfoo), sql.gsub(/ +/, ' ')
|
20
|
+
end
|
21
|
+
|
22
|
+
should "create new record with compound object" do
|
23
|
+
foo = Foo.create!(comp: Compfoo.new([123, 'text 1']))
|
24
|
+
|
25
|
+
assert_kind_of Compfoo, foo.comp
|
26
|
+
assert_equal 123, foo.comp.f1
|
27
|
+
assert_equal 'text 1', foo.comp.f2
|
28
|
+
assert Foo.where(comp: Compfoo.new([123, 'text 1'])).exists?
|
29
|
+
end
|
30
|
+
|
31
|
+
should "create new record with hash" do
|
32
|
+
foo = Foo.create!(comp: {f1: 321, f2: 'text 2'})
|
33
|
+
|
34
|
+
assert_kind_of Compfoo, foo.comp
|
35
|
+
assert_equal 321, foo.comp.f1
|
36
|
+
assert_equal 'text 2', foo.comp.f2
|
37
|
+
assert Foo.where(comp: Compfoo.new({f1: 321, f2: 'text 2'})).exists?
|
38
|
+
end
|
39
|
+
|
40
|
+
should "create new record with array" do
|
41
|
+
foo = Foo.create!(comp: [111, 'text 3'])
|
42
|
+
|
43
|
+
assert_kind_of Compfoo, foo.comp
|
44
|
+
assert_equal 111, foo.comp.f1
|
45
|
+
assert_equal 'text 3', foo.comp.f2
|
46
|
+
assert Foo.where(comp: Compfoo.new({f1: 111, f2: 'text 3'})).exists?
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activerecord-postgres-composite-types
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rafal Bigaj
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-09 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: 3.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pg
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.17.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.17.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: test-unit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
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
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rdoc
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.12'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.12'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: jeweler
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.0.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.0.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
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: combustion
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ~>
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.5.2
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ~>
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.5.2
|
153
|
+
description: This gem adds support to the ActiveRecord (3.x and 4.x) for composite
|
154
|
+
types.
|
155
|
+
email: rafal.bigaj@puzzleflow.com
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files:
|
159
|
+
- LICENSE
|
160
|
+
- LICENSE.txt
|
161
|
+
- README.rdoc
|
162
|
+
files:
|
163
|
+
- .document
|
164
|
+
- .travis.yml
|
165
|
+
- Gemfile
|
166
|
+
- LICENSE
|
167
|
+
- LICENSE.txt
|
168
|
+
- README.rdoc
|
169
|
+
- Rakefile
|
170
|
+
- VERSION
|
171
|
+
- activerecord-postgres-composite-types.gemspec
|
172
|
+
- activerecord-postgres-custom-types.gemspec
|
173
|
+
- lib/activerecord-postgres-composite-types.rb
|
174
|
+
- lib/activerecord-postgres-composite-types/active_record.rb
|
175
|
+
- lib/activerecord-postgres-composite-types/active_record_3.rb
|
176
|
+
- lib/activerecord-postgres-composite-types/active_record_4.rb
|
177
|
+
- lib/activerecord-postgres-composite-types/composite_type_parser.rb
|
178
|
+
- lib/activerecord-postgres-composite-types/postgres_composite_type.rb
|
179
|
+
- lib/activerecord-postgres-composite-types/railties.rb
|
180
|
+
- test/composite_types.rb
|
181
|
+
- test/helper.rb
|
182
|
+
- test/internal/config/database.yml
|
183
|
+
- test/internal/config/database.yml.travis
|
184
|
+
- test/internal/db/schema.rb
|
185
|
+
- test/test_composite_type_class.rb
|
186
|
+
- test/test_nested_types.rb
|
187
|
+
- test/test_postgres_composite_types.rb
|
188
|
+
homepage: http://github.com/puzzleflow/activerecord-postgres-composite-types
|
189
|
+
licenses:
|
190
|
+
- MIT
|
191
|
+
metadata: {}
|
192
|
+
post_install_message:
|
193
|
+
rdoc_options: []
|
194
|
+
require_paths:
|
195
|
+
- lib
|
196
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
197
|
+
requirements:
|
198
|
+
- - '>='
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: '0'
|
201
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
|
+
requirements:
|
203
|
+
- - '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '0'
|
206
|
+
requirements: []
|
207
|
+
rubyforge_project:
|
208
|
+
rubygems_version: 2.0.3
|
209
|
+
signing_key:
|
210
|
+
specification_version: 4
|
211
|
+
summary: ActiveRecord composite types support
|
212
|
+
test_files: []
|