activerecord-postgres-composite-types 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ test:
2
+ adapter: postgresql
3
+ database: pg_composite_types_test
4
+ username: postgres
5
+ password: postgres
@@ -0,0 +1,4 @@
1
+ test:
2
+ adapter: postgresql
3
+ database: travis_ci_test
4
+ username: postgres
@@ -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: []