rom 2.0.2 → 5.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +122 -324
  3. data/LICENSE +17 -17
  4. data/README.md +91 -22
  5. data/lib/rom/version.rb +3 -1
  6. data/lib/rom.rb +4 -46
  7. metadata +42 -245
  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,93 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Mapper definition DSL' do
4
- include_context 'container'
5
- include_context 'users and tasks'
6
-
7
- let(:header) { mapper.header }
8
-
9
- describe 'unwrapping relation mapper' do
10
- before do
11
- configuration.relation(:tasks) do
12
- def with_user
13
- tuples = map { |tuple|
14
- tuple.merge(user: users.restrict(name: tuple[:name]).first)
15
- }
16
-
17
- __new__(tuples)
18
- end
19
- end
20
-
21
- configuration.relation(:users)
22
-
23
- configuration.mappers do
24
- define(:tasks) do
25
- model name: 'Test::Task'
26
-
27
- attribute :title
28
- attribute :priority
29
- end
30
- end
31
- end
32
-
33
- it 'unwraps nested attributes via options hash' do
34
- configuration.mappers do
35
- define(:with_user, parent: :tasks) do
36
- attribute :title
37
- attribute :priority
38
-
39
- unwrap user: [:email, :name]
40
- end
41
- end
42
-
43
- result = container.relation(:tasks).with_user.as(:with_user).to_a.last
44
-
45
- expect(result).to eql(title: 'be cool',
46
- priority: 2,
47
- name: 'Jane',
48
- email: 'jane@doe.org')
49
- end
50
-
51
- it 'unwraps nested attributes via options block' do
52
- configuration.mappers do
53
- define(:with_user, parent: :tasks) do
54
- attribute :title
55
- attribute :priority
56
-
57
- unwrap :user do
58
- attribute :name
59
- attribute :user_email, from: :email
60
- end
61
- end
62
- end
63
-
64
- result = container.relation(:tasks).with_user.as(:with_user).to_a.last
65
-
66
- expect(result).to eql(title: 'be cool',
67
- priority: 2,
68
- name: 'Jane',
69
- user_email: 'jane@doe.org')
70
- end
71
-
72
- it 'unwraps specified attributes via options block' do
73
- configuration.mappers do
74
- define(:with_user, parent: :tasks) do
75
- attribute :title
76
- attribute :priority
77
-
78
- unwrap :contact, from: :user do
79
- attribute :task_user_name, from: :name
80
- end
81
- end
82
- end
83
-
84
- result = container.relation(:tasks).with_user.as(:with_user).to_a.last
85
-
86
- expect(result).to eql(title: 'be cool',
87
- priority: 2,
88
- name: 'Jane',
89
- task_user_name: 'Jane',
90
- contact: { email: 'jane@doe.org' })
91
- end
92
- end
93
- end
@@ -1,155 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Mapper definition DSL' do
4
- include_context 'container'
5
- include_context 'users and tasks'
6
-
7
- let(:header) { mapper.header }
8
-
9
- describe 'wrapped relation mapper' do
10
- before do
11
- configuration.relation(:tasks) do
12
- def with_user
13
- join(users)
14
- end
15
- end
16
-
17
- configuration.relation(:users)
18
-
19
- configuration.mappers do
20
- define(:tasks) do
21
- model name: 'Test::Task'
22
-
23
- attribute :title
24
- attribute :priority
25
- end
26
- end
27
- end
28
-
29
- it 'allows defining wrapped attributes via options hash' do
30
- configuration.mappers do
31
- define(:with_user, parent: :tasks) do
32
- model name: 'Test::TaskWithUser'
33
-
34
- attribute :title
35
- attribute :priority
36
-
37
- wrap user: [:email]
38
- end
39
- end
40
-
41
- container
42
-
43
- Test::TaskWithUser.send(:include, Dry::Equalizer(:title, :priority, :user))
44
-
45
- jane = container.relation(:tasks).with_user.as(:with_user).to_a.last
46
-
47
- expect(jane).to eql(
48
- Test::TaskWithUser.new(
49
- title: 'be cool',
50
- priority: 2,
51
- user: { email: 'jane@doe.org' }
52
- )
53
- )
54
- end
55
-
56
- it 'allows defining wrapped attributes via options block' do
57
- configuration.mappers do
58
- define(:with_user, parent: :tasks) do
59
- model name: 'Test::TaskWithUser'
60
-
61
- attribute :title
62
- attribute :priority
63
-
64
- wrap :user do
65
- attribute :email
66
- end
67
- end
68
- end
69
-
70
- container
71
-
72
- Test::TaskWithUser.send(:include, Dry::Equalizer(:title, :priority, :user))
73
-
74
- jane = container.relation(:tasks).with_user.as(:with_user).to_a.last
75
-
76
- expect(jane).to eql(
77
- Test::TaskWithUser.new(
78
- title: 'be cool',
79
- priority: 2,
80
- user: { email: 'jane@doe.org' }
81
- )
82
- )
83
- end
84
-
85
- it 'allows defining nested wrapped attributes via a block' do
86
- configuration.mappers do
87
- define(:with_user, parent: :tasks, inherit_header: false) do
88
- model name: 'Test::TaskWithUser'
89
-
90
- attribute :title
91
- attribute :priority
92
-
93
- wrap :user do
94
- model name: 'Test::TaskUser'
95
- attribute :name
96
-
97
- wrap :contact do
98
- model name: 'Test::Contact'
99
- attribute :email
100
- end
101
- end
102
- end
103
- end
104
-
105
- container
106
-
107
- Test::TaskWithUser.send(:include, Dry::Equalizer(:title, :priority, :user))
108
- Test::TaskUser.send(:include, Dry::Equalizer(:name, :contact))
109
- Test::Contact.send(:include, Dry::Equalizer(:email))
110
-
111
- jane = container.relation(:tasks).with_user.as(:with_user).to_a.last
112
-
113
- expect(jane).to eql(
114
- Test::TaskWithUser.new(
115
- title: 'be cool',
116
- priority: 2,
117
- user: Test::TaskUser.new(
118
- name: 'Jane', contact: Test::Contact.new(email: 'jane@doe.org')
119
- )
120
- )
121
- )
122
- end
123
-
124
- it 'allows defining wrapped attributes mapped to a model' do
125
- configuration.mappers do
126
- define(:with_user, parent: :tasks) do
127
- model name: 'Test::TaskWithUser'
128
-
129
- attribute :title
130
- attribute :priority
131
-
132
- wrap :user do
133
- model name: 'Test::User'
134
- attribute :email
135
- end
136
- end
137
- end
138
-
139
- container
140
-
141
- Test::TaskWithUser.send(:include, Dry::Equalizer(:title, :priority, :user))
142
- Test::User.send(:include, Dry::Equalizer(:email))
143
-
144
- jane = container.relation(:tasks).with_user.as(:with_user).to_a.last
145
-
146
- expect(jane).to eql(
147
- Test::TaskWithUser.new(
148
- title: 'be cool',
149
- priority: 2,
150
- user: Test::User.new(email: 'jane@doe.org')
151
- )
152
- )
153
- end
154
- end
155
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'rom/memory'
4
-
5
- describe ROM::Memory::Commands::Create do
6
- include_context 'container'
7
- include_context 'users and tasks'
8
-
9
- before do
10
- configuration.relation(:users) do
11
- def by_id(id)
12
- restrict(id: id)
13
- end
14
- end
15
- configuration.commands(:users) do
16
- define(:create)
17
- end
18
- end
19
-
20
- subject(:command) { container.command(:users).create }
21
-
22
- it_behaves_like 'a command'
23
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'rom/memory'
4
-
5
- describe ROM::Memory::Commands::Delete do
6
- include_context 'container'
7
- include_context 'users and tasks'
8
-
9
- before do
10
- configuration.relation(:users) do
11
- def by_id(id)
12
- restrict(id: id)
13
- end
14
- end
15
- configuration.commands(:users) do
16
- define(:delete)
17
- end
18
- end
19
-
20
- subject(:command) { container.command(:users).delete }
21
-
22
- it_behaves_like 'a command'
23
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'rom/memory'
4
-
5
- describe ROM::Memory::Commands::Update do
6
- include_context 'container'
7
- include_context 'users and tasks'
8
-
9
- before do
10
- configuration.relation(:users) do
11
- def by_id(id)
12
- restrict(id: id)
13
- end
14
- end
15
- configuration.commands(:users) do
16
- define(:update)
17
- end
18
- end
19
-
20
- subject(:command) { container.command(:users).update }
21
-
22
- it_behaves_like 'a command'
23
- end
@@ -1,69 +0,0 @@
1
- require 'spec_helper'
2
- require 'rom/memory'
3
-
4
- describe 'Setting up ROM with multiple environments' do
5
- let(:configuration) do
6
- {
7
- one: ROM::Configuration.new(:memory),
8
- two: ROM::Configuration.new(:memory)
9
- }
10
- end
11
-
12
- let(:container) do
13
- {
14
- one: ROM.container(configuration[:one]),
15
- two: ROM.container(configuration[:two]),
16
- }
17
- end
18
-
19
- context 'without :auto_registration plugin' do
20
- before do
21
- module Test
22
- class Users < ROM::Relation[:memory]
23
- dataset :users
24
- end
25
-
26
- class CreateUser < ROM::Commands::Create[:memory]
27
- register_as :create
28
- relation :users
29
- result :one
30
- end
31
-
32
- class UserMapper < ROM::Mapper
33
- relation :users
34
- register_as :entity
35
- end
36
- end
37
- end
38
-
39
- it 'registers items independently of other environments' do
40
- configuration[:one].register_relation(Test::Users)
41
- configuration[:one].register_command(Test::CreateUser)
42
- configuration[:one].register_mapper(Test::UserMapper)
43
-
44
- expect(container[:one].relations[:users]).to be_kind_of Test::Users
45
- expect(container[:one].commands[:users].create).to be_kind_of Test::CreateUser
46
- expect(container[:one].mappers[:users].entity).to be_kind_of Test::UserMapper
47
-
48
- expect { container[:two].relations[:users] }.to raise_error(
49
- ROM::Registry::ElementNotFoundError
50
- )
51
- expect { container[:two].commands[:users].create }.to raise_error(
52
- ROM::Registry::ElementNotFoundError
53
- )
54
- expect { container[:two].commands[:users].create }.to raise_error(
55
- ROM::Registry::ElementNotFoundError
56
- )
57
- end
58
-
59
- it 'allows use of the same identifiers in different environments' do
60
- configuration[:one].register_relation(Test::Users)
61
- configuration[:one].register_command(Test::CreateUser)
62
- configuration[:one].register_mapper(Test::UserMapper)
63
-
64
- expect { configuration[:two].register_relation(Test::Users) }.to_not raise_error
65
- expect { configuration[:two].register_command(Test::CreateUser) }.to_not raise_error
66
- expect { configuration[:two].register_mapper(Test::UserMapper) }.to_not raise_error
67
- end
68
- end
69
- end
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
- require 'rom/memory'
3
-
4
- describe 'Using in-memory gateways for cross-repo access' do
5
- let(:configuration) do
6
- ROM::Configuration.new(left: :memory, right: :memory, main: :memory)
7
- end
8
-
9
- let(:container) { ROM.container(configuration) }
10
- let(:gateways) { container.gateways }
11
-
12
- it 'works' do
13
- configuration.relation(:users, gateway: :left) do
14
- def by_name(name)
15
- restrict(name: name)
16
- end
17
- end
18
-
19
- configuration.relation(:tasks, gateway: :right)
20
-
21
- configuration.relation(:users_and_tasks, gateway: :main) do
22
- def by_user(name)
23
- join(users.by_name(name), tasks)
24
- end
25
- end
26
-
27
- configuration.mappers do
28
- define(:users_and_tasks) do
29
- group tasks: [:title]
30
- end
31
- end
32
-
33
- gateways[:left][:users] << { user_id: 1, name: 'Joe' }
34
- gateways[:left][:users] << { user_id: 2, name: 'Jane' }
35
- gateways[:right][:tasks] << { user_id: 1, title: 'Have fun' }
36
- gateways[:right][:tasks] << { user_id: 2, title: 'Have fun' }
37
-
38
- user_and_tasks = container.relation(:users_and_tasks)
39
- .by_user('Jane')
40
- .as(:users_and_tasks)
41
-
42
- expect(user_and_tasks).to match_array([
43
- { user_id: 2, name: 'Jane', tasks: [{ title: 'Have fun' }] }
44
- ])
45
- end
46
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ROM::Relation, '.dataset' do
4
- include_context 'container'
5
-
6
- it 'injects configured dataset when block was provided' do
7
- configuration.relation(:users) do
8
- dataset do
9
- insert(id: 2, name: 'Joe')
10
- insert(id: 1, name: 'Jane')
11
-
12
- restrict(name: 'Jane')
13
- end
14
- end
15
-
16
- expect(container.relation(:users).to_a).to eql([{ id: 1, name: 'Jane' }])
17
- end
18
-
19
- it 'yields relation class for setting custom dataset proc' do
20
- configuration.relation(:users) do
21
- schema do
22
- attribute :id, ROM::Memory::Types::Int.meta(primary_key: true)
23
- attribute :name, ROM::Memory::Types::String
24
- end
25
-
26
- dataset do |rel_klass|
27
- insert(id: 2, name: 'Joe')
28
- insert(id: 1, name: 'Jane')
29
-
30
- order(*rel_klass.schema.primary_key.map { |t| t.meta[:name] })
31
- end
32
- end
33
-
34
- expect(container.relation(:users).to_a).to eql([
35
- { id: 1, name: 'Jane' }, { id: 2, name: 'Joe' }
36
- ])
37
- end
38
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe 'Inheritance relation hierarchy' do
4
- include_context 'container'
5
-
6
- before do
7
- module Test
8
- class Users < ROM::Relation[:memory]
9
- dataset :users
10
-
11
- def by_email(email)
12
- restrict(email: email)
13
- end
14
- end
15
-
16
- class OtherUsers < Users
17
- register_as :other_users
18
- end
19
- end
20
-
21
- configuration.register_relation(Test::Users, Test::OtherUsers)
22
- end
23
-
24
- it 'registers parent and descendant relations' do
25
- users = container.relation(:users)
26
- other_users = container.relation(:other_users)
27
-
28
- expect(users).to be_instance_of(Test::Users)
29
- expect(other_users).to be_instance_of(Test::OtherUsers)
30
-
31
- jane = { name: 'Jane', email: 'jane@doe.org' }
32
-
33
- other_users.insert(jane)
34
-
35
- expect(other_users.by_email('jane@doe.org').one).to eql(jane)
36
- end
37
- end
@@ -1,169 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Reading relations' do
4
- include_context 'container'
5
- include_context 'users and tasks'
6
-
7
- before do
8
- configuration.relation(:tasks)
9
-
10
- configuration.relation(:users) do
11
- def by_name(name)
12
- restrict(name: name)
13
- end
14
-
15
- def with_task
16
- join(tasks)
17
- end
18
-
19
- def with_tasks
20
- join(tasks)
21
- end
22
-
23
- def sorted
24
- order(:name, :email)
25
- end
26
- end
27
- end
28
-
29
-
30
- it 'exposes a relation reader' do
31
- configuration.mappers do
32
- define(:users) do
33
- model name: 'Test::User'
34
-
35
- attribute :name
36
- attribute :email
37
- end
38
- end
39
-
40
- users = users_relation.sorted.by_name('Jane').as(:users)
41
- user = users.first
42
-
43
- expect(user).to be_an_instance_of(Test::User)
44
- expect(user.name).to eql 'Jane'
45
- expect(user.email).to eql 'jane@doe.org'
46
- end
47
-
48
- it 'maps grouped relations' do
49
- configuration.mappers do
50
- define(:users) do
51
- model name: 'Test::User'
52
-
53
- attribute :name
54
- attribute :email
55
- end
56
-
57
- define(:with_tasks, parent: :users) do
58
- model name: 'Test::UserWithTasks'
59
-
60
- group tasks: [:title, :priority]
61
- end
62
- end
63
-
64
- container
65
-
66
- Test::User.send(:include, Dry::Equalizer(:name, :email))
67
- Test::UserWithTasks.send(:include, Dry::Equalizer(:name, :email, :tasks))
68
-
69
- user = container.relation(:users).sorted.as(:users).first
70
-
71
- expect(user).to eql(
72
- Test::User.new(name: "Jane", email: "jane@doe.org")
73
- )
74
-
75
- user = container.relation(:users).with_tasks.sorted.as(:with_tasks).first
76
-
77
- expect(user).to eql(
78
- Test::UserWithTasks.new(
79
- name: "Jane",
80
- email: "jane@doe.org",
81
- tasks: [{ title: "be cool", priority: 2 }])
82
- )
83
- end
84
-
85
- it 'maps wrapped relations' do
86
- configuration.mappers do
87
- define(:users) do
88
- model name: 'Test::User'
89
-
90
- attribute :name
91
- attribute :email
92
- end
93
-
94
- define(:with_task, parent: :users) do
95
- model name: 'Test::UserWithTask'
96
-
97
- wrap task: [:title, :priority]
98
- end
99
- end
100
-
101
- container
102
-
103
- Test::User.send(:include, Dry::Equalizer(:name, :email))
104
- Test::UserWithTask.send(:include, Dry::Equalizer(:name, :email, :task))
105
-
106
- user = container.relation(:users).sorted.with_task.as(:with_task).first
107
-
108
- expect(user).to eql(
109
- Test::UserWithTask.new(name: "Jane", email: "jane@doe.org",
110
- task: { title: "be cool", priority: 2 })
111
- )
112
- end
113
-
114
- it 'maps hashes' do
115
- configuration.mappers do
116
- define(:users)
117
- end
118
-
119
- user = container.relation(:users).by_name("Jane").as(:users).first
120
-
121
- expect(user).to eql(name: "Jane", email: "jane@doe.org")
122
- end
123
-
124
- it 'allows cherry-picking of a mapper' do
125
- configuration.mappers do
126
- define(:users) do
127
- attribute :name
128
- attribute :email
129
- end
130
-
131
- define(:prefixer, parent: :users) do
132
- attribute :user_name, from: :name
133
- attribute :user_email, from: :email
134
- end
135
- end
136
-
137
- user = container.relation(:users).map_with(:prefixer).first
138
-
139
- expect(user).to eql(user_name: 'Joe', user_email: "joe@doe.org")
140
- end
141
-
142
- it 'allows passing a block to retrieve relations for mapping' do
143
- configuration.mappers do
144
- define(:users) do
145
- attribute :name
146
- attribute :email
147
- end
148
-
149
- define(:prefixer, parent: :users) do
150
- attribute :user_name, from: :name
151
- attribute :user_email, from: :email
152
- end
153
- end
154
-
155
- expect {
156
- container.relation(:users, &:not_here)
157
- }.to raise_error(NoMethodError, /not_here/)
158
-
159
- expect {
160
- container.relation(:users) { |users| users.by_name('Joe') }.as(:not_here)
161
- }.to raise_error(ROM::MapperMissingError, /not_here/)
162
-
163
- user = container.relation(:users) { |users|
164
- users.by_name('Joe')
165
- }.map_with(:prefixer).call.first
166
-
167
- expect(user).to eql(user_name: 'Joe', user_email: "joe@doe.org")
168
- end
169
- end