tweetlr 0.1.21 → 0.1.22

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -8,4 +8,5 @@ pkg
8
8
  Gemfile.lock
9
9
  tweetlr.tid
10
10
  tweetlr.yml.dev
11
- tweetlr.yml.orig
11
+ tweetlr.yml.orig
12
+ coverage/
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # tweetlr
2
2
 
3
- <a href="http://travis-ci.org/#!/5v3n/tweetlr">![travis-ci](https://api.travis-ci.org/5v3n/tweetlr.png?branch=master)</a>
3
+ <a href="http://travis-ci.org/#!/5v3n/tweetlr">![travis-ci](https://api.travis-ci.org/5v3n/tweetlr.png?branch=master)</a>&nbsp;<a href="https://codeclimate.com/github/5v3n/tweetlr"><img src="https://codeclimate.com/github/5v3n/tweetlr.png" /></a>
4
+
5
+
4
6
 
5
7
  tweetlr crawls twitter for a given term, extracts photos out of the collected tweets' short urls and posts the images to tumblr.
6
8
 
@@ -0,0 +1,18 @@
1
+ results_per_page: 100
2
+ result_type: recent
3
+ search_term: 'cat+dog+unicorn' #find tweets containing any of these terms
4
+ start_at_tweet_id: 61847783463854082 # the tweet id to start searching at
5
+ api_endpoint_twitter: 'http://search.twitter.com/search.json'
6
+ api_endpoint_tumblr: 'http://www.tumblr.com'
7
+ tumblr_oauth_api_key: YOUR APPS TUMBLR API TOKEN
8
+ tumblr_oauth_api_secret: YOUR APPS TUMBLR API SECRET
9
+ tumblr_oauth_access_token_key: YOUR BLOGS OAUTH ACCESS TOKEN KEY
10
+ tumblr_oauth_access_token_secret: YOUR BLOGS OAUTH ACCESS TOKEN SECRE
11
+ tumblr_blog_hostname: YOUR BLOGS HOSTNAME #e.g. myblog.tumblr.com
12
+ embedly_key: '' #tweetlr uses http://embedly.com for link processing. a free plan containing an api key is available & recommended to use in order to ensure full support
13
+ update_period: 300 #check for updates every 300 secs = 5 minutes
14
+ shouts: 'says' # will be concatenated after the username, before the message: @mr_x says: awesome things on a photo!
15
+ loglevel: 1 # 0: debug, 1: info (default), 2: warn, 3: error, 5: fatal
16
+ 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
17
+ - whitey_mc_whitelist
18
+ - sven_kr
@@ -26,10 +26,9 @@ module Tweetlr::Combinators
26
26
  def self.generate_photo_post_from_tweet(tweet, options = {})
27
27
  log.debug "#{self}.generate_photo_post_from_tweet with options: #{options.inspect}"
28
28
  tumblr_post = nil
29
- message = tweet['text']
30
29
  whitelist = options[:whitelist]
31
30
  whitelist.each {|entry| entry.downcase!} if (whitelist && whitelist.size != 0)
32
- if !Tweetlr::Processors::Twitter::retweet? message
31
+ if !Tweetlr::Processors::Twitter::retweet? tweet['text']
33
32
  log.debug "tweet: #{tweet}"
34
33
  tumblr_post = {}
35
34
  tumblr_post[:tumblr_blog_hostname] = options[:tumblr_blog_hostname] || options[:group]
data/lib/tweetlr/core.rb CHANGED
@@ -17,7 +17,7 @@ class Tweetlr::Core
17
17
  def initialize(args)
18
18
  initialize_logging(args[:loglevel])
19
19
  initialize_attributes(args)
20
- log.info "Tweetlr #{Tweetlr::VERSION} initialized. Ready to roll."
20
+ Tweetlr::LogAware.log.info "Tweetlr #{Tweetlr::VERSION} initialized. Ready to roll."
21
21
  end
22
22
 
23
23
  def self.crawl(config)
@@ -51,7 +51,7 @@ private
51
51
  @whitelist.each {|entry| entry.downcase!} if @whitelist
52
52
  end
53
53
  def initialize_logging(loglevel)
54
- log = Logger.new(STDOUT)
54
+ log = Tweetlr::LogAware.log || Logger.new(STDOUT)
55
55
  if (Logger::DEBUG..Logger::UNKNOWN).to_a.index(loglevel)
56
56
  log.level = loglevel
57
57
  else
@@ -70,16 +70,15 @@ private
70
70
  if tumblr_post.nil? || tumblr_post[:source].nil?
71
71
  log.warn "could not get image source: tweet: #{tweet} --- tumblr post: #{tumblr_post.inspect}"
72
72
  else
73
- post_to_tumblr
73
+ post_to_tumblr tumblr_post, tumblr_config
74
74
  end
75
75
  end
76
76
  end
77
77
  def self.post_to_tumblr(tumblr_post, tumblr_config)
78
78
  log.debug "tumblr post: #{tumblr_post}"
79
79
  res = Tweetlr::Processors::Tumblr.post tumblr_post.merge(tumblr_config)
80
- log.debug "tumblr response: #{res}"
81
80
  if res && res.code == "201"
82
- log.info "tumblr post created (tumblr response: #{res.header} #{res.body}"
81
+ log.info "tumblr post created (tumblr response header: #{res.header}"
83
82
  elsif res
84
83
  log.warn "tumblr response: #{res.header} #{res.body}"
85
84
  else
@@ -17,6 +17,7 @@ module Tweetlr::Processors
17
17
  #optional arguments: :tags, :type (default: 'photo')
18
18
  #
19
19
  def self.post(options={})
20
+ log.info "posting to #{options[:tumblr_blog_hostname] || options[:group]}..."
20
21
  base_hostname = options[:tumblr_blog_hostname] || options[:group]
21
22
  tumblr_oauth_api_key= options[:tumblr_oauth_api_key]
22
23
  tumblr_oauth_api_secret= options[:tumblr_oauth_api_secret]
data/lib/tweetlr.rb CHANGED
@@ -2,7 +2,7 @@ require 'tweetlr/log_aware'
2
2
  require 'tweetlr/core'
3
3
 
4
4
  module Tweetlr
5
- VERSION = '0.1.21'
5
+ VERSION = '0.1.22'
6
6
 
7
7
  API_ENDPOINT_TWITTER = 'http://search.twitter.com/search.json'
8
8
  API_ENDPOINT_TUMBLR = 'http://www.tumblr.com'
data/spec/core_spec.rb CHANGED
@@ -2,17 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe Tweetlr::Core do
4
4
 
5
- config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
5
+ config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml.test')
6
6
  config = YAML.load_file(config_file)
7
7
  TIMESTAMP = config['twitter_timestamp']
8
8
  WHITELIST = config['whitelist']
9
9
 
10
- before :each do
11
- @first_link = "http://url.com"
12
- @second_link = "http://instagr.am/p/DzCWn/"
13
- @third_link = "https://imageurl.com"
14
- @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;"}
15
- @tweetlr_config = {
10
+ let(:tweetlr_config) do
11
+ {
16
12
  :since_id => 0,
17
13
  :results_per_page => 3,
18
14
  :search_term => 'coffeediary',
@@ -25,36 +21,55 @@ describe Tweetlr::Core do
25
21
  :tumblr_oauth_api_key => config['tumblr_oauth_api_key'],
26
22
  :tumblr_blog_hostname => config['tumblr_blog_hostname']
27
23
  }
28
- stub_tumblr
29
- stub_twitter
30
- stub_oauth
31
24
  end
32
- it "crawls twitter and posts to tumblr" do
33
- since_id_before = @tweetlr_config[:since_id]
34
- result = Tweetlr::Core.crawl(@tweetlr_config)
35
- since_id_before.should_not == result[:since_id]
25
+ let(:stubbed_tumblr_post) do
26
+ {:tumblr_blog_hostname=>nil, :type=>"photo", :date=>"Sun, 28 Apr 2013 14:10:43 +0000", :source=>"https://irs0.4sqi.net/img/general/600x600/304170_IfHzPdhxs9mpGlPk8jogxdul8q8KhTBNmeAiP9H5TyY.jpg", :tags=>"sven_kr", :state=>"published", :caption=>"<a href=\"http://twitter.com/sven_kr/statuses/328511599881097216\" alt=\"tweet\">@sven_kr</a>: #coffeediary Wanted to stay at home but had to test the new tweetlr ;-) (@ Mamalicious w/ @snoopsmaus) [pic]: http://t.co/7ilE9BDJxJ"}
36
27
  end
37
- it "copes with legacy config that use tumblr v1 api (basic auth)" do
38
- legacy_config = {
39
- :id=>16,
40
- :search_term=>"booga",
41
- :tumblr_email=>"wooga@booga.de",
42
- :tumblr_password=>"boogawooga",
43
- :since_id=>"246543935663661057",
44
- :results_per_page=>3,
45
- :result_type=>nil,
46
- :api_endpoint_twitter=>nil,
47
- :api_endpoint_tumblr=>nil,
48
- :update_period=>900,
49
- :shouts=>nil,
50
- :loglevel=>1,
51
- :whitelist=>["user1", "user2"],
52
- :last_crawl=>"Fri, 14 Sep 2012 09:43:10 UTC +00:00",
53
- :active=>true,
54
- :tumblr_oauth_access_token_key=>nil,
55
- :tumblr_oauth_access_token_secret=>nil}
56
- since_id_before = legacy_config[:since_id]
57
- result = Tweetlr::Core.crawl(legacy_config)
58
- since_id_before.should_not == result[:since_id]
28
+ let(:first_link) { "http://url.com" }
29
+ let(:second_link) { "http://instagr.am/p/DzCWn/" }
30
+ let(:third_link) { "https://imageurl.com" }
31
+ let(: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;"} }
32
+
33
+ describe ".new" do
34
+ it "initializes a new instance" do
35
+ new_instance = Tweetlr::Core.new tweetlr_config
36
+ new_instance.should be
37
+ end
38
+ end
39
+ describe ".crawl(config)" do
40
+ before(:each) do
41
+ stub_tumblr
42
+ stub_twitter
43
+ stub_oauth
44
+ end
45
+ it "crawls twitter and posts to tumblr" do
46
+ Tweetlr::Combinators::TwitterTumblr.stub(:generate_photo_post_from_tweet).and_return stubbed_tumblr_post
47
+ since_id_before = tweetlr_config[:since_id]
48
+ result = Tweetlr::Core.crawl(tweetlr_config)
49
+ since_id_before.should_not == result[:since_id]
50
+ end
51
+ it "copes with legacy config that use tumblr v1 api (basic auth)" do
52
+ legacy_config = {
53
+ :id=>16,
54
+ :search_term=>"booga",
55
+ :tumblr_email=>"wooga@booga.de",
56
+ :tumblr_password=>"boogawooga",
57
+ :since_id=>"246543935663661057",
58
+ :results_per_page=>3,
59
+ :result_type=>nil,
60
+ :api_endpoint_twitter=>nil,
61
+ :api_endpoint_tumblr=>nil,
62
+ :update_period=>900,
63
+ :shouts=>nil,
64
+ :loglevel=>1,
65
+ :whitelist=>["user1", "user2"],
66
+ :last_crawl=>"Fri, 14 Sep 2012 09:43:10 UTC +00:00",
67
+ :active=>true,
68
+ :tumblr_oauth_access_token_key=>nil,
69
+ :tumblr_oauth_access_token_secret=>nil}
70
+ since_id_before = legacy_config[:since_id]
71
+ result = Tweetlr::Core.crawl(legacy_config)
72
+ since_id_before.should_not == result[:since_id]
73
+ end
59
74
  end
60
75
  end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tweetlr::Processors::Http do
4
+ it ".http_get copes with errors by retrying, not raising" do
5
+ Curl::Easy.any_instance.stub(:perform).and_raise(Curl::Err::CurlError)
6
+ Tweetlr::Processors::Http.stub!(:sleep) #releasing the sleep handbrake...
7
+ Tweetlr::Processors::Http.should_receive(:sleep).with(3)
8
+ expect { Tweetlr::Processors::Http.http_get('mocky wocky')}.to_not raise_error(Curl::Err::CurlError)
9
+ end
10
+ end
@@ -60,4 +60,10 @@ describe Tweetlr::Processors::PhotoService do
60
60
  link = Tweetlr::Processors::PhotoService::link_url_redirect 'im mocked anyways'
61
61
  link.should == 'http://s3.amazonaws.com/imgly_production/899582/full.jpg'
62
62
  end
63
+ it "copes with redirect errors" do
64
+ Curl::Easy.any_instance.stub(:http_get).and_raise(Curl::Err::CurlError)
65
+ Tweetlr::Processors::PhotoService.stub!(:sleep) #releasing the sleep handbrake...
66
+ Tweetlr::Processors::PhotoService.should_receive(:sleep).with(3)
67
+ expect { Tweetlr::Processors::PhotoService::link_url_redirect 'im mocked anyways'}.to_not raise_error(Curl::Err::CurlError)
68
+ end
63
69
  end
@@ -14,19 +14,36 @@ describe Tweetlr::Processors::Twitter do
14
14
  :api_endpoint_twitter => Tweetlr::API_ENDPOINT_TWITTER
15
15
  }
16
16
  end
17
- it "should search twitter for a given term" do
18
- stub_twitter
19
- response = Tweetlr::Processors::Twitter::lazy_search @twitter_config
20
- tweets = response['results']
21
- tweets.should be
22
- tweets.should_not be_empty
17
+ describe "#search(config)" do
18
+ it "searches twitter for a given term" do
19
+ stub_twitter
20
+ response = Tweetlr::Processors::Twitter::search @twitter_config
21
+ tweets = response['results']
22
+ tweets.should be
23
+ tweets.should_not be_empty
24
+ end
23
25
  end
24
- it "extracts links" do
25
- links = Tweetlr::Processors::Twitter::extract_links ''
26
- links.should be_nil
27
- links = Tweetlr::Processors::Twitter::extract_links @twitter_response
28
- links[0].should == @first_link
29
- links[1].should == @second_link
30
- links[2].should == @third_link
26
+ describe "#lazy_search(config)" do
27
+ it "searches twitter for a given term" do
28
+ stub_twitter
29
+ response = Tweetlr::Processors::Twitter::lazy_search @twitter_config
30
+ tweets = response['results']
31
+ tweets.should be
32
+ tweets.should_not be_empty
33
+ end
34
+ it "copes with nil as input" do
35
+ stub_twitter
36
+ Tweetlr::Processors::Twitter::lazy_search(nil).should be_nil
37
+ end
38
+ end
39
+ describe "#extract_links()" do
40
+ it "extracts links" do
41
+ links = Tweetlr::Processors::Twitter::extract_links ''
42
+ links.should be_nil
43
+ links = Tweetlr::Processors::Twitter::extract_links @twitter_response
44
+ links[0].should == @first_link
45
+ links[1].should == @second_link
46
+ links[2].should == @third_link
47
+ end
31
48
  end
32
49
  end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,19 @@
1
1
  #encoding: utf-8
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+
2
5
  require "bundler"
3
6
  require "logger"
4
7
  require "yaml"
5
8
  require "#{File.dirname(__FILE__)}/../lib/tweetlr"
6
9
 
10
+
7
11
  Bundler.require :default, :development, :test
8
12
 
9
- logger = Logger.new(STDOUT)
10
- logger.level = Logger::FATAL
13
+ logger = Logger.new('/dev/null')
14
+ #logger.level = Logger::DEBUG
11
15
  Tweetlr::LogAware.log = logger
16
+ Tweetlr::LogAware.log
12
17
 
13
18
  def check_pic_url_extraction(service)
14
19
  image_url = Tweetlr::Processors::PhotoService.find_image_url @links[service]
@@ -16,7 +21,7 @@ def check_pic_url_extraction(service)
16
21
  end
17
22
 
18
23
  def stub_oauth
19
- OAuth::AccessToken.any_instance.stub(:post).and_return(Net::HTTPCreated.new("Created.", "201", nil))
24
+ OAuth::AccessToken.any_instance.stub(:post).and_return(Net::HTTPCreated.new("Created.", "201", true))
20
25
  end
21
26
 
22
27
  def stub_tumblr
@@ -38,7 +43,7 @@ Content-Type: text/plain; charset=utf-8
38
43
  end
39
44
 
40
45
  def stub_twitter
41
- Curl::Easy.any_instance.stub(:body_str).and_return %|{"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"}|
46
+ Curl::Easy.any_instance.stub(:body_str).and_return %^{"completed_in":0.013,"max_id":328511599881097216,"max_id_str":"328511599881097216","next_page":"?page=2&max_id=328511599881097216&q=coffeediary&rpp=3&result_type=recent","page":1,"query":"coffeediary","refresh_url":"?since_id=328511599881097216&q=coffeediary&result_type=recent","results":[{"created_at":"Sun, 28 Apr 2013 14:10:43 +0000","from_user":"sven_kr","from_user_id":61437533,"from_user_id_str":"61437533","from_user_name":"Sven Kr\u00e4uter | 5v3n","geo":{"coordinates":[53.563684,9.959734],"type":"Point"},"id":328511599881097216,"id_str":"328511599881097216","iso_language_code":"en","metadata":{"result_type":"recent"},"place":{"full_name":"Hamburg","id":"171b760b35e47fe5","type":"CITY"},"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2305774679\/am2l5mt563000bt0jwvw_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2305774679\/am2l5mt563000bt0jwvw_normal.jpeg","source":"&lt;a href=&quot;http:\/\/foursquare.com&quot;&gt;foursquare&lt;\/a&gt;","text":"#coffeediary Wanted to stay at home but had to test the new tweetlr ;-) (@ Mamalicious w\/ @snoopsmaus) [pic]: http:\/\/t.co\/7ilE9BDJxJ"}],"results_per_page":1,"since_id":0,"since_id_str":"0"}^
42
47
  Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
43
48
  end
44
49
 
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.21"
3
+ s.version = "0.1.22"
4
4
  s.author = "Sven Kraeuter"
5
5
  s.email = "sven.kraeuter@gmail.com"
6
6
  s.homepage = "http://tweetlr.5v3n.com"
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency "rake"
21
21
  s.add_development_dependency "rspec"
22
22
  s.add_development_dependency "rdoc"
23
+ s.add_development_dependency "simplecov"
23
24
 
24
25
  s.files = `git ls-files`.split("\n")
25
26
  s.test_files = `git ls-files -- {test,spec,features}/*`.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.21
4
+ version: 0.1.22
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -155,6 +155,22 @@ dependencies:
155
155
  - - ! '>='
156
156
  - !ruby/object:Gem::Version
157
157
  version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: simplecov
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
158
174
  description: tweetlr crawls twitter for a given term, extracts photos out of the collected
159
175
  tweets' short urls and posts the images to tumblr.
160
176
  email: sven.kraeuter@gmail.com
@@ -175,6 +191,7 @@ files:
175
191
  - Rakefile
176
192
  - bin/tweetlr
177
193
  - config/tweetlr.yml
194
+ - config/tweetlr.yml.test
178
195
  - lib/tweetlr.rb
179
196
  - lib/tweetlr/combinators/twitter_tumblr.rb
180
197
  - lib/tweetlr/core.rb
@@ -185,6 +202,7 @@ files:
185
202
  - lib/tweetlr/processors/twitter.rb
186
203
  - spec/combinators/twitter_tumblr_combinator_spec.rb
187
204
  - spec/core_spec.rb
205
+ - spec/processors/http_spec.rb
188
206
  - spec/processors/photo_services_processor_spec.rb
189
207
  - spec/processors/tumblr_processor_spec.rb
190
208
  - spec/processors/twitter_processor_spec.rb
@@ -202,18 +220,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
202
220
  - - ! '>='
203
221
  - !ruby/object:Gem::Version
204
222
  version: '0'
205
- segments:
206
- - 0
207
- hash: 3037405379502590450
208
223
  required_rubygems_version: !ruby/object:Gem::Requirement
209
224
  none: false
210
225
  requirements:
211
226
  - - ! '>='
212
227
  - !ruby/object:Gem::Version
213
228
  version: '0'
214
- segments:
215
- - 0
216
- hash: 3037405379502590450
217
229
  requirements: []
218
230
  rubyforge_project: tweetlr
219
231
  rubygems_version: 1.8.25
@@ -224,6 +236,7 @@ summary: tweetlr crawls twitter for a given term, extracts photos out of the col
224
236
  test_files:
225
237
  - spec/combinators/twitter_tumblr_combinator_spec.rb
226
238
  - spec/core_spec.rb
239
+ - spec/processors/http_spec.rb
227
240
  - spec/processors/photo_services_processor_spec.rb
228
241
  - spec/processors/tumblr_processor_spec.rb
229
242
  - spec/processors/twitter_processor_spec.rb