Class: ROM::Factory::DSL

Inherits:
BasicObject
Defined in:
lib/rom/factory/dsl.rb

Overview

Factory builder DSL

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, relation:, factories:, struct_namespace:, attributes: AttributeRegistry.new) {|_self| ... } ⇒ DSL

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.

Returns a new instance of DSL.

Yields:

  • (_self)

Yield Parameters:



40
41
42
43
44
45
46
47
48
49
# File 'lib/rom/factory/dsl.rb', line 40

def initialize(name, relation:, factories:, struct_namespace:, attributes: AttributeRegistry.new)
  @_name = name
  @_relation = relation
  @_factories = factories
  @_struct_namespace = struct_namespace
  @_attributes = attributes.dup
  @_traits = {}
  @_valid_names = _relation.schema.attributes.map(&:name)
  yield(self)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &block) ⇒ Object (private)

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.



168
169
170
171
172
173
174
# File 'lib/rom/factory/dsl.rb', line 168

def method_missing(meth, *args, &block)
  if _valid_names.include?(meth)
    define_attr(meth, *args, &block)
  else
    super
  end
end

Instance Attribute Details

#_attributesObject (readonly)



36
37
38
# File 'lib/rom/factory/dsl.rb', line 36

def _attributes
  @_attributes
end

#_factoriesObject (readonly)



36
37
38
# File 'lib/rom/factory/dsl.rb', line 36

def _factories
  @_factories
end

#_nameObject (readonly)



36
37
38
# File 'lib/rom/factory/dsl.rb', line 36

def _name
  @_name
end

#_relationObject (readonly)



36
37
38
# File 'lib/rom/factory/dsl.rb', line 36

def _relation
  @_relation
end

#_struct_namespaceObject (readonly)



36
37
38
# File 'lib/rom/factory/dsl.rb', line 36

def _struct_namespace
  @_struct_namespace
end

#_traitsObject (readonly)



37
38
39
# File 'lib/rom/factory/dsl.rb', line 37

def _traits
  @_traits
end

#_valid_namesObject (readonly)



36
37
38
# File 'lib/rom/factory/dsl.rb', line 36

def _valid_names
  @_valid_names
end

Instance Method Details

#association(name, *traits, **options) ⇒ Object

Create an association attribute

Examples:

belongs-to

f.association(:group)

has-many

f.association(:posts, count: 2)

Parameters:

  • name (Symbol)

    The name of the configured association

  • options (Hash)

    Additional options

Options Hash (**options):

  • count (Integer)

    Number of objects to generate



153
154
155
156
157
158
159
160
161
162
163
# File 'lib/rom/factory/dsl.rb', line 153

def association(name, *traits, **options)
  assoc = _relation.associations[name]

  if assoc.is_a?(::ROM::SQL::Associations::OneToOne) && options.fetch(:count, 1) > 1
    ::Kernel.raise ::ArgumentError, "count cannot be greater than 1 on a OneToOne"
  end

  builder = -> { _factories.for_relation(assoc.target) }

  _attributes << attributes::Association.new(assoc, builder, *traits, **options)
end

#callObject

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.



52
53
54
55
56
57
58
59
60
# File 'lib/rom/factory/dsl.rb', line 52

def call
  ::ROM::Factory::Builder.new(
    _attributes,
    _traits,
    relation: _relation,
    struct_namespace: _struct_namespace,
    factories: _factories
  )
end

#create(name, *args) ⇒ Object

Delegate to a builder and persist a struct

Parameters:

  • The (Symbol)

    name of the registered builder



67
68
69
# File 'lib/rom/factory/dsl.rb', line 67

def create(name, *args)
  _factories[name, *args]
end

#fake(type) ⇒ Object #fake(genre, type) ⇒ Object #fake(genre, type, **options) ⇒ Object #fake(genre, subgenre, type, **options) ⇒ Object

Create a fake value using Faker gem

Overloads:

  • #fake(type) ⇒ Object

    Examples:

    f.email { fake(:name) }

    Parameters:

    • type (Symbol)

      The value type to generate

  • #fake(genre, type) ⇒ Object

    Examples:

    f.email { fake(:internet, :email) }

    Parameters:

    • genre (Symbol)

      The faker API identifier ie. :internet, :product etc.

    • type (Symbol)

      The value type to generate

  • #fake(genre, type, **options) ⇒ Object

    Examples:

    f.email { fake(:number, :between, from: 10, to: 100) }

    Parameters:

    • genre (Symbol)

      The faker API identifier ie. :internet, :product etc.

    • type (Symbol)

      The value type to generate

    • options (Hash)

      Additional arguments

  • #fake(genre, subgenre, type, **options) ⇒ Object

    Examples:

    f.quote { fake(:books, :dune, :quote, character: 'stilgar') }

    Parameters:

    • genre (Symbol)

      The Faker genre of API i.e. :books, :creature, :games etc

    • subgenre (Symbol)

      The subgenre of API i.e. :dune, :bird, :myst etc

    • type (Symbol)

      the value type to generate

    • options (Hash)

      Additional arguments

See Also:



123
124
125
# File 'lib/rom/factory/dsl.rb', line 123

def fake(type, *args, **options)
  ::ROM::Factory.fake(type, *args, **options)
end

#sequence(meth, &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.

Create a sequence attribute

Parameters:

  • name (Symbol)

    The attribute name



76
77
78
# File 'lib/rom/factory/dsl.rb', line 76

def sequence(meth, &block)
  define_sequence(meth, block) if _valid_names.include?(meth)
end

#timestampsObject

Set timestamp attributes



83
84
85
86
# File 'lib/rom/factory/dsl.rb', line 83

def timestamps
  created_at { ::Time.now }
  updated_at { ::Time.now }
end

#trait(name, parents = [], &block) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/rom/factory/dsl.rb', line 127

def trait(name, parents = [], &block)
  _traits[name] = DSL.new(
    "#{_name}_#{name}",
    attributes: _traits.values_at(*parents).flat_map(&:elements).inject(
      AttributeRegistry.new, :<<
    ),
    relation: _relation,
    factories: _factories,
    struct_namespace: _struct_namespace,
    &block
  )._attributes
end