From ea42d5636c837870ac33f9859333114a55ea0ee8 Mon Sep 17 00:00:00 2001 From: Mike Perham Date: Mon, 21 Oct 2013 12:07:18 -0700 Subject: [PATCH] Allow dynamic sidekiq-web locale paths, for localized extensions, fixes #1261 --- Changes.md | 7 +++---- lib/sidekiq/core_ext.rb | 17 +++++++++++++++++ lib/sidekiq/web.rb | 2 +- lib/sidekiq/web_helpers.rb | 9 +++++++-- test/fixtures/en.yml | 2 ++ test/test_web.rb | 16 ++++++++++++++++ web/locales/en.yml | 1 - 7 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 test/fixtures/en.yml diff --git a/Changes.md b/Changes.md index b505c928..92c42c9d 100644 --- a/Changes.md +++ b/Changes.md @@ -1,10 +1,9 @@ -HEAD ------------ -- Capistrano version 3 support [#1254, phallstrom] - 2.16.0 ----------- +- Allow sidekiq-web extensions to add locale paths so extensions + can be localized. [#1261, ondrejbartas] +- Capistrano 3 support [#1254, phallstrom] - Use Ruby's `resolv-replace` to enable pure Ruby DNS lookups. This ensures that any DNS resolution that takes place in worker threads won't lock up the entire VM on MRI. [#1258] diff --git a/lib/sidekiq/core_ext.rb b/lib/sidekiq/core_ext.rb index cc4b0ed7..932cfc9a 100644 --- a/lib/sidekiq/core_ext.rb +++ b/lib/sidekiq/core_ext.rb @@ -53,6 +53,7 @@ end begin require 'active_support/core_ext/hash/keys' + require 'active_support/core_ext/hash/deep_merge' rescue LoadError class Hash def stringify_keys @@ -68,6 +69,22 @@ rescue LoadError end self end if !{}.respond_to?(:symbolize_keys) + + def deep_merge(other_hash, &block) + dup.deep_merge!(other_hash, &block) + end if !{}.respond_to?(:deep_merge) + + def deep_merge!(other_hash, &block) + other_hash.each_pair do |k,v| + tv = self[k] + if tv.is_a?(Hash) && v.is_a?(Hash) + self[k] = tv.deep_merge(v, &block) + else + self[k] = block && tv ? block.call(k, tv, v) : v + end + end + self + end if !{}.respond_to?(:deep_merge!) end end diff --git a/lib/sidekiq/web.rb b/lib/sidekiq/web.rb index 8bd07339..e69d34e7 100644 --- a/lib/sidekiq/web.rb +++ b/lib/sidekiq/web.rb @@ -14,7 +14,7 @@ module Sidekiq set :root, File.expand_path(File.dirname(__FILE__) + "/../../web") set :public_folder, Proc.new { "#{root}/assets" } set :views, Proc.new { "#{root}/views" } - set :locales, Proc.new { "#{root}/locales" } + set :locales, ["#{root}/locales"] helpers WebHelpers diff --git a/lib/sidekiq/web_helpers.rb b/lib/sidekiq/web_helpers.rb index 2054d1cc..02cc1c00 100644 --- a/lib/sidekiq/web_helpers.rb +++ b/lib/sidekiq/web_helpers.rb @@ -5,8 +5,13 @@ module Sidekiq module WebHelpers def strings @@strings ||= begin - Dir["#{settings.locales}/*.yml"].inject({}) do |memo, file| - memo.merge(YAML.load(File.open(file))) + # Allow sidekiq-web extensions to add locale paths + # so extensions can be localized + settings.locales.each_with_object({}) do |path,global| + Dir["#{path}/*.yml"].each_with_object(global) do |file,hash| + strs = YAML.load(File.open(file)) + hash.deep_merge!(strs) + end end end end diff --git a/test/fixtures/en.yml b/test/fixtures/en.yml new file mode 100644 index 00000000..26500216 --- /dev/null +++ b/test/fixtures/en.yml @@ -0,0 +1,2 @@ +en: + translated_text: 'Changed text from add locals' diff --git a/test/test_web.rb b/test/test_web.rb index 5bf71f98..9ad66857 100644 --- a/test/test_web.rb +++ b/test/test_web.rb @@ -282,6 +282,22 @@ class TestWeb < Sidekiq::Test assert_equal 200, last_response.status end + Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "fixtures") + it 'can show user defined tab with custom locales' do + begin + Sidekiq::Web.tabs['Custom Tab'] = '/custom' + Sidekiq::Web.get('/custom') do + t('translated_text') + end + + get '/custom' + assert_match /Changed text/, last_response.body + + ensure + Sidekiq::Web.tabs.delete 'Custom Tab' + end + end + describe 'stats' do before do Sidekiq.redis do |conn| diff --git a/web/locales/en.yml b/web/locales/en.yml index ead10a8f..81dd2398 100644 --- a/web/locales/en.yml +++ b/web/locales/en.yml @@ -60,5 +60,4 @@ en: # <---- change this to your locale code OneMonth: 1 month ThreeMonths: 3 months SixMonths: 6 months - Batches: Batches Failures: Failures