rom 3.3.3 → 4.0.0.beta1

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.
Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -599
  3. data/lib/rom/version.rb +1 -1
  4. data/lib/rom.rb +3 -44
  5. metadata +19 -295
  6. data/.gitignore +0 -24
  7. data/.rspec +0 -3
  8. data/.rubocop.yml +0 -87
  9. data/.rubocop_todo.yml +0 -46
  10. data/.travis.yml +0 -24
  11. data/.yardopts +0 -2
  12. data/CODE_OF_CONDUCT.md +0 -13
  13. data/CONTRIBUTING.md +0 -1
  14. data/Gemfile +0 -54
  15. data/Guardfile +0 -24
  16. data/Rakefile +0 -28
  17. data/lib/rom/array_dataset.rb +0 -44
  18. data/lib/rom/association_set.rb +0 -49
  19. data/lib/rom/auto_curry.rb +0 -55
  20. data/lib/rom/command.rb +0 -494
  21. data/lib/rom/command_registry.rb +0 -148
  22. data/lib/rom/commands/class_interface.rb +0 -270
  23. data/lib/rom/commands/composite.rb +0 -53
  24. data/lib/rom/commands/create.rb +0 -13
  25. data/lib/rom/commands/delete.rb +0 -14
  26. data/lib/rom/commands/graph/builder.rb +0 -176
  27. data/lib/rom/commands/graph/class_interface.rb +0 -62
  28. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  29. data/lib/rom/commands/graph.rb +0 -95
  30. data/lib/rom/commands/lazy/create.rb +0 -23
  31. data/lib/rom/commands/lazy/delete.rb +0 -27
  32. data/lib/rom/commands/lazy/update.rb +0 -34
  33. data/lib/rom/commands/lazy.rb +0 -99
  34. data/lib/rom/commands/result.rb +0 -96
  35. data/lib/rom/commands/update.rb +0 -14
  36. data/lib/rom/commands.rb +0 -3
  37. data/lib/rom/configuration.rb +0 -90
  38. data/lib/rom/configuration_dsl/command.rb +0 -41
  39. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  40. data/lib/rom/configuration_dsl/mapper.rb +0 -36
  41. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -43
  42. data/lib/rom/configuration_dsl/relation.rb +0 -26
  43. data/lib/rom/configuration_dsl.rb +0 -107
  44. data/lib/rom/configuration_plugin.rb +0 -17
  45. data/lib/rom/constants.rb +0 -36
  46. data/lib/rom/container.rb +0 -233
  47. data/lib/rom/create_container.rb +0 -60
  48. data/lib/rom/data_proxy.rb +0 -94
  49. data/lib/rom/enumerable_dataset.rb +0 -68
  50. data/lib/rom/environment.rb +0 -70
  51. data/lib/rom/gateway.rb +0 -196
  52. data/lib/rom/global/plugin_dsl.rb +0 -47
  53. data/lib/rom/global.rb +0 -58
  54. data/lib/rom/initializer.rb +0 -26
  55. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  56. data/lib/rom/lint/gateway.rb +0 -120
  57. data/lib/rom/lint/linter.rb +0 -78
  58. data/lib/rom/lint/spec.rb +0 -20
  59. data/lib/rom/lint/test.rb +0 -98
  60. data/lib/rom/mapper_registry.rb +0 -35
  61. data/lib/rom/memory/commands.rb +0 -56
  62. data/lib/rom/memory/dataset.rb +0 -97
  63. data/lib/rom/memory/gateway.rb +0 -64
  64. data/lib/rom/memory/relation.rb +0 -62
  65. data/lib/rom/memory/schema.rb +0 -13
  66. data/lib/rom/memory/storage.rb +0 -59
  67. data/lib/rom/memory/types.rb +0 -9
  68. data/lib/rom/memory.rb +0 -4
  69. data/lib/rom/pipeline.rb +0 -122
  70. data/lib/rom/plugin.rb +0 -20
  71. data/lib/rom/plugin_base.rb +0 -40
  72. data/lib/rom/plugin_registry.rb +0 -173
  73. data/lib/rom/plugins/command/schema.rb +0 -37
  74. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -21
  75. data/lib/rom/plugins/relation/instrumentation.rb +0 -51
  76. data/lib/rom/plugins/relation/key_inference.rb +0 -48
  77. data/lib/rom/plugins/relation/registry_reader.rb +0 -33
  78. data/lib/rom/registry.rb +0 -50
  79. data/lib/rom/relation/class_interface.rb +0 -356
  80. data/lib/rom/relation/composite.rb +0 -46
  81. data/lib/rom/relation/curried.rb +0 -109
  82. data/lib/rom/relation/graph.rb +0 -125
  83. data/lib/rom/relation/loaded.rb +0 -127
  84. data/lib/rom/relation/materializable.rb +0 -66
  85. data/lib/rom/relation/name.rb +0 -102
  86. data/lib/rom/relation/view_dsl.rb +0 -64
  87. data/lib/rom/relation.rb +0 -250
  88. data/lib/rom/relation_registry.rb +0 -9
  89. data/lib/rom/schema/attribute.rb +0 -390
  90. data/lib/rom/schema/dsl.rb +0 -67
  91. data/lib/rom/schema.rb +0 -407
  92. data/lib/rom/setup/auto_registration.rb +0 -74
  93. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -16
  94. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -63
  95. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -20
  96. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  97. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  98. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  99. data/lib/rom/setup/finalize/finalize_relations.rb +0 -83
  100. data/lib/rom/setup/finalize.rb +0 -152
  101. data/lib/rom/setup.rb +0 -65
  102. data/lib/rom/support/configurable.rb +0 -85
  103. data/lib/rom/transaction.rb +0 -24
  104. data/lib/rom/types.rb +0 -49
  105. data/log/.gitkeep +0 -0
  106. data/rakelib/benchmark.rake +0 -15
  107. data/rakelib/mutant.rake +0 -19
  108. data/rakelib/rubocop.rake +0 -18
  109. data/rom.gemspec +0 -25
  110. data/spec/fixtures/app/commands/create_user.rb +0 -2
  111. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  112. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  113. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  114. data/spec/fixtures/app/my_relations/users.rb +0 -2
  115. data/spec/fixtures/app/relations/users.rb +0 -2
  116. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  117. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  118. data/spec/fixtures/custom/relations/users.rb +0 -6
  119. data/spec/fixtures/custom_namespace/commands/create_customer.rb +0 -8
  120. data/spec/fixtures/custom_namespace/mappers/customer_list.rb +0 -8
  121. data/spec/fixtures/custom_namespace/relations/customers.rb +0 -8
  122. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  123. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  124. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  125. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  126. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  127. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  128. data/spec/fixtures/wrong/commands/create_customer.rb +0 -8
  129. data/spec/fixtures/wrong/mappers/customer_list.rb +0 -8
  130. data/spec/fixtures/wrong/relations/customers.rb +0 -8
  131. data/spec/integration/command_registry_spec.rb +0 -47
  132. data/spec/integration/commands/create_spec.rb +0 -157
  133. data/spec/integration/commands/delete_spec.rb +0 -67
  134. data/spec/integration/commands/error_handling_spec.rb +0 -25
  135. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  136. data/spec/integration/commands/graph_spec.rb +0 -294
  137. data/spec/integration/commands/update_spec.rb +0 -86
  138. data/spec/integration/commands_spec.rb +0 -67
  139. data/spec/integration/gateways/extending_relations_spec.rb +0 -58
  140. data/spec/integration/gateways/setting_logger_spec.rb +0 -34
  141. data/spec/integration/mappers/combine_spec.rb +0 -117
  142. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  143. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  144. data/spec/integration/mappers/embedded_spec.rb +0 -62
  145. data/spec/integration/mappers/exclude_spec.rb +0 -27
  146. data/spec/integration/mappers/fold_spec.rb +0 -71
  147. data/spec/integration/mappers/group_spec.rb +0 -163
  148. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  149. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  150. data/spec/integration/mappers/prefix_spec.rb +0 -48
  151. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  152. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  153. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  154. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  155. data/spec/integration/mappers/step_spec.rb +0 -119
  156. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  157. data/spec/integration/mappers/unfold_spec.rb +0 -92
  158. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  159. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  160. data/spec/integration/mappers/wrap_spec.rb +0 -155
  161. data/spec/integration/memory/commands/create_spec.rb +0 -23
  162. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  163. data/spec/integration/memory/commands/update_spec.rb +0 -23
  164. data/spec/integration/multi_env_spec.rb +0 -69
  165. data/spec/integration/multi_repo_spec.rb +0 -46
  166. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  167. data/spec/integration/relations/inheritance_spec.rb +0 -37
  168. data/spec/integration/relations/reading_spec.rb +0 -169
  169. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  170. data/spec/integration/setup_spec.rb +0 -193
  171. data/spec/shared/command_behavior.rb +0 -28
  172. data/spec/shared/command_graph.rb +0 -54
  173. data/spec/shared/container.rb +0 -9
  174. data/spec/shared/enumerable_dataset.rb +0 -52
  175. data/spec/shared/gateway_only.rb +0 -6
  176. data/spec/shared/materializable.rb +0 -36
  177. data/spec/shared/no_container.rb +0 -16
  178. data/spec/shared/one_behavior.rb +0 -26
  179. data/spec/shared/proxy.rb +0 -0
  180. data/spec/shared/users_and_tasks.rb +0 -10
  181. data/spec/spec_helper.rb +0 -59
  182. data/spec/support/constant_leak_finder.rb +0 -14
  183. data/spec/support/mutant.rb +0 -10
  184. data/spec/support/schema.rb +0 -14
  185. data/spec/support/types.rb +0 -5
  186. data/spec/test/memory_repository_lint_test.rb +0 -27
  187. data/spec/unit/rom/array_dataset_spec.rb +0 -59
  188. data/spec/unit/rom/association_set_spec.rb +0 -48
  189. data/spec/unit/rom/auto_curry_spec.rb +0 -71
  190. data/spec/unit/rom/commands/graph_spec.rb +0 -192
  191. data/spec/unit/rom/commands/lazy_spec.rb +0 -310
  192. data/spec/unit/rom/commands/pre_and_post_processors_spec.rb +0 -343
  193. data/spec/unit/rom/commands/result_spec.rb +0 -70
  194. data/spec/unit/rom/commands_spec.rb +0 -188
  195. data/spec/unit/rom/configurable_spec.rb +0 -49
  196. data/spec/unit/rom/configuration_spec.rb +0 -61
  197. data/spec/unit/rom/container_spec.rb +0 -109
  198. data/spec/unit/rom/create_container_spec.rb +0 -151
  199. data/spec/unit/rom/enumerable_dataset_spec.rb +0 -15
  200. data/spec/unit/rom/environment_spec.rb +0 -123
  201. data/spec/unit/rom/gateway_spec.rb +0 -146
  202. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  203. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  204. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  205. data/spec/unit/rom/memory/gateway_spec.rb +0 -12
  206. data/spec/unit/rom/memory/inheritance_spec.rb +0 -32
  207. data/spec/unit/rom/memory/relation_spec.rb +0 -121
  208. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  209. data/spec/unit/rom/plugin_spec.rb +0 -150
  210. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  211. data/spec/unit/rom/plugins/relation/instrumentation_spec.rb +0 -44
  212. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  213. data/spec/unit/rom/registry_spec.rb +0 -86
  214. data/spec/unit/rom/relation/attribute_reader_spec.rb +0 -17
  215. data/spec/unit/rom/relation/call_spec.rb +0 -51
  216. data/spec/unit/rom/relation/composite_spec.rb +0 -106
  217. data/spec/unit/rom/relation/curried_spec.rb +0 -67
  218. data/spec/unit/rom/relation/graph_spec.rb +0 -106
  219. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  220. data/spec/unit/rom/relation/lazy/graph_spec.rb +0 -165
  221. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  222. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  223. data/spec/unit/rom/relation/name_spec.rb +0 -58
  224. data/spec/unit/rom/relation/output_schema_spec.rb +0 -28
  225. data/spec/unit/rom/relation/schema_spec.rb +0 -259
  226. data/spec/unit/rom/relation/view_spec.rb +0 -158
  227. data/spec/unit/rom/relation_spec.rb +0 -252
  228. data/spec/unit/rom/schema/accessing_attributes_spec.rb +0 -52
  229. data/spec/unit/rom/schema/append_spec.rb +0 -17
  230. data/spec/unit/rom/schema/exclude_spec.rb +0 -15
  231. data/spec/unit/rom/schema/finalize_spec.rb +0 -59
  232. data/spec/unit/rom/schema/key_predicate_spec.rb +0 -15
  233. data/spec/unit/rom/schema/merge_spec.rb +0 -17
  234. data/spec/unit/rom/schema/prefix_spec.rb +0 -16
  235. data/spec/unit/rom/schema/project_spec.rb +0 -15
  236. data/spec/unit/rom/schema/rename_spec.rb +0 -22
  237. data/spec/unit/rom/schema/type_spec.rb +0 -49
  238. data/spec/unit/rom/schema/uniq_spec.rb +0 -21
  239. data/spec/unit/rom/schema/wrap_spec.rb +0 -18
  240. data/spec/unit/rom/schema_spec.rb +0 -10
  241. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -214
@@ -1,214 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe ROM::Relation do
4
- include_context 'gateway only'
5
- include_context 'users and tasks'
6
-
7
- let(:users_relation) do
8
- Class.new(ROM::Memory::Relation) do
9
- def by_name(name)
10
- restrict(name: name)
11
- end
12
-
13
- def by_name_sorted(name, order_by = :name)
14
- by_name(name).order(order_by)
15
- end
16
-
17
- def by_email(email)
18
- restrict(name: email)
19
- end
20
-
21
- def by_name_and_email(name, email)
22
- by_name(name).by_email(email)
23
- end
24
-
25
- def by_name_and_email_sorted(name, email, order_by)
26
- by_name_and_email(name, email).order(order_by)
27
- end
28
-
29
- def all(*args)
30
- if args.any?
31
- restrict(*args)
32
- else
33
- self
34
- end
35
- end
36
- end.new(users_dataset)
37
- end
38
-
39
- let(:tasks_relation) do
40
- Class.new(ROM::Memory::Relation) do
41
- def for_users(users)
42
- names = users.map { |u| u[:name] }
43
- restrict { |t| names.include?(t[:name]) }
44
- end
45
- end.new(tasks_dataset)
46
- end
47
-
48
- it_behaves_like 'a relation that returns one tuple' do
49
- let(:relation) { users_relation }
50
- end
51
-
52
- describe '#map_with' do
53
- it 'raises error when unknown mapper was selected' do
54
- expect {
55
- users_relation.as(:not_here)
56
- }.to raise_error(ROM::MapperMissingError, /not_here/)
57
- end
58
- end
59
-
60
- describe '#method_missing' do
61
- it 'forwards to relation and auto-curries' do
62
- relation = users_relation.by_name_and_email_sorted('Jane')
63
-
64
- expect(relation.name).to eql(ROM::Relation::Name[:by_name_and_email_sorted])
65
- expect(relation.curry_args).to eql(['Jane'])
66
-
67
- relation = relation['jane@doe.org']
68
-
69
- expect(relation.name).to eql(ROM::Relation::Name[:by_name_and_email_sorted])
70
- expect(relation.curry_args).to eql(['Jane', 'jane@doe.org'])
71
-
72
- expect(relation[:email]).to match_array(
73
- users_relation.by_name_and_email_sorted('Jane', 'jane@doe.org', :email)
74
- )
75
- end
76
-
77
- it 'forwards to relation and does not auto-curry when it is not needed' do
78
- relation = users_relation.by_name('Jane')
79
-
80
- expect(relation).to_not be_curried
81
- expect(relation).to match_array(users_relation.by_name('Jane'))
82
- end
83
-
84
- it 'forwards to relation and return lazy when arity is unknown' do
85
- relation = users_relation.all(name: 'Jane')
86
- expect(relation).to_not be_curried
87
- expect(relation).to match_array(users_relation.by_name('Jane').to_a)
88
- end
89
-
90
- it 'returns original response if it is not a relation' do
91
- expect(users_relation.gateway).to be(:default)
92
- end
93
-
94
- it 'raises NoMethodError when relation does not respond to a method' do
95
- expect { users_relation.not_here }.to raise_error(NoMethodError, /not_here/)
96
- end
97
- end
98
-
99
- describe '#call' do
100
- it 'auto-curries' do
101
- relation = users_relation.by_name
102
-
103
- expect(relation.name).to eql(ROM::Relation::Name[:by_name])
104
- expect(relation['Jane'].to_a).to eql(users_relation.by_name('Jane').to_a)
105
- end
106
-
107
- it 'returns relation' do
108
- expect(users_relation.call.to_a).to eql(users_relation.to_a)
109
- end
110
-
111
- describe 'using mappers' do
112
- subject(:users) { users_relation.with(mappers: mappers) }
113
-
114
- let(:name_list) { proc { |r| r.map { |t| t[:name] } } }
115
- let(:upcaser) { proc { |r| r.map(&:upcase) } }
116
- let(:mappers) { { name_list: name_list, upcaser: upcaser } }
117
-
118
- it 'sends relation through mappers' do
119
- relation = users.map_with(:name_list, :upcaser).by_name('Jane')
120
-
121
- expect(relation.call.to_a).to eql(['JANE'])
122
- end
123
- end
124
- end
125
-
126
- describe '#first' do
127
- it 'return first tuple' do
128
- expect(users_relation.first).to eql(name: 'Joe', email: 'joe@doe.org')
129
- end
130
-
131
- it 'raises when relation is curried and arity does not match' do
132
- expect { users_relation.by_name.first }.to raise_error(
133
- ArgumentError, "#{users_relation.class.to_s}#by_name arity is 1 (0 args given)"
134
- )
135
- end
136
-
137
- it 'does not raise when relation is curried and arity matches' do
138
- expect { users_relation.by_name_sorted('Joe').first }.to_not raise_error
139
- end
140
- end
141
-
142
- describe '#each' do
143
- it 'yields relation tuples' do
144
- result = []
145
- users_relation.each do |tuple|
146
- result << tuple
147
- end
148
- expect(result).to match_array([
149
- { name: 'Jane', email: 'jane@doe.org' },
150
- { name: 'Joe', email: 'joe@doe.org' }
151
- ])
152
- end
153
-
154
- it 'returns an enumerator if block is not provided' do
155
- expect(users_relation.each.to_a).to match_array([
156
- { name: 'Jane', email: 'jane@doe.org' },
157
- { name: 'Joe', email: 'joe@doe.org' }
158
- ])
159
- end
160
-
161
- it 'raises when relation is curried and arity does not match' do
162
- expect { users_relation.by_name.each {} }.to raise_error(
163
- ArgumentError, "#{users_relation.class.to_s}#by_name arity is 1 (0 args given)"
164
- )
165
- end
166
-
167
- it 'does not raise when relation is curried and arity matches' do
168
- expect { users_relation.by_name_sorted('Jane').first }.to_not raise_error
169
- end
170
- end
171
-
172
- describe '#to_ary' do
173
- it 'returns an array with relation tuples' do
174
- expect(users_relation.to_ary).to match_array([
175
- { name: 'Jane', email: 'jane@doe.org' },
176
- { name: 'Joe', email: 'joe@doe.org' }
177
- ])
178
- end
179
-
180
- it 'raises when relation is curried and arity does not match' do
181
- expect { users_relation.by_name.to_ary }.to raise_error(
182
- ArgumentError, "#{users_relation.class.to_s}#by_name arity is 1 (0 args given)"
183
- )
184
- end
185
-
186
- it 'does not raise when relation is curried and arity matches' do
187
- expect { users_relation.by_name_sorted('Jane').first }.to_not raise_error
188
- end
189
- end
190
-
191
- describe '#>>' do
192
- it 'composes two relations' do
193
- other = users_relation.by_name('Jane') >> tasks_relation.for_users
194
-
195
- expect(other).to match_array([
196
- { name: 'Jane', title: 'be cool', priority: 2 }
197
- ])
198
- end
199
-
200
- it_behaves_like 'a relation that returns one tuple' do
201
- let(:relation) { users_relation >> proc { |r| r } }
202
-
203
- describe 'using a mapper' do
204
- it 'returns one mapped tuple' do
205
- mapper = proc { |r| r.map { |t| t[:name].upcase } }
206
- relation = users_relation.by_name('Jane') >> mapper
207
-
208
- expect(relation.one).to eql('JANE')
209
- expect(relation.one!).to eql('JANE')
210
- end
211
- end
212
- end
213
- end
214
- end
@@ -1,53 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe ROM::Relation::Loaded do
4
- include_context 'no container'
5
- include_context 'users and tasks'
6
-
7
- subject(:users) { ROM::Relation::Loaded.new(users_relation) }
8
-
9
- describe '#each' do
10
- it 'yields tuples from relation' do
11
- result = []
12
-
13
- users.each do |tuple|
14
- result << tuple
15
- end
16
-
17
- expect(result).to match_array([
18
- { name: 'Jane', email: 'jane@doe.org' },
19
- { name: 'Joe', email: 'joe@doe.org' }
20
- ])
21
- end
22
-
23
- it 'returns enumerator when block is not provided' do
24
- expect(users.each.to_a).to eql(users.collection.to_a)
25
- end
26
- end
27
-
28
- describe '#to_ary' do
29
- it 'coerces to an array' do
30
- expect(users.to_ary).to match_array([
31
- { name: 'Jane', email: 'jane@doe.org' },
32
- { name: 'Joe', email: 'joe@doe.org' }
33
- ])
34
- end
35
- end
36
-
37
- describe '#pluck' do
38
- it 'returns a list of values under provided key' do
39
- expect(users.pluck(:email)).to eql(%w(joe@doe.org jane@doe.org))
40
- end
41
- end
42
-
43
- describe '#primary_keys' do
44
- it 'returns a list of primary key values' do
45
- expect(users.source).to receive(:primary_key).and_return(:name)
46
- expect(users.primary_keys).to eql(%w(Joe Jane))
47
- end
48
- end
49
-
50
- it_behaves_like 'a relation that returns one tuple' do
51
- let(:relation) { users }
52
- end
53
- end
@@ -1,58 +0,0 @@
1
- require 'rom/relation/name'
2
-
3
- RSpec.describe ROM::Relation::Name do
4
- describe '.[]' do
5
- it 'returns a new name from args' do
6
- expect(ROM::Relation::Name[:users]).to eql(
7
- ROM::Relation::Name.new(:users)
8
- )
9
-
10
- expect(ROM::Relation::Name[:authors, :users]).to eql(
11
- ROM::Relation::Name.new(:authors, :users)
12
- )
13
- end
14
-
15
- it 'returns name object when it was passed in as arg' do
16
- name = ROM::Relation::Name[:users]
17
- expect(ROM::Relation::Name[name]).to be(name)
18
- end
19
-
20
- it 'caches name instances' do
21
- name = ROM::Relation::Name[:users]
22
- expect(ROM::Relation::Name[:users]).to be(name)
23
- end
24
- end
25
-
26
- describe '#inspect' do
27
- it 'provides relation name' do
28
- name = ROM::Relation::Name.new(:users)
29
- expect(name.inspect).to eql("ROM::Relation::Name(users)")
30
- end
31
-
32
- it 'provides dataset and relation names' do
33
- name = ROM::Relation::Name.new(:authors, :users)
34
- expect(name.inspect).to eql("ROM::Relation::Name(authors on users)")
35
- end
36
- end
37
-
38
- describe '#with' do
39
- it 'returns a new name with the same dataset but for a different relation name' do
40
- name = ROM::Relation::Name[:users]
41
- expect(name.with(:people)).to be(ROM::Relation::Name[:people, :users])
42
- end
43
- end
44
-
45
- describe '#to_sym' do
46
- it 'returns relation name' do
47
- expect(ROM::Relation::Name.new(:users).to_sym).to be(:users)
48
- expect(ROM::Relation::Name.new(:authors, :users).to_sym).to be(:authors)
49
- end
50
- end
51
-
52
- describe '#to_s' do
53
- it 'returns stringified relation name' do
54
- expect(ROM::Relation::Name.new(:users).to_s).to eql('users')
55
- expect(ROM::Relation::Name.new(:authors, :users).to_s).to eql('authors on users')
56
- end
57
- end
58
- end
@@ -1,28 +0,0 @@
1
- require 'rom/memory'
2
-
3
- RSpec.describe ROM::Relation, '#output_schema' do
4
- subject(:relation) do
5
- Class.new(ROM::Relation[:memory]) do
6
- schema do
7
- attribute :id, ROM::Types::String, read: ROM::Types::Int
8
- attribute :name, ROM::Types::String
9
- end
10
- end.new(ROM::Memory::Dataset.new([]))
11
- end
12
-
13
- let(:schema) do
14
- relation.schema
15
- end
16
-
17
- it 'returns output_schema based on canonical schema' do
18
- expect(relation.output_schema).
19
- to eql(ROM::Types::Coercible::Hash.schema(id: schema[:id].to_read_type, name: schema[:name].type))
20
- end
21
-
22
- it 'returns output_schema based on projected schema' do
23
- projected = relation.project(schema[:id].aliased(:user_id))
24
-
25
- expect(projected.output_schema).
26
- to eql(ROM::Types::Coercible::Hash.schema(user_id: projected.schema[:id].to_read_type))
27
- end
28
- end
@@ -1,259 +0,0 @@
1
- require 'spec_helper'
2
- require 'rom/memory'
3
-
4
- RSpec.describe ROM::Relation, '.schema' do
5
- it 'defines a canonical schema for a relation' do
6
- class Test::Users < ROM::Relation[:memory]
7
- schema do
8
- attribute :id, Types::Int.meta(primary_key: true)
9
- attribute :name, Types::String
10
- attribute :admin, Types::Bool
11
- end
12
- end
13
-
14
- Test::Users.schema.finalize!
15
-
16
- relation_name = ROM::Relation::Name[:test_users]
17
-
18
- schema = ROM::Memory::Schema.define(
19
- ROM::Relation::Name.new(:test_users),
20
- attributes: [
21
- ROM::Memory::Types::Int.meta(primary_key: true, name: :id, source: relation_name),
22
- ROM::Memory::Types::String.meta(name: :name, source: relation_name),
23
- ROM::Memory::Types::Bool.meta(name: :admin, source: relation_name)
24
- ]
25
- ).finalize!
26
-
27
- expect(Test::Users.schema.primary_key).to eql([Test::Users.schema[:id]])
28
-
29
- expect(Test::Users.schema).to eql(schema)
30
-
31
- expect(Test::Users.schema.relations).to be_empty
32
- end
33
-
34
- it 'allows defining types for reading tuples' do
35
- module Test
36
- module Types
37
- CoercibleDate = ROM::Types::Date.constructor(Date.method(:parse))
38
- end
39
- end
40
-
41
- class Test::Users < ROM::Relation[:memory]
42
- schema do
43
- attribute :id, Types::Int
44
- attribute :date, Types::Coercible::String, read: Test::Types::CoercibleDate
45
- end
46
- end
47
-
48
- schema = Test::Users.schema
49
-
50
- expect(schema.to_output_hash).
51
- to eql(ROM::Types::Coercible::Hash.schema(id: schema[:id].type, date: schema[:date].meta[:read]))
52
- end
53
-
54
- it 'allows setting composite primary key' do
55
- class Test::Users < ROM::Relation[:memory]
56
- schema do
57
- attribute :name, Types::String
58
- attribute :email, Types::String
59
-
60
- primary_key :name, :email
61
- end
62
- end
63
-
64
- schema = Test::Users.schema.finalize!
65
-
66
- expect(schema.primary_key).to eql([schema[:name], schema[:email]])
67
- end
68
-
69
- it 'allows setting foreign keys' do
70
- class Test::Posts < ROM::Relation[:memory]
71
- schema do
72
- attribute :author_id, Types::ForeignKey(:users)
73
- attribute :title, Types::String
74
- end
75
- end
76
-
77
- schema = Test::Posts.schema
78
-
79
- expect(schema[:author_id].primitive).to be(Integer)
80
-
81
- expect(schema.foreign_key(:users)).to be(schema[:author_id])
82
- end
83
-
84
- it 'allows JSON read/write coersion', aggregate_failures: true do
85
- class Test::Posts < ROM::Relation[:memory]
86
- schema do
87
- attribute :payload, Types::Coercible::JSON
88
- end
89
- end
90
-
91
- schema = Test::Posts.schema
92
- json_payload = '{"foo":"bar"}'
93
- hash_payload = { "foo" => "bar" }
94
-
95
- expect(schema[:payload][hash_payload]).to eq(json_payload)
96
- expect(schema[:payload].meta[:read][json_payload]).to eq(hash_payload)
97
- end
98
-
99
- it 'allows JSON/Hash read/write coersion using symbols as keys', aggregate_failures: true do
100
- class Test::Posts < ROM::Relation[:memory]
101
- schema do
102
- attribute :payload, Types::Coercible::JSON(symbol_keys: true)
103
- end
104
- end
105
-
106
- schema = Test::Posts.schema
107
- json_payload = '{"foo":"bar"}'
108
- hash_payload = { foo: "bar" }
109
-
110
- expect(schema[:payload][hash_payload]).to eq(json_payload)
111
- expect(schema[:payload].meta[:read][json_payload]).to eq(hash_payload)
112
- end
113
-
114
- it 'allows JSON to Hash coersion only' do
115
- class Test::Posts < ROM::Relation[:memory]
116
- schema do
117
- attribute :payload, Types::Coercible::JSONHash
118
- end
119
- end
120
-
121
- schema = Test::Posts.schema
122
- json_payload = '{"foo":"bar"}'
123
- hash_payload = { "foo" => "bar" }
124
-
125
- expect(schema[:payload][json_payload]).to eq(hash_payload)
126
- end
127
-
128
- it 'returns original payload in JSON to Hash coersion when json is invalid' do
129
- class Test::Posts < ROM::Relation[:memory]
130
- schema do
131
- attribute :payload, Types::Coercible::JSONHash
132
- end
133
- end
134
-
135
- schema = Test::Posts.schema
136
- json_payload = 'invalid: json'
137
-
138
- expect(schema[:payload][json_payload]).to eq(json_payload)
139
- end
140
-
141
- it 'allows JSON to Hash coersion only using symbols as keys' do
142
- class Test::Posts < ROM::Relation[:memory]
143
- schema do
144
- attribute :payload, Types::Coercible::JSONHash(symbol_keys: true)
145
- end
146
- end
147
-
148
- schema = Test::Posts.schema
149
- json_payload = '{"foo":"bar"}'
150
- hash_payload = { foo: "bar" }
151
-
152
- expect(schema[:payload][json_payload]).to eq(hash_payload)
153
- end
154
-
155
- it 'allows Hash to JSON coersion only' do
156
- class Test::Posts < ROM::Relation[:memory]
157
- schema do
158
- attribute :payload, Types::Coercible::HashJSON
159
- end
160
- end
161
-
162
- schema = Test::Posts.schema
163
- json_payload = '{"foo":"bar"}'
164
- hash_payload = { "foo" => "bar" }
165
-
166
- expect(schema[:payload][hash_payload]).to eq(json_payload)
167
- end
168
-
169
- it 'sets register_as and dataset' do
170
- class Test::Users < ROM::Relation[:memory]
171
- schema(:users) do
172
- attribute :id, Types::Int
173
- attribute :name, Types::String
174
- end
175
- end
176
-
177
- expect(Test::Users.dataset).to be(:users)
178
- expect(Test::Users.register_as).to be(:users)
179
- end
180
-
181
- it 'sets dataset and respects custom register_as' do
182
- class Test::Users < ROM::Relation[:memory]
183
- register_as :test_users
184
-
185
- schema(:users) do
186
- attribute :id, Types::Int
187
- attribute :name, Types::String
188
- end
189
- end
190
-
191
- expect(Test::Users.dataset).to be(:users)
192
- expect(Test::Users.register_as).to be(:test_users)
193
- end
194
-
195
- it 'allows setting both dataset and relation alias' do
196
- class Test::Users < ROM::Relation[:memory]
197
- schema(:test_users, as: :users) { }
198
- end
199
-
200
- expect(Test::Users.register_as).to be(:users)
201
- expect(Test::Users.dataset).to be(:test_users)
202
- end
203
-
204
- it 'raises error when schema_class is missing' do
205
- class Test::Users < ROM::Relation[:memory]
206
- schema_class nil
207
- end
208
-
209
- expect { Test::Users.schema(:test) { } }.
210
- to raise_error(ROM::MissingSchemaClassError, "Test::Users relation is missing schema_class")
211
- end
212
-
213
- describe '#schema' do
214
- it 'returns defined schema' do
215
- class Test::Users < ROM::Relation[:memory]
216
- schema do
217
- attribute :id, Types::Int.meta(primary_key: true)
218
- attribute :name, Types::String
219
- attribute :admin, Types::Bool
220
- end
221
- end
222
-
223
- users = Test::Users.new([])
224
-
225
- expect(users.schema).to be(Test::Users.schema)
226
- end
227
-
228
- it 'uses custom schema dsl' do
229
- class Test::SchemaDSL < ROM::Schema::DSL
230
- def bool(name)
231
- attribute(name, ::ROM::Types::Bool)
232
- end
233
- end
234
-
235
- class Test::Users < ROM::Relation[:memory]
236
- schema_dsl Test::SchemaDSL
237
-
238
- schema do
239
- bool :admin
240
- end
241
- end
242
-
243
- expect(Test::Users.schema[:admin]).to eql(ROM::Types::Bool.meta(name: :admin, source: ROM::Relation::Name[:test_users]))
244
- end
245
-
246
- it 'raises an error on double definition' do
247
- expect {
248
- class Test::Users < ROM::Relation[:memory]
249
- schema do
250
- attribute :id, Types::Int.meta(primary_key: true)
251
- attribute :name, Types::String
252
- attribute :id, Types::Int
253
- end
254
- end
255
- }.to raise_error(ROM::Schema::AttributeAlreadyDefinedError,
256
- /:id already defined/)
257
- end
258
- end
259
- end