Class: ROM::Command
- Inherits:
-
Object
- Object
- ROM::Command
- Extended by:
- Dry::Core::ClassAttributes, ClassInterface, Restrictable, Initializer, Plugins::ClassMethods, SettingProxy
- Includes:
- Commands, Pipeline::Operator
- Defined in:
- lib/rom/command.rb,
lib/rom/compat/command.rb,
lib/rom/commands/class_interface.rb
Overview
Base command class with factory class-level interface and setup-related logic
Direct Known Subclasses
ROM::Commands::Create, ROM::Commands::Delete, ROM::Commands::Update
Defined Under Namespace
Modules: ClassInterface, Restrictable
Constant Summary collapse
- CommandType =
Types::Strict::Symbol.enum(:create, :update, :delete)
- Result =
Types::Strict::Symbol.enum(:one, :many)
Instance Attribute Summary collapse
-
#after(*hooks) ⇒ Command
readonly
Return a new command with appended after hooks.
-
#before(*hooks) ⇒ Command
readonly
Return a new command with appended before hooks.
- #config ⇒ ROM::Configurable::Config readonly
-
#curry_args ⇒ Array
readonly
Curried args.
-
#input ⇒ Proc, #call
readonly
Tuple processing function, typically uses Relation#input_schema.
-
#relation ⇒ Relation
readonly
Command's relation.
-
#result ⇒ Symbol
readonly
Result type, either :one or :many.
-
#source ⇒ Relation
readonly
The source relation.
-
#type ⇒ Symbol
readonly
The command type, one of :create, :update or :delete.
Class Method Summary collapse
-
.[](adapter) ⇒ Class
extended
from ClassInterface
Return adapter specific sub-class based on the adapter identifier.
-
.adapter ⇒ Symbol
extended
from ClassInterface
Return configured adapter identifier.
-
.adapter_namespace(adapter) ⇒ Module
extended
from ClassInterface
private
Return namespaces that contains command subclasses of a specific adapter.
-
.after(*hooks) ⇒ Array<Hash, Symbol>
extended
from ClassInterface
Set after-execute hooks.
-
.before(*hooks) ⇒ Array<Hash, Symbol>
extended
from ClassInterface
Set before-execute hooks.
-
.build(relation, **options) ⇒ Command
extended
from ClassInterface
Build a command class for a specific relation with options.
-
.create_class(type: self, meta: {}, rel_meta: {}, plugins: {}) {|Class| ... } ⇒ Class, Object
extended
from ClassInterface
Create a command class with a specific type.
-
.default_name ⇒ Symbol
extended
from ClassInterface
private
Return default name of the command class based on its name.
- .extend_for_relation(relation) ⇒ Class deprecated Deprecated.
-
.inherited(klass) ⇒ Object
extended
from ClassInterface
private
This hook sets up default class state.
-
.plugins ⇒ Object
extended
from Plugins::ClassMethods
Return all available plugins for the component type.
- .relation_methods_mod(relation_class) ⇒ Object private
-
.set_hooks(type, hooks) ⇒ Object
extended
from ClassInterface
private
Set new or more hooks.
- .setting_mapping ⇒ Object
-
.use(name, **options) ⇒ Object
extended
from Plugins::ClassMethods
Include a registered plugin in this relation class.
Instance Method Summary collapse
-
#>>(other) ⇒ Relation::Composite
included
from Pipeline::Operator
Compose two relation with a left-to-right composition.
-
#after_hooks ⇒ Array
List of after hooks.
-
#before_hooks ⇒ Array
List of before hooks.
-
#call(*args, &block) ⇒ Object
(also: #[])
Call the command and return one or many tuples.
-
#combine(*others) ⇒ Command::Graph
Compose this command with other commands.
-
#curried? ⇒ TrueClass, FalseClass
Check if this command is curried.
-
#curry(*args) ⇒ Command, Lazy
Curry this command with provided args.
-
#execute ⇒ Array
abstract
private
Execute the command.
-
#gateway ⇒ Symbol
Return gateway of this command's relation.
-
#graph? ⇒ false
private
Check if this command is a graph.
-
#hooks? ⇒ Boolean
private
Check if this command has any hooks.
-
#lazy? ⇒ false
private
Check if this command is lazy.
-
#many? ⇒ TrueClass, FalseClass
private
Check if this command returns many tuples.
-
#map_input_tuples(tuples, &mapper) ⇒ Object
private
Yields tuples for insertion or return an enumerator.
-
#name ⇒ ROM::Relation::Name
Return name of this command's relation.
-
#new(new_relation) ⇒ Command
Return a new command with other source relation.
-
#one? ⇒ TrueClass, FalseClass
private
Check if this command returns a single tuple.
-
#restrictible? ⇒ TrueClass, FalseClass
private
Check if this command is restrictible through relation.
Instance Attribute Details
#after(*hooks) ⇒ Command (readonly)
Return a new command with appended after hooks
83 |
# File 'lib/rom/command.rb', line 83 option :after, Types::Coercible::Array, reader: false, default: -> { self.class.after } |
#before(*hooks) ⇒ Command (readonly)
Return a new command with appended before hooks
79 |
# File 'lib/rom/command.rb', line 79 option :before, Types::Coercible::Array, reader: false, default: -> { self.class.before } |
#config ⇒ ROM::Configurable::Config (readonly)
59 |
# File 'lib/rom/command.rb', line 59 option :config, default: -> { self.class.config } |
#curry_args ⇒ Array (readonly)
Returns Curried args.
75 |
# File 'lib/rom/command.rb', line 75 option :curry_args, default: -> { EMPTY_ARRAY } |
#input ⇒ Proc, #call (readonly)
Returns Tuple processing function, typically uses Relation#input_schema.
71 |
# File 'lib/rom/command.rb', line 71 option :input, default: -> { config.input } |
#relation ⇒ Relation (readonly)
Returns Command's relation.
48 |
# File 'lib/rom/command.rb', line 48 param :relation |
#result ⇒ Symbol (readonly)
Returns Result type, either :one or :many.
67 |
# File 'lib/rom/command.rb', line 67 option :result, type: Result, default: -> { config.result } |
#source ⇒ Relation (readonly)
Returns The source relation.
63 |
# File 'lib/rom/command.rb', line 63 option :source, default: -> { relation } |
#type ⇒ Symbol (readonly)
Returns The command type, one of :create, :update or :delete.
55 |
# File 'lib/rom/command.rb', line 55 option :type, type: CommandType, optional: true |
Class Method Details
.[](adapter) ⇒ Class Originally defined in module ClassInterface
Return adapter specific sub-class based on the adapter identifier
This is a syntax sugar to make things consistent
.adapter ⇒ Symbol Originally defined in module ClassInterface
Return configured adapter identifier
.adapter_namespace(adapter) ⇒ Module Originally defined in module ClassInterface
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 namespaces that contains command subclasses of a specific adapter
#after(hook) ⇒ Array<Hash, Symbol> #after(hook_opts) ⇒ Array<Hash, Symbol> Originally defined in module ClassInterface
Set after-execute hooks
#before(hook) ⇒ Array<Hash, Symbol> #before(hook_opts) ⇒ Array<Hash, Symbol> Originally defined in module ClassInterface
Set before-execute hooks
.build(relation, **options) ⇒ Command Originally defined in module ClassInterface
Build a command class for a specific relation with options
.create_class(type: self, meta: {}, rel_meta: {}, plugins: {}) {|Class| ... } ⇒ Class, Object Originally defined in module ClassInterface
Create a command class with a specific type
.default_name ⇒ Symbol Originally defined in module ClassInterface
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 default name of the command class based on its name
During setup phase this is used by defalut as register_as
option
.extend_for_relation(relation) ⇒ Class
Extend a command class with relation view methods
51 52 53 |
# File 'lib/rom/compat/command.rb', line 51 def self.extend_for_relation(relation) include(relation_methods_mod(relation.class)) end |
.inherited(klass) ⇒ Object Originally defined in module ClassInterface
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.
This hook sets up default class state
.plugins ⇒ Object Originally defined in module Plugins::ClassMethods
Return all available plugins for the component type
.relation_methods_mod(relation_class) ⇒ 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.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/rom/compat/command.rb', line 56 def self.relation_methods_mod(relation_class) Module.new do relation_class.view_methods.each do |meth| module_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{meth}(*args) response = relation.public_send(:#{meth}, *args) if response.is_a?(relation.class) new(response) else response end end RUBY end end end |
.set_hooks(type, hooks) ⇒ Object Originally defined in module ClassInterface
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.
Set new or more hooks
.setting_mapping ⇒ Object
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/rom/compat/command.rb', line 31 def setting_mapping @setting_mapper ||= { adapter: [:component, :adapter], relation: [:component, %i[relation namespace]], register_as: [:component, :id], restrictable: [], result: [], input: [] }.freeze end |
.use(name, **options) ⇒ Object Originally defined in module Plugins::ClassMethods
Include a registered plugin in this relation class
Instance Method Details
#>>(other) ⇒ Relation::Composite Originally defined in module Pipeline::Operator
Compose two relation with a left-to-right composition
#after_hooks ⇒ Array
List of after hooks
229 230 231 |
# File 'lib/rom/command.rb', line 229 def after_hooks [:after] end |
#before_hooks ⇒ Array
List of before hooks
220 221 222 |
# File 'lib/rom/command.rb', line 220 def before_hooks [:before] end |
#call(*args, &block) ⇒ Object Also known as: []
Call the command and return one or many tuples
This method will apply before/after hooks automatically
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/rom/command.rb', line 122 def call(*args, &block) tuples = if hooks? prepared = if curried? apply_hooks(before_hooks, *(curry_args + args)) else apply_hooks(before_hooks, *args) end result = prepared ? execute(prepared, &block) : execute(&block) if curried? if !args.empty? apply_hooks(after_hooks, result, *args) elsif curry_args.size > 1 apply_hooks(after_hooks, result, curry_args[1]) else apply_hooks(after_hooks, result) end else apply_hooks(after_hooks, result, *args[1..args.size - 1]) end else execute(*(curry_args + args), &block) end if one? tuples.first else tuples end end |
#combine(*others) ⇒ Command::Graph
Compose this command with other commands
Composed commands can handle nested input
180 181 182 |
# File 'lib/rom/command.rb', line 180 def combine(*others) Graph.new(self, others) end |
#curried? ⇒ TrueClass, FalseClass
Check if this command is curried
189 190 191 |
# File 'lib/rom/command.rb', line 189 def curried? !curry_args.empty? end |
#curry(*args) ⇒ Command, Lazy
Curry this command with provided args
Curried command can be called without args. If argument is a graph input processor, lazy command will be returned, which is used for handling nested input hashes.
165 166 167 168 169 170 171 |
# File 'lib/rom/command.rb', line 165 def curry(*args) if curry_args.empty? && args.first.is_a?(Graph::InputEvaluator) Lazy[self].new(self, *args) else self.class.build(relation, **, curry_args: args) end end |
#execute ⇒ Array
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.
Execute the command
110 111 112 113 114 115 |
# File 'lib/rom/command.rb', line 110 def execute(*) raise( NotImplementedError, "#{self.class}##{__method__} must be implemented" ) end |
#gateway ⇒ Symbol
Return gateway of this command's relation
99 100 101 |
# File 'lib/rom/command.rb', line 99 def gateway relation.gateway end |
#graph? ⇒ false
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.
Check if this command is a graph
265 266 267 |
# File 'lib/rom/command.rb', line 265 def graph? false end |
#hooks? ⇒ Boolean
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.
Check if this command has any hooks
247 248 249 |
# File 'lib/rom/command.rb', line 247 def hooks? !before_hooks.empty? || !after_hooks.empty? end |
#lazy? ⇒ false
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.
Check if this command is lazy
256 257 258 |
# File 'lib/rom/command.rb', line 256 def lazy? false end |
#many? ⇒ TrueClass, FalseClass
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.
Check if this command returns many tuples
283 284 285 |
# File 'lib/rom/command.rb', line 283 def many? result.equal?(:many) end |
#map_input_tuples(tuples, &mapper) ⇒ 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.
Yields tuples for insertion or return an enumerator
299 300 301 302 303 304 305 306 307 |
# File 'lib/rom/command.rb', line 299 def map_input_tuples(tuples, &mapper) return enum_for(:with_input_tuples, tuples) unless mapper if tuples.respond_to? :merge mapper[tuples] else tuples.map(&mapper) end end |
#name ⇒ ROM::Relation::Name
Return name of this command's relation
90 91 92 |
# File 'lib/rom/command.rb', line 90 def name relation.name end |
#new(new_relation) ⇒ Command
Return a new command with other source relation
This can be used to restrict command with a specific relation
240 241 242 |
# File 'lib/rom/command.rb', line 240 def new(new_relation) self.class.build(new_relation, **, source: relation) end |
#one? ⇒ TrueClass, FalseClass
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.
Check if this command returns a single tuple
274 275 276 |
# File 'lib/rom/command.rb', line 274 def one? result.equal?(:one) end |
#restrictible? ⇒ TrueClass, FalseClass
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.
Check if this command is restrictible through relation
292 293 294 |
# File 'lib/rom/command.rb', line 292 def restrictible? config.restrictable.equal?(true) end |