Provide a uniform api between Simple, KeyValue and Chain stores #109

Open
wants to merge 1 commit into
from
View
@@ -72,6 +72,7 @@ follow the usual test setup and should be easy to grok.
* [Stephan Soller](http://www.arkanis-development.de)
* [Saimon Moore](http://saimonmoore.net)
* [Matt Aimonetti](https://matt.aimonetti.net/)
+* [Francisco Viramontes](https://twitter.com/kidpollo)
## Contributors
@@ -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
@@ -72,6 +81,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
@@ -1,5 +1,6 @@
require 'i18n/backend/base'
require 'active_support/json'
+require 'active_support/core_ext/hash/deep_merge'
module I18n
module Backend
@@ -57,6 +58,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|
@@ -85,6 +90,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])
@@ -81,6 +81,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", :subformats=>{:short=>"short"}}, :plural_1=>{:one=>"%{count}"}, :dates=>{:a=>"A"}
+ }}
+ end
+
protected
def backend(translations)
@@ -40,4 +40,17 @@ def assert_flattens(expected, nested, escape=true, subtree=true)
I18n.t("foo", :raise => 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 I18n::TestCase.key_value?