tweetlr 0.1.4pre2 → 0.1.4pre4

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/.travis.yml ADDED
@@ -0,0 +1,36 @@
1
+ # Passes arguments to bundle install (http://gembundler.com/man/bundle-install.1.html)
2
+ bundler_args: --binstubs
3
+
4
+ # Specify which ruby versions you wish to run your tests on, each version will be used
5
+ rvm:
6
+ - 1.9.2
7
+ - 1.8.7 # (current default)
8
+
9
+ # Define how to run your tests (defaults to `bundle exec rake` or `rake` depending on whether you have a `Gemfile`)
10
+ script: "bundle exec rake test"
11
+
12
+ # Define tasks to be completed before and after tests run . Will allow folding of content on frontend
13
+ # before_script:
14
+ # - command_1
15
+ # - command_2
16
+ #
17
+ # after_script:
18
+ # - command_1
19
+ # - command_2
20
+
21
+ # Specify an ENV variable to run before: 'bundle install' and 'rake' (or your defined 'script')
22
+ env: "RACK_ENV='test' "
23
+
24
+ # Specify the recipients for email notification
25
+ notifications:
26
+ recipients:
27
+ - github@svenkraeuter.com
28
+ #disabled: true # Disable email notifications
29
+
30
+ # Specify branches to build
31
+ # You can either specify only or except. If you specify both, except will be ignored.
32
+ branches:
33
+ only:
34
+ - master
35
+ # except:
36
+ # - legacy
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  tweetlr crawls twitter for a given term, extracts photos out of the collected tweets' short urls and posts the images to tumblr.
4
4
 
5
+ <a href="http://travis-ci.org/#!/5v3n/tweetlr">![travis-ci](http://travis-ci.org/5v3n/tweetlr.png)</a>
6
+
5
7
  ## Supported image sharing services
6
8
 
7
9
  tweetlr supports
@@ -14,6 +16,7 @@ tweetlr supports
14
16
  - lockerz / the service formerly known as plixi
15
17
  - foursquare
16
18
  - t.co shortened links to pictures
19
+ - every service accessible via embed.ly (see [photo providers](http://embed.ly/providers))
17
20
 
18
21
  ## Installation
19
22
 
@@ -34,7 +37,7 @@ tumblr_username: YOUR_TUMBLR_EMAIL
34
37
  tumblr_password: YOUR_TUMBLR_PW
35
38
  update_period: 300 #check for updates every 300 secs = 5 minutes
36
39
  shouts: 'says' # will be concatenated after the username, before the message: @mr_x says: awesome things on a photo!
37
- loglevel: 0 # 0: debug, 1: info (default), 2: warn, 3: error, 5: fatal
40
+ loglevel: 1 # 0: debug, 1: info (default), 2: warn, 3: error, 5: fatal
38
41
  whitelist: #twitter accounts in that list will have their tweets published immediately. post from others will be saved as drafts
39
42
  - whitey_mc_whitelist
40
43
  - sven_kr
data/lib/tweetlr.rb CHANGED
@@ -6,13 +6,13 @@ require 'json'
6
6
 
7
7
  class Tweetlr
8
8
 
9
- VERSION = '0.1.4pre2'
9
+ VERSION = '0.1.4pre3'
10
10
  GENERATOR = %{tweetlr - http://github.com/5v3n/tweetlr}
11
11
  USER_AGENT = %{Mozilla/5.0 (compatible; tweetlr/#{VERSION}; +http://github.com/5v3n/tweetlr/wiki)}
12
12
  LOCATION_START_INDICATOR = 'Location: '
13
13
  LOCATION_STOP_INDICATOR = "\r\n"
14
14
 
15
- def initialize(email, password, config_file, args={:cookie => nil, :since_id=>nil, :terms=>nil, :loglevel=>Logger::INFO})
15
+ def initialize(email, password, config_file, args={:cookie => nil, :since_id=>nil, :results_per_page => nil, :terms=>nil, :loglevel=>Logger::INFO})
16
16
  @log = Logger.new(STDOUT)
17
17
  @log.level = args[:loglevel] if (Logger::DEBUG..Logger::UNKNOWN).to_a.index(args[:loglevel])
18
18
  @log.debug "log level set to #{@log.level}"
@@ -22,7 +22,7 @@ class Tweetlr
22
22
  @since_id = args[:since_id]
23
23
  @search_term = args[:terms]
24
24
  @cookie = args[:cookie]
25
- @results_per_page = config['results_per_page']
25
+ @results_per_page = args[:results_per_page] || config['results_per_page'] #TODO decide how to trade args vs config file
26
26
  @result_type = config['result_type']
27
27
  @api_endpoint_twitter = config['api_endpoint_twitter']
28
28
  @api_endpoint_tumblr = config['api_endpoint_tumblr']
@@ -210,7 +210,19 @@ class Tweetlr
210
210
  end
211
211
 
212
212
  def link_url_redirect(short_url, stop_indicator = LOCATION_STOP_INDICATOR)
213
- resp = Curl::Easy.http_get(short_url) { |res| res.follow_location = true }
213
+ tries = 3
214
+ begin
215
+ resp = Curl::Easy.http_get(short_url) { |res| res.follow_location = true }
216
+ rescue => err
217
+ @log.error "Curl::Easy.http_get failed: #{err}"
218
+ tries -= 1
219
+ sleep 3
220
+ if tries > 0
221
+ retry
222
+ else
223
+ return nil
224
+ end
225
+ end
214
226
  if(resp && resp.header_str.index(LOCATION_START_INDICATOR) && resp.header_str.index(stop_indicator))
215
227
  start = resp.header_str.index(LOCATION_START_INDICATOR) + LOCATION_START_INDICATOR.size
216
228
  stop = resp.header_str.index(stop_indicator, start)
@@ -253,7 +265,8 @@ class Tweetlr
253
265
  @log.warn "#{err}: Could not parse response for #{request} - this is probably not a json response: #{curl.body_str}"
254
266
  return nil
255
267
  rescue Encoding::CompatibilityError => err
256
- @log.error "Trying to rescue a JSON::ParserError for '#{requet}' we got stuck in a Encoding::CompatibilityError."
268
+ @log.error "Trying to rescue a JSON::ParserError for '#{request}' we got stuck in a Encoding::CompatibilityError."
269
+ return nil
257
270
  end
258
271
  end
259
272
  rescue Curl::Err::ConnectionFailedError => err
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,120 @@
1
+ #encoding: utf-8
1
2
  require "bundler"
2
3
  Bundler.require :default, :development
4
+
5
+ module Curl
6
+ class Easy
7
+ attr_accessor :body_str, :header_str
8
+ @@mocked_response = Curl::Easy.new
9
+ def perform
10
+ return @@mocked_response
11
+ end
12
+ def self.http_get(url)
13
+ return @@mocked_response
14
+ end
15
+ def self.mock_body_str=(str)
16
+ @@mock_body_str = str
17
+ end
18
+ def self.mock_header_str=(str)
19
+ @@mock_header_str = str
20
+ end
21
+ def body_str
22
+ @@mock_body_str
23
+ end
24
+ def header_str
25
+ @@mock_header_str
26
+ end
27
+ end
28
+ end
29
+
30
+ def mock_reset
31
+ Curl::Easy.mock_body_str = nil
32
+ Curl::Easy.mock_header_str = nil
33
+ end
34
+
35
+ def mock_bad_request
36
+ Curl::Easy.mock_body_str = %|<html><title>400: Bad Request - Invalid URL format http://mopskopf</title><body>400: Bad Request - Invalid URL format http://mopskopf</body></html>|
37
+ end
38
+
39
+ def mock_utf8_response
40
+ Curl::Easy.mock_body_str = %|√∫ƒ® are inhabitnts of utf-8 wonderländ.|
41
+ end
42
+
43
+ def mock_twitter
44
+ Curl::Easy.mock_body_str = %|{"results":[{"from_user_id_str":"220650275","profile_image_url":"http://a2.twimg.com/profile_images/668619338/9729_148876458070_505518070_2628895_7160219_n_normal.jpg","created_at":"Sat, 16 Jul 2011 23:20:01 +0000","from_user":"LoMuma","id_str":"92372947855093760","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Need to stop procrastinating! 5 quizzes and personal responses due tomorrow... #fail","id":92372947855093760,"from_user_id":220650275,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"129718556","profile_image_url":"http://a2.twimg.com/profile_images/1428268221/twitter_normal.png","created_at":"Sat, 16 Jul 2011 23:20:01 +0000","from_user":"priiislopes","id_str":"92372947846692865","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Esse jogo do Flu foi uma vergonha. Se ele fez o melhor dele no brasileiro semana passada, hj fez o pior de todos os tempos. #Fail","id":92372947846692865,"from_user_id":129718556,"geo":null,"iso_language_code":"pt","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"259930166","profile_image_url":"http://a3.twimg.com/profile_images/1425221519/foto_normal.jpg","created_at":"Sat, 16 Jul 2011 23:20:00 +0000","from_user":"YamiiG4","id_str":"92372943132303360","metadata":{"result_type":"recent"},"to_user_id":null,"text":"vaya que eran 2 minutos..#FAIL!","id":92372943132303360,"from_user_id":259930166,"geo":null,"iso_language_code":"es","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"321557905","profile_image_url":"http://a0.twimg.com/profile_images/1445672626/profile_normal.png","created_at":"Sat, 16 Jul 2011 23:20:00 +0000","from_user":"JasWafer_FFOE","id_str":"92372941379088384","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @eye_OFBEHOLDER: RT @JasWafer_FFOE #Oomf said that he'll NEVER eat pussy! O.o --#FAIL","id":92372941379088384,"from_user_id":321557905,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twidroyd.com&quot; rel=&quot;nofollow&quot;&gt;Twidroyd for Android&lt;/a&gt;"},{"from_user_id_str":"279395613","profile_image_url":"http://a0.twimg.com/profile_images/1334871419/lnnsquare_normal.jpg","created_at":"Sat, 16 Jul 2011 23:19:59 +0000","from_user":"LanguageNewsNet","id_str":"92372940640890881","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Questioning the Inca Paradox: Did the civilization behind Machu Picchu really fail to develop a written la... http://tinyurl.com/5sfos23","id":92372940640890881,"from_user_id":279395613,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"}],"max_id":92372947855093760,"since_id":0,"refresh_url":"?since_id=92372947855093760&q=+fail","next_page":"?page=2&max_id=92372947855093760&rpp=5&q=+fail","results_per_page":5,"page":1,"completed_in":0.022152,"since_id_str":"0","max_id_str":"92372947855093760","query":"+fail"}|
45
+ end
46
+
47
+ def mock_instagram
48
+ Curl::Easy.mock_body_str = %|{"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"}|
49
+ end
50
+
51
+ def mock_yfrog
52
+ Curl::Easy.mock_body_str = %|{"version":"1.0","provider_name":"yFrog","provider_url":"http:\/\/yfrog.com","thumbnail_url":"http:\/\/yfrog.com\/h4vlfp:small","width":1210,"height":894,"type":"image","url":"http:\/\/img616.yfrog.com\/img616\/16\/vlf.png"}|
53
+ end
54
+
55
+ def mock_picplz
56
+ Curl::Easy.mock_body_str = %|{"result":"ok","value":{"pics":[{"city":{"url":"/city/los-angeles-ca/","id":27,"name":"Los Angeles, CA"},"creator":{"username":"lakers","display_name":"Los Angeles Lakers","following_count":8,"follower_count":2364,"id":216541,"icon":{"url":"http://s1.ui1.picplzthumbs.com/usericons/c7/46/be/c746bee5eb6926e71f46176fddbd3fc16fc9b198_meds.jpg","width":75,"height":75}},"url":"/user/lakers/pic/6rlcc/","pic_files":{"640r":{"width":640,"img_url":"http://s1.i1.picplzthumbs.com/upload/img/7c/54/a0/7c54a0a10d3e97bef7ac570e14f461b1836e9168_wmeg.jpg","height":478},"100sh":{"width":100,"img_url":"http://s1.i1.picplzthumbs.com/upload/img/7c/54/a0/7c54a0a10d3e97bef7ac570e14f461b1836e9168_t200s.jpg","height":100},"320rh":{"width":320,"img_url":"http://s1.i1.picplzthumbs.com/upload/img/7c/54/a0/7c54a0a10d3e97bef7ac570e14f461b1836e9168_mmed.jpg","height":239}},"view_count":10873,"caption":"The playoff logo down on the floor.","comment_count":2,"like_count":24,"place":{"url":"/pics/staples-center-los-angeles-ca/","id":17357,"name":"STAPLES Center"},"date":1303059128,"id":1662796}]}}|
57
+ end
58
+
59
+ def mock_lockerz
60
+ Curl::Easy.mock_body_str = %|{"BigImageUrl":"http:\/\/c0013763.cdn1.cloudfiles.rackspacecloud.com\/x2_5f9fc67","CommentCount":1,"DetailsUrl":"http:\/\/api.plixi.com\/api\/tpapi.svc\/json\/photos\/100269159","GdAlias":"100269159","Id":100269159,"LargeImageUrl":"http:\/\/c0013763.cdn1.cloudfiles.rackspacecloud.com\/x2_5f9fc67","LikedVotes":0,"Location":{"Latitude":0,"Longitude":0},"MediumImageUrl":"http:\/\/c0013764.cdn1.cloudfiles.rackspacecloud.com\/x2_5f9fc67","Message":"Her name is Tofoi Al Nasr , she Reps the future of Qatar. @ the Doha Forum, technology is the new Revolution! ","MobileImageUrl":"http:\/\/c0013765.cdn1.cloudfiles.rackspacecloud.com\/x2_5f9fc67","Name":"x2_5f9fc67","SmallImageUrl":"http:\/\/c0013766.cdn1.cloudfiles.rackspacecloud.com\/x2_5f9fc67","ThumbnailUrl":"http:\/\/c0013767.cdn1.cloudfiles.rackspacecloud.com\/x2_5f9fc67","TinyAlias":"100269159","TwitterStatusId":67672440125394944,"UnLikedVotes":0,"UploadDate":1304969336,"UploadDateString":"2011-05-09T19:28:56Z","UserId":1067006,"Views":9319,"Vote":null}|
61
+ end
62
+
63
+ #follow redirect lookups
64
+
65
+ def mock_imgly
66
+ Curl::Easy.mock_header_str = %|HTTP/1.1 302 Found
67
+ Content-Type: text/html; charset=utf-8
68
+ Connection: keep-alive
69
+ Status: 302
70
+ X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.7
71
+ Location: http://s3.amazonaws.com/imgly_production/899582/full.jpg\r\nX-Runtime: 5
72
+ Content-Length: 122
73
+ Set-Cookie: _imgly_session=BAh7BjoPc2Vzc2lvbl9pZCIlZTk3ZDI2ZmNhNWJjNGVjOTVjNDdiNThjOWFkYjliNTY%3D--83345d9317715d664bcb5de63b0529488a17a351; domain=.img.ly; path=/; expires=Sun, 31-Jul-2011 00:59:06 GMT; HttpOnly
74
+ Cache-Control: no-cache
75
+ Server: nginx/1.0.0 + Phusion Passenger 3.0.7 (mod_rails/mod_rack)
76
+
77
+ |
78
+ end
79
+
80
+ def mock_twitpic
81
+ Curl::Easy.mock_header_str = %|HTTP/1.1 302 Moved Temporarily
82
+ Server: nginx
83
+ Date: Sun, 17 Jul 2011 01:03:43 GMT
84
+ Content-Type: image/jpeg
85
+ Transfer-Encoding: chunked
86
+ Connection: keep-alive
87
+ X-Powered-By: PHP/5.3.5-1ubuntu7.2
88
+ Last-Modified: Sat, 16 Jul 2011 22:17:03 GMT
89
+ Etag: 0fe3c085839afa6e42ce28973192704a
90
+ Cache-Control: maxage=10000
91
+ Expires: Sun, 17 Jul 2011 03:50:23 GMT
92
+ Pragma: public
93
+ Location: http://s3.amazonaws.com/twitpic/photos/full/249034281.jpg?AWSAccessKeyId=AKIAJF3XCCKACR3QDMOA&Expires=1310865623&Signature=KNFdFAK%2Bu0u3maMaguUjsm2MbaM%3D\r\n
94
+ |
95
+ end
96
+
97
+ def mock_tco
98
+ Curl::Easy.mock_header_str = %|HTTP/1.1 301 Moved Permanently
99
+ Date: Sun, 17 Jul 2011 01:03:51 GMT
100
+ Server: hi
101
+ Location: http://yfrog.com/h0m3vpj
102
+ Cache-Control: private,max-age=300
103
+ Expires: Sun, 17 Jul 2011 01:08:51 GMT
104
+ Content-Length: 0
105
+ Connection: close
106
+ Content-Type: text/html; charset=UTF-8
107
+
108
+ |
109
+ mock_yfrog
110
+ end
111
+
112
+ #embedly powered lookups
113
+
114
+ def mock_foursquare
115
+ Curl::Easy.mock_body_str = %|{"provider_url": "http://foursquare.com", "description": "See where your friends are, learn about the places they frequent, and unlock rewards as you travel. 8555 Fletcher PkwyLa Mesa, CA 91942(619) 589-0071", "title": "Matt S. checked in at Banbu Sushi Bar And Grill", "url": "https://playfoursquare.s3.amazonaws.com/pix/PNIBDBIPP5G2XGROCZXVCOHABOZP4MICHZVPJWZXZWAN3SEQ.jpg", "author_name": "Matt S.", "height": 345, "width": 460, "thumbnail_url": "https://playfoursquare.s3.amazonaws.com/pix/PNIBDBIPP5G2XGROCZXVCOHABOZP4MICHZVPJWZXZWAN3SEQ.jpg", "thumbnail_width": 460, "version": "1.0", "provider_name": "Foursquare", "type": "photo", "thumbnail_height": 345, "author_url": "https://foursquare.com/mjstraus"}|
116
+ end
117
+
118
+ def mock_embedly
119
+ Curl::Easy.mock_body_str = %|{"provider_url": "http://www.flickr.com/", "description": "Lady GaGa", "title": "Lady GaGa", "url": "http://farm6.static.flickr.com/5204/5319200155_c966f67dc3.jpg", "author_name": "mjcom18", "height": 468, "width": 307, "thumbnail_url": "http://farm6.static.flickr.com/5204/5319200155_c966f67dc3_t.jpg", "thumbnail_width": 66, "version": "1.0", "provider_name": "Flickr", "cache_age": 3600, "type": "photo", "thumbnail_height": 100, "author_url": "http://www.flickr.com/photos/57795463@N05/"}|
120
+ end
data/spec/tweetlr_spec.rb CHANGED
@@ -25,11 +25,12 @@ describe Tweetlr do
25
25
  :tco => 'http://t.co/MUGNayA',
26
26
  :lockerz => 'http://lockerz.com/s/100269159',
27
27
  :foursquare => 'http://4sq.com/mLKDdF',
28
- :embedly => 'http://flic.kr/p/973hTv' #if no service matches, just try embedly
28
+ :embedly => 'http://flic.kr/p/973hTv'
29
29
  }
30
30
  @pic_regexp = /(.*?)\.(jpg|jpeg|png|gif)$/i
31
31
  @config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
32
- @tweetlr = Tweetlr.new(USER, PW, @config_file, {:since_id => TIMESTAMP, :terms => @searchterm, :loglevel => 4, :cookie => @cookie})
32
+ @tweetlr = Tweetlr.new(USER, PW, @config_file, {:results_per_page => 5, :since_id => TIMESTAMP, :terms => @searchterm, :loglevel => 4, :cookie => @cookie})
33
+ mock_reset
33
34
  end
34
35
  # it "should post to tumblr" do
35
36
  # tweetlr = Tweetlr.new @credentials[:email], @credentials[:password], @cookie, nil, @searchterm, @config_file
@@ -40,6 +41,7 @@ describe Tweetlr do
40
41
  # response.response_code.should be 201
41
42
  # end
42
43
  it "should search twitter for a given term" do
44
+ mock_twitter
43
45
  tweetlr = @tweetlr
44
46
  response = tweetlr.search_twitter
45
47
  tweets = response['results']
@@ -47,10 +49,12 @@ describe Tweetlr do
47
49
  tweets.should_not be_empty
48
50
  end
49
51
  it "should mark whitelist users' tweets as published" do
52
+ mock_instagram
50
53
  post = @tweetlr.generate_tumblr_photo_post @twitter_response
51
54
  post[:state].should == 'published'
52
55
  end
53
56
  it "should mark non whitelist users' tweets as drafts" do
57
+ mock_instagram
54
58
  post = @tweetlr.generate_tumblr_photo_post @non_whitelist_tweet
55
59
  post[:state].should == 'draft'
56
60
  end
@@ -65,15 +69,18 @@ describe Tweetlr do
65
69
  describe "image url processing" do
66
70
  it "should find a picture's url from the supported services" do
67
71
  @links.each do |key,value|
72
+ send "mock_#{key}"
68
73
  url = @tweetlr.find_image_url value
69
74
  url.should be, "service #{key} not working!"
70
- check_pic_url_extraction key if [:instagram,:picplz,:yfrog,:tco,:foursquare, :not_listed].index key
75
+ check_pic_url_extraction key if [:instagram,:picplz,:yfrog,:imgly,:foursquare,:not_listed].index key
71
76
  end
72
77
  end
73
78
  it "should not crash if embedly fallback won't find a link" do
79
+ mock_bad_request
74
80
  url = @tweetlr.find_image_url "http://mopskopf"
75
81
  end
76
- it "should not crash with an encoding error when instagram says 'No URL Match'" do
82
+ it "should not crash with an encoding error when response is non-us-ascii" do
83
+ mock_utf8_response
77
84
  url = @tweetlr.find_image_url "http://api.instagram.com/oembed?url=http://instagr.am/p/Gx%E2%80%946/"
78
85
  end
79
86
  end
@@ -84,6 +91,11 @@ describe Tweetlr do
84
91
  link.should == @links[:instagram]
85
92
  link = tweetlr.extract_link @twitter_response.merge 'text' => @links[:instagram].chop #check if it works w/o the trailing slash
86
93
  link.should == @links[:instagram].chop
94
+ end
95
+ it "follows redirects" do
96
+ mock_imgly
97
+ link = @tweetlr.link_url_redirect 'im mocked anyways'
98
+ link.should == 'http://s3.amazonaws.com/imgly_production/899582/full.jpg'
87
99
  end
88
100
  end
89
101
 
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.4pre2"
3
+ s.version = "0.1.4pre4"
4
4
  s.author = "Sven Kraeuter"
5
5
  s.email = "mail@svenkraeuter.com"
6
6
  s.homepage = "http://github.com/5v3n/#{s.name}"
@@ -10,15 +10,13 @@ Gem::Specification.new do |s|
10
10
  s.rubyforge_project = s.name
11
11
  s.extra_rdoc_files = %w(README.md LICENSE)
12
12
 
13
- s.add_dependency "daemons", "~> 1.1.3"
14
- s.add_dependency "eventmachine", "~> 0.12.10"
15
- s.add_dependency "curb", "~> 0.7.15"
16
- s.add_dependency "json", "~> 1.5.1"
13
+ s.add_dependency "daemons"
14
+ s.add_dependency "eventmachine"
15
+ s.add_dependency "curb"
16
+ s.add_dependency "json"
17
17
 
18
- s.add_development_dependency "rspec", "~> 2.6.0"
19
- s.add_development_dependency "autotest", "~> 4.4.6"
20
- s.add_development_dependency "autotest-growl", "~> 0.2.9"
21
- s.add_development_dependency "autotest-fsevent", "~> 0.2.5"
18
+ s.add_development_dependency "rake", "~> 0.8.7"
19
+ s.add_development_dependency "rspec"
22
20
  s.add_development_dependency "rdoc"
23
21
 
24
22
  s.files = `git ls-files`.split("\n")
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.4pre2
4
+ version: 0.1.4pre4
5
5
  prerelease: 5
6
6
  platform: ruby
7
7
  authors:
@@ -9,100 +9,78 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-16 00:00:00.000000000 +02:00
12
+ date: 2011-08-18 00:00:00.000000000 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: daemons
17
- requirement: &2153676500 !ruby/object:Gem::Requirement
17
+ requirement: &2157352460 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ~>
20
+ - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
- version: 1.1.3
22
+ version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2153676500
25
+ version_requirements: *2157352460
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: eventmachine
28
- requirement: &2153676000 !ruby/object:Gem::Requirement
28
+ requirement: &2157352040 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
- - - ~>
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.12.10
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2153676000
36
+ version_requirements: *2157352040
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: curb
39
- requirement: &2153675540 !ruby/object:Gem::Requirement
39
+ requirement: &2157351620 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
- - - ~>
42
+ - - ! '>='
43
43
  - !ruby/object:Gem::Version
44
- version: 0.7.15
44
+ version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2153675540
47
+ version_requirements: *2157351620
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: json
50
- requirement: &2153675080 !ruby/object:Gem::Requirement
50
+ requirement: &2157351200 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
- - - ~>
53
+ - - ! '>='
54
54
  - !ruby/object:Gem::Version
55
- version: 1.5.1
55
+ version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *2153675080
58
+ version_requirements: *2157351200
59
59
  - !ruby/object:Gem::Dependency
60
- name: rspec
61
- requirement: &2153674620 !ruby/object:Gem::Requirement
60
+ name: rake
61
+ requirement: &2157350700 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
65
65
  - !ruby/object:Gem::Version
66
- version: 2.6.0
66
+ version: 0.8.7
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2153674620
69
+ version_requirements: *2157350700
70
70
  - !ruby/object:Gem::Dependency
71
- name: autotest
72
- requirement: &2153674160 !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 4.4.6
78
- type: :development
79
- prerelease: false
80
- version_requirements: *2153674160
81
- - !ruby/object:Gem::Dependency
82
- name: autotest-growl
83
- requirement: &2153673700 !ruby/object:Gem::Requirement
84
- none: false
85
- requirements:
86
- - - ~>
87
- - !ruby/object:Gem::Version
88
- version: 0.2.9
89
- type: :development
90
- prerelease: false
91
- version_requirements: *2153673700
92
- - !ruby/object:Gem::Dependency
93
- name: autotest-fsevent
94
- requirement: &2153673240 !ruby/object:Gem::Requirement
71
+ name: rspec
72
+ requirement: &2157350280 !ruby/object:Gem::Requirement
95
73
  none: false
96
74
  requirements:
97
- - - ~>
75
+ - - ! '>='
98
76
  - !ruby/object:Gem::Version
99
- version: 0.2.5
77
+ version: '0'
100
78
  type: :development
101
79
  prerelease: false
102
- version_requirements: *2153673240
80
+ version_requirements: *2157350280
103
81
  - !ruby/object:Gem::Dependency
104
82
  name: rdoc
105
- requirement: &2153672860 !ruby/object:Gem::Requirement
83
+ requirement: &2157349820 !ruby/object:Gem::Requirement
106
84
  none: false
107
85
  requirements:
108
86
  - - ! '>='
@@ -110,7 +88,7 @@ dependencies:
110
88
  version: '0'
111
89
  type: :development
112
90
  prerelease: false
113
- version_requirements: *2153672860
91
+ version_requirements: *2157349820
114
92
  description: tweetlr crawls twitter for a given term, extracts photos out of the collected
115
93
  tweets' short urls and posts the images to tumblr.
116
94
  email: mail@svenkraeuter.com
@@ -124,6 +102,7 @@ files:
124
102
  - .autotest
125
103
  - .gitignore
126
104
  - .rspec
105
+ - .travis.yml
127
106
  - Gemfile
128
107
  - LICENSE
129
108
  - README.md