dash-bees 0.21 → 0.22
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +13 -0
- data/Gemfile +0 -1
- data/dash-bees.gemspec +1 -1
- data/lib/dash-fu/bee.rb +7 -43
- data/lib/dash-fu/bee/fields.rb +17 -0
- data/lib/dash-fu/bee/http_session.rb +44 -0
- data/lib/dash-fu/bee/version.rb +5 -0
- data/lib/dash-fu/bees/backtweets.rb +17 -11
- data/lib/dash-fu/bees/feed.rb +23 -18
- data/lib/dash-fu/bees/feed.yml +1 -1
- data/lib/dash-fu/bees/github.rb +12 -7
- data/lib/dash-fu/bees/github_issues.rb +13 -11
- data/lib/dash-fu/bees/ruby_gems.rb +11 -7
- data/test/backtweets_test.rb +60 -63
- data/test/cassettes/backtweets.yml +2 -2
- data/test/cassettes/feed.yml +1 -0
- data/test/feed_test.rb +82 -80
- data/test/github_issues_test.rb +101 -91
- data/test/github_test.rb +105 -93
- data/test/helpers/activity.rb +5 -1
- data/test/helpers/source.rb +16 -9
- data/test/helpers/test.rb +24 -27
- data/test/ruby_gems_test.rb +72 -67
- data/test/setup.rb +15 -17
- data/test/test.log +1208 -0
- metadata +7 -4
data/test/backtweets_test.rb
CHANGED
@@ -1,134 +1,140 @@
|
|
1
1
|
require_relative "setup"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
setup { source.setup "url"=>"vanity.labnotes.org" }
|
3
|
+
describe "Backtweets" do
|
4
|
+
testing :backtweets
|
6
5
|
|
7
|
-
|
6
|
+
describe "setup" do
|
7
|
+
before { source.setup "url"=>"vanity.labnotes.org" }
|
8
|
+
|
9
|
+
it "should use normalize URL and remove scheme" do
|
8
10
|
source.setup "url"=>"http://Vanity.Labnotes.Org"
|
9
11
|
assert_equal "Tweets for vanity.labnotes.org", source.name
|
10
12
|
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
it "should set origin to Backtweets search page" do
|
15
|
+
assert_equal "Backtweets for vanity.labnotes.org", source.origin[:text]
|
16
|
+
assert_equal "http://backtweets.com/search?q=http://vanity.labnotes.org/", source.origin[:url]
|
17
|
+
end
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
|
19
|
+
it "should use URL in name" do
|
20
|
+
assert_equal "Tweets for vanity.labnotes.org", source.name
|
21
|
+
end
|
18
22
|
|
19
|
-
|
20
|
-
|
23
|
+
describe "metric" do
|
24
|
+
it "should measure totals" do
|
25
|
+
assert source.metric.totals
|
21
26
|
end
|
22
27
|
|
23
|
-
should
|
24
|
-
assert
|
28
|
+
it "should capture tweets" do
|
29
|
+
assert source.metric.columns.include?(id: "tweets", label: "Tweets")
|
25
30
|
end
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
29
34
|
|
30
|
-
|
31
|
-
should
|
32
|
-
|
35
|
+
describe "validation" do
|
36
|
+
it "should raise error if URL missing" do
|
37
|
+
assert_raises(RuntimeError) { source.setup "url"=>" " }
|
33
38
|
end
|
34
39
|
|
35
|
-
should
|
40
|
+
it "should create valid metric" do
|
36
41
|
source.setup "url"=>"vanity.labnotes.org"
|
37
42
|
assert source.valid?
|
38
43
|
end
|
39
44
|
end
|
40
45
|
|
41
46
|
|
42
|
-
|
43
|
-
|
47
|
+
describe "update" do
|
48
|
+
before { source.setup "url"=>"vanity.labnotes.org" }
|
44
49
|
|
45
|
-
should
|
50
|
+
it "should include API key" do
|
46
51
|
source.update
|
47
|
-
assert_requested :get, "http://backtweets.com/search.json?key=4554feeeeeeeeeeeeeee&q=vanity.labnotes.org"
|
52
|
+
assert_requested :get, "http://backtweets.com/search.json?key=4554feeeeeeeeeeeeeee&q=http://vanity.labnotes.org/"
|
48
53
|
end
|
49
54
|
|
50
|
-
should
|
55
|
+
it "should properly encode URL" do
|
51
56
|
stub_request(:get, /backtweets.com/).to_return body: interactions.first.response.body
|
52
|
-
source.setup "url"=>"need&this=encoded"
|
57
|
+
source.setup "url"=>"http://foo?need&this=encoded"
|
53
58
|
source.update
|
54
|
-
assert_requested :get, "http://backtweets.com/search.json?key=#{bee.send :api_key}&q=need%26this%3Dencoded"
|
59
|
+
assert_requested :get, "http://backtweets.com/search.json?key=#{bee.send :api_key}&q=http://foo/?need%26this%3Dencoded"
|
55
60
|
end
|
56
61
|
|
57
|
-
should
|
62
|
+
it "should handle errors" do
|
58
63
|
stub_request(:get, interactions.first.uri).to_return status: 500
|
59
64
|
source.update
|
60
65
|
assert_equal "Last request didn't go as expected, trying again later", source.last_error
|
61
66
|
end
|
62
67
|
|
63
|
-
should
|
68
|
+
it "should handle invalid document entity" do
|
64
69
|
stub_request(:get, interactions.first.uri).to_return body: "Not JSON"
|
65
70
|
source.update
|
66
71
|
assert_equal "Last request didn't go as expected, trying again later", source.last_error
|
67
72
|
end
|
68
73
|
|
69
|
-
should
|
74
|
+
it "should capture number of tweets" do
|
70
75
|
source.update
|
71
76
|
assert_equal({ tweets: 2 }, source.metric.values)
|
72
77
|
end
|
73
78
|
|
74
|
-
|
75
|
-
|
76
|
-
subject { source.activity }
|
79
|
+
describe "activity" do
|
80
|
+
before { source.update }
|
77
81
|
|
78
|
-
should
|
79
|
-
assert_equal "20959239143",
|
82
|
+
it "should capture tweet identifier" do
|
83
|
+
assert_equal "20959239143", activity.uid
|
80
84
|
end
|
81
85
|
|
82
|
-
should
|
83
|
-
assert_equal <<-HTML,
|
86
|
+
it "should capture tweet text" do
|
87
|
+
assert_equal <<-HTML, activity.html
|
84
88
|
<a href="http://twitter.com/dude/20959239143">tweeted</a>:
|
85
89
|
<blockquote>Super awesome <a href="http://vanity.labnotes.org/">http://j.mp/aOrUnsz</a></blockquote>
|
86
90
|
HTML
|
87
91
|
end
|
88
92
|
|
89
|
-
should
|
90
|
-
assert_equal "http://twitter.com/dude/20959239143",
|
93
|
+
it "should capture tweet URL" do
|
94
|
+
assert_equal "http://twitter.com/dude/20959239143", activity.url
|
91
95
|
end
|
92
96
|
|
93
|
-
should
|
94
|
-
assert_equal Time.parse("2010-8-12T08:30:04").utc,
|
97
|
+
it "should capture tweet timestamp" do
|
98
|
+
assert_equal Time.parse("2010-8-12T08:30:04").utc, activity.timestamp
|
95
99
|
end
|
96
100
|
|
97
|
-
should
|
98
|
-
|
99
|
-
|
101
|
+
it "should tag as tweeter and mention" do
|
102
|
+
assert activity.tags.include?("twitter")
|
103
|
+
assert activity.tags.include?("mention")
|
100
104
|
end
|
101
105
|
|
102
|
-
|
103
|
-
assert
|
106
|
+
it "should mark as public" do
|
107
|
+
assert activity.public?
|
104
108
|
end
|
105
109
|
|
106
|
-
|
107
|
-
|
110
|
+
it "should be valid" do
|
111
|
+
assert activity.valid?
|
112
|
+
end
|
108
113
|
|
109
|
-
|
110
|
-
|
114
|
+
describe "author" do
|
115
|
+
it "should capture full name" do
|
116
|
+
assert_equal "dude", person.fullname
|
111
117
|
end
|
112
118
|
|
113
|
-
should
|
114
|
-
|
119
|
+
it "should capture screen name" do
|
120
|
+
assert person.identities.include?("twitter.com:dude")
|
115
121
|
end
|
116
122
|
|
117
|
-
should
|
118
|
-
assert_equal "http://img.tweetimag.es/i/dude_n",
|
123
|
+
it "should capture photo" do
|
124
|
+
assert_equal "http://img.tweetimag.es/i/dude_n", person.photo_url
|
119
125
|
end
|
120
126
|
end
|
121
127
|
end
|
122
128
|
|
123
|
-
|
124
|
-
|
129
|
+
describe "repeating" do
|
130
|
+
before do
|
125
131
|
source.update
|
126
132
|
second = interactions.last
|
127
133
|
stub_request(:get, second.uri).to_return body: second.response.body
|
128
134
|
source.update
|
129
135
|
end
|
130
136
|
|
131
|
-
should
|
137
|
+
it "should capture new tweets" do
|
132
138
|
assert_equal 3, source.activities.count
|
133
139
|
assert_match "The last of its kind", source.activity.html
|
134
140
|
end
|
@@ -136,13 +142,4 @@ test DashFu::Bee::Backtweets do
|
|
136
142
|
end
|
137
143
|
end
|
138
144
|
|
139
|
-
|
140
|
-
context "meta" do
|
141
|
-
setup { source.setup "url"=>"vanity.labnotes.org" }
|
142
|
-
subject { source.meta }
|
143
|
-
|
144
|
-
should "link to search results" do
|
145
|
-
assert subject.include?(text: "Search yourself", url: "http://backtweets.com/search?q=vanity.labnotes.org")
|
146
|
-
end
|
147
|
-
end
|
148
145
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
- !ruby/struct:VCR::HTTPInteraction
|
3
3
|
request: !ruby/struct:VCR::Request
|
4
4
|
method: :get
|
5
|
-
uri: http://backtweets.com:80/search.json?key=4554feeeeeeeeeeeeeee&q=vanity.labnotes.org
|
5
|
+
uri: http://backtweets.com:80/search.json?key=4554feeeeeeeeeeeeeee&q=http://vanity.labnotes.org/
|
6
6
|
body:
|
7
7
|
headers:
|
8
8
|
accept:
|
@@ -39,7 +39,7 @@
|
|
39
39
|
- !ruby/struct:VCR::HTTPInteraction
|
40
40
|
request: !ruby/struct:VCR::Request
|
41
41
|
method: :get
|
42
|
-
uri: http://backtweets.com:80/search.json?key=4554feeeeeeeeeeeeeee&q=vanity.labnotes.org
|
42
|
+
uri: http://backtweets.com:80/search.json?key=4554feeeeeeeeeeeeeee&q=http://vanity.labnotes.org/
|
43
43
|
body:
|
44
44
|
response: !ruby/struct:VCR::Response
|
45
45
|
status: !ruby/struct:VCR::ResponseStatus
|
data/test/cassettes/feed.yml
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
</subtitle>
|
18
18
|
<updated>2005-07-31T12:29:29Z</updated>
|
19
19
|
<id>tag:example.org,2003:3</id>
|
20
|
+
<icon>http://www.flickr.com/photos/nerduo/3770972018/</icon>
|
20
21
|
<link rel="alternate" type="text/html"
|
21
22
|
hreflang="en" href="http://example.org/"/>
|
22
23
|
<link rel="self" type="application/atom+xml"
|
data/test/feed_test.rb
CHANGED
@@ -1,171 +1,182 @@
|
|
1
1
|
require_relative "setup"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
describe "Feed" do
|
4
|
+
testing :feed
|
5
|
+
|
6
|
+
describe "setup" do
|
7
|
+
before { source.setup "url"=>"http://example.org/feed.xml" }
|
8
|
+
|
9
|
+
it "should link to site" do
|
10
|
+
assert_equal "dive into mark", source.origin[:text]
|
11
|
+
assert_equal "http://example.org/", source.origin[:url]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should set source name from feed title" do
|
15
|
+
stub_request(:get, "http://example.org/feed.xml").to_return body: { title: "The Awesome Feed" }.to_xml(root: "feed")
|
16
|
+
source.setup "url"=>"http://example.org/feed.xml"
|
17
|
+
assert_equal "The Awesome Feed", source.name
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set source name from feed URL if no title" do
|
21
|
+
stub_request(:get, "http://example.org/feed.xml").to_return body: { title: "" }.to_xml(root: "feed")
|
22
|
+
source.setup "url"=>"http://example.org/feed.xml"
|
23
|
+
assert_equal "http://example.org/feed.xml", source.name
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should provide site icon" do
|
27
|
+
assert_equal "http://www.flickr.com/photos/nerduo/3770972018/", source.fields[ICON]
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should accept feed URL (short form)" do
|
31
|
+
source.setup "url"=>"feed://example.org/feed.xml"
|
32
|
+
assert_equal "dive into mark", source.name
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should accept feed URL (long form)" do
|
36
|
+
source.setup "url"=>"feed:http://example.org/feed.xml"
|
37
|
+
assert_equal "dive into mark", source.name
|
38
|
+
end
|
6
39
|
end
|
7
40
|
|
8
|
-
|
9
|
-
|
41
|
+
|
42
|
+
describe "validation" do
|
43
|
+
it "should fail if URL is invalid" do
|
10
44
|
assert_raises(RuntimeError) { source.setup("url"=>"/feed.xml") }
|
11
45
|
end
|
12
46
|
|
13
|
-
should
|
47
|
+
it "should fail if URL is not HTTP" do
|
14
48
|
assert_raises(RuntimeError) { source.setup("url"=>"ftp://example.org/feed.xml") }
|
15
49
|
end
|
16
50
|
|
17
|
-
should
|
51
|
+
it "should fail if URL is not accessible" do
|
18
52
|
stub_request(:get, "http://example.org/feed.xml").to_timeout
|
19
53
|
assert_raises(RuntimeError) { source.setup("url"=>"http://example.org/feed.xml") }
|
20
54
|
end
|
21
55
|
|
22
|
-
should
|
56
|
+
it "should fail if status is not 200" do
|
23
57
|
stub_request(:get, "http://example.org/feed.xml").to_return status: 400
|
24
58
|
assert_raises(RuntimeError) { source.setup("url"=>"http://example.org/feed.xml") }
|
25
59
|
end
|
26
60
|
|
27
|
-
should
|
61
|
+
it "should fail if document is not a feed" do
|
28
62
|
stub_request(:get, "http://example.org/feed.xml").to_return body: { not: "feed" }.to_json
|
29
63
|
assert_raises(RuntimeError) { source.setup("url"=>"http://example.org/feed.xml") }
|
30
64
|
end
|
31
|
-
|
32
|
-
should "set source name from feed title" do
|
33
|
-
stub_request(:get, "http://example.org/feed.xml").to_return body: { title: "The Awesome Feed" }.to_xml(root: "feed")
|
34
|
-
source.setup "url"=>"http://example.org/feed.xml"
|
35
|
-
assert_equal "The Awesome Feed", source.name
|
36
|
-
end
|
37
|
-
|
38
|
-
should "accept feed URL (short form)" do
|
39
|
-
source.setup "url"=>"feed://example.org/feed.xml"
|
40
|
-
assert_equal "dive into mark", source.name
|
41
|
-
end
|
42
|
-
|
43
|
-
should "accept feed URL (long form)" do
|
44
|
-
source.setup "url"=>"feed:http://example.org/feed.xml"
|
45
|
-
assert_equal "dive into mark", source.name
|
46
|
-
end
|
47
65
|
end
|
48
66
|
|
49
67
|
|
50
|
-
|
51
|
-
|
68
|
+
describe "update" do
|
69
|
+
before { source.setup "url"=>"http://example.org/feed.xml" }
|
52
70
|
|
53
|
-
should
|
71
|
+
it "should handle 401" do
|
54
72
|
stub_request(:get, interactions.first.uri).to_return :status=>404
|
55
73
|
source.update
|
56
74
|
assert_equal "Could not find the feed http://example.org/feed.xml", source.last_error
|
57
75
|
end
|
58
76
|
|
59
|
-
should
|
77
|
+
it "should handle 401" do
|
60
78
|
stub_request(:get, interactions.first.uri).to_return :status=>401
|
61
79
|
source.update
|
62
80
|
assert_equal "You are not authorized to access this feed", source.last_error
|
63
81
|
end
|
64
82
|
|
65
|
-
should
|
83
|
+
it "should handle other error" do
|
66
84
|
stub_request(:get, interactions.first.uri).to_return :status=>500
|
67
85
|
source.update
|
68
86
|
assert_equal "Last request didn't go as expected, trying again later", source.last_error
|
69
87
|
end
|
70
88
|
|
71
|
-
should
|
89
|
+
it "should handle invlid document entity" do
|
72
90
|
stub_request(:get, interactions.first.uri).to_return :body=>"Not a feed"
|
73
91
|
source.update
|
74
92
|
assert_equal "Last request didn't go as expected, trying again later", source.last_error
|
75
93
|
end
|
76
94
|
|
77
|
-
|
78
|
-
|
79
|
-
subject { source.activity }
|
95
|
+
describe "activity" do
|
96
|
+
before { source.update }
|
80
97
|
|
81
|
-
should
|
82
|
-
assert_equal "tag:example.org,2003:3.2397",
|
98
|
+
it "should capture entry id" do
|
99
|
+
assert_equal "tag:example.org,2003:3.2397", activity.uid
|
83
100
|
end
|
84
101
|
|
85
|
-
should
|
86
|
-
assert_equal Time.parse("2003-12-13T08:29:29-04:00"),
|
102
|
+
it "should capture published date" do
|
103
|
+
assert_equal Time.parse("2003-12-13T08:29:29-04:00"), activity.timestamp
|
87
104
|
end
|
88
105
|
|
89
|
-
should
|
90
|
-
assert_equal "http://example.org/2005/04/02/atom",
|
106
|
+
it "should capture URL" do
|
107
|
+
assert_equal "http://example.org/2005/04/02/atom", activity.url
|
91
108
|
end
|
92
109
|
|
93
|
-
should
|
94
|
-
assert_equal <<-HTML.strip,
|
110
|
+
it "should capture title and content" do
|
111
|
+
assert_equal <<-HTML.strip, activity.html
|
95
112
|
posted <a href=\"http://example.org/2005/04/02/atom\">Atom draft-07 snapshot</a>:
|
96
113
|
<blockquote><p><i>[Update: The Atom draft is finished.]</i></p></blockquote>
|
97
114
|
HTML
|
98
115
|
end
|
99
116
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
should "capture full name" do
|
104
|
-
assert_equal "Mark Pilgrim", subject.fullname
|
117
|
+
describe "person" do
|
118
|
+
it "should capture full name" do
|
119
|
+
assert_equal "Mark Pilgrim", person.fullname
|
105
120
|
end
|
106
121
|
|
107
|
-
should
|
108
|
-
assert_equal "f8dy@example.com",
|
122
|
+
it "should capture email" do
|
123
|
+
assert_equal "f8dy@example.com", person.email
|
109
124
|
end
|
110
125
|
|
111
|
-
should
|
112
|
-
|
126
|
+
it "should capture identity" do
|
127
|
+
assert person.identities.include?("http://example.org/")
|
113
128
|
end
|
114
129
|
end
|
115
130
|
|
116
131
|
end
|
117
132
|
|
118
|
-
|
119
|
-
|
133
|
+
describe "with summary" do
|
134
|
+
before do
|
120
135
|
source.setup "url"=>"http://example.org/summary.xml"
|
121
136
|
source.update
|
122
137
|
end
|
123
|
-
subject { source.activity }
|
124
138
|
|
125
|
-
should
|
126
|
-
assert_equal <<-HTML.strip,
|
139
|
+
it "should capture title and summary" do
|
140
|
+
assert_equal <<-HTML.strip, activity.html
|
127
141
|
posted <a href=\"http://example.org/2005/04/02/atom\">Atom draft-07 snapshot</a>:
|
128
142
|
<blockquote><q>Quickly stated</q></blockquote>
|
129
143
|
HTML
|
130
144
|
end
|
131
145
|
end
|
132
146
|
|
133
|
-
|
134
|
-
|
147
|
+
describe "with update but no published date" do
|
148
|
+
before do
|
135
149
|
source.setup "url"=>"http://example.org/update.xml"
|
136
150
|
source.update
|
137
151
|
end
|
138
|
-
subject { source.activity }
|
139
152
|
|
140
|
-
should
|
141
|
-
assert_equal Time.parse("2003-12-13T08:29:29-04:00"),
|
153
|
+
it "should capture published date" do
|
154
|
+
assert_equal Time.parse("2003-12-13T08:29:29-04:00"), activity.timestamp
|
142
155
|
end
|
143
156
|
end
|
144
157
|
|
145
|
-
|
146
|
-
|
158
|
+
describe "with HTML content" do
|
159
|
+
before do
|
147
160
|
source.setup "url"=>"http://example.org/html.xml"
|
148
161
|
source.update
|
149
162
|
end
|
150
|
-
subject { source.activity }
|
151
163
|
|
152
|
-
should
|
153
|
-
assert_equal <<-HTML.strip,
|
164
|
+
it "should capture title and summary" do
|
165
|
+
assert_equal <<-HTML.strip, activity.html
|
154
166
|
posted <a href=\"\">Atom draft-07 snapshot</a>:
|
155
167
|
<blockquote><i>HTML <br> content</i></blockquote>
|
156
168
|
HTML
|
157
169
|
end
|
158
170
|
end
|
159
171
|
|
160
|
-
|
161
|
-
|
172
|
+
describe "with truncated content" do
|
173
|
+
before do
|
162
174
|
source.setup "url"=>"http://example.org/truncated.xml"
|
163
175
|
source.update
|
164
176
|
end
|
165
|
-
subject { source.activity }
|
166
177
|
|
167
|
-
should
|
168
|
-
assert_equal <<-HTML.strip,
|
178
|
+
it "should capture title and summary" do
|
179
|
+
assert_equal <<-HTML.strip, activity.html
|
169
180
|
posted <a href=\"\">Atom draft-07 snapshot</a>:
|
170
181
|
<blockquote><p><em>Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated\n Truncated Truncated Truncated Truncated Truncated Truncat</em></p>
|
171
182
|
...</blockquote>
|
@@ -176,13 +187,4 @@ posted <a href=\"\">Atom draft-07 snapshot</a>:
|
|
176
187
|
end
|
177
188
|
|
178
189
|
|
179
|
-
context "meta" do
|
180
|
-
setup { source.setup "url"=>"http://example.org/feed.xml" }
|
181
|
-
subject { source.meta }
|
182
|
-
|
183
|
-
should "link to site" do
|
184
|
-
assert_contains subject, :title=>"Source", :text=>"dive into mark", :url=>"http://example.org/"
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
190
|
end
|