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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -599
- data/lib/rom/version.rb +1 -1
- data/lib/rom.rb +3 -44
- metadata +19 -295
- data/.gitignore +0 -24
- data/.rspec +0 -3
- data/.rubocop.yml +0 -87
- data/.rubocop_todo.yml +0 -46
- data/.travis.yml +0 -24
- data/.yardopts +0 -2
- data/CODE_OF_CONDUCT.md +0 -13
- data/CONTRIBUTING.md +0 -1
- data/Gemfile +0 -54
- data/Guardfile +0 -24
- data/Rakefile +0 -28
- data/lib/rom/array_dataset.rb +0 -44
- data/lib/rom/association_set.rb +0 -49
- data/lib/rom/auto_curry.rb +0 -55
- data/lib/rom/command.rb +0 -494
- data/lib/rom/command_registry.rb +0 -148
- data/lib/rom/commands/class_interface.rb +0 -270
- data/lib/rom/commands/composite.rb +0 -53
- 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 -95
- 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 -90
- data/lib/rom/configuration_dsl/command.rb +0 -41
- data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
- data/lib/rom/configuration_dsl/mapper.rb +0 -36
- data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -43
- data/lib/rom/configuration_dsl/relation.rb +0 -26
- data/lib/rom/configuration_dsl.rb +0 -107
- data/lib/rom/configuration_plugin.rb +0 -17
- data/lib/rom/constants.rb +0 -36
- data/lib/rom/container.rb +0 -233
- data/lib/rom/create_container.rb +0 -60
- data/lib/rom/data_proxy.rb +0 -94
- data/lib/rom/enumerable_dataset.rb +0 -68
- data/lib/rom/environment.rb +0 -70
- data/lib/rom/gateway.rb +0 -196
- data/lib/rom/global/plugin_dsl.rb +0 -47
- data/lib/rom/global.rb +0 -58
- data/lib/rom/initializer.rb +0 -26
- data/lib/rom/lint/enumerable_dataset.rb +0 -54
- data/lib/rom/lint/gateway.rb +0 -120
- 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 -56
- data/lib/rom/memory/dataset.rb +0 -97
- data/lib/rom/memory/gateway.rb +0 -64
- data/lib/rom/memory/relation.rb +0 -62
- data/lib/rom/memory/schema.rb +0 -13
- 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 -122
- data/lib/rom/plugin.rb +0 -20
- data/lib/rom/plugin_base.rb +0 -40
- 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 -21
- data/lib/rom/plugins/relation/instrumentation.rb +0 -51
- data/lib/rom/plugins/relation/key_inference.rb +0 -48
- data/lib/rom/plugins/relation/registry_reader.rb +0 -33
- data/lib/rom/registry.rb +0 -50
- data/lib/rom/relation/class_interface.rb +0 -356
- data/lib/rom/relation/composite.rb +0 -46
- data/lib/rom/relation/curried.rb +0 -109
- data/lib/rom/relation/graph.rb +0 -125
- data/lib/rom/relation/loaded.rb +0 -127
- data/lib/rom/relation/materializable.rb +0 -66
- data/lib/rom/relation/name.rb +0 -102
- data/lib/rom/relation/view_dsl.rb +0 -64
- data/lib/rom/relation.rb +0 -250
- data/lib/rom/relation_registry.rb +0 -9
- data/lib/rom/schema/attribute.rb +0 -390
- data/lib/rom/schema/dsl.rb +0 -67
- data/lib/rom/schema.rb +0 -407
- data/lib/rom/setup/auto_registration.rb +0 -74
- data/lib/rom/setup/auto_registration_strategies/base.rb +0 -16
- data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -63
- data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -20
- 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 -83
- data/lib/rom/setup/finalize.rb +0 -152
- data/lib/rom/setup.rb +0 -65
- data/lib/rom/support/configurable.rb +0 -85
- data/lib/rom/transaction.rb +0 -24
- data/lib/rom/types.rb +0 -49
- 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 -25
- 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/custom_namespace/commands/create_customer.rb +0 -8
- data/spec/fixtures/custom_namespace/mappers/customer_list.rb +0 -8
- data/spec/fixtures/custom_namespace/relations/customers.rb +0 -8
- 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/fixtures/wrong/commands/create_customer.rb +0 -8
- data/spec/fixtures/wrong/mappers/customer_list.rb +0 -8
- data/spec/fixtures/wrong/relations/customers.rb +0 -8
- data/spec/integration/command_registry_spec.rb +0 -47
- data/spec/integration/commands/create_spec.rb +0 -157
- 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 -294
- data/spec/integration/commands/update_spec.rb +0 -86
- data/spec/integration/commands_spec.rb +0 -67
- data/spec/integration/gateways/extending_relations_spec.rb +0 -58
- data/spec/integration/gateways/setting_logger_spec.rb +0 -34
- 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/setup_spec.rb +0 -193
- data/spec/shared/command_behavior.rb +0 -28
- data/spec/shared/command_graph.rb +0 -54
- 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 -59
- data/spec/support/constant_leak_finder.rb +0 -14
- data/spec/support/mutant.rb +0 -10
- data/spec/support/schema.rb +0 -14
- data/spec/support/types.rb +0 -5
- data/spec/test/memory_repository_lint_test.rb +0 -27
- data/spec/unit/rom/array_dataset_spec.rb +0 -59
- data/spec/unit/rom/association_set_spec.rb +0 -48
- data/spec/unit/rom/auto_curry_spec.rb +0 -71
- data/spec/unit/rom/commands/graph_spec.rb +0 -192
- data/spec/unit/rom/commands/lazy_spec.rb +0 -310
- data/spec/unit/rom/commands/pre_and_post_processors_spec.rb +0 -343
- data/spec/unit/rom/commands/result_spec.rb +0 -70
- data/spec/unit/rom/commands_spec.rb +0 -188
- 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 -109
- data/spec/unit/rom/create_container_spec.rb +0 -151
- data/spec/unit/rom/enumerable_dataset_spec.rb +0 -15
- 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/gateway_spec.rb +0 -12
- data/spec/unit/rom/memory/inheritance_spec.rb +0 -32
- data/spec/unit/rom/memory/relation_spec.rb +0 -121
- 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/instrumentation_spec.rb +0 -44
- data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
- data/spec/unit/rom/registry_spec.rb +0 -86
- data/spec/unit/rom/relation/attribute_reader_spec.rb +0 -17
- data/spec/unit/rom/relation/call_spec.rb +0 -51
- data/spec/unit/rom/relation/composite_spec.rb +0 -106
- data/spec/unit/rom/relation/curried_spec.rb +0 -67
- data/spec/unit/rom/relation/graph_spec.rb +0 -106
- data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
- data/spec/unit/rom/relation/lazy/graph_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/output_schema_spec.rb +0 -28
- data/spec/unit/rom/relation/schema_spec.rb +0 -259
- data/spec/unit/rom/relation/view_spec.rb +0 -158
- data/spec/unit/rom/relation_spec.rb +0 -252
- data/spec/unit/rom/schema/accessing_attributes_spec.rb +0 -52
- data/spec/unit/rom/schema/append_spec.rb +0 -17
- data/spec/unit/rom/schema/exclude_spec.rb +0 -15
- data/spec/unit/rom/schema/finalize_spec.rb +0 -59
- data/spec/unit/rom/schema/key_predicate_spec.rb +0 -15
- data/spec/unit/rom/schema/merge_spec.rb +0 -17
- data/spec/unit/rom/schema/prefix_spec.rb +0 -16
- data/spec/unit/rom/schema/project_spec.rb +0 -15
- data/spec/unit/rom/schema/rename_spec.rb +0 -22
- data/spec/unit/rom/schema/type_spec.rb +0 -49
- data/spec/unit/rom/schema/uniq_spec.rb +0 -21
- data/spec/unit/rom/schema/wrap_spec.rb +0 -18
- data/spec/unit/rom/schema_spec.rb +0 -10
- data/spec/unit/rom/setup/auto_registration_spec.rb +0 -214
@@ -1,158 +0,0 @@
|
|
1
|
-
require 'rom'
|
2
|
-
require 'rom/memory'
|
3
|
-
|
4
|
-
RSpec.describe ROM::Relation, '.view' do
|
5
|
-
subject(:relation) { relation_class.new(ROM::Memory::Dataset.new([])) }
|
6
|
-
|
7
|
-
let(:registry) do
|
8
|
-
{ tasks: tasks }
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:tasks) do
|
12
|
-
Class.new(ROM::Relation[:memory]) do
|
13
|
-
schema do
|
14
|
-
attribute :title, ROM::Types::String
|
15
|
-
end
|
16
|
-
end.new([])
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'returns view method name' do
|
20
|
-
klass = Class.new(ROM::Relation[:memory]) {
|
21
|
-
schema { attribute :id, ROM::Types::Int }
|
22
|
-
}
|
23
|
-
|
24
|
-
name = klass.view(:by_id, klass.schema) { self }
|
25
|
-
|
26
|
-
expect(name).to be(:by_id)
|
27
|
-
end
|
28
|
-
|
29
|
-
shared_context 'relation with views' do
|
30
|
-
before do
|
31
|
-
relation << { id: 1, name: 'Joe' }
|
32
|
-
relation << { id: 2, name: 'Jane' }
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'appends foreign attributes' do
|
36
|
-
expect(relation.schemas[:foreign_attributes].map(&:name)).to eql(%i[id name title])
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'uses projected schema for view schema' do
|
40
|
-
expect(relation.schemas[:names].map(&:name)).to eql(%i[name])
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'auto-projects the relation via schema' do
|
44
|
-
new_rel = relation_class.new([{ name: 'Jane' }, { name: 'Joe' }])
|
45
|
-
names_schema = relation_class.schemas[:names]
|
46
|
-
|
47
|
-
expect(names_schema).to receive(:call).with(relation).and_return(new_rel)
|
48
|
-
expect(relation.names).to eql(new_rel)
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'auto-projects a restricted relation via schema' do
|
52
|
-
new_rel = relation_class.new([{ id: 2 }])
|
53
|
-
ids_schema = relation_class.schemas[:ids_for_names]
|
54
|
-
|
55
|
-
expect(ids_schema).to receive(:call).with(relation.restrict(name: ['Jane'])).and_return(new_rel)
|
56
|
-
expect(relation.ids_for_names(['Jane'])).to eql(new_rel)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'with an explicit schema' do
|
61
|
-
before do
|
62
|
-
# this is normally called automatically during setup
|
63
|
-
relation_class.finalize(registry, relation)
|
64
|
-
end
|
65
|
-
|
66
|
-
include_context 'relation with views' do
|
67
|
-
let(:relation_class) do
|
68
|
-
Class.new(ROM::Memory::Relation) do
|
69
|
-
schema(:users) do
|
70
|
-
attribute :id, ROM::Types::Int
|
71
|
-
attribute :name, ROM::Types::String
|
72
|
-
end
|
73
|
-
|
74
|
-
view(:foreign_attributes) do
|
75
|
-
schema do
|
76
|
-
append(relations[:tasks][:title])
|
77
|
-
end
|
78
|
-
|
79
|
-
relation do
|
80
|
-
self
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
view(:names) do
|
85
|
-
schema do
|
86
|
-
project(:name)
|
87
|
-
end
|
88
|
-
|
89
|
-
relation do
|
90
|
-
self
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
view(:ids_for_names) do
|
95
|
-
schema do
|
96
|
-
project(:id)
|
97
|
-
end
|
98
|
-
|
99
|
-
relation do |names|
|
100
|
-
restrict(name: names)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
context 'with an inferred schema' do
|
109
|
-
before do
|
110
|
-
# this is normally called automatically during setup
|
111
|
-
relation_class.schema.finalize!
|
112
|
-
relation_class.finalize(registry, relation)
|
113
|
-
end
|
114
|
-
|
115
|
-
include_context 'relation with views' do
|
116
|
-
let(:relation_class) do
|
117
|
-
Class.new(ROM::Memory::Relation) do
|
118
|
-
schema_inferrer -> dataset, gateway {
|
119
|
-
[[ROM::Types::Int.meta(name: :id, source: :users),
|
120
|
-
ROM::Types::String.meta(name: :name, source: :users)], []]
|
121
|
-
}
|
122
|
-
|
123
|
-
schema(:users, infer: true)
|
124
|
-
|
125
|
-
view(:foreign_attributes) do
|
126
|
-
schema do
|
127
|
-
append(relations[:tasks][:title])
|
128
|
-
end
|
129
|
-
|
130
|
-
relation do
|
131
|
-
self
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
view(:names) do
|
136
|
-
schema do
|
137
|
-
project(:name)
|
138
|
-
end
|
139
|
-
|
140
|
-
relation do
|
141
|
-
self
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
view(:ids_for_names) do
|
146
|
-
schema do
|
147
|
-
project(:id)
|
148
|
-
end
|
149
|
-
|
150
|
-
relation do |names|
|
151
|
-
restrict(name: names)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
@@ -1,252 +0,0 @@
|
|
1
|
-
require 'rom/memory'
|
2
|
-
|
3
|
-
RSpec.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([], custom: true)
|
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' do
|
221
|
-
it 'returns an empty schema by default' do
|
222
|
-
relation = Class.new(ROM::Relation) {
|
223
|
-
def self.name
|
224
|
-
'Test::SomeRelation'
|
225
|
-
end
|
226
|
-
}.new([])
|
227
|
-
|
228
|
-
expect(relation.schema).to be_empty
|
229
|
-
expect(relation.schema.inferrer).to be(ROM::Schema::DEFAULT_INFERRER)
|
230
|
-
expect(relation.schema.name).to be(:test_some_relation)
|
231
|
-
expect(relation.schema?).to be(false)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
describe '#input_schema' do
|
236
|
-
it 'returns a schema hash type' do
|
237
|
-
relation = Class.new(ROM::Relation[:memory]) do
|
238
|
-
schema { attribute :id, ROM::Types::Coercible::Int }
|
239
|
-
end.new([])
|
240
|
-
|
241
|
-
expect(relation.input_schema[id: '1']).to eql(id: 1)
|
242
|
-
end
|
243
|
-
|
244
|
-
it 'returns a plain Hash coercer when there is no schema' do
|
245
|
-
relation = Class.new(ROM::Relation[:memory]).new([])
|
246
|
-
|
247
|
-
tuple = [[:id, '1']]
|
248
|
-
|
249
|
-
expect(relation.input_schema[tuple]).to eql(id: '1')
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#[]' do
|
4
|
-
context 'with a schema' do
|
5
|
-
subject(:schema) do
|
6
|
-
define_schema(:users, id: :Int, name: :String, email: :String)
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'returns an attribute identified by its canonical name' do
|
10
|
-
expect(schema[:email]).to eql(define_type(:email, :String, source: :users))
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'returns an aliased attribute identified by its canonical name' do
|
14
|
-
expect(schema.rename(id: :user_id)[:id]).to eql(define_type(:id, :Int, source: :users, alias: :user_id))
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'raises KeyError when attribute is not found' do
|
18
|
-
expect { schema[:not_here] }.to raise_error(KeyError, /not_here/)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'with a merged schema' do
|
23
|
-
subject(:schema) do
|
24
|
-
left.merge(right.__send__(:new, right.map { |attr| attr.meta(source: :tasks) }))
|
25
|
-
end
|
26
|
-
|
27
|
-
let(:left) do
|
28
|
-
define_schema(:users, id: :Int, name: :String)
|
29
|
-
end
|
30
|
-
|
31
|
-
let(:right) do
|
32
|
-
define_schema(:tasks, id: :Int, title: :String)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'returns an attribute identified by its canonical name' do
|
36
|
-
expect(schema[:id]).to eql(define_type(:id, :Int, source: :users))
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'returns an attribute identified by its canonical name when its unique' do
|
40
|
-
expect(schema[:title]).to eql(define_type(:title, :String, source: :tasks))
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'returns an attribute identified by its canonical name and its source' do
|
44
|
-
expect(schema[:id, :tasks]).to eql(define_type(:id, :Int, source: :tasks))
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'raises KeyError when attribute is not found' do
|
48
|
-
expect { schema[:not_here] }.to raise_error(KeyError, /not_here/)
|
49
|
-
expect { schema[:not_here, :tasks] }.to raise_error(KeyError, /not_here/)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#append' do
|
4
|
-
subject(:schema) { left.append(*right) }
|
5
|
-
|
6
|
-
let(:left) do
|
7
|
-
define_schema(:users, id: :Int, name: :String)
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:right) do
|
11
|
-
define_schema(:tasks, user_id: :Int)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns a new schema with attributes from two schemas' do
|
15
|
-
expect(schema.map(&:name)).to eql(%i[id name user_id])
|
16
|
-
end
|
17
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#exclude' do
|
4
|
-
subject(:schema) do
|
5
|
-
define_schema(:users, id: :Int, name: :String, email: :String)
|
6
|
-
end
|
7
|
-
|
8
|
-
let(:excluded) do
|
9
|
-
schema.exclude(:id, :name)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'returns projected schema with renamed attributes using provided prefix' do
|
13
|
-
expect(excluded.map(&:name)).to eql(%i[email])
|
14
|
-
end
|
15
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#finalize!' do
|
4
|
-
context 'without inferrer' do
|
5
|
-
subject(:schema) do
|
6
|
-
define_schema(:users, id: :Int, name: :String)
|
7
|
-
end
|
8
|
-
|
9
|
-
before { schema.finalize! }
|
10
|
-
|
11
|
-
it 'returns a frozen canonical schema' do
|
12
|
-
expect(schema).to be_frozen
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'with inferrer' do
|
17
|
-
subject(:schema) do
|
18
|
-
ROM::Schema.define(:users, attributes: attributes, inferrer: inferrer)
|
19
|
-
end
|
20
|
-
|
21
|
-
let(:inferrer) do
|
22
|
-
proc { [[define_type(:name, :String)], [:id, :age]]}
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'when all required attributes are present' do
|
26
|
-
let(:attributes) do
|
27
|
-
[define_type(:id, :Int), define_type(:age, :Int)]
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'concats defined attributes with inferred attributes' do
|
31
|
-
expect(schema.finalize!.map(&:name)).to eql(%i[id age name])
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'when inferred attributes are overridden' do
|
36
|
-
let(:attributes) do
|
37
|
-
[define_type(:id, :Int),
|
38
|
-
define_type(:age, :Int),
|
39
|
-
define_type(:name, :String).meta(custom: true)]
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'respects overridden attributes' do
|
43
|
-
expect(schema.finalize!.map(&:name)).to eql(%i[id age name])
|
44
|
-
expect(schema[:name].meta[:custom]).to be(true)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when some attributes are missing' do
|
49
|
-
let(:attributes) do
|
50
|
-
[]
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'raises error' do
|
54
|
-
expect { schema.finalize! }.
|
55
|
-
to raise_error(ROM::Schema::MissingAttributesError, /missing attributes in :users schema: :id, :age/)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#key?' do
|
4
|
-
subject(:schema) do
|
5
|
-
define_schema(:users, name: :String)
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'returns true when an attribute exists' do
|
9
|
-
expect(schema.key?(:name)).to be(true)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'returns false when an attribute does not exist' do
|
13
|
-
expect(schema.key?(:foo)).to be(false)
|
14
|
-
end
|
15
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#merge' do
|
4
|
-
subject(:schema) { left.merge(right) }
|
5
|
-
|
6
|
-
let(:left) do
|
7
|
-
define_schema(:users, id: :Int, name: :String)
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:right) do
|
11
|
-
define_schema(:tasks, user_id: :Int)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns a new schema with attributes from two schemas' do
|
15
|
-
expect(schema.map(&:name)).to eql(%i[id name user_id])
|
16
|
-
end
|
17
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#prefix' do
|
4
|
-
subject(:schema) do
|
5
|
-
define_schema(:users, id: :Int, name: :String)
|
6
|
-
end
|
7
|
-
|
8
|
-
let(:prefixed) do
|
9
|
-
schema.prefix(:user)
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'returns projected schema with renamed attributes using provided prefix' do
|
13
|
-
expect(prefixed.map(&:alias)).to eql(%i[user_id user_name])
|
14
|
-
expect(prefixed.map { |attr| attr.meta[:name] }).to eql(%i[id name])
|
15
|
-
end
|
16
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#project' do
|
4
|
-
subject(:schema) do
|
5
|
-
define_schema(:users, id: :Int, name: :String, age: :Int)
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'projects provided attribute names' do
|
9
|
-
expect(schema.project(:name, :age).map(&:name)).to eql(%i[name age])
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'projects provided attributes' do
|
13
|
-
expect(schema.project(schema[:name], schema[:age]).map(&:name)).to eql(%i[name age])
|
14
|
-
end
|
15
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'rom/schema'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema, '#rename' do
|
4
|
-
subject(:schema) do
|
5
|
-
define_schema(
|
6
|
-
:users,
|
7
|
-
user_id: :Int, user_name: :String, user_email: :String
|
8
|
-
)
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:renamed) do
|
12
|
-
schema.rename(user_id: :id, user_name: :name)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'returns projected schema with renamed attributes' do
|
16
|
-
expect(renamed.map(&:name)).to eql(%i[user_id user_name user_email])
|
17
|
-
expect(renamed.map(&:alias)).to eql([:id, :name, nil])
|
18
|
-
expect(renamed.all?(&:aliased?)).to be(false)
|
19
|
-
expect(renamed[:user_id]).to be_aliased
|
20
|
-
expect(renamed[:user_name]).to be_aliased
|
21
|
-
end
|
22
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'rom/schema/attribute'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Schema::Attribute do
|
4
|
-
describe '#inspect' do
|
5
|
-
context 'with a primitive definition' do
|
6
|
-
subject(:type) do
|
7
|
-
ROM::Schema::Attribute.new(ROM::Types::Int).meta(name: :id, primary_key: true)
|
8
|
-
end
|
9
|
-
|
10
|
-
specify do
|
11
|
-
expect(type.inspect).to eql("#<ROM::Schema::Attribute[Integer] name=:id primary_key=true>")
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with a sum' do
|
16
|
-
subject(:type) do
|
17
|
-
ROM::Schema::Attribute.new(ROM::Types::Bool).meta(name: :admin)
|
18
|
-
end
|
19
|
-
|
20
|
-
specify do
|
21
|
-
expect(type.inspect).to eql("#<ROM::Schema::Attribute[TrueClass | FalseClass] name=:admin>")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe '#aliased' do
|
27
|
-
subject(:type) do
|
28
|
-
ROM::Schema::Attribute.new(ROM::Types::String).meta(name: :user_name)
|
29
|
-
end
|
30
|
-
|
31
|
-
specify do
|
32
|
-
expect(type.as(:name).meta[:alias]).to eql(:name)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe '#method_missing' do
|
37
|
-
subject(:type) do
|
38
|
-
ROM::Schema::Attribute.new(ROM::Types::Int).meta(name: :id, primary_key: true)
|
39
|
-
end
|
40
|
-
|
41
|
-
specify do
|
42
|
-
expect(type.meta).to eql(name: :id, primary_key: true)
|
43
|
-
end
|
44
|
-
|
45
|
-
specify do
|
46
|
-
expect { type.not_here }.to raise_error(NoMethodError, /not_here/)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|