File: README.md

package info (click to toggle)
ruby-recursive-open-struct 2.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 204 kB
  • sloc: ruby: 994; makefile: 6
file content (128 lines) | stat: -rw-r--r-- 3,345 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# recursive-open-struct

OpenStruct subclass that returns nested hash attributes as
RecursiveOpenStructs.


## Usage

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

```ruby
ros = RecursiveOpenStruct.new( { wha: { tagoo: 'siam' } } )

ros.wha.tagoo # => 'siam'
```

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

```ruby
ros.wha_as_a_hash # { tagoo: 'siam' }
```


### Optional: Recurse Over Arrays

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

Default behavior:
```ruby
h = { :somearr => [ { name: 'a'}, { name: 'b' } ] }

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

Enabling `recurse_over_arrays`:

```ruby
ros = RecursiveOpenStruct.new(h, recurse_over_arrays: true )

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


### Optional: Preserve Original Keys

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

```ruby
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`:

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

### Optional: Raise error on missing attribute

This option allows to raise an error if you try to call an attribute you didn't specify in hash

```ruby
h = { 'fear' => 'is', 'the' => 'mindkiller' } }
ros = RecursiveOpenStruct.new(h, raise_on_missing: true)
ros.undefined # => undefined method `undefined' for #<RecursiveOpenStruct fear="is", the="mindkiller">
```

The default behaviour returns nil

```ruby
h = { 'fear' => 'is', 'the' => 'mindkiller' } }
ros = RecursiveOpenStruct.new(h)
ros.undefined # => nil
```

## Installation

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

If you use bundler, just add recursive-open-struct to your gemfile :

```ruby
gem 'recursive-open-struct'
```

You may also install the gem manually:

    gem install recursive-open-struct


## Contributing

If you would like to file or fix a bug, or propose a new feature, please review
[CONTRIBUTING](CONTRIBUTING.md) first.


## Supported Ruby Versions

Recursive-open-struct attempts to support just the versions of Ruby that are
still actively maintained. Once a given major/minor version of Ruby no longer
receives patches, they will no longer be supported (but recursive-open-struct
may still work). I usually update the travis.yml file to reflect this when
preparing for a new release or do some other work on recursive-open-struct.

I also try to update recursive-open-struct to support new features in
OpenStruct itself as new versions of Ruby are released. However, I don't
actively monitor the status of this, so a newer feature might not work. If you
encounter such a feature, please file a bug or a PR to fix it, and I will try
to cut a new release of recursive-open-struct quickly.


## SemVer Compliance

Rescursive-open-struct follows [SemVer
2.0](https://semver.org/spec/v2.0.0.html) for its versioning.


## Copyright

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