Class: Philiprehberger::TestFactory::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/philiprehberger/test_factory/registry.rb

Overview

Stores factory definitions, traits, and sequences.

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



10
11
12
# File 'lib/philiprehberger/test_factory/registry.rb', line 10

def initialize
  clear!
end

Instance Method Details

#clear!void

This method returns an undefined value.

Reset all definitions, traits, and sequences.



84
85
86
87
88
# File 'lib/philiprehberger/test_factory/registry.rb', line 84

def clear!
  @factories = {}
  @traits = {}
  @sequences = {}
end

#define(name, &block) ⇒ void

This method returns an undefined value.

Register a factory definition. If the block accepts a parameter, it receives a DefinitionProxy for declaring callbacks, transient attributes, and associations. The block must return a hash of default attributes.

Parameters:

  • name (Symbol)

    factory name

  • block (Proc)

    block returning a hash of default attributes



22
23
24
25
26
27
28
29
30
# File 'lib/philiprehberger/test_factory/registry.rb', line 22

def define(name, &block)
  proxy = DefinitionProxy.new

  # If the block accepts a parameter, evaluate once to capture DSL declarations.
  # Blocks without parameters are simple attribute hashes with no DSL usage.
  proxy.instance_exec(proxy, &block) if block.arity != 0

  @factories[name] = { block: block, proxy: proxy }
end

#get(name) ⇒ Hash?

Retrieve a factory definition.

Parameters:

  • name (Symbol)

    factory name

Returns:

  • (Hash, nil)

    hash with :block and :proxy keys, or nil



56
57
58
# File 'lib/philiprehberger/test_factory/registry.rb', line 56

def get(name)
  @factories[name]
end

#get_trait(factory_name, trait_name) ⇒ Proc?

Retrieve a trait for a factory.

Parameters:

  • factory_name (Symbol)

    factory name

  • trait_name (Symbol)

    trait name

Returns:

  • (Proc, nil)

    the trait block or nil



65
66
67
# File 'lib/philiprehberger/test_factory/registry.rb', line 65

def get_trait(factory_name, trait_name)
  @traits.dig(factory_name, trait_name)
end

#next_in_sequence(name) ⇒ Object

Get the next value from a named sequence.

Parameters:

  • name (Symbol)

    sequence name

Returns:

  • (Object)

    the next sequence value

Raises:

  • (Error)

    if the sequence is not defined



74
75
76
77
78
79
# File 'lib/philiprehberger/test_factory/registry.rb', line 74

def next_in_sequence(name)
  seq = @sequences[name]
  raise Error, "Sequence :#{name} is not defined" unless seq

  seq.next
end

#sequence(name) ⇒ void

This method returns an undefined value.

Register a sequence generator.

Parameters:

  • name (Symbol)

    sequence name

  • block (Proc)

    block receiving an integer counter



48
49
50
# File 'lib/philiprehberger/test_factory/registry.rb', line 48

def sequence(name, &)
  @sequences[name] = Sequence.new(&)
end

#trait(factory_name, trait_name, &block) ⇒ void

This method returns an undefined value.

Register a trait override for a factory.

Parameters:

  • factory_name (Symbol)

    factory name

  • trait_name (Symbol)

    trait name

  • block (Proc)

    block returning a hash of overridden attributes



38
39
40
41
# File 'lib/philiprehberger/test_factory/registry.rb', line 38

def trait(factory_name, trait_name, &block)
  @traits[factory_name] ||= {}
  @traits[factory_name][trait_name] = block
end