tweetlr 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -3
- data/config/tweetlr.yml +1 -1
- data/lib/tweetlr.rb +22 -34
- data/spec/spec_helper.rb +10 -1
- data/spec/tweetlr_spec.rb +73 -26
- data/tweetlr.gemspec +1 -1
- metadata +16 -16
data/README.md
CHANGED
@@ -13,8 +13,7 @@ tweetlr supports
|
|
13
13
|
- twitpic
|
14
14
|
- yfrog
|
15
15
|
- imgly
|
16
|
-
-
|
17
|
-
- foursquare
|
16
|
+
- twitter / photobucket
|
18
17
|
- t.co shortened links to pictures
|
19
18
|
- every service accessible via embed.ly (see [photo providers](http://embed.ly/providers))
|
20
19
|
|
@@ -38,7 +37,7 @@ tumblr_password: YOUR_TUMBLR_PW
|
|
38
37
|
update_period: 300 #check for updates every 300 secs = 5 minutes
|
39
38
|
shouts: 'says' # will be concatenated after the username, before the message: @mr_x says: awesome things on a photo!
|
40
39
|
loglevel: 1 # 0: debug, 1: info (default), 2: warn, 3: error, 5: fatal
|
41
|
-
whitelist: #twitter accounts in that list will have their tweets published immediately. post from others will be saved as drafts
|
40
|
+
whitelist: #twitter accounts in that list will have their tweets published immediately. post from others will be saved as drafts. blank list will publish all tweets immediately.
|
42
41
|
- whitey_mc_whitelist
|
43
42
|
- sven_kr
|
44
43
|
```
|
data/config/tweetlr.yml
CHANGED
@@ -9,6 +9,6 @@ tumblr_password: YOUR_TUMBLR_PW
|
|
9
9
|
update_period: 300 #check for updates every 300 secs = 5 minutes
|
10
10
|
shouts: 'says' # will be concatenated after the username, before the message: @mr_x says: awesome things on a photo!
|
11
11
|
loglevel: 0 # 0: debug, 1: info (default), 2: warn, 3: error, 5: fatal
|
12
|
-
whitelist: #twitter accounts in that list will have their tweets published immediately. post from others will be saved as drafts
|
12
|
+
whitelist: #twitter accounts in that list will have their tweets published immediately. post from others will be saved as drafts. blank list will publish all tweets immediately
|
13
13
|
- whitey_mc_whitelist
|
14
14
|
- sven_kr
|
data/lib/tweetlr.rb
CHANGED
@@ -6,7 +6,7 @@ require 'json'
|
|
6
6
|
|
7
7
|
class Tweetlr
|
8
8
|
|
9
|
-
VERSION = '0.1.
|
9
|
+
VERSION = '0.1.6'
|
10
10
|
GENERATOR = %{tweetlr - http://tweetlr.5v3n.com}
|
11
11
|
USER_AGENT = %{Mozilla/5.0 (compatible; tweetlr/#{VERSION}; +http://tweetlr.5v3n.com)}
|
12
12
|
LOCATION_START_INDICATOR = 'Location: '
|
@@ -18,6 +18,8 @@ class Tweetlr
|
|
18
18
|
TWITTER_RESULTS_TYPE = 'recent'
|
19
19
|
UPDATE_PERIOD = 600 #10 minutes
|
20
20
|
|
21
|
+
PIC_REGEXP = /(.*?)\.(jpg|jpeg|png|gif)/i
|
22
|
+
|
21
23
|
def initialize(email, password, args={:terms=>nil, :whitelist => nil, :shouts => nil, :since_id=>nil, :results_per_page => nil, :loglevel=>nil, :result_type => nil})
|
22
24
|
@log = Logger.new(STDOUT)
|
23
25
|
if (Logger::DEBUG..Logger::UNKNOWN).to_a.index(args[:loglevel])
|
@@ -35,10 +37,10 @@ class Tweetlr
|
|
35
37
|
@result_type = args[:result_type] || TWITTER_RESULTS_TYPE
|
36
38
|
@api_endpoint_twitter = args[:api_endpoint_twitter] || API_ENDPOINT_TWITTER
|
37
39
|
@api_endpoint_tumblr = args[:api_endpoint_tumblr] || API_ENDPOINT_TUMBLR
|
38
|
-
@whitelist = args[:whitelist]
|
40
|
+
@whitelist = args[:whitelist]
|
39
41
|
@shouts = args[:shouts]
|
40
42
|
@update_period = args[:update_period] || UPDATE_PERIOD
|
41
|
-
@whitelist.each {|entry| entry.downcase!}
|
43
|
+
@whitelist.each {|entry| entry.downcase!} if @whitelist
|
42
44
|
@refresh_url = "#{@api_endpoint_twitter}?ors=#{@search_term}&since_id=#{@since_id}&rpp=#{@results_per_page}&result_type=#{@result_type}" if (@since_id && @search_term)
|
43
45
|
end
|
44
46
|
#post a tumblr photo entry. required arguments are :type, :date, :source, :caption, :state. optional argument: :tags
|
@@ -85,14 +87,15 @@ class Tweetlr
|
|
85
87
|
user = tweet['from_user']
|
86
88
|
tumblr_post[:tags] = user
|
87
89
|
tweet_id = tweet['id']
|
88
|
-
if @whitelist.member?
|
90
|
+
if !@whitelist || @whitelist.member?(user.downcase)
|
89
91
|
state = 'published'
|
90
92
|
else
|
91
93
|
state = 'draft'
|
92
94
|
end
|
93
95
|
tumblr_post[:state] = state
|
94
96
|
shouts = " #{@shouts}" if @shouts
|
95
|
-
tumblr_post[:caption] = %?<a href="http://twitter.com/#{user}/statuses/#{tweet_id}" alt="tweet">@#{user}</a>#{shouts}: #{tweet['text']}?
|
97
|
+
tumblr_post[:caption] = %?<a href="http://twitter.com/#{user}/statuses/#{tweet_id}" alt="tweet">@#{user}</a>#{shouts}: #{tweet['text']}?
|
98
|
+
#TODO make the caption a bigger matter of yml/ general configuration
|
96
99
|
end
|
97
100
|
tumblr_post
|
98
101
|
end
|
@@ -120,10 +123,17 @@ class Tweetlr
|
|
120
123
|
end
|
121
124
|
end
|
122
125
|
|
123
|
-
#extract
|
126
|
+
#extract a linked image file's url from a tweet. first found image will be used.
|
124
127
|
def extract_image_url(tweet)
|
125
|
-
|
126
|
-
|
128
|
+
links = extract_links tweet
|
129
|
+
image_url = nil
|
130
|
+
if links
|
131
|
+
links.each do |link|
|
132
|
+
image_url = find_image_url(link)
|
133
|
+
return image_url if image_url =~ PIC_REGEXP
|
134
|
+
end
|
135
|
+
end
|
136
|
+
image_url
|
127
137
|
end
|
128
138
|
|
129
139
|
#extract the linked image file's url from a tweet
|
@@ -206,7 +216,7 @@ class Tweetlr
|
|
206
216
|
tries = 3
|
207
217
|
begin
|
208
218
|
resp = Curl::Easy.http_get(short_url) { |res| res.follow_location = true }
|
209
|
-
rescue => err
|
219
|
+
rescue Curl::Err => err
|
210
220
|
@log.error "Curl::Easy.http_get failed: #{err}"
|
211
221
|
tries -= 1
|
212
222
|
sleep 3
|
@@ -230,15 +240,11 @@ class Tweetlr
|
|
230
240
|
link.split('/').last if link.split('/')
|
231
241
|
end
|
232
242
|
|
233
|
-
#extract the
|
234
|
-
def
|
243
|
+
#extract the links from a given tweet
|
244
|
+
def extract_links(tweet)
|
235
245
|
if tweet
|
236
246
|
text = tweet['text']
|
237
|
-
|
238
|
-
if start
|
239
|
-
stop = text.index(' ', start) || 0
|
240
|
-
text[start..stop-1]
|
241
|
-
end
|
247
|
+
text.gsub(/https?:\/\/[\S]+/).to_a if text
|
242
248
|
end
|
243
249
|
end
|
244
250
|
|
@@ -262,24 +268,6 @@ class Tweetlr
|
|
262
268
|
return nil
|
263
269
|
end
|
264
270
|
end
|
265
|
-
rescue Curl::Err::ConnectionFailedError => err
|
266
|
-
@log.error "Connection failed: #{err}"
|
267
|
-
tries -= 1
|
268
|
-
sleep 3
|
269
|
-
if tries > 0
|
270
|
-
retry
|
271
|
-
else
|
272
|
-
nil
|
273
|
-
end
|
274
|
-
rescue Curl::Err::RecvError => err
|
275
|
-
@log.error "Failure when receiving data from the peer: #{err}"
|
276
|
-
tries -= 1
|
277
|
-
sleep 3
|
278
|
-
if tries > 0
|
279
|
-
retry
|
280
|
-
else
|
281
|
-
nil
|
282
|
-
end
|
283
271
|
rescue Curl::Err => err
|
284
272
|
@log.error "Failure in Curl call: #{err}"
|
285
273
|
tries -= 1
|
data/spec/spec_helper.rb
CHANGED
@@ -7,6 +7,11 @@ def stub_twitter
|
|
7
7
|
Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
|
8
8
|
end
|
9
9
|
|
10
|
+
def stub_twitter_pics
|
11
|
+
Curl::Easy.any_instance.stub(:body_str).and_return %|{"url": "http://pic.twitter.com/stubbedpic.jpg:large"}|
|
12
|
+
Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
|
13
|
+
end
|
14
|
+
|
10
15
|
def stub_instagram
|
11
16
|
Curl::Easy.any_instance.stub(:body_str).and_return %|{"provider_url": "http://instagram.com/", "title": "Curse you tweets. See what you have done to me?!!!", "url": "http://distillery.s3.amazonaws.com/media/2011/05/02/d25df62b9cec4a138967a3ad027d055b_7.jpg", "author_name": "loswhit", "height": 612, "width": 612, "version": "1.0", "author_url": "http://instagram.com/", "provider_name": "Instagram", "type": "photo"}|
|
12
17
|
Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
|
@@ -58,7 +63,8 @@ Server: nginx/1.0.0 + Phusion Passenger 3.0.7 (mod_rails/mod_rack)
|
|
58
63
|
end
|
59
64
|
|
60
65
|
def stub_twitpic
|
61
|
-
|
66
|
+
curl = Curl::Easy.new
|
67
|
+
Curl::Easy.any_instance.stub(:perform).and_return curl
|
62
68
|
Curl::Easy.any_instance.stub(:header_str).and_return %|HTTP/1.1 302 Moved Temporarily
|
63
69
|
Server: nginx
|
64
70
|
Date: Sun, 17 Jul 2011 01:03:43 GMT
|
@@ -73,6 +79,9 @@ Expires: Sun, 17 Jul 2011 03:50:23 GMT
|
|
73
79
|
Pragma: public
|
74
80
|
Location: http://s3.amazonaws.com/twitpic/photos/full/249034281.jpg?AWSAccessKeyId=AKIAJF3XCCKACR3QDMOA&Expires=1310865623&Signature=KNFdFAK%2Bu0u3maMaguUjsm2MbaM%3D\r\n
|
75
81
|
|
|
82
|
+
#stub redirected call's response
|
83
|
+
Curl::Easy.stub!(:http_get).and_return curl
|
84
|
+
Curl::Easy.any_instance.stub(:body_str).and_return %|http://s3.amazonaws.com/twitpic/photos/full/249034281.jpg?AWSAccessKeyId=AKIAJF3XCCKACR3QDMOA&Expires=1310865623&Signature=KNFdFAK%2Bu0u3maMaguUjsm2MbaM%3D\r\n|
|
76
85
|
end
|
77
86
|
|
78
87
|
def stub_tco
|
data/spec/tweetlr_spec.rb
CHANGED
@@ -12,10 +12,6 @@ describe Tweetlr do
|
|
12
12
|
before :each do
|
13
13
|
@credentials = {:email => USER, :password => PW}
|
14
14
|
@searchterm = 'fail'
|
15
|
-
@twitter_response = {"from_user_id_str"=>"1915714", "profile_image_url"=>"http://a0.twimg.com/profile_images/386000279/2_normal.jpg", "created_at"=>"Sun, 17 Apr 2011 16:48:42 +0000", "from_user"=>"whitey_Mc_whIteLIst", "id_str"=>"59659561224765440", "metadata"=>{"result_type"=>"recent"}, "to_user_id"=>nil, "text"=>"Rigaer #wirsounterwegs @ Augenarzt Dr. Lierow http://instagr.am/p/DzCWn/", "id"=>59659561224765440, "from_user_id"=>1915714, "geo"=>{"type"=>"Point", "coordinates"=>[52.5182, 13.454]}, "iso_language_code"=>"de", "place"=>{"id"=>"3078869807f9dd36", "type"=>"city", "full_name"=>"Berlin, Berlin"}, "to_user_id_str"=>nil, "source"=>"<a href="http://instagr.am" rel="nofollow">instagram</a>"}
|
16
|
-
@non_whitelist_tweet = @twitter_response.merge 'from_user' => 'nonwhitelist user'
|
17
|
-
@retweet = @twitter_response.merge "text" => "bla bla RT @fgd: tueddelkram"
|
18
|
-
@new_style_retweet = @twitter_response.merge "text" => "and it scales! \u201c@moeffju: http://t.co/8gUSPKu #hktbl1 #origami success! :)\u201d"
|
19
15
|
@links = {
|
20
16
|
:instagram => "http://instagr.am/p/DzCWn/",
|
21
17
|
:twitpic => "http://twitpic.com/449o2x",
|
@@ -24,12 +20,30 @@ describe Tweetlr do
|
|
24
20
|
:imgly => "http://img.ly/3M1o",
|
25
21
|
:tco => 'http://t.co/MUGNayA',
|
26
22
|
:lockerz => 'http://lockerz.com/s/100269159',
|
27
|
-
:
|
28
|
-
:
|
23
|
+
:embedly => 'http://flic.kr/p/973hTv',
|
24
|
+
:twitter_pics => 'http://t.co/FmyBGfyY'
|
29
25
|
}
|
30
|
-
@
|
26
|
+
@tweets = {
|
27
|
+
:instagram => {'text' => "jadda jadda http://instagr.am/p/DzCWn/"},
|
28
|
+
:twitpic => {'text' => "jadda jadda http://twitpic.com/449o2x"},
|
29
|
+
:yfrog => {'text' => "jadda jadda http://yfrog.com/h4vlfp"},
|
30
|
+
:picplz => {'text' => "jadda jadda http://picplz.com/2hWv"},
|
31
|
+
:imgly => {'text' => "jadda jadda http://img.ly/3M1o"},
|
32
|
+
:tco => {'text' => "jadda jadda http://t.co/MUGNayA"},
|
33
|
+
:lockerz => {'text' => "jadda jadda http://lockerz.com/s/100269159"},
|
34
|
+
:embedly => {'text' => "jadda jadda http://flic.kr/p/973hTv"},
|
35
|
+
:twitter_pics => {'text' => "jadda jadda http://t.co/FmyBGfyY"}
|
36
|
+
}
|
37
|
+
@first_link = "http://url.com"
|
38
|
+
@second_link = @links[:instagram]
|
39
|
+
@third_link = "https://imageurl.com"
|
40
|
+
@twitter_response = {"from_user_id_str"=>"1915714", "profile_image_url"=>"http://a0.twimg.com/profile_images/386000279/2_normal.jpg", "created_at"=>"Sun, 17 Apr 2011 16:48:42 +0000", "from_user"=>"whitey_Mc_whIteLIst", "id_str"=>"59659561224765440", "metadata"=>{"result_type"=>"recent"}, "to_user_id"=>nil, "text"=>"Rigaer #wirsounterwegs #{@first_link} @ Augenarzt Dr. Lierow #{@second_link} #{@third_link}", "id"=>59659561224765440, "from_user_id"=>1915714, "geo"=>{"type"=>"Point", "coordinates"=>[52.5182, 13.454]}, "iso_language_code"=>"de", "place"=>{"id"=>"3078869807f9dd36", "type"=>"city", "full_name"=>"Berlin, Berlin"}, "to_user_id_str"=>nil, "source"=>"<a href="http://instagr.am" rel="nofollow">instagram</a>"}
|
41
|
+
@non_whitelist_tweet = @twitter_response.merge 'from_user' => 'nonwhitelist user'
|
42
|
+
@retweet = @twitter_response.merge "text" => "bla bla RT @fgd: tueddelkram"
|
43
|
+
@new_style_retweet = @twitter_response.merge "text" => "and it scales! \u201c@moeffju: http://t.co/8gUSPKu #hktbl1 #origami success! :)\u201d"
|
44
|
+
@pic_regexp = /(.*?)\.(jpg|jpeg|png|gif)/i
|
31
45
|
@config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
|
32
|
-
@tweetlr = Tweetlr.new(USER, PW, {:whitelist => WHITELIST, :results_per_page => 5, :since_id => TIMESTAMP, :terms => @searchterm, :loglevel => 4
|
46
|
+
@tweetlr = Tweetlr.new(USER, PW, {:whitelist => WHITELIST, :results_per_page => 5, :since_id => TIMESTAMP, :terms => @searchterm, :loglevel => 4})
|
33
47
|
end
|
34
48
|
# it "should post to tumblr" do
|
35
49
|
# tumblr_post = @tweetlr.generate_tumblr_photo_post @twitter_response
|
@@ -46,15 +60,35 @@ describe Tweetlr do
|
|
46
60
|
tweets.should be
|
47
61
|
tweets.should_not be_empty
|
48
62
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
63
|
+
context "given a user whitelist" do
|
64
|
+
it "should mark whitelist users' tweets as published" do
|
65
|
+
stub_instagram
|
66
|
+
post = @tweetlr.generate_tumblr_photo_post @twitter_response
|
67
|
+
post[:state].should == 'published'
|
68
|
+
end
|
69
|
+
it "should mark non whitelist users' tweets as drafts" do
|
70
|
+
stub_instagram
|
71
|
+
post = @tweetlr.generate_tumblr_photo_post @non_whitelist_tweet
|
72
|
+
post[:state].should == 'draft'
|
73
|
+
end
|
53
74
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
75
|
+
context "without a user whitelist" do
|
76
|
+
before :each do
|
77
|
+
@tweetlr = Tweetlr.new(USER, PW, {
|
78
|
+
:whitelist => nil,
|
79
|
+
:results_per_page => 5,
|
80
|
+
:since_id => TIMESTAMP,
|
81
|
+
:terms => @searchterm,
|
82
|
+
:loglevel => 4})
|
83
|
+
end
|
84
|
+
it "should mark every users' posts as published" do
|
85
|
+
stub_instagram
|
86
|
+
post = @tweetlr.generate_tumblr_photo_post @twitter_response
|
87
|
+
post[:state].should == 'published'
|
88
|
+
stub_instagram
|
89
|
+
post = @tweetlr.generate_tumblr_photo_post @non_whitelist_tweet
|
90
|
+
post[:state].should == 'published'
|
91
|
+
end
|
58
92
|
end
|
59
93
|
it "should not use retweets which would produce double blog posts" do
|
60
94
|
post = @tweetlr.generate_tumblr_photo_post @retweet
|
@@ -64,13 +98,13 @@ describe Tweetlr do
|
|
64
98
|
post = @tweetlr.generate_tumblr_photo_post @new_style_retweet
|
65
99
|
post.should_not be
|
66
100
|
end
|
67
|
-
|
101
|
+
context "image url processing" do
|
68
102
|
it "should find a picture's url from the supported services" do
|
69
103
|
@links.each do |key,value|
|
70
104
|
send "stub_#{key}"
|
71
105
|
url = @tweetlr.find_image_url value
|
72
106
|
url.should be, "service #{key} not working!"
|
73
|
-
check_pic_url_extraction key if [:instagram,:picplz,:yfrog,:imgly,:
|
107
|
+
check_pic_url_extraction key if [:instagram,:picplz,:yfrog,:imgly,:not_listed].index key
|
74
108
|
end
|
75
109
|
end
|
76
110
|
it "should not crash if embedly fallback won't find a link" do
|
@@ -83,23 +117,36 @@ describe Tweetlr do
|
|
83
117
|
end
|
84
118
|
end
|
85
119
|
describe "tweet api response processing" do
|
86
|
-
it "
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
120
|
+
it "extracts links" do
|
121
|
+
links = @tweetlr.extract_links ''
|
122
|
+
links.should be_nil
|
123
|
+
links = @tweetlr.extract_links @twitter_response
|
124
|
+
links[0].should == @first_link
|
125
|
+
links[1].should == @second_link
|
126
|
+
links[2].should == @third_link
|
92
127
|
end
|
128
|
+
it "uses the first image link found in a tweet with multiple links" do
|
129
|
+
stub_instagram
|
130
|
+
link = @tweetlr.extract_image_url @twitter_response
|
131
|
+
link.should == 'http://distillery.s3.amazonaws.com/media/2011/05/02/d25df62b9cec4a138967a3ad027d055b_7.jpg'
|
132
|
+
end
|
93
133
|
it "follows redirects" do
|
94
134
|
stub_imgly
|
95
135
|
link = @tweetlr.link_url_redirect 'im mocked anyways'
|
96
136
|
link.should == 'http://s3.amazonaws.com/imgly_production/899582/full.jpg'
|
97
137
|
end
|
138
|
+
it "extracts pictures from links" do
|
139
|
+
@tweets.each do |key,value|
|
140
|
+
send "stub_#{key}"
|
141
|
+
url = @tweetlr.extract_image_url value
|
142
|
+
url.should be, "service #{key} not working!"
|
143
|
+
check_pic_url_extraction key if [:instagram,:picplz,:yfrog,:imgly,:not_listed].index key
|
144
|
+
end
|
145
|
+
end
|
98
146
|
end
|
99
147
|
|
100
148
|
def check_pic_url_extraction(service)
|
101
|
-
|
102
|
-
image_url = tweetlr.send "image_url_#{service}".to_sym, @links[service]
|
149
|
+
image_url = @tweetlr.send "image_url_#{service}".to_sym, @links[service]
|
103
150
|
image_url.should =~ @pic_regexp
|
104
151
|
end
|
105
152
|
|
data/tweetlr.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tweetlr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
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: 2011-
|
12
|
+
date: 2011-11-05 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: daemons
|
16
|
-
requirement: &
|
16
|
+
requirement: &2156339340 !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: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2156339340
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: eventmachine
|
27
|
-
requirement: &
|
27
|
+
requirement: &2156338900 !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: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2156338900
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: curb
|
38
|
-
requirement: &
|
38
|
+
requirement: &2156338480 !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: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2156338480
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: json
|
49
|
-
requirement: &
|
49
|
+
requirement: &2156338060 !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: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2156338060
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rake
|
60
|
-
requirement: &
|
60
|
+
requirement: &2156337560 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.8.7
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2156337560
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &2156337140 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2156337140
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rdoc
|
82
|
-
requirement: &
|
82
|
+
requirement: &2156336680 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2156336680
|
91
91
|
description: tweetlr crawls twitter for a given term, extracts photos out of the collected
|
92
92
|
tweets' short urls and posts the images to tumblr.
|
93
93
|
email: sven.kraeuter@gmail.com
|