ruby-i18n/i18n

Frozen hashes in Ruby 3.1

23tux opened this issue · 3 comments

23tux commented

I noticed when upgrading to Ruby 3.1, that this lines causes the loaded hashes to be frozen:

if YAML.respond_to?(:unsafe_load_file) # Psych 4.0 way
[YAML.unsafe_load_file(filename, symbolize_names: true, freeze: true), true]
else

and

if ::JSON.respond_to?(:load_file)
[::JSON.load_file(filename, symbolize_names: true, freeze: true), true]
else

We do some manipulations to the loaded translations like parsing markdown and writing the results back to the translation hashes. This now throws a can't modify frozen Hash error when trying to set a key on that hash.

I wonder why this is? Can someone elaborate why the files are loaded with freeze: true? Is this for performance reasons?

And what would a good way of customize this? For now I can only think of monkey patching the load_yml and load_json method, even if it's very ugly and complicates future gem updates.

Or is there some hook or custom backend or anything like this, that would be better than monkey patching the method?

radar commented

Here's the pull request #587

msxavi commented

#587 didn’t fix YML, did it?

radar commented

That one was just for JSON. Are you seeing issues with YML too? If so, please open a different issue.