shorty 0.1.1 → 0.1.2
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/.gitignore +1 -0
- data/README.rdoc +2 -2
- data/VERSION +1 -1
- data/lib/shorty.rb +11 -2
- data/lib/shorty/bitly.rb +27 -19
- data/lib/shorty/cligs.rb +1 -1
- data/lib/shorty/isgd.rb +5 -7
- data/lib/shorty/supr.rb +33 -38
- data/lib/shorty/tinyurl.rb +4 -6
- data/lib/shorty/to_openstruct.rb +19 -0
- data/lib/shorty/trim.rb +10 -3
- data/shorty.gemspec +6 -4
- data/test/supr_test.rb +4 -0
- metadata +3 -2
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -11,7 +11,7 @@ shorty makes interfacing with url shortening services easy, so far the following
|
|
11
11
|
|
12
12
|
== Install
|
13
13
|
|
14
|
-
sudo gem install
|
14
|
+
sudo gem install shorty
|
15
15
|
|
16
16
|
== Usage
|
17
17
|
|
@@ -21,7 +21,7 @@ Yeah just read the rdocs. But to get started, make sure the gem is installed. Re
|
|
21
21
|
|
22
22
|
or with Rails:
|
23
23
|
|
24
|
-
config.gem '
|
24
|
+
config.gem 'shorty'
|
25
25
|
|
26
26
|
== Possible Additions
|
27
27
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/lib/shorty.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
require 'crack'
|
3
|
+
require 'ostruct'
|
3
4
|
|
4
5
|
module Shorty
|
5
|
-
class
|
6
|
-
|
6
|
+
class SimpleAPI
|
7
|
+
|
8
|
+
def shorten(url)
|
9
|
+
self.class.get(self.class::API_URL, :query => self.class.prep_query(url))
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.shorten(url)
|
13
|
+
get(self::API_URL, :query => self.prep_query(url))
|
14
|
+
end
|
7
15
|
end
|
8
16
|
|
17
|
+
require File.dirname(__FILE__) + '/shorty/to_openstruct'
|
9
18
|
require File.dirname(__FILE__) + '/shorty/trim'
|
10
19
|
require File.dirname(__FILE__) + '/shorty/bitly'
|
11
20
|
require File.dirname(__FILE__) + '/shorty/tinyurl'
|
data/lib/shorty/bitly.rb
CHANGED
@@ -32,21 +32,19 @@ module Shorty
|
|
32
32
|
def shorten( longurl )
|
33
33
|
query = {:longUrl => longurl}
|
34
34
|
query.merge!(@options)
|
35
|
-
short = self.class.get('/shorten', :query => query)
|
36
|
-
short
|
37
|
-
short["errorCode"].zero? ? short["results"][longurl]["shortUrl"] : raise_error(short["errorCode"], short["errorMessage"])
|
35
|
+
short = Crack::JSON.parse(self.class.get('/shorten', :query => query))
|
36
|
+
short["errorCode"].zero? ? short["results"][longurl]["shortUrl"] : raise_error(short)
|
38
37
|
end
|
39
38
|
|
40
39
|
# expand- given a bit.ly url, returns long source url, takes:
|
41
40
|
#
|
42
41
|
# - shorturl: the bit.ly url, can either be the full url or missing http://bit.ly
|
43
42
|
def expand(shorturl)
|
44
|
-
|
45
|
-
query = {:hash =>
|
43
|
+
hash = gsub_url(shorturl)
|
44
|
+
query = {:hash => hash}
|
46
45
|
query.merge!(@options)
|
47
|
-
expand = self.class.get('/expand', :query => query)
|
48
|
-
expand
|
49
|
-
expand["errorCode"].zero? ? expand["results"][shorturl]["longUrl"] : raise_error(expand["errorCode"], expand["errorMessage"])
|
46
|
+
expand = Crack::JSON.parse(self.class.get('/expand', :query => query))
|
47
|
+
expand["errorCode"].zero? ? expand["results"][hash]["longUrl"] : raise_error(expand)
|
50
48
|
end
|
51
49
|
|
52
50
|
# info - Given a bit.ly url or hash, return information about that page, such as the long source url, ...
|
@@ -58,9 +56,8 @@ module Shorty
|
|
58
56
|
query = {:hash => urlhash}
|
59
57
|
end
|
60
58
|
query.merge!(@options)
|
61
|
-
stats = self.class.get('/info', :query => query)
|
62
|
-
stats
|
63
|
-
stats["errorCode"].zero? ? stats["results"][urlhash] : raise_error(stats["errorCode"], stats["errorMessage"])
|
59
|
+
stats = Crack::JSON.parse(self.class.get('/info', :query => query))
|
60
|
+
stats["errorCode"].zero? ? stats["results"][urlhash] : raise_error(stats)
|
64
61
|
end
|
65
62
|
|
66
63
|
# stats - get stats on clicks and reffers, pass either:
|
@@ -70,17 +67,16 @@ module Shorty
|
|
70
67
|
#
|
71
68
|
# Example:
|
72
69
|
# bitly = Shorty::Bitly.new('login', 'apikey')
|
73
|
-
# bitly.
|
70
|
+
# bitly.stats('1RmnUT')
|
74
71
|
# Or:
|
75
72
|
# bitly = Shorty::Bitly.new('login', 'apikey')
|
76
|
-
# bitly.
|
73
|
+
# bitly.stats('http://bit.ly/1RmnUT')
|
77
74
|
def stats(urlorhash)
|
78
75
|
urlhash = gsub_url(urlorhash)
|
79
76
|
query = {:hash => urlhash}
|
80
77
|
query.merge!(@options)
|
81
|
-
stats = self.class.get('/stats', :query => query)
|
82
|
-
stats
|
83
|
-
stats["errorCode"].zero? ? stats["results"] : raise_error(stats["errorCode"], stats["errorMessage"])
|
78
|
+
stats = Crack::JSON.parse(self.class.get('/stats', :query => query))
|
79
|
+
stats["errorCode"].zero? ? stats["results"] : raise_error(stats)
|
84
80
|
end
|
85
81
|
|
86
82
|
|
@@ -88,14 +84,26 @@ module Shorty
|
|
88
84
|
|
89
85
|
def gsub_url(shorturl)
|
90
86
|
shorturl.split('/').last
|
91
|
-
# shorturl = shorturl.gsub(/http:\/\//, '') if shorturl.include?('http://')
|
92
|
-
# shorturl = shorturl.gsub(/bit.ly\//, '') if shorturl.include?('bit.ly/')
|
93
87
|
end
|
94
88
|
|
95
|
-
def raise_error(
|
89
|
+
def raise_error(hash)
|
90
|
+
code = hash["errorCode"]
|
91
|
+
message = hash["errorMessage"] || '(no error message)'
|
96
92
|
error = message + " (error code: #{code})"
|
97
93
|
raise Shorty::Bitly::Error, error
|
98
94
|
end
|
99
95
|
|
96
|
+
# We need to work on how to handle this and working with openstruct
|
97
|
+
# def handle_response(resp, url)
|
98
|
+
# r = {
|
99
|
+
# "error" => {
|
100
|
+
# "code" => resp["errorCode"],
|
101
|
+
# "message" => resp["errorMessage"]
|
102
|
+
# },
|
103
|
+
# "hash" => resp["results"][url]["hash"]
|
104
|
+
# }
|
105
|
+
# resp.to_openstruct
|
106
|
+
# end
|
107
|
+
|
100
108
|
end
|
101
109
|
end
|
data/lib/shorty/cligs.rb
CHANGED
data/lib/shorty/isgd.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
module Shorty
|
2
2
|
# is.gd API as defined http://is.gd/api_info.php
|
3
|
-
class Isgd
|
3
|
+
class Isgd < SimpleAPI
|
4
4
|
include HTTParty
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def self.shorten(url)
|
11
|
-
get('http://is.gd/api.php', :query => {:longurl => url})
|
6
|
+
API_URL = 'http://is.gd/api.php'
|
7
|
+
|
8
|
+
def self.prep_query(url)
|
9
|
+
{:longurl => url}
|
12
10
|
end
|
13
11
|
end
|
14
12
|
end
|
data/lib/shorty/supr.rb
CHANGED
@@ -29,71 +29,66 @@ module Shorty
|
|
29
29
|
# - url: The long URL you wish to shorten
|
30
30
|
# Will return the full url unless you pass false for the second parameter, then it only returns the hash
|
31
31
|
def shorten(url, full = true)
|
32
|
-
|
33
|
-
query.merge!(@options)
|
34
|
-
short = self.class.get('/shorten', :query => query)
|
35
|
-
short = Crack::JSON.parse(short)
|
36
|
-
if full
|
37
|
-
short["errorCode"].zero? ? short["results"][url]["shortUrl"] : raise_error(short["errorCode"], short["errorMessage"])
|
38
|
-
else
|
39
|
-
short["errorCode"].zero? ? short["results"][url]["hash"] : raise_error(short["errorCode"], short["errorMessage"])
|
40
|
-
end
|
32
|
+
self.class.get_and_parse_shorten(url, full)
|
41
33
|
end
|
42
34
|
|
43
35
|
# self.shorten. see shorten
|
44
36
|
def self.shorten(url, full = true)
|
45
|
-
|
46
|
-
query.merge!(@options) if @options
|
47
|
-
short = get('/shorten', :query => query)
|
48
|
-
short = Crack::JSON.parse(short)
|
49
|
-
if full
|
50
|
-
short["errorCode"].zero? ? short["results"][url]["shortUrl"] : raise_error(short["errorCode"], short["errorMessage"])
|
51
|
-
else
|
52
|
-
short["errorCode"].zero? ? short["results"][url]["hash"] : raise_error(short["errorCode"], short["errorMessage"])
|
53
|
-
end
|
37
|
+
get_and_parse_shorten(url, full)
|
54
38
|
end
|
55
39
|
|
56
40
|
# expand. pass either:
|
57
41
|
# - shortUrl: he Su.pr URL you wish to expand
|
58
42
|
# - hash: The six character hash you wish to expand
|
59
43
|
def expand(urlorhash)
|
60
|
-
|
61
|
-
query = {:hash => hash}
|
62
|
-
query.merge!(@options)
|
63
|
-
expand = self.class.get('/expand', :query => query)
|
64
|
-
expand = Crack::JSON.parse(expand)
|
65
|
-
expand["errorCode"].zero? ? expand["results"][hash]["longUrl"] : raise_error(expand["errorCode"], expand["errorMessage"])
|
44
|
+
self.class.get_and_parse_expand(urlorhash)
|
66
45
|
end
|
67
46
|
|
68
47
|
# self.expand. see expand
|
69
48
|
def self.expand(urlorhash)
|
70
|
-
|
71
|
-
query = {:hash => hash}
|
72
|
-
query.merge!(@options) if @options
|
73
|
-
expand = get('/expand', :query => query)
|
74
|
-
expand = Crack::JSON.parse(expand)
|
75
|
-
expand["errorCode"].zero? ? expand["results"][hash]["longUrl"] : raise_error(expand["errorCode"], expand["errorMessage"])
|
49
|
+
get_and_parse_expand(urlorhash)
|
76
50
|
end
|
77
51
|
|
78
52
|
|
79
53
|
protected
|
80
54
|
|
81
|
-
def gsub_url(shorturl)
|
82
|
-
shorturl.split('/').last
|
83
|
-
end
|
84
|
-
|
85
55
|
def self.gsub_url(shorturl)
|
86
56
|
shorturl.split('/').last
|
87
57
|
end
|
88
58
|
|
89
|
-
def raise_error(
|
59
|
+
def self.raise_error(hash)
|
60
|
+
code = hash["errorCode"]
|
61
|
+
message = hash["errorMessage"] || '(no error message)'
|
90
62
|
error = message + " (error code: #{code})"
|
91
63
|
raise Shorty::Supr::Error, error
|
92
64
|
end
|
93
65
|
|
94
|
-
def self.
|
95
|
-
|
96
|
-
|
66
|
+
def self.handle_full_or_hash_option(short, url, full)
|
67
|
+
short["errorCode"].zero? ? (full ? short["results"][url]["shortUrl"] : short["results"][url]["hash"]) : self.raise_error(short)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.prep_shorten_request(url)
|
71
|
+
query = {:longUrl => url}
|
72
|
+
query.merge!(@options) if @options
|
73
|
+
query
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.prep_expand_request(urlorhash)
|
77
|
+
hash = self.gsub_url(urlorhash)
|
78
|
+
query = {:hash => hash}
|
79
|
+
query.merge!(@options) if @options
|
80
|
+
[query, hash]
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.get_and_parse_shorten(url, full)
|
84
|
+
short = Crack::JSON.parse(get('/shorten', :query => prep_shorten_request(url)))
|
85
|
+
handle_full_or_hash_option(short, url, full)
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.get_and_parse_expand(urlorhash)
|
89
|
+
query, hash = prep_expand_request(urlorhash)
|
90
|
+
expand = Crack::JSON.parse(get('/expand', :query => query))
|
91
|
+
expand["errorCode"].zero? ? expand["results"][hash]["longUrl"] : raise_error(expand)
|
97
92
|
end
|
98
93
|
|
99
94
|
end
|
data/lib/shorty/tinyurl.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
module Shorty
|
2
2
|
# The tinyurl.com API. Not much here, undocumented API
|
3
|
-
class Tinyurl
|
3
|
+
class Tinyurl < SimpleAPI
|
4
4
|
include HTTParty
|
5
5
|
|
6
|
-
|
7
|
-
self.class.get('http://tinyurl.com/api-create.php', :query => {:url => url})
|
8
|
-
end
|
6
|
+
API_URL = 'http://tinyurl.com/api-create.php'
|
9
7
|
|
10
|
-
def self.
|
11
|
-
|
8
|
+
def self.prep_query(url)
|
9
|
+
{:url => url}
|
12
10
|
end
|
13
11
|
end
|
14
12
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Object
|
2
|
+
def to_openstruct
|
3
|
+
self
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Array
|
8
|
+
def to_openstruct
|
9
|
+
map{ |el| el.to_openstruct }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Hash
|
14
|
+
def to_openstruct
|
15
|
+
mapped = {}
|
16
|
+
each{ |key,value| mapped[key] = value.to_openstruct }
|
17
|
+
OpenStruct.new(mapped)
|
18
|
+
end
|
19
|
+
end
|
data/lib/shorty/trim.rb
CHANGED
@@ -67,9 +67,8 @@ module Shorty
|
|
67
67
|
def trim_url( options = {} )
|
68
68
|
options.merge!(@options)
|
69
69
|
response = self.class.get( '/trim_url.xml', :query => options )
|
70
|
-
response = Crack::XML.parse(response)
|
71
|
-
|
72
|
-
return response['trim']['url']
|
70
|
+
response = handle_response(Crack::XML.parse(response))
|
71
|
+
return response.url
|
73
72
|
end
|
74
73
|
|
75
74
|
TRIM_ERRORS = {
|
@@ -104,6 +103,14 @@ module Shorty
|
|
104
103
|
# raise Shorty::Trim::APIError.new(TRIM_ERRORS[code])
|
105
104
|
raise TRIM_ERRORS[code], message
|
106
105
|
end
|
106
|
+
|
107
|
+
# Process the response
|
108
|
+
def handle_response(resp)
|
109
|
+
response = resp['trim'].to_openstruct
|
110
|
+
raise_error(response.status.code, response.status.message) if response.status.code >= '205'
|
111
|
+
response
|
112
|
+
end
|
113
|
+
|
107
114
|
end
|
108
115
|
end
|
109
116
|
|
data/shorty.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{shorty}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex Coomans"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-11-23}
|
13
13
|
s.description = %q{Makes it easy to shorten URLs}
|
14
14
|
s.email = %q{alex@alexcoomans.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
"lib/shorty/isgd.rb",
|
36
36
|
"lib/shorty/supr.rb",
|
37
37
|
"lib/shorty/tinyurl.rb",
|
38
|
+
"lib/shorty/to_openstruct.rb",
|
38
39
|
"lib/shorty/trim.rb",
|
39
40
|
"lib/shorty/twurl.rb",
|
40
41
|
"shorty.gemspec",
|
@@ -93,3 +94,4 @@ Gem::Specification.new do |s|
|
|
93
94
|
s.add_dependency(%q<crack>, [">= 0.1.4"])
|
94
95
|
end
|
95
96
|
end
|
97
|
+
|
data/test/supr_test.rb
CHANGED
@@ -49,6 +49,10 @@ class SuprTest < Test::Unit::TestCase
|
|
49
49
|
should "return a shortened url" do
|
50
50
|
assert_equal 'http://su.pr/2yw2PP', Shorty::Supr.shorten('http://cnn.com')
|
51
51
|
end
|
52
|
+
|
53
|
+
should "return a shortened hash" do
|
54
|
+
assert_equal '2yw2PP', Shorty::Supr.shorten('http://cnn.com', false)
|
55
|
+
end
|
52
56
|
|
53
57
|
should "return an expanded url when passed a hash" do
|
54
58
|
assert_equal 'http://cnn.com/', Shorty::Supr.expand('2yw2PP')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shorty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Coomans
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-23 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- lib/shorty/isgd.rb
|
61
61
|
- lib/shorty/supr.rb
|
62
62
|
- lib/shorty/tinyurl.rb
|
63
|
+
- lib/shorty/to_openstruct.rb
|
63
64
|
- lib/shorty/trim.rb
|
64
65
|
- lib/shorty/twurl.rb
|
65
66
|
- shorty.gemspec
|