Skip to content

Commit

Permalink
wip - provide relation registry via configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
solnic committed Jun 16, 2021
1 parent 2cc38aa commit b3e3674
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 33 deletions.
5 changes: 5 additions & 0 deletions lib/rom/components/core.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ def trigger(event, payload)
notifications.trigger("configuration.#{event}", payload)
end

# @api public
def relations
configuration.relations
end

# @api public
def notifications
configuration.notifications
Expand Down
10 changes: 5 additions & 5 deletions lib/rom/components/relation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def adapter
# @return [ROM::Relation]
#
# @api public
def build(registry:, command_compiler:)
def build(command_compiler:)
unless adapter
raise MissingAdapterIdentifierError,
"Relation class +#{constant}+ is missing the adapter identifier"
Expand All @@ -38,7 +38,7 @@ def build(registry:, command_compiler:)

trigger("relations.class.ready", relation: constant, adapter: adapter)

schema = finalize_schema(registry)
schema = finalize_schema

apply_plugins

Expand All @@ -50,7 +50,7 @@ def build(registry:, command_compiler:)
mappers = finalize_mappers

options = {
__registry__: registry,
__registry__: relations,
mappers: mappers,
schema: schema,
inflector: configuration.inflector,
Expand All @@ -68,11 +68,11 @@ def build(registry:, command_compiler:)
private

# @api private
def finalize_schema(registry)
def finalize_schema
components.schemas
.select { |schema| schema.relation == constant }
.last # TODO: relation DSL auto-defines an empty schema so this is a workaround
.build(registry: registry)
.build
end

# @api private
Expand Down
4 changes: 2 additions & 2 deletions lib/rom/components/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Schema < Core
option :relation, type: Types.Instance(Class)

# @api public
def build(registry:)
def build
plugins = self.plugins

schema = proc.call do |*args|
Expand All @@ -32,7 +32,7 @@ def build(registry:)
adapter: adapter,
gateway: gateway,
relation: relation,
registry: registry
registry: relations
}

trigger("relations.schema.allocated", payload)
Expand Down
7 changes: 7 additions & 0 deletions lib/rom/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
require "rom/setup"
require "rom/configuration_dsl"
require "rom/support/inflector"
require "rom/relation_registry"

module ROM
class Configuration
Expand Down Expand Up @@ -41,6 +42,10 @@ class Configuration
# @return [Notifications] Cache
attr_reader :cache

# @!attribute [r] relations
# @return [ROM::RelationRegistry] relations
attr_reader :relations

def_delegators :@setup, :register_relation, :register_command,
:register_mapper, :register_plugin, :auto_registration,
:inflector, :inflector=, :components, :plugins
Expand All @@ -60,6 +65,8 @@ def initialize(*args, &block)
@notifications = Notifications.event_bus(:configuration)
@cache = Cache.new

@relations = RelationRegistry.build

block&.call(self)
end

Expand Down
48 changes: 22 additions & 26 deletions lib/rom/setup/finalize.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# frozen_string_literal: true

require "rom/relation_registry"
require "rom/command_compiler"
require "rom/container"

Expand Down Expand Up @@ -33,7 +32,7 @@ def initialize(configuration)
#
# @api private
def run!
relations = load_relations
load_relations

container = Container.new(
configuration.gateways,
Expand All @@ -46,40 +45,37 @@ def run!
container
end

# @api private
def relations
configuration.relations
end

private

# Build entire relation registry from all known relation subclasses
#
# This includes both classes created via DSL and explicit definitions
# Add relations to the registry
#
# @api private
def load_relations
relations = RelationRegistry.new do |registry|
command_compiler = CommandCompiler.new(
configuration.gateways,
registry,
Registry.new,
notifications,
inflector: configuration.inflector
)
command_compiler = CommandCompiler.new(
configuration.gateways,
relations,
Registry.new,
notifications,
inflector: configuration.inflector
)

components.relations.each do |component|
relation = component.build(command_compiler: command_compiler)

components.relations.each do |component|
# TODO: registry is passed down to build just because schemas are still built there
# once schemas have their own component, registry won't be needed here
relation = registry.add(
component.key, component.build(registry: registry, command_compiler: command_compiler)
)
relations.add(component.key, relation)

notifications.trigger(
"configuration.relations.object.registered",
relation: relation, registry: registry
)
end
notifications.trigger(
"configuration.relations.object.registered",
relation: relation, registry: relations
)
end

notifications.trigger("configuration.relations.registry.created", registry: relations)

relations
end
end
end

0 comments on commit b3e3674

Please sign in to comment.