Project

hash_wia

0.0
A long-lived project that still receives updates
Gem provides simple access to common Ruby hash types bundled in one simple class
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies
 Project Readme

Hash WIA (with indifferent access)

Featrues a few useful Ruby Hash manipulations

  • indifferent access - hash key as symbol or string
  • strict key methods - raise error if accessing not defined key as a method
  • easy struct creation

Polluting a namespace

By default HashWia is polluting ruby Hash object with to_hwia method.

It provides easy access to HashWia hash and struct objects.

Install

To install

gem install hash_wia

To use

# Gemfile
gem 'hash_wia'

# to use
require 'hash_wia'

Indifferent + Mash for defined keys

You can convert any hash to Mash hash by using to_hwia method on a hash.

h = HashWia.new {}
# or if polluted
h = {}.to_hwia

Examples

mash = { foo: { bar: :baz }}.to_hwia
mash[:foo][:bar]   # :baz
mash['foo']['bar'] # :baz
mash.foo.bar       # :baz

mash.foo.bar = 123
mash[:foo].bar     #  123
mash[:foo].not_def #  ArgumentError

# As configuration
Lux.config.google = YAML.load('./config/google.yml')
Lux.config.google.oauth.key  # ok
Lux.config.google.oauth.foo  # ArgumentError

Add new value to a key

mash.foo.test   = 456
mash.foo[:test] = 456
mash.foo.test   # 456

Merge

mash.merge! foo: { 'bar' => :baz }
mash.foo.bar     # baz
mash[:foo][:bar] # baz

It is basicly Rails Hash with indiferent access + key access on method calls.

Assigning a proc

You can assign a proc to a hash like this

ch = {}.to_hwia

ch.proc_test1 = proc { |num| num * 123 }

# or more elegant
ch.proc_test2 do |num|
  num * 123
end

ch.test1.call(2) # 246
ch.test2.call(2) # 246

Struct from hash

Uses arguments to creates unique Struct, caches base class.

Great for controller class instance variables and other options.

h = {}.to_hwia :foo
h.foo       # nil
h.foo = 123 # ok
h.bar       # NoMethodError
h.foo       # 123

Examples

# From array
opt = { foo: 1 }.to_hwia :foo, :bar
opt.bar = 2

# allows set on second level
opt.foo = { bar: :baz }
opt.foo[:bar] # :baz

# From Hash
opt = {foo: nil, bar: 2}.to_hwia [:foo, :bar, :baz]
opt.foo      # 1
opt.bar      # 2
opt.baz      # nil
opt.booz     # NoMethodError

Set named options

Easy way to set up option constants in your APP, in a proteced namespace without class polution, frozen.

Constant points to keyword and keyword points to a name.

class Task
  # to create Task::STATUS and Task.status (default)
  STATUS = HashWia self, method: :status do |opt|
    opt.QUED    q: 'Qued'
    opt.RUNNING r: 'Running'
    opt.DONE    d: 'Done'
    opt.FAILED  e: 'Failed'
    opt.DEAD    x: 'Dead'
    # or use numbers
    opt.ACTIVE  1 => 'Task is active'
  end
end

# Enables following access
# Task::STATUS.FOO  # NoMethodError for not defined constants
#
# Task::STATUS.DONE # :d
#
# Task.status.DONE # :d
# Task.status.d    # 'Done'
# Task.status[:d]  # 'Done'
# Task.status['d'] # 'Done'
#
# Task.status.ACTIVE # 1
# Task.status[1]     # 'Task is active'

You can create a constant for every key as well

class Foo
  STATUS = HashWia self, constants: :status, method: :status do |opt|
    opt.INACTIVE 0 => 'Inactive object'
    opt.ACTIVE   1 => 'Active object'
    opt.DEAD     2 => 'Dead object'
  end
end

# would generate
# Foo::STATUS[1]       # => 'Active object'
# Foo::STATUS.ACTIVE   # 1
# Foo::STATUS_INACTIVE # 0
# Foo::STATUS_ACTIVE   # 1
# Foo::STATUS_DEAD     # 2

Dependencies

None.

Development

After checking out the repo, run bundle install to install dependencies. Then, run rspec to run the tests.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/dux/hash_hwia. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.