em-shorturl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/em-shorturl/google.rb +111 -0
- data/lib/em-shorturl/version.rb +5 -0
- data/lib/em-shorturl.rb +19 -0
- data/test/test_google.rb +35 -0
- data/test/test_shorturl.rb +14 -0
- metadata +65 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 67a5cd1bf46ff96a3c6a00d651b954229f11e7b2
|
4
|
+
data.tar.gz: 778cb1c98b3a1aad091abc7a5eae7db018c6c387
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 86bc8edf6aa87d139397e3c0f1369d44590e63f958a525f147f59afde00e858cedb2eda16e59e8b3eb492156a16fed2046c47c6d93e53139288ee922785a1856
|
7
|
+
data.tar.gz: 4a9d75b5909ae617b607afdadc5390c9ccc2765777f4ed3c91315be05431aabf5cff944e2ebac6c85abc45497ff7d179ff11ca3ca93abc24383b59f4ca5a3c3b
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'em-http-request'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module EventMachine
|
5
|
+
module ShortURL
|
6
|
+
|
7
|
+
##
|
8
|
+
# The Google class is the driver for URLShortener to use Google's API
|
9
|
+
# for URL shortening.
|
10
|
+
|
11
|
+
class Google
|
12
|
+
include EventMachine::Deferrable
|
13
|
+
|
14
|
+
# Specifies the API URL for shortening URLs
|
15
|
+
API_URL = "https://www.googleapis.com/urlshortener/v1/url"
|
16
|
+
|
17
|
+
|
18
|
+
##
|
19
|
+
# Takes the URL to shorten and optionally two callbacks for success
|
20
|
+
# and error. Does not immediately shorten the URL.
|
21
|
+
#
|
22
|
+
# The +account+ argument may take the following options:
|
23
|
+
# :apikey Defines an apikey to use for the request
|
24
|
+
|
25
|
+
def initialize(account={})
|
26
|
+
@deferrable_args = [self]
|
27
|
+
@account_apikey = account[:apikey]
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
##
|
32
|
+
# Performs the request of shortening a URL asynchronously.
|
33
|
+
|
34
|
+
def shorten(url)
|
35
|
+
params = get_request_parameters(url)
|
36
|
+
request = EventMachine::HttpRequest.new(API_URL).post(params)
|
37
|
+
request.callback(&method(:on_success))
|
38
|
+
request.errback(&method(:on_error))
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
|
46
|
+
##
|
47
|
+
# Creates the parameter hash for the HTTP Request to Google
|
48
|
+
|
49
|
+
def get_request_parameters(url)
|
50
|
+
options = {
|
51
|
+
:head => { "Content-Type" => "application/json" },
|
52
|
+
:body => { "longUrl" => url }.to_json
|
53
|
+
}
|
54
|
+
|
55
|
+
if @account_apikey
|
56
|
+
options[:query] = { "key" => @account_apikey }
|
57
|
+
end
|
58
|
+
|
59
|
+
options
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Callback for HttpRequest object upon success. Parses the response
|
64
|
+
# as JSON, checks for a Google API error, and finally saves the
|
65
|
+
# short URL as an instance variable. If any of the above fail,
|
66
|
+
# sets the error message and sets the deferrable status to failure.
|
67
|
+
|
68
|
+
def on_success(http)
|
69
|
+
response = nil
|
70
|
+
|
71
|
+
# Handle JSON Failure
|
72
|
+
begin
|
73
|
+
response = JSON.parse(http.response)
|
74
|
+
rescue JSON::ParseError => e
|
75
|
+
error = e.message
|
76
|
+
fail(error, *@deferrable_args)
|
77
|
+
return
|
78
|
+
end
|
79
|
+
|
80
|
+
# Handle google API Error
|
81
|
+
if response['error']
|
82
|
+
error = response['error']['message']
|
83
|
+
fail(error, *@deferrable_args)
|
84
|
+
return
|
85
|
+
end
|
86
|
+
|
87
|
+
# Odd case if response['id'] doesn't exist (Should't happen)
|
88
|
+
if response['id'].nil?
|
89
|
+
error = "No short URL was returned (Google API Change?)"
|
90
|
+
fail(error, *@deferrable_args)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Return the short URL
|
94
|
+
short_url = response['id']
|
95
|
+
succeed(short_url, *@deferrable_args)
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
##
|
100
|
+
# Callback for an error from HttpRequest (caused by a server
|
101
|
+
# outage of lack of connectivity). Simply forwards the error
|
102
|
+
# value and sets the deferrable status to fail.
|
103
|
+
|
104
|
+
def on_error(http)
|
105
|
+
error = http.error
|
106
|
+
fail(error, *@deferrable_args)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
data/lib/em-shorturl.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
require 'em-shorturl/version'
|
3
|
+
require 'em-shorturl/google'
|
4
|
+
|
5
|
+
module EventMachine
|
6
|
+
module ShortURL
|
7
|
+
DEFAULT_DRIVER = :google
|
8
|
+
DRIVERS = {
|
9
|
+
:google => ShortURL::Google
|
10
|
+
}
|
11
|
+
|
12
|
+
def self.shorten(url, driver=DEFAULT_DRIVER, account={})
|
13
|
+
raise KeyError, "Driver does not exist" unless DRIVERS[driver]
|
14
|
+
|
15
|
+
r = DRIVERS[driver].new(account)
|
16
|
+
r.shorten(url)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/test/test_google.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "em-shorturl/google"
|
3
|
+
|
4
|
+
class TestGoogle < Test::Unit::TestCase
|
5
|
+
TEST_URL = 'http://google.com'
|
6
|
+
API_ENV_VAR = 'google_apikey'
|
7
|
+
|
8
|
+
def test_no_auth
|
9
|
+
EM.run do
|
10
|
+
google = EM::ShortURL::Google.new
|
11
|
+
set_asserts(google)
|
12
|
+
google.shorten(TEST_URL)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
if ENV[API_ENV_VAR]
|
17
|
+
def test_with_apikey
|
18
|
+
|
19
|
+
EM.run do
|
20
|
+
|
21
|
+
google = EM::ShortURL::Google.new(:apikey => ENV[API_ENV_VAR])
|
22
|
+
set_asserts(google)
|
23
|
+
google.shorten(TEST_URL)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
warn "Skipping test_with_apikey: No '#{API_ENV_VAR}' environment variable set"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def set_asserts(deferrable)
|
32
|
+
deferrable.callback { |s| assert_match(/^http:\/\/goo.gl\/\S+$/, s); EM.stop }
|
33
|
+
deferrable.errback { |e| assert(false, e); EM.stop}
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
require "test/unit"
|
3
|
+
require "em-shorturl"
|
4
|
+
|
5
|
+
class TestURLShortener < Test::Unit::TestCase
|
6
|
+
def test_bad_driver_should_raise_KeyError
|
7
|
+
assert_raise(KeyError) do
|
8
|
+
EM.run do
|
9
|
+
r = EM::ShortURL.shorten('http://google.com', :nonexistent_driver)
|
10
|
+
EM.stop
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: em-shorturl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nik Johnson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-05-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: em-http-request
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: An EventMachine module for shortening urls
|
28
|
+
email:
|
29
|
+
- nikjohnson08@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/em-shorturl/version.rb
|
35
|
+
- lib/em-shorturl/google.rb
|
36
|
+
- lib/em-shorturl.rb
|
37
|
+
- test/test_google.rb
|
38
|
+
- test/test_shorturl.rb
|
39
|
+
homepage: https://github.com/jumpandspintowin/em-shorturl
|
40
|
+
licenses:
|
41
|
+
- Simplified BSD
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.0.3
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: An EventMachine module for shortening urls
|
63
|
+
test_files:
|
64
|
+
- test/test_google.rb
|
65
|
+
- test/test_shorturl.rb
|