document_hash 0.0.13 → 0.0.14

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.
@@ -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