Sha256: 78dccdfb718e1aff6d2dd3a762ab074e1cbc2847bb8a4c54357bcc82f0c62c2a

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

# encoding: utf-8

require 'addressable/uri'

require 'rom/environment'
require 'rom/repository'
require 'rom/schema/builder'
require 'rom/mapper/builder'

module ROM

  # The environment configures repositories and loads schema with relations
  #
  class Environment

    # Environment builder DSL
    #
    class Builder
      attr_reader :repositories, :relations, :mappers

      # @api private
      def self.call(config)
        repositories = config.each_with_object({}) { |(name, uri), hash|
          hash[name.to_sym] = Repository.build(name, Addressable::URI.parse(uri))
        }

        new(repositories)
      end

      # @api private
      def initialize(repositories)
        @repositories = repositories
        @relations = {}
        @schema = Schema::Builder.build(repositories)
        @mappers = Mapper::Builder.new(schema)
      end

      # @api private
      def schema(&block)
        @schema.call(&block) if block
        @schema
      end

      # @api private
      def mapping(&block)
        mappers.call(&block)
      end

      # @api private
      def [](name)
        relations[name]
      end

      # @api private
      def []=(name, relation)
        relations[name] = relation
      end

      # @api private
      def finalize
        mappers.each do |name, mapper|
          relations[name] = Relation.new(schema[name], mapper)
        end

        Environment.new(repositories, schema.finalize, relations, mappers.finalize)
      end

    end # Builder

  end # Environment
end # ROM

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rom-0.2.0 lib/rom/environment/builder.rb