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 authored and kidpollo committed Nov 24, 2016
1 parent 210feb6 commit 15343c5
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
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 @@ -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
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,5 +1,6 @@
require 'i18n/backend/base'
require 'active_support/json'
require 'active_support/core_ext/hash/deep_merge'

module I18n
module Backend
Expand Down Expand Up @@ -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|
Expand Down Expand Up @@ -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])
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 @@ -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)
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 @@ -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?

0 comments on commit 15343c5

Please sign in to comment.