From 1edbf5cc90beaefdde5ce8cb4d42cc5732d6b54f Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Fri, 28 May 2021 15:59:04 +0900 Subject: [PATCH] Fix a build error when using Psych 4.0 This PR fixes the following build error when using Psych 4.0. ```console % ruby -v ruby 3.1.0dev (2021-05-17T10:51:51Z master ee611341c9) [x86_64-darwin19] % cd path/to/i18n % bundle exec rake (snip) Finished in 1.310478s, 1265.1872 runs/s, 2004.6121 assertions/s. 1) Error: KeyValueCacheFileTest#test_load_translations_caches_file_through_updated_modification_time: I18n::InvalidLocaleData: can not load translations from /var/folders/6j/5l8q3y250b97529_tcssrwlm0000gn/T/test20210528-81604-ijnu7v.yml: # /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:245:in `rescue in load_yml' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:241:in `load_yml' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:226:in `load_file' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/cache_file.rb:23:in `load_file' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:18:in `block in load_translations' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:18:in `each' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:18:in `load_translations' /Users/koic/src/github.com/ruby-i18n/i18n/test/backend/cache_file_test.rb:49:in `block (2 levels) in ' /Users/koic/.rbenv/versions/3.1.0-dev/lib/ruby/3.1.0/tempfile.rb:317:in `open' /Users/koic/src/github.com/ruby-i18n/i18n/test/backend/cache_file_test.rb:43:in `block in ' 2) Error: SimpleCacheFileTest#test_load_translations_caches_file_through_updated_modification_time: I18n::InvalidLocaleData: can not load translations from /var/folders/6j/5l8q3y250b97529_tcssrwlm0000gn/T/test20210528-81604-9kcvkm.yml: # /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:245:in `rescue in load_yml' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:241:in `load_yml' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:226:in `load_file' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/cache_file.rb:23:in `load_file' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:18:in `block in load_translations' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:18:in `each' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:18:in `load_translations' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/simple.rb:79:in `init_translations' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/simple.rb:89:in `lookup' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n/backend/base.rb:32:in `translate' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n.rb:207:in `block in translate' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n.rb:203:in `catch' /Users/koic/src/github.com/ruby-i18n/i18n/lib/i18n.rb:203:in `translate' /Users/koic/src/github.com/ruby-i18n/i18n/test/backend/cache_file_test.rb:50:in `block (2 levels) in ' /Users/koic/.rbenv/versions/3.1.0-dev/lib/ruby/3.1.0/tempfile.rb:317:in `open' /Users/koic/src/github.com/ruby-i18n/i18n/test/backend/cache_file_test.rb:43:in `block in ' 1658 runs, 2627 assertions, 0 failures, 2 errors, 0 skips rake aborted! ``` This breaking is because an incompatibility with Psych 4.0. - https://github.com/ruby/psych/pull/487 - https://bugs.ruby-lang.org/issues/17866 For example, this PR solves the problem of faker gem that depend on i18n gem. https://github.com/faker-ruby/faker/issues/2330 --- lib/i18n/backend/base.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/i18n/backend/base.rb b/lib/i18n/backend/base.rb index b04a259e..e7b95272 100644 --- a/lib/i18n/backend/base.rb +++ b/lib/i18n/backend/base.rb @@ -240,7 +240,11 @@ def load_rb(filename) # toplevel keys. def load_yml(filename) begin - YAML.load_file(filename) + if YAML.respond_to?(:unsafe_load_file) # Psych 4.0 way + YAML.unsafe_load_file(filename) + else + YAML.load_file(filename) + end rescue TypeError, ScriptError, StandardError => e raise InvalidLocaleData.new(filename, e.inspect) end