snip-snap 0.1.0
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/README.rdoc +45 -0
- data/Rakefile +56 -0
- data/lib/snip_snap.rb +54 -0
- data/lib/snip_snap/client.rb +51 -0
- data/lib/snip_snap/imgly.rb +18 -0
- data/lib/snip_snap/skitch.rb +14 -0
- data/lib/snip_snap/twitpic.rb +18 -0
- data/lib/snip_snap/version.rb +13 -0
- data/lib/snip_snap/yfrog.rb +19 -0
- data/test/fixtures/skitch.html +84 -0
- data/test/fixtures/yfrog.xml +35 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/snip_snap/client_test.rb +106 -0
- data/test/unit/snip_snap/imgly_test.rb +40 -0
- data/test/unit/snip_snap/skitch_test.rb +37 -0
- data/test/unit/snip_snap/twitpic_test.rb +40 -0
- data/test/unit/snip_snap/yfrog_test.rb +40 -0
- data/test/unit/snip_snap_test.rb +57 -0
- metadata +82 -0
data/README.rdoc
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
= SnipSnap
|
2
|
+
|
3
|
+
== Description
|
4
|
+
|
5
|
+
SnipSnap is a Ruby library that will allow you to extract the URL of an image from
|
6
|
+
one of many popular image sharing services. Just give it the shortened URL and it can
|
7
|
+
give you the full URL to the embedded image. This library currently supports Img.ly,
|
8
|
+
Skitch, Twitpic, and Yfrog - others are coming.
|
9
|
+
|
10
|
+
== Installation
|
11
|
+
|
12
|
+
sudo gem install snip-snap
|
13
|
+
|
14
|
+
== Usage
|
15
|
+
|
16
|
+
require 'rubygems
|
17
|
+
require 'snip_snap'
|
18
|
+
|
19
|
+
client = SnipSnap.factory('http://yfrog.com/7hb9lj')
|
20
|
+
puts client.image_url
|
21
|
+
|
22
|
+
== License
|
23
|
+
|
24
|
+
Copyright (c) 2009 Patrick Reagan (reaganpr@gmail.com)
|
25
|
+
|
26
|
+
Permission is hereby granted, free of charge, to any person
|
27
|
+
obtaining a copy of this software and associated documentation
|
28
|
+
files (the "Software"), to deal in the Software without
|
29
|
+
restriction, including without limitation the rights to use,
|
30
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
31
|
+
copies of the Software, and to permit persons to whom the
|
32
|
+
Software is furnished to do so, subject to the following
|
33
|
+
conditions:
|
34
|
+
|
35
|
+
The above copyright notice and this permission notice shall be
|
36
|
+
included in all copies or substantial portions of the Software.
|
37
|
+
|
38
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
39
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
40
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
41
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
42
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
43
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
44
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
45
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
require 'lib/snip_snap/version'
|
6
|
+
|
7
|
+
spec = Gem::Specification.new do |s|
|
8
|
+
s.name = 'snip-snap'
|
9
|
+
s.version = SnipSnap::Version.to_s
|
10
|
+
s.has_rdoc = true
|
11
|
+
s.extra_rdoc_files = %w(README.rdoc)
|
12
|
+
s.rdoc_options = %w(--main README.rdoc)
|
13
|
+
s.summary = "A ruby library that allows you to extract images from popular image-sharing services"
|
14
|
+
s.author = 'Patrick Reagan'
|
15
|
+
s.email = 'reaganpr@gmail.com'
|
16
|
+
s.homepage = 'http://sneaq.net'
|
17
|
+
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*")
|
18
|
+
# s.executables = ['snip-snap']
|
19
|
+
|
20
|
+
s.add_dependency('curb', '>= 0.5.1.0')
|
21
|
+
end
|
22
|
+
|
23
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
24
|
+
pkg.gem_spec = spec
|
25
|
+
end
|
26
|
+
|
27
|
+
Rake::TestTask.new do |t|
|
28
|
+
t.libs << 'test'
|
29
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
30
|
+
t.verbose = true
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'rcov/rcovtask'
|
35
|
+
|
36
|
+
Rcov::RcovTask.new(:coverage) do |t|
|
37
|
+
t.libs = ['test']
|
38
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
39
|
+
t.verbose = true
|
40
|
+
t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby']
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => :coverage
|
44
|
+
|
45
|
+
rescue LoadError
|
46
|
+
warn "\n**** Install rcov (sudo gem install relevance-rcov) to get coverage stats ****\n"
|
47
|
+
task :default => :test
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
desc 'Generate the gemspec to serve this Gem from Github'
|
52
|
+
task :github do
|
53
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
54
|
+
File.open(file, 'w') {|f| f << spec.to_ruby }
|
55
|
+
puts "Created gemspec: #{file}"
|
56
|
+
end
|
data/lib/snip_snap.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'curb'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
require 'snip_snap/client'
|
7
|
+
|
8
|
+
require 'snip_snap/skitch'
|
9
|
+
require 'snip_snap/imgly'
|
10
|
+
require 'snip_snap/yfrog'
|
11
|
+
require 'snip_snap/twitpic'
|
12
|
+
|
13
|
+
# = SnipSnap
|
14
|
+
#
|
15
|
+
# This is a small Ruby library that allows you to extract images from the more popular
|
16
|
+
# image sharing services. Currently supported services are:
|
17
|
+
#
|
18
|
+
# * Img.ly
|
19
|
+
# * Skitch
|
20
|
+
# * Twitpic
|
21
|
+
# * Yfrog
|
22
|
+
#
|
23
|
+
# To use, just point it at a URL:
|
24
|
+
#
|
25
|
+
# require 'rubygems'
|
26
|
+
# require 'snip_snap'
|
27
|
+
#
|
28
|
+
# client = SnipSnap.factory('http://yfrog.com/7hb9lj')
|
29
|
+
# puts client.image_url
|
30
|
+
#
|
31
|
+
# That's it.
|
32
|
+
#
|
33
|
+
module SnipSnap
|
34
|
+
|
35
|
+
def self.host_map # :nodoc:
|
36
|
+
{
|
37
|
+
'skitch.com' => 'Skitch',
|
38
|
+
'img.ly' => 'Imgly',
|
39
|
+
'twitpic.com' => 'Twitpic',
|
40
|
+
'yfrog.com' => 'Yfrog'
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
# Use the correct class to handle image extraction for a given URL
|
45
|
+
def self.factory(url)
|
46
|
+
const_get(class_name_for(url)).new(url)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.class_name_for(url) # :nodoc:
|
50
|
+
uri = URI.parse(url)
|
51
|
+
host_map[uri.host]
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module SnipSnap
|
2
|
+
module Client # :nodoc:
|
3
|
+
|
4
|
+
module InstanceMethods
|
5
|
+
|
6
|
+
attr_reader :url
|
7
|
+
|
8
|
+
def initialize(url)
|
9
|
+
@url = url
|
10
|
+
end
|
11
|
+
|
12
|
+
def get
|
13
|
+
get_response {|c| c.http_get }
|
14
|
+
end
|
15
|
+
|
16
|
+
def head
|
17
|
+
get_response {|c| c.http_head }
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_response(&block)
|
21
|
+
client = Curl::Easy.new(url) do |config|
|
22
|
+
config.follow_location = true
|
23
|
+
config.max_redirects = 5
|
24
|
+
end
|
25
|
+
|
26
|
+
block.call(client)
|
27
|
+
|
28
|
+
client
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
module ClassMethods
|
34
|
+
|
35
|
+
def request_method(method_name)
|
36
|
+
class_eval <<-CODE
|
37
|
+
def response
|
38
|
+
@response ||= #{method_name}
|
39
|
+
end
|
40
|
+
CODE
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.included(other)
|
46
|
+
other.send(:include, SnipSnap::Client::InstanceMethods)
|
47
|
+
other.send(:extend, SnipSnap::Client::ClassMethods)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SnipSnap
|
2
|
+
class Imgly
|
3
|
+
|
4
|
+
include Client
|
5
|
+
|
6
|
+
request_method :head
|
7
|
+
|
8
|
+
def url
|
9
|
+
identifier = @url.match(/([^\/]+)$/)[1]
|
10
|
+
"http://img.ly/show/large/#{identifier}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def image_url
|
14
|
+
response.last_effective_url
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SnipSnap
|
2
|
+
class Twitpic
|
3
|
+
|
4
|
+
include Client
|
5
|
+
|
6
|
+
request_method :head
|
7
|
+
|
8
|
+
def url
|
9
|
+
identifier = @url.match(/([^\/]+)$/)[1]
|
10
|
+
"http://twitpic.com/show/large/#{identifier}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def image_url
|
14
|
+
response.last_effective_url
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SnipSnap
|
2
|
+
class Yfrog
|
3
|
+
|
4
|
+
include Client
|
5
|
+
|
6
|
+
request_method :get
|
7
|
+
|
8
|
+
def url
|
9
|
+
identifier = @url.match(/([^\/]+)$/)[1]
|
10
|
+
"http://yfrog.com/api/xmlInfo?path=#{identifier}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def image_url
|
14
|
+
body = response.body_str
|
15
|
+
body.match(/<image_link>(.+)<\/image_link>/)[1]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
5
|
+
<meta name="KEYWORDS" content="Skitch Web" />
|
6
|
+
<meta name="DESCRIPTION" content="Skitch Web" />
|
7
|
+
<meta name="robots" content="index,follow" />
|
8
|
+
<link rel="icon" href="/favicon.ico" type="image/x-icon" />
|
9
|
+
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
|
10
|
+
<title>Skitch.com > reagent > Clinical Reader: Research articles, news and multimedia for doctors, all in one place</title>
|
11
|
+
<style type="text/css" media="screen,projection">
|
12
|
+
/*<![CDATA[*/
|
13
|
+
@import "/css/mySkitch.css?13363";
|
14
|
+
/*]]>*/
|
15
|
+
</style>
|
16
|
+
<script type="text/javascript" src="/js/src/myskitch.composite.js?13363"></script>
|
17
|
+
<!-- stylesheet /-->
|
18
|
+
<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="http://skitch.com/feeds/reagent/atom.xml" />
|
19
|
+
</head>
|
20
|
+
<body id="body" onload="plasq.mySkitch.browser.loader();" onresize="plasq.mySkitch.browser.resize();">
|
21
|
+
|
22
|
+
<div id="header">
|
23
|
+
<div id="logo"><a href="/"><img src="/images/logo.png" border="0" alt="" /></a></div>
|
24
|
+
<div id="menu">
|
25
|
+
<span class="shadow"><ul><li>sign-up</li> <span>|</span> <li>login</li></ul></span>
|
26
|
+
<span class="overlay"><ul><li><a href="/signup/">sign-up</a></li> <span class="i">|</span> <li><a href="/login/">login</a></li></ul></span>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div id="content"><!-- content /--></div>
|
31
|
+
<div id="bottomad"><!-- adzone1 /--></div>
|
32
|
+
|
33
|
+
<div id="mtlogo"><div id="rightbar"></div><div id="rightbarbottom"><a href="http://www.mediatemple.net" target="_blank" title="Hosted by (mt)"><img src="/images/mt-hosted.png" alt="Hosted by (mt)" border="0" /></a><br /><br /><!-- adzone2 /--><br /><br /><br /><br /></div></div>
|
34
|
+
|
35
|
+
<div id="footer">
|
36
|
+
<div class="left padding5px">© 2007 - 2009 <a href="http://plasq.com" target="_blank">plasq</a> • <a href="http://skitch.com/ToS">Terms of Service</a> • <a href="http://skitch.com/Privacy">Privacy Policy</a> • <a href="http://skitch.com/DMCA">DMCA Notice</a> • <a href="http://help.skitch.com">Support</a> • <a href="http://plasq.com/skitch">Skitch Info</a> • <a href="http://blog.skitch.com">Skitch Blog</a></div>
|
37
|
+
<div class="right marginright"><a href="http://plasq.com" target="_blank" title="Visit plasq!"><img src="/images/footer-plasq.png" border="0" alt="Visit plasq!" /></a></div>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<script type="text/javascript">
|
41
|
+
/*<![CDATA[*/
|
42
|
+
plasq.mySkitch.sidebar = new plasq.mySkitch.classes.container( 'content' );
|
43
|
+
plasq.mySkitch.sidebar.element.className = 'myskitch-image-strip-right';
|
44
|
+
plasq.mySkitch.sidebar.addText( ' ' );
|
45
|
+
plasq.mySkitch.backLink = '';
|
46
|
+
|
47
|
+
plasq.mySkitch.selectCopyContainer = plasq.mySkitch.sidebar.addSelectCopyContainer();
|
48
|
+
plasq.mySkitch.selectCopyContainer.addSelectCopy( 'This page', 'http://skitch.com/reagent/baadt/clinical-reader-research-articles-news-and-multimedia-for-doctors-all-in-one-place', 'Link to the page you are looking at <b>right now</b> (Recommended)' );
|
49
|
+
plasq.mySkitch.selectCopyContainer.addSelectCopy( 'Image only', 'http://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.jpg', '<b>Image only</b> link. Comments can\'t be made on these' );
|
50
|
+
plasq.mySkitch.selectCopyContainer.addSelectCopy( 'Embed', '<div class="thumbnail"><a href="http://skitch.com/reagent/baadt/clinical-reader-research-articles-news-and-multimedia-for-doctors-all-in-one-place"><img src="http://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.preview.jpg" alt="Clinical Reader: Research articles, news and multimedia for doctors, all in one place" /></a><br /><span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080">Uploaded with <a href="http://plasq.com/">plasq</a>\'s <a href="http://skitch.com">Skitch</a>!</span></div>', 'HTML with zoomable <b>thumbnail</b>. (Great for eBay, MySpace blogs etc)' );
|
51
|
+
plasq.mySkitch.selectCopyContainer.addSelectCopy( 'Fullsize', '<img src="http://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.jpg" alt="Clinical Reader: Research articles, news and multimedia for doctors, all in one place"/>', 'HTML to show the <b>fullsize</b> image' );
|
52
|
+
plasq.mySkitch.selectCopyContainer.addSelectCopy( 'Forum', '[url=http://skitch.com/reagent/baadt/clinical-reader-research-articles-news-and-multimedia-for-doctors-all-in-one-place][img]http://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.preview.jpg[/img][/url][br][url=http://skitch.com/reagent/baadt/clinical-reader-research-articles-news-and-multimedia-for-doctors-all-in-one-place]Click for full size[/url] - [color=#A7A7A7]Uploaded with [url=http://plasq.com]plasq[/url]\'s [url=http://skitch.com]Skitch[/url][/color]', 'For use in web based <b>forums</b>' );
|
53
|
+
|
54
|
+
$('mtlogo').style.right = '32px';
|
55
|
+
$('mtlogo').style.top = '304px';
|
56
|
+
|
57
|
+
plasq.mySkitch.container = new plasq.mySkitch.classes.container( 'content' );
|
58
|
+
plasq.mySkitch.container.addSection( 'Clinical Reader: Research articles, news and multimedia for doctors, all in one place' );
|
59
|
+
plasq.mySkitch.container.addText( '<div style="display:block;" class="myskitch-header-notes">Pssst!.. This page is Secret - it can only be seen if you give people the URL</div>' );
|
60
|
+
plasq.mySkitch.container.addImage( 'http://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.jpg', '', '', '', false, '472', '459' ).enableInfo().enableSlurp( 'skitch://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.jpg?skitchtitle=Re%3A%20Clinical%20Reader%3A%20Research%20articles%2C%20news%20and%20multimedia%20for%20doctors%2C%20all%20in%20one%20place' ).enableDescription( ' ' );
|
61
|
+
plasq.mySkitch.container.addText( ' <br /> ' );
|
62
|
+
plasq.mySkitch.container.addSection( 'Comments' );
|
63
|
+
plasq.mySkitch.container.comments = plasq.mySkitch.container.addComments( '77fdb5-801093-1b64d7-a01c34-df9430-dd', 'This image has no comments yet. Be the first!', '0d171c5663e826463cc1f8eb32cdb0fa', true, '0' );
|
64
|
+
/*]]>*/
|
65
|
+
</script>
|
66
|
+
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
|
67
|
+
</script>
|
68
|
+
<script type="text/javascript">
|
69
|
+
_uacct = "UA-2305120-1";
|
70
|
+
urchinTracker();
|
71
|
+
</script>
|
72
|
+
|
73
|
+
<!-- Start Quantcast tag -->
|
74
|
+
<script type="text/javascript" src="https://secure.quantserve.com/quant.js"></script>
|
75
|
+
<script type="text/javascript">
|
76
|
+
_qacct="p-a3PI6F3Y912Tk";
|
77
|
+
quantserve();
|
78
|
+
</script>
|
79
|
+
<noscript>
|
80
|
+
<img src="https://secure.quantserve.com/pixel/p-a3PI6F3Y912Tk.gif" style="display: none" height="1" width="1" alt="Quantcast"/></noscript>
|
81
|
+
<!-- End Quantcast tag -->
|
82
|
+
|
83
|
+
</body>
|
84
|
+
</html>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?><imginfo xmlns="http://ns.imageshack.us/imginfo/7/" version="7" timestamp="1251516300">
|
2
|
+
<rating>
|
3
|
+
<ratings>0</ratings>
|
4
|
+
<avg>0.0</avg>
|
5
|
+
</rating>
|
6
|
+
<files server="377" bucket="9665">
|
7
|
+
<image size="29599" content-type="image/jpeg">b97.jpg</image>
|
8
|
+
<thumb size="4042" content-type="image/jpeg">b97.th.jpg</thumb>
|
9
|
+
</files>
|
10
|
+
<resolution>
|
11
|
+
<width>525</width>
|
12
|
+
<height>700</height>
|
13
|
+
</resolution>
|
14
|
+
<class>r</class>
|
15
|
+
<visibility>yes</visibility>
|
16
|
+
<uploader>
|
17
|
+
<ip>38.99.76.246</ip>
|
18
|
+
<cookie>1d5927aee7676b56f5fb5e1c6dc386bf</cookie>
|
19
|
+
<username>twitter~urbanflex</username>
|
20
|
+
</uploader>
|
21
|
+
<links>
|
22
|
+
<image_link>http://img377.imageshack.us/img377/9665/b97.jpg</image_link>
|
23
|
+
<image_html><a href="http://img377.imageshack.us/my.php?image=b97.jpg" target="_blank"><img src="http://img377.imageshack.us/img377/9665/b97.jpg" alt="Free Image Hosting at www.ImageShack.us" border="0"/></a></image_html>
|
24
|
+
<image_bb>[URL=http://img377.imageshack.us/my.php?image=b97.jpg][IMG]http://img377.imageshack.us/img377/9665/b97.jpg[/IMG][/URL]</image_bb>
|
25
|
+
<image_bb2>[url=http://img377.imageshack.us/my.php?image=b97.jpg][img=http://img377.imageshack.us/img377/9665/b97.jpg][/url]</image_bb2>
|
26
|
+
<thumb_link>http://img377.imageshack.us/img377/9665/b97.th.jpg</thumb_link>
|
27
|
+
<thumb_html><a href="http://img377.imageshack.us/my.php?image=b97.jpg" target="_blank"><img src="http://img377.imageshack.us/img377/9665/b97.th.jpg" alt="Free Image Hosting at www.ImageShack.us" border="0"/></a></thumb_html>
|
28
|
+
<thumb_bb>[URL=http://img377.imageshack.us/my.php?image=b97.jpg][IMG]http://img377.imageshack.us/img377/9665/b97.th.jpg[/IMG][/URL]</thumb_bb>
|
29
|
+
<thumb_bb2>[url=http://img377.imageshack.us/my.php?image=b97.jpg][img=http://img377.imageshack.us/img377/9665/b97.th.jpg][/url]</thumb_bb2>
|
30
|
+
<yfrog_link>http://yfrog.com/ahb97j</yfrog_link>
|
31
|
+
<yfrog_thumb>http://yfrog.com/ahb97j.th.jpg</yfrog_thumb>
|
32
|
+
<ad_link>http://img377.imageshack.us/my.php?image=b97.jpg</ad_link>
|
33
|
+
<done_page>http://img377.imageshack.us/content.php?page=done&l=img377/9665/b97.jpg</done_page>
|
34
|
+
</links>
|
35
|
+
</imginfo>
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# http://sneaq.net/textmate-wtf
|
2
|
+
$:.reject! { |e| e.include? 'TextMate' }
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'throat_punch'
|
6
|
+
|
7
|
+
require File.dirname(__FILE__) + '/../lib/snip_snap'
|
8
|
+
|
9
|
+
class Test::Unit::TestCase
|
10
|
+
|
11
|
+
def read_fixture(filename)
|
12
|
+
File.read(File.dirname(__FILE__) + '/fixtures/' + filename)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
class ClientImplementation
|
4
|
+
include SnipSnap::Client
|
5
|
+
end
|
6
|
+
|
7
|
+
class ClientGetImplementation
|
8
|
+
include SnipSnap::Client
|
9
|
+
request_method :get
|
10
|
+
end
|
11
|
+
|
12
|
+
class ClientHeadImplementation
|
13
|
+
include SnipSnap::Client
|
14
|
+
request_method :head
|
15
|
+
end
|
16
|
+
|
17
|
+
module SnipSnap
|
18
|
+
class ClientTest < Test::Unit::TestCase
|
19
|
+
|
20
|
+
context "An instance of the ClientImplementation class" do
|
21
|
+
|
22
|
+
should "be able to make a get request" do
|
23
|
+
url = 'http://example.com'
|
24
|
+
|
25
|
+
client = mock() do |c|
|
26
|
+
c.expects(:http_get).with()
|
27
|
+
end
|
28
|
+
|
29
|
+
config = mock() do |c|
|
30
|
+
c.expects(:follow_location=).with(true)
|
31
|
+
c.expects(:max_redirects=).with(5)
|
32
|
+
end
|
33
|
+
|
34
|
+
Curl::Easy.expects(:new).with(url).yields(config).returns(client)
|
35
|
+
|
36
|
+
c = ClientImplementation.new(url)
|
37
|
+
c.get.should == client
|
38
|
+
end
|
39
|
+
|
40
|
+
should "be able to make a head request" do
|
41
|
+
url = 'http://example.com'
|
42
|
+
|
43
|
+
client = mock() do |c|
|
44
|
+
c.expects(:http_head).with()
|
45
|
+
end
|
46
|
+
|
47
|
+
config = mock() do |c|
|
48
|
+
c.expects(:follow_location=).with(true)
|
49
|
+
c.expects(:max_redirects=).with(5)
|
50
|
+
end
|
51
|
+
|
52
|
+
Curl::Easy.expects(:new).with(url).yields(config).returns(client)
|
53
|
+
|
54
|
+
c = ClientImplementation.new(url)
|
55
|
+
c.head.should == client
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context "An instance of the ClientGetImplementation class" do
|
61
|
+
|
62
|
+
should "fetch a response using a GET request when calling response" do
|
63
|
+
response = stub()
|
64
|
+
|
65
|
+
c = ClientGetImplementation.new('http://example.com')
|
66
|
+
c.expects(:get).with().returns(response)
|
67
|
+
|
68
|
+
c.response.should == response
|
69
|
+
end
|
70
|
+
|
71
|
+
should "cache the response object" do
|
72
|
+
response = stub()
|
73
|
+
|
74
|
+
c = ClientGetImplementation.new('http://example.com')
|
75
|
+
c.expects(:get).once.with().returns(response)
|
76
|
+
|
77
|
+
2.times { c.response.should }
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context "An instance of the ClientHeadImplementation class" do
|
83
|
+
|
84
|
+
should "fetch a response using a GET request when calling response" do
|
85
|
+
response = stub()
|
86
|
+
|
87
|
+
c = ClientHeadImplementation.new('http://example.com')
|
88
|
+
c.expects(:head).with().returns(response)
|
89
|
+
|
90
|
+
c.response.should == response
|
91
|
+
end
|
92
|
+
|
93
|
+
should "cache the response object" do
|
94
|
+
response = stub()
|
95
|
+
|
96
|
+
c = ClientHeadImplementation.new('http://example.com')
|
97
|
+
c.expects(:head).once.with().returns(response)
|
98
|
+
|
99
|
+
2.times { c.response.should }
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module SnipSnap
|
4
|
+
class ImglyTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Imgly class" do
|
7
|
+
setup do
|
8
|
+
@url = 'http://img.ly/3aa'
|
9
|
+
@expanded_url = 'http://img.ly/show/large/3aa'
|
10
|
+
end
|
11
|
+
|
12
|
+
should "have a url expanded from the source" do
|
13
|
+
i = SnipSnap::Imgly.new(@url)
|
14
|
+
i.url.should == @expanded_url
|
15
|
+
end
|
16
|
+
|
17
|
+
should "use a HEAD request when retrieving the response" do
|
18
|
+
response = stub()
|
19
|
+
|
20
|
+
i = SnipSnap::Imgly.new(@url)
|
21
|
+
i.expects(:head).with().returns(response)
|
22
|
+
|
23
|
+
i.response.should == response
|
24
|
+
end
|
25
|
+
|
26
|
+
should "be able to return an image url for a given url" do
|
27
|
+
response = stub()
|
28
|
+
response.stubs(:last_effective_url).with().returns(@expanded_url)
|
29
|
+
|
30
|
+
i = SnipSnap::Imgly.new(@url)
|
31
|
+
i.stubs(:response).with().returns(response)
|
32
|
+
|
33
|
+
i.image_url.should == @expanded_url
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module SnipSnap
|
4
|
+
class SkitchTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Skitch class" do
|
7
|
+
setup { @url = 'http://skitch.com/example' }
|
8
|
+
|
9
|
+
should "have a URL" do
|
10
|
+
s = SnipSnap::Skitch.new(@url)
|
11
|
+
s.url.should == @url
|
12
|
+
end
|
13
|
+
|
14
|
+
should "use a GET request when retrieving the response" do
|
15
|
+
response = stub()
|
16
|
+
|
17
|
+
s = SnipSnap::Skitch.new(@url)
|
18
|
+
s.expects(:get).with().returns(response)
|
19
|
+
|
20
|
+
s.response.should == response
|
21
|
+
end
|
22
|
+
|
23
|
+
should "be able to return an image url for a given url" do
|
24
|
+
s = SnipSnap::Skitch.new(@url)
|
25
|
+
|
26
|
+
response = stub()
|
27
|
+
response.stubs(:body_str).with().returns(read_fixture('skitch.html'))
|
28
|
+
|
29
|
+
s.stubs(:response).with().returns(response)
|
30
|
+
|
31
|
+
s.image_url.should == 'http://img.skitch.com/20090830-ejnqt1s9car55ju2sdnfirdsdn.jpg'
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module SnipSnap
|
4
|
+
class TwitpicTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Twitpic class" do
|
7
|
+
setup do
|
8
|
+
@url = 'http://twitpic.com/203o0'
|
9
|
+
@expanded_url = 'http://twitpic.com/show/large/203o0'
|
10
|
+
end
|
11
|
+
|
12
|
+
should "have a url derived from the source URL" do
|
13
|
+
t = SnipSnap::Twitpic.new(@url)
|
14
|
+
t.url.should == @expanded_url
|
15
|
+
end
|
16
|
+
|
17
|
+
should "use a HEAD request when retrieving the response" do
|
18
|
+
response = stub()
|
19
|
+
|
20
|
+
t = SnipSnap::Twitpic.new(@url)
|
21
|
+
t.expects(:head).with().returns(response)
|
22
|
+
|
23
|
+
t.response.should == response
|
24
|
+
end
|
25
|
+
|
26
|
+
should "be able to return an image url for a given url" do
|
27
|
+
response = stub()
|
28
|
+
response.stubs(:last_effective_url).with().returns(@expanded_url)
|
29
|
+
|
30
|
+
t = SnipSnap::Twitpic.new(@url)
|
31
|
+
t.stubs(:response).with().returns(response)
|
32
|
+
|
33
|
+
t.image_url.should == @expanded_url
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module SnipSnap
|
4
|
+
class YfrogTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Yfrog class" do
|
7
|
+
setup do
|
8
|
+
@url = 'http://yfrog.com/ahb97j'
|
9
|
+
@expanded_url = 'http://yfrog.com/api/xmlInfo?path=ahb97j'
|
10
|
+
end
|
11
|
+
|
12
|
+
should "have a url derived from the source URL" do
|
13
|
+
y = SnipSnap::Yfrog.new(@url)
|
14
|
+
y.url.should == @expanded_url
|
15
|
+
end
|
16
|
+
|
17
|
+
should "use a GET request when retrieving the response" do
|
18
|
+
response = stub()
|
19
|
+
|
20
|
+
y = SnipSnap::Yfrog.new(@url)
|
21
|
+
y.expects(:get).with().returns(response)
|
22
|
+
|
23
|
+
y.response.should == response
|
24
|
+
end
|
25
|
+
|
26
|
+
should "be able to return an image url for a given url" do
|
27
|
+
y = SnipSnap::Yfrog.new(@url)
|
28
|
+
|
29
|
+
response = stub()
|
30
|
+
response.stubs(:body_str).with().returns(read_fixture('yfrog.xml'))
|
31
|
+
|
32
|
+
y.stubs(:response).with().returns(response)
|
33
|
+
|
34
|
+
y.image_url.should == 'http://img377.imageshack.us/img377/9665/b97.jpg'
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class SnipSnapTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
describe "The SnipSnap module" do
|
6
|
+
|
7
|
+
should "know the correct class name for a Skitch URL" do
|
8
|
+
url = 'http://skitch.com/reagent/bh4ei/bleeergh'
|
9
|
+
SnipSnap.class_name_for(url).should == 'Skitch'
|
10
|
+
end
|
11
|
+
|
12
|
+
should "know the correct class name for an Imgly URL" do
|
13
|
+
url = 'http://img.ly/3ey'
|
14
|
+
SnipSnap.class_name_for(url).should == 'Imgly'
|
15
|
+
end
|
16
|
+
|
17
|
+
should "know the correct class name for a Twitpic URL" do
|
18
|
+
url = 'http://twitpic.com/203o0'
|
19
|
+
SnipSnap.class_name_for(url).should == 'Twitpic'
|
20
|
+
end
|
21
|
+
|
22
|
+
should "know the correct class name for a Yfrog URL" do
|
23
|
+
url = 'http://yfrog.com/ahb97j'
|
24
|
+
SnipSnap.class_name_for(url).should == 'Yfrog'
|
25
|
+
end
|
26
|
+
|
27
|
+
should "be able to create an instance of the Skitch class with the supplied URL" do
|
28
|
+
url = 'http://skitch.com/reagent/bh4ei/bleeergh'
|
29
|
+
SnipSnap::Skitch.expects(:new).with(url).returns('skitch')
|
30
|
+
|
31
|
+
SnipSnap.factory(url).should == 'skitch'
|
32
|
+
end
|
33
|
+
|
34
|
+
should "be able to create an instance of the Imgly class with the supplied URL" do
|
35
|
+
url = 'http://img.ly/3ey'
|
36
|
+
SnipSnap::Imgly.expects(:new).with(url).returns('imgly')
|
37
|
+
|
38
|
+
SnipSnap.factory(url).should == 'imgly'
|
39
|
+
end
|
40
|
+
|
41
|
+
should "be able to create an instance of the Twitpic class with the supplied URL" do
|
42
|
+
url = 'http://twitpic.com/203o0'
|
43
|
+
SnipSnap::Twitpic.expects(:new).with(url).returns('twitpic')
|
44
|
+
|
45
|
+
SnipSnap.factory(url).should == 'twitpic'
|
46
|
+
end
|
47
|
+
|
48
|
+
should "be able to create an instance of the Yfrog class with the supplied URL" do
|
49
|
+
url = 'http://yfrog.com/ahb97j'
|
50
|
+
SnipSnap::Yfrog.expects(:new).with(url).returns('yfrog')
|
51
|
+
|
52
|
+
SnipSnap.factory(url).should == 'yfrog'
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: snip-snap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Patrick Reagan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-02 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: curb
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.5.1.0
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: reaganpr@gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.rdoc
|
33
|
+
files:
|
34
|
+
- README.rdoc
|
35
|
+
- Rakefile
|
36
|
+
- lib/snip_snap/client.rb
|
37
|
+
- lib/snip_snap/imgly.rb
|
38
|
+
- lib/snip_snap/skitch.rb
|
39
|
+
- lib/snip_snap/twitpic.rb
|
40
|
+
- lib/snip_snap/version.rb
|
41
|
+
- lib/snip_snap/yfrog.rb
|
42
|
+
- lib/snip_snap.rb
|
43
|
+
- test/fixtures/skitch.html
|
44
|
+
- test/fixtures/yfrog.xml
|
45
|
+
- test/test_helper.rb
|
46
|
+
- test/unit/snip_snap/client_test.rb
|
47
|
+
- test/unit/snip_snap/imgly_test.rb
|
48
|
+
- test/unit/snip_snap/skitch_test.rb
|
49
|
+
- test/unit/snip_snap/twitpic_test.rb
|
50
|
+
- test/unit/snip_snap/yfrog_test.rb
|
51
|
+
- test/unit/snip_snap_test.rb
|
52
|
+
has_rdoc: true
|
53
|
+
homepage: http://sneaq.net
|
54
|
+
licenses: []
|
55
|
+
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options:
|
58
|
+
- --main
|
59
|
+
- README.rdoc
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.3.4
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: A ruby library that allows you to extract images from popular image-sharing services
|
81
|
+
test_files: []
|
82
|
+
|