hashlib 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
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