Class: ROM::Factory::DSL

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

Overview

Factory builder DSL

Defined Under Namespace

Modules: Kernel

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:



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

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) ⇒ 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.



195
196
197
198
199
200
201
# File 'lib/rom/factory/dsl.rb', line 195

def method_missing(meth, ...)
  if _valid_names.include?(meth)
    define_attr(meth, ...)
  else
    super
  end
end

Instance Attribute Details

#_attributesObject (readonly)



49
50
51
# File 'lib/rom/factory/dsl.rb', line 49

def _attributes
  @_attributes
end

#_factoriesObject (readonly)



49
50
51
# File 'lib/rom/factory/dsl.rb', line 49

def _factories
  @_factories
end

#_nameObject (readonly)



49
50
51
# File 'lib/rom/factory/dsl.rb', line 49

def _name
  @_name
end

#_relationObject (readonly)



49
50
51
# File 'lib/rom/factory/dsl.rb', line 49

def _relation
  @_relation
end

#_struct_namespaceObject (readonly)



49
50
51
# File 'lib/rom/factory/dsl.rb', line 49

def _struct_namespace
  @_struct_namespace
end

#_traitsObject (readonly)



50
51
52
# File 'lib/rom/factory/dsl.rb', line 50

def _traits
  @_traits
end

#_valid_namesObject (readonly)



49
50
51
# File 'lib/rom/factory/dsl.rb', line 49

def _valid_names
  @_valid_names
end

Instance Method Details

#association(name, *seq_traits, traits: EMPTY_ARRAY, **options) ⇒ Object

Create an association attribute

Examples:

belongs-to

f.association(:group)

has-many

f.association(:posts, count: 2)

adding traits

f.association(:posts, traits: [:published])

Parameters:

  • name (Symbol)

    The name of the configured association

  • options (Hash)

    Additional options

Options Hash (**options):

  • count (Integer)

    Number of objects to generate

  • traits (Array<Symbol>)

    Traits to apply to the association



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/rom/factory/dsl.rb', line 170

def association(name, *seq_traits, traits: EMPTY_ARRAY, **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,
    *seq_traits,
    *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.



65
66
67
68
69
70
71
72
73
# File 'lib/rom/factory/dsl.rb', line 65

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



80
# File 'lib/rom/factory/dsl.rb', line 80

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

#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) }
    f.email { fake(:internet, :email, unique: true) }

    Parameters:

    • genre (Symbol)

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

    • type (Symbol)

      The value type to generate

    • options (Hash)

      Additional arguments, including unique: true will generate unique values

  • #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:



138
# File 'lib/rom/factory/dsl.rb', line 138

def fake(...) = ::ROM::Factory.fake(...)

#inspectObject Also known as: to_s

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.



189
# File 'lib/rom/factory/dsl.rb', line 189

def inspect = "#<#{self.class} name=#{_name}>"

#sequence(meth) ⇒ 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



87
88
89
# File 'lib/rom/factory/dsl.rb', line 87

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

#timestampsObject

Set timestamp attributes



94
95
96
97
# File 'lib/rom/factory/dsl.rb', line 94

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

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



140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/rom/factory/dsl.rb', line 140

def trait(name, parents = [], &)
  _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,
    &
  )._attributes
end