rom-core 4.0.0.beta1 → 4.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef15d608c1f83a62e5fda73922905f3ea6b4ac64
4
- data.tar.gz: 0756e26ace05072f5717d47f7738e21a43e322c7
3
+ metadata.gz: 9ea3d114fd7800efddd98a8efe19a01586625c9f
4
+ data.tar.gz: 59a3cc776cfd019cd54583caf4ef8ee759d90f09
5
5
  SHA512:
6
- metadata.gz: 46aecaac6f9e294a7acbadd9dcd5b5c56a2b08a4bd62e15b6d408089b1ab130149a7f9d02000d78b83ed41947d0e04648be6ae30c6591428db59e3b84615d2c1
7
- data.tar.gz: 8f6c5783b58df407395d2c25e1b3389c4b011d49922a9c73cd2f8e613c7464ce5122a03ddccc4311844e28adeac37e5893fcbc893277cb93805cdecd47a71aa3
6
+ metadata.gz: 4349071ed68f65de26faf701b930653f56be802e14f63b82510d04c091ad0a7d0687eb23bb0e6a22b6330d6f83ec32184811701d29cd41934140d10c00ec54e6
7
+ data.tar.gz: 31885902cc6c78cf78c2f1357ee76edcf082eea550deaa293588029534a68e09d01c6a31ef14bd7e09523ad7678344184b2e3eec8f384a767ff11c94f5948f1f
@@ -28,6 +28,8 @@ Previous `rom` gem was renamed to `rom-core`
28
28
  * [BREAKING] `Relation#as` now returns a new relation with aliased name, use `Relation#map_with(*list-of-mapper-ids)` or `Relation#map_to(model)` if you just want to map to custom models (solnic)
29
29
  * [BREAKING] `Relation.register_as(:bar)` is removed in favor of `schema(:foo, as: :bar)` (solnic)
30
30
  * [BREAKING] `Relation.dataset(:foo)` is removed in favor of `schema(:foo)`. Passing a block still works like before (solnic)
31
+ * [BREAKING] `CommandRegistry#try` is removed (solnic)
32
+ * [BREAKING] `Command#with` changed behavior, use `Command#curry` instead (solnic)
31
33
  * Separation between relations that are standalone or registrable in a registry is gone. All relations have names and schemas now.
32
34
  They are automatically set to defaults. In practice this means you can instantiate a relation object manually and it'll Just Work (solnic)
33
35
  * Mapper and command objects are cached locally within a given rom container (solnic)
@@ -23,13 +23,14 @@ module ROM
23
23
  #
24
24
  # @api public
25
25
  class Command
26
+ extend Dry::Core::ClassAttributes
26
27
  extend Initializer
28
+ extend ClassInterface
29
+
27
30
  include Dry::Equalizer(:relation, :options)
28
31
  include Commands
29
32
  include Pipeline::Operator
30
33
 
31
- extend Dry::Core::ClassAttributes
32
- extend ClassInterface
33
34
 
34
35
  # @!method self.adapter
35
36
  # Get or set adapter identifier
@@ -316,7 +317,6 @@ module ROM
316
317
  self.class.build(relation, **options, curry_args: args)
317
318
  end
318
319
  end
319
- alias_method :with, :curry
320
320
 
321
321
  # Compose this command with other commands
322
322
  #
@@ -338,17 +338,6 @@ module ROM
338
338
  curry_args.size > 0
339
339
  end
340
340
 
341
- # Return a new command with new options
342
- #
343
- # @param [Hash] new_opts A hash with new options
344
- #
345
- # @return [Command]
346
- #
347
- # @api public
348
- def with_opts(new_opts)
349
- self.class.new(relation, options.merge(new_opts))
350
- end
351
-
352
341
  # Return a new command with appended before hooks
353
342
  #
354
343
  # @param [Array<Hash>] hooks A list of before hooks configurations
@@ -2,15 +2,12 @@ require 'concurrent/map'
2
2
 
3
3
  require 'rom/constants'
4
4
  require 'rom/registry'
5
- require 'rom/commands/result'
6
5
 
7
6
  module ROM
8
7
  # Specialized registry class for commands
9
8
  #
10
9
  # @api public
11
10
  class CommandRegistry < Registry
12
- include Commands
13
-
14
11
  # Internal command registry
15
12
  #
16
13
  # @return [Registry]
@@ -35,31 +32,6 @@ module ROM
35
32
  CommandNotFoundError
36
33
  end
37
34
 
38
- # Try to execute a command in a block
39
- #
40
- # @yield [command] Passes command to the block
41
- #
42
- # @example
43
- #
44
- # rom.commands[:users].try { create(name: 'Jane') }
45
- # rom.commands[:users].try { update(:by_id, 1).call(name: 'Jane Doe') }
46
- # rom.commands[:users].try { delete(:by_id, 1) }
47
- #
48
- # @return [Commands::Result]
49
- #
50
- # @api public
51
- def try(&block)
52
- response = block.call
53
-
54
- if response.is_a?(Command) || response.is_a?(Composite)
55
- try { response.call }
56
- else
57
- Result::Success.new(response)
58
- end
59
- rescue CommandError => e
60
- Result::Failure.new(e)
61
- end
62
-
63
35
  # Return a command from the registry
64
36
  #
65
37
  # If mapper is set command will be turned into a composite command with
@@ -39,8 +39,8 @@ module ROM
39
39
  # create_task = rom.commands[:tasks].create
40
40
  #
41
41
  # command = create_user
42
- # .with(name: 'Jane')
43
- # .combine(create_task.with(title: 'Task'))
42
+ # .curry(name: 'Jane')
43
+ # .combine(create_task.curry(title: 'Task'))
44
44
  #
45
45
  # command.call
46
46
  #
@@ -44,7 +44,7 @@ module ROM
44
44
  tuple_path = Array[*path] << key
45
45
  input_proc = InputEvaluator.build(tuple_path, nodes)
46
46
 
47
- command = command.with(input_proc, opts)
47
+ command = command.curry(input_proc, opts)
48
48
 
49
49
  if nodes
50
50
  if nodes.all? { |node| node.is_a?(Array) }
@@ -15,7 +15,7 @@ require 'rom/command_registry'
15
15
  require 'rom/relation/loaded'
16
16
  require 'rom/relation/curried'
17
17
  require 'rom/relation/composite'
18
- require 'rom/relation/graph'
18
+ require 'rom/relation/combined'
19
19
  require 'rom/relation/wrap'
20
20
  require 'rom/relation/materializable'
21
21
  require 'rom/relation/commands'
@@ -172,17 +172,6 @@ module ROM
172
172
  end
173
173
  end
174
174
 
175
- # Composes with other relations
176
- #
177
- # @param [Array<Relation>] others The other relation(s) to compose with
178
- #
179
- # @return [Relation::Graph]
180
- #
181
- # @api public
182
- def graph(*others)
183
- Graph.build(self, others)
184
- end
185
-
186
175
  # Combine with other relations
187
176
  #
188
177
  # @overload combine(*associations)
@@ -196,21 +185,34 @@ module ROM
196
185
  #
197
186
  # @api public
198
187
  def combine(*args)
199
- graph(*nodes(*args))
188
+ combine_with(*nodes(*args))
189
+ end
190
+
191
+ # Composes with other relations
192
+ #
193
+ # @param [Array<Relation>] others The other relation(s) to compose with
194
+ #
195
+ # @return [Relation::Graph]
196
+ #
197
+ # @api public
198
+ def combine_with(*others)
199
+ Combined.new(self, others)
200
200
  end
201
201
 
202
202
  # @api private
203
203
  def nodes(*args)
204
- args.map do |arg|
204
+ args.reduce([]) do |acc, arg|
205
205
  case arg
206
206
  when Symbol
207
- node(arg)
207
+ acc << node(arg)
208
208
  when Hash
209
- arg.reduce(self) { |r, (k, v)| r.node(k).combine(*v) }
209
+ acc << arg.reduce(self) do |root, (name, *opts)|
210
+ root.node(name).combine(*opts)
211
+ end
210
212
  when Array
211
- arg.map { |opts| nodes(opts) }
213
+ acc.concat(arg.map { |opts| nodes(opts) }.reduce(:concat))
212
214
  end
213
- end.flatten(0)
215
+ end
214
216
  end
215
217
 
216
218
  # @api public
@@ -236,18 +238,27 @@ module ROM
236
238
  assoc.preload(self, other)
237
239
  end
238
240
 
239
- # Wrap other relations
241
+ # Wrap other relations using association names
240
242
  #
241
243
  # @example
242
244
  # tasks.wrap(:owner)
243
245
  #
244
246
  # @param [Hash] options
245
247
  #
246
- # @return [RelationProxy]
248
+ # @return [Relation]
247
249
  #
248
250
  # @api public
249
251
  def wrap(*names)
250
- wrap_class.new(self, names.map { |n| associations[n].wrap })
252
+ wrap_around(*names.map { |n| associations[n].wrap })
253
+ end
254
+
255
+ # Wrap around other relations
256
+ #
257
+ # @return [Relation::Wrap]
258
+ #
259
+ # @api public
260
+ def wrap_around(*others)
261
+ wrap_class.new(self, others)
251
262
  end
252
263
 
253
264
  # Loads relation
@@ -431,7 +442,7 @@ module ROM
431
442
  #
432
443
  # @param [Array<Symbol>] mappers A list of mapper identifiers
433
444
  #
434
- # @return [RelationProxy] A new relation proxy with pipelined relation
445
+ # @return [Relation] A new relation proxy with pipelined relation
435
446
  #
436
447
  # @api public
437
448
  def map_with(*names, **opts)
@@ -95,15 +95,15 @@ module ROM
95
95
 
96
96
  @relation_name = Name[relation, ds_name]
97
97
 
98
- dsl = schema_dsl.new(
99
- relation_name,
100
- schema_class: schema_class,
101
- attr_class: schema_attr_class,
102
- inferrer: schema_inferrer.with(enabled: infer),
103
- &block
104
- )
105
-
106
- @schema_proc = dsl.method(:call).to_proc
98
+ @schema_proc = proc do |*args, &inner_block|
99
+ schema_dsl.new(
100
+ relation_name,
101
+ schema_class: schema_class,
102
+ attr_class: schema_attr_class,
103
+ inferrer: schema_inferrer.with(enabled: infer),
104
+ &block
105
+ ).call(*args, &inner_block)
106
+ end
107
107
  end
108
108
  end
109
109
 
@@ -0,0 +1,116 @@
1
+ require 'rom/relation/graph'
2
+ require 'rom/relation/commands'
3
+
4
+ module ROM
5
+ class Relation
6
+ # Represents a relation graphs which combines root relation
7
+ # with other relation nodes
8
+ #
9
+ # @api public
10
+ class Combined < Graph
11
+ include Commands
12
+
13
+ # Create a new relation combined with others
14
+ #
15
+ # @param [Relation] root
16
+ # @param [Array<Relation>] nodes
17
+ #
18
+ # @return [Combined]
19
+ #
20
+ # @api public
21
+ def self.new(root, nodes)
22
+ root_ns = root.options[:struct_namespace]
23
+ super(root, nodes.map { |node| node.struct_namespace(root_ns) })
24
+ end
25
+
26
+ # Combine this graph with more nodes
27
+ #
28
+ # @param [Array<Relation::Lazy>]
29
+ #
30
+ # @return [Graph]
31
+ #
32
+ # @api public
33
+ def combine_with(*others)
34
+ self.class.new(root, nodes + others)
35
+ end
36
+
37
+ # @api public
38
+ # @see Relation#combine
39
+ def combine(*args)
40
+ self.class.new(root, nodes + root.combine(*args).nodes)
41
+ end
42
+
43
+ # Materialize combined relation
44
+ #
45
+ # @return [Loaded]
46
+ #
47
+ # @api public
48
+ def call(*args)
49
+ left = root.with(auto_struct: false).call(*args)
50
+
51
+ right =
52
+ if left.empty?
53
+ nodes.map { |node| Loaded.new(node, EMPTY_ARRAY) }
54
+ else
55
+ nodes.map { |node| node.call(left) }
56
+ end
57
+
58
+ if auto_map?
59
+ Loaded.new(self, mapper.([left, right]))
60
+ else
61
+ Loaded.new(self, [left, right])
62
+ end
63
+ end
64
+
65
+ # Return a new combined relation with adjusted node returned from a block
66
+ #
67
+ # @example with a node identifier
68
+ # aggregate(:tasks).node(:tasks) { |tasks| tasks.prioritized }
69
+ #
70
+ # @example with a nested path
71
+ # aggregate(tasks: :tags).node(tasks: :tags) { |tags| tags.where(name: 'red') }
72
+ #
73
+ # @param [Symbol] name The node relation name
74
+ #
75
+ # @yieldparam [Relation] The relation node
76
+ # @yieldreturn [Relation] The new relation node
77
+ #
78
+ # @return [Relation]
79
+ #
80
+ # @api public
81
+ def node(name, &block)
82
+ if name.is_a?(Symbol) && !nodes.map { |n| n.name.key }.include?(name)
83
+ raise ArgumentError, "#{name.inspect} is not a valid aggregate node name"
84
+ end
85
+
86
+ new_nodes = nodes.map { |node|
87
+ case name
88
+ when Symbol
89
+ name == node.name.key ? yield(node) : node
90
+ when Hash
91
+ other, *rest = name.flatten(1)
92
+ if other == node.name.key
93
+ nodes.detect { |n| n.name.key == other }.node(*rest, &block)
94
+ else
95
+ node
96
+ end
97
+ else
98
+ node
99
+ end
100
+ }
101
+
102
+ with_nodes(new_nodes)
103
+ end
104
+
105
+ # @api public
106
+ def to_ast
107
+ [:relation, [name.to_sym, attr_ast + node_ast, meta_ast]]
108
+ end
109
+
110
+ # @api private
111
+ def node_ast
112
+ nodes.map(&:to_ast)
113
+ end
114
+ end
115
+ end
116
+ end
@@ -1,3 +1,5 @@
1
+ require 'dry/equalizer'
2
+
1
3
  require 'rom/types'
2
4
  require 'rom/initializer'
3
5
  require 'rom/pipeline'
@@ -9,6 +11,7 @@ module ROM
9
11
  class Curried
10
12
  extend Initializer
11
13
 
14
+ include Dry::Equalizer(:relation, :options)
12
15
  include Materializable
13
16
  include Pipeline
14
17
 
@@ -1,45 +1,39 @@
1
+ require 'dry/equalizer'
2
+
3
+ require 'rom/initializer'
4
+
1
5
  require 'rom/relation/loaded'
2
6
  require 'rom/relation/composite'
3
7
  require 'rom/relation/materializable'
4
- require 'rom/relation/commands'
5
8
  require 'rom/pipeline'
6
9
 
7
10
  module ROM
8
11
  class Relation
9
- # Compose relations using join-keys
10
- #
11
- # @example
12
- # class Users < ROM::Relation[:memory]
13
- # end
14
- #
15
- # class Tasks < ROM::Relation[:memory]
16
- # def for_users(users)
17
- # restrict(user: users.map { |user| user[:name] })
18
- # end
19
- # end
20
- #
21
- # rom.relations[:users] << { name: 'Jane' }
22
- # rom.relations[:tasks] << { user: 'Jane', title: 'Do something' }
23
- #
24
- # rom.relations[:users].combine(rom.relations[:tasks].for_users)
12
+ # Abstract relation graph class
25
13
  #
26
14
  # @api public
27
15
  class Graph
16
+ extend Initializer
17
+
18
+ param :root
19
+
20
+ param :nodes
21
+
22
+ include Dry::Equalizer(:root, :nodes)
28
23
  include Materializable
29
- include Commands
30
24
  include Pipeline
31
25
  include Pipeline::Proxy
32
26
 
33
27
  # Root aka parent relation
34
28
  #
35
- # @return [Relation::Lazy]
29
+ # @return [Relation]
36
30
  #
37
31
  # @api private
38
32
  attr_reader :root
39
33
 
40
34
  # Child relation nodes
41
35
  #
42
- # @return [Array<Relation::Lazy>]
36
+ # @return [Array<Relation>]
43
37
  #
44
38
  # @api private
45
39
  attr_reader :nodes
@@ -47,23 +41,6 @@ module ROM
47
41
  alias_method :left, :root
48
42
  alias_method :right, :nodes
49
43
 
50
- # @api private
51
- def self.build(root, nodes)
52
- if nodes.any? { |node| node.instance_of?(Composite) }
53
- raise UnsupportedRelationError,
54
- "Combining with composite relations is not supported"
55
- else
56
- new(root, nodes)
57
- end
58
- end
59
-
60
- # @api private
61
- def initialize(root, nodes)
62
- root_ns = root.options[:struct_namespace]
63
- @root = root
64
- @nodes = nodes.map { |node| node.struct_namespace(root_ns) }
65
- end
66
-
67
44
  # @api public
68
45
  def with_nodes(nodes)
69
46
  self.class.new(root, nodes)
@@ -78,44 +55,6 @@ module ROM
78
55
  true
79
56
  end
80
57
 
81
- # Combine this graph with more nodes
82
- #
83
- # @param [Array<Relation::Lazy>]
84
- #
85
- # @return [Graph]
86
- #
87
- # @api public
88
- def graph(*others)
89
- self.class.new(root, nodes + others)
90
- end
91
-
92
- # @api public
93
- def combine(*args)
94
- self.class.new(root, nodes + root.combine(*args).nodes)
95
- end
96
-
97
- # Materialize this relation graph
98
- #
99
- # @return [Loaded]
100
- #
101
- # @api public
102
- def call(*args)
103
- left = root.with(auto_struct: false).call(*args)
104
-
105
- right =
106
- if left.empty?
107
- nodes.map { |node| Loaded.new(node, EMPTY_ARRAY) }
108
- else
109
- nodes.map { |node| node.call(left) }
110
- end
111
-
112
- if auto_map?
113
- Loaded.new(self, mapper.([left, right]))
114
- else
115
- Loaded.new(self, [left, right])
116
- end
117
- end
118
-
119
58
  # @api public
120
59
  def map_with(*args)
121
60
  self.class.new(root.map_with(*args), nodes)
@@ -126,56 +65,6 @@ module ROM
126
65
  self.class.new(root.map_to(klass), nodes)
127
66
  end
128
67
 
129
- # Return a new graph with adjusted node returned from a block
130
- #
131
- # @example with a node identifier
132
- # aggregate(:tasks).node(:tasks) { |tasks| tasks.prioritized }
133
- #
134
- # @example with a nested path
135
- # aggregate(tasks: :tags).node(tasks: :tags) { |tags| tags.where(name: 'red') }
136
- #
137
- # @param [Symbol] name The node relation name
138
- #
139
- # @yieldparam [RelationProxy] The relation node
140
- # @yieldreturn [RelationProxy] The new relation node
141
- #
142
- # @return [RelationProxy]
143
- #
144
- # @api public
145
- def node(name, &block)
146
- if name.is_a?(Symbol) && !nodes.map { |n| n.name.key }.include?(name)
147
- raise ArgumentError, "#{name.inspect} is not a valid aggregate node name"
148
- end
149
-
150
- new_nodes = nodes.map { |node|
151
- case name
152
- when Symbol
153
- name == node.name.key ? yield(node) : node
154
- when Hash
155
- other, *rest = name.flatten(1)
156
- if other == node.name.key
157
- nodes.detect { |n| n.name.key == other }.node(*rest, &block)
158
- else
159
- node
160
- end
161
- else
162
- node
163
- end
164
- }
165
-
166
- with_nodes(new_nodes)
167
- end
168
-
169
- # @api public
170
- def to_ast
171
- [:relation, [name.to_sym, attr_ast + node_ast, meta_ast]]
172
- end
173
-
174
- # @api private
175
- def node_ast
176
- nodes.map(&:to_ast)
177
- end
178
-
179
68
  # @api private
180
69
  def mapper
181
70
  mappers[to_ast]
@@ -1,3 +1,5 @@
1
+ require 'dry/equalizer'
2
+
1
3
  module ROM
2
4
  class Relation
3
5
  # Materializes a relation and exposes interface to access the data
@@ -5,6 +7,7 @@ module ROM
5
7
  # @api public
6
8
  class Loaded
7
9
  include Enumerable
10
+ include Dry::Equalizer(:source, :collection)
8
11
 
9
12
  # Coerce loaded relation to an array
10
13
  #
@@ -1,15 +1,11 @@
1
- require 'rom/initializer'
2
- require 'rom/relation/loaded'
3
- require 'rom/relation/composite'
4
- require 'rom/relation/materializable'
5
- require 'rom/pipeline'
1
+ require 'rom/relation/graph'
6
2
 
7
3
  module ROM
8
4
  class Relation
9
5
  # Relation wrapping other relations
10
6
  #
11
7
  # @api public
12
- class Wrap
8
+ class Wrap < Graph
13
9
  extend Initializer
14
10
 
15
11
  include Materializable
@@ -58,11 +54,6 @@ module ROM
58
54
  nodes.map(&:to_ast)
59
55
  end
60
56
 
61
- # @api private
62
- def mapper
63
- mappers[to_ast]
64
- end
65
-
66
57
  # Return if this is a wrap relation
67
58
  #
68
59
  # @return [true]
@@ -71,13 +62,6 @@ module ROM
71
62
  def wrap?
72
63
  true
73
64
  end
74
-
75
- private
76
-
77
- # @api private
78
- def decorate?(other)
79
- super || other.is_a?(Composite) || other.is_a?(Curried)
80
- end
81
65
  end
82
66
  end
83
67
  end
@@ -1,5 +1,5 @@
1
1
  module ROM
2
2
  module Core
3
- VERSION = '4.0.0.beta1'.freeze
3
+ VERSION = '4.0.0.beta2'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.beta1
4
+ version: 4.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-30 00:00:00.000000000 Z
11
+ date: 2017-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -180,7 +180,6 @@ files:
180
180
  - lib/rom/commands/lazy/create.rb
181
181
  - lib/rom/commands/lazy/delete.rb
182
182
  - lib/rom/commands/lazy/update.rb
183
- - lib/rom/commands/result.rb
184
183
  - lib/rom/commands/update.rb
185
184
  - lib/rom/configuration.rb
186
185
  - lib/rom/configuration_dsl.rb
@@ -230,6 +229,7 @@ files:
230
229
  - lib/rom/registry.rb
231
230
  - lib/rom/relation.rb
232
231
  - lib/rom/relation/class_interface.rb
232
+ - lib/rom/relation/combined.rb
233
233
  - lib/rom/relation/commands.rb
234
234
  - lib/rom/relation/composite.rb
235
235
  - lib/rom/relation/curried.rb
@@ -1,96 +0,0 @@
1
- module ROM
2
- module Commands
3
- # Abstract result class for success and error results
4
- #
5
- # @api public
6
- class Result
7
- # Return command execution result
8
- #
9
- # @api public
10
- attr_reader :value
11
-
12
- # Return potential command execution result error
13
- #
14
- # @api public
15
- attr_reader :error
16
-
17
- # Coerce result to an array
18
- #
19
- # @abstract
20
- #
21
- # @api public
22
- def to_ary
23
- raise NotImplementedError
24
- end
25
- alias_method :to_a, :to_ary
26
-
27
- # Return true if command successful
28
- #
29
- # @api public
30
- def success?
31
- is_a?(Success)
32
- end
33
-
34
- # Return true if command failed
35
- #
36
- # @api public
37
- def failure?
38
- is_a?(Failure)
39
- end
40
-
41
- # Success result has a value and no error
42
- #
43
- # @api public
44
- class Success < Result
45
- # @api private
46
- def initialize(value)
47
- @value = value.is_a?(self.class) ? value.value : value
48
- end
49
-
50
- # Call next command on continuation
51
- #
52
- # @api public
53
- def >(other)
54
- other.call(value)
55
- end
56
-
57
- # Return the value
58
- #
59
- # @return [Array]
60
- #
61
- # @api public
62
- def to_ary
63
- value.to_ary
64
- end
65
- end
66
-
67
- # Failure result has an error and no value
68
- #
69
- # @api public
70
- class Failure < Result
71
- # @api private
72
- def initialize(error)
73
- @error = error
74
- end
75
-
76
- # Do not call next command on continuation
77
- #
78
- # @return [self]
79
- #
80
- # @api public
81
- def >(_other)
82
- self
83
- end
84
-
85
- # Return the error
86
- #
87
- # @return [Array<CommandError>]
88
- #
89
- # @api public
90
- def to_ary
91
- error
92
- end
93
- end
94
- end
95
- end
96
- end