rom 0.9.1 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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