Class: ROM::Factory::Factories
- Inherits:
-
Object
- Object
- ROM::Factory::Factories
- Extended by:
- Dry::Configurable
- Defined in:
- lib/rom/factory/factories.rb
Overview
A registry with all configured factories
Class Attribute Summary collapse
- .registry ⇒ Object readonly
- .structs ⇒ Object readonly
Class Method Summary collapse
-
.[](name, 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
- .inherited(klass) ⇒ Object private
Class Attribute Details
.registry ⇒ Object (readonly)
50 51 52 |
# File 'lib/rom/factory/factories.rb', line 50 def registry @registry end |
.structs ⇒ Object (readonly)
54 55 56 |
# File 'lib/rom/factory/factories.rb', line 54 def structs @structs end |
Class Method Details
.[](name, attrs = {}) ⇒ ROM::Struct
Create and persist a new struct
159 160 161 |
# File 'lib/rom/factory/factories.rb', line 159 def [](name, attrs = {}) registry[name].persistable.create(attrs) end |
.define(spec, **opts, &block) ⇒ ROM::Factory::Builder
Define a new builder
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/rom/factory/factories.rb', line 126 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 = config.rom.relations[relation_name] DSL.new(name, relation: relation, 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.
179 180 181 |
# File 'lib/rom/factory/factories.rb', line 179 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.
164 165 166 |
# File 'lib/rom/factory/factories.rb', line 164 def for_relation(relation) registry.fetch(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.
169 170 171 |
# File 'lib/rom/factory/factories.rb', line 169 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.
174 175 176 |
# File 'lib/rom/factory/factories.rb', line 174 def infer_relation(name) ::Dry::Core::Inflector.pluralize(name).to_sym 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.
57 58 59 60 61 62 |
# File 'lib/rom/factory/factories.rb', line 57 def inherited(klass) registry = {} klass.instance_variable_set(:'@registry', registry) klass.instance_variable_set(:'@structs', Structs.new(registry)) super end |