vanity-source 0.10 → 0.11

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 CHANGED
@@ -1,3 +1,15 @@
1
+ 2010-08-30 v0.11 Changes to activity person, AS 3.0 support
2
+
3
+ Activity's person name is now fullname, photo is photo_url and url is no
4
+ longer, but we do accept multiple identities of the form domain:id, e.g
5
+ twitter.com:assaf, linkedin.com:assafarkin.
6
+
7
+ Test suite now allows validating metric, activity and person. Call the validate
8
+ method to run validation and raise exception on error (with a helpful error
9
+ message). Call valid? if you're only interested in true/false.
10
+
11
+ Gem dependencies removed to allow running with ActiveSupport 3.0.
12
+
1
13
  2010-08-26 v0.10 Tags and better messages
2
14
 
3
15
  Activities can now include tags.
@@ -11,7 +23,6 @@ Improvement all around to all the HTML messages.
11
23
  Attribute :id is now :uid.
12
24
 
13
25
  Activity content can be set using either :html or :text attribute.
14
-
15
26
  2010-08-24 v0.7 Added test suite and resources
16
27
 
17
28
  Each source can have an associated resources file (YAML), e.g. ruby_gems.rb
@@ -37,9 +37,9 @@ module Vanity
37
37
  <a href="#{url}">tweeted</a>:
38
38
  <blockquote>#{tweet["tweet_text"]}</blockquote>
39
39
  HTML
40
+ person = { :fullname=>handle, :identities=>%{twitter.com:#{handle}}, :photo_url=>tweet["tweet_profile_image_url"] }
40
41
  block.call :activity=>{ :uid=>id, :url=>url, :html=>html, :tags=>%w{twitter mention},
41
- :timestamp=>Time.parse(tweet["tweet_created_at"]).utc,
42
- :person=>{ :name=>handle, :url=>"http://twitter.com/#{handle}", :photo=>tweet["tweet_profile_image_url"] } }
42
+ :timestamp=>Time.parse(tweet["tweet_created_at"]).utc, :person=>person }
43
43
  end
44
44
  end
45
45
  if recent = tweets.first
@@ -58,10 +58,9 @@ module Vanity
58
58
  pushed to #{h context["branch"]} at <a href="http://github.com/#{context["repo"]}">#{h context["repo"]}</a>:
59
59
  <blockquote><a href="#{commit["url"]}">#{commit["id"][0,7]}</a> #{h commit["message"]}</blockquote>
60
60
  HTML
61
+ person = { :fullname=>committer["name"], :identities=>%{github.com:#{committer["name"]}}, :email=>committer["email"] }
61
62
  block.call :activity=>{ :uid=>commit["id"], :html=>html, :url=>commit["url"], :tags=>"push",
62
- :timestamp=>Time.parse(commit["committed_date"]).utc,
63
- :person=>{ :name=>committer["name"], :url=>"http://github.com/#{committer["name"]}",
64
- :email=>committer["email"] } }
63
+ :timestamp=>Time.parse(commit["committed_date"]).utc, :person=>person }
65
64
  end
66
65
  block.call :inc=>{ :commits=>new_ones.count }
67
66
  else
@@ -1,24 +1,28 @@
1
- require File.dirname(__FILE__) + "/test_helper"
1
+ require File.dirname(__FILE__) + "/setup"
2
2
 
3
3
  test Vanity::Source::Backtweets do
4
4
  context "setup" do
5
5
  setup { setup_source "url"=>"vanity.labnotes.org" }
6
6
 
7
- should "use URL" do
7
+ should "use normalize URL and remove scheme" do
8
+ setup_source "url"=>"http://Vanity.Labnotes.Org"
8
9
  assert_equal "Tweets for vanity.labnotes.org", metric.name
9
10
  end
10
11
 
11
- should "measure totals" do
12
- assert metric.totals
13
- end
12
+ context "metric" do
13
+ subject { metric }
14
14
 
15
- should "capture tweets" do
16
- assert metric.columns.include?(:id=>"tweets", :label=>"Tweets")
17
- end
15
+ should "use URL" do
16
+ assert_equal "Tweets for vanity.labnotes.org", subject.name
17
+ end
18
18
 
19
- should "use normalize URL and remove scheme" do
20
- setup_source "url"=>"http://Vanity.Labnotes.Org"
21
- assert_equal "Tweets for vanity.labnotes.org", metric.name
19
+ should "measure totals" do
20
+ assert subject.totals
21
+ end
22
+
23
+ should "capture tweets" do
24
+ assert subject.columns.include?(:id=>"tweets", :label=>"Tweets")
25
+ end
22
26
  end
23
27
  end
24
28
 
@@ -30,7 +34,7 @@ test Vanity::Source::Backtweets do
30
34
 
31
35
  should "create valid metric" do
32
36
  setup_source "url"=>"vanity.labnotes.org"
33
- assert_valid metric
37
+ assert metric.valid?
34
38
  end
35
39
  end
36
40
 
@@ -84,41 +88,50 @@ test Vanity::Source::Backtweets do
84
88
  end
85
89
 
86
90
  context "activity" do
91
+ subject { activity }
87
92
 
88
93
  should "capture tweet identifier" do
89
- assert_equal "20959239300", activity.uid
94
+ assert_equal "20959239300", subject.uid
90
95
  end
91
96
 
92
97
  should "capture tweet text" do
93
- assert_equal <<-HTML, activity.html
98
+ assert_equal <<-HTML, subject.html
94
99
  <a href="http://twitter.com/assaf/20959239300">tweeted</a>:
95
100
  <blockquote>Super awesome <a href="http://vanity.labnotes.org/">http://j.mp/aOrUnsz</a></blockquote>
96
101
  HTML
97
102
  end
98
103
 
99
104
  should "capture tweet URL" do
100
- assert_equal "http://twitter.com/assaf/20959239300", activity.url
105
+ assert_equal "http://twitter.com/assaf/20959239300", subject.url
101
106
  end
102
107
 
103
108
  should "capture tweet timestamp" do
104
- assert_equal Time.parse("2010-8-22T05:00:04").utc, activity.timestamp
109
+ assert_equal Time.parse("2010-8-22T05:00:04").utc, subject.timestamp
105
110
  end
106
111
 
107
- should "capture tweet author name" do
108
- assert_equal "assaf", activity.person.name
112
+ should "tag as tweeter and mention" do
113
+ assert_contains subject.tags, "twitter"
114
+ assert_contains subject.tags, "mention"
109
115
  end
110
116
 
111
- should "capture tweet author URL" do
112
- assert_equal "http://twitter.com/assaf", activity.person.url
117
+ should "be valid" do
118
+ assert subject.valid?
113
119
  end
114
120
 
115
- should "capture tweet author photo" do
116
- assert_equal "http://twitter.com/account/profile_image/assaf", activity.person.photo
117
- end
121
+ context "author" do
122
+ subject { activity.person }
118
123
 
119
- should "tag as tweeter and mention" do
120
- assert_contains activity.tags, "twitter"
121
- assert_contains activity.tags, "mention"
124
+ should "capture full name" do
125
+ assert_equal "assaf", subject.fullname
126
+ end
127
+
128
+ should "capture screen name" do
129
+ assert_contains subject.identities, "twitter.com:assaf"
130
+ end
131
+
132
+ should "capture photo" do
133
+ assert_equal "http://twitter.com/account/profile_image/assaf", subject.photo_url
134
+ end
122
135
  end
123
136
  end
124
137
 
@@ -129,9 +142,10 @@ test Vanity::Source::Backtweets do
129
142
 
130
143
  context "meta" do
131
144
  setup { setup_source "url"=>"vanity.labnotes.org" }
145
+ subject { meta }
132
146
 
133
147
  should "link to search results" do
134
- assert meta.include?(:text=>"Search yourself", :url=>"http://backtweets.com/search?q=vanity.labnotes.org")
148
+ assert subject.include?(:text=>"Search yourself", :url=>"http://backtweets.com/search?q=vanity.labnotes.org")
135
149
  end
136
150
  end
137
151
  end
@@ -1,23 +1,27 @@
1
- require File.dirname(__FILE__) + "/test_helper"
1
+ require File.dirname(__FILE__) + "/setup"
2
2
 
3
3
  test Vanity::Source::GithubIssues do
4
4
  context "setup" do
5
5
  setup { setup_source "repo"=>"assaf/vanity" }
6
6
 
7
- should "use repository name" do
8
- assert_equal "Github Issues for assaf/vanity", metric.name
9
- end
7
+ context "metric" do
8
+ subject { metric }
10
9
 
11
- should "measure totals" do
12
- assert metric.totals
13
- end
10
+ should "use repository name" do
11
+ assert_equal "Github Issues for assaf/vanity", subject.name
12
+ end
14
13
 
15
- should "capture open issues" do
16
- assert metric.columns.include?(:id=>"open", :label=>"Open issues")
17
- end
14
+ should "measure totals" do
15
+ assert subject.totals
16
+ end
17
+
18
+ should "capture open issues" do
19
+ assert subject.columns.include?(:id=>"open", :label=>"Open issues")
20
+ end
18
21
 
19
- should "capture closed issues" do
20
- assert metric.columns.include?(:id=>"closed", :label=>"Closed issues")
22
+ should "capture closed issues" do
23
+ assert subject.columns.include?(:id=>"closed", :label=>"Closed issues")
24
+ end
21
25
  end
22
26
  end
23
27
 
@@ -33,12 +37,12 @@ test Vanity::Source::GithubIssues do
33
37
 
34
38
  should "allow alphanumeric, minus and underscore" do
35
39
  setup_source "repo"=>"assaf/the-vanity_0"
36
- assert_valid metric
40
+ assert metric.valid?
37
41
  end
38
42
 
39
43
  should "create valid metric" do
40
44
  setup_source "repo"=>"assaf/vanity"
41
- assert_valid metric
45
+ assert metric.valid?
42
46
  end
43
47
  end
44
48
 
@@ -112,62 +116,66 @@ test Vanity::Source::GithubIssues do
112
116
  end
113
117
 
114
118
  context "activity for open issue" do
115
- setup do
116
- @open = activities.first
117
- end
119
+ subject { activities.first }
118
120
 
119
121
  should "capture issue URL" do
120
- assert_equal "http://github.com/assaf/vanity/issues#issue/22", @open.url
122
+ assert_equal "http://github.com/assaf/vanity/issues#issue/22", subject.url
121
123
  end
122
124
 
123
125
  should "use SHA1 for ID" do
124
- assert_match /^[0-9a-f]{40}$/, @open.uid
126
+ assert_match /^[0-9a-f]{40}$/, subject.uid
125
127
  end
126
128
 
127
129
  should "capture issue creation time" do
128
- assert_equal Time.parse("2010/03/17 22:32:02 UTC"), @open.timestamp
130
+ assert_equal Time.parse("2010/03/17 22:32:02 UTC"), subject.timestamp
129
131
  end
130
132
 
131
133
  should "capture issue title" do
132
- assert_equal <<-HTML, @open.html
134
+ assert_equal <<-HTML, subject.html
133
135
  opened <a href="http://github.com/assaf/vanity/issues#issue/22">issue 22</a> on assaf/vanity:
134
136
  <blockquote>Option to use Google Analytics for A/B testing</blockquote>
135
137
  HTML
136
138
  end
137
139
 
138
140
  should "tag as issue and open" do
139
- assert_contains @open.tags, "issue"
140
- assert_contains @open.tags, "opened"
141
+ assert_contains subject.tags, "issue"
142
+ assert_contains subject.tags, "opened"
143
+ end
144
+
145
+ should "be valid" do
146
+ assert subject.valid?
141
147
  end
142
148
  end
143
149
 
144
150
  context "activity for closed issue" do
145
- setup do
146
- @closed = activities.last
147
- end
151
+ subject { activities.last }
148
152
 
149
153
  should "capture issue URL" do
150
- assert_equal "http://github.com/assaf/vanity/issues#issue/19", @closed.url
154
+ assert_equal "http://github.com/assaf/vanity/issues#issue/19", subject.url
151
155
  end
152
156
 
153
157
  should "use SHA1 for ID" do
154
- assert_match /^[0-9a-f]{40}$/, @closed.uid
158
+ assert_match /^[0-9a-f]{40}$/, subject.uid
155
159
  end
156
160
 
157
161
  should "capture issue closing time" do
158
- assert_equal Time.parse("2010/07/03 04:16:42 UTC"), @closed.timestamp
162
+ assert_equal Time.parse("2010/07/03 04:16:42 UTC"), subject.timestamp
159
163
  end
160
164
 
161
165
  should "capture issue title" do
162
- assert_equal <<-HTML, @closed.html
166
+ assert_equal <<-HTML, subject.html
163
167
  closed <a href="http://github.com/assaf/vanity/issues#issue/19">issue 19</a> on assaf/vanity:
164
168
  <blockquote>Passwords not supported for the Redis config</blockquote>
165
169
  HTML
166
170
  end
167
171
 
168
172
  should "tag as issue and closed" do
169
- assert_contains @closed.tags, "issue"
170
- assert_contains @closed.tags, "closed"
173
+ assert_contains subject.tags, "issue"
174
+ assert_contains subject.tags, "closed"
175
+ end
176
+
177
+ should "be valid" do
178
+ assert subject.valid?
171
179
  end
172
180
  end
173
181
 
@@ -177,9 +185,10 @@ closed <a href="http://github.com/assaf/vanity/issues#issue/19">issue 19</a> on
177
185
 
178
186
  context "meta" do
179
187
  setup { setup_source "repo"=>"assaf/vanity" }
188
+ subject { meta }
180
189
 
181
190
  should "link to repository" do
182
- assert_contains meta, :title=>"On Github", :url=>"http://github.com/assaf/vanity/issues"
191
+ assert_contains subject, :title=>"On Github", :url=>"http://github.com/assaf/vanity/issues"
183
192
  end
184
193
  end
185
194
  end
data/test/github_test.rb CHANGED
@@ -1,32 +1,36 @@
1
- require File.dirname(__FILE__) + "/test_helper"
1
+ require File.dirname(__FILE__) + "/setup"
2
2
 
3
3
  test Vanity::Source::Github do
4
4
  context "setup" do
5
5
  setup { setup_source "repo"=>"assaf/vanity", "branch"=>"master" }
6
6
 
7
- should "use repository name" do
8
- assert_equal "Github: assaf/vanity", metric.name
7
+ should "default branch to master" do
8
+ setup_source "repo"=>"assaf/vanity", "branch"=>" "
9
+ assert_equal "master", context["branch"]
9
10
  end
10
11
 
11
- should "measure totals" do
12
- assert metric.totals
13
- end
12
+ context "metric" do
13
+ subject { metric }
14
14
 
15
- should "capture commits" do
16
- assert metric.columns.include?(:id=>"commits", :label=>"Commits")
17
- end
15
+ should "use repository name" do
16
+ assert_equal "Github: assaf/vanity", subject.name
17
+ end
18
18
 
19
- should "capture watchers" do
20
- assert metric.columns.include?(:id=>"watchers", :label=>"Watchers")
21
- end
19
+ should "measure totals" do
20
+ assert subject.totals
21
+ end
22
22
 
23
- should "capture forks" do
24
- assert metric.columns.include?(:id=>"forks", :label=>"Forks")
25
- end
23
+ should "capture commits" do
24
+ assert subject.columns.include?(:id=>"commits", :label=>"Commits")
25
+ end
26
26
 
27
- should "default branch to master" do
28
- setup_source "repo"=>"assaf/vanity", "branch"=>" "
29
- assert_equal "master", context["branch"]
27
+ should "capture watchers" do
28
+ assert subject.columns.include?(:id=>"watchers", :label=>"Watchers")
29
+ end
30
+
31
+ should "capture forks" do
32
+ assert subject.columns.include?(:id=>"forks", :label=>"Forks")
33
+ end
30
34
  end
31
35
  end
32
36
 
@@ -42,12 +46,12 @@ test Vanity::Source::Github do
42
46
 
43
47
  should "allow alphanumeric, minus and underscore" do
44
48
  setup_source "repo"=>"assaf/the-vanity_0", "branch"=>"master"
45
- assert_valid metric
49
+ assert metric.valid?
46
50
  end
47
51
 
48
52
  should "create valid metric" do
49
53
  setup_source "repo"=>"assaf/vanity", "branch"=>"master"
50
- assert_valid metric
54
+ assert metric.valid?
51
55
  end
52
56
  end
53
57
 
@@ -126,36 +130,45 @@ test Vanity::Source::Github do
126
130
  end
127
131
 
128
132
  context "activity" do
133
+ subject { activity }
129
134
 
130
135
  should "capture commit URL" do
131
- assert_equal "http://github.com/assaf/vanity/commit/dd154a9fdd2ac534b62b55b8acac2fd092d65439", activity.url
136
+ assert_equal "http://github.com/assaf/vanity/commit/dd154a9fdd2ac534b62b55b8acac2fd092d65439", subject.url
132
137
  end
133
138
 
134
139
  should "capture commit SHA" do
135
- assert_equal "dd154a9fdd2ac534b62b55b8acac2fd092d65439", activity.uid
140
+ assert_equal "dd154a9fdd2ac534b62b55b8acac2fd092d65439", subject.uid
136
141
  end
137
142
 
138
143
  should "capture timestamp" do
139
- assert_equal Time.parse("2010-08-06T00:22:01-07:00 UTC"), activity.timestamp
144
+ assert_equal Time.parse("2010-08-06T00:22:01-07:00 UTC"), subject.timestamp
140
145
  end
141
146
 
142
147
  should "capture commit message and SHA1" do
143
- assert_equal <<-HTML, activity.html
148
+ assert_equal <<-HTML, subject.html
144
149
  pushed to master at <a href="http://github.com/assaf/vanity">assaf/vanity</a>:
145
150
  <blockquote><a href="http://github.com/assaf/vanity/commit/dd154a9fdd2ac534b62b55b8acac2fd092d65439">dd154a9</a> Third &amp; last</blockquote>
146
151
  HTML
147
152
  end
148
153
 
149
- should "capture commit author name" do
150
- assert_equal "Assaf Arkin", activity.person.name
154
+ should "tag as push" do
155
+ assert_contains subject.tags, "push"
151
156
  end
152
-
153
- should "capture commit author email" do
154
- assert_equal "assaf@labnotes.org", activity.person.email
157
+
158
+ should "be valid" do
159
+ assert subject.valid?
155
160
  end
156
161
 
157
- should "tag as push" do
158
- assert_contains activity.tags, "push"
162
+ context "person" do
163
+ subject { activity.person }
164
+
165
+ should "capture full name" do
166
+ assert_equal "Assaf Arkin", subject.fullname
167
+ end
168
+
169
+ should "capture email" do
170
+ assert_equal "assaf@labnotes.org", subject.email
171
+ end
159
172
  end
160
173
  end
161
174
 
@@ -165,25 +178,26 @@ pushed to master at <a href="http://github.com/assaf/vanity">assaf/vanity</a>:
165
178
 
166
179
  context "meta" do
167
180
  setup { setup_source "repo"=>"assaf/vanity", "branch"=>"master" }
181
+ subject { meta }
168
182
 
169
183
  should "link to repository" do
170
- assert_contains meta, :title=>"Repository", :text=>"assaf/vanity", :url=>"http://github.com/assaf/vanity"
184
+ assert_contains subject, :title=>"Repository", :text=>"assaf/vanity", :url=>"http://github.com/assaf/vanity"
171
185
  end
172
186
 
173
187
  should "include project description" do
174
- assert_contains meta, :text=>"Experiment Driven Development for Ruby"
188
+ assert_contains subject, :text=>"Experiment Driven Development for Ruby"
175
189
  end
176
190
 
177
191
  should "link to project home page" do
178
- assert_contains meta, :title=>"Home page", :url=>"http://vanity.labnotes.org"
192
+ assert_contains subject, :title=>"Home page", :url=>"http://vanity.labnotes.org"
179
193
  end
180
194
 
181
195
  should "list branch name" do
182
- assert_contains meta, :title=>"Branch", :text=>"master"
196
+ assert_contains subject, :title=>"Branch", :text=>"master"
183
197
  end
184
198
 
185
199
  should "show last commit message" do
186
- assert_contains meta, :title=>"Commit", :text=>"Gemfile changes necessary to pass test suite.",
200
+ assert_contains subject, :title=>"Commit", :text=>"Gemfile changes necessary to pass test suite.",
187
201
  :url=>"http://github.com/assaf/vanity/commit/dd154a9fdd2ac534b62b55b8acac2fd092d6543a"
188
202
  end
189
203
  end
@@ -0,0 +1,21 @@
1
+ class Activity
2
+ def initialize(args = {})
3
+ args.each do |name, value|
4
+ send "#{name}=", value
5
+ end
6
+ end
7
+
8
+ attr_accessor :uid, :html, :text, :url, :timestamp, :tags, :person
9
+
10
+ def valid?
11
+ validate rescue return false
12
+ return true
13
+ end
14
+
15
+ def validate
16
+ raise "Must specify html or text" if html.blank? && text.blank?
17
+ raise "Tags must be alphanumeric, underscores allowed" unless tags.nil? || tags.all? { |tag| tag =~ /^[\w_]+$/ }
18
+ person.validate if person
19
+ end
20
+
21
+ end
@@ -0,0 +1,22 @@
1
+ class Metric
2
+ def initialize(args = {})
3
+ args.each do |name, value|
4
+ send "#{name}=", value
5
+ end
6
+ end
7
+
8
+ attr_accessor :name, :columns, :totals
9
+
10
+ def valid?
11
+ validate rescue return false
12
+ return true
13
+ end
14
+
15
+ def validate
16
+ fail "Metric name missing or a blank string" if name.blank?
17
+ fail "Metric must have at least one column" if columns.empty?
18
+ col_ids = columns.map { |col| col[:id] }
19
+ fail "All metric columns must have an id" unless col_ids.all? { |col_id| col_id }
20
+ fail "Metric columns must have unique ids" unless col_ids.uniq == col_ids
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ class Person
2
+
3
+ def initialize(args = {})
4
+ args.each do |name, value|
5
+ send "#{name}=", value
6
+ end
7
+ end
8
+
9
+ attr_accessor :fullname, :email, :identities, :photo_url
10
+
11
+ def valid?
12
+ validate rescue return false
13
+ return true
14
+ end
15
+
16
+ def validate
17
+ if photo_url
18
+ uri = URI.parse(photo_url)
19
+ fail "Photo URL must be absolute HTTP URL" unless uri.scheme == "http" && uri.absolute?
20
+ end
21
+ fail "Identities must be of the form name:value" unless identities.nil? || identities.all? { |id| id =~ /^[\w\.]+:.+$/ }
22
+ end
23
+
24
+ end
@@ -1,15 +1,3 @@
1
- require "test/unit"
2
- require "shoulda"
3
- require "webmock/test_unit"
4
- require "vcr"
5
-
6
-
7
- require File.dirname(__FILE__) + "/../lib/vanity/source"
8
- Dir[File.dirname(__FILE__) + "/../lib/vanity/sources/*.rb"].each do |file|
9
- require file
10
- end
11
-
12
- # Use this to define test suite for a source class. Creates a new TestCase
13
1
  # class, includes the modules Vanity::Source::TestHelpers and Webmock, sets the
14
2
  # source class, and other nicities.
15
3
  #
@@ -29,29 +17,11 @@ def test(klass, &block)
29
17
  end
30
18
  end
31
19
 
32
- Vanity::Source.logger = Logger.new("test/test.log")
33
- Vanity::Source.api_keys = YAML.load_file("test/api_keys.yml")
34
-
35
-
36
- WebMock.disable_net_connect!
37
- VCR.config do |vcr|
38
- vcr.cassette_library_dir = File.dirname(__FILE__) + "/cassettes"
39
- vcr.http_stubbing_library = :webmock
40
- vcr.default_cassette_options = { :record=>ENV["RECORD"] ? :new_episodes : :none }
41
- end
42
20
 
43
21
  module Vanity
44
22
  module Source
45
23
  module TestHelpers
46
- # Represents an activity.
47
- Activity = Struct.new(:uid, :html, :text, :url, :timestamp, :tags, :person)
48
24
 
49
- # Represents person associated with activity.
50
- Person = Struct.new(:name, :email, :url, :photo)
51
-
52
- # Represents a metric.
53
- Metric = Struct.new(:name, :columns, :totals)
54
-
55
25
  # Default setup. If you override setup, remember to call super.
56
26
  def setup
57
27
  WebMock.reset_webmock
@@ -104,7 +74,8 @@ module Vanity
104
74
  # @example
105
75
  # assert_equal "My metric", metric.name
106
76
  def metric
107
- Metric.new(*context.values_at("metric.name", "metric.columns", "metric.totals"))
77
+ values = { :name=>context["metric.name"], :columns=>context["metric.columns"], :totals=>!!context["metric.totals"] }
78
+ Metric.new(values)
108
79
  end
109
80
 
110
81
  def collector
@@ -117,11 +88,11 @@ module Vanity
117
88
  totals[name] += value
118
89
  end
119
90
  elsif args[:activity]
120
- values = args[:activity].values_at(:uid, :html, :text, :url, :timestamp, :tags)
121
- if person = args[:activity][:person]
122
- values << Person.new(*person.values_at(:name, :email, :url, :photo))
91
+ values = args[:activity].clone
92
+ if person = values.delete(:person)
93
+ values[:person] = Person.new(person)
123
94
  end
124
- activities.push Activity.new(*values)
95
+ activities.push Activity.new(values)
125
96
  end
126
97
  end
127
98
  end
@@ -156,19 +127,6 @@ module Vanity
156
127
  activities.last
157
128
  end
158
129
 
159
- # Validates a metric.
160
- #
161
- # @example
162
- # setup_source "gem_name"=>"vanity"
163
- # assert_valid metric
164
- def assert_valid(metric)
165
- assert !metric.name.blank?, "Metric name missing or a blank string"
166
- assert metric.columns.length > 0, "Metric must have at least one column"
167
- col_ids = metric.columns.map { |col| col[:id] }
168
- assert col_ids.all? { |col_id| col_id }, "All metric columns must have an id"
169
- assert col_ids.uniq == col_ids, "Metric columns must have unique ids"
170
- end
171
-
172
130
  # Returns the named fixture. Fixture looked up in the file
173
131
  # test/fixtures/<source_id>.rb
174
132
  def fixture(name)
@@ -1,19 +1,23 @@
1
- require File.dirname(__FILE__) + "/test_helper"
1
+ require File.dirname(__FILE__) + "/setup"
2
2
 
3
3
  test Vanity::Source::RubyGems do
4
4
  context "setup" do
5
5
  setup { setup_source "gem_name"=>"vanity" }
6
6
 
7
- should "use gem name" do
8
- assert_equal "RubyGems: vanity", metric.name
9
- end
7
+ context "metric" do
8
+ subject { metric }
10
9
 
11
- should "measure totals" do
12
- assert metric.totals
13
- end
10
+ should "use gem name" do
11
+ assert_equal "RubyGems: vanity", subject.name
12
+ end
13
+
14
+ should "measure totals" do
15
+ assert subject.totals
16
+ end
14
17
 
15
- should "capture downloads" do
16
- assert metric.columns.include?(:id=>"downloads", :label=>"Downloads")
18
+ should "capture downloads" do
19
+ assert subject.columns.include?(:id=>"downloads", :label=>"Downloads")
20
+ end
17
21
  end
18
22
  end
19
23
 
@@ -25,7 +29,7 @@ test Vanity::Source::RubyGems do
25
29
 
26
30
  should "create valid metric" do
27
31
  setup_source "gem_name"=>"vanity"
28
- assert_valid metric
32
+ assert metric.valid?
29
33
  end
30
34
  end
31
35
 
@@ -88,22 +92,28 @@ test Vanity::Source::RubyGems do
88
92
  end
89
93
 
90
94
  context "activity" do
95
+ subject { activity }
96
+
91
97
  should "should have unique identifier" do
92
- assert_equal "vanity-2.1.0", activity.uid
98
+ assert_equal "vanity-2.1.0", subject.uid
93
99
  end
94
100
 
95
101
  should "report release number" do
96
- assert_equal <<-HTML.strip, activity.html
102
+ assert_equal <<-HTML.strip, subject.html
97
103
  released <a href=\"http://rubygems.org/gems/vanity/versions/2.1.0\">vanity version 2.1.0</a>.
98
104
  HTML
99
105
  end
100
106
 
101
107
  should "link to project page" do
102
- assert_equal "http://rubygems.org/gems/vanity", activity.url
108
+ assert_equal "http://rubygems.org/gems/vanity", subject.url
103
109
  end
104
110
 
105
111
  should "tag as release" do
106
- assert_contains activity.tags, "release"
112
+ assert_contains subject.tags, "release"
113
+ end
114
+
115
+ should "be valid" do
116
+ assert subject.valid?
107
117
  end
108
118
  end
109
119
  end
@@ -112,25 +122,26 @@ released <a href=\"http://rubygems.org/gems/vanity/versions/2.1.0\">vanity versi
112
122
 
113
123
  context "meta" do
114
124
  setup { setup_source "gem_name"=>"vanity" }
125
+ subject { meta }
115
126
 
116
127
  should "link to project page" do
117
- assert_contains meta, :title=>"Project", :text=>"vanity", :url=>"http://vanity.labnotes.org"
128
+ assert_contains subject, :title=>"Project", :text=>"vanity", :url=>"http://vanity.labnotes.org"
118
129
  end
119
130
 
120
131
  should "include project description" do
121
- assert_contains meta, :text=>"Mirror, mirror on the wall ..."
132
+ assert_contains subject, :text=>"Mirror, mirror on the wall ..."
122
133
  end
123
134
 
124
135
  should "include version number" do
125
- assert_contains meta, :title=>"Version", :text=>"1.4.0"
136
+ assert_contains subject, :title=>"Version", :text=>"1.4.0"
126
137
  end
127
138
 
128
139
  should "list authors" do
129
- assert_contains meta, :title=>"Authors", :text=>"Assaf Arkin"
140
+ assert_contains subject, :title=>"Authors", :text=>"Assaf Arkin"
130
141
  end
131
142
 
132
143
  should "link to RubyGems page" do
133
- assert_contains meta, :title=>"Source", :text=>"RubyGems", :url=>"http://rubygems.org/gems/vanity"
144
+ assert_contains subject, :title=>"Source", :text=>"RubyGems", :url=>"http://rubygems.org/gems/vanity"
134
145
  end
135
146
  end
136
147
  end
data/test/setup.rb ADDED
@@ -0,0 +1,27 @@
1
+ require "test/unit"
2
+ require "shoulda"
3
+ require "webmock/test_unit"
4
+ require "vcr"
5
+
6
+ require "test/helpers/test"
7
+ require "test/helpers/person"
8
+ require "test/helpers/activity"
9
+ require "test/helpers/metric"
10
+
11
+
12
+ require File.dirname(__FILE__) + "/../lib/vanity/source"
13
+ Dir[File.dirname(__FILE__) + "/../lib/vanity/sources/*.rb"].each do |file|
14
+ require file
15
+ end
16
+
17
+
18
+ Vanity::Source.logger = Logger.new("test/test.log")
19
+ Vanity::Source.api_keys = YAML.load_file("test/api_keys.yml")
20
+
21
+
22
+ WebMock.disable_net_connect!
23
+ VCR.config do |vcr|
24
+ vcr.cassette_library_dir = File.dirname(__FILE__) + "/cassettes"
25
+ vcr.http_stubbing_library = :webmock
26
+ vcr.default_cassette_options = { :record=>ENV["RECORD"] ? :new_episodes : :none }
27
+ end
data/test/test.log CHANGED
@@ -500,3 +500,115 @@ Backtweets: 200
500
500
  Backtweets: 500
501
501
  RubyGems: 200
502
502
  RubyGems: 500
503
+ Backtweets: 500
504
+ Backtweets: 200
505
+ Backtweets: 200
506
+ Backtweets: 500
507
+ RubyGems: 200
508
+ RubyGems: 500
509
+ Backtweets: 500
510
+ Backtweets: 200
511
+ Backtweets: 200
512
+ Backtweets: 500
513
+ RubyGems: 200
514
+ RubyGems: 500
515
+ Backtweets: 500
516
+ Backtweets: 200
517
+ Backtweets: 200
518
+ Backtweets: 500
519
+ RubyGems: 200
520
+ RubyGems: 500
521
+ Backtweets: 500
522
+ Backtweets: 200
523
+ Backtweets: 200
524
+ Backtweets: 500
525
+ RubyGems: 200
526
+ RubyGems: 500
527
+ Backtweets: 500
528
+ Backtweets: 200
529
+ Backtweets: 200
530
+ Backtweets: 500
531
+ RubyGems: 200
532
+ RubyGems: 500
533
+ Backtweets: 500
534
+ Backtweets: 200
535
+ Backtweets: 200
536
+ Backtweets: 500
537
+ RubyGems: 200
538
+ RubyGems: 500
539
+ Backtweets: 500
540
+ Backtweets: 200
541
+ Backtweets: 200
542
+ Backtweets: 500
543
+ RubyGems: 200
544
+ RubyGems: 500
545
+ Backtweets: 500
546
+ Backtweets: 200
547
+ Backtweets: 200
548
+ Backtweets: 500
549
+ RubyGems: 200
550
+ RubyGems: 500
551
+ Backtweets: 500
552
+ Backtweets: 200
553
+ Backtweets: 200
554
+ Backtweets: 500
555
+ RubyGems: 200
556
+ RubyGems: 500
557
+ Backtweets: 500
558
+ Backtweets: 200
559
+ Backtweets: 200
560
+ Backtweets: 500
561
+ RubyGems: 200
562
+ RubyGems: 500
563
+ Backtweets: 500
564
+ Backtweets: 200
565
+ Backtweets: 200
566
+ Backtweets: 500
567
+ RubyGems: 200
568
+ RubyGems: 500
569
+ Backtweets: 500
570
+ Backtweets: 200
571
+ Backtweets: 200
572
+ Backtweets: 500
573
+ RubyGems: 200
574
+ RubyGems: 500
575
+ Backtweets: 500
576
+ Backtweets: 200
577
+ Backtweets: 200
578
+ Backtweets: 500
579
+ RubyGems: 200
580
+ RubyGems: 500
581
+ Backtweets: 200
582
+ Backtweets: 500
583
+ Backtweets: 200
584
+ Backtweets: 500
585
+ Backtweets: 200
586
+ Backtweets: 500
587
+ Backtweets: 500
588
+ Backtweets: 200
589
+ Backtweets: 500
590
+ Backtweets: 200
591
+ Backtweets: 500
592
+ Backtweets: 200
593
+ Backtweets: 500
594
+ Backtweets: 200
595
+ Backtweets: 500
596
+ Backtweets: 200
597
+ Backtweets: 500
598
+ Backtweets: 200
599
+ Backtweets: 200
600
+ Backtweets: 500
601
+ RubyGems: 200
602
+ RubyGems: 500
603
+ Backtweets: 500
604
+ Backtweets: 200
605
+ Backtweets: 200
606
+ Backtweets: 500
607
+ RubyGems: 200
608
+ RubyGems: 500
609
+ Backtweets: 500
610
+ Backtweets: 200
611
+ Backtweets: 200
612
+ Backtweets: 500
613
+ RubyGems: 200
614
+ RubyGems: 500
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "vanity-source"
3
- spec.version = "0.10"
3
+ spec.version = "0.11"
4
4
  spec.author = "Assaf Arkin"
5
5
  spec.email = "assaf@labnotes.org"
6
6
  spec.homepage = "http://vanitydash.com"
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  "--webcvs", "http://github.com/assaf/#{spec.name}"
15
15
 
16
16
  spec.required_ruby_version = '>= 1.8.7'
17
- spec.add_dependency "activesupport", "~>2.3"
18
- spec.add_dependency "json", "~>1.4"
19
- spec.add_dependency "rack", "~>1.2"
17
+ spec.add_dependency "activesupport"
18
+ spec.add_dependency "json"
19
+ spec.add_dependency "rack"
20
20
  end
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanity-source
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 10
9
- version: "0.10"
8
+ - 11
9
+ version: "0.11"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Assaf Arkin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-26 00:00:00 -07:00
17
+ date: 2010-08-30 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -23,13 +23,12 @@ dependencies:
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  none: false
25
25
  requirements:
26
- - - ~>
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
- hash: 5
28
+ hash: 3
29
29
  segments:
30
- - 2
31
- - 3
32
- version: "2.3"
30
+ - 0
31
+ version: "0"
33
32
  type: :runtime
34
33
  version_requirements: *id001
35
34
  - !ruby/object:Gem::Dependency
@@ -38,13 +37,12 @@ dependencies:
38
37
  requirement: &id002 !ruby/object:Gem::Requirement
39
38
  none: false
40
39
  requirements:
41
- - - ~>
40
+ - - ">="
42
41
  - !ruby/object:Gem::Version
43
- hash: 7
42
+ hash: 3
44
43
  segments:
45
- - 1
46
- - 4
47
- version: "1.4"
44
+ - 0
45
+ version: "0"
48
46
  type: :runtime
49
47
  version_requirements: *id002
50
48
  - !ruby/object:Gem::Dependency
@@ -53,13 +51,12 @@ dependencies:
53
51
  requirement: &id003 !ruby/object:Gem::Requirement
54
52
  none: false
55
53
  requirements:
56
- - - ~>
54
+ - - ">="
57
55
  - !ruby/object:Gem::Version
58
- hash: 11
56
+ hash: 3
59
57
  segments:
60
- - 1
61
- - 2
62
- version: "1.2"
58
+ - 0
59
+ version: "0"
63
60
  type: :runtime
64
61
  version_requirements: *id003
65
62
  description:
@@ -89,9 +86,13 @@ files:
89
86
  - test/cassettes/ruby_gems.yml
90
87
  - test/github_issues_test.rb
91
88
  - test/github_test.rb
89
+ - test/helpers/activity.rb
90
+ - test/helpers/metric.rb
91
+ - test/helpers/person.rb
92
+ - test/helpers/test.rb
92
93
  - test/ruby_gems_test.rb
94
+ - test/setup.rb
93
95
  - test/test.log
94
- - test/test_helper.rb
95
96
  - CHANGELOG
96
97
  - MIT-LICENSE
97
98
  - README.rdoc
@@ -105,7 +106,7 @@ licenses: []
105
106
  post_install_message:
106
107
  rdoc_options:
107
108
  - --title
108
- - Vanity::Source 0.10
109
+ - Vanity::Source 0.11
109
110
  - --main
110
111
  - README.rdoc
111
112
  - --webcvs