feed-abstract 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -4,3 +4,4 @@ pkg/*
4
4
  Gemfile.lock
5
5
  *.swp
6
6
  .rvmrc
7
+ coverage/
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "feed-abstract"
8
- s.version = "0.0.10"
8
+ s.version = "0.0.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Daniel Collis-Puro"]
12
- s.date = "2012-02-19"
12
+ s.date = "2012-03-20"
13
13
  s.description = "This library creates a common object graph for the RSS/Atom/RDF parsing classes in the ruby standard library. This allows you parse different feed formats and get back the same (or at least a very similar) set of results - item authors are accessible under an \"author(s)\" attribute, categories/tags/subjects are accessible under \"category(ies)\" attributes, etc. We do our best to make sure the data makes sense, too - RSS items lack an \"updated\" attribute, so we use \"pubDate\" to populate it. "
14
14
  s.email = ["djcp@cyber.law.harvard.edu"]
15
15
  s.extra_rdoc_files = [
@@ -49,6 +49,7 @@ Gem::Specification.new do |s|
49
49
  "spec/test_data/katanapg.atom",
50
50
  "spec/test_data/oa.africa.rss",
51
51
  "spec/test_data/pyblosxom.atom",
52
+ "spec/test_data/twitter_hashtag.atom",
52
53
  "spec/test_data/zotero.rss"
53
54
  ]
54
55
  s.homepage = "https://github.com/berkmancenter/feed-abstract"
@@ -30,6 +30,10 @@ module FeedAbstract
30
30
  def generator
31
31
  if self.link.match(/zotero\.org/)
32
32
  return 'Zotero'
33
+ elsif self.link.match(/wordpress\.com/)
34
+ return 'WordPress'
35
+ elsif self.link.match(/https?:\/\/.*\.?twitter\.com/i)
36
+ return 'Twitter'
33
37
  end
34
38
  return '' if @feed.generator.nil?
35
39
  @feed.generator.content
@@ -30,7 +30,7 @@ module FeedAbstract
30
30
  return 'WordPress'
31
31
  elsif @feed.channel.link.match(/www\.delicious\.com/i)
32
32
  return 'Delicious'
33
- elsif @feed.channel.link.match(/https?:\/\/twitter\.com/i)
33
+ elsif @feed.channel.link.match(/https?:\/\/.*\.?twitter\.com/i)
34
34
  return 'Twitter'
35
35
  end
36
36
  return '' if @feed.channel.generator.nil?
@@ -34,6 +34,9 @@ module FeedAbstract
34
34
  end
35
35
 
36
36
  def summary
37
+ if self.channel.generator == 'Twitter'
38
+ return self.title
39
+ end
37
40
  return '' if @item.summary.nil?
38
41
  @item.summary.content
39
42
  end
@@ -37,6 +37,9 @@ module FeedAbstractMixins
37
37
 
38
38
  # An array of author names
39
39
  def authors
40
+ if self.respond_to?(:channel) && self.channel.generator == 'Twitter'
41
+ return [@source.author.name.content.split(' ')[0]]
42
+ end
40
43
  return [] if @source.authors.empty?
41
44
  @source.authors.collect{|au| au.name.content}.reject{|au| au == '' || au.match(/^\s+$/)}
42
45
  end
@@ -49,6 +52,9 @@ module FeedAbstractMixins
49
52
 
50
53
  # The categories list as an array.
51
54
  def categories
55
+ if self.respond_to?(:channel) && self.channel.generator == 'Twitter'
56
+ return @source.title.content.scan(/#([^#\s]+)/).flatten
57
+ end
52
58
  return [] if @source.categories.empty?
53
59
  @source.categories.collect{|c| c.term}.reject{|c| c == '' || c.match(/^\s+$/)}
54
60
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module FeedAbstract
4
- VERSION = "0.0.10"
4
+ VERSION = "0.0.11"
5
5
  end
@@ -20,6 +20,7 @@ module FeedAbstract
20
20
  it { @pyblosxom.channel.should respond_to att}
21
21
  it { @chill.channel.should respond_to att}
22
22
  it { @twitter.channel.should respond_to att}
23
+ it { @twitter_atom.channel.should respond_to att}
23
24
 
24
25
  it { @docatom.channel.send(att).should_not == false}
25
26
  it { @kpgatom.channel.send(att).should_not == false}
@@ -32,6 +33,7 @@ module FeedAbstract
32
33
  it { @pyblosxom.channel.send(att).should_not == false}
33
34
  it { @chill.channel.send(att).should_not == false}
34
35
  it { @twitter.channel.send(att).should_not == false}
36
+ it { @twitter_atom.channel.send(att).should_not == false}
35
37
  end
36
38
 
37
39
  it "should have the correct title" do
@@ -46,6 +48,7 @@ module FeedAbstract
46
48
  @pyblosxom.channel.title.should == 'Copyrighteous'
47
49
  @chill.channel.title.should == 'Chilling Effects Clearinghouse Weather Reports'
48
50
  @twitter.channel.title.should == 'Twitter / djcp'
51
+ @twitter_atom.channel.title.should == '#rails - Twitter Search'
49
52
  end
50
53
 
51
54
  it "should have the correct subtitle and description" do
@@ -81,6 +84,9 @@ module FeedAbstract
81
84
 
82
85
  @twitter.channel.description.should == 'Twitter updates from Daniel Collis Puro / djcp.'
83
86
  @twitter.channel.subtitle.should == 'Twitter updates from Daniel Collis Puro / djcp.'
87
+
88
+ @twitter_atom.channel.description.should == ''
89
+ @twitter_atom.channel.subtitle.should == ''
84
90
  end
85
91
 
86
92
  it "should have the correct link" do
@@ -95,6 +101,7 @@ module FeedAbstract
95
101
  @pyblosxom.channel.link.should == 'http://mako.cc/copyrighteous'
96
102
  @chill.channel.link.should == 'http://www.chillingeffects.org'
97
103
  @twitter.channel.link.should == 'http://twitter.com/djcp'
104
+ @twitter_atom.channel.link.should == 'http://search.twitter.com/search?q=%23rails'
98
105
  end
99
106
 
100
107
  it "should have the correct generator" do
@@ -109,6 +116,7 @@ module FeedAbstract
109
116
  @pyblosxom.channel.generator.should == "\nPyBlosxom http://pyblosxom.sourceforge.net/ 1.5rc2 20100803\n"
110
117
  @chill.channel.generator.should == ''
111
118
  @twitter.channel.generator.should == 'Twitter'
119
+ @twitter_atom.channel.generator.should == 'Twitter'
112
120
  end
113
121
 
114
122
  it "should have the correct language" do
@@ -123,6 +131,7 @@ module FeedAbstract
123
131
  @pyblosxom.channel.language.should == 'en'
124
132
  @chill.channel.language.should == 'en-us'
125
133
  @twitter.channel.language.should == 'en-us'
134
+ @twitter_atom.channel.language.should == 'en-US'
126
135
  end
127
136
 
128
137
  it "should have the correct authors" do
@@ -137,6 +146,7 @@ module FeedAbstract
137
146
  @pyblosxom.channel.authors.should == ['Benjamin Mako Hill']
138
147
  @chill.channel.authors.should == ['Wendy Seltzer, wseltzer@chillingeffects.org']
139
148
  @twitter.channel.authors.should == []
149
+ @twitter_atom.channel.authors.should == []
140
150
 
141
151
  @docatom.channel.author.should == 'Doc Searls'
142
152
  @kpgatom.channel.author.should == 'Nick Pappas'
@@ -149,6 +159,7 @@ module FeedAbstract
149
159
  @pyblosxom.channel.author.should == 'Benjamin Mako Hill'
150
160
  @chill.channel.author.should == 'Wendy Seltzer, wseltzer@chillingeffects.org'
151
161
  @twitter.channel.author.should == ''
162
+ @twitter_atom.channel.author.should == ''
152
163
 
153
164
  end
154
165
 
@@ -164,6 +175,7 @@ module FeedAbstract
164
175
  @pyblosxom.channel.categories.should == []
165
176
  @chill.channel.categories.should == ['Your rights online']
166
177
  @twitter.channel.categories.should == []
178
+ @twitter_atom.channel.categories.should == []
167
179
 
168
180
  @docatom.channel.category.should == ''
169
181
  @kpgatom.channel.category.should == 'photos'
@@ -176,6 +188,7 @@ module FeedAbstract
176
188
  @pyblosxom.channel.category.should == ''
177
189
  @chill.channel.category.should == 'Your rights online'
178
190
  @twitter.channel.category.should == ''
191
+ @twitter_atom.channel.category.should == ''
179
192
  end
180
193
 
181
194
  it "should have the correct icon" do
@@ -190,6 +203,7 @@ module FeedAbstract
190
203
  @pyblosxom.channel.icon.should == ''
191
204
  @chill.channel.icon.should == 'http://images.chillingeffects.org/chilling_effects.gif'
192
205
  @twitter.channel.icon.should == ''
206
+ @twitter_atom.channel.icon.should == ''
193
207
  end
194
208
 
195
209
  it "should have the correct logo" do
@@ -204,6 +218,7 @@ module FeedAbstract
204
218
  @pyblosxom.channel.logo.should == ''
205
219
  @chill.channel.logo.should == 'http://images.chillingeffects.org/chilling_effects.gif'
206
220
  @twitter.channel.logo.should == ''
221
+ @twitter_atom.channel.logo.should == ''
207
222
  end
208
223
 
209
224
  it "should have the correct rights" do
@@ -218,6 +233,7 @@ module FeedAbstract
218
233
  @pyblosxom.channel.rights.should == 'Creative Commons Attribution-ShareAlike'
219
234
  @chill.channel.rights.should == ''
220
235
  @twitter.channel.rights.should == ''
236
+ @twitter_atom.channel.rights.should == ''
221
237
  end
222
238
 
223
239
  it "should have the correct updated value" do
@@ -232,6 +248,7 @@ module FeedAbstract
232
248
  @pyblosxom.channel.updated.should == Time.parse('2011-09-15T05:21:00Z')
233
249
  @chill.channel.updated.should == Time.parse('2002-02-25T12:00+00:00')
234
250
  @twitter.channel.updated.should == ''
251
+ @twitter_atom.channel.updated.should == Time.parse('2012-03-19 21:56:03 UTC')
235
252
  end
236
253
 
237
254
  it "should have the correct guid" do
@@ -246,6 +263,7 @@ module FeedAbstract
246
263
  @pyblosxom.channel.guid.should == 'http://mako.cc/copyrighteous/'
247
264
  @chill.channel.guid.should == 'http://www.chillingeffects.org'
248
265
  @twitter.channel.guid.should == 'http://twitter.com/djcp'
266
+ @twitter_atom.channel.guid.should == 'tag:search.twitter.com,2005:search/#rails'
249
267
  end
250
268
  end
251
269
  end
@@ -33,6 +33,7 @@ module FeedAbstract
33
33
  @pyblosxomitem.title.should == "Anxiety\n"
34
34
  @chillitem.title.should == "Takedown Complaints in the Android Marketplace"
35
35
  @twitteritem.title.should == "djcp: @csoghoian @BrookingsInst and the clipboard as well, presumably. #security #keylogging"
36
+ @twitteratomitem.title.should == "Senior #Ruby on #Rails developer(s) http://t.co/rvqsIK0h #jobs"
36
37
 
37
38
  end
38
39
 
@@ -53,6 +54,7 @@ module FeedAbstract
53
54
  @chillitem.summary.should == %Q$<br>\n<img src=\"//images.chillingeffects.org/thermometer.gif\" alt=\"thermometer\" width=\"35\" height=\"120\"align=left> <h2>Takedown Complaints in the Android Marketplace</h2><p>Wendy Seltzer, <i>Chilling Effects Clearinghouse</i>, March 3, 2011\n<p><i>Abstract:</i> Earlier this year, Google began sending to Chilling Effects the requests it received for takedown from the Android Marketplace. Since this represents a new source of data, we take a look at the first month's input, February 2011.<hr size=1>\n<p><hr size=1 width=\"75%\"><p>Since Apple launched its iPhone App Store, applications marketplaces have popped up with increasing prominence. Google, unlike Apple<a href=\"#note1\" name=\"back\">*</a>, does not lock Android users into purchasing from its <a href=\"https://market.android.com/\">Android Market</a>, but it does make that marketplace a convenient place to find Android applications (<a href=\"http://mashable.com/2010/10/25/android-100000-apps/\">passing 100,000 apps</a> late last year). <br><p><br>In February, Chilling Effects <a href=\"https://www.chillingeffects.org/search.cgi?search=Android\">saw</a> 206 complaints to Google regarding Android Market apps, almost evenly split between trademark and copyright.<a href=\"#note2\" name=\"back2\">*</a> Because the Android Market offers commercial transactions, its context differs somewhat from the search and blog hosting in which DMCA -- copyright -- complaints predominate. At the same time, many apps are offered free of charge.<p><br><img src=\"https://chart.googleapis.com/chart?cht=pc&chtt=Complaint+Subjects+to+Android+Market+(Feb+2011)&chs=750x400&chd=t:111,97,3|0.59,0.31,0.05,0.03,0.02,0.02,0.02,0.38,0.11,0.1,0.07,0.03,0.03,0.02,0.02,0.02,0.01,0.01,0.22&chl=[TM]|[C]||Trademark%20%20(59)|Facebook%20Trademark%20%20(31)|Bank%20Trademark%20%20(5)|SXSW%20Trademark%20%20(3)|Trademarks%20and%20Videos%20Copyright%20%20(2)|Game%20Trademark%20%20(2)|Disney%20Trademark%20and%20Copyright%20%20(2)|Game%20Copyright%20%20(38)|Software%20Copyright%20%20(11)|Logo%20Copyright%20%20(10)|Copyright%20%20(7)|Books%20Copyright%20%20(3)|Images%20Copyright%20%20(3)|Articles%20Copyright%20%20(2)|Television%20Copyright%20%20(2)|UFC%20Copyright%20%20(2)|Photo%20Copyright%20%20(1)|Website%20Copyright%20%20(1)|Other/Unidentified%20(22)&chco=0000FF,003333&chp=3.14\" title=\"Complaint Subjects to Google's Android Market, Feb. 2011\"><p>Slightly more than half of the complaints here claim trademark infringement: misleading use of a mark (word or logo) to cause consumer confusion about the application's source or sponsorship. Facebook led the way, challenging 30+ apps that borrowed its name or \"f\" logo (e.g. <a href=\"/trademark/notice.cgi?NoticeID=56735\">Facebook Trademark Complaint to Google: Android Market</a>). Banks and financial institutions challenged applications that used their logos, even to offer a mobile version of the bank's own site. Here is trademark as the law of consumer protection: you want to be sure an unauthorized Wells Fargo application won't channel your deposit into its coffers rather than your savings account. Google even filed several complaints against apps in its marketplace that were a bit too free with the Google name. Starbucks used copyright in its logo to similar end, requesting takedown or alteration of apps that used the coffee company's logo as their icon (e.g. <a href=\"/dmca512c/notice.cgi?NoticeID=60149\">Logo DMCA (Copyright) Complaint to Google: Android Market</a>). Some, including <a href=\"https://market.android.com/details?id=com.birbeck.starbuckscard\">My Coffee Card</a> (formerly Starbucks Card Widget) changed their name and icon in response.<p>Sometimes, these complaints didn't do much to allege \"likelihood of consumer confusion,\" the traditional hallmark of trademark infringement. South By SouthWest's complaint against the \"Unauthorized SXSW\" party scheduler app -- <a href=\"/trademark/notice.cgi?NoticeID=60951\">SXSW Trademark Complaint to Google: Android Market</a> -- sounds like an overstep, into nominative fair use. There's no good alternative way to refer to the big conference/music festival in Austin later in March, and \"unauthorized\" plainly indicates it's not an officially endorsed product. (Neither Unofficial SXSW nor the official \"SXSW&reg; GO\" gets particularly high marks from reviewers yet, but that may be because the event hasn't yet kicked off to fill them with data.)<p>Another 82 complaints (less 11 \"logo\" complaints) alleged copyright infringement -- copying of code, of graphical elements or \"look and feel\" (Nintendo complained about many \"Super Mario\" derivatives), of characters (Columbia's \"Qbert\"), or of audiovisual elements including video clips, wallpapers, and eBooks. Most of these were phrased in DMCA terms, since like a blog platform, the marketplace hosts \"information residing on systems or networks at direction of users\" <a href=\"http://static.chillingeffects.org/512.html#c\">512(c)</a>. <p>Unique among the copyright complaints in its indirection, the RIAA filed three complaints naming dozens of apps that allegedly \"facilitate the unauthorized streaming and downloading of popular sound recordings, the vast majority of which are owned or controlled by RIAA members.\" Its <a href=\"/dmca512c/notice.cgi?NoticeID=61677\">complaints</a>, complete with screenshots, asked for the removal of apps for ringtone creation and MP3 listening. This is an attenuated claim. RIAA isn't alleging that Google, or even the apps, are direct infringers of member copyrights. Rather, it claims that because Google hosts apps (or in some cases, serves ads inside them) that enable end-users to make infringing copies of music, Google should be held responsible for the users' infringing conduct -- a sort of once-removed contributory or vicarious liability claim. Is there a law of contributory inducement, after <a href=\"http://w2.eff.org/IP/P2P/MGM_v_Grokster/\">Grokster</a>? <p><br>I haven't followed all of the URLs to see how Google has responded to each of these complaints, but to its credit, it does not appear to have pulled the \"Unauthorized SXSW,\" for example. Others accused of trademark infringement appear to have changed their names or logos. Because the <a href=\"https://www.chillingeffects.org/dmca512/faq\">DMCA</a> applies only to copyright, not trademark, there is less settled procedure around the trademark claims. There's no safe-harbor, but neither is there an assumption that the service provider will be liable for its users' activity (see <a href=\"http://www.eff.org/deeplinks/2010/04/tiffany-v-ebay-what-about-put-back\">Tiffany v. eBay</a>, where the Second Circuit Court of Appeals held that \"for contributory trademark infringement liability to lie, a service provider must have more than a general knowledge or reason to know that its service is being used to sell counterfeit goods.\"). <p><br><img src=\"https://chart.googleapis.com/chart?cht=p&chtt=Complaint+Senders+to+Android+Market+(Feb+2011)&chs=750x400&chd=t:0.3,0.2,0.08,0.06,0.04,0.03,0.03,0.03,0.03,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,1.09&chl=Facebook,%20Inc.%20(30)|Nintendo%20of%20America%20Inc.%20(20)|Google%20Inc.%20(8)|Starbucks%20Corporation%20(6)|Hatched%20Games%20(4)|RIAA%20(3)|Photo%20Hunt%20(3)|Atari,%20Inc.%20(3)|ESPN%20Inc.%20(3)|Playboy%20Enterprises%20International,%20Inc.%20(2)|Electronic%20Arts%20Inc.%20(2)|The%20Walt%20Disney%20Company%20(2)|Monotype%20Imaging%20Inc.%20(2)|Kodansha%20Ltd.%20(2)|Metro,%20a%20division%20of%20Associated%20Newspapers%20Limited%20(2)|Dorna%20Sports%20(2)|Justin.tv,%20Inc.%20(2)|Rocket%20Radar%20(2)|eBay%20Inc.%20(2)|Promevo,%20LLC%20(2)|Other/Unidentified%20(109)&chco=0000FF&chp=3.14\" title=\"Takedown Senders\"><p><a name=\"note1\" href=\"#back\">*</a> Copyright geeks will recall that the last <a href=\"http://www.loc.gov/today/pr/2010/10-169.html\">anticircumvention rulemaking</a> exempted phone jailbreaking from the circumvention rule, so iPhone owners can confidently unlock their phones to use the <a href=\"http://cydia.saurik.com/\">cydia</a> marketplace or others.<br><a name=\"note2\" href=\"#back2\">*</a> Note that this is a simple count of distinct complaint submissions, each of which may target one or multiple allegedly infringing applications. $
54
55
 
55
56
  @twitteritem.summary.should == "djcp: @csoghoian @BrookingsInst and the clipboard as well, presumably. #security #keylogging"
57
+ @twitteratomitem.summary.should == 'Senior #Ruby on #Rails developer(s) http://t.co/rvqsIK0h #jobs'
56
58
  end
57
59
 
58
60
  it "should have the correct content" do
@@ -105,6 +107,7 @@ module FeedAbstract
105
107
  @pyblosxomitem.content.should == %Q|<div><a href='http://www.flickr.com/photos/nffcnnr/401047557/' target='_blank'><img src='http://farm1.static.flickr.com/137/401047557_1dda26e16f.jpg' width=350 alt='MailBoxes by nffcnnr, on Flickr' title='MailBoxes by nffcnnr, on Flickr' border='0'/></a><br/><a href='http://creativecommons.org/licenses/by/2.0/' target='_blank'><img src='http://i.creativecommons.org/l/by/2.0/80x15.png' alt='Creative Commons Attribution 2.0 Generic License' title='Creative Commons Attribution 2.0 Generic License' border='0' align='left'></a>&nbsp;&nbsp;by&nbsp;<a href='http://www.flickr.com/people/nffcnnr/' target='_blank'>&nbsp;nffcnnr</a><a href='http://www.imagecodr.org/' target='_blank'>&nbsp;</a></div><p>I am haunted by the nagging fear that I have mailboxes, tucked into a\ndark corner of an office somewhere, and perhaps even full of checks\nand important documents, that I don't know exist.</p>\n|
106
108
  @chillitem.content.should == ''
107
109
  @twitteritem.content.should == ""
110
+ @twitteratomitem.content.should == %Q|Senior <a href="http://search.twitter.com/search?q=%23Ruby" title="#Ruby" class=" ">#Ruby</a> on <em><a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" ">#Rails</a></em> developer(s) <a href="http://t.co/rvqsIK0h">http://t.co/rvqsIK0h</a> <a href="http://search.twitter.com/search?q=%23jobs" title="#jobs" class=" ">#jobs</a>|
108
111
  end
109
112
 
110
113
  it "should have the correct link" do
@@ -118,6 +121,7 @@ module FeedAbstract
118
121
  @pyblosxomitem.link.should == 'http://mako.cc/copyrighteous/20110913-00'
119
122
  @chillitem.link.should == 'https://www.chillingeffects.org/weather.cgi?WeatherID=648'
120
123
  @twitteritem.link.should == 'http://twitter.com/djcp/statuses/168381896559046656'
124
+ @twitteratomitem.link.should == 'http://twitter.com/pelaphptutor/statuses/181861618911690752'
121
125
  end
122
126
 
123
127
  it "should have the correct author" do
@@ -131,6 +135,7 @@ module FeedAbstract
131
135
  @pyblosxomitem.author.should == ''
132
136
  @chillitem.author.should == ''
133
137
  @twitteritem.author.should == 'djcp'
138
+ @twitteratomitem.author.should == 'pelaphptutor'
134
139
  end
135
140
 
136
141
  it "should have the correct authors" do
@@ -144,6 +149,7 @@ module FeedAbstract
144
149
  @pyblosxomitem.authors.should == []
145
150
  @chillitem.authors.should == []
146
151
  @twitteritem.authors.should == ['djcp']
152
+ @twitteratomitem.authors.should == ['pelaphptutor']
147
153
  end
148
154
 
149
155
  it "should have the correct contributor" do
@@ -157,6 +163,7 @@ module FeedAbstract
157
163
  @pyblosxomitem.contributor.should == ''
158
164
  @chillitem.contributor.should == ''
159
165
  @twitteritem.contributor.should == ''
166
+ @twitteratomitem.contributor.should == ''
160
167
  end
161
168
 
162
169
  it "should have the correct contributors" do
@@ -170,6 +177,7 @@ module FeedAbstract
170
177
  @pyblosxomitem.contributors.should == []
171
178
  @chillitem.contributors.should == []
172
179
  @twitteritem.contributors.should == []
180
+ @twitteratomitem.contributors.should == []
173
181
  end
174
182
 
175
183
  it "should have the correct category" do
@@ -183,6 +191,7 @@ module FeedAbstract
183
191
  @pyblosxomitem.category.should == ''
184
192
  @chillitem.category.should == ''
185
193
  @twitteritem.category.should == 'security, keylogging'
194
+ @twitteratomitem.category.should == 'Ruby, Rails, jobs'
186
195
  end
187
196
 
188
197
  it "should have the correct categories" do
@@ -196,6 +205,7 @@ module FeedAbstract
196
205
  @pyblosxomitem.categories.should == []
197
206
  @chillitem.categories.should == []
198
207
  @twitteritem.categories.should == ['security', 'keylogging']
208
+ @twitteratomitem.categories.should == ['Ruby', 'Rails', 'jobs']
199
209
  end
200
210
 
201
211
  it "should have the correct rights" do
@@ -209,6 +219,7 @@ module FeedAbstract
209
219
  @pyblosxomitem.rights.should == ''
210
220
  @chillitem.rights.should == ''
211
221
  @twitteritem.rights.should == ''
222
+ @twitteratomitem.rights.should == ''
212
223
  end
213
224
 
214
225
  it "should have been updated at the correct time" do
@@ -222,6 +233,7 @@ module FeedAbstract
222
233
  @pyblosxomitem.updated.should == Time.parse('2011-09-15T05:21:00Z')
223
234
  @chillitem.updated.should == ""
224
235
  @twitteritem.updated.should == Time.parse('2012-02-11 12:12:27 -0500')
236
+ @twitteratomitem.updated.should == Time.parse('2012-03-19 21:56:03 UTC')
225
237
  end
226
238
 
227
239
  it "should have been published at the proper time" do
@@ -235,6 +247,7 @@ module FeedAbstract
235
247
  @pyblosxomitem.published.should == Time.parse('2011-09-15T05:21:00Z')
236
248
  @chillitem.published.should == ''
237
249
  @twitteritem.published.should == Time.parse('2012-02-11 12:12:27 -0500')
250
+ @twitteratomitem.published.should == Time.parse('2012-03-19 21:56:03 UTC')
238
251
  end
239
252
 
240
253
  it "should have the proper guid" do
@@ -248,6 +261,7 @@ module FeedAbstract
248
261
  @pyblosxomitem.guid.should == 'http://mako.cc/copyrighteous/2011/09/15/20110913-00'
249
262
  @chillitem.guid.should == 'https://www.chillingeffects.org/weather.cgi?WeatherID=648'
250
263
  @twitteritem.guid.should == 'http://twitter.com/djcp/statuses/168381896559046656'
264
+ @twitteratomitem.guid.should == 'tag:search.twitter.com,2005:181861618911690752'
251
265
  end
252
266
 
253
267
  end
@@ -17,8 +17,9 @@ def instantiate_feeds
17
17
  @pyblosxom = FeedAbstract::Feed.new(File.open('spec/test_data/pyblosxom.atom'))
18
18
  @chill = FeedAbstract::Feed.new(File.open('spec/test_data/chillingeffects.xml'))
19
19
  @twitter = FeedAbstract::Feed.new(File.open('spec/test_data/djcp_twitter.rss'))
20
+ @twitter_atom = FeedAbstract::Feed.new(File.open('spec/test_data/twitter_hashtag.atom'))
20
21
 
21
- @all_feeds = [@docatom, @kpgatom, @djcprss2, @djcprss92, @oa, @delicious, @zotero, @feedburner, @pyblosxom, @chill, @twitter]
22
+ @all_feeds = [@docatom, @kpgatom, @djcprss2, @djcprss92, @oa, @delicious, @zotero, @feedburner, @pyblosxom, @chill, @twitter, @twitter_atom]
22
23
  end
23
24
 
24
25
  def instantiate_example_items
@@ -32,4 +33,5 @@ def instantiate_example_items
32
33
  @pyblosxomitem = @pyblosxom.items.first
33
34
  @chillitem = @chill.items.first
34
35
  @twitteritem = @twitter.items.first
36
+ @twitteratomitem = @twitter_atom.items.first
35
37
  end
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><feed xmlns:google="http://base.google.com/ns/1.0" xml:lang="en-US" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.w3.org/2005/Atom" xmlns:twitter="http://api.twitter.com/" xmlns:georss="http://www.georss.org/georss"><id>tag:search.twitter.com,2005:search/#rails</id><link type="text/html" href="http://search.twitter.com/search?q=%23rails" rel="alternate"/><link type="application/atom+xml" href="http://search.twitter.com/search.atom?q=%23rails" rel="self"/><title>#rails - Twitter Search</title><link type="application/opensearchdescription+xml" href="http://twitter.com/opensearch.xml" rel="search"/><link type="application/atom+xml" href="http://search.twitter.com/search.atom?since_id=181861618911690752&amp;q=%23rails" rel="refresh"/><updated>2012-03-19T21:56:03Z</updated><openSearch:itemsPerPage>15</openSearch:itemsPerPage><link type="application/atom+xml" href="http://search.twitter.com/search.atom?page=2&amp;max_id=181861618911690752&amp;q=%23rails" rel="next"/><entry><id>tag:search.twitter.com,2005:181861618911690752</id><published>2012-03-19T21:56:03Z</published><link type="text/html" href="http://twitter.com/pelaphptutor/statuses/181861618911690752" rel="alternate"/><title>Senior #Ruby on #Rails developer(s) http://t.co/rvqsIK0h #jobs</title><content type="html">Senior &lt;a href="http://search.twitter.com/search?q=%23Ruby" title="#Ruby" class=" "&gt;#Ruby&lt;/a&gt; on &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" "&gt;#Rails&lt;/a&gt;&lt;/em&gt; developer(s) &lt;a href="http://t.co/rvqsIK0h"&gt;http://t.co/rvqsIK0h&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23jobs" title="#jobs" class=" "&gt;#jobs&lt;/a&gt;</content><updated>2012-03-19T21:56:03Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/292484362/n100131847672_3877_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://www.pelaphptutorials.com/" rel="nofollow"&gt;PelaPHPTutorials&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>pelaphptutor (pelaphptutorials.com)</name><uri>http://twitter.com/pelaphptutor</uri></author></entry><entry><id>tag:search.twitter.com,2005:181860990592368640</id><published>2012-03-19T21:53:33Z</published><link type="text/html" href="http://twitter.com/newsxbrain/statuses/181860990592368640" rel="alternate"/><title>[2tweet] friendly_id&#x3092;&#x4f7f;&#x3063;&#x3066;Friendly&#x3067;RESTful&#x306a;URI&#x8a2d;&#x8a08; #Ruby #Rails - Qiita&#x2192;http://t.co/UBac1Zcn</title><content type="html">[2tweet] friendly_id&#x3092;&#x4f7f;&#x3063;&#x3066;Friendly&#x3067;RESTful&#x306a;URI&#x8a2d;&#x8a08; &lt;a href="http://search.twitter.com/search?q=%23Ruby" title="#Ruby" class=" "&gt;#Ruby&lt;/a&gt; &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" "&gt;#Rails&lt;/a&gt;&lt;/em&gt; - Qiita&#x2192;&lt;a href="http://t.co/UBac1Zcn"&gt;http://t.co/UBac1Zcn&lt;/a&gt;</content><updated>2012-03-19T21:53:33Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1704033209/_____-1_normal.gif" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://newsxbrain.com/" rel="nofollow"&gt;newsxbrain&lt;/a&gt;</twitter:source><twitter:lang>ja</twitter:lang><author><name>newsxbrain (NEWS&#xd7;BRAIN[&#x30cb;&#x30e5;&#x30fc;&#x30b9;&#x30d6;&#x30ec;&#x30a4;&#x30f3;])</name><uri>http://twitter.com/newsxbrain</uri></author></entry><entry><id>tag:search.twitter.com,2005:181860163660169217</id><published>2012-03-19T21:50:16Z</published><link type="text/html" href="http://twitter.com/pietereer/statuses/181860163660169217" rel="alternate"/><title>Blown away with how good this Rails CMS is for integration in existing Rails apps: https://t.co/Klfr217I #rails #ruby #cms #in</title><content type="html">Blown away with how good this Rails CMS is for integration in existing Rails apps: &lt;a href="https://t.co/Klfr217I"&gt;https://t.co/Klfr217I&lt;/a&gt; &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt; &lt;a href="http://search.twitter.com/search?q=%23ruby" title="#ruby" class=" "&gt;#ruby&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23cms" title="#cms" class=" "&gt;#cms&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23in" title="#in" class=" "&gt;#in&lt;/a&gt;</content><updated>2012-03-19T21:50:16Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1730280321/pieter_reasonably_small_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/"&gt;web&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>pietereer (Pieter Eerlings)</name><uri>http://twitter.com/pietereer</uri></author></entry><entry><id>tag:search.twitter.com,2005:181852384232873984</id><published>2012-03-19T21:19:21Z</published><link type="text/html" href="http://twitter.com/twotoneatl/statuses/181852384232873984" rel="alternate"/><title>RT @highgroove #hacknight begins now! What @alindeman is hacking: http://t.co/s0LeWtFw // http://t.co/GCIRnxNL #rails #ruby #wolfbrain</title><content type="html">RT @&lt;a class=" " href="http://twitter.com/highgroove"&gt;highgroove&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23hacknight" title="#hacknight" class=" "&gt;#hacknight&lt;/a&gt; begins now! What @alindeman is hacking: &lt;a href="http://t.co/s0LeWtFw"&gt;http://t.co/s0LeWtFw&lt;/a&gt; // &lt;a href="http://t.co/GCIRnxNL"&gt;http://t.co/GCIRnxNL&lt;/a&gt; &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt; &lt;a href="http://search.twitter.com/search?q=%23ruby" title="#ruby" class=" "&gt;#ruby&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23wolfbrain" title="#wolfbrain" class=" "&gt;#wolfbrain&lt;/a&gt;</content><updated>2012-03-19T21:19:21Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1839933674/logo_normal.png" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/devices" rel="nofollow"&gt;txt&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>twotoneatl (Jon Woodroof)</name><uri>http://twitter.com/twotoneatl</uri></author></entry><entry><id>tag:search.twitter.com,2005:181849434706022400</id><published>2012-03-19T21:07:38Z</published><link type="text/html" href="http://twitter.com/mattmacnaughton/statuses/181849434706022400" rel="alternate"/><title>Code by the beach! We're hiring #Rails developers at PromoJam in Venice, CA. Check out our open position on GitHub https://t.co/QwBIzwuG</title><content type="html">Code by the beach! We're hiring &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" "&gt;#Rails&lt;/a&gt;&lt;/em&gt; developers at PromoJam in Venice, CA. Check out our open position on GitHub &lt;a href="https://t.co/QwBIzwuG"&gt;https://t.co/QwBIzwuG&lt;/a&gt;</content><updated>2012-03-19T21:07:38Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/951402566/profileb_W_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/"&gt;web&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>mattmacnaughton (Matt MacNaughton)</name><uri>http://twitter.com/mattmacnaughton</uri></author></entry><entry><id>tag:search.twitter.com,2005:181847777968525314</id><published>2012-03-19T21:01:03Z</published><link type="text/html" href="http://twitter.com/x_rubydevs/statuses/181847777968525314" rel="alternate"/><title>Relevance Makes the B Corp "Best for the World" List! #ruby #rails http://t.co/AtPe73gM</title><content type="html">Relevance Makes the B Corp "Best for the World" List! &lt;a href="http://search.twitter.com/search?q=%23ruby" title="#ruby" class=" "&gt;#ruby&lt;/a&gt; &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt; &lt;a href="http://t.co/AtPe73gM"&gt;http://t.co/AtPe73gM&lt;/a&gt;</content><updated>2012-03-19T21:01:03Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1242574217/XYDO_normal.jpeg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://www.xydo.com" rel="nofollow"&gt;XYDOhandles&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>x_rubydevs (XYDO Ruby Dev)</name><uri>http://twitter.com/x_rubydevs</uri></author></entry><entry><id>tag:search.twitter.com,2005:181847089439973376</id><published>2012-03-19T20:58:19Z</published><link type="text/html" href="http://twitter.com/philipzaengle/statuses/181847089439973376" rel="alternate"/><title>Note to self: you can't run git commands within the rails console. #rails</title><content type="html">Note to self: you can't run git commands within the rails console. &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt;</content><updated>2012-03-19T20:58:19Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/935161088/500x500_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow"&gt;Twitter for Mac&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>philipzaengle (Philip Zaengle)</name><uri>http://twitter.com/philipzaengle</uri></author></entry><entry><id>tag:search.twitter.com,2005:181838570946969600</id><published>2012-03-19T20:24:28Z</published><link type="text/html" href="http://twitter.com/aereal/statuses/181838570946969600" rel="alternate"/><title>friendly_id&#x3092;&#x4f7f;&#x3063;&#x3066;Friendly&#x3067;RESTful&#x306a;URI&#x8a2d;&#x8a08; #Ruby #Rails http://t.co/WM5zwSBY</title><content type="html">friendly_id&#x3092;&#x4f7f;&#x3063;&#x3066;Friendly&#x3067;RESTful&#x306a;URI&#x8a2d;&#x8a08; &lt;a href="http://search.twitter.com/search?q=%23Ruby" title="#Ruby" class=" "&gt;#Ruby&lt;/a&gt; &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" "&gt;#Rails&lt;/a&gt;&lt;/em&gt; &lt;a href="http://t.co/WM5zwSBY"&gt;http://t.co/WM5zwSBY&lt;/a&gt;</content><updated>2012-03-19T20:24:28Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1796360201/a8b842d3448ded45259dd74d452c5972_normal.png" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://qiita.com" rel="nofollow"&gt;Qiita&lt;/a&gt;</twitter:source><twitter:lang>ja</twitter:lang><author><name>aereal (&#x65e5;&#x5e38;&#x30c4;&#x30a4;&#x30fc;&#x30c8;
2
+ )</name><uri>http://twitter.com/aereal</uri></author></entry><entry><id>tag:search.twitter.com,2005:181835236961824769</id><published>2012-03-19T20:11:13Z</published><link type="text/html" href="http://twitter.com/honeyshock/statuses/181835236961824769" rel="alternate"/><title>#people are being #trained so far off #track seems that more of us are going straight off the #rails...Tammy Wells</title><content type="html">&lt;a href="http://search.twitter.com/search?q=%23people" title="#people" class=" "&gt;#people&lt;/a&gt; are being &lt;a href="http://search.twitter.com/search?q=%23trained" title="#trained" class=" "&gt;#trained&lt;/a&gt; so far off &lt;a href="http://search.twitter.com/search?q=%23track" title="#track" class=" "&gt;#track&lt;/a&gt; seems that more of us are going straight off the &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt;...Tammy Wells</content><updated>2012-03-19T20:11:13Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1905722719/IMG03331-20120318-1011_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://blackberry.com/twitter" rel="nofollow"&gt;Twitter for BlackBerry&#xae;&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>honeyshock (Tammy Wells)</name><uri>http://twitter.com/honeyshock</uri></author></entry><entry><id>tag:search.twitter.com,2005:181834055552212992</id><published>2012-03-19T20:06:31Z</published><link type="text/html" href="http://twitter.com/rubyve/statuses/181834055552212992" rel="alternate"/><title>&#x201c;@coders_vzla: Personaliza el c&#xf3;digo creado por generadores de #rails - Gema Roja http://t.co/5MPRZbSp @rubyve&#x201d;</title><content type="html">&#x201c;@&lt;a class=" " href="http://twitter.com/coders_vzla"&gt;coders_vzla&lt;/a&gt;: Personaliza el c&#xf3;digo creado por generadores de &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt; - Gema Roja &lt;a href="http://t.co/5MPRZbSp"&gt;http://t.co/5MPRZbSp&lt;/a&gt; @&lt;a class=" " href="http://twitter.com/rubyve"&gt;rubyve&lt;/a&gt;&#x201d;</content><updated>2012-03-19T20:06:31Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1153697142/ruby-pintado_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow"&gt;Twitter for Mac&lt;/a&gt;</twitter:source><twitter:lang>es</twitter:lang><author><name>rubyve (RubyVE)</name><uri>http://twitter.com/rubyve</uri></author></entry><entry><id>tag:search.twitter.com,2005:181833803856228352</id><published>2012-03-19T20:05:31Z</published><link type="text/html" href="http://twitter.com/scicasoft/statuses/181833803856228352" rel="alternate"/><title>enfiiiiinnnnnnn #ruby marche installing #rails :-) @hassanemoustaph</title><content type="html">enfiiiiinnnnnnn &lt;a href="http://search.twitter.com/search?q=%23ruby" title="#ruby" class=" "&gt;#ruby&lt;/a&gt; marche installing &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt; :-) @&lt;a class=" " href="http://twitter.com/hassanemoustaph"&gt;hassanemoustaph&lt;/a&gt;</content><updated>2012-03-19T20:05:31Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/634703361/Code-Lyoko-11_389x506_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/"&gt;web&lt;/a&gt;</twitter:source><twitter:lang>de</twitter:lang><author><name>scicasoft (Cheikh Sidya Camara)</name><uri>http://twitter.com/scicasoft</uri></author></entry><entry><id>tag:search.twitter.com,2005:181832307542466560</id><published>2012-03-19T19:59:35Z</published><link type="text/html" href="http://twitter.com/dexterous/statuses/181832307542466560" rel="alternate"/><title>@srshti @pathsny @tdinkar @markhneedham how does a vanilla #rails app substitute an in-memory instance of a #mysql db for tests?</title><content type="html">@&lt;a class=" " href="http://twitter.com/srshti"&gt;srshti&lt;/a&gt; @&lt;a class=" " href="http://twitter.com/pathsny"&gt;pathsny&lt;/a&gt; @&lt;a class=" " href="http://twitter.com/tdinkar"&gt;tdinkar&lt;/a&gt; @&lt;a class=" " href="http://twitter.com/markhneedham"&gt;markhneedham&lt;/a&gt; how does a vanilla &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt; app substitute an in-memory instance of a &lt;a href="http://search.twitter.com/search?q=%23mysql" title="#mysql" class=" "&gt;#mysql&lt;/a&gt; db for tests?</content><updated>2012-03-19T19:59:35Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1367401855/IMG_3076_normal.JPG" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/"&gt;web&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>dexterous (Saager Mhatre)</name><uri>http://twitter.com/dexterous</uri></author></entry><entry><id>tag:search.twitter.com,2005:181832161400324097</id><published>2012-03-19T19:59:00Z</published><link type="text/html" href="http://twitter.com/ohmyshirt/statuses/181832161400324097" rel="alternate"/><title>RT @KCITP: Rails&#x2019; new seamless integration with Amazon&#x2019;s DynamoDB and S3 http://t.co/f6hXVK5n // #Rails</title><content type="html">RT @&lt;a class=" " href="http://twitter.com/KCITP"&gt;KCITP&lt;/a&gt;: Rails&#x2019; new seamless integration with Amazon&#x2019;s DynamoDB and S3 &lt;a href="http://t.co/f6hXVK5n"&gt;http://t.co/f6hXVK5n&lt;/a&gt; // &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" "&gt;#Rails&lt;/a&gt;&lt;/em&gt;</content><updated>2012-03-19T19:59:00Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1881675087/423482_10100161366557141_22007281_41947547_1603094433_n_normal.jpeg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>ohmyshirt (Mikey)</name><uri>http://twitter.com/ohmyshirt</uri></author></entry><entry><id>tag:search.twitter.com,2005:181831123637248000</id><published>2012-03-19T19:54:52Z</published><link type="text/html" href="http://twitter.com/Veraticus/statuses/181831123637248000" rel="alternate"/><title>Added association names... Next Dynamoid feature is going to be indexes through associations! https://t.co/1j5FONY5 #dynamodb #ruby #rails</title><content type="html">Added association names... Next Dynamoid feature is going to be indexes through associations! &lt;a href="https://t.co/1j5FONY5"&gt;https://t.co/1j5FONY5&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23dynamodb" title="#dynamodb" class=" "&gt;#dynamodb&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=%23ruby" title="#ruby" class=" "&gt;#ruby&lt;/a&gt; &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23rails" title="#rails" class=" "&gt;#rails&lt;/a&gt;&lt;/em&gt;</content><updated>2012-03-19T19:54:52Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1844017969/My_HipstaPrint_0-1_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/"&gt;web&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>Veraticus (Josh Symonds)</name><uri>http://twitter.com/Veraticus</uri></author></entry><entry><id>tag:search.twitter.com,2005:181830550754045952</id><published>2012-03-19T19:52:36Z</published><link type="text/html" href="http://twitter.com/ticean/statuses/181830550754045952" rel="alternate"/><title>Code by the beach! I'm hiring #Rails developers for a fun project in LA. https://t.co/4I5pOO5p</title><content type="html">Code by the beach! I'm hiring &lt;em&gt;&lt;a href="http://search.twitter.com/search?q=%23Rails" title="#Rails" class=" "&gt;#Rails&lt;/a&gt;&lt;/em&gt; developers for a fun project in LA. &lt;a href="https://t.co/4I5pOO5p"&gt;https://t.co/4I5pOO5p&lt;/a&gt;</content><updated>2012-03-19T19:52:36Z</updated><link type="image/png" href="http://a0.twimg.com/profile_images/1227437269/2007-07-24-235346_normal.jpg" rel="image"/><twitter:geo></twitter:geo><twitter:metadata><twitter:result_type>recent</twitter:result_type></twitter:metadata><twitter:source>&lt;a href="http://twitter.com/"&gt;web&lt;/a&gt;</twitter:source><twitter:lang>en</twitter:lang><author><name>ticean (Ticean Bennett)</name><uri>http://twitter.com/ticean</uri></author></entry></feed>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feed-abstract
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-19 00:00:00.000000000 Z
12
+ date: 2012-03-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &11691180 !ruby/object:Gem::Requirement
16
+ requirement: &18101880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *11691180
24
+ version_requirements: *18101880
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rdoc
27
- requirement: &11689920 !ruby/object:Gem::Requirement
27
+ requirement: &18967240 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *11689920
35
+ version_requirements: *18967240
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &11688220 !ruby/object:Gem::Requirement
38
+ requirement: &18965100 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *11688220
46
+ version_requirements: *18965100
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &11097340 !ruby/object:Gem::Requirement
49
+ requirement: &18962900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *11097340
57
+ version_requirements: *18962900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: simplecov
60
- requirement: &11094940 !ruby/object:Gem::Requirement
60
+ requirement: &18960860 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *11094940
68
+ version_requirements: *18960860
69
69
  description: ! 'This library creates a common object graph for the RSS/Atom/RDF parsing
70
70
  classes in the ruby standard library. This allows you parse different feed formats
71
71
  and get back the same (or at least a very similar) set of results - item authors
@@ -113,6 +113,7 @@ files:
113
113
  - spec/test_data/katanapg.atom
114
114
  - spec/test_data/oa.africa.rss
115
115
  - spec/test_data/pyblosxom.atom
116
+ - spec/test_data/twitter_hashtag.atom
116
117
  - spec/test_data/zotero.rss
117
118
  homepage: https://github.com/berkmancenter/feed-abstract
118
119
  licenses: []