rom 0.9.1 → 1.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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +30 -12
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +24 -0
  5. data/Gemfile +7 -3
  6. data/README.md +24 -11
  7. data/lib/rom.rb +9 -26
  8. data/lib/rom/command.rb +113 -75
  9. data/lib/rom/commands/class_interface.rb +115 -0
  10. data/lib/rom/commands/graph.rb +17 -23
  11. data/lib/rom/commands/graph/builder.rb +176 -0
  12. data/lib/rom/commands/graph/class_interface.rb +8 -2
  13. data/lib/rom/commands/graph/input_evaluator.rb +13 -9
  14. data/lib/rom/commands/lazy.rb +23 -17
  15. data/lib/rom/commands/lazy/create.rb +23 -0
  16. data/lib/rom/commands/lazy/delete.rb +27 -0
  17. data/lib/rom/commands/lazy/update.rb +34 -0
  18. data/lib/rom/commands/result.rb +14 -0
  19. data/lib/rom/commands/update.rb +0 -4
  20. data/lib/rom/configuration.rb +86 -0
  21. data/lib/rom/{setup_dsl/setup.rb → configuration_dsl.rb} +9 -7
  22. data/lib/rom/configuration_dsl/command.rb +43 -0
  23. data/lib/rom/{setup_dsl → configuration_dsl}/command_dsl.rb +5 -4
  24. data/lib/rom/configuration_dsl/mapper.rb +37 -0
  25. data/lib/rom/{setup_dsl → configuration_dsl}/mapper_dsl.rb +11 -5
  26. data/lib/rom/configuration_dsl/relation.rb +26 -0
  27. data/lib/rom/configuration_plugin.rb +17 -0
  28. data/lib/rom/constants.rb +5 -12
  29. data/lib/rom/container.rb +11 -8
  30. data/lib/rom/create_container.rb +61 -0
  31. data/lib/rom/environment.rb +27 -241
  32. data/lib/rom/gateway.rb +18 -2
  33. data/lib/rom/global.rb +24 -0
  34. data/lib/rom/global/plugin_dsl.rb +2 -0
  35. data/lib/rom/lint/spec.rb +0 -12
  36. data/lib/rom/lint/test.rb +0 -31
  37. data/lib/rom/memory/commands.rb +2 -2
  38. data/lib/rom/memory/gateway.rb +2 -0
  39. data/lib/rom/pipeline.rb +1 -1
  40. data/lib/rom/plugin_base.rb +1 -1
  41. data/lib/rom/plugin_registry.rb +12 -10
  42. data/lib/rom/plugins/configuration/configuration_dsl.rb +16 -0
  43. data/lib/rom/plugins/relation/key_inference.rb +31 -0
  44. data/lib/rom/plugins/relation/view.rb +90 -0
  45. data/lib/rom/plugins/relation/view/dsl.rb +32 -0
  46. data/lib/rom/relation.rb +1 -11
  47. data/lib/rom/relation/class_interface.rb +37 -50
  48. data/lib/rom/setup.rb +13 -104
  49. data/lib/rom/setup/auto_registration.rb +55 -0
  50. data/lib/rom/setup/finalize.rb +113 -127
  51. data/lib/rom/setup/finalize/commands.rb +67 -0
  52. data/lib/rom/setup/finalize/mappers.rb +36 -0
  53. data/lib/rom/setup/finalize/relations.rb +53 -0
  54. data/lib/rom/support/configurable.rb +21 -7
  55. data/lib/rom/version.rb +1 -1
  56. data/rakelib/mutant.rake +4 -1
  57. data/rom.gemspec +3 -4
  58. data/spec/fixtures/app/commands/create_user.rb +2 -0
  59. data/spec/fixtures/app/mappers/user_list.rb +2 -0
  60. data/spec/fixtures/app/relations/users.rb +2 -0
  61. data/spec/fixtures/lib/persistence/commands/create_user.rb +6 -0
  62. data/spec/fixtures/lib/persistence/mappers/user_list.rb +6 -0
  63. data/spec/fixtures/lib/persistence/relations/users.rb +6 -0
  64. data/spec/{unit/rom → integration}/command_registry_spec.rb +8 -9
  65. data/spec/integration/commands/create_spec.rb +17 -13
  66. data/spec/integration/commands/delete_spec.rb +12 -11
  67. data/spec/integration/commands/error_handling_spec.rb +5 -4
  68. data/spec/integration/commands/graph_builder_spec.rb +213 -0
  69. data/spec/integration/commands/graph_spec.rb +112 -49
  70. data/spec/integration/commands/update_spec.rb +14 -11
  71. data/spec/integration/commands_spec.rb +60 -0
  72. data/spec/integration/mappers/combine_spec.rb +7 -6
  73. data/spec/integration/mappers/deep_embedded_spec.rb +5 -6
  74. data/spec/integration/mappers/definition_dsl_spec.rb +19 -18
  75. data/spec/integration/mappers/embedded_spec.rb +11 -12
  76. data/spec/integration/mappers/exclude_spec.rb +5 -6
  77. data/spec/integration/mappers/fold_spec.rb +8 -7
  78. data/spec/integration/mappers/group_spec.rb +16 -15
  79. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +5 -5
  80. data/spec/integration/mappers/prefix_separator_spec.rb +5 -7
  81. data/spec/integration/mappers/prefix_spec.rb +5 -7
  82. data/spec/integration/mappers/prefixing_attributes_spec.rb +7 -7
  83. data/spec/integration/mappers/registering_custom_mappers_spec.rb +4 -5
  84. data/spec/integration/mappers/renaming_attributes_spec.rb +18 -18
  85. data/spec/integration/mappers/step_spec.rb +11 -12
  86. data/spec/integration/mappers/symbolizing_attributes_spec.rb +11 -8
  87. data/spec/integration/mappers/unfold_spec.rb +9 -10
  88. data/spec/integration/mappers/ungroup_spec.rb +10 -11
  89. data/spec/integration/mappers/unwrap_spec.rb +10 -15
  90. data/spec/integration/mappers/wrap_spec.rb +16 -15
  91. data/spec/{unit/rom → integration}/memory/commands/create_spec.rb +7 -5
  92. data/spec/{unit/rom → integration}/memory/commands/delete_spec.rb +7 -5
  93. data/spec/{unit/rom → integration}/memory/commands/update_spec.rb +7 -5
  94. data/spec/integration/multi_env_spec.rb +16 -124
  95. data/spec/integration/multi_repo_spec.rb +9 -9
  96. data/spec/integration/relations/default_dataset_spec.rb +15 -0
  97. data/spec/integration/relations/inheritance_spec.rb +5 -7
  98. data/spec/integration/relations/reading_spec.rb +32 -65
  99. data/spec/integration/relations/registry_dsl_spec.rb +5 -4
  100. data/spec/integration/repositories/extending_relations_spec.rb +6 -7
  101. data/spec/integration/repositories/setting_logger_spec.rb +5 -7
  102. data/spec/integration/setup_spec.rb +49 -61
  103. data/spec/shared/command_graph.rb +50 -0
  104. data/spec/shared/container.rb +9 -0
  105. data/spec/shared/gateway_only.rb +6 -0
  106. data/spec/shared/no_container.rb +16 -0
  107. data/spec/shared/one_behavior.rb +4 -4
  108. data/spec/shared/users_and_tasks.rb +5 -17
  109. data/spec/spec_helper.rb +5 -3
  110. data/spec/test/memory_repository_lint_test.rb +1 -1
  111. data/spec/unit/rom/auto_registration_spec.rb +54 -0
  112. data/spec/unit/rom/commands/graph_spec.rb +18 -44
  113. data/spec/unit/rom/commands/lazy_spec.rb +246 -35
  114. data/spec/unit/rom/commands/result_spec.rb +56 -0
  115. data/spec/unit/rom/commands_spec.rb +9 -73
  116. data/spec/unit/rom/configurable_spec.rb +49 -0
  117. data/spec/unit/rom/configuration_spec.rb +61 -0
  118. data/spec/unit/rom/container_spec.rb +39 -33
  119. data/spec/unit/rom/create_container_spec.rb +151 -0
  120. data/spec/unit/rom/environment_spec.rb +123 -0
  121. data/spec/unit/rom/gateway_spec.rb +58 -2
  122. data/spec/unit/rom/global_spec.rb +10 -7
  123. data/spec/unit/rom/plugin_spec.rb +44 -25
  124. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +27 -0
  125. data/spec/unit/rom/plugins/relation/view_spec.rb +47 -0
  126. data/spec/unit/rom/relation/composite_spec.rb +20 -20
  127. data/spec/unit/rom/relation/curried_spec.rb +10 -11
  128. data/spec/unit/rom/relation/graph_spec.rb +27 -27
  129. data/spec/unit/rom/relation/lazy/combine_spec.rb +26 -20
  130. data/spec/unit/rom/relation/lazy_spec.rb +38 -38
  131. data/spec/unit/rom/relation/loaded_spec.rb +2 -3
  132. data/spec/unit/rom/relation_spec.rb +39 -2
  133. metadata +58 -66
  134. data/lib/rom/commands/abstract.rb +0 -184
  135. data/lib/rom/environment_plugin.rb +0 -17
  136. data/lib/rom/environment_plugins/auto_registration.rb +0 -38
  137. data/lib/rom/repository.rb +0 -16
  138. data/lib/rom/setup_dsl/command.rb +0 -36
  139. data/lib/rom/setup_dsl/mapper.rb +0 -32
  140. data/lib/rom/setup_dsl/relation.rb +0 -30
  141. data/spec/integration/inline_setup_spec.rb +0 -65
  142. data/spec/unit/rom/repository_spec.rb +0 -12
  143. data/spec/unit/rom/setup_spec.rb +0 -253
@@ -1,14 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Commands / Error handling' do
3
+ describe 'Commands / Error handling' do
4
+ include_context 'container'
4
5
  include_context 'users and tasks'
5
6
 
6
7
  before do
7
- setup.relation(:users)
8
- setup.commands(:users) { define(:create) }
8
+ configuration.relation(:users)
9
+ configuration.commands(:users) { define(:create) }
9
10
  end
10
11
 
11
- subject(:users) { rom.commands.users }
12
+ subject(:users) { container.commands.users }
12
13
 
13
14
  it 'rescues from ROM::CommandError' do
14
15
  result = false
@@ -0,0 +1,213 @@
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::Registry::ElementNotFoundError, /not_here/)
212
+ end
213
+ end
@@ -1,40 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Building up a command graph for nested input' do
4
- let(:rom) { setup.finalize }
5
- let(:setup) { ROM.setup(:memory) }
6
-
7
- before do
8
- setup.relation :users
9
- setup.relation :tasks
10
- setup.relation :books
11
- setup.relation :tags
12
-
13
- setup.commands(:users) do
14
- define(:create) do
15
- result :one
16
- end
17
- end
18
-
19
- setup.commands(:books) do
20
- define(:create) do
21
- def execute(tuples, user)
22
- super(tuples.map { |t| t.merge(user: user.fetch(:name)) })
23
- end
24
- end
25
- end
26
-
27
- setup.commands(:tags) do
28
- define(:create) do
29
- def execute(tuples, task)
30
- super(tuples.map { |t| t.merge(task: task.fetch(:title)) })
31
- end
32
- end
33
- end
34
- end
4
+ include_context 'command graph'
35
5
 
36
6
  it 'creates a command graph for nested input :one result as root' do
37
- setup.commands(:tasks) do
7
+ configuration.commands(:tasks) do
38
8
  define(:create) do
39
9
  result :one
40
10
 
@@ -69,24 +39,24 @@ describe 'Building up a command graph for nested input' do
69
39
  ]
70
40
  ]
71
41
 
72
- command = rom.command(options)
42
+ command = container.command(options)
73
43
 
74
44
  command.call(input)
75
45
 
76
- expect(rom.relation(:users)).to match_array([
46
+ expect(container.relation(:users)).to match_array([
77
47
  { name: 'Jane' }
78
48
  ])
79
49
 
80
- expect(rom.relation(:tasks)).to match_array([
50
+ expect(container.relation(:tasks)).to match_array([
81
51
  { title: 'Task One', user: 'Jane' }
82
52
  ])
83
53
 
84
- expect(rom.relation(:books)).to match_array([
54
+ expect(container.relation(:books)).to match_array([
85
55
  { title: 'Book One', user: 'Jane' },
86
56
  { title: 'Book Two', user: 'Jane' }
87
57
  ])
88
58
 
89
- expect(rom.relation(:tags)).to match_array([
59
+ expect(container.relation(:tags)).to match_array([
90
60
  { name: 'red', task: 'Task One' },
91
61
  { name: 'green', task: 'Task One' },
92
62
  { name: 'blue', task: 'Task One' }
@@ -94,7 +64,7 @@ describe 'Building up a command graph for nested input' do
94
64
  end
95
65
 
96
66
  it 'creates a command graph for nested input with :many results as root' do
97
- setup.commands(:tasks) do
67
+ configuration.commands(:tasks) do
98
68
  define(:create) do
99
69
  def execute(tuples, user)
100
70
  super(tuples.map { |t| t.merge(user: user.fetch(:name)) })
@@ -121,33 +91,126 @@ describe 'Building up a command graph for nested input' do
121
91
  options = [
122
92
  { user: :users }, [
123
93
  :create, [
124
- [:tasks, [:create, [:tags, [:create]]]],
94
+ [:tasks, [:create, [:tags, [:create]]]]
125
95
  ]
126
96
  ]
127
97
  ]
128
98
 
129
- command = rom.command(options)
99
+ command = container.command(options)
130
100
 
131
101
  command.call(input)
132
102
 
133
- expect(rom.relation(:users)).to match_array([
103
+ expect(container.relation(:users)).to match_array([
134
104
  { name: 'Jane' }
135
105
  ])
136
106
 
137
- expect(rom.relation(:tasks)).to match_array([
107
+ expect(container.relation(:tasks)).to match_array([
138
108
  { title: 'Task One', user: 'Jane' },
139
109
  { title: 'Task Two', user: 'Jane' }
140
110
  ])
141
111
 
142
- expect(rom.relation(:tags)).to match_array([
112
+ expect(container.relation(:tags)).to match_array([
143
113
  { name: 'red', task: 'Task One' },
144
114
  { name: 'green', task: 'Task One' },
145
115
  { name: 'blue', task: 'Task Two' }
146
116
  ])
147
117
  end
148
118
 
119
+
120
+ it 'updates graph elements cleanly' do
121
+ configuration.commands(:tasks) do
122
+ define(:create) do
123
+ def execute(tuples, user)
124
+ super(tuples.map { |t| t.merge(user: user.fetch(:name)) })
125
+ end
126
+ end
127
+
128
+ define(:update) do
129
+ result :one
130
+
131
+ def execute(tuple, user)
132
+ super(tuple.merge(user: user.fetch(:name)))
133
+ end
134
+ end
135
+
136
+ define(:delete) do
137
+ register_as :complete
138
+ result :one
139
+ end
140
+ end
141
+
142
+ configuration.commands(:users) do
143
+ define(:update) do
144
+ result :one
145
+ end
146
+ end
147
+
148
+ initial = {
149
+ user: {
150
+ name: 'Johnny',
151
+ email: 'johnny@doe.org',
152
+ tasks: [
153
+ { title: 'Change Name' },
154
+ { title: 'Finish that novel' }
155
+ ]
156
+ }
157
+ }
158
+
159
+ updated = {
160
+ user: {
161
+ name: 'Johnny',
162
+ email: 'johnathan@doe.org',
163
+ completed: [{ title: 'Change Name' }],
164
+ tasks: [{ title: 'Finish that novel', priority: 1 }]
165
+ }
166
+ }
167
+
168
+ create = container.command([{ user: :users }, [:create, [:tasks, [:create]]]])
169
+
170
+ update = container.command([
171
+ { user: :users },
172
+ [
173
+ { update: -> cmd, user { cmd.by_name(user[:name]) } },
174
+ [
175
+ [
176
+ { completed: :tasks },
177
+ [{ complete: -> cmd, user, task { cmd.by_user_and_title(user[:name], task[:title]) } }]
178
+ ],
179
+ [
180
+ :tasks,
181
+ [{ update: -> cmd, user, task { cmd.by_user_and_title(user[:name], task[:title]) } }]
182
+ ]
183
+ ]
184
+ ]
185
+ ])
186
+
187
+ create.call(initial)
188
+
189
+ container.command(:tasks).create.call(
190
+ [{ title: 'Task One'}], { name: 'Jane' }
191
+ )
192
+
193
+ expect(container.relation(:tasks)).to match_array([
194
+ { title: 'Change Name', user: 'Johnny' },
195
+ { title: 'Finish that novel', user: 'Johnny' },
196
+ { title: 'Task One', user: 'Jane' }
197
+ ])
198
+
199
+ update.call(updated)
200
+
201
+ expect(container.relation(:users)).to match_array([
202
+ { name: 'Johnny', email: 'johnathan@doe.org' }
203
+ ])
204
+
205
+ expect(container.relation(:tasks)).to match_array([
206
+ { title: 'Task One', user: 'Jane' },
207
+ { title: 'Finish that novel', priority: 1, user: 'Johnny' }
208
+ ])
209
+ end
210
+
211
+
149
212
  it 'works with auto-mapping' do
150
- setup.mappers do
213
+ configuration.mappers do
151
214
  define(:users) do
152
215
  register_as :entity
153
216
  reject_keys true
@@ -168,7 +231,7 @@ describe 'Building up a command graph for nested input' do
168
231
  end
169
232
  end
170
233
 
171
- setup.commands(:tasks) do
234
+ configuration.commands(:tasks) do
172
235
  define(:create) do
173
236
  def execute(tuples, user)
174
237
  super(tuples.map { |t| t.merge(user: user.fetch(:name)) })
@@ -195,12 +258,12 @@ describe 'Building up a command graph for nested input' do
195
258
  options = [
196
259
  { user: :users }, [
197
260
  :create, [
198
- [:tasks, [:create, [:tags, [:create]]]],
261
+ [:tasks, [:create, [:tags, [:create]]]]
199
262
  ]
200
263
  ]
201
264
  ]
202
265
 
203
- command = rom.command(options).as(:entity)
266
+ command = container.command(options).as(:entity)
204
267
 
205
268
  result = command.call(input).one
206
269
 
@@ -216,10 +279,10 @@ describe 'Building up a command graph for nested input' do
216
279
  { user: :users }, [:create, [{ book: :books }, [:create]]]
217
280
  ]
218
281
 
219
- command = rom.command(options)
282
+ command = container.command(options)
220
283
 
221
284
  expect {
222
285
  command.call(input)
223
- }.to raise_error(ROM::CommandFailure, /book/)
286
+ }.to raise_error(ROM::KeyMissing, /book/)
224
287
  end
225
288
  end