tweetlr 0.1.5 → 0.1.6
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/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
|