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, *traits, **attrs) ⇒ ROM::Struct
Create and persist a new struct.
-
#define(spec, **opts, &block) ⇒ ROM::Factory::Builder
Define a new builder.
- #extend_builder(name, parent, &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, *traits, **attrs) ⇒ ROM::Struct
Create and persist a new struct
165 166 167 |
# File 'lib/rom/factory/factories.rb', line 165 def [](name, *traits, **attrs) registry[name].persistable(struct_namespace).create(*traits, attrs) end |
#define(spec, **opts, &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 |
# File 'lib/rom/factory/factories.rb', line 132 def define(spec, **opts, &block) name, parent = spec.is_a?(Hash) ? spec.flatten(1) : spec if registry.key?(name) raise ArgumentError, "#{name.inspect} factory has been already defined" end builder = if parent extend_builder(name, registry[parent], &block) else relation_name = opts.fetch(:relation) { infer_relation(name) } relation = rom.relations[relation_name] DSL.new(name, relation: relation.struct_namespace(struct_namespace), factories: self, &block).call end registry[name] = builder end |
#extend_builder(name, parent, &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.
215 216 217 |
# File 'lib/rom/factory/factories.rb', line 215 def extend_builder(name, parent, &block) DSL.new(name, attributes: parent.attributes, relation: parent.relation, factories: self, &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.
200 201 202 |
# File 'lib/rom/factory/factories.rb', line 200 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.
205 206 207 |
# File 'lib/rom/factory/factories.rb', line 205 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.
210 211 212 |
# File 'lib/rom/factory/factories.rb', line 210 def infer_relation(name) ::Dry::Core::Inflector.pluralize(name).to_sym end |