Skip to content

OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs

License

Notifications You must be signed in to change notification settings

thorstenhirsch/recursive-open-struct

 
 

Repository files navigation

recursive-open-struct

OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs.

It allows for hashes within hashes to be called in a chain of methods:

ros = RecursiveOpenStruct.new( { fooa: { foob: 'fooc' } } )

ros.fooa.foob # => 'fooc'

Also, if needed, nested hashes can still be accessed as hashes:

ros.fooa_as_a_hash # { foob: 'fooc' }

RecursiveOpenStruct can also optionally recurse across arrays, although you have to explicitly enable it:

h = { :somearr => [ { name: 'a'}, { name: 'b' } ] }
ros = RecursiveOpenStruct.new(h, recurse_over_arrays: true )

ros.somearr[0].name # => 'a'
ros.somearr[1].name # => 'b'

Also, by default it will turn all hash keys into symbols internally:

h = { 'fear' => 'is', 'the' => 'mindkiller' } }
ros = RecursiveOpenStruct.new(h)
ros.to_h # => { fear: 'is', the: 'mindkiller' }

You can preserve the original keys by enabling :preserve_original_keys:

h = { 'fear' => 'is', 'the' => 'mindkiller' } }
ros = RecursiveOpenStruct.new(h, preserve_original_keys: true)
ros.to_h # => { 'fear' => 'is', 'the' => 'mindkiller' }

When subclassing RecursiveOpenStruct the subclass with be used for recursion, so nested elements will also be of subclass. However this means that custom initialize methods are also being invoked for each recursion. You can prevent that by enabling :recursive_ostruct_class:

h = { one: { two: 'three' } } }
s = YourSubclass.new(h, recursive_ostruct_class: true)
s.class.name # => YourSubclass
s.one.class.name # => RecursiveOpenStruct

Installation

Available as a gem in rubygems, the default gem repository.

If you use bundler, just throw that in your gemfile :

gem 'recursive-open-struct'

You may also install the gem manually :

gem install recursive-open-struct

Contributing

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for your new or changed functionality. Make sure the tests you add provide clean and clear explanation of the feature.
  • Send me a pull request. Bonus points for topic branches.

Copyright

Copyright (c) 2009-2016, The Recursive-open-struct developers (given in the file AUTHORS.txt). See LICENSE.txt for details.

About

OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Ruby 100.0%