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 CHANGED
@@ -13,8 +13,7 @@ tweetlr supports
13
13
  - twitpic
14
14
  - yfrog
15
15
  - imgly
16
- - lockerz / the service formerly known as plixi
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.5'
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? user.downcase
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']}? #TODO make this a bigger matter of yml configuration
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 the linked image file's url from a tweet
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
- link = extract_link tweet
126
- find_image_url link
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 link from a given tweet
234
- def extract_link(tweet)
243
+ #extract the links from a given tweet
244
+ def extract_links(tweet)
235
245
  if tweet
236
246
  text = tweet['text']
237
- start = text.index('http') if text
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
- Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
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"=>"&lt;a href=&quot;http://instagr.am&quot; rel=&quot;nofollow&quot;&gt;instagram&lt;/a&gt;"}
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
- :foursquare => 'http://4sq.com/mLKDdF',
28
- :embedly => 'http://flic.kr/p/973hTv'
23
+ :embedly => 'http://flic.kr/p/973hTv',
24
+ :twitter_pics => 'http://t.co/FmyBGfyY'
29
25
  }
30
- @pic_regexp = /(.*?)\.(jpg|jpeg|png|gif)$/i
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"=>"&lt;a href=&quot;http://instagr.am&quot; rel=&quot;nofollow&quot;&gt;instagram&lt;/a&gt;"}
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, :cookie => @cookie})
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
- it "should mark whitelist users' tweets as published" do
50
- stub_instagram
51
- post = @tweetlr.generate_tumblr_photo_post @twitter_response
52
- post[:state].should == 'published'
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
- it "should mark non whitelist users' tweets as drafts" do
55
- stub_instagram
56
- post = @tweetlr.generate_tumblr_photo_post @non_whitelist_tweet
57
- post[:state].should == 'draft'
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
- describe "image url processing" do
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,:foursquare,:not_listed].index key
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 "should extract links" do
87
- tweetlr = @tweetlr
88
- link = tweetlr.extract_link @twitter_response
89
- link.should == @links[:instagram]
90
- link = tweetlr.extract_link @twitter_response.merge 'text' => @links[:instagram].chop #check if it works w/o the trailing slash
91
- link.should == @links[:instagram].chop
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
- tweetlr = @tweetlr
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "tweetlr"
3
- s.version = "0.1.5"
3
+ s.version = "0.1.6"
4
4
  s.author = "Sven Kraeuter"
5
5
  s.email = "sven.kraeuter@gmail.com"
6
6
  s.homepage = "http://tweetlr.5v3n.com"
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.5
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-10-04 00:00:00.000000000Z
12
+ date: 2011-11-05 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
16
- requirement: &2153779740 !ruby/object:Gem::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: *2153779740
24
+ version_requirements: *2156339340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2153805660 !ruby/object:Gem::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: *2153805660
35
+ version_requirements: *2156338900
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: curb
38
- requirement: &2153805240 !ruby/object:Gem::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: *2153805240
46
+ version_requirements: *2156338480
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: json
49
- requirement: &2153804820 !ruby/object:Gem::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: *2153804820
57
+ version_requirements: *2156338060
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &2153804320 !ruby/object:Gem::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: *2153804320
68
+ version_requirements: *2156337560
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &2153803900 !ruby/object:Gem::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: *2153803900
79
+ version_requirements: *2156337140
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rdoc
82
- requirement: &2153803440 !ruby/object:Gem::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: *2153803440
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