Simple Hash extension to make working with nested hashes (e.g. for configuration) easier and less error-prone.
Ruby
Latest commit 64d1115 Oct 31, 2015 @svenfuchs bump to 2.0.0

README.md

Build Status

Hashr

Hashr is a very simple and tiny class which makes using nested hashes for configuration (and other purposes) easier.

It supports the following features:

  • method read and write access
  • automatic predicate (boolean, i.e. ?) methods
  • easy defaults
  • indifferent (strings vs symbols) keys

Usage

Directly use Hashr instances like this:

config = Hashr.new(foo: { bar: 'bar' })

config.foo?     # => true
config.foo      # => { bar: 'bar' }

config.foo.bar? # => true
config.foo.bar  # => 'bar'

config.foo.bar = 'bar'
config.foo.bar # => 'bar'

config.foo.baz = 'baz'
config.foo.baz # => 'baz'

Hash core methods are not available but assume you mean to look up keys with the same name:

config = Hashr.new(count: 1, key: 'key')
config.count # => 1
config.key   # => 'key'

In order to check a hash stored on a certain key you can convert it to a Ruby Hash:

config = Hashr.new(count: 1, key: 'key')
config.to_h.count # => 2
config.to_h.key   # => raises ArgumentError: "wrong number of arguments (0 for 1)"

Missing keys won't raise an exception but instead behave like Hash access:

config = Hashr.new
config.foo? # => false
config.foo  # => nil

Defaults

Defaults can be defined per class:

class Config < Hashr
  default boxes: { memory: '1024' }
end

config = Config.new
config.boxes.memory # => 1024

Or passed to the instance:

data = {}
defaults = { boxes: { memory: '1024' } }

config = Hashr.new(data, defaults)
config.boxes.memory # => 1024

Environment defaults

Hashr includes a simple module that makes it easy to overwrite configuration defaults from environment variables:

class Config < Hashr
  extend Hashr::Env

  self.env_namespace = 'foo'

  default boxes: { memory: '1024' }
end

Now when an environment variable is defined then it will overwrite the default:

ENV['FOO_BOXES_MEMORY'] = '2048'
config = Config.new
config.boxes.memory # => '2048'

Other libraries

You also might want to check out OpenStruct and Hashie.

  • OpenStruct does less but comes as a Ruby standard library.
  • Hashie has a bunch of support classes (like Mash, Dash, Trash) which all support different features that you might need.

License

MIT License