activerecord-postgres-composite-types 0.2.1
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 +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: []
|