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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +35 -430
- data/LICENSE +1 -1
- data/README.md +83 -11
- data/lib/rom/version.rb +1 -1
- data/lib/rom.rb +3 -46
- metadata +30 -236
- data/.gitignore +0 -24
- data/.rspec +0 -3
- data/.rubocop.yml +0 -87
- data/.rubocop_todo.yml +0 -46
- data/.travis.yml +0 -28
- data/CODE_OF_CONDUCT.md +0 -13
- data/CONTRIBUTING.md +0 -1
- data/Gemfile +0 -41
- data/Guardfile +0 -24
- data/Rakefile +0 -22
- data/lib/rom/association_set.rb +0 -26
- data/lib/rom/command.rb +0 -173
- data/lib/rom/command_registry.rb +0 -153
- data/lib/rom/commands/class_interface.rb +0 -148
- data/lib/rom/commands/composite.rb +0 -54
- data/lib/rom/commands/create.rb +0 -13
- data/lib/rom/commands/delete.rb +0 -14
- data/lib/rom/commands/graph/builder.rb +0 -176
- data/lib/rom/commands/graph/class_interface.rb +0 -62
- data/lib/rom/commands/graph/input_evaluator.rb +0 -62
- data/lib/rom/commands/graph.rb +0 -103
- data/lib/rom/commands/lazy/create.rb +0 -23
- data/lib/rom/commands/lazy/delete.rb +0 -27
- data/lib/rom/commands/lazy/update.rb +0 -34
- data/lib/rom/commands/lazy.rb +0 -99
- data/lib/rom/commands/result.rb +0 -96
- data/lib/rom/commands/update.rb +0 -14
- data/lib/rom/commands.rb +0 -3
- data/lib/rom/configuration.rb +0 -88
- data/lib/rom/configuration_dsl/command.rb +0 -43
- data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
- data/lib/rom/configuration_dsl/mapper.rb +0 -37
- data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -44
- data/lib/rom/configuration_dsl/relation.rb +0 -26
- data/lib/rom/configuration_dsl.rb +0 -78
- data/lib/rom/configuration_plugin.rb +0 -17
- data/lib/rom/constants.rb +0 -30
- data/lib/rom/container.rb +0 -231
- data/lib/rom/create_container.rb +0 -61
- data/lib/rom/environment.rb +0 -70
- data/lib/rom/gateway.rb +0 -154
- data/lib/rom/global/plugin_dsl.rb +0 -49
- data/lib/rom/global.rb +0 -60
- data/lib/rom/lint/enumerable_dataset.rb +0 -54
- data/lib/rom/lint/gateway.rb +0 -94
- data/lib/rom/lint/linter.rb +0 -78
- data/lib/rom/lint/spec.rb +0 -20
- data/lib/rom/lint/test.rb +0 -98
- data/lib/rom/mapper_registry.rb +0 -35
- data/lib/rom/memory/commands.rb +0 -58
- data/lib/rom/memory/dataset.rb +0 -98
- data/lib/rom/memory/gateway.rb +0 -64
- data/lib/rom/memory/relation.rb +0 -49
- data/lib/rom/memory/storage.rb +0 -59
- data/lib/rom/memory/types.rb +0 -9
- data/lib/rom/memory.rb +0 -4
- data/lib/rom/pipeline.rb +0 -106
- data/lib/rom/plugin.rb +0 -17
- data/lib/rom/plugin_base.rb +0 -31
- data/lib/rom/plugin_registry.rb +0 -173
- data/lib/rom/plugins/command/schema.rb +0 -37
- data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -17
- data/lib/rom/plugins/relation/key_inference.rb +0 -46
- data/lib/rom/plugins/relation/registry_reader.rb +0 -32
- data/lib/rom/plugins/relation/view/dsl.rb +0 -32
- data/lib/rom/plugins/relation/view.rb +0 -95
- data/lib/rom/relation/class_interface.rb +0 -230
- data/lib/rom/relation/composite.rb +0 -46
- data/lib/rom/relation/curried.rb +0 -104
- data/lib/rom/relation/graph.rb +0 -115
- data/lib/rom/relation/loaded.rb +0 -118
- data/lib/rom/relation/materializable.rb +0 -66
- data/lib/rom/relation/name.rb +0 -102
- data/lib/rom/relation.rb +0 -172
- data/lib/rom/relation_registry.rb +0 -9
- data/lib/rom/schema/dsl.rb +0 -58
- data/lib/rom/schema.rb +0 -89
- data/lib/rom/setup/auto_registration.rb +0 -69
- data/lib/rom/setup/auto_registration_strategies/base.rb +0 -11
- data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -22
- data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -19
- data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
- data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
- data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
- data/lib/rom/setup/finalize/finalize_relations.rb +0 -60
- data/lib/rom/setup/finalize.rb +0 -146
- data/lib/rom/setup.rb +0 -55
- data/lib/rom/support/configurable.rb +0 -80
- data/lib/rom/types.rb +0 -18
- data/log/.gitkeep +0 -0
- data/rakelib/benchmark.rake +0 -15
- data/rakelib/mutant.rake +0 -19
- data/rakelib/rubocop.rake +0 -18
- data/rom.gemspec +0 -26
- data/spec/fixtures/app/commands/create_user.rb +0 -2
- data/spec/fixtures/app/mappers/user_list.rb +0 -2
- data/spec/fixtures/app/my_commands/create_user.rb +0 -2
- data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
- data/spec/fixtures/app/my_relations/users.rb +0 -2
- data/spec/fixtures/app/relations/users.rb +0 -2
- data/spec/fixtures/custom/commands/create_user.rb +0 -6
- data/spec/fixtures/custom/mappers/user_list.rb +0 -6
- data/spec/fixtures/custom/relations/users.rb +0 -6
- data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
- data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
- data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
- data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
- data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
- data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
- data/spec/integration/command_registry_spec.rb +0 -60
- data/spec/integration/commands/create_spec.rb +0 -177
- data/spec/integration/commands/delete_spec.rb +0 -67
- data/spec/integration/commands/error_handling_spec.rb +0 -25
- data/spec/integration/commands/graph_builder_spec.rb +0 -213
- data/spec/integration/commands/graph_spec.rb +0 -288
- data/spec/integration/commands/update_spec.rb +0 -109
- data/spec/integration/commands_spec.rb +0 -67
- data/spec/integration/mappers/combine_spec.rb +0 -117
- data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
- data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
- data/spec/integration/mappers/embedded_spec.rb +0 -62
- data/spec/integration/mappers/exclude_spec.rb +0 -27
- data/spec/integration/mappers/fold_spec.rb +0 -71
- data/spec/integration/mappers/group_spec.rb +0 -163
- data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
- data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
- data/spec/integration/mappers/prefix_spec.rb +0 -48
- data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
- data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
- data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
- data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
- data/spec/integration/mappers/step_spec.rb +0 -119
- data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
- data/spec/integration/mappers/unfold_spec.rb +0 -92
- data/spec/integration/mappers/ungroup_spec.rb +0 -126
- data/spec/integration/mappers/unwrap_spec.rb +0 -93
- data/spec/integration/mappers/wrap_spec.rb +0 -155
- data/spec/integration/memory/commands/create_spec.rb +0 -23
- data/spec/integration/memory/commands/delete_spec.rb +0 -23
- data/spec/integration/memory/commands/update_spec.rb +0 -23
- data/spec/integration/multi_env_spec.rb +0 -69
- data/spec/integration/multi_repo_spec.rb +0 -46
- data/spec/integration/relations/default_dataset_spec.rb +0 -38
- data/spec/integration/relations/inheritance_spec.rb +0 -37
- data/spec/integration/relations/reading_spec.rb +0 -169
- data/spec/integration/relations/registry_dsl_spec.rb +0 -45
- data/spec/integration/repositories/extending_relations_spec.rb +0 -58
- data/spec/integration/repositories/setting_logger_spec.rb +0 -34
- data/spec/integration/setup_spec.rb +0 -160
- data/spec/shared/command_behavior.rb +0 -28
- data/spec/shared/command_graph.rb +0 -50
- data/spec/shared/container.rb +0 -9
- data/spec/shared/enumerable_dataset.rb +0 -52
- data/spec/shared/gateway_only.rb +0 -6
- data/spec/shared/materializable.rb +0 -36
- data/spec/shared/no_container.rb +0 -16
- data/spec/shared/one_behavior.rb +0 -26
- data/spec/shared/proxy.rb +0 -0
- data/spec/shared/users_and_tasks.rb +0 -10
- data/spec/spec_helper.rb +0 -52
- data/spec/support/constant_leak_finder.rb +0 -14
- data/spec/support/mutant.rb +0 -10
- data/spec/support/types.rb +0 -5
- data/spec/test/memory_repository_lint_test.rb +0 -27
- data/spec/unit/rom/association_set_spec.rb +0 -23
- data/spec/unit/rom/commands/graph_spec.rb +0 -191
- data/spec/unit/rom/commands/lazy_spec.rb +0 -307
- data/spec/unit/rom/commands/result_spec.rb +0 -70
- data/spec/unit/rom/commands_spec.rb +0 -165
- data/spec/unit/rom/configurable_spec.rb +0 -49
- data/spec/unit/rom/configuration_spec.rb +0 -61
- data/spec/unit/rom/container_spec.rb +0 -99
- data/spec/unit/rom/create_container_spec.rb +0 -151
- data/spec/unit/rom/environment_spec.rb +0 -123
- data/spec/unit/rom/gateway_spec.rb +0 -146
- data/spec/unit/rom/mapper_registry_spec.rb +0 -25
- data/spec/unit/rom/memory/commands_spec.rb +0 -43
- data/spec/unit/rom/memory/dataset_spec.rb +0 -31
- data/spec/unit/rom/memory/relation_spec.rb +0 -109
- data/spec/unit/rom/memory/repository_spec.rb +0 -12
- data/spec/unit/rom/memory/storage_spec.rb +0 -45
- data/spec/unit/rom/plugin_spec.rb +0 -150
- data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
- data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
- data/spec/unit/rom/plugins/relation/view_spec.rb +0 -51
- data/spec/unit/rom/relation/composite_spec.rb +0 -89
- data/spec/unit/rom/relation/curried_spec.rb +0 -52
- data/spec/unit/rom/relation/graph_spec.rb +0 -92
- data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
- data/spec/unit/rom/relation/lazy_spec.rb +0 -214
- data/spec/unit/rom/relation/loaded_spec.rb +0 -53
- data/spec/unit/rom/relation/name_spec.rb +0 -58
- data/spec/unit/rom/relation/schema_spec.rb +0 -117
- data/spec/unit/rom/relation_spec.rb +0 -237
- data/spec/unit/rom/schema_spec.rb +0 -10
- 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
|