rom 2.0.2 → 4.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.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +35 -430
  3. data/LICENSE +1 -1
  4. data/README.md +83 -11
  5. data/lib/rom/version.rb +1 -1
  6. data/lib/rom.rb +3 -46
  7. metadata +30 -236
  8. data/.gitignore +0 -24
  9. data/.rspec +0 -3
  10. data/.rubocop.yml +0 -87
  11. data/.rubocop_todo.yml +0 -46
  12. data/.travis.yml +0 -28
  13. data/CODE_OF_CONDUCT.md +0 -13
  14. data/CONTRIBUTING.md +0 -1
  15. data/Gemfile +0 -41
  16. data/Guardfile +0 -24
  17. data/Rakefile +0 -22
  18. data/lib/rom/association_set.rb +0 -26
  19. data/lib/rom/command.rb +0 -173
  20. data/lib/rom/command_registry.rb +0 -153
  21. data/lib/rom/commands/class_interface.rb +0 -148
  22. data/lib/rom/commands/composite.rb +0 -54
  23. data/lib/rom/commands/create.rb +0 -13
  24. data/lib/rom/commands/delete.rb +0 -14
  25. data/lib/rom/commands/graph/builder.rb +0 -176
  26. data/lib/rom/commands/graph/class_interface.rb +0 -62
  27. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  28. data/lib/rom/commands/graph.rb +0 -103
  29. data/lib/rom/commands/lazy/create.rb +0 -23
  30. data/lib/rom/commands/lazy/delete.rb +0 -27
  31. data/lib/rom/commands/lazy/update.rb +0 -34
  32. data/lib/rom/commands/lazy.rb +0 -99
  33. data/lib/rom/commands/result.rb +0 -96
  34. data/lib/rom/commands/update.rb +0 -14
  35. data/lib/rom/commands.rb +0 -3
  36. data/lib/rom/configuration.rb +0 -88
  37. data/lib/rom/configuration_dsl/command.rb +0 -43
  38. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  39. data/lib/rom/configuration_dsl/mapper.rb +0 -37
  40. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -44
  41. data/lib/rom/configuration_dsl/relation.rb +0 -26
  42. data/lib/rom/configuration_dsl.rb +0 -78
  43. data/lib/rom/configuration_plugin.rb +0 -17
  44. data/lib/rom/constants.rb +0 -30
  45. data/lib/rom/container.rb +0 -231
  46. data/lib/rom/create_container.rb +0 -61
  47. data/lib/rom/environment.rb +0 -70
  48. data/lib/rom/gateway.rb +0 -154
  49. data/lib/rom/global/plugin_dsl.rb +0 -49
  50. data/lib/rom/global.rb +0 -60
  51. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  52. data/lib/rom/lint/gateway.rb +0 -94
  53. data/lib/rom/lint/linter.rb +0 -78
  54. data/lib/rom/lint/spec.rb +0 -20
  55. data/lib/rom/lint/test.rb +0 -98
  56. data/lib/rom/mapper_registry.rb +0 -35
  57. data/lib/rom/memory/commands.rb +0 -58
  58. data/lib/rom/memory/dataset.rb +0 -98
  59. data/lib/rom/memory/gateway.rb +0 -64
  60. data/lib/rom/memory/relation.rb +0 -49
  61. data/lib/rom/memory/storage.rb +0 -59
  62. data/lib/rom/memory/types.rb +0 -9
  63. data/lib/rom/memory.rb +0 -4
  64. data/lib/rom/pipeline.rb +0 -106
  65. data/lib/rom/plugin.rb +0 -17
  66. data/lib/rom/plugin_base.rb +0 -31
  67. data/lib/rom/plugin_registry.rb +0 -173
  68. data/lib/rom/plugins/command/schema.rb +0 -37
  69. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -17
  70. data/lib/rom/plugins/relation/key_inference.rb +0 -46
  71. data/lib/rom/plugins/relation/registry_reader.rb +0 -32
  72. data/lib/rom/plugins/relation/view/dsl.rb +0 -32
  73. data/lib/rom/plugins/relation/view.rb +0 -95
  74. data/lib/rom/relation/class_interface.rb +0 -230
  75. data/lib/rom/relation/composite.rb +0 -46
  76. data/lib/rom/relation/curried.rb +0 -104
  77. data/lib/rom/relation/graph.rb +0 -115
  78. data/lib/rom/relation/loaded.rb +0 -118
  79. data/lib/rom/relation/materializable.rb +0 -66
  80. data/lib/rom/relation/name.rb +0 -102
  81. data/lib/rom/relation.rb +0 -172
  82. data/lib/rom/relation_registry.rb +0 -9
  83. data/lib/rom/schema/dsl.rb +0 -58
  84. data/lib/rom/schema.rb +0 -89
  85. data/lib/rom/setup/auto_registration.rb +0 -69
  86. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -11
  87. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -22
  88. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -19
  89. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  90. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  91. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  92. data/lib/rom/setup/finalize/finalize_relations.rb +0 -60
  93. data/lib/rom/setup/finalize.rb +0 -146
  94. data/lib/rom/setup.rb +0 -55
  95. data/lib/rom/support/configurable.rb +0 -80
  96. data/lib/rom/types.rb +0 -18
  97. data/log/.gitkeep +0 -0
  98. data/rakelib/benchmark.rake +0 -15
  99. data/rakelib/mutant.rake +0 -19
  100. data/rakelib/rubocop.rake +0 -18
  101. data/rom.gemspec +0 -26
  102. data/spec/fixtures/app/commands/create_user.rb +0 -2
  103. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  104. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  105. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  106. data/spec/fixtures/app/my_relations/users.rb +0 -2
  107. data/spec/fixtures/app/relations/users.rb +0 -2
  108. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  109. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  110. data/spec/fixtures/custom/relations/users.rb +0 -6
  111. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  112. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  113. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  114. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  115. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  116. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  117. data/spec/integration/command_registry_spec.rb +0 -60
  118. data/spec/integration/commands/create_spec.rb +0 -177
  119. data/spec/integration/commands/delete_spec.rb +0 -67
  120. data/spec/integration/commands/error_handling_spec.rb +0 -25
  121. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  122. data/spec/integration/commands/graph_spec.rb +0 -288
  123. data/spec/integration/commands/update_spec.rb +0 -109
  124. data/spec/integration/commands_spec.rb +0 -67
  125. data/spec/integration/mappers/combine_spec.rb +0 -117
  126. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  127. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  128. data/spec/integration/mappers/embedded_spec.rb +0 -62
  129. data/spec/integration/mappers/exclude_spec.rb +0 -27
  130. data/spec/integration/mappers/fold_spec.rb +0 -71
  131. data/spec/integration/mappers/group_spec.rb +0 -163
  132. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  133. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  134. data/spec/integration/mappers/prefix_spec.rb +0 -48
  135. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  136. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  137. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  138. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  139. data/spec/integration/mappers/step_spec.rb +0 -119
  140. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  141. data/spec/integration/mappers/unfold_spec.rb +0 -92
  142. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  143. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  144. data/spec/integration/mappers/wrap_spec.rb +0 -155
  145. data/spec/integration/memory/commands/create_spec.rb +0 -23
  146. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  147. data/spec/integration/memory/commands/update_spec.rb +0 -23
  148. data/spec/integration/multi_env_spec.rb +0 -69
  149. data/spec/integration/multi_repo_spec.rb +0 -46
  150. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  151. data/spec/integration/relations/inheritance_spec.rb +0 -37
  152. data/spec/integration/relations/reading_spec.rb +0 -169
  153. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  154. data/spec/integration/repositories/extending_relations_spec.rb +0 -58
  155. data/spec/integration/repositories/setting_logger_spec.rb +0 -34
  156. data/spec/integration/setup_spec.rb +0 -160
  157. data/spec/shared/command_behavior.rb +0 -28
  158. data/spec/shared/command_graph.rb +0 -50
  159. data/spec/shared/container.rb +0 -9
  160. data/spec/shared/enumerable_dataset.rb +0 -52
  161. data/spec/shared/gateway_only.rb +0 -6
  162. data/spec/shared/materializable.rb +0 -36
  163. data/spec/shared/no_container.rb +0 -16
  164. data/spec/shared/one_behavior.rb +0 -26
  165. data/spec/shared/proxy.rb +0 -0
  166. data/spec/shared/users_and_tasks.rb +0 -10
  167. data/spec/spec_helper.rb +0 -52
  168. data/spec/support/constant_leak_finder.rb +0 -14
  169. data/spec/support/mutant.rb +0 -10
  170. data/spec/support/types.rb +0 -5
  171. data/spec/test/memory_repository_lint_test.rb +0 -27
  172. data/spec/unit/rom/association_set_spec.rb +0 -23
  173. data/spec/unit/rom/commands/graph_spec.rb +0 -191
  174. data/spec/unit/rom/commands/lazy_spec.rb +0 -307
  175. data/spec/unit/rom/commands/result_spec.rb +0 -70
  176. data/spec/unit/rom/commands_spec.rb +0 -165
  177. data/spec/unit/rom/configurable_spec.rb +0 -49
  178. data/spec/unit/rom/configuration_spec.rb +0 -61
  179. data/spec/unit/rom/container_spec.rb +0 -99
  180. data/spec/unit/rom/create_container_spec.rb +0 -151
  181. data/spec/unit/rom/environment_spec.rb +0 -123
  182. data/spec/unit/rom/gateway_spec.rb +0 -146
  183. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  184. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  185. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  186. data/spec/unit/rom/memory/relation_spec.rb +0 -109
  187. data/spec/unit/rom/memory/repository_spec.rb +0 -12
  188. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  189. data/spec/unit/rom/plugin_spec.rb +0 -150
  190. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  191. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  192. data/spec/unit/rom/plugins/relation/view_spec.rb +0 -51
  193. data/spec/unit/rom/relation/composite_spec.rb +0 -89
  194. data/spec/unit/rom/relation/curried_spec.rb +0 -52
  195. data/spec/unit/rom/relation/graph_spec.rb +0 -92
  196. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  197. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  198. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  199. data/spec/unit/rom/relation/name_spec.rb +0 -58
  200. data/spec/unit/rom/relation/schema_spec.rb +0 -117
  201. data/spec/unit/rom/relation_spec.rb +0 -237
  202. data/spec/unit/rom/schema_spec.rb +0 -10
  203. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -152
@@ -1,214 +0,0 @@
1
- require 'spec_helper'
2
-
3
- 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
- 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,117 +0,0 @@
1
- require 'spec_helper'
2
- require 'rom/memory'
3
-
4
- 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
- schema = ROM::Schema.new(
17
- ROM::Relation::Name.new(:test_users),
18
- id: ROM::Memory::Types::Int.meta(primary_key: true, name: :id),
19
- name: ROM::Memory::Types::String.meta(name: :name),
20
- admin: ROM::Memory::Types::Bool.meta(name: :admin)
21
- ).finalize!
22
-
23
- expect(Test::Users.schema.primary_key).to eql([Test::Users.schema[:id]])
24
-
25
- expect(Test::Users.schema).to eql(schema)
26
- end
27
-
28
- it 'allows setting composite primary key' do
29
- class Test::Users < ROM::Relation[:memory]
30
- schema do
31
- attribute :name, Types::String
32
- attribute :email, Types::String
33
-
34
- primary_key :name, :email
35
- end
36
- end
37
-
38
- schema = Test::Users.schema.finalize!
39
-
40
- expect(schema.primary_key).to eql([schema[:name], schema[:email]])
41
- end
42
-
43
- it 'allows setting foreign keys' do
44
- class Test::Posts < ROM::Relation[:memory]
45
- schema do
46
- attribute :author_id, Types::ForeignKey(:users)
47
- attribute :title, Types::String
48
- end
49
- end
50
-
51
- schema = Test::Posts.schema
52
-
53
- expect(schema[:author_id].primitive).to be(Integer)
54
-
55
- expect(schema.foreign_key(:users)).to be(schema[:author_id])
56
- end
57
-
58
- it 'sets register_as and dataset' do
59
- class Test::Users < ROM::Relation[:memory]
60
- schema(:users) do
61
- attribute :id, Types::Int
62
- attribute :name, Types::String
63
- end
64
- end
65
-
66
- expect(Test::Users.dataset).to be(:users)
67
- expect(Test::Users.register_as).to be(:users)
68
- end
69
-
70
- it 'sets dataset and respects custom register_as' do
71
- class Test::Users < ROM::Relation[:memory]
72
- register_as :test_users
73
-
74
- schema(:users) do
75
- attribute :id, Types::Int
76
- attribute :name, Types::String
77
- end
78
- end
79
-
80
- expect(Test::Users.dataset).to be(:users)
81
- expect(Test::Users.register_as).to be(:test_users)
82
- end
83
-
84
- describe '#schema' do
85
- it 'returns defined schema' do
86
- class Test::Users < ROM::Relation[:memory]
87
- schema do
88
- attribute :id, Types::Int.meta(primary_key: true)
89
- attribute :name, Types::String
90
- attribute :admin, Types::Bool
91
- end
92
- end
93
-
94
- users = Test::Users.new([])
95
-
96
- expect(users.schema).to be(Test::Users.schema)
97
- end
98
-
99
- it 'uses custom schema dsl' do
100
- class Test::SchemaDSL < ROM::Schema::DSL
101
- def bool(name)
102
- attribute(name, ::ROM::Types::Bool)
103
- end
104
- end
105
-
106
- class Test::Users < ROM::Relation[:memory]
107
- schema_dsl Test::SchemaDSL
108
-
109
- schema do
110
- bool :admin
111
- end
112
- end
113
-
114
- expect(Test::Users.schema[:admin]).to eql(ROM::Types::Bool.meta(name: :admin))
115
- end
116
- end
117
- end
@@ -1,237 +0,0 @@
1
- require 'rom/memory'
2
-
3
- describe ROM::Relation do
4
- subject(:relation) { Class.new(ROM::Relation).new(dataset) }
5
-
6
- let(:dataset) { ROM::Memory::Dataset.new([jane, joe]) }
7
-
8
- let(:jane) { { id: 1, name: 'Jane' } }
9
- let(:joe) { { id: 2, name: 'Joe' } }
10
-
11
- describe '.[]' do
12
- before do
13
- module Test::TestAdapter
14
- class Relation < ROM::Relation
15
- adapter :test
16
-
17
- def test_relation?
18
- true
19
- end
20
- end
21
- end
22
-
23
- module Test::BrokenAdapter
24
- class Relation < ROM::Relation
25
- def test_relation?
26
- true
27
- end
28
- end
29
- end
30
-
31
- ROM.register_adapter(:test, Test::TestAdapter)
32
- ROM.register_adapter(:broken, Test::BrokenAdapter)
33
- end
34
-
35
- it 'returns relation subclass from the registered adapter' do
36
- subclass = Class.new(ROM::Relation[:test])
37
-
38
- relation = subclass.new([])
39
-
40
- expect(relation).to be_test_relation
41
- end
42
-
43
- it 'raises error when adapter relation has no identifier' do
44
- expect {
45
- Class.new(ROM::Relation[:broken])
46
- }.to raise_error(ROM::MissingAdapterIdentifierError, /Test::BrokenAdapter::Relation/)
47
- end
48
- end
49
-
50
- describe ".dataset" do
51
- it 'allows setting dataset name' do
52
- rel_class = Class.new(ROM::Relation[:memory]) { dataset :users }
53
-
54
- expect(rel_class.dataset).to be(:users)
55
- end
56
- end
57
-
58
- describe ".register_as" do
59
- it "defaults to dataset with a generated class" do
60
- rel = Class.new(ROM::Relation[:memory]) { dataset :users }
61
- expect(rel.register_as).to eq(:users)
62
- rel.register_as(:guests)
63
- expect(rel.register_as).to eq(:guests)
64
- end
65
-
66
- it "defaults to dataset with a defined class that has dataset inferred" do
67
- class Test::Users < ROM::Relation[:memory]; end
68
- expect(Test::Users.register_as).to eq(:test_users)
69
- end
70
-
71
- it "defaults to dataset with a defined class that has dataset set manually" do
72
- class Test::Users < ROM::Relation[:memory]
73
- dataset :guests
74
- end
75
- expect(Test::Users.register_as).to eq(:guests)
76
- end
77
-
78
- it "defaults to :dataset of parent class" do
79
- class Test::SuperUsers < ROM::Relation[:memory]
80
- dataset :users
81
- end
82
-
83
- class Test::DescendantUsers < Test::SuperUsers; end
84
-
85
- expect(Test::DescendantUsers.register_as).to be(:users)
86
- end
87
-
88
- it "sets custom value for super and descendant classes" do
89
- class Test::SuperUsers < ROM::Relation[:memory]
90
- register_as :users
91
- end
92
-
93
- class Test::DescendantUsers < Test::SuperUsers
94
- register_as :descendant_users
95
- end
96
-
97
- expect(Test::SuperUsers.register_as).to eq(:users)
98
- expect(Test::DescendantUsers.register_as).to eq(:descendant_users)
99
- end
100
-
101
- it "sets provided value overriding inherited value" do
102
- module Test
103
- class BaseRelation < ROM::Relation[:memory]
104
- end
105
-
106
- class UsersRelation < BaseRelation
107
- register_as :users
108
- dataset :users
109
- end
110
- end
111
-
112
- expect(Test::UsersRelation.register_as).to be(:users)
113
- end
114
- end
115
-
116
- describe '#name' do
117
- context 'missing dataset' do
118
- context 'with Relation inside module' do
119
- before do
120
- module Test::Test
121
- class SuperRelation < ROM::Relation[:memory]; end
122
- end
123
- end
124
-
125
- it 'returns name based on module and class' do
126
- relation = Test::Test::SuperRelation.new([])
127
-
128
- expect(relation.name).to eql(ROM::Relation::Name.new(:test_test_super_relation))
129
- end
130
- end
131
-
132
- context 'with Relation without module' do
133
- before do
134
- class Test::SuperRelation < ROM::Relation[:memory]; end
135
- end
136
-
137
- it 'returns name based only on class' do
138
- relation = Test::SuperRelation.new([])
139
-
140
- expect(relation.name).to eql(ROM::Relation::Name.new(:test_super_relation))
141
- end
142
- end
143
-
144
- context 'with a descendant relation' do
145
- before do
146
- class Test::SuperRelation < ROM::Relation[:memory]; end
147
- class Test::DescendantRelation < Test::SuperRelation; end
148
- end
149
-
150
- it 'inherits :name from the super relation' do
151
- relation = Test::DescendantRelation.new([])
152
-
153
- expect(relation.name).to eql(ROM::Relation::Name.new(:test_super_relation))
154
- end
155
- end
156
- end
157
-
158
- context 'manualy set dataset' do
159
- before do
160
- module Test::TestAdapter
161
- class Relation < ROM::Relation[:memory]
162
- dataset :foo_bar
163
- end
164
- end
165
- end
166
-
167
- it 'returns name based on dataset' do
168
- relation = Test::TestAdapter::Relation.new([])
169
-
170
- expect(relation.name).to eql(ROM::Relation::Name.new(:foo_bar))
171
- end
172
- end
173
- end
174
-
175
- describe "#each" do
176
- it "yields all objects" do
177
- result = []
178
-
179
- relation.each do |user|
180
- result << user
181
- end
182
-
183
- expect(result).to eql([jane, joe])
184
- end
185
-
186
- it "returns an enumerator if block is not provided" do
187
- expect(relation.each).to be_instance_of(Enumerator)
188
- end
189
- end
190
-
191
- describe "#to_a" do
192
- it "materializes relation to an array" do
193
- expect(relation.to_a).to eql([jane, joe])
194
- end
195
- end
196
-
197
- describe "#with" do
198
- it "returns a new instance with the original dataset and given custom options" do
199
- relation = Class.new(ROM::Relation) { option :custom }.new([])
200
-
201
- custom_opts = { mappers: "Custom Mapper Registry" }
202
- new_relation = relation.with(custom_opts).with(custom: true)
203
-
204
- expect(new_relation.dataset).to be(relation.dataset)
205
- expect(new_relation.options).to include(custom_opts.merge(custom: true))
206
- end
207
- end
208
-
209
- describe '#graph?' do
210
- it 'returns false' do
211
- expect(relation.graph?).to be(false)
212
- end
213
-
214
- it 'returns false when curried' do
215
- relation = Class.new(ROM::Relation[:memory]) { def by_name(_); self; end }.new([])
216
- expect(relation.by_name.graph?).to be(false)
217
- end
218
- end
219
-
220
- describe '#schema_hash' do
221
- it 'returns a schema hash type' do
222
- relation = Class.new(ROM::Relation[:memory]) do
223
- schema { attribute :id, ROM::Types::Coercible::Int }
224
- end.new([])
225
-
226
- expect(relation.schema_hash[id: '1']).to eql(id: 1)
227
- end
228
-
229
- it 'returns a plain Hash coercer when there is no schema' do
230
- relation = Class.new(ROM::Relation[:memory]).new([])
231
-
232
- tuple = [[:id, '1']]
233
-
234
- expect(relation.schema_hash[tuple]).to eql(id: '1')
235
- end
236
- end
237
- end
@@ -1,10 +0,0 @@
1
- RSpec.describe ROM::Schema do
2
- describe '#to_h' do
3
- it 'returns hash with attributes' do
4
- attrs = { id: ROM::Types::Int, name: ROM::Types::String }
5
- schema = ROM::Schema.new(:name, attrs)
6
-
7
- expect(schema.to_h).to eql(attrs)
8
- end
9
- end
10
- end