class Fabrication::Schematic::Definition

Constants

GENERATORS

Attributes

attributes[W]
block[RW]
callbacks[W]
name[RW]
options[RW]

Public Class Methods

new(name, options = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 14
def initialize(name, options = {}, &block)
  self.name = name
  self.options = options
  self.block = block
end

Public Instance Methods

append_or_update_attribute(attribute_name, value, params = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 28
def append_or_update_attribute(attribute_name, value, params = {}, &block)
  attribute = Fabrication::Schematic::Attribute.new(klass, attribute_name, value, params, &block)
  index = attributes.index { |a| a.name == attribute.name }

  if index
    attribute.transient! if attributes[index].transient?
    attributes[index] = attribute
  else
    attributes << attribute
  end
end
attribute(name) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 24
def attribute(name)
  attributes.detect { |a| a.name == name }
end
attributes() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 42
def attributes
  load_body
  @attributes ||= []
end
build(overrides = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 60
def build(overrides = {}, &block)
  Fabrication.manager.prevent_recursion!
  if Fabrication.manager.to_params_stack.any?
    to_params(overrides, &block)
  else
    begin
      Fabrication.manager.build_stack << name
      merge(overrides, &block).instance_eval do
        generator.new(klass).build(sorted_attributes, callbacks)
      end
    ensure
      Fabrication.manager.build_stack.pop
    end
  end
end
callbacks() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 47
def callbacks
  load_body
  @callbacks ||= {}
end
fabricate(overrides = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 76
def fabricate(overrides = {}, &block)
  Fabrication.manager.prevent_recursion!
  if Fabrication.manager.build_stack.any?
    build(overrides, &block)
  elsif Fabrication.manager.to_params_stack.any?
    to_params(overrides, &block)
  else
    begin
      Fabrication.manager.create_stack << name
      merge(overrides, &block).instance_eval do
        generator.new(klass).create(sorted_attributes, callbacks)
      end
    ensure
      Fabrication.manager.create_stack.pop
    end
  end
end
generate_value(name, params) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 119
def generate_value(name, params)
  if params[:count] || params[:rand]
    name = Fabrication::Support.singularize(name.to_s)
    proc { Fabricate.build(params[:fabricator] || name) }
  else
    proc { Fabricate(params[:fabricator] || name) }
  end
end
generator() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 52
def generator
  @generator ||= Fabrication::Config.generator_for(GENERATORS, klass)
end
initialize_copy(original) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 110
def initialize_copy(original)
  self.callbacks = {}
  original.callbacks.each do |type, callbacks|
    self.callbacks[type] = callbacks.clone
  end

  self.attributes = original.attributes.clone
end
klass() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 137
def klass
  @klass ||= Fabrication::Support.class_for(
    options[:class_name] ||
      parent&.klass ||
      options[:from] ||
      name
  )
end
merge(overrides = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 128
def merge(overrides = {}, &block)
  clone.tap do |definition|
    definition.process_block(&block)
    overrides.each do |name, value|
      definition.append_or_update_attribute(name.to_sym, value)
    end
  end
end
process_block(&block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 20
def process_block(&block)
  Fabrication::Schematic::Evaluator.new.process(self, &block) if block
end
sorted_attributes() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 56
def sorted_attributes
  attributes.select(&:value_static?) + attributes.select(&:value_proc?)
end
to_attributes(overrides = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 104
def to_attributes(overrides = {}, &block)
  merge(overrides, &block).instance_eval do
    generator.new(klass).to_hash(sorted_attributes, callbacks)
  end
end
to_params(overrides = {}, &block) click to toggle source
# File lib/fabrication/schematic/definition.rb, line 94
def to_params(overrides = {}, &block)
  Fabrication.manager.prevent_recursion!
  Fabrication.manager.to_params_stack << name
  merge(overrides, &block).instance_eval do
    generator.new(klass).to_params(sorted_attributes)
  end
ensure
  Fabrication.manager.to_params_stack.pop
end

Protected Instance Methods

load_body() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 152
def load_body
  return if loaded?

  @loaded = true

  if parent
    merge_result = parent.merge(&block)
    @attributes = merge_result.attributes
    @callbacks = merge_result.callbacks
  else
    process_block(&block)
  end
end
loaded?() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 148
def loaded?
  !!(@loaded ||= nil)
end
parent() click to toggle source
# File lib/fabrication/schematic/definition.rb, line 166
def parent
  @parent ||= Fabrication.manager[options[:from].to_s] if options[:from]
end