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?
config.foo
config.foo.bar?
config.foo.bar
config.foo.bar = 'bar'
config.foo.bar
config.foo.baz = 'baz'
config.foo.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
config.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
config.to_h.key
Missing keys won't raise an exception but instead behave like Hash access:
config = Hashr.new
config.foo?
config.foo
Defaults
Defaults can be defined per class:
class Config < Hashr
default boxes: { memory: '1024' }
end
config = Config.new
config.boxes.memory
Or passed to the instance:
data = {}
defaults = { boxes: { memory: '1024' } }
config = Hashr.new(data, defaults)
config.boxes.memory
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
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