Skip to content

Commit

Permalink
Consolidate adapter_config and adapters through AdapterRegistry - exp…
Browse files Browse the repository at this point in the history
…erimental
  • Loading branch information
Trung Lê committed Aug 13, 2014
1 parent 549ac30 commit ce3b2c7
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 23 deletions.
1 change: 0 additions & 1 deletion lib/lotus/model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
require 'lotus/repository'
require 'lotus/model/mapper'
require 'lotus/model/configuration'
require 'lotus/model/config/adapter'

module Lotus
# Model
Expand Down
32 changes: 32 additions & 0 deletions lib/lotus/model/adapter_registry.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require 'lotus/model/config/adapter'

module Lotus
module Model
class AdapterRegistry

attr_reader :adapter_configs, :adapters

def initialize
reset!
end

def register(name, uri, default = false)
adapter = Lotus::Model::Config::Adapter.new(name, uri)
adapter_configs[name] = adapter
adapter_configs.default = adapter if default
end

def build(mapper)
adapter_configs.each do |name, config|
@adapters[name] = config.__send__(:build, mapper)
end
end

def reset!
@adapter_configs = {}
@adapters = {}
end

end
end
end
29 changes: 18 additions & 11 deletions lib/lotus/model/configuration.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'lotus/model/adapter_registry'

module Lotus
module Model
# Configuration for the framework, models and adapters.
Expand All @@ -8,12 +10,18 @@ module Model
# @since x.x.x
class Configuration

# @attr_reader adapters [Hash] a hash of Lotus::Model::Config::Adapter
include Utils::ClassAttribute

class_attribute :adapter_registry
self.adapter_registry = Lotus::Model::AdapterRegistry.new

# A hash of adapter instances
#
# @since x.x.x
# @api private
attr_reader :adapter_configs
attr_reader :adapters
def adapters
adapter_registry.adapters
end

# @attr_reader mapper [Lotus::Model::Mapper] the persistence mapper
#
Expand All @@ -31,13 +39,16 @@ def initialize
reset!
end

def adapter_registry
self.class.adapter_registry
end

# Reset all the values to the defaults
#
# @since x.x.x
# @api private
def reset!
@adapter_configs = {}
@adapters = {}
adapter_registry.reset!
@mapper = nil
end

Expand All @@ -48,9 +59,7 @@ def reset!
# @since x.x.x
# @api private
def load!
adapter_configs.each do |name, config|
@adapters[name] = config.__send__(:build, mapper)
end
adapter_registry.build(mapper)
end

# Register adapter
Expand Down Expand Up @@ -85,9 +94,7 @@ def load!
#
# Lotus::Model.adapters.fetch(:sql)
def adapter(name, uri = nil, default: false)
adapter = Lotus::Model::Config::Adapter.new(name, uri)
adapter_configs[name] = adapter
adapter_configs.default = adapter if default
adapter_registry.register(name, uri, default)
end

# Set global persistence mapper
Expand Down
18 changes: 9 additions & 9 deletions test/model/configuration_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,26 @@
end

it 'allows to register adapter configuration' do
configuration.adapter(:sql, 'postgres://localhost/database')
configuration.adapter(:sql, SQLITE_CONNECTION_STRING)

adapter_config = configuration.adapter_configs.fetch(:sql)
adapter_config = configuration.adapter_registry.adapter_configs.fetch(:sql)
adapter_config.must_be_instance_of Lotus::Model::Config::Adapter
adapter_config.uri.must_equal 'postgres://localhost/database'
adapter_config.uri.must_equal SQLITE_CONNECTION_STRING
end

it 'allows to register default adapter' do
configuration.adapter(:sql, 'postgres://localhost/database', default: true)
configuration.adapter(:sql, SQLITE_CONNECTION_STRING, default: true)

default_adapter_config = configuration.adapter_configs.default
default_adapter_config = configuration.adapter_registry.adapter_configs.default
default_adapter_config.must_be_instance_of Lotus::Model::Config::Adapter
default_adapter_config.uri.must_equal 'postgres://localhost/database'
default_adapter_config.uri.must_equal SQLITE_CONNECTION_STRING
end

it 'eliminates duplications' do
configuration.adapter(:sql, 'postgres://localhost/database')
configuration.adapter(:sql, 'postgres://localhost/database')
configuration.adapter(:sql, SQLITE_CONNECTION_STRING)
configuration.adapter(:sql, SQLITE_CONNECTION_STRING)

configuration.adapter_configs.size.must_equal(1)
configuration.adapter_registry.adapter_configs.select { |name, config| name == :sql }.size.must_equal(1)
end
end

Expand Down
4 changes: 2 additions & 2 deletions test/model_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
end

it 'allows to register SQL adapter configuration' do
adapter = Lotus::Model.configuration.adapter_configs.fetch(:sql)
adapter = Lotus::Model.configuration.adapter_registry.adapter_configs.fetch(:sql)
adapter.uri.must_equal('postgres://localhost/database')

Lotus::Model.configuration.adapter_configs.default.must_equal adapter
Lotus::Model.configuration.adapter_registry.adapter_configs.default.must_equal adapter
end
end

Expand Down

0 comments on commit ce3b2c7

Please sign in to comment.