rom 2.0.2 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +35 -430
  3. data/LICENSE +1 -1
  4. data/README.md +83 -11
  5. data/lib/rom/version.rb +1 -1
  6. data/lib/rom.rb +3 -46
  7. metadata +30 -236
  8. data/.gitignore +0 -24
  9. data/.rspec +0 -3
  10. data/.rubocop.yml +0 -87
  11. data/.rubocop_todo.yml +0 -46
  12. data/.travis.yml +0 -28
  13. data/CODE_OF_CONDUCT.md +0 -13
  14. data/CONTRIBUTING.md +0 -1
  15. data/Gemfile +0 -41
  16. data/Guardfile +0 -24
  17. data/Rakefile +0 -22
  18. data/lib/rom/association_set.rb +0 -26
  19. data/lib/rom/command.rb +0 -173
  20. data/lib/rom/command_registry.rb +0 -153
  21. data/lib/rom/commands/class_interface.rb +0 -148
  22. data/lib/rom/commands/composite.rb +0 -54
  23. data/lib/rom/commands/create.rb +0 -13
  24. data/lib/rom/commands/delete.rb +0 -14
  25. data/lib/rom/commands/graph/builder.rb +0 -176
  26. data/lib/rom/commands/graph/class_interface.rb +0 -62
  27. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  28. data/lib/rom/commands/graph.rb +0 -103
  29. data/lib/rom/commands/lazy/create.rb +0 -23
  30. data/lib/rom/commands/lazy/delete.rb +0 -27
  31. data/lib/rom/commands/lazy/update.rb +0 -34
  32. data/lib/rom/commands/lazy.rb +0 -99
  33. data/lib/rom/commands/result.rb +0 -96
  34. data/lib/rom/commands/update.rb +0 -14
  35. data/lib/rom/commands.rb +0 -3
  36. data/lib/rom/configuration.rb +0 -88
  37. data/lib/rom/configuration_dsl/command.rb +0 -43
  38. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  39. data/lib/rom/configuration_dsl/mapper.rb +0 -37
  40. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -44
  41. data/lib/rom/configuration_dsl/relation.rb +0 -26
  42. data/lib/rom/configuration_dsl.rb +0 -78
  43. data/lib/rom/configuration_plugin.rb +0 -17
  44. data/lib/rom/constants.rb +0 -30
  45. data/lib/rom/container.rb +0 -231
  46. data/lib/rom/create_container.rb +0 -61
  47. data/lib/rom/environment.rb +0 -70
  48. data/lib/rom/gateway.rb +0 -154
  49. data/lib/rom/global/plugin_dsl.rb +0 -49
  50. data/lib/rom/global.rb +0 -60
  51. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  52. data/lib/rom/lint/gateway.rb +0 -94
  53. data/lib/rom/lint/linter.rb +0 -78
  54. data/lib/rom/lint/spec.rb +0 -20
  55. data/lib/rom/lint/test.rb +0 -98
  56. data/lib/rom/mapper_registry.rb +0 -35
  57. data/lib/rom/memory/commands.rb +0 -58
  58. data/lib/rom/memory/dataset.rb +0 -98
  59. data/lib/rom/memory/gateway.rb +0 -64
  60. data/lib/rom/memory/relation.rb +0 -49
  61. data/lib/rom/memory/storage.rb +0 -59
  62. data/lib/rom/memory/types.rb +0 -9
  63. data/lib/rom/memory.rb +0 -4
  64. data/lib/rom/pipeline.rb +0 -106
  65. data/lib/rom/plugin.rb +0 -17
  66. data/lib/rom/plugin_base.rb +0 -31
  67. data/lib/rom/plugin_registry.rb +0 -173
  68. data/lib/rom/plugins/command/schema.rb +0 -37
  69. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -17
  70. data/lib/rom/plugins/relation/key_inference.rb +0 -46
  71. data/lib/rom/plugins/relation/registry_reader.rb +0 -32
  72. data/lib/rom/plugins/relation/view/dsl.rb +0 -32
  73. data/lib/rom/plugins/relation/view.rb +0 -95
  74. data/lib/rom/relation/class_interface.rb +0 -230
  75. data/lib/rom/relation/composite.rb +0 -46
  76. data/lib/rom/relation/curried.rb +0 -104
  77. data/lib/rom/relation/graph.rb +0 -115
  78. data/lib/rom/relation/loaded.rb +0 -118
  79. data/lib/rom/relation/materializable.rb +0 -66
  80. data/lib/rom/relation/name.rb +0 -102
  81. data/lib/rom/relation.rb +0 -172
  82. data/lib/rom/relation_registry.rb +0 -9
  83. data/lib/rom/schema/dsl.rb +0 -58
  84. data/lib/rom/schema.rb +0 -89
  85. data/lib/rom/setup/auto_registration.rb +0 -69
  86. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -11
  87. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -22
  88. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -19
  89. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  90. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  91. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  92. data/lib/rom/setup/finalize/finalize_relations.rb +0 -60
  93. data/lib/rom/setup/finalize.rb +0 -146
  94. data/lib/rom/setup.rb +0 -55
  95. data/lib/rom/support/configurable.rb +0 -80
  96. data/lib/rom/types.rb +0 -18
  97. data/log/.gitkeep +0 -0
  98. data/rakelib/benchmark.rake +0 -15
  99. data/rakelib/mutant.rake +0 -19
  100. data/rakelib/rubocop.rake +0 -18
  101. data/rom.gemspec +0 -26
  102. data/spec/fixtures/app/commands/create_user.rb +0 -2
  103. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  104. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  105. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  106. data/spec/fixtures/app/my_relations/users.rb +0 -2
  107. data/spec/fixtures/app/relations/users.rb +0 -2
  108. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  109. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  110. data/spec/fixtures/custom/relations/users.rb +0 -6
  111. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  112. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  113. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  114. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  115. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  116. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  117. data/spec/integration/command_registry_spec.rb +0 -60
  118. data/spec/integration/commands/create_spec.rb +0 -177
  119. data/spec/integration/commands/delete_spec.rb +0 -67
  120. data/spec/integration/commands/error_handling_spec.rb +0 -25
  121. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  122. data/spec/integration/commands/graph_spec.rb +0 -288
  123. data/spec/integration/commands/update_spec.rb +0 -109
  124. data/spec/integration/commands_spec.rb +0 -67
  125. data/spec/integration/mappers/combine_spec.rb +0 -117
  126. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  127. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  128. data/spec/integration/mappers/embedded_spec.rb +0 -62
  129. data/spec/integration/mappers/exclude_spec.rb +0 -27
  130. data/spec/integration/mappers/fold_spec.rb +0 -71
  131. data/spec/integration/mappers/group_spec.rb +0 -163
  132. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  133. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  134. data/spec/integration/mappers/prefix_spec.rb +0 -48
  135. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  136. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  137. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  138. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  139. data/spec/integration/mappers/step_spec.rb +0 -119
  140. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  141. data/spec/integration/mappers/unfold_spec.rb +0 -92
  142. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  143. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  144. data/spec/integration/mappers/wrap_spec.rb +0 -155
  145. data/spec/integration/memory/commands/create_spec.rb +0 -23
  146. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  147. data/spec/integration/memory/commands/update_spec.rb +0 -23
  148. data/spec/integration/multi_env_spec.rb +0 -69
  149. data/spec/integration/multi_repo_spec.rb +0 -46
  150. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  151. data/spec/integration/relations/inheritance_spec.rb +0 -37
  152. data/spec/integration/relations/reading_spec.rb +0 -169
  153. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  154. data/spec/integration/repositories/extending_relations_spec.rb +0 -58
  155. data/spec/integration/repositories/setting_logger_spec.rb +0 -34
  156. data/spec/integration/setup_spec.rb +0 -160
  157. data/spec/shared/command_behavior.rb +0 -28
  158. data/spec/shared/command_graph.rb +0 -50
  159. data/spec/shared/container.rb +0 -9
  160. data/spec/shared/enumerable_dataset.rb +0 -52
  161. data/spec/shared/gateway_only.rb +0 -6
  162. data/spec/shared/materializable.rb +0 -36
  163. data/spec/shared/no_container.rb +0 -16
  164. data/spec/shared/one_behavior.rb +0 -26
  165. data/spec/shared/proxy.rb +0 -0
  166. data/spec/shared/users_and_tasks.rb +0 -10
  167. data/spec/spec_helper.rb +0 -52
  168. data/spec/support/constant_leak_finder.rb +0 -14
  169. data/spec/support/mutant.rb +0 -10
  170. data/spec/support/types.rb +0 -5
  171. data/spec/test/memory_repository_lint_test.rb +0 -27
  172. data/spec/unit/rom/association_set_spec.rb +0 -23
  173. data/spec/unit/rom/commands/graph_spec.rb +0 -191
  174. data/spec/unit/rom/commands/lazy_spec.rb +0 -307
  175. data/spec/unit/rom/commands/result_spec.rb +0 -70
  176. data/spec/unit/rom/commands_spec.rb +0 -165
  177. data/spec/unit/rom/configurable_spec.rb +0 -49
  178. data/spec/unit/rom/configuration_spec.rb +0 -61
  179. data/spec/unit/rom/container_spec.rb +0 -99
  180. data/spec/unit/rom/create_container_spec.rb +0 -151
  181. data/spec/unit/rom/environment_spec.rb +0 -123
  182. data/spec/unit/rom/gateway_spec.rb +0 -146
  183. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  184. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  185. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  186. data/spec/unit/rom/memory/relation_spec.rb +0 -109
  187. data/spec/unit/rom/memory/repository_spec.rb +0 -12
  188. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  189. data/spec/unit/rom/plugin_spec.rb +0 -150
  190. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  191. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  192. data/spec/unit/rom/plugins/relation/view_spec.rb +0 -51
  193. data/spec/unit/rom/relation/composite_spec.rb +0 -89
  194. data/spec/unit/rom/relation/curried_spec.rb +0 -52
  195. data/spec/unit/rom/relation/graph_spec.rb +0 -92
  196. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  197. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  198. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  199. data/spec/unit/rom/relation/name_spec.rb +0 -58
  200. data/spec/unit/rom/relation/schema_spec.rb +0 -117
  201. data/spec/unit/rom/relation_spec.rb +0 -237
  202. data/spec/unit/rom/schema_spec.rb +0 -10
  203. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -152
@@ -1,177 +0,0 @@
1
- require 'spec_helper'
2
- require 'dry-struct'
3
-
4
- describe 'Commands / Create' do
5
- include_context 'container'
6
- include_context 'users and tasks'
7
-
8
- let(:users) { container.commands.users }
9
- let(:tasks) { container.commands.tasks }
10
-
11
- before do
12
- module Test
13
- UserValidator = Class.new do
14
- ValidationError = Class.new(ROM::CommandError)
15
-
16
- def self.call(params)
17
- unless params[:name] && params[:email]
18
- raise ValidationError, ":name and :email are required"
19
- end
20
- end
21
- end
22
- end
23
-
24
- configuration.relation(:users)
25
- configuration.relation(:tasks)
26
-
27
- class Test::CreateUser < ROM::Commands::Create[:memory]
28
- relation :users
29
- register_as :create
30
- result :one
31
- validator Test::UserValidator
32
- end
33
-
34
- class Test::CreateTask < ROM::Commands::Create[:memory]
35
- relation :tasks
36
- register_as :create
37
- result :one
38
-
39
- def execute(task, user)
40
- super(task.merge(name: user.to_h[:name]))
41
- end
42
- end
43
-
44
- Test::User = Class.new(Dry::Struct) do
45
- attribute :name, Types::String
46
- attribute :email, Types::String
47
- end
48
-
49
- Test::Task = Class.new(Dry::Struct) do
50
- attribute :name, Types::String
51
- attribute :title, Types::String
52
- end
53
-
54
- class Test::UserMapper < ROM::Mapper
55
- relation :users
56
- register_as :entity
57
- model Test::User
58
- attribute :name
59
- attribute :email
60
- end
61
-
62
- class Test::TaskMapper < ROM::Mapper
63
- relation :tasks
64
- register_as :entity
65
- model Test::Task
66
- attribute :name
67
- attribute :title
68
- end
69
-
70
- configuration.register_command(Test::CreateUser, Test::CreateTask)
71
- configuration.register_mapper(Test::UserMapper, Test::TaskMapper)
72
- end
73
-
74
- it 'inserts user on successful validation' do
75
- result = users.try {
76
- users.create.call(name: 'Piotr', email: 'piotr@solnic.eu')
77
- }
78
-
79
- expect(result.value).to eql(name: 'Piotr', email: 'piotr@solnic.eu')
80
- end
81
-
82
- it 'inserts user and associated task when things go well' do
83
- result = users.try {
84
- command = users.create.with(name: 'Piotr', email: 'piotr@solnic.eu')
85
- command >>= tasks.create.with(title: 'Finish command-api')
86
- command
87
- }
88
-
89
- expect(result.value).to eql(name: 'Piotr', title: 'Finish command-api')
90
- end
91
-
92
- it 'returns validation object with errors on failed validation' do
93
- result = users.try { users.create.call(name: 'Piotr') }
94
-
95
- expect(result.error).to be_instance_of(Test::ValidationError)
96
- expect(result.error.message).to eql(":name and :email are required")
97
- expect(container.relations.users.count).to be(2)
98
- end
99
-
100
- describe '"result" option' do
101
- it 'returns a single tuple when set to :one' do
102
- configuration.commands(:users) do
103
- define(:create_one, type: :create) do
104
- result :one
105
- end
106
- end
107
-
108
- tuple = { name: 'Piotr', email: 'piotr@solnic.eu' }
109
-
110
- result = users.try {
111
- users.create_one.call(tuple)
112
- }
113
-
114
- expect(result.value).to eql(tuple)
115
- end
116
-
117
- it 'allows only valid result types' do
118
- expect {
119
- configuration.commands(:users) do
120
- define(:create_one, type: :create) do
121
- result :invalid_type
122
- end
123
- end
124
- container
125
- }.to raise_error(ROM::Options::InvalidOptionValueError)
126
- end
127
- end
128
-
129
- describe 'sending result through a mapper' do
130
- let(:attributes) do
131
- { name: 'Jane', email: 'jane@doe.org' }
132
- end
133
-
134
- it 'uses registered mapper to process the result for :one result' do
135
- command = container.command(:users).as(:entity).create
136
- result = command[attributes]
137
-
138
- expect(result).to eql(Test::User.new(attributes))
139
- end
140
-
141
- it 'with two composed commands respects the :result option' do
142
- mapper_input = nil
143
-
144
- mapper = proc do |tuples|
145
- mapper_input = tuples
146
- end
147
-
148
- left = container.command(:users).as(:entity).create.with(
149
- name: 'Jane', email: 'jane@doe.org'
150
- )
151
-
152
- right = container.command(:tasks).as(:entity).create.with(
153
- title: 'Jane task'
154
- )
155
-
156
- command = left >> right >> mapper
157
-
158
- result = command.call
159
-
160
- task = Test::Task.new(name: 'Jane', title: 'Jane task')
161
-
162
- expect(mapper_input).to eql([task])
163
- expect(result).to eql(task)
164
- end
165
-
166
- it 'uses registered mapper to process the result for :many results' do
167
- configuration.commands(:users) do
168
- define(:create_many, type: :create)
169
- end
170
-
171
- command = container.command(:users).as(:entity).create_many
172
- result = command[attributes]
173
-
174
- expect(result).to eql([Test::User.new(attributes)])
175
- end
176
- end
177
- end
@@ -1,67 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Commands / Delete' do
4
- include_context 'container'
5
- include_context 'users and tasks'
6
-
7
- subject(:users) { container.commands.users }
8
-
9
- before do
10
- configuration.relation(:users) do
11
- def by_name(name)
12
- restrict(name: name)
13
- end
14
- end
15
- end
16
-
17
- it 'deletes all tuples when there is no restriction' do
18
- configuration.commands(:users) do
19
- define(:delete)
20
- end
21
-
22
- result = users.try { users.delete.call }
23
-
24
- expect(result).to match_array([
25
- { name: 'Jane', email: 'jane@doe.org' },
26
- { name: 'Joe', email: 'joe@doe.org' }
27
- ])
28
-
29
- expect(container.relation(:users)).to match_array([])
30
- end
31
-
32
- it 'deletes tuples matching restriction' do
33
- configuration.commands(:users) do
34
- define(:delete)
35
- end
36
-
37
- result = users.try { users.delete.by_name('Joe').call }
38
-
39
- expect(result).to match_array([{ name: 'Joe', email: 'joe@doe.org' }])
40
-
41
- expect(container.relation(:users)).to match_array([
42
- { name: 'Jane', email: 'jane@doe.org' }
43
- ])
44
- end
45
-
46
- it 'returns untouched relation if there are no tuples to delete' do
47
- configuration.commands(:users) do
48
- define(:delete)
49
- end
50
-
51
- result = users.try { users.delete.by_name('Not here').call }
52
-
53
- expect(result).to match_array([])
54
- end
55
-
56
- it 'returns deleted tuple when result is set to :one' do
57
- configuration.commands(:users) do
58
- define(:delete_one, type: :delete) do
59
- result :one
60
- end
61
- end
62
-
63
- result = users.try { users.delete_one.by_name('Jane').call }
64
-
65
- expect(result.value).to eql(name: 'Jane', email: 'jane@doe.org')
66
- end
67
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Commands / Error handling' do
4
- include_context 'container'
5
- include_context 'users and tasks'
6
-
7
- before do
8
- configuration.relation(:users)
9
- configuration.commands(:users) { define(:create) }
10
- end
11
-
12
- subject(:users) { container.commands.users }
13
-
14
- it 'rescues from ROM::CommandError' do
15
- result = false
16
- expect(users.try { raise ROM::CommandError } >-> _test { result = true })
17
- .to be_instance_of(ROM::Commands::Result::Failure)
18
- expect(result).to be(false)
19
- end
20
-
21
- it 'raises other errors' do
22
- expect { users.try { raise ArgumentError, 'test' } }
23
- .to raise_error(ArgumentError, 'test')
24
- end
25
- end
@@ -1,213 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe 'Command graph builder' do
4
- include_context 'command graph'
5
-
6
- it 'allows defining a simple create command graph' do
7
- command = container.command.create(user: :users)
8
-
9
- other = container.command([{ user: :users }, [:create]])
10
-
11
- expect(command).to eql(other)
12
- end
13
-
14
- it 'allows defining a create command graph with simple nesting' do
15
- configuration.commands(:books) do
16
- define(:create) { result :many }
17
- end
18
-
19
- command = container.command.create(user: :users) do |user|
20
- user.create(:books)
21
- end
22
-
23
- other = container.command([{ user: :users }, [:create, [
24
- [{ books: :books }, [:create]]
25
- ]]])
26
-
27
- expect(command).to eql(other)
28
- end
29
-
30
- it 'allows defining a create command graph with multiple levels of nesting' do
31
- configuration.commands(:books) do
32
- define(:create) { result :many }
33
- end
34
-
35
- configuration.commands(:tags) do
36
- define(:create) { result :many }
37
- end
38
-
39
- command = container.command.create(user: :users) do |user|
40
- user.create(novels: :books) do |novels|
41
- novels.create(:tags)
42
- end
43
- end
44
-
45
- other = container.command([{ user: :users }, [:create, [
46
- [{ novels: :books }, [:create, [
47
- [{ tags: :tags }, [:create]]
48
- ]]]
49
- ]]])
50
-
51
- expect(command).to eql(other)
52
- end
53
-
54
- it 'allows defining a create command graph with multiple nested commands' do
55
- configuration.commands(:books) do
56
- define(:create) { result :many }
57
- end
58
-
59
- configuration.commands(:tags) do
60
- define(:create) { result :many }
61
- end
62
-
63
- command = container.command.create(user: :users) do |user|
64
- user.create(:books)
65
- user.create(tag: :tags)
66
- end
67
-
68
- other = container.command([{ user: :users }, [:create, [
69
- [{ books: :books }, [:create]],
70
- [{ tag: :tags }, [:create]]
71
- ]]])
72
-
73
- expect(command).to eql(other)
74
- end
75
-
76
- it 'allows defining a create command graph with multiple nested commands in multiple levels' do
77
- configuration.commands(:tasks) do
78
- define(:create) { result :many }
79
- end
80
-
81
- configuration.commands(:books) do
82
- define(:create) { result :many }
83
- end
84
-
85
- configuration.commands(:tags) do
86
- define(:create) { result :many }
87
- end
88
-
89
- command = container.command.create(user: :users) do |user|
90
- user.create(:tasks).each do |task|
91
- task.create(:tags)
92
- end
93
- user.create(:books).each do |book|
94
- book.create(:tags)
95
- book.create(:tasks)
96
- end
97
- end
98
-
99
- other = container.command([{ user: :users }, [:create, [
100
- [{ tasks: :tasks }, [:create, [
101
- [{ tags: :tags }, [:create]]
102
- ]]],
103
- [{ books: :books }, [:create, [
104
- [{ tags: :tags }, [:create]],
105
- [{ tasks: :tasks }, [:create]]
106
- ]]]
107
- ]]])
108
-
109
- expect(command).to eql(other)
110
- end
111
-
112
- it 'allows defining a create command graph using the each sugar' do
113
- configuration.commands(:books) do
114
- define(:create) { result :many }
115
- end
116
-
117
- command = container.command.create(user: :users) do |user|
118
- user.create(novels: :books).each do |novel|
119
- novel.create(:tags)
120
- end
121
- end
122
-
123
- other = container.command([{ user: :users }, [:create, [
124
- [{ novels: :books }, [:create, [
125
- [{ tags: :tags }, [:create]]
126
- ]]]
127
- ]]])
128
-
129
- expect(command).to eql(other)
130
- end
131
-
132
- it 'allows restricting a relation with a proc' do
133
- configuration.commands(:users) do
134
- define(:update) { result :one }
135
- end
136
-
137
- configuration.commands(:tasks) do
138
- define(:update) { result :many }
139
- end
140
-
141
- users_proc = -> users, user do
142
- users.by_name(user[:name])
143
- end
144
-
145
- tasks_proc = -> tasks, user, task do
146
- tasks.by_user_and_title(user[:name], task[:title])
147
- end
148
-
149
- users = container.command.restrict(:users, &users_proc)
150
- command = container.command.update(user: users) do |user|
151
- tasks = user.restrict(:tasks, &tasks_proc)
152
- user.update(tasks)
153
- end
154
-
155
- other = container.command([
156
- { user: :users },
157
- [
158
- { update: users_proc },
159
- [
160
- [
161
- :tasks,
162
- [{ update: tasks_proc }]
163
- ]
164
- ]
165
- ]
166
- ])
167
-
168
- expect(command).to eql(other)
169
- end
170
-
171
- it 'allows chaining a command to a restriction' do
172
- configuration.commands(:users) do
173
- define(:update) { result :one }
174
- end
175
-
176
- configuration.commands(:tasks) do
177
- define(:update) { result :many }
178
- end
179
-
180
- users_proc = -> users, user do
181
- users.by_name(user[:name])
182
- end
183
-
184
- tasks_proc = -> tasks, user, task do
185
- tasks.by_user_and_title(user[:name], task[:title])
186
- end
187
-
188
- command = container.command.restrict(:users, &users_proc).update(from: :user) do |user|
189
- user.restrict(:tasks, &tasks_proc).update
190
- end
191
-
192
- other = container.command([
193
- { user: :users },
194
- [
195
- { update: users_proc },
196
- [
197
- [
198
- :tasks,
199
- [{ update: tasks_proc }]
200
- ]
201
- ]
202
- ]
203
- ])
204
-
205
- expect(command).to eql(other)
206
- end
207
-
208
- it 'raises when unknown command is accessed' do
209
- expect {
210
- container.command.not_here(:users)
211
- }.to raise_error(ROM::CommandRegistry::CommandNotFoundError, /not_here/)
212
- end
213
- end