YamlConvertor
Ruby gem that converts a YAML hash structure to a simple hash consisting of key:value only, and vice versa
a YAML hash structure could look like this:
{"fruit"=> {
"lemon"=>"yellow",
"apple"=>{ "red_apples"=>"red" }
}
}
The resulting simple key:value hash looks like this:
{"fruit.lemon"=>"yellow", "fruit.apple.red_apples"=>"red"}
This works the other way around, too: if you had the simple hash; you can reconstruct the YAML hash structure.
Installation
Add this line to your application's Gemfile:
gem 'yaml_convertor'
And then execute:
$ bundle
Or install it yourself as:
$ gem install yaml_convertor
Usage
There are two methods you can use:
- flattener converts the structured nested YAML hash to a simple key:value
YamlConvertor.flattener(yml_hash)
- builder rebuilds the simple hash to a nested YAML structure
YamlConvertor.builder(flat_hash)
Example
Let's assume we have a YAML file called file.yml:
en:
errors:
messages:
not_locked: "was not locked"
not_saved:
other: "other error"
devise:
failure:
already_authenticated: 'You are already signed in.'
sessions:
signed_in: 'Signed in successfully.'
We open this file using Psych (Ruby's YAML parser), and it will return a nested YAML hash structure
yml_hash = Psych.load_file('file.yml')
yml_hash looks like this:
{"en"=>{
"errors"=>{
"messages"=>{
"not_locked"=>"was not locked",
"not_saved"=>{"other"=>"other error"}
}
},
"devise"=>{
"failure"=>{"already_authenticated"=>"You are already signed in."},
"sessions"=>{"signed_in"=>"Signed in successfully."}}
}
}
Now! If we use flattener:
flat_hash = YamlConvertor.flattener(yml_hash)
flat_hash will look like this:
{
"en.errors.messages.not_locked"=>"was not locked",
"en.errors.messages.not_saved.other"=>"other error",
"en.devise.failure.already_authenticated"=>"You are already signed in.",
"en.devise.sessions.signed_in"=>"Signed in successfully."
}
Example 2
Now let's assume we have a flat hash and we want to rebuild it to a YAML file. Here's our flat_hash from our example above:
flat_hash = {"en.errors.messages.not_locked"=>"was not locked", "en.errors.messages.not_saved.other"=>"other error", "en.devise.failure.already_authenticated"=>"You are already signed in.", "en.devise.sessions.signed_in"=>"Signed in successfully."}
nested_hash = YamlConvertor.builder(flat_hash)
nested_hash is now:
{"en"=>{
"errors"=>{
"messages"=>{
"not_locked"=>"was not locked",
"not_saved"=>{"other"=>"other error"}
}
},
"devise"=>{
"failure"=>{"already_authenticated"=>"You are already signed in."},
"sessions"=>{"signed_in"=>"Signed in successfully."}}
}
}
Dump it with Pysch..
Psych.dump(nested_hash)
The output will be:
---
en:
errors:
messages:
not_locked: was not locked
not_saved:
other: other error
devise:
failure:
already_authenticated: You are already signed in.
sessions:
signed_in: Signed in successfully.
Note
These methods only work properly if you have valid YAML structure. I didn't test that yet but I assume so!
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request