snip-snap 0.1.0 → 0.1.1
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 +3 -3
- data/Rakefile +1 -0
- data/lib/snip_snap.rb +12 -3
- data/lib/snip_snap/client.rb +13 -16
- data/lib/snip_snap/flickr.rb +22 -0
- data/lib/snip_snap/version.rb +1 -1
- data/test/unit/snip_snap/client_test.rb +47 -46
- data/test/unit/snip_snap/flickr_test.rb +49 -0
- data/test/unit/snip_snap/imgly_test.rb +0 -9
- data/test/unit/snip_snap/skitch_test.rb +0 -9
- data/test/unit/snip_snap/twitpic_test.rb +0 -9
- data/test/unit/snip_snap/yfrog_test.rb +0 -9
- data/test/unit/snip_snap_test.rb +25 -5
- metadata +14 -2
data/README.rdoc
CHANGED
@@ -5,18 +5,18 @@
|
|
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, and Yfrog - others are coming.
|
8
|
+
Skitch, Twitpic, Flickr, and Yfrog - others are coming.
|
9
9
|
|
10
10
|
== Installation
|
11
11
|
|
12
|
-
sudo gem install snip-snap
|
12
|
+
sudo gem install snip-snap --source=http://gemcutter.org
|
13
13
|
|
14
14
|
== Usage
|
15
15
|
|
16
16
|
require 'rubygems
|
17
17
|
require 'snip_snap'
|
18
18
|
|
19
|
-
client = SnipSnap.
|
19
|
+
client = SnipSnap.from_url('http://yfrog.com/7hb9lj')
|
20
20
|
puts client.image_url
|
21
21
|
|
22
22
|
== License
|
data/Rakefile
CHANGED
data/lib/snip_snap.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__)
|
2
2
|
|
3
3
|
require 'curb'
|
4
|
+
require 'fleakr'
|
4
5
|
require 'uri'
|
5
6
|
|
6
7
|
require 'snip_snap/client'
|
@@ -9,6 +10,7 @@ require 'snip_snap/skitch'
|
|
9
10
|
require 'snip_snap/imgly'
|
10
11
|
require 'snip_snap/yfrog'
|
11
12
|
require 'snip_snap/twitpic'
|
13
|
+
require 'snip_snap/flickr'
|
12
14
|
|
13
15
|
# = SnipSnap
|
14
16
|
#
|
@@ -19,13 +21,14 @@ require 'snip_snap/twitpic'
|
|
19
21
|
# * Skitch
|
20
22
|
# * Twitpic
|
21
23
|
# * Yfrog
|
24
|
+
# * Flickr
|
22
25
|
#
|
23
26
|
# To use, just point it at a URL:
|
24
27
|
#
|
25
28
|
# require 'rubygems'
|
26
29
|
# require 'snip_snap'
|
27
30
|
#
|
28
|
-
# client = SnipSnap.
|
31
|
+
# client = SnipSnap.from_url('http://yfrog.com/7hb9lj')
|
29
32
|
# puts client.image_url
|
30
33
|
#
|
31
34
|
# That's it.
|
@@ -37,12 +40,13 @@ module SnipSnap
|
|
37
40
|
'skitch.com' => 'Skitch',
|
38
41
|
'img.ly' => 'Imgly',
|
39
42
|
'twitpic.com' => 'Twitpic',
|
40
|
-
'yfrog.com' => 'Yfrog'
|
43
|
+
'yfrog.com' => 'Yfrog',
|
44
|
+
'flic.kr' => 'Flickr'
|
41
45
|
}
|
42
46
|
end
|
43
47
|
|
44
48
|
# Use the correct class to handle image extraction for a given URL
|
45
|
-
def self.
|
49
|
+
def self.from_url(url)
|
46
50
|
const_get(class_name_for(url)).new(url)
|
47
51
|
end
|
48
52
|
|
@@ -51,4 +55,9 @@ module SnipSnap
|
|
51
55
|
host_map[uri.host]
|
52
56
|
end
|
53
57
|
|
58
|
+
# Set the Flickr API key for use by the underlying Flickr API library
|
59
|
+
def self.flickr_api_key=(key)
|
60
|
+
Fleakr.api_key = key
|
61
|
+
end
|
62
|
+
|
54
63
|
end
|
data/lib/snip_snap/client.rb
CHANGED
@@ -9,35 +9,32 @@ module SnipSnap
|
|
9
9
|
@url = url
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
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)
|
12
|
+
def fetch
|
21
13
|
client = Curl::Easy.new(url) do |config|
|
22
14
|
config.follow_location = true
|
23
|
-
config.max_redirects
|
15
|
+
config.max_redirects = 5
|
16
|
+
config.head = self.class.head?
|
24
17
|
end
|
25
18
|
|
26
|
-
|
19
|
+
client.perform
|
27
20
|
|
28
21
|
client
|
29
22
|
end
|
23
|
+
|
24
|
+
def response
|
25
|
+
@response ||= fetch
|
26
|
+
end
|
30
27
|
|
31
28
|
end
|
32
29
|
|
33
30
|
module ClassMethods
|
34
31
|
|
35
32
|
def request_method(method_name)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
@request_method = method_name
|
34
|
+
end
|
35
|
+
|
36
|
+
def head?
|
37
|
+
@request_method == :head
|
41
38
|
end
|
42
39
|
|
43
40
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SnipSnap
|
2
|
+
class Flickr
|
3
|
+
|
4
|
+
include Client
|
5
|
+
|
6
|
+
request_method :head
|
7
|
+
|
8
|
+
def identifier
|
9
|
+
url = response.last_effective_url
|
10
|
+
url.match(/([^\/]+)\/$/)[1]
|
11
|
+
end
|
12
|
+
|
13
|
+
def photo
|
14
|
+
Fleakr::Objects::Photo.find_by_id(identifier)
|
15
|
+
end
|
16
|
+
|
17
|
+
def image_url
|
18
|
+
photo.medium.url
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
data/lib/snip_snap/version.rb
CHANGED
@@ -19,84 +19,85 @@ module SnipSnap
|
|
19
19
|
|
20
20
|
context "An instance of the ClientImplementation class" do
|
21
21
|
|
22
|
-
should "be able to
|
23
|
-
|
22
|
+
should "be able to fetch a response" do
|
23
|
+
response = stub()
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
end
|
25
|
+
c = ClientImplementation.new('http://example.com')
|
26
|
+
c.expects(:fetch).once.with().returns(response)
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
c.response.should == response
|
29
|
+
end
|
30
|
+
|
31
|
+
should "cache the response object" do
|
32
|
+
response = stub()
|
33
33
|
|
34
|
-
|
34
|
+
c = ClientImplementation.new('http://example.com')
|
35
|
+
c.expects(:fetch).once.with().returns(response)
|
35
36
|
|
36
|
-
|
37
|
-
c.get.should == client
|
37
|
+
2.times { c.response }
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
end
|
41
|
+
|
42
|
+
context "The ClientGetImplementation class" do
|
43
|
+
|
44
|
+
should "know that it doesn't make a head request" do
|
45
|
+
ClientGetImplementation.head?.should be(false)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
context "An instance of the ClientGetImplementation class" do
|
51
|
+
|
52
|
+
should "fetch a response using a GET request" do
|
41
53
|
url = 'http://example.com'
|
42
54
|
|
43
55
|
client = mock() do |c|
|
44
|
-
c.expects(:
|
56
|
+
c.expects(:perform).with()
|
45
57
|
end
|
46
58
|
|
47
59
|
config = mock() do |c|
|
48
60
|
c.expects(:follow_location=).with(true)
|
49
61
|
c.expects(:max_redirects=).with(5)
|
62
|
+
c.expects(:head=).with(false)
|
50
63
|
end
|
51
64
|
|
52
65
|
Curl::Easy.expects(:new).with(url).yields(config).returns(client)
|
53
66
|
|
54
|
-
c =
|
55
|
-
c.
|
67
|
+
c = ClientGetImplementation.new(url)
|
68
|
+
c.fetch.should == client
|
56
69
|
end
|
57
70
|
|
58
71
|
end
|
59
72
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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 }
|
73
|
+
|
74
|
+
context "The ClientHeadImplementation class" do
|
75
|
+
|
76
|
+
should "know that it doesn't makes a head request" do
|
77
|
+
ClientHeadImplementation.head?.should be(true)
|
78
78
|
end
|
79
79
|
|
80
80
|
end
|
81
81
|
|
82
82
|
context "An instance of the ClientHeadImplementation class" do
|
83
83
|
|
84
|
-
should "fetch a response using a
|
85
|
-
|
84
|
+
should "fetch a response using a HEAD request" do
|
85
|
+
url = 'http://example.com'
|
86
86
|
|
87
|
-
|
88
|
-
|
87
|
+
client = mock() do |c|
|
88
|
+
c.expects(:perform).with()
|
89
|
+
end
|
89
90
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
91
|
+
config = mock() do |c|
|
92
|
+
c.expects(:follow_location=).with(true)
|
93
|
+
c.expects(:max_redirects=).with(5)
|
94
|
+
c.expects(:head=).with(true)
|
95
|
+
end
|
95
96
|
|
96
|
-
|
97
|
-
c.expects(:head).once.with().returns(response)
|
97
|
+
Curl::Easy.expects(:new).with(url).yields(config).returns(client)
|
98
98
|
|
99
|
-
|
99
|
+
c = ClientHeadImplementation.new(url)
|
100
|
+
c.fetch.should == client
|
100
101
|
end
|
101
102
|
|
102
103
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module SnipSnap
|
4
|
+
class FlickrTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "An instance of the Flickr class" do
|
7
|
+
setup do
|
8
|
+
@url = 'http://flic.kr/p/64cBqN'
|
9
|
+
@expanded_url = 'http://www.flickr.com/photos/northernraven/3317998738/'
|
10
|
+
end
|
11
|
+
|
12
|
+
should "know the identifier for the photo" do
|
13
|
+
response = stub()
|
14
|
+
response.stubs(:last_effective_url).with().returns(@expanded_url)
|
15
|
+
|
16
|
+
f = SnipSnap::Flickr.new(@url)
|
17
|
+
f.stubs(:response).with().returns(response)
|
18
|
+
|
19
|
+
f.identifier.should == '3317998738'
|
20
|
+
end
|
21
|
+
|
22
|
+
should "be able to find the photo for the identifier" do
|
23
|
+
identifier = '3317998738'
|
24
|
+
photo = stub()
|
25
|
+
|
26
|
+
Fleakr::Objects::Photo.expects(:find_by_id).with(identifier).returns(photo)
|
27
|
+
|
28
|
+
f = SnipSnap::Flickr.new(@url)
|
29
|
+
f.stubs(:identifier).with().returns(identifier)
|
30
|
+
|
31
|
+
f.photo.should == photo
|
32
|
+
end
|
33
|
+
|
34
|
+
should "know the image url" do
|
35
|
+
url = 'http://farm.flickr.com/photo.jpg'
|
36
|
+
|
37
|
+
photo = stub()
|
38
|
+
photo.stubs(:medium).with().returns(stub(:url => url))
|
39
|
+
|
40
|
+
f = SnipSnap::Flickr.new(@url)
|
41
|
+
f.stubs(:photo).with().returns(photo)
|
42
|
+
|
43
|
+
f.image_url.should == url
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -14,15 +14,6 @@ module SnipSnap
|
|
14
14
|
i.url.should == @expanded_url
|
15
15
|
end
|
16
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
17
|
should "be able to return an image url for a given url" do
|
27
18
|
response = stub()
|
28
19
|
response.stubs(:last_effective_url).with().returns(@expanded_url)
|
@@ -11,15 +11,6 @@ module SnipSnap
|
|
11
11
|
s.url.should == @url
|
12
12
|
end
|
13
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
14
|
should "be able to return an image url for a given url" do
|
24
15
|
s = SnipSnap::Skitch.new(@url)
|
25
16
|
|
@@ -14,15 +14,6 @@ module SnipSnap
|
|
14
14
|
t.url.should == @expanded_url
|
15
15
|
end
|
16
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
17
|
should "be able to return an image url for a given url" do
|
27
18
|
response = stub()
|
28
19
|
response.stubs(:last_effective_url).with().returns(@expanded_url)
|
@@ -14,15 +14,6 @@ module SnipSnap
|
|
14
14
|
y.url.should == @expanded_url
|
15
15
|
end
|
16
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
17
|
should "be able to return an image url for a given url" do
|
27
18
|
y = SnipSnap::Yfrog.new(@url)
|
28
19
|
|
data/test/unit/snip_snap_test.rb
CHANGED
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
2
2
|
|
3
3
|
class SnipSnapTest < Test::Unit::TestCase
|
4
4
|
|
5
|
-
|
5
|
+
context "The SnipSnap module" do
|
6
6
|
|
7
7
|
should "know the correct class name for a Skitch URL" do
|
8
8
|
url = 'http://skitch.com/reagent/bh4ei/bleeergh'
|
@@ -24,32 +24,52 @@ class SnipSnapTest < Test::Unit::TestCase
|
|
24
24
|
SnipSnap.class_name_for(url).should == 'Yfrog'
|
25
25
|
end
|
26
26
|
|
27
|
+
should "know the correct class name for a Flickr URL" do
|
28
|
+
url = 'http://flic.kr/p/64cBqN'
|
29
|
+
SnipSnap.class_name_for(url).should == 'Flickr'
|
30
|
+
end
|
31
|
+
|
27
32
|
should "be able to create an instance of the Skitch class with the supplied URL" do
|
28
33
|
url = 'http://skitch.com/reagent/bh4ei/bleeergh'
|
29
34
|
SnipSnap::Skitch.expects(:new).with(url).returns('skitch')
|
30
35
|
|
31
|
-
SnipSnap.
|
36
|
+
SnipSnap.from_url(url).should == 'skitch'
|
32
37
|
end
|
33
38
|
|
34
39
|
should "be able to create an instance of the Imgly class with the supplied URL" do
|
35
40
|
url = 'http://img.ly/3ey'
|
36
41
|
SnipSnap::Imgly.expects(:new).with(url).returns('imgly')
|
37
42
|
|
38
|
-
SnipSnap.
|
43
|
+
SnipSnap.from_url(url).should == 'imgly'
|
39
44
|
end
|
40
45
|
|
41
46
|
should "be able to create an instance of the Twitpic class with the supplied URL" do
|
42
47
|
url = 'http://twitpic.com/203o0'
|
43
48
|
SnipSnap::Twitpic.expects(:new).with(url).returns('twitpic')
|
44
49
|
|
45
|
-
SnipSnap.
|
50
|
+
SnipSnap.from_url(url).should == 'twitpic'
|
46
51
|
end
|
47
52
|
|
48
53
|
should "be able to create an instance of the Yfrog class with the supplied URL" do
|
49
54
|
url = 'http://yfrog.com/ahb97j'
|
50
55
|
SnipSnap::Yfrog.expects(:new).with(url).returns('yfrog')
|
51
56
|
|
52
|
-
SnipSnap.
|
57
|
+
SnipSnap.from_url(url).should == 'yfrog'
|
58
|
+
end
|
59
|
+
|
60
|
+
should "be able to create an instance of the Flickr class with the supplied URL" do
|
61
|
+
url = 'http://flic.kr/p/64cBqN'
|
62
|
+
SnipSnap::Flickr.expects(:new).with(url).returns('flickr')
|
63
|
+
|
64
|
+
SnipSnap.from_url(url).should == 'flickr'
|
65
|
+
end
|
66
|
+
|
67
|
+
should "be able to set the Flickr API key" do
|
68
|
+
key = 'abc123'
|
69
|
+
|
70
|
+
Fleakr.expects(:api_key=).with(key)
|
71
|
+
|
72
|
+
SnipSnap.flickr_api_key = key
|
53
73
|
end
|
54
74
|
|
55
75
|
end
|
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.1
|
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-09-
|
12
|
+
date: 2009-09-06 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,6 +22,16 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 0.5.1.0
|
24
24
|
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: fleakr
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.5.1
|
34
|
+
version:
|
25
35
|
description:
|
26
36
|
email: reaganpr@gmail.com
|
27
37
|
executables: []
|
@@ -34,6 +44,7 @@ files:
|
|
34
44
|
- README.rdoc
|
35
45
|
- Rakefile
|
36
46
|
- lib/snip_snap/client.rb
|
47
|
+
- lib/snip_snap/flickr.rb
|
37
48
|
- lib/snip_snap/imgly.rb
|
38
49
|
- lib/snip_snap/skitch.rb
|
39
50
|
- lib/snip_snap/twitpic.rb
|
@@ -44,6 +55,7 @@ files:
|
|
44
55
|
- test/fixtures/yfrog.xml
|
45
56
|
- test/test_helper.rb
|
46
57
|
- test/unit/snip_snap/client_test.rb
|
58
|
+
- test/unit/snip_snap/flickr_test.rb
|
47
59
|
- test/unit/snip_snap/imgly_test.rb
|
48
60
|
- test/unit/snip_snap/skitch_test.rb
|
49
61
|
- test/unit/snip_snap/twitpic_test.rb
|