document_hash 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
 
20
20
  gem.add_development_dependency "rspec"
21
+ gem.add_development_dependency "debugger"
21
22
  end
@@ -1,5 +1,43 @@
1
1
  module DocumentHash
2
+
3
+ class Nil
4
+ attr_accessor :parent
5
+ def path
6
+ @path ||= []
7
+ end
8
+
9
+ def initialize parent = nil, hash_path = nil
10
+ @parent = parent
11
+ @path = hash_path
12
+ end
13
+
14
+ def nil?
15
+ true
16
+ end
17
+
18
+ def == val
19
+ val == false
20
+ end
21
+
22
+ def method_missing method, *args
23
+ if method =~ /^(.*)=/
24
+ parent.__send__ :create_path, (self.path << $1.to_sym), args.pop
25
+ else
26
+ return self.class.new( self.parent, self.path << method)
27
+ end
28
+ end
29
+ end
30
+
2
31
  class Core < Hash
32
+
33
+ def method_missing method, *args
34
+ if method =~ /^(.*)=$/
35
+ self.__send__(:[]=, method[0..-2], args.pop)
36
+ else
37
+ self.__send__(:[], method) || DocumentHash::Nil.new(self, [method])
38
+ end
39
+ end
40
+
3
41
  def self.[] hash, parent = nil, parent_key = nil
4
42
  super(hash).tap do|new|
5
43
  new.__send__ :parent=, parent if parent
@@ -101,6 +139,19 @@ module DocumentHash
101
139
  @changed ||= ::Set.new
102
140
  end
103
141
 
142
+ def create_path path, value
143
+ curr = self
144
+ path.each_with_index do |key, index|
145
+ unless index == path.size - 1
146
+ curr[key] = self.class.new
147
+ curr = curr[key]
148
+ else
149
+ curr[key] = value
150
+ end
151
+ end
152
+ curr = value
153
+ end
154
+
104
155
  def self.symbolize_keys hash
105
156
  hash.keys.each do |key|
106
157
  hash[(key.to_sym rescue key) || key] = hash.delete(key)
@@ -1,3 +1,3 @@
1
1
  module DocumentHash
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.14"
3
3
  end
@@ -170,4 +170,49 @@ describe DocumentHash::Core do
170
170
  hash = subject.to_hash
171
171
  hash[:test].should be_an_instance_of Hash
172
172
  end
173
+
174
+ it "can access values thru methods" do
175
+ subject = DocumentHash::Core[{ test: "value" }]
176
+ subject.test.should == "value"
177
+ end
178
+
179
+ it "can access values thru methods at deeper levels" do
180
+ subject = DocumentHash::Core[{ test: { inner: "value" } }]
181
+ subject.test.inner.should == "value"
182
+ end
183
+
184
+ it "returns nil for unknown values" do
185
+ subject = DocumentHash::Core[{ test: { inner: "value" } }]
186
+ subject.unknown.should be_nil
187
+ end
188
+
189
+ it "returns nil for unknown values at deeper levels" do
190
+ subject = DocumentHash::Core[{ test: { inner: "value" } }]
191
+ subject.unknown.inner.should be_nil
192
+ end
193
+
194
+ it "assigns a new value if unknown value is received" do
195
+ subject = DocumentHash::Core[{ test: { inner: "value" } }]
196
+ subject.unknown = 'test'
197
+ subject.unknown.should == 'test'
198
+ end
199
+
200
+ it "assigns a new value if unknown value is received at deeper levels" do
201
+ subject = DocumentHash::Core[{ test: { inner: "value" } }]
202
+ subject.unknown.inner = 'test'
203
+ subject.unknown.inner.should == 'test'
204
+ end
205
+
206
+ it "can assign values thru methods" do
207
+ subject = DocumentHash::Core[{ test: "value" }]
208
+ subject.test = "new"
209
+ subject.test.should == "new"
210
+ end
211
+
212
+ it "can assign values thru methods at deeper levels" do
213
+ subject = DocumentHash::Core[{ test: { inner: "value" } }]
214
+ subject.test.inner = "new"
215
+ subject.test.inner.should == "new"
216
+ end
217
+
173
218
  end
@@ -0,0 +1,9 @@
1
+ describe DocumentHash::Nil do
2
+ it "is false" do
3
+ subject.should == false
4
+ end
5
+
6
+ it "is null" do
7
+ subject.should be_nil
8
+ end
9
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: document_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-08 00:00:00.000000000 Z
12
+ date: 2013-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: debugger
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  description: Implements a multi-level nested document, that notifies about changes,
31
47
  and some other related features
32
48
  email:
@@ -49,6 +65,7 @@ files:
49
65
  - lib/document_hash/core.rb
50
66
  - lib/document_hash/version.rb
51
67
  - spec/lib/document_spec.rb
68
+ - spec/lib/nil_spec.rb
52
69
  - spec/spec_helper.rb
53
70
  homepage: ''
54
71
  licenses: []
@@ -76,4 +93,5 @@ specification_version: 3
76
93
  summary: Document Object
77
94
  test_files:
78
95
  - spec/lib/document_spec.rb
96
+ - spec/lib/nil_spec.rb
79
97
  - spec/spec_helper.rb