sum_sum 0.0.1
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.
- data/.gitignore +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +42 -0
- data/Guardfile +5 -0
- data/Rakefile +7 -0
- data/lib/sum_sum/version.rb +3 -0
- data/lib/sum_sum.rb +47 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/sum_sum_spec.rb +145 -0
- data/sum_sum.gemspec +26 -0
- metadata +135 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.9.2@sum_sum
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
sum_sum (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
configuration (1.2.0)
|
10
|
+
diff-lcs (1.1.2)
|
11
|
+
growl (1.0.3)
|
12
|
+
guard (0.3.0)
|
13
|
+
open_gem (~> 1.4.2)
|
14
|
+
thor (~> 0.14.6)
|
15
|
+
guard-rspec (0.1.9)
|
16
|
+
guard (>= 0.2.2)
|
17
|
+
launchy (0.3.7)
|
18
|
+
configuration (>= 0.0.5)
|
19
|
+
rake (>= 0.8.1)
|
20
|
+
open_gem (1.4.2)
|
21
|
+
launchy (~> 0.3.5)
|
22
|
+
rake (0.8.7)
|
23
|
+
rb-fsevent (0.3.9)
|
24
|
+
rspec (2.4.0)
|
25
|
+
rspec-core (~> 2.4.0)
|
26
|
+
rspec-expectations (~> 2.4.0)
|
27
|
+
rspec-mocks (~> 2.4.0)
|
28
|
+
rspec-core (2.4.0)
|
29
|
+
rspec-expectations (2.4.0)
|
30
|
+
diff-lcs (~> 1.1.2)
|
31
|
+
rspec-mocks (2.4.0)
|
32
|
+
thor (0.14.6)
|
33
|
+
|
34
|
+
PLATFORMS
|
35
|
+
ruby
|
36
|
+
|
37
|
+
DEPENDENCIES
|
38
|
+
growl (>= 1.0.3)
|
39
|
+
guard-rspec (>= 0.1.9)
|
40
|
+
rb-fsevent (>= 0.3.9)
|
41
|
+
rspec (>= 2.4.0)
|
42
|
+
sum_sum!
|
data/Guardfile
ADDED
data/Rakefile
ADDED
data/lib/sum_sum.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
class SumSum < Hash
|
2
|
+
def initialize(*args)
|
3
|
+
@parent = args.pop if args[-1].is_a?(self.class)
|
4
|
+
@name = args.shift
|
5
|
+
@args = args.compact.dup
|
6
|
+
@count = 0
|
7
|
+
super()
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :name, :args, :count, :parent
|
11
|
+
|
12
|
+
def add(hash, increase_by=1)
|
13
|
+
key = hash[name]
|
14
|
+
@count = @count + increase_by
|
15
|
+
unless bottom?
|
16
|
+
self[key] ||= SumSum.new(*args, self)
|
17
|
+
self[key].add(hash, increase_by)
|
18
|
+
end
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def share
|
23
|
+
root? ? 1.0 : count/parent.count.to_f
|
24
|
+
end
|
25
|
+
|
26
|
+
def sort!
|
27
|
+
values.each(&:sort!) unless bottom?
|
28
|
+
to_a.tap do |array|
|
29
|
+
array.reverse!(&:count)
|
30
|
+
clear
|
31
|
+
array.each{|k, v| self[k] = v }
|
32
|
+
end
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def root?
|
37
|
+
parent.nil?
|
38
|
+
end
|
39
|
+
|
40
|
+
def bottom?
|
41
|
+
name.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def inspect
|
45
|
+
bottom? ? "#{count}" : "{#{name}:#{count} #{super.gsub(/^\{|\}$/, "")}}"
|
46
|
+
end
|
47
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SumSum do
|
4
|
+
context ".new" do
|
5
|
+
it "should raise no error with zero argument" do
|
6
|
+
lambda{ SumSum.new }.should_not raise_error(ArgumentError)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should raise no error with one argument" do
|
10
|
+
lambda{ SumSum.new(:x) }.should_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should raise no error with multiple argument" do
|
14
|
+
lambda{ SumSum.new(:x, :y, :z) }.should_not raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "#add" do
|
19
|
+
let(:sum) { SumSum.new(:type, :name, :version) }
|
20
|
+
|
21
|
+
context "adding single hash" do
|
22
|
+
before do
|
23
|
+
sum.add({:type => :Browser, :name => :Firefox, :version => "3.6.0"})
|
24
|
+
end
|
25
|
+
|
26
|
+
context "#count" do
|
27
|
+
it "should return 1 on all levels" do
|
28
|
+
sum.count.should eql(1)
|
29
|
+
sum[:Browser].count.should eql(1)
|
30
|
+
sum[:Browser][:Firefox].count.should eql(1)
|
31
|
+
sum[:Browser][:Firefox]["3.6.0"].count.should eql(1)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "#keys" do
|
36
|
+
it "should return correct keys on all levels" do
|
37
|
+
sum.keys.should eql([:Browser])
|
38
|
+
sum[:Browser].keys.should eql([:Firefox])
|
39
|
+
sum[:Browser][:Firefox].keys.should eql(["3.6.0"])
|
40
|
+
sum[:Browser][:Firefox]["3.6.0"].keys.should eql([])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "adding multiple hashes" do
|
46
|
+
before do
|
47
|
+
sum.add({:type => :Crawler, :name => :GoogleBot, :version => "2.0"})
|
48
|
+
sum.add({:type => :Browser, :name => :Firefox, :version => "3.6.0"})
|
49
|
+
sum.add({:type => :Browser, :name => :Safari, :version => "4.0"})
|
50
|
+
sum.add({:type => :Browser, :name => :Safari, :version => "5.0"})
|
51
|
+
sum.add({:type => :Browser, :name => :Safari, :version => "5.0"})
|
52
|
+
end
|
53
|
+
|
54
|
+
context "#add" do
|
55
|
+
it "should return itself" do
|
56
|
+
sum.add({:type => :Crawler, :name => :GoogleBot, :version => "2.0"}).should eql(sum)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should add missing values as nil" do
|
60
|
+
sum.add({:type => :Crawler, :name => nil})
|
61
|
+
sum.add({:type => :Crawler})
|
62
|
+
|
63
|
+
sum[:Crawler].keys.should eql([:GoogleBot, nil])
|
64
|
+
sum[:Crawler][nil].count.should eql(2)
|
65
|
+
sum[:Crawler][nil].keys.should eql([nil])
|
66
|
+
sum[:Crawler][nil][nil].count.should eql(2)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should allow to add multiple counts at once" do
|
70
|
+
sum.add({:type => :Crawler, :name => :DuckDuckGo, :version => "1.0"}, 10)
|
71
|
+
|
72
|
+
sum[:Crawler].count.should eql(11)
|
73
|
+
sum[:Crawler][:DuckDuckGo].count.should eql(10)
|
74
|
+
sum[:Crawler][:DuckDuckGo]["1.0"].count.should eql(10)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "#count" do
|
79
|
+
it "should return correct count on all levels" do
|
80
|
+
sum.count.should eql(5)
|
81
|
+
|
82
|
+
sum[:Browser].count.should eql(4)
|
83
|
+
sum[:Browser][:Firefox].count.should eql(1)
|
84
|
+
sum[:Browser][:Firefox]["3.6.0"].count.should eql(1)
|
85
|
+
sum[:Browser][:Safari].count.should eql(3)
|
86
|
+
sum[:Browser][:Safari]["5.0"].count.should eql(2)
|
87
|
+
sum[:Browser][:Safari]["4.0"].count.should eql(1)
|
88
|
+
|
89
|
+
sum[:Crawler].count.should eql(1)
|
90
|
+
sum[:Crawler][:GoogleBot].count.should eql(1)
|
91
|
+
sum[:Crawler][:GoogleBot]["2.0"].count.should eql(1)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "#keys" do
|
96
|
+
it "should return correct keys on all levels" do
|
97
|
+
sum.keys.should eql([:Crawler, :Browser])
|
98
|
+
sum[:Browser].keys.should eql([:Firefox, :Safari])
|
99
|
+
sum[:Browser][:Firefox].keys.should eql(["3.6.0"])
|
100
|
+
sum[:Browser][:Firefox]["3.6.0"].keys.should eql([])
|
101
|
+
sum[:Browser][:Safari].keys.should eql(["4.0", "5.0"])
|
102
|
+
sum[:Browser][:Safari]["4.0"].keys.should eql([])
|
103
|
+
sum[:Browser][:Safari]["5.0"].keys.should eql([])
|
104
|
+
sum[:Crawler].keys.should eql([:GoogleBot])
|
105
|
+
sum[:Crawler][:GoogleBot].keys.should eql(["2.0"])
|
106
|
+
sum[:Crawler][:GoogleBot]["2.0"].keys.should eql([])
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "#sort" do
|
111
|
+
before do
|
112
|
+
sum.sort!
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should sort by count" do
|
116
|
+
sum.keys.should eql([:Browser, :Crawler])
|
117
|
+
sum[:Browser].keys.should eql([:Safari, :Firefox])
|
118
|
+
sum[:Browser][:Safari].keys.should eql(["5.0", "4.0"])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "#share" do
|
123
|
+
it "should return 1.0 on root" do
|
124
|
+
sum.share.should eql(1.0)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should return 1.0 on branch with single entry" do
|
128
|
+
sum[:Crawler][:GoogleBot].share.should eql(1.0)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should return 0.2 on branch with one out of five" do
|
132
|
+
sum[:Crawler].share.should eql(0.2)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should return 0.8 on branch with four out of five" do
|
136
|
+
sum[:Browser].share.should eql(0.8)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should return 0.25 on branch with one out of four" do
|
140
|
+
sum[:Browser][:Firefox].share.should eql(0.25)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/sum_sum.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "sum_sum/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "sum_sum"
|
7
|
+
s.version = SumSum::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Sebastian Munz"]
|
10
|
+
s.email = ["sebastian@yo.lk"]
|
11
|
+
s.homepage = "http://rubygems.org/gems/sum_sum"
|
12
|
+
s.summary = %q{SumSum allows you to generate simple reports on the count of values in hashes.}
|
13
|
+
s.description = %q{SumSum allows you to generate simple reports on the count of values in hashes.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "sum_sum"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_development_dependency 'rspec', '>= 2.4.0'
|
23
|
+
s.add_development_dependency 'guard-rspec', '>=0.1.9'
|
24
|
+
s.add_development_dependency 'growl', '>=1.0.3'
|
25
|
+
s.add_development_dependency 'rb-fsevent', '>=0.3.9'
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sum_sum
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Sebastian Munz
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-27 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 2
|
30
|
+
- 4
|
31
|
+
- 0
|
32
|
+
version: 2.4.0
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: guard-rspec
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
- 1
|
46
|
+
- 9
|
47
|
+
version: 0.1.9
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: growl
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 1
|
60
|
+
- 0
|
61
|
+
- 3
|
62
|
+
version: 1.0.3
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: rb-fsevent
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
- 3
|
76
|
+
- 9
|
77
|
+
version: 0.3.9
|
78
|
+
type: :development
|
79
|
+
version_requirements: *id004
|
80
|
+
description: SumSum allows you to generate simple reports on the count of values in hashes.
|
81
|
+
email:
|
82
|
+
- sebastian@yo.lk
|
83
|
+
executables: []
|
84
|
+
|
85
|
+
extensions: []
|
86
|
+
|
87
|
+
extra_rdoc_files: []
|
88
|
+
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- .rvmrc
|
92
|
+
- Gemfile
|
93
|
+
- Gemfile.lock
|
94
|
+
- Guardfile
|
95
|
+
- Rakefile
|
96
|
+
- lib/sum_sum.rb
|
97
|
+
- lib/sum_sum/version.rb
|
98
|
+
- spec/spec_helper.rb
|
99
|
+
- spec/sum_sum_spec.rb
|
100
|
+
- sum_sum.gemspec
|
101
|
+
has_rdoc: true
|
102
|
+
homepage: http://rubygems.org/gems/sum_sum
|
103
|
+
licenses: []
|
104
|
+
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
version: "0"
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
version: "0"
|
126
|
+
requirements: []
|
127
|
+
|
128
|
+
rubyforge_project: sum_sum
|
129
|
+
rubygems_version: 1.3.7
|
130
|
+
signing_key:
|
131
|
+
specification_version: 3
|
132
|
+
summary: SumSum allows you to generate simple reports on the count of values in hashes.
|
133
|
+
test_files:
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
- spec/sum_sum_spec.rb
|