vanity-source 0.6 → 0.7
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/CHANGELOG +16 -0
- data/Gemfile +3 -1
- data/Rakefile +8 -1
- data/lib/vanity/source.rb +52 -6
- data/lib/vanity/sources/backtweets.rb +25 -20
- data/lib/vanity/sources/backtweets.yml +9 -0
- data/lib/vanity/sources/github.rb +44 -49
- data/lib/vanity/sources/github.yml +15 -0
- data/lib/vanity/sources/github_issues.rb +32 -29
- data/lib/vanity/sources/github_issues.yml +14 -0
- data/lib/vanity/sources/ruby_gems.rb +19 -22
- data/lib/vanity/sources/ruby_gems.yml +6 -0
- data/test/api_keys.yml +1 -0
- data/test/backtweets_test.rb +130 -0
- data/test/cassettes/backtweets.yml +63 -0
- data/test/cassettes/github.yml +121 -0
- data/test/cassettes/github_issues.yml +123 -0
- data/test/cassettes/ruby_gems.yml +36 -0
- data/test/github_issues_test.rb +161 -0
- data/test/github_test.rb +188 -0
- data/test/ruby_gems_test.rb +130 -0
- data/test/test.log +246 -0
- data/test/test_helper.rb +202 -0
- data/vanity-source.gemspec +6 -1
- metadata +71 -10
@@ -0,0 +1,161 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
|
3
|
+
test Vanity::Source::GithubIssues do
|
4
|
+
context "setup" do
|
5
|
+
setup { setup_source "repo"=>"assaf/vanity" }
|
6
|
+
|
7
|
+
should "use repository name" do
|
8
|
+
assert_equal "Github Issues for assaf/vanity", metric.name
|
9
|
+
end
|
10
|
+
|
11
|
+
should "measure totals" do
|
12
|
+
assert metric.totals
|
13
|
+
end
|
14
|
+
|
15
|
+
should "capture open issues" do
|
16
|
+
assert metric.columns.include?(:id=>"open", :label=>"Open issues")
|
17
|
+
end
|
18
|
+
|
19
|
+
should "capture closed issues" do
|
20
|
+
assert metric.columns.include?(:id=>"closed", :label=>"Closed issues")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
context "validation" do
|
26
|
+
should "raise error if repository name missing" do
|
27
|
+
assert_raise(RuntimeError) { setup_source "repo"=>" " }
|
28
|
+
end
|
29
|
+
|
30
|
+
should "raise error if repository name not user/repo" do
|
31
|
+
assert_raise(RuntimeError) { setup_source "repo"=>"vanity" }
|
32
|
+
end
|
33
|
+
|
34
|
+
should "allow alphanumeric, minus and underscore" do
|
35
|
+
setup_source "repo"=>"assaf/the-vanity_0"
|
36
|
+
assert_valid metric
|
37
|
+
end
|
38
|
+
|
39
|
+
should "create valid metric" do
|
40
|
+
setup_source "repo"=>"assaf/vanity"
|
41
|
+
assert_valid metric
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
context "update" do
|
47
|
+
setup { setup_source "repo"=>"assaf/vanity" }
|
48
|
+
|
49
|
+
should "handle 404" do
|
50
|
+
stub_request(:get, interactions.first.uri).to_return :status=>404
|
51
|
+
stub_request(:get, interactions.second.uri).to_return :status=>404
|
52
|
+
assert_raise(RuntimeError) { update_source }
|
53
|
+
assert_equal "Could not find the repository assaf/vanity", last_error
|
54
|
+
end
|
55
|
+
|
56
|
+
should "handle 401" do
|
57
|
+
stub_request(:get, interactions.first.uri).to_return :status=>401
|
58
|
+
stub_request(:get, interactions.second.uri).to_return :status=>401
|
59
|
+
assert_raise(RuntimeError) { update_source }
|
60
|
+
assert_equal "You are not authorized to access this repository, or invalid username/password", last_error
|
61
|
+
end
|
62
|
+
|
63
|
+
should "handle other error" do
|
64
|
+
stub_request(:get, interactions.first.uri).to_return :status=>500
|
65
|
+
stub_request(:get, interactions.second.uri).to_return :status=>500
|
66
|
+
assert_raise(RuntimeError) { update_source }
|
67
|
+
assert_equal "Last request didn't go as expected, trying again later", last_error
|
68
|
+
end
|
69
|
+
|
70
|
+
should "handle invlid document entity" do
|
71
|
+
stub_request(:get, interactions.first.uri).to_return :body=>"Not JSON"
|
72
|
+
stub_request(:get, interactions.last.uri).to_return :body=>"Not JSON"
|
73
|
+
assert_raise(RuntimeError) { update_source }
|
74
|
+
assert_equal "Last request didn't go as expected, trying again later", last_error
|
75
|
+
end
|
76
|
+
|
77
|
+
should "capture number of open issues" do
|
78
|
+
update_source
|
79
|
+
assert_equal 9, totals[:open]
|
80
|
+
end
|
81
|
+
|
82
|
+
should "capture number of closed issues" do
|
83
|
+
update_source
|
84
|
+
assert_equal 12, totals[:closed]
|
85
|
+
end
|
86
|
+
|
87
|
+
should "not create any activity" do
|
88
|
+
update_source
|
89
|
+
assert activities.empty?
|
90
|
+
end
|
91
|
+
|
92
|
+
context "repeating" do
|
93
|
+
setup do
|
94
|
+
update_source
|
95
|
+
open = interactions.select { |i| i.uri =~ /open/ }
|
96
|
+
stub_request(:get, open.first.uri).to_return :body=>open.last.response.body
|
97
|
+
closed = interactions.select { |i| i.uri =~ /closed/ }
|
98
|
+
stub_request(:get, closed.first.uri).to_return :body=>closed.last.response.body
|
99
|
+
update_source
|
100
|
+
end
|
101
|
+
|
102
|
+
should "update open count" do
|
103
|
+
assert_equal 2, totals[:open]
|
104
|
+
end
|
105
|
+
|
106
|
+
should "update closed count" do
|
107
|
+
assert_equal 2, totals[:closed]
|
108
|
+
end
|
109
|
+
|
110
|
+
should "create activity for each issue opened or closed" do
|
111
|
+
assert_equal 2, activities.count
|
112
|
+
end
|
113
|
+
|
114
|
+
context "activity for open issue" do
|
115
|
+
setup do
|
116
|
+
@open = activities.first
|
117
|
+
end
|
118
|
+
|
119
|
+
should "capture issue URL" do
|
120
|
+
assert_equal "http://github.com/assaf/vanity/issues#issue/22", @open.url
|
121
|
+
end
|
122
|
+
|
123
|
+
should "use SHA1 for ID" do
|
124
|
+
assert_match /^[0-9a-f]{40}$/, @open.id
|
125
|
+
end
|
126
|
+
|
127
|
+
should "capture issue creation time" do
|
128
|
+
assert_equal Time.parse("2010/03/17 22:32:02 UTC"), @open.timestamp
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "activity for closed issue" do
|
133
|
+
setup do
|
134
|
+
@closed = activities.last
|
135
|
+
end
|
136
|
+
|
137
|
+
should "capture issue URL" do
|
138
|
+
assert_equal "http://github.com/assaf/vanity/issues#issue/19", @closed.url
|
139
|
+
end
|
140
|
+
|
141
|
+
should "use SHA1 for ID" do
|
142
|
+
assert_match /^[0-9a-f]{40}$/, @closed.id
|
143
|
+
end
|
144
|
+
|
145
|
+
should "capture issue closing time" do
|
146
|
+
assert_equal Time.parse("2010/07/03 04:16:42 UTC"), @closed.timestamp
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
context "meta" do
|
155
|
+
setup { setup_source "repo"=>"assaf/vanity" }
|
156
|
+
|
157
|
+
should "link to repository" do
|
158
|
+
assert_contains meta, :title=>"On Github", :url=>"http://github.com/assaf/vanity/issues"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/test/github_test.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
|
3
|
+
test Vanity::Source::Github do
|
4
|
+
context "setup" do
|
5
|
+
setup { setup_source "repo"=>"assaf/vanity", "branch"=>"master" }
|
6
|
+
|
7
|
+
should "use repository name" do
|
8
|
+
assert_equal "Github: assaf/vanity", metric.name
|
9
|
+
end
|
10
|
+
|
11
|
+
should "measure totals" do
|
12
|
+
assert metric.totals
|
13
|
+
end
|
14
|
+
|
15
|
+
should "capture commits" do
|
16
|
+
assert metric.columns.include?(:id=>"commits", :label=>"Commits")
|
17
|
+
end
|
18
|
+
|
19
|
+
should "capture watchers" do
|
20
|
+
assert metric.columns.include?(:id=>"watchers", :label=>"Watchers")
|
21
|
+
end
|
22
|
+
|
23
|
+
should "capture forks" do
|
24
|
+
assert metric.columns.include?(:id=>"forks", :label=>"Forks")
|
25
|
+
end
|
26
|
+
|
27
|
+
should "default branch to master" do
|
28
|
+
setup_source "repo"=>"assaf/vanity", "branch"=>" "
|
29
|
+
assert_equal "master", context["branch"]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
context "validation" do
|
35
|
+
should "raise error if repository name missing" do
|
36
|
+
assert_raise(RuntimeError) { setup_source "repo"=>" ", "branch"=>"master" }
|
37
|
+
end
|
38
|
+
|
39
|
+
should "raise error if repository name not user/repo" do
|
40
|
+
assert_raise(RuntimeError) { setup_source "repo"=>"vanity", "branch"=>"master" }
|
41
|
+
end
|
42
|
+
|
43
|
+
should "allow alphanumeric, minus and underscore" do
|
44
|
+
setup_source "repo"=>"assaf/the-vanity_0", "branch"=>"master"
|
45
|
+
assert_valid metric
|
46
|
+
end
|
47
|
+
|
48
|
+
should "create valid metric" do
|
49
|
+
setup_source "repo"=>"assaf/vanity", "branch"=>"master"
|
50
|
+
assert_valid metric
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
context "update" do
|
56
|
+
setup { setup_source "repo"=>"assaf/vanity", "branch"=>"master" }
|
57
|
+
|
58
|
+
should "handle 404" do
|
59
|
+
stub_request(:get, interactions.first.uri).to_return :status=>404
|
60
|
+
assert_raise(RuntimeError) { update_source }
|
61
|
+
assert_equal "Could not find the repository assaf/vanity", last_error
|
62
|
+
end
|
63
|
+
|
64
|
+
should "handle 401" do
|
65
|
+
stub_request(:get, interactions.first.uri).to_return :status=>401
|
66
|
+
assert_raise(RuntimeError) { update_source }
|
67
|
+
assert_equal "You are not authorized to access this repository, or invalid username/password", last_error
|
68
|
+
end
|
69
|
+
|
70
|
+
should "handle other error" do
|
71
|
+
stub_request(:get, interactions.first.uri).to_return :status=>500
|
72
|
+
assert_raise(RuntimeError) { update_source }
|
73
|
+
assert_equal "Last request didn't go as expected, trying again later", last_error
|
74
|
+
end
|
75
|
+
|
76
|
+
should "handle invlid document entity" do
|
77
|
+
stub_request(:get, interactions.first.uri).to_return :body=>"Not JSON"
|
78
|
+
assert_raise(RuntimeError) { update_source }
|
79
|
+
assert_equal "Last request didn't go as expected, trying again later", last_error
|
80
|
+
end
|
81
|
+
|
82
|
+
should "capture number of commits" do
|
83
|
+
update_source
|
84
|
+
assert_equal 35, totals[:commits]
|
85
|
+
end
|
86
|
+
|
87
|
+
should "capture number of wacthers" do
|
88
|
+
update_source
|
89
|
+
assert_equal 534, totals[:watchers]
|
90
|
+
end
|
91
|
+
|
92
|
+
should "capture number of forks" do
|
93
|
+
update_source
|
94
|
+
assert_equal 36, totals[:forks]
|
95
|
+
end
|
96
|
+
|
97
|
+
should "not create any activity" do
|
98
|
+
update_source
|
99
|
+
assert activities.empty?
|
100
|
+
end
|
101
|
+
|
102
|
+
context "repeating" do
|
103
|
+
setup do
|
104
|
+
update_source
|
105
|
+
repo = interactions.select { |i| i.uri =~ /repos\/show/ }
|
106
|
+
stub_request(:get, repo.first.uri).to_return :body=>repo.last.response.body
|
107
|
+
commits = interactions.select { |i| i.uri =~ /commits\/list/ }
|
108
|
+
stub_request(:get, commits.first.uri).to_return :body=>commits.last.response.body
|
109
|
+
update_source
|
110
|
+
end
|
111
|
+
|
112
|
+
should "update watchers" do
|
113
|
+
assert_equal 555, totals[:watchers]
|
114
|
+
end
|
115
|
+
|
116
|
+
should "update forks" do
|
117
|
+
assert_equal 38, totals[:forks]
|
118
|
+
end
|
119
|
+
|
120
|
+
should "capture new number of commits" do
|
121
|
+
assert_equal 37, totals[:commits]
|
122
|
+
end
|
123
|
+
|
124
|
+
should "create activity for each commit" do
|
125
|
+
assert_equal 2, activities.count
|
126
|
+
end
|
127
|
+
|
128
|
+
should "create most recent activity for most recent commit" do
|
129
|
+
assert_equal ["The second commit", "The third commit"], activities.map(&:body)
|
130
|
+
end
|
131
|
+
|
132
|
+
context "activity" do
|
133
|
+
|
134
|
+
should "capture commit URL" do
|
135
|
+
assert_equal "http://github.com/assaf/vanity/commit/dd154a9fdd2ac534b62b55b8acac2fd092d65439", activity.url
|
136
|
+
end
|
137
|
+
|
138
|
+
should "capture commit SHA" do
|
139
|
+
assert_equal "dd154a9fdd2ac534b62b55b8acac2fd092d65439", activity.id
|
140
|
+
end
|
141
|
+
|
142
|
+
should "capture timestamp" do
|
143
|
+
assert_equal Time.parse("2010-08-06T00:22:01-07:00 UTC"), activity.timestamp
|
144
|
+
end
|
145
|
+
|
146
|
+
should "capture commit message" do
|
147
|
+
assert_equal "The third commit", activity.body
|
148
|
+
end
|
149
|
+
|
150
|
+
should "capture commit author name" do
|
151
|
+
assert_equal "Assaf Arkin", activity.person.name
|
152
|
+
end
|
153
|
+
|
154
|
+
should "capture commit author email" do
|
155
|
+
assert_equal "assaf@labnotes.org", activity.person.email
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
context "meta" do
|
165
|
+
setup { setup_source "repo"=>"assaf/vanity", "branch"=>"master" }
|
166
|
+
|
167
|
+
should "link to repository" do
|
168
|
+
assert_contains meta, :title=>"Repository", :text=>"assaf/vanity", :url=>"http://github.com/assaf/vanity"
|
169
|
+
end
|
170
|
+
|
171
|
+
should "include project description" do
|
172
|
+
assert_contains meta, :text=>"Experiment Driven Development for Ruby"
|
173
|
+
end
|
174
|
+
|
175
|
+
should "link to project home page" do
|
176
|
+
assert_contains meta, :title=>"Home page", :url=>"http://vanity.labnotes.org"
|
177
|
+
end
|
178
|
+
|
179
|
+
should "list branch name" do
|
180
|
+
assert_contains meta, :title=>"Branch", :text=>"master"
|
181
|
+
end
|
182
|
+
|
183
|
+
should "show last commit message" do
|
184
|
+
assert_contains meta, :title=>"Commit", :text=>"Gemfile changes necessary to pass test suite.",
|
185
|
+
:url=>"http://github.com/assaf/vanity/commit/dd154a9fdd2ac534b62b55b8acac2fd092d6543a"
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper"
|
2
|
+
|
3
|
+
test Vanity::Source::RubyGems do
|
4
|
+
context "setup" do
|
5
|
+
setup { setup_source "gem_name"=>"vanity" }
|
6
|
+
|
7
|
+
should "use gem name" do
|
8
|
+
assert_equal "RubyGems: vanity", metric.name
|
9
|
+
end
|
10
|
+
|
11
|
+
should "measure totals" do
|
12
|
+
assert metric.totals
|
13
|
+
end
|
14
|
+
|
15
|
+
should "capture downloads" do
|
16
|
+
assert metric.columns.include?(:id=>"downloads", :label=>"Downloads")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
context "validation" do
|
22
|
+
should "raise error if gem name missing" do
|
23
|
+
assert_raise(RuntimeError) { setup_source "gem_name"=>" " }
|
24
|
+
end
|
25
|
+
|
26
|
+
should "create valid metric" do
|
27
|
+
setup_source "gem_name"=>"vanity"
|
28
|
+
assert_valid metric
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
context "update" do
|
34
|
+
setup { setup_source "gem_name"=>"vanity" }
|
35
|
+
|
36
|
+
should "properly encode gem name" do
|
37
|
+
setup_source "gem_name"=>"need&this=encoded"
|
38
|
+
update_source rescue nil
|
39
|
+
assert_requested :get, "http://rubygems.org/api/v1/gems/need%26this%3Dencoded.json"
|
40
|
+
end
|
41
|
+
|
42
|
+
should "handle 404" do
|
43
|
+
stub_request(:get, interactions.first.uri).to_return :status=>404
|
44
|
+
assert_raise(RuntimeError) { update_source }
|
45
|
+
assert_equal "Could not find the Gem vanity", last_error
|
46
|
+
end
|
47
|
+
|
48
|
+
should "handle other error" do
|
49
|
+
stub_request(:get, interactions.first.uri).to_return :status=>500
|
50
|
+
assert_raise(RuntimeError) { update_source }
|
51
|
+
assert_equal "Last request didn't go as expected, trying again later", last_error
|
52
|
+
end
|
53
|
+
|
54
|
+
should "handle invlid document entity" do
|
55
|
+
stub_request(:get, interactions.first.uri).to_return :body=>"Not JSON"
|
56
|
+
assert_raise(RuntimeError) { update_source }
|
57
|
+
assert_equal "Last request didn't go as expected, trying again later", last_error
|
58
|
+
end
|
59
|
+
|
60
|
+
should "capture number of downloads" do
|
61
|
+
update_source
|
62
|
+
assert_equal({ :downloads=>3492 }, totals)
|
63
|
+
end
|
64
|
+
|
65
|
+
should "not create any activity" do
|
66
|
+
update_source
|
67
|
+
assert activities.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
context "repeating" do
|
71
|
+
setup do
|
72
|
+
update_source
|
73
|
+
data = JSON.parse(interactions.first.response.body).merge("downloads"=>9040, "version"=>"2.1.0")
|
74
|
+
stub_request(:get, interactions.first.uri).to_return :body=>data.to_json
|
75
|
+
update_source
|
76
|
+
end
|
77
|
+
|
78
|
+
should "update version number" do
|
79
|
+
assert meta.include?(:title=>"Version", :text=>"2.1.0")
|
80
|
+
end
|
81
|
+
|
82
|
+
should "capture new number of downloads" do
|
83
|
+
assert_equal({ :downloads=>9040 }, totals)
|
84
|
+
end
|
85
|
+
|
86
|
+
should "create activity for new release" do
|
87
|
+
assert activity
|
88
|
+
end
|
89
|
+
|
90
|
+
context "activity" do
|
91
|
+
should "should have unique identifier" do
|
92
|
+
assert_equal "vanity-2.1.0", activity.id
|
93
|
+
end
|
94
|
+
|
95
|
+
should "capture have body denoting release" do
|
96
|
+
assert_equal "Released <a href=\"http://rubygems.org/gems/vanity/versions/2.1.0\">vanity version 2.1.0</a>", activity.body
|
97
|
+
end
|
98
|
+
|
99
|
+
should "link to project page" do
|
100
|
+
assert_equal "http://rubygems.org/gems/vanity", activity.url
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
context "meta" do
|
108
|
+
setup { setup_source "gem_name"=>"vanity" }
|
109
|
+
|
110
|
+
should "link to project page" do
|
111
|
+
assert_contains meta, :title=>"Project", :text=>"vanity", :url=>"http://vanity.labnotes.org"
|
112
|
+
end
|
113
|
+
|
114
|
+
should "include project description" do
|
115
|
+
assert_contains meta, :text=>"Mirror, mirror on the wall ..."
|
116
|
+
end
|
117
|
+
|
118
|
+
should "include version number" do
|
119
|
+
assert_contains meta, :title=>"Version", :text=>"1.4.0"
|
120
|
+
end
|
121
|
+
|
122
|
+
should "list authors" do
|
123
|
+
assert_contains meta, :title=>"Authors", :text=>"Assaf Arkin"
|
124
|
+
end
|
125
|
+
|
126
|
+
should "link to RubyGems page" do
|
127
|
+
assert_contains meta, :title=>"Source", :text=>"RubyGems", :url=>"http://rubygems.org/gems/vanity"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|