recursive-open-struct 0.2.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document CHANGED
File without changes
data/.rspec CHANGED
File without changes
data/Gemfile CHANGED
@@ -10,5 +10,6 @@ group :development do
10
10
  gem 'rspec' #, "~> 2.3.0"
11
11
  gem 'bundler' #, "~> 1.0.0"
12
12
  gem 'jeweler' #, "~> 1.6.0"
13
- gem 'rcov' #, ">= 0"
13
+ gem 'rcov' if RUBY_VERSION =~ /^1\.8/
14
+ gem 'rdoc'
14
15
  end
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.2)
4
+ diff-lcs (1.1.3)
5
5
  git (1.2.5)
6
- jeweler (1.6.0)
7
- bundler (~> 1.0.0)
6
+ jeweler (1.8.4)
7
+ bundler (~> 1.0)
8
8
  git (>= 1.2.5)
9
9
  rake
10
- rake (0.9.0)
11
- rcov (0.9.9)
12
- rspec (2.6.0)
13
- rspec-core (~> 2.6.0)
14
- rspec-expectations (~> 2.6.0)
15
- rspec-mocks (~> 2.6.0)
16
- rspec-core (2.6.2)
17
- rspec-expectations (2.6.0)
18
- diff-lcs (~> 1.1.2)
19
- rspec-mocks (2.6.0)
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
- rcov
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
- RecursiveOpenStruct is a extension of OpenStruct.
4
- It enhance OpenStruct in that it allows nested hashes to be treated in a recursive
5
- fashion. For example:
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
- Also, if needed, nested hashes can still be accessed as hashes :
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
- Isn't that easy ? (Special thanks to the jeweler tool)
36
+ gem install recursive-open-struct
25
37
 
26
38
  == Note on Patches/Pull Requests
27
39
 
data/Rakefile CHANGED
@@ -49,7 +49,7 @@ end
49
49
 
50
50
  task :default => :spec
51
51
 
52
- require 'rake/rdoctask'
52
+ require 'rdoc/task'
53
53
  Rake::RDocTask.new do |rdoc|
54
54
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
55
55
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
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) ? RecursiveOpenStruct.new(v) : v
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 = %q{recursive-open-struct}
8
- s.version = "0.2.1"
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 = [%q{William (B.J.) Snow Orvis}]
12
- s.date = %q{2011-05-31}
13
- s.description = %q{RecursiveOpenStruct is a subclass of OpenStruct. It differs from
14
- OpenStruct in that it allows nested hashes to be treated in a recursive
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 = %q{http://github.com/aetherknight/recursive-open-struct}
44
- s.licenses = [%q{MIT}]
45
- s.require_paths = [%q{lib}]
46
- s.rubygems_version = %q{1.8.3}
47
- s.summary = %q{OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs}
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<rcov>, [">= 0"])
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<rcov>, [">= 0"])
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<rcov>, [">= 0"])
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
- @ros.debug_inspect
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.2.1
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: 2011-05-31 00:00:00.000000000Z
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: &73346940 !ruby/object:Gem::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: *73346940
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: &73346640 !ruby/object:Gem::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: *73346640
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: &73346350 !ruby/object:Gem::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: *73346350
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: rcov
49
- requirement: &73346110 !ruby/object:Gem::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: *73346110
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: 764807215
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.3
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