Class: ROM::Factory::Factories
- Inherits:
-
Object
- Object
- ROM::Factory::Factories
- Extended by:
- Dry::Configurable, Initializer
- Defined in:
- lib/rom/factory/factories.rb
Overview
A registry with all configured factories
Instance Attribute Summary collapse
-
#registry ⇒ Hash<Symbol=>Builder>
readonly
A map with defined db-backed builders.
-
#rom ⇒ ROM::Container
readonly
Configured rom container.
-
#struct_namespace(namespace = Undefined) ⇒ Factories
readonly
Get factories with a custom struct namespace.
Instance Method Summary collapse
-
#[](name, *args) ⇒ ROM::Struct
Create and persist a new struct.
- #builder_sturct_namespace(ns) ⇒ Object private
-
#define(spec, opts = EMPTY_HASH, &block) ⇒ ROM::Factory::Builder
Define a new builder.
- #extend_builder(name, parent, relation_name, ns, &block) ⇒ Object private
- #for_relation(relation) ⇒ Object private
- #infer_factory_name(name) ⇒ Object private
- #infer_relation(name) ⇒ Object private
-
#structs ⇒ Structs
Return in-memory struct builder.
Instance Attribute Details
#registry ⇒ Hash<Symbol=>Builder> (readonly)
Returns a map with defined db-backed builders.
68 |
# File 'lib/rom/factory/factories.rb', line 68 option :registry, default: proc { Registry.new } |
#rom ⇒ ROM::Container (readonly)
Returns configured rom container.
60 |
# File 'lib/rom/factory/factories.rb', line 60 param :rom |
Instance Method Details
#[](name, *args) ⇒ ROM::Struct
Create and persist a new struct
172 173 174 |
# File 'lib/rom/factory/factories.rb', line 172 def [](name, *args) registry[name].struct_namespace(struct_namespace).persistable.create(*args) end |
#builder_sturct_namespace(ns) ⇒ 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.
207 208 209 |
# File 'lib/rom/factory/factories.rb', line 207 def builder_sturct_namespace(ns) ns ? { namespace: ns, overridable: false } : { namespace: struct_namespace, overridable: true } end |
#define(spec, opts = EMPTY_HASH, &block) ⇒ ROM::Factory::Builder
Define a new builder
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/rom/factory/factories.rb', line 132 def define(spec, opts = EMPTY_HASH, &block) name, parent = spec.is_a?(Hash) ? spec.flatten(1) : spec namespace = opts[:struct_namespace] relation_name = opts.fetch(:relation) { infer_relation(name) } if registry.key?(name) raise ArgumentError, "#{name.inspect} factory has been already defined" end builder = if parent extend_builder(name, registry[parent], relation_name, namespace, &block) else relation = rom.relations[relation_name] DSL.new( name, relation: relation, factories: self, struct_namespace: builder_sturct_namespace(namespace), &block ).call end registry[name] = builder end |
#extend_builder(name, parent, relation_name, ns, &block) ⇒ 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.
227 228 229 230 231 232 233 234 235 236 237 238 239 |
# File 'lib/rom/factory/factories.rb', line 227 def extend_builder(name, parent, relation_name, ns, &block) namespace = parent.[:struct_namespace] namespace = builder_sturct_namespace(ns) if ns relation = rom.relations.fetch(relation_name) { parent.relation } DSL.new( name, attributes: parent.attributes, relation: relation, factories: self, struct_namespace: namespace, &block ).call end |
#for_relation(relation) ⇒ 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.
212 213 214 |
# File 'lib/rom/factory/factories.rb', line 212 def for_relation(relation) registry[infer_factory_name(relation.name.to_sym)] end |
#infer_factory_name(name) ⇒ 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.
217 218 219 |
# File 'lib/rom/factory/factories.rb', line 217 def infer_factory_name(name) ::Dry::Core::Inflector.singularize(name).to_sym end |
#infer_relation(name) ⇒ 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.
222 223 224 |
# File 'lib/rom/factory/factories.rb', line 222 def infer_relation(name) ::Dry::Core::Inflector.pluralize(name).to_sym end |