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
(also: #create)
Create and persist a new struct.
-
#build(name, *traits, **attrs) ⇒ ROM::Struct
Return a new, non-persisted struct.
- #builder_struct_namespace(ns) ⇒ Object private
-
#define(spec, opts = EMPTY_HASH) ⇒ ROM::Factory::Builder
Define a new builder.
- #extend_builder(name, parent, relation_name, ns) ⇒ 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.
65 |
# File 'lib/rom/factory/factories.rb', line 65 option :registry, default: proc { Registry.new } |
#rom ⇒ ROM::Container (readonly)
Returns configured rom container.
57 |
# File 'lib/rom/factory/factories.rb', line 57 param :rom |
Instance Method Details
#[](name, *traits, **attrs) ⇒ ROM::Struct Also known as: create
Create and persist a new struct
170 171 172 |
# File 'lib/rom/factory/factories.rb', line 170 def [](name, *traits, **attrs) registry[name].struct_namespace(struct_namespace).persistable.create(*traits, **attrs) end |
#build(name, *traits, **attrs) ⇒ ROM::Struct
Return a new, non-persisted struct
199 200 201 |
# File 'lib/rom/factory/factories.rb', line 199 def build(name, *traits, **attrs) structs[name, *traits, **attrs] end |
#builder_struct_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.
225 226 227 |
# File 'lib/rom/factory/factories.rb', line 225 def builder_struct_namespace(ns) ns ? {namespace: ns, overridable: false} : {namespace: struct_namespace, overridable: true} end |
#define(spec, opts = EMPTY_HASH) ⇒ ROM::Factory::Builder
Define a new builder
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 |
# File 'lib/rom/factory/factories.rb', line 129 def define(spec, opts = EMPTY_HASH, &) 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, &) else relation = rom.relations[relation_name] DSL.new( name, relation: relation, factories: self, struct_namespace: builder_struct_namespace(namespace), & ).call end registry[name] = builder end |
#extend_builder(name, parent, relation_name, 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.
245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/rom/factory/factories.rb', line 245 def extend_builder(name, parent, relation_name, ns, &) namespace = parent.[:struct_namespace] namespace = builder_struct_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, & ).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.
230 231 232 |
# File 'lib/rom/factory/factories.rb', line 230 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.
235 236 237 |
# File 'lib/rom/factory/factories.rb', line 235 def infer_factory_name(name) ::ROM::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.
240 241 242 |
# File 'lib/rom/factory/factories.rb', line 240 def infer_relation(name) ::ROM::Inflector.pluralize(name).to_sym end |