twitter2campfire 0.1.0
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/.gitignore +1 -0
- data/README +27 -0
- data/Rakefile +39 -0
- data/VERSION +1 -0
- data/bin/twitter2campfire +5 -0
- data/examples/archived_latest.txt +1 -0
- data/examples/config.yml +8 -0
- data/fixtures/sample.xml +209 -0
- data/fixtures/test_blank_cachefile.txt +0 -0
- data/fixtures/test_cachefile.txt +2 -0
- data/lib/twitter2campfire.rb +92 -0
- data/lib/twitter2campfire/cli.rb +17 -0
- data/spec/twitter2campfire_spec.rb +98 -0
- data/twitter2campfire.gemspec +72 -0
- metadata +127 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
run.rb
|
data/README
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
twitter2campfire.rb
|
2
|
+
|
3
|
+
Publish a Twitter summize feed to Campfire
|
4
|
+
|
5
|
+
This script allows you to monitor a Twitter search feed using Campfire.
|
6
|
+
|
7
|
+
Here's how to get it set up:
|
8
|
+
|
9
|
+
Pre-run: make sure to install gem dependencies:
|
10
|
+
|
11
|
+
sudo gem install tinder rio hpricot htmlentities
|
12
|
+
|
13
|
+
then:
|
14
|
+
|
15
|
+
1) Check out the repo:
|
16
|
+
|
17
|
+
git clone git://github.com/paulca/twitter2campfire.git
|
18
|
+
|
19
|
+
2) Copy 'run_example.rb' to 'run.rb' and edit it with your credentials and a feed url ( from http://search.twitter.com )
|
20
|
+
|
21
|
+
3) Set a cron script to run the script every minute. Something like this should do it:
|
22
|
+
|
23
|
+
* * * * * cd /home/twitter2campfire/; ruby run.rb
|
24
|
+
|
25
|
+
Hallelujah, you got Twitter in your Campfire, sweet!
|
26
|
+
|
27
|
+
Follow me on Twitter for updates: http://www.twitter.com/paulca
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "twitter2campfire"
|
8
|
+
gem.summary = %Q{gemification of twitter2campfire script}
|
9
|
+
gem.description = %Q{found this code here: [http://github.com/paulca/twitter2campfire]. I just gemified it.}
|
10
|
+
gem.email = "james@giraffesoft.ca"
|
11
|
+
gem.homepage = "http://github.com/giraffesoft/twitter2campfire"
|
12
|
+
gem.authors = ["James Golick"]
|
13
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
gem.add_dependency "rio"
|
15
|
+
gem.add_dependency "tinder"
|
16
|
+
gem.add_dependency "hpricot"
|
17
|
+
gem.add_dependency "htmlentities"
|
18
|
+
gem.add_dependency "thor"
|
19
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
20
|
+
end
|
21
|
+
rescue LoadError
|
22
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'spec/rake/spectask'
|
26
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
27
|
+
spec.libs << 'lib' << 'spec'
|
28
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
29
|
+
end
|
30
|
+
|
31
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
32
|
+
spec.libs << 'lib' << 'spec'
|
33
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
34
|
+
spec.rcov = true
|
35
|
+
end
|
36
|
+
|
37
|
+
task :spec => :check_dependencies
|
38
|
+
task :default => :spec
|
39
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1 @@
|
|
1
|
+
|
data/examples/config.yml
ADDED
data/fixtures/sample.xml
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<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/">
|
3
|
+
<id>tag:search.twitter.com,2005:search/from:paulca OR from:eoghanmccabe OR from:destraynor OR from:davidjrice</id>
|
4
|
+
<link type="text/html" rel="alternate" href="http://search.twitter.com/search?q=from%3Apaulca+OR+from%3Aeoghanmccabe+OR+from%3Adestraynor+OR+from%3Adavidjrice"/>
|
5
|
+
<link type="application/atom+xml" rel="self" href="http://search.twitter.com/search.atom?q=from%3Apaulca+OR+from%3Aeoghanmccabe+OR+from%3Adestraynor+OR+from%3Adavidjrice"/>
|
6
|
+
<title>from:paulca OR from:eoghanmccabe OR from:destraynor OR from:davidjrice - Twitter Search</title>
|
7
|
+
<link type="application/opensearchdescription+xml" rel="search" href="http://search.twitter.com/opensearch.xml"/>
|
8
|
+
<link type="application/atom+xml" rel="refresh" href="http://search.twitter.com/search.atom?q=from%3Apaulca+OR+from%3Aeoghanmccabe+OR+from%3Adestraynor+OR+from%3Adavidjrice&since_id=1062620135"/>
|
9
|
+
<updated>2008-12-17T12:12:01Z</updated>
|
10
|
+
<openSearch:itemsPerPage>15</openSearch:itemsPerPage>
|
11
|
+
<link type="application/atom+xml" rel="next" href="http://search.twitter.com/search.atom?max_id=1062620135&page=2&q=from%3Apaulca+OR+from%3Aeoghanmccabe+OR+from%3Adestraynor+OR+from%3Adavidjrice"/>
|
12
|
+
<entry>
|
13
|
+
<id>tag:search.twitter.com,2005:1062620135</id>
|
14
|
+
<published>2008-12-17T12:12:01Z</published>
|
15
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/paulca/statuses/1062620135"/>
|
16
|
+
<title>@svenfuchs — I'm worried I totally missed something for merging translations ... http://reallytinyurl.com/492 ... is this useful at all?</title>
|
17
|
+
<content type="html"><a href="http://twitter.com/svenfuchs">@svenfuchs</a> — I'm worried I totally missed something for merging translations ... <a href="http://reallytinyurl.com/492">http://reallytinyurl.com/492</a> ... is this useful at all?</content>
|
18
|
+
<updated>2008-12-17T12:12:01Z</updated>
|
19
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61449532/paul-picture_normal.png"/>
|
20
|
+
<author>
|
21
|
+
<name>paulca (Paul Campbell)</name>
|
22
|
+
<uri>http://twitter.com/paulca</uri>
|
23
|
+
</author>
|
24
|
+
</entry>
|
25
|
+
<entry>
|
26
|
+
<id>tag:search.twitter.com,2005:1062619298</id>
|
27
|
+
<published>2008-12-17T12:11:11Z</published>
|
28
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/paulca/statuses/1062619298"/>
|
29
|
+
<title>I wrote a little plugin to update translation files in Rails 2.2 http://reallytinyurl.com/492 Blogpost: http://reallytinyurl.com/491</title>
|
30
|
+
<content type="html">I wrote a little plugin to update translation files in Rails 2.2 <a href="http://reallytinyurl.com/492">http://reallytinyurl.com/492</a> Blogpost: <a href="http://reallytinyurl.com/491">http://reallytinyurl.com/491</a></content>
|
31
|
+
<updated>2008-12-17T12:11:11Z</updated>
|
32
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61449532/paul-picture_normal.png"/>
|
33
|
+
<author>
|
34
|
+
<name>paulca (Paul Campbell)</name>
|
35
|
+
<uri>http://twitter.com/paulca</uri>
|
36
|
+
</author>
|
37
|
+
</entry>
|
38
|
+
<entry>
|
39
|
+
<id>tag:search.twitter.com,2005:1062528058</id>
|
40
|
+
<published>2008-12-17T10:45:45Z</published>
|
41
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/eoghanmccabe/statuses/1062528058"/>
|
42
|
+
<title>@karldeeter You're welcome! Glad you get the branding joke. :-)</title>
|
43
|
+
<content type="html"><a href="http://twitter.com/karldeeter">@karldeeter</a> You're welcome! Glad you get the branding joke. :-)</content>
|
44
|
+
<updated>2008-12-17T10:45:45Z</updated>
|
45
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61446055/eoghan-picture_normal.png"/>
|
46
|
+
<link type="application/atom+xml" rel="thread" href="http://search.twitter.com/search/thread/1062528058.atom"/>
|
47
|
+
<author>
|
48
|
+
<name>eoghanmccabe (Eoghan McCabe)</name>
|
49
|
+
<uri>http://twitter.com/eoghanmccabe</uri>
|
50
|
+
</author>
|
51
|
+
</entry>
|
52
|
+
<entry>
|
53
|
+
<id>tag:search.twitter.com,2005:1062509967</id>
|
54
|
+
<published>2008-12-17T10:28:15Z</published>
|
55
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/paulca/statuses/1062509967"/>
|
56
|
+
<title>Congrats to @campbellscott + co for successful launch of igopeople.com this morning. Great to see the lights switch on before Christmas!</title>
|
57
|
+
<content type="html">Congrats to <a href="http://twitter.com/campbellscott">@campbellscott</a> + co for successful launch of igopeople.com this morning. Great to see the lights switch on before Christmas!</content>
|
58
|
+
<updated>2008-12-17T10:28:15Z</updated>
|
59
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61449532/paul-picture_normal.png"/>
|
60
|
+
<author>
|
61
|
+
<name>paulca (Paul Campbell)</name>
|
62
|
+
<uri>http://twitter.com/paulca</uri>
|
63
|
+
</author>
|
64
|
+
</entry>
|
65
|
+
<entry>
|
66
|
+
<id>tag:search.twitter.com,2005:1062447244</id>
|
67
|
+
<published>2008-12-17T09:20:33Z</published>
|
68
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1062447244"/>
|
69
|
+
<title>Missing the IGO launch breakfast this morning - academia calls. Best of luck to all involved.</title>
|
70
|
+
<content type="html">Missing the IGO launch breakfast this morning - academia calls. Best of luck to all involved.</content>
|
71
|
+
<updated>2008-12-17T09:20:33Z</updated>
|
72
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
73
|
+
<author>
|
74
|
+
<name>destraynor (Des Traynor)</name>
|
75
|
+
<uri>http://twitter.com/destraynor</uri>
|
76
|
+
</author>
|
77
|
+
</entry>
|
78
|
+
<entry>
|
79
|
+
<id>tag:search.twitter.com,2005:1062203697</id>
|
80
|
+
<published>2008-12-17T05:15:28Z</published>
|
81
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/davidjrice/statuses/1062203697"/>
|
82
|
+
<title>@KirinDave I have a lumix lx1, takes great pictures. Only bad news about the lx3 is that it looks like it has time travelled from the 80s.:)</title>
|
83
|
+
<content type="html"><a href="http://twitter.com/KirinDave">@KirinDave</a> I have a lumix lx1, takes great pictures. Only bad news about the lx3 is that it looks like it has time travelled from the 80s.:)</content>
|
84
|
+
<updated>2008-12-17T05:15:28Z</updated>
|
85
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/64037782/dave-picture_normal.png"/>
|
86
|
+
<author>
|
87
|
+
<name>davidjrice (David Rice)</name>
|
88
|
+
<uri>http://twitter.com/davidjrice</uri>
|
89
|
+
</author>
|
90
|
+
</entry>
|
91
|
+
<entry>
|
92
|
+
<id>tag:search.twitter.com,2005:1061999348</id>
|
93
|
+
<published>2008-12-17T02:51:57Z</published>
|
94
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061999348"/>
|
95
|
+
<title>Another early start tomorrow, but it looks like I'm staring at another long sleepless night though. God this sucks.</title>
|
96
|
+
<content type="html">Another early start tomorrow, but it looks like I'm staring at another long sleepless night though. God this sucks.</content>
|
97
|
+
<updated>2008-12-17T02:51:57Z</updated>
|
98
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
99
|
+
<author>
|
100
|
+
<name>destraynor (Des Traynor)</name>
|
101
|
+
<uri>http://twitter.com/destraynor</uri>
|
102
|
+
</author>
|
103
|
+
</entry>
|
104
|
+
<entry>
|
105
|
+
<id>tag:search.twitter.com,2005:1061887763</id>
|
106
|
+
<published>2008-12-17T01:40:04Z</published>
|
107
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/davidjrice/statuses/1061887763"/>
|
108
|
+
<title>So, I was just about to do a screencast to let a client peek at their eagerly awaited facebook app... and then part of fb dies.</title>
|
109
|
+
<content type="html">So, I was just about to do a screencast to let a client peek at their eagerly awaited facebook app... and then part of fb dies.</content>
|
110
|
+
<updated>2008-12-17T01:40:04Z</updated>
|
111
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/64037782/dave-picture_normal.png"/>
|
112
|
+
<author>
|
113
|
+
<name>davidjrice (David Rice)</name>
|
114
|
+
<uri>http://twitter.com/davidjrice</uri>
|
115
|
+
</author>
|
116
|
+
</entry>
|
117
|
+
<entry>
|
118
|
+
<id>tag:search.twitter.com,2005:1061790777</id>
|
119
|
+
<published>2008-12-17T00:39:16Z</published>
|
120
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061790777"/>
|
121
|
+
<title>You'd need an evil mind to create a GMail labs plugin like "default reply to all" http://url.ie/1053 I'd say that has caused heartbreak</title>
|
122
|
+
<content type="html">You'd need an evil mind to create a GMail labs plugin like &quot;default reply to all&quot; <a href="http://url.ie/1053">http://url.ie/1053</a> I'd say that has caused heartbreak</content>
|
123
|
+
<updated>2008-12-17T00:39:16Z</updated>
|
124
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
125
|
+
<author>
|
126
|
+
<name>destraynor (Des Traynor)</name>
|
127
|
+
<uri>http://twitter.com/destraynor</uri>
|
128
|
+
</author>
|
129
|
+
</entry>
|
130
|
+
<entry>
|
131
|
+
<id>tag:search.twitter.com,2005:1061702216</id>
|
132
|
+
<published>2008-12-16T23:44:46Z</published>
|
133
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/paulca/statuses/1061702216"/>
|
134
|
+
<title>Just read Roald Dahl's short story "Taste" for first time in a few years. Origin of the world 'claret': http://reallytinyurl.com/489</title>
|
135
|
+
<content type="html">Just read Roald Dahl's short story &quot;Taste&quot; for first time in a few years. Origin of the world 'claret': <a href="http://reallytinyurl.com/489">http://reallytinyurl.com/489</a></content>
|
136
|
+
<updated>2008-12-16T23:44:46Z</updated>
|
137
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61449532/paul-picture_normal.png"/>
|
138
|
+
<author>
|
139
|
+
<name>paulca (Paul Campbell)</name>
|
140
|
+
<uri>http://twitter.com/paulca</uri>
|
141
|
+
</author>
|
142
|
+
</entry>
|
143
|
+
<entry>
|
144
|
+
<id>tag:search.twitter.com,2005:1061647813</id>
|
145
|
+
<published>2008-12-16T23:12:20Z</published>
|
146
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061647813"/>
|
147
|
+
<title>New Tesla does 0-60 in 3.6 seconds http://tinyurl.com/5rxhrj It's the Lotus Elise, but faster, and friendlier</title>
|
148
|
+
<content type="html">New Tesla does 0-60 in 3.6 seconds <a href="http://tinyurl.com/5rxhrj">http://tinyurl.com/5rxhrj</a> It's the Lotus Elise, but faster, and friendlier</content>
|
149
|
+
<updated>2008-12-16T23:12:20Z</updated>
|
150
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
151
|
+
<author>
|
152
|
+
<name>destraynor (Des Traynor)</name>
|
153
|
+
<uri>http://twitter.com/destraynor</uri>
|
154
|
+
</author>
|
155
|
+
</entry>
|
156
|
+
<entry>
|
157
|
+
<id>tag:search.twitter.com,2005:1061542523</id>
|
158
|
+
<published>2008-12-16T22:13:12Z</published>
|
159
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061542523"/>
|
160
|
+
<title>Some nice touches on this site: http://www.corporateriskwatch.com</title>
|
161
|
+
<content type="html">Some nice touches on this site: <a href="http://www.corporateriskwatch.com">http://www.corporateriskwatch.com</a></content>
|
162
|
+
<updated>2008-12-16T22:13:12Z</updated>
|
163
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
164
|
+
<author>
|
165
|
+
<name>destraynor (Des Traynor)</name>
|
166
|
+
<uri>http://twitter.com/destraynor</uri>
|
167
|
+
</author>
|
168
|
+
</entry>
|
169
|
+
<entry>
|
170
|
+
<id>tag:search.twitter.com,2005:1061256927</id>
|
171
|
+
<published>2008-12-16T19:39:21Z</published>
|
172
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061256927"/>
|
173
|
+
<title>Performing a programmatic review for a computer science department in Dublin , this could be fun!</title>
|
174
|
+
<content type="html">Performing a programmatic review for a computer science department in Dublin , this could be fun!</content>
|
175
|
+
<updated>2008-12-16T19:39:21Z</updated>
|
176
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
177
|
+
<author>
|
178
|
+
<name>destraynor (Des Traynor)</name>
|
179
|
+
<uri>http://twitter.com/destraynor</uri>
|
180
|
+
</author>
|
181
|
+
</entry>
|
182
|
+
<entry>
|
183
|
+
<id>tag:search.twitter.com,2005:1061081990</id>
|
184
|
+
<published>2008-12-16T18:07:10Z</published>
|
185
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061081990"/>
|
186
|
+
<title>@Padday Subscribed. Cheers</title>
|
187
|
+
<content type="html"><a href="http://twitter.com/Padday">@Padday</a> Subscribed. Cheers</content>
|
188
|
+
<updated>2008-12-16T18:07:10Z</updated>
|
189
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
190
|
+
<link type="application/atom+xml" rel="thread" href="http://search.twitter.com/search/thread/1061081990.atom"/>
|
191
|
+
<author>
|
192
|
+
<name>destraynor (Des Traynor)</name>
|
193
|
+
<uri>http://twitter.com/destraynor</uri>
|
194
|
+
</author>
|
195
|
+
</entry>
|
196
|
+
<entry>
|
197
|
+
<id>tag:search.twitter.com,2005:1061077916</id>
|
198
|
+
<published>2008-12-16T18:05:04Z</published>
|
199
|
+
<link type="text/html" rel="alternate" href="http://twitter.com/destraynor/statuses/1061077916"/>
|
200
|
+
<title>@gizmomonster LOL that's exactly who I thought you were talking about.</title>
|
201
|
+
<content type="html"><a href="http://twitter.com/gizmomonster">@gizmomonster</a> LOL that's exactly who I thought you were talking about.</content>
|
202
|
+
<updated>2008-12-16T18:05:04Z</updated>
|
203
|
+
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/61452256/des-picture_normal.png"/>
|
204
|
+
<author>
|
205
|
+
<name>destraynor (Des Traynor)</name>
|
206
|
+
<uri>http://twitter.com/destraynor</uri>
|
207
|
+
</author>
|
208
|
+
</entry>
|
209
|
+
</feed>
|
File without changes
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'tinder'
|
3
|
+
require 'rio'
|
4
|
+
require 'hpricot'
|
5
|
+
require 'ostruct'
|
6
|
+
require 'time'
|
7
|
+
require 'htmlentities'
|
8
|
+
require 'digest/sha1'
|
9
|
+
require 'twitter2campfire/cli'
|
10
|
+
|
11
|
+
class Twitter2Campfire
|
12
|
+
attr_accessor :feed, :campfire, :room, :cachefile, :options
|
13
|
+
|
14
|
+
def initialize(feed,campfire,room, cachefile = 'archived_latest.txt', options = {})
|
15
|
+
self.feed = feed
|
16
|
+
self.campfire = campfire
|
17
|
+
self.room = campfire.find_room_by_name room
|
18
|
+
self.cachefile = cachefile
|
19
|
+
self.options = options
|
20
|
+
end
|
21
|
+
|
22
|
+
def raw_feed
|
23
|
+
@doc ||= Hpricot(rio(feed) > (string ||= ""))
|
24
|
+
end
|
25
|
+
|
26
|
+
def entries
|
27
|
+
(raw_feed/'entry').map do |e|
|
28
|
+
OpenStruct.new(
|
29
|
+
:from => (e/'name').inner_html,
|
30
|
+
:text => (e/'title').inner_html,
|
31
|
+
:link => (e/'link[@rel=alternate]').first['href'],
|
32
|
+
:checksum => Digest::SHA1.hexdigest((e/'title').inner_html),
|
33
|
+
:date => Time.parse((e/'updated').inner_html),
|
34
|
+
:twicture => "http://twictur.es/i/#{(e/'id').inner_html.split(':').last}.gif"
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def latest_tweet
|
40
|
+
entries.first
|
41
|
+
end
|
42
|
+
|
43
|
+
def save_latest
|
44
|
+
f = File.exist?(cachefile)? File.open(cachefile, 'a') : File.new(cachefile, 'w')
|
45
|
+
f.write("\n#{new_archive_contents}")
|
46
|
+
end
|
47
|
+
|
48
|
+
def checksums
|
49
|
+
entries.map { |e| e.checksum }.to_a
|
50
|
+
end
|
51
|
+
|
52
|
+
def archived_checksums
|
53
|
+
archive_file.split("\n")
|
54
|
+
end
|
55
|
+
|
56
|
+
def new_checksums
|
57
|
+
checksums.flatten.uniq[0,1000]
|
58
|
+
end
|
59
|
+
|
60
|
+
def archive_file
|
61
|
+
begin
|
62
|
+
`touch #{cachefile}` unless File.exist?(cachefile)
|
63
|
+
return File.read(cachefile)
|
64
|
+
#rescue
|
65
|
+
# ''
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def new_archive_contents
|
70
|
+
"#{new_checksums.join("\n")}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def posts
|
74
|
+
entries.reject { |e| archived_checksums.include?(e.checksum) }
|
75
|
+
end
|
76
|
+
|
77
|
+
def coder
|
78
|
+
HTMLEntities.new
|
79
|
+
end
|
80
|
+
|
81
|
+
def publish_entries
|
82
|
+
posts.reverse.each do |post|
|
83
|
+
if options[:twicture]
|
84
|
+
room.speak post.twicture
|
85
|
+
else
|
86
|
+
room.speak "#{coder.decode(post.from)}: #{coder.decode(post.text)} #{post.link}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
save_latest
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
class Twitter2Campfire
|
4
|
+
class CLI < Thor
|
5
|
+
desc "go /path/to/config/file", "Run twitter2campfire"
|
6
|
+
def go(path_to_config_file)
|
7
|
+
config = YAML.load(File.read(path_to_config_file))
|
8
|
+
cache_file = config['cache_file'] || "/var/lib/twitter2campfire.cache"
|
9
|
+
|
10
|
+
campfire = Tinder::Campfire.new config['subdomain'], :ssl => config['ssl']
|
11
|
+
campfire.login config['username'], config['password']
|
12
|
+
t = Twitter2Campfire.new(config['url'], campfire,
|
13
|
+
config['room'], cache_file, {})
|
14
|
+
t.publish_entries
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
require 'twitter2campfire'
|
4
|
+
|
5
|
+
describe Twitter2Campfire, "with a cachefile" do
|
6
|
+
before(:each) do
|
7
|
+
campfire = mock(Tinder::Campfire)
|
8
|
+
campfire.stub!(:find_room_by_name)
|
9
|
+
@t = Twitter2Campfire.new('http://search.twitter.com/search.atom?q=from%3Apaulca+OR+from%3Aeoghanmccabe+OR+from%3Adestraynor+OR+from%3Adavidjrice', campfire, 'Contrast', 'fixtures/test_cachefile.txt')
|
10
|
+
@t.stub!(:raw_feed).and_return(Hpricot(File.open('fixtures/sample.xml')))
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should get the latest tweet" do
|
14
|
+
@t.latest_tweet.text.should match(/svenfuchs/)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should get the latest entry" do
|
18
|
+
((@t.raw_feed/'entry').first/'title').first.inner_html.should match(/svenfuchs/)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
it "should get the archived checksums" do
|
23
|
+
@t.archived_checksums.should == ['be7bb22cc88ff98bfd4ffe3c45ad89a7f3f4e86a', '81d405cd1e3b4bb6c959419e57c2a5c7abe688cb']
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should have all the entries" do
|
27
|
+
@t.entries.size.should == 15
|
28
|
+
end
|
29
|
+
|
30
|
+
it "have the first checksum" do
|
31
|
+
@t.checksums.first.should == 'be7bb22cc88ff98bfd4ffe3c45ad89a7f3f4e86a'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "have the last checksum" do
|
35
|
+
@t.checksums.last.should == '81d405cd1e3b4bb6c959419e57c2a5c7abe688cb'
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should have 15 checksums" do
|
39
|
+
@t.checksums.size.should == 15
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should only have 13 posts" do
|
43
|
+
@t.posts.size.should == 13
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should have a bunch of new checksums" do
|
47
|
+
@t.new_checksums.size.should == 15
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should save the new archive contents" do
|
51
|
+
@t.new_archive_contents.split("\n").size.should == 15
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe Twitter2Campfire, "with a blank cachefile" do
|
56
|
+
before(:each) do
|
57
|
+
campfire = mock(Tinder::Campfire)
|
58
|
+
campfire.stub!(:find_room_by_name)
|
59
|
+
@t = Twitter2Campfire.new('http://search.twitter.com/search.atom?q=from%3Apaulca+OR+from%3Aeoghanmccabe+OR+from%3Adestraynor+OR+from%3Adavidjrice', campfire, 'Contrast', 'fixtures/test_blank_cachefile.txt')
|
60
|
+
@t.stub!(:raw_feed).and_return(Hpricot(File.open('fixtures/sample.xml')))
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should get the latest tweet" do
|
64
|
+
@t.latest_tweet.text.should match(/svenfuchs/)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should get the latest entry" do
|
68
|
+
((@t.raw_feed/'entry').first/'title').first.inner_html.should match(/svenfuchs/)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should get the archived checksums" do
|
72
|
+
@t.archived_checksums.should == []
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should have all the entries" do
|
76
|
+
@t.entries.size.should == 15
|
77
|
+
end
|
78
|
+
|
79
|
+
it "have the first checksum" do
|
80
|
+
@t.checksums.first.should == 'be7bb22cc88ff98bfd4ffe3c45ad89a7f3f4e86a'
|
81
|
+
end
|
82
|
+
|
83
|
+
it "have the last checksum" do
|
84
|
+
@t.checksums.last.should == '81d405cd1e3b4bb6c959419e57c2a5c7abe688cb'
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should have 15 checksums" do
|
88
|
+
@t.checksums.size.should == 15
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should only have 13 posts" do
|
92
|
+
@t.posts.size.should == 15
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should have a bunch of new checksums" do
|
96
|
+
@t.new_checksums.size.should == 15
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{twitter2campfire}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["James Golick"]
|
12
|
+
s.date = %q{2009-12-15}
|
13
|
+
s.default_executable = %q{twitter2campfire}
|
14
|
+
s.description = %q{found this code here: [http://github.com/paulca/twitter2campfire]. I just gemified it.}
|
15
|
+
s.email = %q{james@giraffesoft.ca}
|
16
|
+
s.executables = ["twitter2campfire"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".gitignore",
|
22
|
+
"README",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"bin/twitter2campfire",
|
26
|
+
"examples/archived_latest.txt",
|
27
|
+
"examples/config.yml",
|
28
|
+
"fixtures/sample.xml",
|
29
|
+
"fixtures/test_blank_cachefile.txt",
|
30
|
+
"fixtures/test_cachefile.txt",
|
31
|
+
"lib/twitter2campfire.rb",
|
32
|
+
"lib/twitter2campfire/cli.rb",
|
33
|
+
"spec/twitter2campfire_spec.rb"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/giraffesoft/twitter2campfire}
|
36
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.3.5}
|
39
|
+
s.summary = %q{gemification of twitter2campfire script}
|
40
|
+
s.test_files = [
|
41
|
+
"spec/twitter2campfire_spec.rb"
|
42
|
+
]
|
43
|
+
|
44
|
+
if s.respond_to? :specification_version then
|
45
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
46
|
+
s.specification_version = 3
|
47
|
+
|
48
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
49
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
50
|
+
s.add_runtime_dependency(%q<rio>, [">= 0"])
|
51
|
+
s.add_runtime_dependency(%q<tinder>, [">= 0"])
|
52
|
+
s.add_runtime_dependency(%q<hpricot>, [">= 0"])
|
53
|
+
s.add_runtime_dependency(%q<htmlentities>, [">= 0"])
|
54
|
+
s.add_runtime_dependency(%q<thor>, [">= 0"])
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
57
|
+
s.add_dependency(%q<rio>, [">= 0"])
|
58
|
+
s.add_dependency(%q<tinder>, [">= 0"])
|
59
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
60
|
+
s.add_dependency(%q<htmlentities>, [">= 0"])
|
61
|
+
s.add_dependency(%q<thor>, [">= 0"])
|
62
|
+
end
|
63
|
+
else
|
64
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
65
|
+
s.add_dependency(%q<rio>, [">= 0"])
|
66
|
+
s.add_dependency(%q<tinder>, [">= 0"])
|
67
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
68
|
+
s.add_dependency(%q<htmlentities>, [">= 0"])
|
69
|
+
s.add_dependency(%q<thor>, [">= 0"])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: twitter2campfire
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Golick
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-15 00:00:00 -08:00
|
13
|
+
default_executable: twitter2campfire
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.9
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rio
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: tinder
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: hpricot
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: htmlentities
|
57
|
+
type: :runtime
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: thor
|
67
|
+
type: :runtime
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
version:
|
75
|
+
description: "found this code here: [http://github.com/paulca/twitter2campfire]. I just gemified it."
|
76
|
+
email: james@giraffesoft.ca
|
77
|
+
executables:
|
78
|
+
- twitter2campfire
|
79
|
+
extensions: []
|
80
|
+
|
81
|
+
extra_rdoc_files:
|
82
|
+
- README
|
83
|
+
files:
|
84
|
+
- .gitignore
|
85
|
+
- README
|
86
|
+
- Rakefile
|
87
|
+
- VERSION
|
88
|
+
- bin/twitter2campfire
|
89
|
+
- examples/archived_latest.txt
|
90
|
+
- examples/config.yml
|
91
|
+
- fixtures/sample.xml
|
92
|
+
- fixtures/test_blank_cachefile.txt
|
93
|
+
- fixtures/test_cachefile.txt
|
94
|
+
- lib/twitter2campfire.rb
|
95
|
+
- lib/twitter2campfire/cli.rb
|
96
|
+
- spec/twitter2campfire_spec.rb
|
97
|
+
- twitter2campfire.gemspec
|
98
|
+
has_rdoc: true
|
99
|
+
homepage: http://github.com/giraffesoft/twitter2campfire
|
100
|
+
licenses: []
|
101
|
+
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options:
|
104
|
+
- --charset=UTF-8
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: "0"
|
112
|
+
version:
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: "0"
|
118
|
+
version:
|
119
|
+
requirements: []
|
120
|
+
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 1.3.5
|
123
|
+
signing_key:
|
124
|
+
specification_version: 3
|
125
|
+
summary: gemification of twitter2campfire script
|
126
|
+
test_files:
|
127
|
+
- spec/twitter2campfire_spec.rb
|