hashlib 0.0.7 → 0.0.8

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 (3) hide show
  1. data/lib/hashlib.rb +55 -0
  2. metadata +8 -6
  3. checksums.yaml +0 -7
data/lib/hashlib.rb CHANGED
@@ -160,4 +160,59 @@ class Hash
160
160
 
161
161
  self
162
162
  end
163
+ end
164
+
165
+ class Array
166
+ def count_distinct(group_by=[])
167
+ rv = {}
168
+
169
+ self.each do |i|
170
+ if i.is_a?(Hash)
171
+ components = group_by
172
+ components = components.collect{|j| i.get(j) }
173
+ path = []
174
+ stack = []
175
+
176
+ components.compact.each do |c|
177
+ if c.is_a?(Array)
178
+ path += [stack].product(c.flatten).collect{|i| i.flatten }
179
+ stack = []
180
+ else
181
+ stack << c
182
+ end
183
+ end
184
+
185
+ path = [components] if path.empty?
186
+
187
+ path.each do |parts|
188
+ parts[-1] = :null if parts[-1].nil?
189
+ rv.set(parts, rv.get(parts, 0) + 1)
190
+ end
191
+ end
192
+ end
193
+
194
+
195
+ sum_children = proc do |sum, key, value|
196
+ if value.is_a?(Hash)
197
+ sum += value.inject(0){|s,(k,v)| sum_children.call(s,k,v) }
198
+ else
199
+ sum += value
200
+ end
201
+
202
+ sum
203
+ end
204
+
205
+ populate = proc do |rv, key, value|
206
+ i = ({
207
+ :id => ((key.empty? or key.nil? or key == 'null') ? nil : key),
208
+ :count => (value.is_a?(Hash) ? value.inject(0){|s,(k,v)| sum_children.call(s,k,v) } : value)
209
+ })
210
+
211
+ i[:children] = value.inject([]){|s,(k,v)| populate.call(s,k,v) } if value.is_a?(Hash)
212
+ rv << i
213
+ rv
214
+ end
215
+
216
+ rv.inject([]){|s,(k,v)| populate.call(s,k,v) }
217
+ end
163
218
  end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashlib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Gary Hetzel
@@ -21,25 +22,26 @@ files:
21
22
  - lib/hashlib.rb
22
23
  homepage: https://github.com/ghetzel/hashlib
23
24
  licenses: []
24
- metadata: {}
25
25
  post_install_message:
26
26
  rdoc_options: []
27
27
  require_paths:
28
28
  - lib
29
29
  required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
30
31
  requirements:
31
- - - '>='
32
+ - - ! '>='
32
33
  - !ruby/object:Gem::Version
33
34
  version: '0'
34
35
  required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
35
37
  requirements:
36
- - - '>='
38
+ - - ! '>='
37
39
  - !ruby/object:Gem::Version
38
40
  version: '0'
39
41
  requirements: []
40
42
  rubyforge_project:
41
- rubygems_version: 2.0.0
43
+ rubygems_version: 1.8.11
42
44
  signing_key:
43
- specification_version: 4
45
+ specification_version: 3
44
46
  summary: Useful utility methods for working with Ruby hashes
45
47
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 61b6fe87bc44efa6061512b91b0550bdb0b8242a
4
- data.tar.gz: 0c61cd2d7f685beb5ab64f9677e0a8d6a0e3fb5c
5
- SHA512:
6
- metadata.gz: 20c334a2514053e88006c07f352da46f41e5aa199bc13f78d2374a124e7c9e2ac22402c4dd4e29cb49a7f7721a972012394002e97d35d2ff42d1ef1fc731a8e2
7
- data.tar.gz: b0ac8be93c2c9c252faa87642c37b11a58cd5ebb978d038d0d143bfbe052fe26b4fef8dd87fce141186f2edcc963d4d72898ab01688df423911cc2c8243786bb