Skip to content

Commit

Permalink
Provide a uniform api between Simple, KeyValue and Chain stores for p…
Browse files Browse the repository at this point in the history
…ublic and private methods
  • Loading branch information
Paco Viramontes committed Sep 21, 2011
1 parent 541a05f commit 3bc7ac9
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 0 deletions.
22 changes: 22 additions & 0 deletions lib/i18n/backend/chain.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ def initialize(*backends)
self.backends = backends
end

def initialized?
backends.all? do |backend|
backend.instance_eval do
return false unless initialized?
end
end
true
end

def reload!
backends.each { |backend| backend.reload! }
end
Expand Down Expand Up @@ -67,6 +76,19 @@ def localize(locale, object, format = :default, options = {})
end

protected
def init_translations
backends.each { |backend|
backend.send(:init_translations)
}
end

def translations
backends.first.instance_eval do
init_translations unless initialized?
translations
end
end

def namespace_lookup?(result, options)
result.is_a?(Hash) && !options.has_key?(:count)
end
Expand Down
25 changes: 25 additions & 0 deletions lib/i18n/backend/key_value.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require 'i18n/backend/base'
require 'active_support/json'
require 'active_support/ordered_hash' # active_support/json/encoding uses ActiveSupport::OrderedHash but does not require it
require 'active_support/core_ext/hash/deep_merge'

module I18n
module Backend
Expand Down Expand Up @@ -58,6 +59,10 @@ def initialize(store, subtrees=true)
@store, @subtrees = store, subtrees
end

def initialized?
!@store.nil?
end

def store_translations(locale, data, options = {})
escape = options.fetch(:escape, true)
flatten_translations(locale, data, escape, @subtrees).each do |key, value|
Expand Down Expand Up @@ -86,6 +91,26 @@ def available_locales
end

protected

# Queries the translations from the key-value store and converts
# them into a hash such as the one returned from loading the
# haml files
def translations
@translations = @store.keys.clone.map do |main_key|
main_value = ActiveSupport::JSON.decode(@store[main_key])
main_key.to_s.split(".").reverse.inject(main_value) do |value, key|
{key.to_sym => value}
end
end.inject{|hash, elem| hash.deep_merge!(elem)}.deep_symbolize_keys
end

def init_translations
# NO OP
# This call made also inside Simple Backend and accessed by
# other plugins like I18n-js and babilu and
# to use it along with the Chain backend we need to
# provide a uniform API even for protected methods :S
end

def lookup(locale, key, scope = [], options = {})
key = normalize_flat_keys(locale, key, scope, options[:separator])
Expand Down
26 changes: 26 additions & 0 deletions test/backend/chain_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,32 @@ def setup
I18n.backend.store_translations :foo, {:bar => :baz}, {:option => 'persists'}
end

test 'store should call initialize on all backends and return true if all initialized' do
@first.send :init_translations
@second.send :init_translations
assert_equal(I18n.backend.initialized?, true)
end

test 'store should call initialize on all backends and return false if one not initialized' do
@first.reload!
@second.send :init_translations
assert_equal(I18n.backend.initialized?, false)
end

test 'should reload all backends' do
@first.send :init_translations
@second.send :init_translations
I18n.backend.reload!
assert_equal(@first.initialized?, false)
assert_equal(@second.initialized?, false)
end

test 'should be able to get all translations of the first backend' do
assert_equal I18n.backend.send(:translations),{:en => {
:foo => 'Foo', :formats => { :short => 'short' }, :plural_1 => { :one => '%{count}' }
}}
end

protected

def backend(translations)
Expand Down
13 changes: 13 additions & 0 deletions test/backend/key_value_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,17 @@ def assert_flattens(expected, nested, escape=true, subtree=true)
end
end

test 'initialized? checks that a store is available' do
setup_backend!
I18n.backend.reload!
assert_equal I18n.backend.initialized?, true
end

test 'translations gets the translations from the store' do
setup_backend!
I18n.backend.send(:translations)
expected = { :en => {:foo => { :bar => 'bar', :baz => 'baz' }} }
assert_equal expected, translations
end

end if defined?(Rufus::Tokyo::Cabinet)

1 comment on commit 3bc7ac9

@svenfuchs
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kinda like the idea.

I do think though that if we're supporting an api for 3rd party code then we should make it public.

Still pondering the exact api though.

Please sign in to comment.