Class: ROM::Changeset::Stateful Abstract
- Inherits:
-
ROM::Changeset
- Object
- ROM::Changeset
- ROM::Changeset::Stateful
- Defined in:
- changeset/lib/rom/changeset/stateful.rb
Overview
Stateful changesets carry data and can transform it into a different structure compatible with a persistence backend
Constant Summary collapse
Instance Attribute Summary collapse
-
#__data__ ⇒ Hash
readonly
private
The relation data.
-
#pipe ⇒ Changeset::Pipe
readonly
private
Data transformation pipe.
Class Method Summary collapse
-
.default_pipe(context) ⇒ Pipe
Build default pipe object.
-
.extend(&block) ⇒ Array<Pipe>, Transproc::Function
Define a changeset mapping excluded from diffs.
- .inherited(klass) ⇒ Object private
-
.map(**options, &block) ⇒ Array<Pipe>, Transproc::Function
Define a changeset mapping.
- .pipes ⇒ Object private
Instance Method Summary collapse
-
#associate(other, name = Associated.infer_assoc_name(other)) ⇒ Object
Associate a changeset with another changeset or hash-like object.
- #command_compiler_options ⇒ Object private
-
#commit ⇒ Object
Commit stateful changeset.
-
#data(data) ⇒ Changeset
Return changeset with data.
-
#extend(*steps, **options, &block) ⇒ Changeset
Pipe changeset's data using custom steps define on the pipe.
-
#inspect ⇒ String
Return string representation of the changeset.
-
#map(*steps, &block) ⇒ Changeset
Pipe changeset's data using custom steps define on the pipe.
-
#result ⇒ Symbol
private
Return command result type.
-
#to_a ⇒ Array
(also: #to_ary)
Coerce changeset to an array.
-
#to_h ⇒ Hash
(also: #to_hash)
Coerce changeset to a hash.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args, &block) ⇒ Object (private)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
269 270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 269 def method_missing(meth, *args, &block) if __data__.respond_to?(meth) response = __data__.__send__(meth, *args, &block) if response.is_a?(__data__.class) with(__data__: response) else response end else super end end |
Instance Attribute Details
#__data__ ⇒ Hash (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The relation data.
18 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 18 option :__data__, optional: true |
#pipe ⇒ Changeset::Pipe (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Data transformation pipe
23 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 23 option :pipe, reader: false, optional: true |
Class Method Details
.default_pipe(context) ⇒ Pipe
Build default pipe object
This can be overridden in a custom changeset subclass
89 90 91 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 89 def self.default_pipe(context) !pipes.empty? ? pipes.map { |p| p.bind(context) }.reduce(:>>) : EMPTY_PIPE end |
.extend(&block) ⇒ Array<Pipe>, Transproc::Function
Define a changeset mapping excluded from diffs
76 77 78 79 80 81 82 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 76 def self.extend(*, &block) if block map(use_for_diff: false, &block) else super end end |
.inherited(klass) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
94 95 96 97 98 99 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 94 def self.inherited(klass) return if klass == ROM::Changeset super klass.instance_variable_set(:@__pipes__, pipes.dup) end |
.map(**options, &block) ⇒ Array<Pipe>, Transproc::Function
Define a changeset mapping
Subsequent mapping definitions will be composed together and applied in the order they way defined
60 61 62 63 64 65 66 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 60 def self.map(**, &block) if block.parameters.empty? pipes << Class.new(Pipe).define!(&block).new(**) else pipes << Pipe.new(block, **) end end |
.pipes ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
102 103 104 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 102 def self.pipes @__pipes__ end |
Instance Method Details
#associate(other, name = Associated.infer_assoc_name(other)) ⇒ Object
Associate a changeset with another changeset or hash-like object
225 226 227 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 225 def associate(other, name = Associated.infer_assoc_name(other)) Associated.new(self, associations: { name => other }) end |
#command_compiler_options ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
248 249 250 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 248 def super.merge(result: result) end |
#commit ⇒ Object
Commit stateful changeset
203 204 205 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 203 def commit command.call(self) end |
#data(data) ⇒ Changeset
Return changeset with data
170 171 172 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 170 def data(data) with(__data__: data) end |
#extend(*steps, **options, &block) ⇒ Changeset
Pipe changeset's data using custom steps define on the pipe.
You should use #map instead except updating timestamp fields.
Calling changeset.extend builds a pipe that excludes certain
steps for generating the diff. Currently the only place where
it is used is update changesets with the :touch
step, i.e.
changeset.extend(:touch).diff
will exclude :updated_at
from the diff.
151 152 153 154 155 156 157 158 159 160 161 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 151 def extend(*steps, **, &block) if block if !steps.empty? extend(*steps, **).extend(**, &block) else with(pipe: pipe.compose(Pipe.new(block).bind(self), **)) end else with(pipe: steps.reduce(pipe.with(**)) { |a, e| a.compose(pipe[e], **) }) end end |
#inspect ⇒ String
Return string representation of the changeset
243 244 245 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 243 def inspect %(#<#{self.class} relation=#{relation.name.inspect} data=#{__data__}>) end |
#map(*steps) ⇒ Changeset #map(&block) ⇒ Changeset #map(*steps, &block) ⇒ Changeset
Pipe changeset's data using custom steps define on the pipe
134 135 136 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 134 def map(*steps, &block) extend(*steps, for_diff: true, &block) end |
#result ⇒ Symbol
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return command result type
234 235 236 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 234 def result __data__.is_a?(Array) ? :many : :one end |
#to_a ⇒ Array Also known as: to_ary
Coerce changeset to an array
This will send the data through the pipe
193 194 195 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 193 def to_a result == :one ? [to_h] : __data__.map { |element| pipe.call(element) } end |
#to_h ⇒ Hash Also known as: to_hash
Coerce changeset to a hash
This will send the data through the pipe
181 182 183 |
# File 'changeset/lib/rom/changeset/stateful.rb', line 181 def to_h pipe.call(__data__) end |