diff --git a/lib/i18n/backend/base.rb b/lib/i18n/backend/base.rb index 9f9df168..b78a6af1 100644 --- a/lib/i18n/backend/base.rb +++ b/lib/i18n/backend/base.rb @@ -240,7 +240,7 @@ def load_rb(filename) def load_yml(filename) begin if YAML.respond_to?(:unsafe_load_file) # Psych 4.0 way - [YAML.unsafe_load_file(filename), false] + [YAML.unsafe_load_file(filename, symbolize_names: true, freeze: true), true] else [YAML.load_file(filename), false] end @@ -255,7 +255,7 @@ def load_yml(filename) def load_json(filename) begin # Use #load_file as a proxy for a version of JSON where symbolize_names and freeze are supported. - if JSON.respond_to?(:load_file) + if ::JSON.respond_to?(:load_file) [::JSON.load_file(filename, symbolize_names: true, freeze: true), true] else [::JSON.parse(File.read(filename)), false] diff --git a/test/backend/simple_test.rb b/test/backend/simple_test.rb index ce9762dc..23de4864 100644 --- a/test/backend/simple_test.rb +++ b/test/backend/simple_test.rb @@ -92,15 +92,22 @@ def setup test "simple load_yml: loads data from a YAML file" do data, _ = I18n.backend.send(:load_yml, "#{locales_dir}/en.yml") - assert_equal({ 'en' => { 'foo' => { 'bar' => 'baz' } } }, data) + if ::YAML.respond_to?(:unsafe_load_file) + assert_equal({ :en => { :foo => { :bar => 'baz' } } }, data) + assert_predicate data.dig(:en, :foo, :bar), :frozen? + else + assert_equal({ 'en' => { 'foo' => { 'bar' => 'baz' } } }, data) + end end test "simple load_json: loads data from a JSON file" do data, _ = I18n.backend.send(:load_json, "#{locales_dir}/en.json") - assert_equal({ :en => { :foo => { :bar => 'baz' } } }, data) if JSON.respond_to?(:load_file) + assert_equal({ :en => { :foo => { :bar => 'baz' } } }, data) assert_predicate data.dig(:en, :foo, :bar), :frozen? + else + assert_equal({ 'en' => { 'foo' => { 'bar' => 'baz' } } }, data) end end