From 86f99194b0d9bf40dce28c534555cb57d94cbd5d Mon Sep 17 00:00:00 2001 From: Paarth Madan Date: Thu, 9 Dec 2021 10:11:01 -0500 Subject: [PATCH] Return (data, keys_symbolized) array from load_* methods instead --- lib/i18n/backend/base.rb | 35 ++++++++++------------------------- lib/i18n/backend/gettext.rb | 2 +- test/backend/simple_test.rb | 6 +++--- 3 files changed, 14 insertions(+), 29 deletions(-) diff --git a/lib/i18n/backend/base.rb b/lib/i18n/backend/base.rb index c9d377fb..9c6b5b95 100644 --- a/lib/i18n/backend/base.rb +++ b/lib/i18n/backend/base.rb @@ -216,22 +216,6 @@ def deep_interpolate(locale, data, values = EMPTY_HASH) end end - class LocaleDataDecorator < SimpleDelegator - def initialize(*) - super - @names_symbolized = false - end - - def mark_keys_as_symbolized! - @names_symbolized = true - self - end - - def keys_symbolized? - @names_symbolized - end - end - # Loads a single translations file by delegating to #load_rb or # #load_yml depending on the file extension and directly merges the # data to the existing translations. Raises I18n::UnknownFileType @@ -239,18 +223,18 @@ def keys_symbolized? def load_file(filename) type = File.extname(filename).tr('.', '').downcase raise UnknownFileType.new(type, filename) unless respond_to?(:"load_#{type}", true) - locale_data = send(:"load_#{type}", filename) - unless locale_data.__getobj__.is_a?(Hash) + data, keys_symbolized = send(:"load_#{type}", filename) + unless data.is_a?(Hash) raise InvalidLocaleData.new(filename, 'expects it to return a hash, but does not') end - locale_data.each { |locale, d| store_translations(locale, d || {}, skip_symbolize_keys: locale_data.keys_symbolized?) } + data.each { |locale, d| store_translations(locale, d || {}, skip_symbolize_keys: keys_symbolized) } end # Loads a plain Ruby translations file. eval'ing the file must yield # a Hash containing translation data with locales as toplevel keys. def load_rb(filename) translations = eval(IO.read(filename), binding, filename) - LocaleDataDecorator.new(translations) + [translations, false] end # Loads a YAML translations file. The data must have locales as @@ -258,9 +242,9 @@ def load_rb(filename) def load_yml(filename) begin if YAML.respond_to?(:unsafe_load_file) # Psych 4.0 way - LocaleDataDecorator.new(YAML.unsafe_load_file(filename)) + [YAML.unsafe_load_file(filename), false] else - LocaleDataDecorator.new(YAML.load_file(filename)) + [YAML.load_file(filename), false] end rescue TypeError, ScriptError, StandardError => e raise InvalidLocaleData.new(filename, e.inspect) @@ -272,9 +256,10 @@ def load_yml(filename) # toplevel keys. def load_json(filename) begin - LocaleDataDecorator.new( - ::JSON.parse(File.read(filename), symbolize_names: true, freeze: true), - ).mark_keys_as_symbolized! + [ + ::JSON.parse(File.read(filename), symbolize_names: true, freeze: true), + true, + ] rescue TypeError, StandardError => e raise InvalidLocaleData.new(filename, e.inspect) end diff --git a/lib/i18n/backend/gettext.rb b/lib/i18n/backend/gettext.rb index 61b193c4..10f0e1d2 100644 --- a/lib/i18n/backend/gettext.rb +++ b/lib/i18n/backend/gettext.rb @@ -43,7 +43,7 @@ def set_comment(msgid_or_sym, comment) def load_po(filename) locale = ::File.basename(filename, '.po').to_sym data = normalize(locale, parse(filename)) - Backend::Base::LocaleDataDecorator.new({ locale => data }) + [{ locale => data }, false] end def parse(filename) diff --git a/test/backend/simple_test.rb b/test/backend/simple_test.rb index 32fc1ea5..09eae0dd 100644 --- a/test/backend/simple_test.rb +++ b/test/backend/simple_test.rb @@ -66,17 +66,17 @@ def setup end test "simple load_rb: loads data from a Ruby file" do - data = I18n.backend.send(:load_rb, "#{locales_dir}/en.rb") + data, _ = I18n.backend.send(:load_rb, "#{locales_dir}/en.rb") assert_equal({ :en => { :fuh => { :bah => 'bas' } } }, data) end test "simple load_yml: loads data from a YAML file" do - data = I18n.backend.send(:load_yml, "#{locales_dir}/en.yml") + data, _ = I18n.backend.send(:load_yml, "#{locales_dir}/en.yml") assert_equal({ 'en' => { 'foo' => { 'bar' => 'baz' } } }, data) end test "simple load_json: loads data from a JSON file" do - data = I18n.backend.send(:load_json, "#{locales_dir}/en.json") + data, _ = I18n.backend.send(:load_json, "#{locales_dir}/en.json") assert_equal({ :en => { :foo => { :bar => 'baz' } } }, data) end