Sha256: 5f13de1f583e495e8e119963679dd538a093541b91883985d90d7fc55e46daa0

Contents?: true

Size: 1.66 KB

Versions: 2

Compression:

Stored size: 1.66 KB

Contents

# frozen_string_literal: true

require 'dry/core/constants'

require 'rom/struct'
require 'rom/initializer'
require 'rom/factory/tuple_evaluator'
require 'rom/factory/builder/persistable'

module ROM::Factory
  # @api private
  class Builder
    extend ROM::Initializer

    include Dry::Core::Constants

    # @!attribute [r] attributes
    #   @return [ROM::Factory::Attributes]
    param :attributes

    # @!attribute [r] traits
    #   @return [Hash]
    param :traits, default: -> { EMPTY_HASH }

    # @!attribute [r] relation
    #   @return [ROM::Relation]
    option :relation, reader: false

    # @api private
    def tuple(*traits, **attrs)
      tuple_evaluator.defaults(traits, attrs)
    end

    # @api private
    def struct(*traits, **attrs)
      validate_keys(traits, attrs)
      tuple_evaluator.struct(*traits, attrs)
    end
    alias_method :create, :struct

    # @api private
    def struct_namespace(namespace)
      with(relation: relation.struct_namespace(namespace))
    end

    # @api private
    def persistable(struct_namespace = ROM::Struct)
      Persistable.new(self, relation.struct_namespace(struct_namespace))
    end

    # @api private
    def tuple_evaluator
      @__tuple_evaluator__ ||= TupleEvaluator.new(attributes, options[:relation], traits)
    end

    # @api private
    def relation
      tuple_evaluator.relation
    end

    # @api private
    def validate_keys(traits, tuple)
      schema_keys = relation.schema.attributes.map(&:name)
      assoc_keys = tuple_evaluator.assoc_names(traits)
      unknown_keys = tuple.keys - schema_keys - assoc_keys

      raise UnknownFactoryAttributes, unknown_keys unless unknown_keys.empty?
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rom-factory-0.9.1 lib/rom/factory/builder.rb
rom-factory-0.9.0 lib/rom/factory/builder.rb