Sha256: 22b09d12f54c2788bcaca120cce12265500c7eca6f253a3fcb1aa41d5966f5df

Contents?: true

Size: 1.66 KB

Versions: 3

Compression:

Stored size: 1.66 KB

Contents

require 'rom/relation_registry'

module ROM
  class Finalize
    class FinalizeRelations
      # Build relation registry of specified descendant classes
      #
      # This is used by the setup
      #
      # @param [Hash] gateways
      # @param [Array] relation_classes a list of relation descendants
      #
      # @api private
      def initialize(gateways, relation_classes)
        @gateways = gateways
        @relation_classes = relation_classes
      end

      # @return [Hash]
      #
      # @api private
      def run!
        RelationRegistry.new do |registry, relations|
          @relation_classes.each do |klass|
            relation = build_relation(klass, registry)

            key = relation.name.to_sym

            if registry.key?(key)
              raise RelationAlreadyDefinedError,
                    "Relation with `register_as #{key.inspect}` registered more " \
                    "than once"
            end

            relations[key] = relation
          end

          relations.each_value do |relation|
            relation.class.finalize(registry, relation)
          end
        end
      end

      # @return [ROM::Relation]
      #
      # @api private
      def build_relation(klass, registry)
        # TODO: raise a meaningful error here and add spec covering the case
        #       where klass' gateway points to non-existant repo
        gateway = @gateways.fetch(klass.gateway)
        ds_proc = klass.dataset_proc || -> _ { self }

        klass.schema.finalize!(gateway) if klass.schema
        dataset = gateway.dataset(klass.dataset).instance_exec(klass, &ds_proc)

        klass.new(dataset, __registry__: registry)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rom-2.0.2 lib/rom/setup/finalize/finalize_relations.rb
rom-2.0.1 lib/rom/setup/finalize/finalize_relations.rb
rom-2.0.0 lib/rom/setup/finalize/finalize_relations.rb