dash-bees 0.20 → 0.21
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 +8 -0
- data/lib/dash-fu/bee.rb +27 -1
- data/lib/dash-fu/bees/feed.rb +13 -11
- data/lib/dash-fu/bees/feed.yml +1 -1
- data/test/cassettes/feed.yml +56 -0
- data/test/feed_test.rb +56 -0
- data/test/test.log +43 -0
- metadata +3 -3
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
2010-09-20 v0.21 Improvements and bug fixes for feed source
|
2
|
+
|
3
|
+
Truncates long contents.
|
4
|
+
|
5
|
+
Now accepting feed: URLs and long input box.
|
6
|
+
|
7
|
+
Handles a few more error cases.
|
8
|
+
|
1
9
|
2010-09-20 v0.20 Added data source for Atom feeds
|
2
10
|
|
3
11
|
2010-09-20 v0.19 Fixed sometimes missing identity for Github
|
data/lib/dash-fu/bee.rb
CHANGED
@@ -10,7 +10,7 @@ module DashFu
|
|
10
10
|
# The README covers it all.
|
11
11
|
module Bee
|
12
12
|
|
13
|
-
VERSION = "0.
|
13
|
+
VERSION = "0.21"
|
14
14
|
|
15
15
|
class << self
|
16
16
|
attr_accessor :logger
|
@@ -203,6 +203,32 @@ module DashFu
|
|
203
203
|
end
|
204
204
|
alias :h :escape_html
|
205
205
|
|
206
|
+
|
207
|
+
# Truncates HTML without unbalanced elements/entities.
|
208
|
+
def truncate_html(html, limit = 30, ellipsis = "...")
|
209
|
+
# Inspiration: http://pastie.textmate.org/145402
|
210
|
+
doc = Nokogiri::XML(html)
|
211
|
+
ellipsis_length = Nokogiri::XML(ellipsis).text.length
|
212
|
+
content_length = doc.text.length
|
213
|
+
return html if content_length <= limit
|
214
|
+
truncate = lambda do |node, max|
|
215
|
+
break node if node.text.length <= max
|
216
|
+
node.children.each do |child|
|
217
|
+
if max <= 0
|
218
|
+
child.remove
|
219
|
+
elsif child.text?
|
220
|
+
child.content = child.text[0,max]
|
221
|
+
max -= child.content.length
|
222
|
+
else
|
223
|
+
truncate[child, max]
|
224
|
+
end
|
225
|
+
end
|
226
|
+
node
|
227
|
+
end
|
228
|
+
truncate[doc, limit - ellipsis_length].to_html.strip + ellipsis
|
229
|
+
end
|
230
|
+
|
231
|
+
|
206
232
|
# Returns API key for this source. May return string or hash, depending on
|
207
233
|
# the API.
|
208
234
|
def api_key
|
data/lib/dash-fu/bees/feed.rb
CHANGED
@@ -12,7 +12,8 @@ module DashFu::Bee
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def validate(source)
|
15
|
-
|
15
|
+
unfeed = source["url"].gsub(/^feed:\/\//, "http://").gsub(/^feed:/, "")
|
16
|
+
uri = URI.parse(unfeed) rescue nil
|
16
17
|
raise "Not a valid URL" unless uri && uri.absolute?
|
17
18
|
raise "Only HTTP/S URLs supported" unless uri.scheme == "http" || uri.scheme == "https"
|
18
19
|
begin
|
@@ -20,11 +21,11 @@ module DashFu::Bee
|
|
20
21
|
code = io.status.first
|
21
22
|
raise "Cannot read this feed, got status code #{code}" unless code == "200"
|
22
23
|
feed = (Nokogiri::XML(io.read)>"feed").first
|
23
|
-
source["title"] = get_text(feed>"title").strip
|
24
|
-
|
25
|
-
permalink =
|
26
|
-
source["permalink"] = permalink["href"] if permalink
|
24
|
+
source["source.name"] = source["title"] = get_text(feed>"title").strip
|
25
|
+
alt = (feed>"link[rel=alternate]").first
|
26
|
+
source["permalink"] = alt["href"] if alt
|
27
27
|
source["logo"] = (feed>"logo").text
|
28
|
+
source["url"] = uri.to_s
|
28
29
|
end
|
29
30
|
rescue
|
30
31
|
raise "Cannot read this feed: is it down for you or just for us?"
|
@@ -43,7 +44,7 @@ module DashFu::Bee
|
|
43
44
|
updated = Time.iso8601((feed>"updated").text) rescue Time.now
|
44
45
|
if source["updated"].nil? || updated > source["updated"]
|
45
46
|
(feed>"entry").each do |entry|
|
46
|
-
published = Time.iso8601((
|
47
|
+
published = Time.iso8601(entry.css("published,updated").first.text) rescue Time.now
|
47
48
|
break unless source["updated"].nil? || updated >= published
|
48
49
|
if author = (entry>"author").first
|
49
50
|
person = { fullname: (author>"name").text, email: (author>"email").text,
|
@@ -90,14 +91,15 @@ module DashFu::Bee
|
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
93
|
-
def get_html(elements)
|
94
|
+
def get_html(elements, length = 250)
|
94
95
|
element = elements.first
|
95
96
|
return unless element
|
96
|
-
case element["type"]
|
97
|
-
when "html" ;
|
98
|
-
when "xhtml" ;
|
99
|
-
when "text"; element.text
|
97
|
+
html = case element["type"]
|
98
|
+
when "html" ; element.text
|
99
|
+
when "xhtml" ; element.to_html
|
100
|
+
when "text"; element.text
|
100
101
|
end
|
102
|
+
Sanitize.clean(truncate_html(html.to_s.strip, length), Sanitize::Config::BASIC.merge(output: :html)).strip
|
101
103
|
end
|
102
104
|
|
103
105
|
end
|
data/lib/dash-fu/bees/feed.yml
CHANGED
data/test/cassettes/feed.yml
CHANGED
@@ -81,3 +81,59 @@
|
|
81
81
|
</content>
|
82
82
|
</entry>
|
83
83
|
</feed>
|
84
|
+
- !ruby/struct:VCR::HTTPInteraction
|
85
|
+
request: !ruby/struct:VCR::Request
|
86
|
+
method: :get
|
87
|
+
uri: http://example.org:80/update.xml
|
88
|
+
response: !ruby/struct:VCR::Response
|
89
|
+
status: !ruby/struct:VCR::ResponseStatus
|
90
|
+
code: 200
|
91
|
+
message: OK
|
92
|
+
body: |-
|
93
|
+
<?xml version="1.0" encoding="utf-8"?>
|
94
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
95
|
+
<title type="text">dive into mark</title>
|
96
|
+
<entry>
|
97
|
+
<title>Atom draft-07 snapshot</title>
|
98
|
+
<updated>2003-12-13T08:29:29-04:00</updated>
|
99
|
+
</entry>
|
100
|
+
</feed>
|
101
|
+
- !ruby/struct:VCR::HTTPInteraction
|
102
|
+
request: !ruby/struct:VCR::Request
|
103
|
+
method: :get
|
104
|
+
uri: http://example.org:80/html.xml
|
105
|
+
response: !ruby/struct:VCR::Response
|
106
|
+
status: !ruby/struct:VCR::ResponseStatus
|
107
|
+
code: 200
|
108
|
+
message: OK
|
109
|
+
body: |-
|
110
|
+
<?xml version="1.0" encoding="utf-8"?>
|
111
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
112
|
+
<title type="text">dive into mark</title>
|
113
|
+
<entry>
|
114
|
+
<title>Atom draft-07 snapshot</title>
|
115
|
+
<content type="html"><i>HTML <br> content</i></content>
|
116
|
+
</entry>
|
117
|
+
</feed>
|
118
|
+
- !ruby/struct:VCR::HTTPInteraction
|
119
|
+
request: !ruby/struct:VCR::Request
|
120
|
+
method: :get
|
121
|
+
uri: http://example.org:80/truncated.xml
|
122
|
+
response: !ruby/struct:VCR::Response
|
123
|
+
status: !ruby/struct:VCR::ResponseStatus
|
124
|
+
code: 200
|
125
|
+
message: OK
|
126
|
+
body: |-
|
127
|
+
<?xml version="1.0" encoding="utf-8"?>
|
128
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
129
|
+
<title type="text">dive into mark</title>
|
130
|
+
<entry>
|
131
|
+
<title>Atom draft-07 snapshot</title>
|
132
|
+
<content type="xhtml">
|
133
|
+
<p><em>Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated
|
134
|
+
Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated
|
135
|
+
Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated Truncated
|
136
|
+
</em></p>
|
137
|
+
</content>
|
138
|
+
</entry>
|
139
|
+
</feed>
|
data/test/feed_test.rb
CHANGED
@@ -34,8 +34,19 @@ test DashFu::Bee::Feed do
|
|
34
34
|
source.setup "url"=>"http://example.org/feed.xml"
|
35
35
|
assert_equal "The Awesome Feed", source.name
|
36
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
|
37
47
|
end
|
38
48
|
|
49
|
+
|
39
50
|
context "update" do
|
40
51
|
setup { source.setup "url"=>"http://example.org/feed.xml" }
|
41
52
|
|
@@ -119,8 +130,52 @@ posted <a href=\"http://example.org/2005/04/02/atom\">Atom draft-07 snapshot</a>
|
|
119
130
|
end
|
120
131
|
end
|
121
132
|
|
133
|
+
context "with update but no published date" do
|
134
|
+
setup do
|
135
|
+
source.setup "url"=>"http://example.org/update.xml"
|
136
|
+
source.update
|
137
|
+
end
|
138
|
+
subject { source.activity }
|
139
|
+
|
140
|
+
should "capture published date" do
|
141
|
+
assert_equal Time.parse("2003-12-13T08:29:29-04:00"), subject.timestamp
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "with HTML content" do
|
146
|
+
setup do
|
147
|
+
source.setup "url"=>"http://example.org/html.xml"
|
148
|
+
source.update
|
149
|
+
end
|
150
|
+
subject { source.activity }
|
151
|
+
|
152
|
+
should "capture title and summary" do
|
153
|
+
assert_equal <<-HTML.strip, subject.html
|
154
|
+
posted <a href=\"\">Atom draft-07 snapshot</a>:
|
155
|
+
<blockquote><i>HTML <br> content</i></blockquote>
|
156
|
+
HTML
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context "with truncated content" do
|
161
|
+
setup do
|
162
|
+
source.setup "url"=>"http://example.org/truncated.xml"
|
163
|
+
source.update
|
164
|
+
end
|
165
|
+
subject { source.activity }
|
166
|
+
|
167
|
+
should "capture title and summary" do
|
168
|
+
assert_equal <<-HTML.strip, subject.html
|
169
|
+
posted <a href=\"\">Atom draft-07 snapshot</a>:
|
170
|
+
<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
|
+
...</blockquote>
|
172
|
+
HTML
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
122
176
|
end
|
123
177
|
|
178
|
+
|
124
179
|
context "meta" do
|
125
180
|
setup { source.setup "url"=>"http://example.org/feed.xml" }
|
126
181
|
subject { source.meta }
|
@@ -129,4 +184,5 @@ posted <a href=\"http://example.org/2005/04/02/atom\">Atom draft-07 snapshot</a>
|
|
129
184
|
assert_contains subject, :title=>"Source", :text=>"dive into mark", :url=>"http://example.org/"
|
130
185
|
end
|
131
186
|
end
|
187
|
+
|
132
188
|
end
|
data/test/test.log
CHANGED
@@ -1008,3 +1008,46 @@ RubyGems: 500
|
|
1008
1008
|
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1009
1009
|
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1010
1010
|
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1011
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1012
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1013
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1014
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1015
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1016
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1017
|
+
#<NoMethodError: undefined method `[]' for nil:NilClass>
|
1018
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1019
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1020
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1021
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1022
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1023
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1024
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1025
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1026
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1027
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1028
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1029
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1030
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1031
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1032
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1033
|
+
#<NoMethodError: undefined method `children=' for #<Nokogiri::XML::Element:0x000001015ba0e8>>
|
1034
|
+
#<NoMethodError: undefined method `children=' for #<Nokogiri::XML::Element:0x000001012e51b0>>
|
1035
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1036
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1037
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1038
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1039
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1040
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1041
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1042
|
+
#<NoMethodError: undefined method `>' for nil:NilClass>
|
1043
|
+
#<NoMethodError: undefined method `>' for nil:NilClass>
|
1044
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1045
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1046
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1047
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1048
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1049
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1050
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1051
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1052
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
1053
|
+
#<NoMethodError: undefined method `namespaces' for nil:NilClass>
|
metadata
CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
version: "0.
|
7
|
+
- 21
|
8
|
+
version: "0.21"
|
9
9
|
platform: ruby
|
10
10
|
authors:
|
11
11
|
- Assaf Arkin
|
@@ -146,7 +146,7 @@ licenses: []
|
|
146
146
|
post_install_message:
|
147
147
|
rdoc_options:
|
148
148
|
- --title
|
149
|
-
- DashFu::Bee 0.
|
149
|
+
- DashFu::Bee 0.21
|
150
150
|
- --main
|
151
151
|
- README.rdoc
|
152
152
|
- --webcvs
|