snip-snap 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/Rakefile +1 -1
- data/lib/snip_snap.rb +8 -5
- data/lib/snip_snap/flickr.rb +9 -2
- data/lib/snip_snap/twitgoo.rb +17 -0
- data/lib/snip_snap/version.rb +1 -1
- data/test/fixtures/twitgoo.xml +7 -0
- data/test/integration/response_test.rb +16 -1
- data/test/unit/snip_snap/flickr_test.rb +34 -2
- data/test/unit/snip_snap/twitgoo_test.rb +36 -0
- data/test/unit/snip_snap_test.rb +39 -73
- metadata +5 -3
- data/test/flickr_api_key +0 -1
data/README.rdoc
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
SnipSnap is a Ruby library that will allow you to extract the URL of an image from
|
6
6
|
one of many popular image sharing services. Just give it the shortened URL and it can
|
7
7
|
give you the full URL to the embedded image. This library currently supports Img.ly,
|
8
|
-
Skitch, Twitpic, Flickr, and
|
8
|
+
Skitch, Twitpic, Flickr, Yfrog, and Twitgoo - others are coming.
|
9
9
|
|
10
10
|
== Installation
|
11
11
|
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ spec = Gem::Specification.new do |s|
|
|
14
14
|
s.author = 'Patrick Reagan'
|
15
15
|
s.email = 'reaganpr@gmail.com'
|
16
16
|
s.homepage = 'http://sneaq.net'
|
17
|
-
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*")
|
17
|
+
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*") - ['test/flickr_api_key']
|
18
18
|
# s.executables = ['snip-snap']
|
19
19
|
|
20
20
|
s.add_dependency('curb', '>= 0.5.1.0')
|
data/lib/snip_snap.rb
CHANGED
@@ -11,6 +11,7 @@ require 'snip_snap/imgly'
|
|
11
11
|
require 'snip_snap/yfrog'
|
12
12
|
require 'snip_snap/twitpic'
|
13
13
|
require 'snip_snap/flickr'
|
14
|
+
require 'snip_snap/twitgoo'
|
14
15
|
require 'snip_snap/image'
|
15
16
|
|
16
17
|
# = SnipSnap
|
@@ -23,6 +24,7 @@ require 'snip_snap/image'
|
|
23
24
|
# * Twitpic
|
24
25
|
# * Yfrog
|
25
26
|
# * Flickr
|
27
|
+
# * Twitgoo
|
26
28
|
#
|
27
29
|
# To use, just point it at a URL:
|
28
30
|
#
|
@@ -38,11 +40,12 @@ module SnipSnap
|
|
38
40
|
|
39
41
|
def self.host_map # :nodoc:
|
40
42
|
{
|
41
|
-
/^(www\.)?skitch
|
42
|
-
/img
|
43
|
-
/^twitpic
|
44
|
-
/yfrog\.(com|us)/
|
45
|
-
/^(flic
|
43
|
+
/^(www\.)?skitch\.com/ => 'Skitch',
|
44
|
+
/img\.ly\/[0-9a-z]+$/i => 'Imgly',
|
45
|
+
/^twitpic\.com/ => 'Twitpic',
|
46
|
+
/yfrog\.(com|us)/ => 'Yfrog',
|
47
|
+
/^(flic\.kr|(www\.)?flickr.com)/ => 'Flickr',
|
48
|
+
/^twitgoo\.com/ => 'Twitgoo'
|
46
49
|
}
|
47
50
|
end
|
48
51
|
|
data/lib/snip_snap/flickr.rb
CHANGED
@@ -5,11 +5,18 @@ module SnipSnap
|
|
5
5
|
|
6
6
|
request_method :head
|
7
7
|
|
8
|
+
def endpoint_url
|
9
|
+
response.last_effective_url
|
10
|
+
end
|
11
|
+
|
8
12
|
def identifier
|
9
|
-
|
10
|
-
|
13
|
+
pattern = /^http:\/\/(?:www\.)?flickr.com\/photos\/[^\/]+\/(\d+)/
|
14
|
+
match = endpoint_url.match(pattern)
|
15
|
+
|
16
|
+
match[1] unless match.nil?
|
11
17
|
end
|
12
18
|
|
19
|
+
# TODO: Handle case when this fetch fails (e.g. invalid photo ID)
|
13
20
|
def photo
|
14
21
|
Fleakr::Objects::Photo.find_by_id(identifier)
|
15
22
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SnipSnap
|
2
|
+
class Twitgoo
|
3
|
+
|
4
|
+
include Client
|
5
|
+
|
6
|
+
def url
|
7
|
+
identifier = @url.match(/([^\/]+)$/)[1]
|
8
|
+
"http://twitgoo.com/api/message/info/#{identifier}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def image_url
|
12
|
+
body = response.body_str
|
13
|
+
body.match(/<imageurl>(.+)<\/imageurl>/)[1]
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
data/lib/snip_snap/version.rb
CHANGED
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><rsp status="ok">
|
2
|
+
<username>darthapo</username>
|
3
|
+
<mediaid>2r5hv</mediaid>
|
4
|
+
<mediaurl>http://twitgoo.com/</mediaurl>
|
5
|
+
<imageurl>http://i29.tinypic.com/9sxqpx.png</imageurl>
|
6
|
+
<thumburl>http://i29.tinypic.com/9sxqpx_th.png</thumburl>
|
7
|
+
</rsp>
|
@@ -16,7 +16,7 @@ class ResponseTest < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
should "be able to find the image in a Skitch URL" do
|
18
18
|
client = SnipSnap.from_url('http://skitch.com/reagent/bh4ei/inbox-gmail-29466-messages-130-unread')
|
19
|
-
client.image_url.should
|
19
|
+
client.image_url.should =~ /^http:\/\/img\.skitch\.com\/\d{8}-bw3tnhse6rhn68erk6wpa882ea\.jpg$/
|
20
20
|
end
|
21
21
|
|
22
22
|
should "be able to find an image in a shortened Yfrog URL" do
|
@@ -49,11 +49,26 @@ class ResponseTest < Test::Unit::TestCase
|
|
49
49
|
client.image_url.should == 'http://farm4.static.flickr.com/3449/3212555327_14d2d3f8b0.jpg'
|
50
50
|
end
|
51
51
|
|
52
|
+
should "be able to find an image in an expanded Flickr URL without a trailing slash" do
|
53
|
+
client = SnipSnap.from_url('http://www.flickr.com/photos/sares/3579062921')
|
54
|
+
client.image_url.should == 'http://farm3.static.flickr.com/2439/3579062921_d5da30b0a9.jpg'
|
55
|
+
end
|
56
|
+
|
57
|
+
should "be able to find an image in an expanded Flickr photo's set URL" do
|
58
|
+
client = SnipSnap.from_url('http://www.flickr.com/photos/viget/3852378037/in/set-72157621982815973/')
|
59
|
+
client.image_url.should == 'http://farm3.static.flickr.com/2482/3852378037_11e9e3b14b.jpg'
|
60
|
+
end
|
61
|
+
|
52
62
|
should "be able to find an image in an img.ly URL" do
|
53
63
|
client = SnipSnap.from_url('http://img.ly/3ey')
|
54
64
|
client.image_url.should =~ /http:\/\/img\.ly\/media\/12434\/large_ChillPill13\.jpg/
|
55
65
|
end
|
56
66
|
|
67
|
+
should "be able to find an image in a Twitgoo URL" do
|
68
|
+
client = SnipSnap.from_url('http://twitgoo.com/2r5hv')
|
69
|
+
client.image_url.should == 'http://i29.tinypic.com/9sxqpx.png'
|
70
|
+
end
|
71
|
+
|
57
72
|
should "be able to find an image from a URL with a correct MIME type" do
|
58
73
|
client = SnipSnap.from_url('http://img.ly/media/12434/large_ChillPill13.jpg')
|
59
74
|
client.image_url.should == 'http://img.ly/media/12434/large_ChillPill13.jpg'
|
@@ -14,16 +14,48 @@ module SnipSnap
|
|
14
14
|
f.should be_image
|
15
15
|
end
|
16
16
|
|
17
|
-
should "know the
|
17
|
+
should "know the endpoint URL" do
|
18
18
|
response = stub()
|
19
19
|
response.stubs(:last_effective_url).with().returns(@expanded_url)
|
20
|
-
|
20
|
+
|
21
21
|
f = SnipSnap::Flickr.new(@url)
|
22
22
|
f.stubs(:response).with().returns(response)
|
23
|
+
|
24
|
+
f.endpoint_url.should == @expanded_url
|
25
|
+
end
|
26
|
+
|
27
|
+
should "know the identifier for the basic photo URL" do
|
28
|
+
f = SnipSnap::Flickr.new('')
|
29
|
+
f.stubs(:endpoint_url).with().returns('http://www.flickr.com/photos/northernraven/3317998738/')
|
30
|
+
|
31
|
+
f.identifier.should == '3317998738'
|
32
|
+
end
|
33
|
+
|
34
|
+
should "know the identifier for the basic photo URL without a trailing slash" do
|
35
|
+
f = SnipSnap::Flickr.new('')
|
36
|
+
f.stubs(:endpoint_url).with().returns('http://www.flickr.com/photos/northernraven/3317998738')
|
23
37
|
|
24
38
|
f.identifier.should == '3317998738'
|
25
39
|
end
|
26
40
|
|
41
|
+
should "return nil if it can't find the identifier in the URL" do
|
42
|
+
url = 'http://www.flickr.com/photos/viget'
|
43
|
+
|
44
|
+
f = SnipSnap::Flickr.new('')
|
45
|
+
f.stubs(:endpoint_url).with().returns(url)
|
46
|
+
|
47
|
+
f.identifier.should be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
should "know the identifier for the photo URL as part of a set" do
|
51
|
+
url = 'http://www.flickr.com/photos/viget/3852378037/in/set-72157621982815973/'
|
52
|
+
|
53
|
+
f = SnipSnap::Flickr.new(@url)
|
54
|
+
f.stubs(:endpoint_url).with().returns(url)
|
55
|
+
|
56
|
+
f.identifier.should == '3852378037'
|
57
|
+
end
|
58
|
+
|
27
59
|
should "be able to find the photo for the identifier" do
|
28
60
|
identifier = '3317998738'
|
29
61
|
photo = stub()
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module SnipSnap
|
4
|
+
class TwitgooTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Twitgoo class" do
|
7
|
+
setup do
|
8
|
+
@url = 'http://twitgoo.com/2r5hv'
|
9
|
+
@expanded_url = 'http://twitgoo.com/api/message/info/2r5hv'
|
10
|
+
end
|
11
|
+
|
12
|
+
should "know that it's an image" do
|
13
|
+
t = SnipSnap::Twitgoo.new(@url)
|
14
|
+
t.should be_image
|
15
|
+
end
|
16
|
+
|
17
|
+
should "have a URL derived from the source URL" do
|
18
|
+
t = SnipSnap::Twitgoo.new(@url)
|
19
|
+
t.url.should == @expanded_url
|
20
|
+
end
|
21
|
+
|
22
|
+
should "know the image URL" do
|
23
|
+
response = stub()
|
24
|
+
response.stubs(:body_str).with().returns(read_fixture('twitgoo.xml'))
|
25
|
+
|
26
|
+
t = SnipSnap::Twitgoo.new(@url)
|
27
|
+
t.stubs(:response).with().returns(response)
|
28
|
+
|
29
|
+
t.image_url.should == 'http://i29.tinypic.com/9sxqpx.png'
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
data/test/unit/snip_snap_test.rb
CHANGED
@@ -2,90 +2,56 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
2
2
|
|
3
3
|
class SnipSnapTest < Test::Unit::TestCase
|
4
4
|
|
5
|
-
|
5
|
+
def self.should_know_the_class_name_for(matcher)
|
6
|
+
url = matcher.keys.first
|
7
|
+
class_name = matcher.values.first
|
6
8
|
|
7
|
-
should "know the
|
8
|
-
url
|
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.com URL" do
|
23
|
-
url = 'http://yfrog.com/ahb97j'
|
24
|
-
SnipSnap.class_name_for(url).should == 'Yfrog'
|
25
|
-
end
|
26
|
-
|
27
|
-
should "know the correct class name for a Yfrog.us URL" do
|
28
|
-
url = 'http://yfrog.us/ahb97j'
|
29
|
-
SnipSnap.class_name_for(url).should == 'Yfrog'
|
30
|
-
end
|
31
|
-
|
32
|
-
should "know the correct class name for an expanded Yfrog URL" do
|
33
|
-
url = 'http://img377.yfrog.com/i/b97.jpg/'
|
34
|
-
SnipSnap.class_name_for(url).should == 'Yfrog'
|
35
|
-
end
|
36
|
-
|
37
|
-
should "know the correct class name for a Flickr URL" do
|
38
|
-
url = 'http://flic.kr/p/64cBqN'
|
39
|
-
SnipSnap.class_name_for(url).should == 'Flickr'
|
40
|
-
end
|
41
|
-
|
42
|
-
should "use the default class when it can't match on other URLs" do
|
43
|
-
url = 'http://example.com/image.jpg'
|
44
|
-
SnipSnap.class_name_for(url).should == 'Image'
|
45
|
-
end
|
46
|
-
|
47
|
-
should "be able to create an instance of the Skitch class with the supplied URL" do
|
48
|
-
url = 'http://skitch.com/reagent/bh4ei/bleeergh'
|
49
|
-
SnipSnap::Skitch.expects(:new).with(url).returns('skitch')
|
50
|
-
|
51
|
-
SnipSnap.from_url(url).should == 'skitch'
|
9
|
+
should "know that the class name for #{url} is #{class_name}" do
|
10
|
+
SnipSnap.class_name_for(url).should == class_name
|
52
11
|
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.should_create_an_instance_for(matcher)
|
15
|
+
url = matcher.keys.first
|
16
|
+
class_name = matcher.values.first
|
53
17
|
|
54
|
-
should "be able to create an instance of the
|
55
|
-
|
56
|
-
|
18
|
+
should "be able to create an instance of the #{class_name} class for the url: '#{url}'" do
|
19
|
+
klass = SnipSnap.const_get(class_name)
|
20
|
+
klass.expects(:new).with(url).returns('instance')
|
57
21
|
|
58
|
-
SnipSnap.from_url(url).should == '
|
22
|
+
SnipSnap.from_url(url).should == 'instance'
|
59
23
|
end
|
60
24
|
|
61
|
-
|
62
|
-
url = 'http://twitpic.com/203o0'
|
63
|
-
SnipSnap::Twitpic.expects(:new).with(url).returns('twitpic')
|
64
|
-
|
65
|
-
SnipSnap.from_url(url).should == 'twitpic'
|
66
|
-
end
|
25
|
+
end
|
67
26
|
|
68
|
-
|
69
|
-
url = 'http://yfrog.com/ahb97j'
|
70
|
-
SnipSnap::Yfrog.expects(:new).with(url).returns('yfrog')
|
27
|
+
context "The SnipSnap module" do
|
71
28
|
|
72
|
-
|
73
|
-
|
29
|
+
should_know_the_class_name_for 'http://skitch.com/reagent/bh4ei/bleeergh' => 'Skitch'
|
30
|
+
should_know_the_class_name_for 'http://img.ly/3ey' => 'Imgly'
|
31
|
+
should_know_the_class_name_for 'http://twitpic.com/203o0' => 'Twitpic'
|
32
|
+
should_know_the_class_name_for 'http://yfrog.com/ahb97j' => 'Yfrog'
|
33
|
+
should_know_the_class_name_for 'http://yfrog.us/ahb97j' => 'Yfrog'
|
34
|
+
should_know_the_class_name_for 'http://img377.yfrog.com/i/b97.jpg/' => 'Yfrog'
|
35
|
+
should_know_the_class_name_for 'http://flic.kr/p/64cBqN' => 'Flickr'
|
36
|
+
should_know_the_class_name_for 'http://www.flickr.com/photos/viget/3852378037/' => 'Flickr'
|
37
|
+
should_know_the_class_name_for 'http://twitgoo.com/2r5hv' => 'Twitgoo'
|
38
|
+
should_know_the_class_name_for 'http://example.com/image.jpg' => 'Image'
|
74
39
|
|
75
|
-
|
76
|
-
url = 'http://flic.kr/p/64cBqN'
|
77
|
-
SnipSnap::Flickr.expects(:new).with(url).returns('flickr')
|
40
|
+
should_know_the_class_name_for 'http://www.flickr.com/photos/viget/3852378037/in/set-72157621982815973/' => 'Flickr'
|
78
41
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
42
|
+
should_create_an_instance_for 'http://skitch.com/reagent/bh4ei/bleeergh' => 'Skitch'
|
43
|
+
should_create_an_instance_for 'http://img.ly/3ey' => 'Imgly'
|
44
|
+
should_create_an_instance_for 'http://twitpic.com/203o0' => 'Twitpic'
|
45
|
+
should_create_an_instance_for 'http://yfrog.com/ahb97j' => 'Yfrog'
|
46
|
+
should_create_an_instance_for 'http://yfrog.us/ahb97j' => 'Yfrog'
|
47
|
+
should_create_an_instance_for 'http://img377.yfrog.com/i/b97.jpg/' => 'Yfrog'
|
48
|
+
should_create_an_instance_for 'http://flic.kr/p/64cBqN' => 'Flickr'
|
49
|
+
should_create_an_instance_for 'http://www.flickr.com/photos/viget/3852378037/' => 'Flickr'
|
50
|
+
should_create_an_instance_for 'http://twitgoo.com/2r5hv' => 'Twitgoo'
|
51
|
+
should_create_an_instance_for 'http://example.com/image.jpg' => 'Image'
|
52
|
+
|
53
|
+
should_create_an_instance_for 'http://www.flickr.com/photos/viget/3852378037/in/set-72157621982815973/' => 'Flickr'
|
85
54
|
|
86
|
-
SnipSnap.from_url(url).should == 'image'
|
87
|
-
end
|
88
|
-
|
89
55
|
should "be able to set the Flickr API key" do
|
90
56
|
key = 'abc123'
|
91
57
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snip-snap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Reagan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-15 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -48,13 +48,14 @@ files:
|
|
48
48
|
- lib/snip_snap/image.rb
|
49
49
|
- lib/snip_snap/imgly.rb
|
50
50
|
- lib/snip_snap/skitch.rb
|
51
|
+
- lib/snip_snap/twitgoo.rb
|
51
52
|
- lib/snip_snap/twitpic.rb
|
52
53
|
- lib/snip_snap/version.rb
|
53
54
|
- lib/snip_snap/yfrog.rb
|
54
55
|
- lib/snip_snap.rb
|
55
56
|
- test/fixtures/skitch.html
|
57
|
+
- test/fixtures/twitgoo.xml
|
56
58
|
- test/fixtures/yfrog.html
|
57
|
-
- test/flickr_api_key
|
58
59
|
- test/flickr_api_key.example
|
59
60
|
- test/integration/response_test.rb
|
60
61
|
- test/test_helper.rb
|
@@ -63,6 +64,7 @@ files:
|
|
63
64
|
- test/unit/snip_snap/image_test.rb
|
64
65
|
- test/unit/snip_snap/imgly_test.rb
|
65
66
|
- test/unit/snip_snap/skitch_test.rb
|
67
|
+
- test/unit/snip_snap/twitgoo_test.rb
|
66
68
|
- test/unit/snip_snap/twitpic_test.rb
|
67
69
|
- test/unit/snip_snap/yfrog_test.rb
|
68
70
|
- test/unit/snip_snap_test.rb
|
data/test/flickr_api_key
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
4e9e84830598c4e546e11a6746a58545
|