rom-sql 2.0.0.beta2 → 2.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/lib/rom/plugins/relation/sql/postgres/explain.rb +54 -0
  4. data/lib/rom/sql.rb +1 -1
  5. data/lib/rom/sql/attribute.rb +17 -18
  6. data/lib/rom/sql/errors.rb +3 -0
  7. data/lib/rom/sql/extensions/mysql.rb +1 -1
  8. data/lib/rom/sql/extensions/mysql/type_builder.rb +28 -0
  9. data/lib/rom/sql/extensions/postgres.rb +3 -1
  10. data/lib/rom/sql/extensions/postgres/commands.rb +30 -13
  11. data/lib/rom/sql/extensions/postgres/{attributes_inferrer.rb → type_builder.rb} +24 -28
  12. data/lib/rom/sql/extensions/postgres/type_serializer.rb +39 -0
  13. data/lib/rom/sql/extensions/postgres/types.rb +24 -477
  14. data/lib/rom/sql/extensions/postgres/types/array.rb +163 -0
  15. data/lib/rom/sql/extensions/postgres/types/geometric.rb +135 -0
  16. data/lib/rom/sql/extensions/postgres/types/json.rb +235 -0
  17. data/lib/rom/sql/extensions/postgres/types/network.rb +15 -0
  18. data/lib/rom/sql/extensions/sqlite.rb +1 -1
  19. data/lib/rom/sql/extensions/sqlite/{attributes_inferrer.rb → type_builder.rb} +5 -5
  20. data/lib/rom/sql/extensions/sqlite/types.rb +8 -3
  21. data/lib/rom/sql/foreign_key.rb +17 -0
  22. data/lib/rom/sql/function.rb +86 -8
  23. data/lib/rom/sql/gateway.rb +26 -26
  24. data/lib/rom/sql/index.rb +4 -0
  25. data/lib/rom/sql/migration.rb +3 -3
  26. data/lib/rom/sql/migration/inline_runner.rb +9 -83
  27. data/lib/rom/sql/migration/migrator.rb +35 -12
  28. data/lib/rom/sql/migration/recorder.rb +21 -0
  29. data/lib/rom/sql/migration/runner.rb +115 -0
  30. data/lib/rom/sql/migration/schema_diff.rb +108 -53
  31. data/lib/rom/sql/migration/writer.rb +61 -0
  32. data/lib/rom/sql/relation.rb +2 -1
  33. data/lib/rom/sql/relation/reading.rb +63 -3
  34. data/lib/rom/sql/relation/writing.rb +38 -0
  35. data/lib/rom/sql/schema.rb +9 -3
  36. data/lib/rom/sql/schema/attributes_inferrer.rb +3 -119
  37. data/lib/rom/sql/schema/inferrer.rb +99 -18
  38. data/lib/rom/sql/schema/type_builder.rb +94 -0
  39. data/lib/rom/sql/type_dsl.rb +30 -0
  40. data/lib/rom/sql/type_extensions.rb +11 -6
  41. data/lib/rom/sql/type_serializer.rb +46 -0
  42. data/lib/rom/sql/types.rb +12 -0
  43. data/lib/rom/sql/version.rb +1 -1
  44. metadata +26 -244
  45. data/.codeclimate.yml +0 -15
  46. data/.gitignore +0 -17
  47. data/.rspec +0 -3
  48. data/.travis.yml +0 -39
  49. data/.yardopts +0 -2
  50. data/Gemfile +0 -33
  51. data/Guardfile +0 -24
  52. data/LICENSE.txt +0 -22
  53. data/Rakefile +0 -19
  54. data/circle.yml +0 -10
  55. data/lib/rom/sql/extensions/mysql/attributes_inferrer.rb +0 -10
  56. data/lib/rom/sql/relation/sequel_api.rb +0 -133
  57. data/log/.gitkeep +0 -0
  58. data/rom-sql.gemspec +0 -29
  59. data/spec/extensions/postgres/attribute_spec.rb +0 -217
  60. data/spec/extensions/postgres/integration_spec.rb +0 -59
  61. data/spec/extensions/postgres/types_spec.rb +0 -252
  62. data/spec/extensions/sqlite/types_spec.rb +0 -11
  63. data/spec/fixtures/migrations/20150403090603_create_carrots.rb +0 -8
  64. data/spec/integration/associations/many_to_many/custom_fks_spec.rb +0 -76
  65. data/spec/integration/associations/many_to_many/from_view_spec.rb +0 -88
  66. data/spec/integration/associations/many_to_many_spec.rb +0 -162
  67. data/spec/integration/associations/many_to_one/custom_fks_spec.rb +0 -64
  68. data/spec/integration/associations/many_to_one/from_view_spec.rb +0 -84
  69. data/spec/integration/associations/many_to_one/self_ref_spec.rb +0 -53
  70. data/spec/integration/associations/many_to_one_spec.rb +0 -117
  71. data/spec/integration/associations/one_to_many/custom_fks_spec.rb +0 -54
  72. data/spec/integration/associations/one_to_many/from_view_spec.rb +0 -57
  73. data/spec/integration/associations/one_to_many/self_ref_spec.rb +0 -54
  74. data/spec/integration/associations/one_to_many_spec.rb +0 -86
  75. data/spec/integration/associations/one_to_one_spec.rb +0 -69
  76. data/spec/integration/associations/one_to_one_through_spec.rb +0 -92
  77. data/spec/integration/auto_migrations/errors_spec.rb +0 -31
  78. data/spec/integration/auto_migrations/indexes_spec.rb +0 -253
  79. data/spec/integration/auto_migrations/managing_columns_spec.rb +0 -156
  80. data/spec/integration/auto_migrations/postgres/column_types_spec.rb +0 -63
  81. data/spec/integration/combine_with_spec.rb +0 -43
  82. data/spec/integration/commands/create_spec.rb +0 -304
  83. data/spec/integration/commands/delete_spec.rb +0 -84
  84. data/spec/integration/commands/update_spec.rb +0 -90
  85. data/spec/integration/commands/upsert_spec.rb +0 -83
  86. data/spec/integration/gateway_spec.rb +0 -107
  87. data/spec/integration/migration_spec.rb +0 -55
  88. data/spec/integration/plugins/associates/many_to_many_spec.rb +0 -69
  89. data/spec/integration/plugins/associates_spec.rb +0 -250
  90. data/spec/integration/plugins/auto_restrictions_spec.rb +0 -74
  91. data/spec/integration/relation_schema_spec.rb +0 -271
  92. data/spec/integration/schema/call_spec.rb +0 -24
  93. data/spec/integration/schema/inferrer/mysql_spec.rb +0 -45
  94. data/spec/integration/schema/inferrer/postgres_spec.rb +0 -203
  95. data/spec/integration/schema/inferrer/sqlite_spec.rb +0 -37
  96. data/spec/integration/schema/inferrer_spec.rb +0 -390
  97. data/spec/integration/schema/prefix_spec.rb +0 -16
  98. data/spec/integration/schema/qualified_spec.rb +0 -16
  99. data/spec/integration/schema/rename_spec.rb +0 -21
  100. data/spec/integration/schema/view_spec.rb +0 -29
  101. data/spec/integration/sequel_api_spec.rb +0 -36
  102. data/spec/integration/setup_spec.rb +0 -26
  103. data/spec/integration/support/active_support_notifications_spec.rb +0 -24
  104. data/spec/integration/support/rails_log_subscriber_spec.rb +0 -30
  105. data/spec/integration/wrap_spec.rb +0 -91
  106. data/spec/shared/accounts.rb +0 -48
  107. data/spec/shared/database_setup.rb +0 -70
  108. data/spec/shared/notes.rb +0 -23
  109. data/spec/shared/posts.rb +0 -34
  110. data/spec/shared/puppies.rb +0 -15
  111. data/spec/shared/relations.rb +0 -8
  112. data/spec/shared/users.rb +0 -32
  113. data/spec/shared/users_and_tasks.rb +0 -50
  114. data/spec/spec_helper.rb +0 -122
  115. data/spec/support/env_helper.rb +0 -25
  116. data/spec/support/helpers.rb +0 -24
  117. data/spec/support/oracle/create_users.sql +0 -7
  118. data/spec/support/oracle/set_sys_passwords.sql +0 -2
  119. data/spec/support/test_configuration.rb +0 -16
  120. data/spec/unit/attribute_spec.rb +0 -104
  121. data/spec/unit/function_spec.rb +0 -48
  122. data/spec/unit/gateway_spec.rb +0 -70
  123. data/spec/unit/logger_spec.rb +0 -14
  124. data/spec/unit/migration_tasks_spec.rb +0 -111
  125. data/spec/unit/migrator_spec.rb +0 -25
  126. data/spec/unit/order_dsl_spec.rb +0 -43
  127. data/spec/unit/plugin/associates_spec.rb +0 -94
  128. data/spec/unit/plugin/pagination_spec.rb +0 -91
  129. data/spec/unit/plugin/timestamp_spec.rb +0 -117
  130. data/spec/unit/projection_dsl_spec.rb +0 -110
  131. data/spec/unit/relation/assoc_spec.rb +0 -87
  132. data/spec/unit/relation/associations_spec.rb +0 -27
  133. data/spec/unit/relation/avg_spec.rb +0 -11
  134. data/spec/unit/relation/by_pk_spec.rb +0 -62
  135. data/spec/unit/relation/dataset_spec.rb +0 -50
  136. data/spec/unit/relation/distinct_spec.rb +0 -15
  137. data/spec/unit/relation/exclude_spec.rb +0 -11
  138. data/spec/unit/relation/exist_predicate_spec.rb +0 -25
  139. data/spec/unit/relation/exists_spec.rb +0 -18
  140. data/spec/unit/relation/fetch_spec.rb +0 -21
  141. data/spec/unit/relation/group_spec.rb +0 -61
  142. data/spec/unit/relation/having_spec.rb +0 -22
  143. data/spec/unit/relation/inner_join_spec.rb +0 -158
  144. data/spec/unit/relation/inspect_spec.rb +0 -11
  145. data/spec/unit/relation/instrument_spec.rb +0 -45
  146. data/spec/unit/relation/invert_spec.rb +0 -11
  147. data/spec/unit/relation/left_join_spec.rb +0 -55
  148. data/spec/unit/relation/lock_spec.rb +0 -93
  149. data/spec/unit/relation/map_spec.rb +0 -16
  150. data/spec/unit/relation/max_spec.rb +0 -11
  151. data/spec/unit/relation/min_spec.rb +0 -11
  152. data/spec/unit/relation/order_spec.rb +0 -51
  153. data/spec/unit/relation/pluck_spec.rb +0 -11
  154. data/spec/unit/relation/prefix_spec.rb +0 -29
  155. data/spec/unit/relation/primary_key_spec.rb +0 -27
  156. data/spec/unit/relation/project_spec.rb +0 -24
  157. data/spec/unit/relation/qualified_columns_spec.rb +0 -30
  158. data/spec/unit/relation/qualified_spec.rb +0 -25
  159. data/spec/unit/relation/read_spec.rb +0 -25
  160. data/spec/unit/relation/rename_spec.rb +0 -23
  161. data/spec/unit/relation/right_join_spec.rb +0 -57
  162. data/spec/unit/relation/select_append_spec.rb +0 -21
  163. data/spec/unit/relation/select_spec.rb +0 -40
  164. data/spec/unit/relation/sum_spec.rb +0 -11
  165. data/spec/unit/relation/union_spec.rb +0 -19
  166. data/spec/unit/relation/unique_predicate_spec.rb +0 -18
  167. data/spec/unit/relation/where_spec.rb +0 -133
  168. data/spec/unit/restriction_dsl_spec.rb +0 -34
  169. data/spec/unit/schema_spec.rb +0 -25
  170. data/spec/unit/types_spec.rb +0 -65
@@ -1,59 +0,0 @@
1
- RSpec.describe 'PostgreSQL extension', :postgres do
2
- include_context 'database setup'
3
-
4
- before do
5
- conn.drop_table?(:pg_people)
6
- conn.drop_table?(:people)
7
-
8
- conn.create_table :pg_people do
9
- primary_key :id
10
- String :name
11
- column :tags, "text[]"
12
- end
13
-
14
- conf.relation(:people) do
15
- schema(:pg_people, infer: true)
16
- end
17
-
18
- conf.commands(:people) do
19
- define(:create)
20
- define(:update)
21
- end
22
- end
23
-
24
- let(:people_relation) { relations[:people] }
25
-
26
- describe 'using arrays' do
27
- let(:people) { commands[:people] }
28
-
29
- it 'inserts array values' do
30
- people.create.call(name: 'John Doe', tags: ['foo'])
31
- expect(people_relation.to_a).to eq([id: 1, name: 'John Doe', tags: ['foo']])
32
- end
33
-
34
- it 'inserts empty arrays' do
35
- people.create.call(name: 'John Doe', tags: [])
36
- expect(people_relation.to_a).to eq([id: 1, name: 'John Doe', tags: []])
37
- end
38
- end
39
-
40
- describe 'using retrurning' do
41
- let(:create_person) { commands[:people].create }
42
- let(:update_person) { commands[:people].update }
43
- let(:composite_relation) { people_relation >> -> r { r.to_a.map { |x| x.fetch(:name).upcase } } }
44
-
45
- context 'with pipeline' do
46
- it 'works with create' do
47
- mapped_people = create_person.new(composite_relation).call(name: 'John Doe', tags: ['foo'])
48
- expect(mapped_people).to eql(['JOHN DOE'])
49
- end
50
-
51
- it 'works with update' do
52
- create_person.call(name: 'John Doe', tags: ['foo'])
53
-
54
- mapped_people = update_person.new(composite_relation).call(name: 'Jane Doe')
55
- expect(mapped_people).to eql(['JANE DOE'])
56
- end
57
- end
58
- end
59
- end
@@ -1,252 +0,0 @@
1
- RSpec.describe 'ROM::SQL::Types' do
2
- describe 'ROM::SQL::Types::PG::JSON' do
3
- it 'coerces to pg json hash' do
4
- input = { foo: 'bar' }
5
-
6
- expect(ROM::SQL::Types::PG::JSON[input]).to eql(Sequel.pg_json(input))
7
- end
8
-
9
- it 'coerces to pg json array' do
10
- input = [1, 2, 3]
11
- output = ROM::SQL::Types::PG::JSON[input]
12
-
13
- expect(output).to be_instance_of(Sequel::Postgres::JSONArray)
14
- expect(output.to_a).to eql(input)
15
- end
16
- end
17
-
18
- describe 'ROM::SQL::Types::PG::Bytea' do
19
- it 'coerces strings to Sequel::SQL::Blob' do
20
- input = 'sutin'
21
- output = ROM::SQL::Types::PG::Bytea[input]
22
-
23
- expect(output).to be_instance_of(Sequel::SQL::Blob)
24
- expect(output).to eql('sutin')
25
- end
26
- end
27
-
28
- describe ROM::SQL::Types::PG::UUID do
29
- it 'coerces strings to UUID' do
30
- input = SecureRandom.uuid
31
- output = described_class[input]
32
-
33
- expect(output).to be_instance_of(String)
34
- end
35
- end
36
-
37
- describe ROM::SQL::Types::PG::Array do
38
- it 'coerces to pg array' do
39
- input = [1, 2, 3]
40
- output = ROM::SQL::Types::PG::Array('integer')[input]
41
-
42
- expect(output).to be_instance_of(Sequel::Postgres::PGArray)
43
- expect(output.to_a).to eql(input)
44
- end
45
-
46
- it 'accepts any other type of objects' do
47
- input = [nil, 1, 'sutin', :sutin, 1.0, {}].sample
48
- output = ROM::SQL::Types::PG::Array('integer')[input]
49
-
50
- expect(output).to be_instance_of(Sequel::Postgres::ArrayOp)
51
- expect(output.value).to eql(input)
52
- end
53
- end
54
-
55
- describe ROM::SQL::Types::PG::JSON do
56
- it 'coerces to pg json hash' do
57
- input = { foo: 'bar' }
58
- output = described_class[input]
59
-
60
- expect(output).to be_instance_of(Sequel::Postgres::JSONHash)
61
- expect(output).to eql(Sequel.pg_json(input))
62
- end
63
-
64
- it 'coerces to pg json array' do
65
- input = [1, 2, 3]
66
- output = described_class[input]
67
-
68
- expect(output).to be_instance_of(Sequel::Postgres::JSONArray)
69
- expect(output.to_a).to eql(input)
70
- end
71
-
72
- it 'accepts any other type of objects' do
73
- input = [nil, 1, 'sutin', :sutin, 1.0].sample
74
- output = described_class[input]
75
-
76
- expect(output).to be_instance_of(Sequel::Postgres::JSONOp)
77
- expect(output.value).to eql(input)
78
- end
79
- end
80
-
81
- describe ROM::SQL::Types::PG::JSONB do
82
- it 'coerces to pg jsonb hash' do
83
- input = { foo: 'bar' }
84
- output = described_class[input]
85
-
86
- expect(output).to be_instance_of(Sequel::Postgres::JSONBHash)
87
- expect(output).to eql(Sequel.pg_jsonb(input))
88
- end
89
-
90
- it 'coerces to pg jsonb array' do
91
- input = [1, 2, 3]
92
- output = described_class[input]
93
-
94
- expect(output).to be_instance_of(Sequel::Postgres::JSONBArray)
95
- expect(output.to_a).to eql(input)
96
- end
97
-
98
- it 'accepts any other type of objects' do
99
- input = [nil, 1, 'sutin', :sutin, 1.0].sample
100
- output = described_class[input]
101
-
102
- expect(output).to be_instance_of(Sequel::Postgres::JSONBOp)
103
- expect(output.value).to eql(input)
104
- end
105
- end
106
-
107
- describe ROM::SQL::Types::PG::Money do
108
- it 'coerces to pg Money' do
109
- input = BigDecimal.new(1.0, 2)
110
- output = described_class[input]
111
-
112
- expect(output).to be_instance_of(BigDecimal)
113
- end
114
- end
115
-
116
- describe ROM::SQL::Types::PG::IPAddress do
117
- it 'converts IPAddr to a string' do
118
- expect(described_class[IPAddr.new('127.0.0.1')]).to eql('127.0.0.1')
119
- end
120
-
121
- it 'coerces to builtin IPAddr type on read' do
122
- expect(described_class.meta[:read]['127.0.0.1']).to eql(IPAddr.new('127.0.0.1'))
123
- end
124
-
125
- it 'supports networks' do
126
- class_a = described_class.meta[:read]['10.0.0.0/8']
127
-
128
- expect(class_a).to eql(IPAddr.new('10.0.0.0/8'))
129
- expect(class_a).to include(IPAddr.new('10.8.8.8'))
130
- end
131
- end
132
-
133
- describe ROM::SQL::Types::PG::PointT do
134
- let(:point) { ROM::SQL::Types::PG::Point.new(7.5, 30.5) }
135
-
136
- it 'serializes a point down to a string' do
137
- expect(described_class[point]).to eql('(7.5,30.5)')
138
- end
139
-
140
- it 'reads serialized format' do
141
- expect(described_class.meta[:read]['(7.5,30.5)']).to eql(point)
142
- end
143
- end
144
-
145
- describe ROM::SQL::Types::PG::HStore do
146
- let(:mapping) { Hash['hot' => 'cold'] }
147
- let(:read_type) { described_class.meta[:read] }
148
-
149
- it 'covertss data to Sequel::Postgres::HStore' do
150
- expect(described_class[mapping]).to be_a Sequel::Postgres::HStore
151
- expect(described_class[mapping]).to eql(Sequel.hstore(hot: :cold))
152
- end
153
-
154
- it 'reads Sequel::Postgres::HStore as a Hash object' do
155
- expect(read_type[Sequel.hstore(mapping)]).to eql(mapping)
156
- expect(read_type[Sequel.hstore(mapping)]).to be_a(Hash)
157
- end
158
- end
159
-
160
- describe ROM::SQL::Types::PG::LineT do
161
- let(:line) { ROM::SQL::Types::PG::Line.new(2.3, 4.9, 3.1415) }
162
-
163
- it 'serializes a line using the {A,B,C} format' do
164
- expect(described_class[line]).to eql('{2.3,4.9,3.1415}')
165
- end
166
-
167
- it 'reads the {A,B,C} format' do
168
- expect(described_class.meta[:read]['{2.3,4.9,3.1415}']).to eql(line)
169
- end
170
- end
171
-
172
- describe ROM::SQL::Types::PG::CircleT do
173
- let(:center) { ROM::SQL::Types::PG::Point.new(7.5, 30.5) }
174
- let(:circle) { ROM::SQL::Types::PG::Circle.new(center, 1.2) }
175
-
176
- it 'serializes a circle using the <(x,y),r> format' do
177
- expect(described_class[circle]).to eql('<(7.5,30.5),1.2>')
178
- end
179
-
180
- it 'reads the <(x,y),r> format' do
181
- expect(described_class.meta[:read]['<(7.5,30.5),1.2>']).to eql(circle)
182
- end
183
- end
184
-
185
- describe ROM::SQL::Types::PG::BoxT do
186
- let(:lower_left) { ROM::SQL::Types::PG::Point.new(7.5, 20.5) }
187
- let(:upper_right) { ROM::SQL::Types::PG::Point.new(8.5, 30.5) }
188
-
189
- let(:box) { ROM::SQL::Types::PG::Box.new(upper_right, lower_left) }
190
-
191
- it 'serializes a box' do
192
- expect(described_class[box]).to eql('((8.5,30.5),(7.5,20.5))')
193
- end
194
-
195
- it 'reads serialized format' do
196
- expect(described_class.meta[:read]['((8.5,30.5),(7.5,20.5))']).to eql(box)
197
- end
198
- end
199
-
200
- describe ROM::SQL::Types::PG::LineSegmentT do
201
- let(:first) { ROM::SQL::Types::PG::Point.new(8.5, 30.5) }
202
- let(:second) { ROM::SQL::Types::PG::Point.new(7.5, 20.5) }
203
-
204
- let(:lseg) { ROM::SQL::Types::PG::LineSegment.new(first, second) }
205
-
206
- it 'serializes a lseg using [ ( x1 , y1 ) , ( x2 , y2 ) ] format' do
207
- expect(described_class[lseg]).to eql('[(8.5,30.5),(7.5,20.5)]')
208
- end
209
-
210
- it 'reads serialized format' do
211
- expect(described_class.meta[:read]['[(8.5,30.5),(7.5,20.5)]']).to eql(lseg)
212
- end
213
- end
214
-
215
- describe ROM::SQL::Types::PG::PolygonT do
216
- let(:first) { ROM::SQL::Types::PG::Point.new(8.5, 30.5) }
217
- let(:second) { ROM::SQL::Types::PG::Point.new(7.5, 20.5) }
218
- let(:third) { ROM::SQL::Types::PG::Point.new(6.5, 10.5) }
219
-
220
- let(:polygon) { ROM::SQL::Types::PG::Polygon[[first, second, third]] }
221
-
222
- it 'serializes a polygon using ( ( x1 , y1 ) ... ( xn , yn ) ) format' do
223
- expect(described_class[polygon]).to eql('((8.5,30.5),(7.5,20.5),(6.5,10.5))')
224
- end
225
-
226
- it 'reads serialized format' do
227
- expect(described_class.meta[:read]['((8.5,30.5),(7.5,20.5),(6.5,10.5))']).to eql(polygon)
228
- end
229
- end
230
-
231
- describe ROM::SQL::Types::PG::PathT do
232
- let(:first) { ROM::SQL::Types::PG::Point.new(8.5, 30.5) }
233
- let(:second) { ROM::SQL::Types::PG::Point.new(7.5, 20.5) }
234
- let(:third) { ROM::SQL::Types::PG::Point.new(6.5, 10.5) }
235
-
236
- let(:closed_path) { ROM::SQL::Types::PG::Path.new([first, second, third], :closed) }
237
- let(:open_path) { ROM::SQL::Types::PG::Path.new([first, second, third], :open) }
238
-
239
- it 'serializes a closed path using ( ( x1 , y1 ) ... ( xn , yn ) ) format' do
240
- expect(described_class[closed_path]).to eql('((8.5,30.5),(7.5,20.5),(6.5,10.5))')
241
- end
242
-
243
- it 'serializes an open path' do
244
- expect(described_class[open_path]).to eql('[(8.5,30.5),(7.5,20.5),(6.5,10.5)]')
245
- end
246
-
247
- it 'reads serialized format' do
248
- expect(described_class.meta[:read]['((8.5,30.5),(7.5,20.5),(6.5,10.5))']).to eql(closed_path)
249
- expect(described_class.meta[:read]['[(8.5,30.5),(7.5,20.5),(6.5,10.5)]']).to eql(open_path)
250
- end
251
- end
252
- end
@@ -1,11 +0,0 @@
1
- RSpec.describe 'ROM::SQL::Types' do
2
- describe 'ROM::SQL::Types::SQLite::Object' do
3
- let(:type) { ROM::SQL::Types::SQLite::Object }
4
-
5
- it 'passes an object of any type' do
6
- [Object.new, 1, true, BasicObject.new].each do |obj|
7
- expect(type[obj]).to be obj
8
- end
9
- end
10
- end
11
- end
@@ -1,8 +0,0 @@
1
- ROM::SQL.migration do
2
- change do
3
- create_table :carrots do
4
- primary_key :id
5
- String :name
6
- end
7
- end
8
- end
@@ -1,76 +0,0 @@
1
- RSpec.describe ROM::SQL::Associations::ManyToMany, '#call' do
2
- include_context 'users'
3
-
4
- before do
5
- inferrable_relations.concat %i(puzzles puzzle_solvers)
6
- end
7
-
8
- subject(:assoc) do
9
- relations[:users].associations[:puzzles]
10
- end
11
-
12
- let(:puzzles) { relations[:puzzles] }
13
- let(:puzzle_solvers) { relations[:puzzle_solvers] }
14
-
15
- with_adapters do
16
- before do
17
- conn.create_table(:puzzles) do
18
- primary_key :id
19
- column :text, String, null: false
20
- end
21
-
22
- conn.create_table(:puzzle_solvers) do
23
- foreign_key :solver_id, :users, null: false
24
- foreign_key :puzzle_id, :puzzles, null: false
25
- primary_key [:solver_id, :puzzle_id]
26
- end
27
-
28
- conf.relation(:puzzles) { schema(infer: true) }
29
-
30
- conf.relation(:puzzle_solvers) do
31
- schema(infer: true) do
32
- associations do
33
- belongs_to :user, foreign_key: :solver_id
34
- belongs_to :puzzle
35
- end
36
- end
37
- end
38
-
39
- conf.relation(:users) do
40
- schema(infer: true) do
41
- associations do
42
- has_many :puzzle_solvers
43
- has_many :puzzles, through: :puzzle_solvers, foreign_key: :solver_id
44
- end
45
- end
46
- end
47
-
48
- p1_id = relations[:puzzles].insert(text: 'P1')
49
- p2_id = relations[:puzzles].insert(text: 'P2')
50
- p3_id = relations[:puzzles].insert(text: 'P3')
51
-
52
- relations[:puzzle_solvers].insert(solver_id: joe_id, puzzle_id: p2_id)
53
- relations[:puzzle_solvers].insert(solver_id: jane_id, puzzle_id: p2_id)
54
-
55
- relations[:puzzle_solvers].insert(solver_id: joe_id, puzzle_id: p1_id)
56
- relations[:puzzle_solvers].insert(solver_id: jane_id, puzzle_id: p3_id)
57
- end
58
-
59
- it 'prepares joined relations using custom FK' do
60
- relation = assoc.().order(puzzles[:text].qualified, puzzle_solvers[:solver_id].qualified)
61
-
62
- expect(relation.schema.map(&:to_sql_name)).
63
- to eql([Sequel.qualify(:puzzles, :id),
64
- Sequel.qualify(:puzzles, :text),
65
- Sequel.qualify(:puzzle_solvers, :solver_id)])
66
-
67
- expect(relation.to_a).
68
- to eql([
69
- { id: 1, solver_id: 2, text: 'P1' },
70
- { id: 2, solver_id: 1, text: 'P2' },
71
- { id: 2, solver_id: 2, text: 'P2' },
72
- { id: 3, solver_id: 1, text: 'P3' }
73
- ])
74
- end
75
- end
76
- end
@@ -1,88 +0,0 @@
1
- RSpec.describe ROM::SQL::Associations::ManyToMany, '#call' do
2
- include_context 'users'
3
-
4
- before do
5
- inferrable_relations.concat %i(puzzles puzzle_solvers)
6
- end
7
-
8
- subject(:assoc) do
9
- relations[:users].associations[:solved_puzzles]
10
- end
11
-
12
- let(:puzzles) { relations[:puzzles] }
13
- let(:puzzle_solvers) { relations[:puzzle_solvers] }
14
-
15
- with_adapters do
16
- before do
17
- conn.create_table(:puzzles) do
18
- primary_key :id
19
- column :text, String, null: false
20
- column :solved, TrueClass, null: false, default: false
21
- end
22
-
23
- conn.create_table(:puzzle_solvers) do
24
- foreign_key :user_id, :users, null: false
25
- foreign_key :puzzle_id, :puzzles, null: false
26
- primary_key [:user_id, :puzzle_id]
27
- end
28
-
29
- conf.relation(:puzzles) do
30
- schema(infer: true)
31
-
32
- view(:solved, schema) do
33
- where(solved: true)
34
- end
35
- end
36
-
37
- conf.relation(:puzzle_solvers) do
38
- schema(infer: true) do
39
- associations do
40
- belongs_to :user
41
- belongs_to :puzzle
42
- end
43
- end
44
- end
45
-
46
- conf.relation(:users) do
47
- schema(infer: true) do
48
- associations do
49
- has_many :puzzle_solvers
50
- has_many :puzzles, through: :puzzle_solvers
51
- has_many :puzzles, through: :puzzle_solvers, as: :solved_puzzles, view: :solved
52
- end
53
- end
54
- end
55
-
56
- p1_id = relations[:puzzles].insert(text: 'P1')
57
- p2_id = relations[:puzzles].insert(text: 'P2', solved: true)
58
- p3_id = relations[:puzzles].insert(text: 'P3')
59
-
60
- relations[:puzzle_solvers].insert(user_id: joe_id, puzzle_id: p2_id)
61
- relations[:puzzle_solvers].insert(user_id: jane_id, puzzle_id: p2_id)
62
-
63
- relations[:puzzle_solvers].insert(user_id: joe_id, puzzle_id: p1_id)
64
- relations[:puzzle_solvers].insert(user_id: jane_id, puzzle_id: p3_id)
65
- end
66
-
67
- after do
68
- conn.drop_table?(:puzzle_solvers)
69
- conn.drop_table?(:puzzles)
70
- end
71
-
72
- it 'prepares joined relations using custom FK' do
73
- relation = assoc.().order(puzzles[:text].qualified, puzzle_solvers[:user_id].qualified)
74
-
75
- expect(relation.schema.map(&:to_sql_name)).
76
- to eql([Sequel.qualify(:puzzles, :id),
77
- Sequel.qualify(:puzzles, :text),
78
- Sequel.qualify(:puzzles, :solved),
79
- Sequel.qualify(:puzzle_solvers, :user_id)])
80
-
81
- expect(relation.to_a).
82
- to eql([
83
- { id: 2, user_id: 1, solved: db_true, text: 'P2' },
84
- { id: 2, user_id: 2, solved: db_true, text: 'P2' }
85
- ])
86
- end
87
- end
88
- end