tweetlr 0.1.2 → 0.1.3
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/.autotest +3 -0
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/Gemfile +2 -0
- data/Rakefile +13 -35
- data/bin/tweetlr +17 -9
- data/config/tweetlr.yml +14 -0
- data/lib/tweetlr.rb +17 -6
- data/spec/spec_helper.rb +2 -0
- data/spec/tweetlr_spec.rb +93 -0
- data/tweetlr.gemspec +28 -0
- metadata +91 -15
data/.autotest
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,43 +1,21 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'rake/clean'
|
4
|
-
require 'rubygems/package_task'
|
5
|
-
require 'rdoc/task'
|
6
|
-
require 'rake/testtask'
|
7
|
-
|
8
|
-
spec = Gem::Specification.new do |s|
|
9
|
-
s.name = 'tweetlr'
|
10
|
-
s.version = '0.1.2'
|
11
|
-
s.has_rdoc = true
|
12
|
-
s.extra_rdoc_files = ['README.md', 'LICENSE']
|
13
|
-
s.summary = %{tweetlr crawls twitter for a given term, extracts photos out of the collected tweets' short urls and posts the images to tumblr.}
|
14
|
-
s.description = s.summary
|
15
|
-
s.author = 'Sven Kraeuter'
|
16
|
-
s.email = 'mail@svenkraeuter.com'
|
17
|
-
s.homepage = "http://github.com/5v3n/#{s.name}"
|
18
|
-
s.files = %w(LICENSE README.md Rakefile) + Dir.glob("{bin,lib}/**/*")
|
19
|
-
s.require_path = "lib"
|
20
|
-
s.executables = ['tweetlr']
|
21
|
-
s.add_dependency('daemons')
|
22
|
-
s.add_dependency('eventmachine')
|
23
|
-
s.add_dependency('curb')
|
24
|
-
end
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
25
3
|
|
26
|
-
|
27
|
-
|
28
|
-
p.need_tar = true
|
29
|
-
p.need_zip = true
|
30
|
-
end
|
4
|
+
require 'rdoc/task'
|
5
|
+
require 'rspec/core/rake_task'
|
31
6
|
|
32
7
|
RDoc::Task.new do |rdoc|
|
33
|
-
files =['README.md', 'LICENSE', 'lib/**/*.rb']
|
8
|
+
files = ['README.md', 'LICENSE', 'lib/**/*.rb']
|
34
9
|
rdoc.rdoc_files.add(files)
|
35
|
-
rdoc.main = "README.md"
|
36
|
-
rdoc.title = "tweetlr Docs"
|
37
|
-
rdoc.rdoc_dir = 'doc/rdoc'
|
10
|
+
rdoc.main = "README.md" # page to start on
|
11
|
+
rdoc.title = "tweetlr Docs" # <--- enter name manually!
|
12
|
+
rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
|
38
13
|
rdoc.options << '--line-numbers'
|
39
14
|
end
|
40
15
|
|
41
|
-
|
42
|
-
t.
|
16
|
+
RSpec::Core::RakeTask.new do |t|
|
17
|
+
t.rspec_opts = %w(-c)
|
43
18
|
end
|
19
|
+
|
20
|
+
task :default => :spec
|
21
|
+
task :test => :spec
|
data/bin/tweetlr
CHANGED
@@ -4,15 +4,25 @@ require 'daemons'
|
|
4
4
|
require 'eventmachine'
|
5
5
|
require 'logger'
|
6
6
|
require 'yaml'
|
7
|
-
|
7
|
+
require 'tweetlr'
|
8
8
|
|
9
9
|
begin
|
10
10
|
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
|
11
|
+
tid_file = File.join( Dir.pwd ,"tweetlr.tid")
|
12
|
+
start_at_tweet_id = lambda {
|
13
|
+
begin
|
14
|
+
File.open(tid_file, "r") { |io| io.gets.to_i }
|
15
|
+
rescue Errno::ENOENT => e
|
16
|
+
$stderr.puts "#{e} - we use the value from the configuration file"
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
}.call
|
11
20
|
CONFIG = YAML.load_file(config_file)
|
21
|
+
CONFIG['start_at_tweet_id'] = start_at_tweet_id || CONFIG['start_at_tweet_id'] || CONFIG['twitter_timestamp'] #check the latter for backwards compability
|
12
22
|
TERM = CONFIG['search_term']
|
13
23
|
USER = CONFIG['tumblr_username']
|
14
24
|
PW = CONFIG['tumblr_password']
|
15
|
-
TIMESTAMP = CONFIG['
|
25
|
+
TIMESTAMP = start_at_tweet_id || CONFIG['start_at_tweet_id']
|
16
26
|
UPDATE_PERIOD = CONFIG['update_period']
|
17
27
|
LOGLEVEL = CONFIG['loglevel'] || Logger::INFO
|
18
28
|
@tweetlr = Tweetlr.new(USER, PW, config_file, {:since_id => TIMESTAMP, :terms => TERM, :loglevel => LOGLEVEL})
|
@@ -37,20 +47,18 @@ Daemons.run_proc('tweetlr', :dir_mode => :script, :dir => './', :backtrace => tr
|
|
37
47
|
if tumblr_post.nil? || tumblr_post[:source].nil?
|
38
48
|
@log.warn "could not get image source: tweet: #{tweet} --- tumblr post: #{tumblr_post.inspect}"
|
39
49
|
else
|
40
|
-
|
41
|
-
#@log.debug @tweetlr.post_to_tumblr tumblr_post
|
42
|
-
#puts "tumblr post: #{tumblr_post}"
|
50
|
+
@log.debug "tumblr post: #{tumblr_post}"
|
43
51
|
res = @tweetlr.post_to_tumblr tumblr_post
|
44
52
|
@log.warn "tumblr response: #{res.header_str} #{res.body_str}" unless res.response_code == 201
|
45
53
|
end
|
54
|
+
# save the last received tweet id to tweetlr.tid
|
55
|
+
File.open(tid_file, "w+") { |io| io.write(tweets.last['id']) }
|
46
56
|
end
|
47
57
|
end
|
48
58
|
else
|
49
|
-
@log.error "twitter
|
59
|
+
@log.error "twitter search returned no response. hail the failwhale!"
|
50
60
|
end
|
51
61
|
@log.info "finished tweetlr crawl."
|
52
62
|
}
|
53
63
|
}
|
54
|
-
|
55
|
-
end
|
56
|
-
|
64
|
+
end
|
data/config/tweetlr.yml
ADDED
@@ -0,0 +1,14 @@
|
|
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_username: YOUR_TUMBLR_EMAIL
|
8
|
+
tumblr_password: YOUR_TUMBLR_PW
|
9
|
+
update_period: 300 #check for updates every 300 secs = 5 minutes
|
10
|
+
shouts: 'says' # will be concatenated after the username, before the message: @mr_x says: awesome things on a photo!
|
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
|
13
|
+
- whitey_mc_whitelist
|
14
|
+
- sven_kr
|
data/lib/tweetlr.rb
CHANGED
@@ -5,9 +5,9 @@ require 'json'
|
|
5
5
|
|
6
6
|
class Tweetlr
|
7
7
|
|
8
|
-
VERSION = '0.1.
|
8
|
+
VERSION = '0.1.3'
|
9
9
|
GENERATOR = %{tweetlr - http://github.com/5v3n/tweetlr}
|
10
|
-
USER_AGENT = %{Mozilla/5.0 (compatible; tweetlr/#{VERSION};)}
|
10
|
+
USER_AGENT = %{Mozilla/5.0 (compatible; tweetlr/#{VERSION}; +http://github.com/5v3n/tweetlr/wiki)}
|
11
11
|
LOCATION_START_INDICATOR = 'Location: '
|
12
12
|
LOCATION_STOP_INDICATOR = "\r\n"
|
13
13
|
|
@@ -144,14 +144,20 @@ class Tweetlr
|
|
144
144
|
url = image_url_tco link if link.index 't.co'
|
145
145
|
url = image_url_lockerz link if link.index 'lockerz.com'
|
146
146
|
url = image_url_foursquare link if link.index '4sq.com'
|
147
|
+
url = image_url_embedly link 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.
|
147
148
|
end
|
148
149
|
url
|
149
150
|
end
|
150
|
-
|
151
|
-
|
151
|
+
|
152
|
+
#find the image's url via embed.ly
|
153
|
+
def image_url_embedly(link_url)
|
152
154
|
response = http_get "http://api.embed.ly/1/oembed?url=#{link_url}"
|
153
155
|
response['url'] if response
|
154
156
|
end
|
157
|
+
#find the image's url for a foursquare link
|
158
|
+
def image_url_foursquare(link_url)
|
159
|
+
image_url_embedly link_url
|
160
|
+
end
|
155
161
|
#find the image's url for a lockerz link
|
156
162
|
def image_url_lockerz(link_url)
|
157
163
|
response = http_get "http://api.plixi.com/api/tpapi.svc/json/metadatafromurl?details=false&url=#{link_url}"
|
@@ -239,7 +245,12 @@ class Tweetlr
|
|
239
245
|
curl = Curl::Easy.new request
|
240
246
|
curl.useragent = USER_AGENT
|
241
247
|
curl.perform
|
242
|
-
|
248
|
+
begin
|
249
|
+
JSON.parse curl.body_str
|
250
|
+
rescue JSON::ParserError => err
|
251
|
+
@log.warn "#{err}: Could not parse response for #{request} - this is probably not a json response: #{curl.body_str}"
|
252
|
+
return nil
|
253
|
+
end
|
243
254
|
rescue Curl::Err::ConnectionFailedError => err
|
244
255
|
@log.error "Connection failed: #{err}"
|
245
256
|
tries -= 1
|
@@ -267,6 +278,6 @@ class Tweetlr
|
|
267
278
|
else
|
268
279
|
nil
|
269
280
|
end
|
270
|
-
end
|
281
|
+
end
|
271
282
|
end
|
272
283
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Tweetlr do
|
4
|
+
|
5
|
+
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
|
6
|
+
config = YAML.load_file(config_file)
|
7
|
+
USER = config['tumblr_username']
|
8
|
+
PW = config['tumblr_password']
|
9
|
+
TIMESTAMP = config['twitter_timestamp']
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
@credentials = {:email => USER, :password => PW}
|
13
|
+
@cookie = "tmgioct=as3u4KJr9COyJA9j4nwr6ZAn"
|
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"=>"<a href="http://instagr.am" rel="nofollow">instagram</a>"}
|
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
|
+
@links = {
|
20
|
+
:instagram => "http://instagr.am/p/DzCWn/",
|
21
|
+
:twitpic => "http://twitpic.com/449o2x",
|
22
|
+
:yfrog => "http://yfrog.com/h4vlfp",
|
23
|
+
:picplz => "http://picplz.com/2hWv",
|
24
|
+
:imgly => "http://img.ly/3M1o",
|
25
|
+
:tco => 'http://t.co/MUGNayA',
|
26
|
+
:lockerz => 'http://lockerz.com/s/100269159',
|
27
|
+
:foursquare => 'http://4sq.com/mLKDdF',
|
28
|
+
:embedly => 'http://flic.kr/p/973hTv' #if no service matches, just try embedly
|
29
|
+
}
|
30
|
+
@pic_regexp = /(.*?)\.(jpg|jpeg|png|gif)$/i
|
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})
|
33
|
+
end
|
34
|
+
# it "should post to tumblr" do
|
35
|
+
# tweetlr = Tweetlr.new @credentials[:email], @credentials[:password], @cookie, nil, @searchterm, @config_file
|
36
|
+
# tumblr_post = tweetlr.generate_tumblr_photo_post @twitter_response
|
37
|
+
# tumblr_post[:date] = Time.now.to_s
|
38
|
+
# response = tweetlr.post_to_tumblr tumblr_post
|
39
|
+
# response.should be
|
40
|
+
# response.response_code.should be 201
|
41
|
+
# end
|
42
|
+
it "should search twitter for a given term" do
|
43
|
+
tweetlr = @tweetlr
|
44
|
+
response = tweetlr.search_twitter
|
45
|
+
tweets = response['results']
|
46
|
+
tweets.should be
|
47
|
+
tweets.should_not be_empty
|
48
|
+
end
|
49
|
+
it "should mark whitelist users' tweets as published" do
|
50
|
+
post = @tweetlr.generate_tumblr_photo_post @twitter_response
|
51
|
+
post[:state].should == 'published'
|
52
|
+
end
|
53
|
+
it "should mark non whitelist users' tweets as drafts" do
|
54
|
+
post = @tweetlr.generate_tumblr_photo_post @non_whitelist_tweet
|
55
|
+
post[:state].should == 'draft'
|
56
|
+
end
|
57
|
+
it "should not use retweets which would produce double blog posts" do
|
58
|
+
post = @tweetlr.generate_tumblr_photo_post @retweet
|
59
|
+
post.should_not be
|
60
|
+
end
|
61
|
+
it "should not use new style retweets which would produce double blog posts" do
|
62
|
+
post = @tweetlr.generate_tumblr_photo_post @new_style_retweet
|
63
|
+
post.should_not be
|
64
|
+
end
|
65
|
+
describe "image url processing" do
|
66
|
+
it "should find a picture's url from the supported services" do
|
67
|
+
@links.each do |key,value|
|
68
|
+
url = @tweetlr.find_image_url value
|
69
|
+
url.should be, "service #{key} not working!"
|
70
|
+
check_pic_url_extraction key if [:instagram,:picplz,:yfrog,:tco,:foursquare, :not_listed].index key
|
71
|
+
end
|
72
|
+
end
|
73
|
+
it "should not crash if embedly fallback won't find a link" do
|
74
|
+
url = @tweetlr.find_image_url "http://mopskopf"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
describe "tweet api response processing" do
|
78
|
+
it "should extract links" do
|
79
|
+
tweetlr = @tweetlr
|
80
|
+
link = tweetlr.extract_link @twitter_response
|
81
|
+
link.should == @links[:instagram]
|
82
|
+
link = tweetlr.extract_link @twitter_response.merge 'text' => @links[:instagram].chop #check if it works w/o the trailing slash
|
83
|
+
link.should == @links[:instagram].chop
|
84
|
+
end
|
85
|
+
end
|
86
|
+
def check_pic_url_extraction(service)
|
87
|
+
tweetlr = @tweetlr
|
88
|
+
image_url = tweetlr.send "image_url_#{service}".to_sym, @links[service]
|
89
|
+
image_url.should =~ @pic_regexp
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
data/tweetlr.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "tweetlr"
|
3
|
+
s.version = "0.1.3"
|
4
|
+
s.author = "Sven Kraeuter"
|
5
|
+
s.email = "mail@svenkraeuter.com"
|
6
|
+
s.homepage = "http://github.com/5v3n/#{s.name}"
|
7
|
+
s.summary = "tweetlr crawls twitter for a given term, extracts photos out of the collected tweets' short urls and posts the images to tumblr."
|
8
|
+
s.description = s.summary
|
9
|
+
|
10
|
+
s.rubyforge_project = s.name
|
11
|
+
s.extra_rdoc_files = %w(README.md LICENSE)
|
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"
|
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"
|
22
|
+
s.add_development_dependency "rdoc"
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
26
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
27
|
+
s.require_paths = ["lib"]
|
28
|
+
end
|
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.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,42 +9,108 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-06-
|
12
|
+
date: 2011-06-14 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: &
|
17
|
+
requirement: &2153694000 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
|
-
- -
|
20
|
+
- - ~>
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 1.1.3
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2153694000
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: eventmachine
|
28
|
-
requirement: &
|
28
|
+
requirement: &2153693520 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.12.10
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2153693520
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: curb
|
39
|
-
requirement: &
|
39
|
+
requirement: &2153693060 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.7.15
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2153693060
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: json
|
50
|
+
requirement: &2153692600 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.5.1
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2153692600
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: rspec
|
61
|
+
requirement: &2153692140 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 2.6.0
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *2153692140
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: autotest
|
72
|
+
requirement: &2153691680 !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: *2153691680
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: autotest-growl
|
83
|
+
requirement: &2153691220 !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: *2153691220
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: autotest-fsevent
|
94
|
+
requirement: &2153713280 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.2.5
|
100
|
+
type: :development
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *2153713280
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rdoc
|
105
|
+
requirement: &2153712900 !ruby/object:Gem::Requirement
|
40
106
|
none: false
|
41
107
|
requirements:
|
42
108
|
- - ! '>='
|
43
109
|
- !ruby/object:Gem::Version
|
44
110
|
version: '0'
|
45
|
-
type: :
|
111
|
+
type: :development
|
46
112
|
prerelease: false
|
47
|
-
version_requirements: *
|
113
|
+
version_requirements: *2153712900
|
48
114
|
description: tweetlr crawls twitter for a given term, extracts photos out of the collected
|
49
115
|
tweets' short urls and posts the images to tumblr.
|
50
116
|
email: mail@svenkraeuter.com
|
@@ -55,11 +121,19 @@ extra_rdoc_files:
|
|
55
121
|
- README.md
|
56
122
|
- LICENSE
|
57
123
|
files:
|
124
|
+
- .autotest
|
125
|
+
- .gitignore
|
126
|
+
- .rspec
|
127
|
+
- Gemfile
|
58
128
|
- LICENSE
|
59
129
|
- README.md
|
60
130
|
- Rakefile
|
61
131
|
- bin/tweetlr
|
132
|
+
- config/tweetlr.yml
|
62
133
|
- lib/tweetlr.rb
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
- spec/tweetlr_spec.rb
|
136
|
+
- tweetlr.gemspec
|
63
137
|
has_rdoc: true
|
64
138
|
homepage: http://github.com/5v3n/tweetlr
|
65
139
|
licenses: []
|
@@ -80,10 +154,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
154
|
- !ruby/object:Gem::Version
|
81
155
|
version: '0'
|
82
156
|
requirements: []
|
83
|
-
rubyforge_project:
|
157
|
+
rubyforge_project: tweetlr
|
84
158
|
rubygems_version: 1.6.2
|
85
159
|
signing_key:
|
86
160
|
specification_version: 3
|
87
161
|
summary: tweetlr crawls twitter for a given term, extracts photos out of the collected
|
88
162
|
tweets' short urls and posts the images to tumblr.
|
89
|
-
test_files:
|
163
|
+
test_files:
|
164
|
+
- spec/spec_helper.rb
|
165
|
+
- spec/tweetlr_spec.rb
|