recursive-open-struct 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +0 -0
- data/.rspec +0 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +17 -14
- data/LICENSE.txt +0 -0
- data/README.rdoc +20 -8
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/recursive-open-struct.rb +1 -0
- data/lib/recursive_open_struct.rb +31 -20
- data/recursive-open-struct.gemspec +15 -24
- data/spec/recursive_open_struct_spec.rb +101 -20
- data/spec/spec_helper.rb +0 -0
- metadata +34 -13
data/.document
CHANGED
File without changes
|
data/.rspec
CHANGED
File without changes
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,22 +1,25 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
diff-lcs (1.1.
|
4
|
+
diff-lcs (1.1.3)
|
5
5
|
git (1.2.5)
|
6
|
-
jeweler (1.
|
7
|
-
bundler (~> 1.0
|
6
|
+
jeweler (1.8.4)
|
7
|
+
bundler (~> 1.0)
|
8
8
|
git (>= 1.2.5)
|
9
9
|
rake
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
rspec-
|
10
|
+
rdoc
|
11
|
+
json (1.7.5)
|
12
|
+
rake (0.9.2.2)
|
13
|
+
rdoc (3.12)
|
14
|
+
json (~> 1.4)
|
15
|
+
rspec (2.11.0)
|
16
|
+
rspec-core (~> 2.11.0)
|
17
|
+
rspec-expectations (~> 2.11.0)
|
18
|
+
rspec-mocks (~> 2.11.0)
|
19
|
+
rspec-core (2.11.1)
|
20
|
+
rspec-expectations (2.11.3)
|
21
|
+
diff-lcs (~> 1.1.3)
|
22
|
+
rspec-mocks (2.11.3)
|
20
23
|
|
21
24
|
PLATFORMS
|
22
25
|
ruby
|
@@ -24,5 +27,5 @@ PLATFORMS
|
|
24
27
|
DEPENDENCIES
|
25
28
|
bundler
|
26
29
|
jeweler
|
27
|
-
|
30
|
+
rdoc
|
28
31
|
rspec
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.rdoc
CHANGED
@@ -1,27 +1,39 @@
|
|
1
1
|
= recursive-open-struct
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
OpenStruct subclass that returns nested hash attributes as
|
4
|
+
RecursiveOpenStructs.
|
5
|
+
|
6
|
+
It allows for hashes within hashes to be called in a chain of methods:
|
7
|
+
|
6
8
|
ros = RecursiveOpenStruct.new( { :fooa => { :foob => 'fooc' } } )
|
7
|
-
can now be accessed this way :
|
8
|
-
ros.fooa.foob # 'fooc'
|
9
9
|
|
10
|
-
|
10
|
+
ros.fooa.foob # => 'fooc'
|
11
|
+
|
12
|
+
Also, if needed, nested hashes can still be accessed as hashes:
|
11
13
|
|
12
14
|
ros.fooa_as_a_hash # { :foob => 'fooc' }
|
13
15
|
|
16
|
+
RecursiveOpenStruct can also optionally recurse across arrays, although you
|
17
|
+
have to explicitly enable it:
|
18
|
+
|
19
|
+
h = { :somearr => [ { :name => 'a'}, { :name => 'b' } ] }
|
20
|
+
|
21
|
+
ros = RecursiveOpenStruct.new(h, :recurse_over_arrays => true )
|
22
|
+
|
23
|
+
ros.somarr[0].name # => 'a'
|
24
|
+
ros.somarr[1].name # => 'b'
|
25
|
+
|
14
26
|
== Installation
|
15
27
|
|
16
28
|
Available as a gem in rubygems, the default gem repository.
|
17
29
|
|
18
30
|
If you use bundler, just throw that in your gemfile :
|
31
|
+
|
19
32
|
gem 'recursive-open-struct'
|
20
33
|
|
21
34
|
You may also install the gem manually :
|
22
|
-
gem install recursive-open-struct
|
23
35
|
|
24
|
-
|
36
|
+
gem install recursive-open-struct
|
25
37
|
|
26
38
|
== Note on Patches/Pull Requests
|
27
39
|
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.1
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'recursive_open_struct'
|
@@ -1,55 +1,66 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
|
3
3
|
class RecursiveOpenStruct < OpenStruct
|
4
|
-
|
4
|
+
|
5
|
+
def initialize(h=nil, args={})
|
6
|
+
@recurse_over_arrays = args.fetch(:recurse_over_arrays,false)
|
7
|
+
super(h)
|
8
|
+
end
|
9
|
+
|
5
10
|
def new_ostruct_member(name)
|
6
11
|
name = name.to_sym
|
7
12
|
unless self.respond_to?(name)
|
8
13
|
class << self; self; end.class_eval do
|
9
|
-
define_method(name)
|
14
|
+
define_method(name) do
|
10
15
|
v = @table[name]
|
11
|
-
v.is_a?(Hash)
|
12
|
-
|
16
|
+
if v.is_a?(Hash)
|
17
|
+
RecursiveOpenStruct.new(v)
|
18
|
+
elsif v.is_a?(Array) and @recurse_over_arrays
|
19
|
+
v.map { |a| (a.is_a? Hash) ? RecursiveOpenStruct.new(a, :recurse_over_arrays => true) : a }
|
20
|
+
else
|
21
|
+
v
|
22
|
+
end
|
23
|
+
end
|
13
24
|
define_method("#{name}=") { |x| modifiable[name] = x }
|
14
25
|
define_method("#{name}_as_a_hash") { @table[name] }
|
15
26
|
end
|
16
27
|
end
|
17
28
|
name
|
18
29
|
end
|
19
|
-
|
20
|
-
def debug_inspect(indent_level = 0, recursion_limit = 12)
|
21
|
-
display_recursive_open_struct(@table, indent_level, recursion_limit)
|
30
|
+
|
31
|
+
def debug_inspect(io = STDOUT, indent_level = 0, recursion_limit = 12)
|
32
|
+
display_recursive_open_struct(io, @table, indent_level, recursion_limit)
|
22
33
|
end
|
23
|
-
|
24
|
-
def display_recursive_open_struct(ostrct_or_hash, indent_level, recursion_limit)
|
25
|
-
|
34
|
+
|
35
|
+
def display_recursive_open_struct(io, ostrct_or_hash, indent_level, recursion_limit)
|
36
|
+
|
26
37
|
if recursion_limit <= 0 then
|
27
38
|
# protection against recursive structure (like in the tests)
|
28
|
-
puts ' '*indent_level + '(recursion limit reached)'
|
39
|
+
io.puts ' '*indent_level + '(recursion limit reached)'
|
29
40
|
else
|
30
41
|
#puts ostrct_or_hash.inspect
|
31
42
|
if ostrct_or_hash.is_a?(RecursiveOpenStruct) then
|
32
43
|
ostrct_or_hash = ostrct_or_hash.marshal_dump
|
33
44
|
end
|
34
|
-
|
45
|
+
|
35
46
|
# We'll display the key values like this : key = value
|
36
47
|
# to align display, we look for the maximum key length of the data that will be displayed
|
37
48
|
# (everything except hashes)
|
38
|
-
data_indent = ostrct_or_hash
|
39
|
-
.reject { |k, v| v.is_a?(RecursiveOpenStruct) || v.is_a?(Hash) }
|
40
|
-
.max {|a,b| a[0].to_s.length <=> b[0].to_s.length}[0].length
|
49
|
+
data_indent = ostrct_or_hash \
|
50
|
+
.reject { |k, v| v.is_a?(RecursiveOpenStruct) || v.is_a?(Hash) } \
|
51
|
+
.max {|a,b| a[0].to_s.length <=> b[0].to_s.length}[0].to_s.length
|
41
52
|
# puts "max length = #{data_indent}"
|
42
|
-
|
53
|
+
|
43
54
|
ostrct_or_hash.each do |key, value|
|
44
55
|
if (value.is_a?(RecursiveOpenStruct) || value.is_a?(Hash)) then
|
45
|
-
puts ' '*indent_level + key.to_s + '.'
|
46
|
-
display_recursive_open_struct(value, indent_level + 1, recursion_limit - 1)
|
56
|
+
io.puts ' '*indent_level + key.to_s + '.'
|
57
|
+
display_recursive_open_struct(io, value, indent_level + 1, recursion_limit - 1)
|
47
58
|
else
|
48
|
-
puts ' '*indent_level + key.to_s + ' '*(data_indent - key.to_s.length) + ' = ' + value.inspect
|
59
|
+
io.puts ' '*indent_level + key.to_s + ' '*(data_indent - key.to_s.length) + ' = ' + value.inspect
|
49
60
|
end
|
50
61
|
end
|
51
62
|
end
|
52
|
-
|
63
|
+
|
53
64
|
true
|
54
65
|
end
|
55
66
|
|
@@ -4,24 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "recursive-open-struct"
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
|
15
|
-
fashion. For example:
|
16
|
-
|
17
|
-
ros = RecursiveOpenStruct.new({ :a => { :b => 'c' } })
|
18
|
-
ros.a.b # 'c'
|
19
|
-
|
20
|
-
Also, nested hashes can still be accessed as hashes:
|
21
|
-
|
22
|
-
ros.a_as_a_hash # { :b => 'c' }
|
23
|
-
}
|
24
|
-
s.email = %q{aetherknight@gmail.com}
|
11
|
+
s.authors = ["William (B.J.) Snow Orvis"]
|
12
|
+
s.date = "2013-01-05"
|
13
|
+
s.description = "RecursiveOpenStruct is a subclass of OpenStruct. It differs from\nOpenStruct in that it allows nested hashes to be treated in a recursive\nfashion. For example:\n\n ros = RecursiveOpenStruct.new({ :a => { :b => 'c' } })\n ros.a.b # 'c'\n\nAlso, nested hashes can still be accessed as hashes:\n\n ros.a_as_a_hash # { :b => 'c' }\n"
|
14
|
+
s.email = "aetherknight@gmail.com"
|
25
15
|
s.extra_rdoc_files = [
|
26
16
|
"LICENSE.txt",
|
27
17
|
"README.rdoc"
|
@@ -35,16 +25,17 @@ Also, nested hashes can still be accessed as hashes:
|
|
35
25
|
"README.rdoc",
|
36
26
|
"Rakefile",
|
37
27
|
"VERSION",
|
28
|
+
"lib/recursive-open-struct.rb",
|
38
29
|
"lib/recursive_open_struct.rb",
|
39
30
|
"recursive-open-struct.gemspec",
|
40
31
|
"spec/recursive_open_struct_spec.rb",
|
41
32
|
"spec/spec_helper.rb"
|
42
33
|
]
|
43
|
-
s.homepage =
|
44
|
-
s.licenses = [
|
45
|
-
s.require_paths = [
|
46
|
-
s.rubygems_version =
|
47
|
-
s.summary =
|
34
|
+
s.homepage = "http://github.com/aetherknight/recursive-open-struct"
|
35
|
+
s.licenses = ["MIT"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = "1.8.24"
|
38
|
+
s.summary = "OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs"
|
48
39
|
|
49
40
|
if s.respond_to? :specification_version then
|
50
41
|
s.specification_version = 3
|
@@ -53,18 +44,18 @@ Also, nested hashes can still be accessed as hashes:
|
|
53
44
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
54
45
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
55
46
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
56
|
-
s.add_development_dependency(%q<
|
47
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
57
48
|
else
|
58
49
|
s.add_dependency(%q<rspec>, [">= 0"])
|
59
50
|
s.add_dependency(%q<bundler>, [">= 0"])
|
60
51
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
61
|
-
s.add_dependency(%q<
|
52
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
62
53
|
end
|
63
54
|
else
|
64
55
|
s.add_dependency(%q<rspec>, [">= 0"])
|
65
56
|
s.add_dependency(%q<bundler>, [">= 0"])
|
66
57
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
67
|
-
s.add_dependency(%q<
|
58
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
68
59
|
end
|
69
60
|
end
|
70
61
|
|
@@ -2,46 +2,46 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
require 'recursive_open_struct'
|
3
3
|
|
4
4
|
describe RecursiveOpenStruct do
|
5
|
-
|
5
|
+
|
6
6
|
describe "behavior it inherits from OpenStruct" do
|
7
|
-
|
7
|
+
|
8
8
|
it "can represent arbitrary data objects" do
|
9
9
|
ros = RecursiveOpenStruct.new
|
10
10
|
ros.blah = "John Smith"
|
11
11
|
ros.blah.should == "John Smith"
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "can be created from a hash" do
|
15
15
|
h = { :asdf => 'John Smith' }
|
16
16
|
ros = RecursiveOpenStruct.new(h)
|
17
17
|
ros.asdf.should == "John Smith"
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "can modify an existing key" do
|
21
21
|
h = { :blah => 'John Smith' }
|
22
22
|
ros = RecursiveOpenStruct.new(h)
|
23
23
|
ros.blah = "George Washington"
|
24
24
|
ros.blah.should == "George Washington"
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
describe "handling of arbitrary attributes" do
|
28
28
|
before(:each) do
|
29
29
|
@ros = RecursiveOpenStruct.new
|
30
30
|
@ros.blah = "John Smith"
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
describe "#respond?" do
|
34
34
|
it { @ros.should respond_to :blah }
|
35
35
|
it { @ros.should respond_to :blah= }
|
36
36
|
it { @ros.should_not respond_to :asdf }
|
37
37
|
it { @ros.should_not respond_to :asdf= }
|
38
38
|
end # describe #respond?
|
39
|
-
|
39
|
+
|
40
40
|
describe "#methods" do
|
41
|
-
it { @ros.methods.should include :blah }
|
42
|
-
it { @ros.methods.should include :blah= }
|
43
|
-
it { @ros.methods.should_not include :asdf }
|
44
|
-
it { @ros.methods.should_not include :asdf= }
|
41
|
+
it { @ros.methods.map(&:to_sym).should include :blah }
|
42
|
+
it { @ros.methods.map(&:to_sym).should include :blah= }
|
43
|
+
it { @ros.methods.map(&:to_sym).should_not include :asdf }
|
44
|
+
it { @ros.methods.map(&:to_sym).should_not include :asdf= }
|
45
45
|
end # describe #methods
|
46
46
|
end # describe handling of arbitrary attributes
|
47
47
|
end # describe behavior it inherits from OpenStruct
|
@@ -51,15 +51,15 @@ describe RecursiveOpenStruct do
|
|
51
51
|
h = { :blah => { :another => 'value' } }
|
52
52
|
@ros = RecursiveOpenStruct.new(h)
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
it "returns accessed hashes as RecursiveOpenStructs instead of hashes" do
|
56
56
|
@ros.blah.another.should == 'value'
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
it "uses #key_as_a_hash to return key as a Hash" do
|
60
60
|
@ros.blah_as_a_hash.should == { :another => 'value' }
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
describe "handling loops in the origin Hashes" do
|
64
64
|
before(:each) do
|
65
65
|
h1 = { :a => 'a'}
|
@@ -67,7 +67,7 @@ describe RecursiveOpenStruct do
|
|
67
67
|
h1[:h2] = h2
|
68
68
|
@ros = RecursiveOpenStruct.new(h2)
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
it { @ros.h1.a.should == 'a' }
|
72
72
|
it { @ros.h1.h2.a.should == 'b' }
|
73
73
|
it { @ros.h1.h2.h1.a.should == 'a' }
|
@@ -75,20 +75,101 @@ describe RecursiveOpenStruct do
|
|
75
75
|
it { @ros.h1.should == @ros.h1.h2.h1 }
|
76
76
|
it { @ros.h1.should_not == @ros.h1.h2 }
|
77
77
|
end # describe handling loops in the origin Hashes
|
78
|
+
|
79
|
+
describe 'recursing over arrays' do
|
80
|
+
let(:blah_list) { [ { :foo => '1' }, { :foo => '2' }, 'baz' ] }
|
81
|
+
let(:h) { { :blah => blah_list } }
|
82
|
+
|
83
|
+
context "when recursing over arrays is enabled" do
|
84
|
+
before(:each) do
|
85
|
+
@ros = RecursiveOpenStruct.new(h, :recurse_over_arrays => true)
|
86
|
+
end
|
87
|
+
|
88
|
+
it { @ros.blah.length.should == 3 }
|
89
|
+
it { @ros.blah[0].foo.should == '1' }
|
90
|
+
it { @ros.blah[1].foo.should == '2' }
|
91
|
+
it { @ros.blah_as_a_hash.should == blah_list }
|
92
|
+
it { @ros.blah[2].should == 'baz' }
|
93
|
+
end # when recursing over arrays is enabled
|
94
|
+
|
95
|
+
context "when recursing over arrays is disabled" do
|
96
|
+
before(:each) do
|
97
|
+
@ros = RecursiveOpenStruct.new(h)
|
98
|
+
end
|
99
|
+
|
100
|
+
it { @ros.blah.length.should == 3 }
|
101
|
+
it { @ros.blah[0].should == { :foo => '1' } }
|
102
|
+
it { @ros.blah[0][:foo].should == '1' }
|
103
|
+
end # when recursing over arrays is disabled
|
104
|
+
|
105
|
+
end # recursing over arrays
|
78
106
|
end # recursive behavior
|
79
|
-
|
107
|
+
|
80
108
|
describe "additionnel features" do
|
81
|
-
|
109
|
+
|
82
110
|
before(:each) do
|
83
111
|
h1 = { :a => 'a'}
|
84
112
|
h2 = { :a => 'b', :h1 => h1 }
|
85
113
|
h1[:h2] = h2
|
86
114
|
@ros = RecursiveOpenStruct.new(h2)
|
87
115
|
end
|
88
|
-
|
116
|
+
|
89
117
|
it "should have a simple way of display" do
|
90
|
-
@
|
118
|
+
@output = <<-QUOTE
|
119
|
+
a = "b"
|
120
|
+
h1.
|
121
|
+
a = "a"
|
122
|
+
h2.
|
123
|
+
a = "b"
|
124
|
+
h1.
|
125
|
+
a = "a"
|
126
|
+
h2.
|
127
|
+
a = "b"
|
128
|
+
h1.
|
129
|
+
a = "a"
|
130
|
+
h2.
|
131
|
+
a = "b"
|
132
|
+
h1.
|
133
|
+
a = "a"
|
134
|
+
h2.
|
135
|
+
a = "b"
|
136
|
+
h1.
|
137
|
+
a = "a"
|
138
|
+
h2.
|
139
|
+
a = "b"
|
140
|
+
h1.
|
141
|
+
a = "a"
|
142
|
+
h2.
|
143
|
+
(recursion limit reached)
|
144
|
+
QUOTE
|
145
|
+
@io = StringIO.new
|
146
|
+
@ros.debug_inspect(@io)
|
147
|
+
@io.string.should match /^a = "b"$/
|
148
|
+
@io.string.should match /^h1\.$/
|
149
|
+
@io.string.should match /^ a = "a"$/
|
150
|
+
@io.string.should match /^ h2\.$/
|
151
|
+
@io.string.should match /^ a = "b"$/
|
152
|
+
@io.string.should match /^ h1\.$/
|
153
|
+
@io.string.should match /^ a = "a"$/
|
154
|
+
@io.string.should match /^ h2\.$/
|
155
|
+
@io.string.should match /^ a = "b"$/
|
156
|
+
@io.string.should match /^ h1\.$/
|
157
|
+
@io.string.should match /^ a = "a"$/
|
158
|
+
@io.string.should match /^ h2\.$/
|
159
|
+
@io.string.should match /^ a = "b"$/
|
160
|
+
@io.string.should match /^ h1\.$/
|
161
|
+
@io.string.should match /^ a = "a"$/
|
162
|
+
@io.string.should match /^ h2\.$/
|
163
|
+
@io.string.should match /^ a = "b"$/
|
164
|
+
@io.string.should match /^ h1\.$/
|
165
|
+
@io.string.should match /^ a = "a"$/
|
166
|
+
@io.string.should match /^ h2\.$/
|
167
|
+
@io.string.should match /^ a = "b"$/
|
168
|
+
@io.string.should match /^ h1\.$/
|
169
|
+
@io.string.should match /^ a = "a"$/
|
170
|
+
@io.string.should match /^ h2\.$/
|
171
|
+
@io.string.should match /^ \(recursion limit reached\)$/
|
91
172
|
end
|
92
173
|
end # additionnel features
|
93
|
-
|
174
|
+
|
94
175
|
end # describe RecursiveOpenStruct
|
data/spec/spec_helper.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: recursive-open-struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: bundler
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: jeweler
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement:
|
63
|
+
name: rdoc
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,7 +69,12 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
description: ! "RecursiveOpenStruct is a subclass of OpenStruct. It differs from\nOpenStruct
|
59
79
|
in that it allows nested hashes to be treated in a recursive\nfashion. For example:\n\n
|
60
80
|
\ ros = RecursiveOpenStruct.new({ :a => { :b => 'c' } })\n ros.a.b # 'c'\n\nAlso,
|
@@ -75,6 +95,7 @@ files:
|
|
75
95
|
- README.rdoc
|
76
96
|
- Rakefile
|
77
97
|
- VERSION
|
98
|
+
- lib/recursive-open-struct.rb
|
78
99
|
- lib/recursive_open_struct.rb
|
79
100
|
- recursive-open-struct.gemspec
|
80
101
|
- spec/recursive_open_struct_spec.rb
|
@@ -94,7 +115,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
115
|
version: '0'
|
95
116
|
segments:
|
96
117
|
- 0
|
97
|
-
hash:
|
118
|
+
hash: -2043007964418436897
|
98
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
120
|
none: false
|
100
121
|
requirements:
|
@@ -103,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
124
|
version: '0'
|
104
125
|
requirements: []
|
105
126
|
rubyforge_project:
|
106
|
-
rubygems_version: 1.8.
|
127
|
+
rubygems_version: 1.8.24
|
107
128
|
signing_key:
|
108
129
|
specification_version: 3
|
109
130
|
summary: OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs
|