tweetlr 0.1.22 → 0.1.23

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,9 @@
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>&nbsp;<a href="https://codeclimate.com/github/5v3n/tweetlr"><img src="https://codeclimate.com/github/5v3n/tweetlr.png" /></a>
3
+ <a href="http://travis-ci.org/#!/5v3n/tweetlr">![travis-ci](https://api.travis-ci.org/5v3n/tweetlr.png?branch=master)</a>&nbsp;
4
+ <a href="https://codeclimate.com/github/5v3n/tweetlr"><img src="https://codeclimate.com/github/5v3n/tweetlr.png" /></a>&nbsp;
5
+ <a href='https://coveralls.io/r/5v3n/tweetlr'><img src='https://coveralls.io/repos/5v3n/tweetlr/badge.png?branch=master' alt='Coverage Status' /></a>
6
+
4
7
 
5
8
 
6
9
 
@@ -25,30 +25,36 @@ module Tweetlr::Combinators
25
25
  #generate the data for a tumblr photo entry by parsing a tweet
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
- tumblr_post = nil
28
+ process_options_and_tweet options, tweet
29
+ end
30
+ private
31
+ def self.process_options_and_tweet(options, tweet)
29
32
  whitelist = options[:whitelist]
30
33
  whitelist.each {|entry| entry.downcase!} if (whitelist && whitelist.size != 0)
31
34
  if !Tweetlr::Processors::Twitter::retweet? tweet['text']
32
35
  log.debug "tweet: #{tweet}"
33
- tumblr_post = {}
34
- tumblr_post[:tumblr_blog_hostname] = options[:tumblr_blog_hostname] || options[:group]
35
- tumblr_post[:type] = 'photo'
36
- tumblr_post[:date] = tweet['created_at']
37
- tumblr_post[:source] = extract_image_url tweet, options[:embedly_key]
38
- user = tweet['from_user']
39
- tumblr_post[:tags] = user
40
- tweet_id = tweet['id']
41
- if !whitelist || whitelist.size == 0 || whitelist.member?(user.downcase)
42
- state = 'published'
43
- else
44
- state = 'draft'
45
- end
46
- tumblr_post[:state] = state
47
- shouts = " #{@shouts}" if @shouts
48
- tumblr_post[:caption] = %?<a href="http://twitter.com/#{user}/statuses/#{tweet_id}" alt="tweet">@#{user}</a>#{shouts}: #{tweet['text']}?
49
- #TODO make the caption a bigger matter of yml/ general configuration
36
+ tumblr_post = prepare_tumblr_post options, tweet, whitelist
37
+ end
38
+ end
39
+ def self.prepare_tumblr_post(options, tweet, whitelist)
40
+ tumblr_post = {}
41
+ tumblr_post[:tumblr_blog_hostname] = options[:tumblr_blog_hostname] || options[:group]
42
+ tumblr_post[:type] = 'photo'
43
+ tumblr_post[:date] = tweet['created_at']
44
+ tumblr_post[:source] = extract_image_url tweet, options[:embedly_key]
45
+ user = tweet['from_user']
46
+ tumblr_post[:tags] = user
47
+ tweet_id = tweet['id']
48
+ if !whitelist || whitelist.size == 0 || whitelist.member?(user.downcase)
49
+ state = 'published'
50
+ else
51
+ state = 'draft'
50
52
  end
51
- tumblr_post
53
+ tumblr_post[:state] = state
54
+ shouts = " #{@shouts}" if @shouts
55
+ tumblr_post[:caption] = %?<a href="http://twitter.com/#{user}/statuses/#{tweet_id}" alt="tweet">@#{user}</a>#{shouts}: #{tweet['text']}?
56
+ #TODO make the caption a bigger matter of yml/ general configuration
57
+ tumblr_post
52
58
  end
53
59
  end
54
60
  end
@@ -20,16 +20,7 @@ module Tweetlr::Processors
20
20
  def self.find_image_url(link, embedly_key=nil)
21
21
  url = nil
22
22
  if link && !(photo? link)
23
- url = image_url_eyeem link if link.index 'eyeem.com'
24
- url = image_url_instagram link if (link.index('instagr.am') || link.index('instagram.com'))
25
- url = image_url_twitpic link if link.index 'twitpic'
26
- url = image_url_yfrog link if link.index 'yfrog'
27
- url = image_url_imgly link, embedly_key if link.index 'img.ly'
28
- url = image_url_tco link, embedly_key if link.index 't.co'
29
- url = image_url_twimg link if link.index 'twitter.com'
30
- url = image_url_path link if link.index 'path.com'
31
- url = image_url_foursqaure link if (link.index('4sq.com') || link.index('foursquare.com'))
32
- url = image_url_embedly link, embedly_key if url.nil? #just try embed.ly for anything else. could do all image url processing w/ embedly, but there's probably some kind of rate limit invovled.
23
+ url = process_link link, embedly_key
33
24
  elsif photo? link
34
25
  url = link
35
26
  end
@@ -50,7 +41,7 @@ module Tweetlr::Processors
50
41
  def self.image_url_foursqaure(link_url)
51
42
  link_url = follow_redirect(link_url)
52
43
  image_url = retrieve_image_url_by_css link_url, 'meta[property="og:image"]', 'content'
53
- image_url
44
+ image_url unless image_url.include? "foursquare.com/img/categories"
54
45
  end
55
46
  #extract the image of a path.com pic
56
47
  def self.image_url_path(link_url)
@@ -131,6 +122,20 @@ module Tweetlr::Processors
131
122
  return image_url
132
123
  end
133
124
  private
125
+ def self.process_link(link, embedly_key)
126
+ url = nil
127
+ url = image_url_eyeem link if link.index 'eyeem.com'
128
+ url = image_url_instagram link if (link.index('instagr.am') || link.index('instagram.com'))
129
+ url = image_url_twitpic link if link.index 'twitpic'
130
+ url = image_url_yfrog link if link.index 'yfrog'
131
+ url = image_url_imgly link, embedly_key if link.index 'img.ly'
132
+ url = image_url_tco link, embedly_key if link.index 't.co'
133
+ url = image_url_twimg link if link.index 'twitter.com'
134
+ url = image_url_path link if link.index 'path.com'
135
+ url = image_url_foursqaure link if (link.index('4sq.com') || link.index('foursquare.com'))
136
+ url = image_url_embedly link, embedly_key if url.nil? #just try embed.ly for anything else. could do all image url processing w/ embedly, but there's probably some kind of rate limit invovled.
137
+ url
138
+ end
134
139
  def self.process_reponse_header(resp, stop_indicator)
135
140
  if(resp && resp.header_str && resp.header_str.index(LOCATION_START_INDICATOR) && resp.header_str.index(stop_indicator))
136
141
  start = resp.header_str.index(LOCATION_START_INDICATOR) + LOCATION_START_INDICATOR.size
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.22'
5
+ VERSION = '0.1.23'
6
6
 
7
7
  API_ENDPOINT_TWITTER = 'http://search.twitter.com/search.json'
8
8
  API_ENDPOINT_TUMBLR = 'http://www.tumblr.com'
@@ -19,7 +19,6 @@ describe Tweetlr::Processors::PhotoService do
19
19
  it "finds a picture's url from the supported services" do
20
20
  @links.each do |service,link|
21
21
  send "stub_#{service}"
22
- #puts "checking #{service}"
23
22
  url = Tweetlr::Processors::PhotoService::find_image_url link
24
23
  url.should be, "service #{service} not working!"
25
24
  check_pic_url_extraction service if [:twimg, :instagram,:yfrog,:imgly,:foursqaure,:not_listed].index service
@@ -36,11 +35,18 @@ describe Tweetlr::Processors::PhotoService do
36
35
  link = Tweetlr::Processors::PhotoService::find_image_url 'http://makersand.co/'
37
36
  link.should be_nil
38
37
  end
39
- it "does find an image for foursquare that is not he profile pic" do
40
- stub_foursquare
41
- link = Tweetlr::Processors::PhotoService::find_image_url @links[:foursquare]
42
- link.should be
43
- link.index('userpix_thumbs').should_not be
38
+ describe "for foursqaure" do
39
+ it "does find an image that is not he profile pic" do
40
+ stub_foursquare
41
+ link = Tweetlr::Processors::PhotoService::find_image_url @links[:foursquare]
42
+ link.should be
43
+ link.index('userpix_thumbs').should_not be
44
+ end
45
+ it "does not extract symbols from tweeted links that contain no images" do
46
+ stub_foursquare_no_photo
47
+ link = Tweetlr::Processors::PhotoService::find_image_url @links[:foursquare]
48
+ link.should_not be
49
+ end
44
50
  end
45
51
  it "finds path images for redirected moments as well" do
46
52
  stub_path_redirected
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,12 @@
1
1
  #encoding: utf-8
2
- require 'simplecov'
3
- SimpleCov.start
2
+
3
+ if ENV['RACK_ENV']=='test'
4
+ require 'coveralls'
5
+ Coveralls.wear!
6
+ elsif ENV['RACK_ENV']=='development'
7
+ require 'simplecov'
8
+ SimpleCov.start
9
+ end
4
10
 
5
11
  require "bundler"
6
12
  require "logger"
@@ -514,6 +520,11 @@ def stub_foursquare
514
520
  ^
515
521
  end
516
522
 
523
+ def stub_foursquare_no_photo
524
+ Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
525
+ Curl::Easy.any_instance.stub(:body_str).and_return %^<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="application-name" content="Foursquare"/><meta name="msapplication-TileColor" content="#0ca9c9"/><meta name="msapplication-TileImage" content="https://playfoursquare.s3.amazonaws.com/misc/foursquare-144-logo.png"/><meta name="msapplication-tooltip" content="Start the foursquare App" /><meta name="msapplication-starturl" content="/" /><meta name="msapplication-window" content="width=1024;height=768" /><meta name="msapplication-task" content="name=Recent Check-ins; action-uri=/; icon-uri=/favicon.ico" /><meta name="msapplication-task" content="name=Profile;action-uri=/user;icon-uri=/favicon.ico" /><meta name="msapplication-task" content="name=History;action-uri=/user/history;icon-uri=/favicon.ico" /><meta name="msapplication-task" content="name=Badges;action-uri=/user/badges;icon-uri=/favicon.ico" /><meta name="msapplication-task" content="name=Stats;action-uri=/user/stats;icon-uri=/favicon.ico" /><link rel="icon" href="/favicon.ico" type="image/x-icon"/><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/><link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/touch-icon-ipad.png" /><link rel="apple-touch-icon-precomposed" sizes="144x144" href="/img/touch-icon-ipad-retina.png" /><link rel="logo" href="https://playfoursquare.s3.amazonaws.com/press/logo/foursquare-logo.svg" type="image/svg" /><link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="foursquare" /><title>Sven @ Le Lion</title><meta content="de" http-equiv="Content-Language" /><meta content="https://foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?ref=fb&amp;source=openGraph&amp;s=9aAHdtIEpzZ-t1yziwX8ASs_81c" property="og:url" /><meta content="Ein Check-in bei Le Lion" property="og:title" /><meta content="Ein Check-in" property="og:description" /><meta content="playfoursquare:checkin" property="og:type" /><meta content="https://foursquare.com/img/categories_map/nightlife/cocktails.png" property="og:image" /><meta content="2013-04-30T22:19:22.000Z" property="playfoursquare:date" /><meta content="https://foursquare.com/v/le-lion/4b0f0baaf964a520895e23e3" property="playfoursquare:place" /><meta content="Foursquare" property="og:site_name" /><meta content="86734274142" property="fb:app_id" /><meta content="@foursquare" name="twitter:site" /><meta content="summary" name="twitter:card" /><meta content="Foursquare" name="twitter:app:name:iphone" /><meta content="Foursquare" name="twitter:app:name:ipad" /><meta content="Foursquare" name="twitter:app:name:googleplay" /><meta content="foursquare://checkins/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c" name="twitter:app:url:iphone" /><meta content="foursquare://checkins/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c" name="twitter:app:url:ipad" /><meta content="foursquare://checkins/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c" name="twitter:app:url:googleplay" /><meta content="306934924" name="twitter:app:id:iphone" /><meta content="306934924" name="twitter:app:id:ipad" /><meta content="com.joelapenna.foursquared" name="twitter:app:id:googleplay" /><link href="https://ss1.4sqi.net/styles/third_party/hfjfonts-5a7f8781ee1be1bb12433f1d74f0948c.css" type="text/css" rel="stylesheet"/><link href="https://ss1.4sqi.net/styles/master-d343426b4dbbd81a7e427d6f8c032b5a.css" type="text/css" rel="stylesheet"/><link href="https://ss0.4sqi.net/styles/standalone-pages/checkin-detail-1aabc265046d80b7c1e392c47dd3f8c9.css" type="text/css" rel="stylesheet"/><link rel="alternate" href="https://it.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="it"/><link rel="alternate" href="https://de.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="de"/><link rel="alternate" href="https://es.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="es"/><link rel="alternate" href="https://fr.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="fr"/><link rel="alternate" href="https://ja.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="ja"/><link rel="alternate" href="https://th.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="th"/><link rel="alternate" href="https://ko.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="ko"/><link rel="alternate" href="https://ru.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="ru"/><link rel="alternate" href="https://pt.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="pt"/><link rel="alternate" href="https://id.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="id"/><link rel="alternate" href="https://tr.foursquare.com/sven_kr/checkin/5180436ae4b098ea8af76e3a?s=9aAHdtIEpzZ-t1yziwX8ASs_81c&amp;ref=tw" hreflang="tr"/>^
526
+ end
527
+
517
528
  def stub_eyeem
518
529
  Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
519
530
  Curl::Easy.any_instance.stub(:header_str).and_return "HTTP/1.1 200 OK\r\nServer: nginx/1.0.5\r\nDate: Sun, 15 Apr 2012 09:16:58 GMT\r\nContent-Type: text/html; charset=utf-8\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nX-Powered-By: PHP/5.3.6-13ubuntu3.6\r\nSet-Cookie: symfony=bv8mdicp6ucb8jr9qt0o0r7qk2; path=/\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\n\r\n"
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.22"
3
+ s.version = "0.1.23"
4
4
  s.author = "Sven Kraeuter"
5
5
  s.email = "sven.kraeuter@gmail.com"
6
6
  s.homepage = "http://tweetlr.5v3n.com"
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_development_dependency "rspec"
22
22
  s.add_development_dependency "rdoc"
23
23
  s.add_development_dependency "simplecov"
24
+ s.add_development_dependency "coveralls"
24
25
 
25
26
  s.files = `git ls-files`.split("\n")
26
27
  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.22
4
+ version: 0.1.23
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-28 00:00:00.000000000 Z
12
+ date: 2013-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
@@ -171,6 +171,22 @@ dependencies:
171
171
  - - ! '>='
172
172
  - !ruby/object:Gem::Version
173
173
  version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: coveralls
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
174
190
  description: tweetlr crawls twitter for a given term, extracts photos out of the collected
175
191
  tweets' short urls and posts the images to tumblr.
176
192
  email: sven.kraeuter@gmail.com