tweetlr 0.1.4pre2 → 0.1.4pre4

Sign up to get free protection for your applications and to get access to all the features.
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