hashlib 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.
Files changed (2) hide show
  1. data/lib/hashlib.rb +59 -35
  2. metadata +2 -2
@@ -13,34 +13,54 @@ class Hash
13
13
  end
14
14
 
15
15
  def get(path, default=nil)
16
- root = self
17
-
18
- begin
19
- path = path.to_s.split('.') unless path.is_a?(Array)
16
+ rv = self
20
17
 
21
- path.each do |key|
22
- key = key.to_s
18
+ # make path an array if not already
19
+ if not path.is_a?(Array)
20
+ path = path.split('.')
21
+ end
23
22
 
24
- if root.is_a?(Array)
25
- rv = nil
23
+ # step through path components...
24
+ path.each_index do |i|
25
+ # hashes: if the current path component is in the hash, set the pointer
26
+ # and move on to the next path component
27
+ # otherwise return default value
28
+ #
29
+ if rv.is_a?(Hash)
30
+ if rv.has_key?(path[i])
31
+ rv = rv[path[i]]
32
+ next
33
+ else
34
+ return default
35
+ end
26
36
 
27
- root.each do |r|
28
- if r.has_key?(key)
29
- rv = r[key]
30
- break
31
- end
37
+ # arrays: flatten into one array, iterate over it. for each element:
38
+ # if it is a hash, recurse into it from the next path component
39
+ # otherwise return it
40
+ # the resulant pointer should be fully populated from this point down
41
+ #
42
+ elsif rv.is_a?(Array)
43
+ rv = (rv.flatten.collect do |j|
44
+ if j.is_a?(Hash)
45
+ j.get(path[(i)..-1], default)
46
+ else
47
+ j
32
48
  end
49
+ end).compact
33
50
 
34
- root = rv
35
- else
36
- root = (root[key] rescue nil)
37
- end
38
- end
51
+ next
39
52
 
40
- return (root.nil? ? default : root)
41
- rescue NoMethodError
42
- return default
53
+ # scalars: if we're still in this loop and trying to look for a path component
54
+ # inside of a scalar value, then that won't exist and we just return default
55
+ else
56
+ return default
57
+ end
43
58
  end
59
+
60
+ return default if rv.nil? or (rv.is_a?(Array) and rv.flatten.compact.empty?)
61
+
62
+ # good job! you made it here!
63
+ return rv
44
64
  end
45
65
 
46
66
  def set(path, value)
@@ -148,23 +168,27 @@ class Array
148
168
  if i.is_a?(Hash)
149
169
  components = group_by
150
170
  components = components.collect{|j| i.get(j) }
151
- path = []
152
- stack = []
153
-
154
- components.compact.each do |c|
155
- if c.is_a?(Array)
156
- path += [stack].product(c.flatten).collect{|i| i.flatten }
157
- stack = []
158
- else
159
- stack << c
171
+ components = [*components.first].product([*components.last])
172
+
173
+ components.each do |component|
174
+ path = []
175
+ stack = []
176
+
177
+ component.compact.each do |c|
178
+ if c.is_a?(Array)
179
+ path += [stack].product(c.flatten).collect{|i| i.flatten }
180
+ stack = []
181
+ else
182
+ stack << c
183
+ end
160
184
  end
161
- end
162
185
 
163
- path = [components] if path.empty?
186
+ path = [component] if path.empty?
164
187
 
165
- path.each do |parts|
166
- parts[-1] = :null if parts[-1].nil?
167
- rv.set(parts, rv.get(parts, 0) + 1)
188
+ path.each do |parts|
189
+ parts[-1] = :null if parts[-1].nil?
190
+ rv.set(parts, rv.get(parts, 0) + 1)
191
+ end
168
192
  end
169
193
  end
170
194
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashlib
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:
@@ -40,7 +40,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
40
40
  version: '0'
41
41
  requirements: []
42
42
  rubyforge_project:
43
- rubygems_version: 1.8.11
43
+ rubygems_version: 1.8.23
44
44
  signing_key:
45
45
  specification_version: 3
46
46
  summary: Useful utility methods for working with Ruby hashes