shortly 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +16 -4
- data/VERSION +1 -1
- data/bin/shortly +29 -17
- data/lib/shortly/clients/{rubyurl.rb → jmp.rb} +7 -9
- data/lib/shortly/clients/{lggd.rb → shortswitch.rb} +2 -2
- data/lib/shortly/clients/snim.rb +75 -0
- data/lib/shortly.rb +4 -1
- data/spec/shortly_spec.rb +135 -18
- data/spec/spec_helper.rb +4 -1
- data/spec/support/fakeweb_stub.rb +16 -0
- metadata +23 -6
data/README.textile
CHANGED
@@ -33,11 +33,11 @@ Optionally you can set apiKey and login beforehand (it would be more DRY i think
|
|
33
33
|
@googl.expand('http://goo.gl/shrt').longUrl@
|
34
34
|
@googl.analytics('http://goo.gl/shrt').analytics@
|
35
35
|
|
36
|
-
*
|
36
|
+
*ShortSwitch* (Credit 'Steve Price (steveprice67)'. See Credits section)
|
37
37
|
|
38
|
-
@
|
39
|
-
@
|
40
|
-
@
|
38
|
+
@shortswitch = Shortly::Clients::ShortSwitch@
|
39
|
+
@shortswitch.apiKey = '<api-key>'@
|
40
|
+
@shortswitch.shorten('http://justatest.com').shortUrl@
|
41
41
|
|
42
42
|
*Is.gd*
|
43
43
|
|
@@ -54,6 +54,13 @@ Optionally you can set apiKey and login beforehand (it would be more DRY i think
|
|
54
54
|
@tinyurl = Shortly::Clients::Tinyurl@
|
55
55
|
@tinyurl.shorten('http://justatest.com').shorturl@
|
56
56
|
|
57
|
+
*Sn.im*
|
58
|
+
@snim = Shortly::Clients::Snim@
|
59
|
+
@snim.apiKey = "<apiKey>"@
|
60
|
+
@snim.login = "<login>"@
|
61
|
+
@snim.shorten(long_url).shortUrl@
|
62
|
+
@snim.expand(url_id/shorturl).url@
|
63
|
+
|
57
64
|
h4. Command Line Utility
|
58
65
|
|
59
66
|
Shortly also provides command line utility. See some uses below.
|
@@ -91,6 +98,11 @@ For more info write me at bagwanpankaj[at]gmail.com or me[at]bagwanpankaj.com
|
|
91
98
|
|
92
99
|
Copyright (c) 2010 Bagwan Pankaj: http://bagwanpankaj.com, released under the MIT license
|
93
100
|
|
101
|
+
h2. TODO's
|
102
|
+
|
103
|
+
* Better documentation
|
104
|
+
* Example series
|
105
|
+
|
94
106
|
h2. Contributing to shortly
|
95
107
|
|
96
108
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/bin/shortly
CHANGED
@@ -15,9 +15,12 @@ services = {
|
|
15
15
|
:googl => Shortly::Clients::Googl,
|
16
16
|
:isgd => Shortly::Clients::Isgd,
|
17
17
|
:vgd => Shortly::Clients::Vgd,
|
18
|
-
:lggd => Shortly::Clients::
|
18
|
+
:lggd => Shortly::Clients::ShortSwitch,
|
19
|
+
:shortswitch => Shortly::Clients::ShortSwitch,
|
19
20
|
:bitly => Shortly::Clients::Bitly,
|
20
|
-
:
|
21
|
+
:jmp => Shortly::Clients::Jmp,
|
22
|
+
:tinyurl => Shortly::Clients::Tinyurl,
|
23
|
+
:snim => Shortly::Clients::Snim,
|
21
24
|
}
|
22
25
|
|
23
26
|
options = {:service => :googl, :method => :shorten} #defaults to be used
|
@@ -30,15 +33,15 @@ opts = OptionParser.new do |opts|
|
|
30
33
|
Options:
|
31
34
|
EOS
|
32
35
|
|
33
|
-
opts.on("-s", "--service SERVICE", "Service to be used in shortner(e.g. bitly, googl(default), isgd)") do |service|
|
36
|
+
opts.on("-s", "--service SERVICE", "Service to be used in shortner(e.g. bitly, googl(default), isgd etc..)") do |service|
|
34
37
|
options[:service] = service.to_sym
|
35
38
|
end
|
36
39
|
|
37
|
-
opts.on("-l", "--login LOGIN", "Login creadential
|
40
|
+
opts.on("-l", "--login LOGIN", "Login creadential") do |login|
|
38
41
|
options[:login] = login
|
39
42
|
end
|
40
43
|
|
41
|
-
opts.on("-p", "--apikey APIKEY", "API Key credentials
|
44
|
+
opts.on("-p", "--apikey APIKEY", "API Key credentials") do |apikey|
|
42
45
|
options[:apikey] = apikey
|
43
46
|
end
|
44
47
|
|
@@ -52,7 +55,8 @@ opts = OptionParser.new do |opts|
|
|
52
55
|
|
53
56
|
opts.on("-v", "--version", "Version of shortly") do
|
54
57
|
options[:version] = true
|
55
|
-
end
|
58
|
+
end
|
59
|
+
|
56
60
|
end
|
57
61
|
|
58
62
|
opts.parse!
|
@@ -63,14 +67,16 @@ end
|
|
63
67
|
|
64
68
|
options[:url] = ARGV.first if ARGV.length == 1
|
65
69
|
|
66
|
-
#validate for bitly services
|
67
|
-
if options[:service]
|
68
|
-
abort("login is required
|
69
|
-
abort("API Key is required
|
70
|
+
#validate for bitly/jmp services
|
71
|
+
if [:bitly, :jmp, :snim].include? options[:service]
|
72
|
+
abort("login is required this service") unless options[:login]
|
73
|
+
abort("API Key is required this services") unless options[:apikey]
|
74
|
+
elsif [:shortswitch].include? options[:service]
|
75
|
+
abort("API Key is required this services") unless options[:apikey]
|
70
76
|
end
|
71
77
|
|
72
78
|
unless options[:url]
|
73
|
-
abort("Please provide atleast a valid URL. To see help type --help or -h")
|
79
|
+
abort("Please provide atleast a valid URL. To see help type --help or -h") and exit(1)
|
74
80
|
end
|
75
81
|
unless services.include?(options[:service])
|
76
82
|
abort("#{options[:service]} sevice is not supported currently.")
|
@@ -78,17 +84,17 @@ end
|
|
78
84
|
|
79
85
|
command = services[options[:service]]
|
80
86
|
|
81
|
-
if options[:service]
|
87
|
+
if [:bitly, :jmp, :snim].include? options[:service]
|
82
88
|
command.login = options.delete(:login)
|
83
89
|
command.apiKey = options.delete(:apikey)
|
84
|
-
elsif options[:service]
|
90
|
+
elsif [:lggd, :googl, :shortswitch].include? options[:service]
|
85
91
|
command.apiKey = options.delete(:apikey)
|
86
92
|
end
|
87
93
|
|
88
94
|
response = command.send(options[:method], options[:url])
|
89
95
|
|
90
96
|
output = case options[:service]
|
91
|
-
when :bitly
|
97
|
+
when :bitly, :jmp
|
92
98
|
case options[:method]
|
93
99
|
when :shorten
|
94
100
|
response.url
|
@@ -103,9 +109,15 @@ output = case options[:service]
|
|
103
109
|
else
|
104
110
|
response.analytics.to_json
|
105
111
|
end
|
106
|
-
when :
|
107
|
-
|
108
|
-
|
112
|
+
when :snim
|
113
|
+
case options[:method]
|
114
|
+
when :shorten
|
115
|
+
response.shortUrl
|
116
|
+
when :expand
|
117
|
+
response.url
|
118
|
+
end
|
119
|
+
when :isgd, :vgd then response.shorturl
|
120
|
+
when :lggd, :shortswitch then response.shortUrl
|
109
121
|
when :tinyurl then response.shorturl
|
110
122
|
else abort("Something went wrong. Please raise an issue on Github")
|
111
123
|
end
|
@@ -22,16 +22,14 @@
|
|
22
22
|
module Shortly
|
23
23
|
|
24
24
|
module Clients
|
25
|
-
|
26
|
-
class
|
27
|
-
|
28
|
-
base_uri 'rubyurl.com'
|
25
|
+
|
26
|
+
class Jmp < Bitly
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
self.register!
|
29
|
+
|
30
|
+
base_uri 'api.j.mp'
|
31
|
+
|
33
32
|
end
|
34
|
-
|
33
|
+
|
35
34
|
end
|
36
|
-
|
37
35
|
end
|
@@ -23,7 +23,7 @@ module Shortly
|
|
23
23
|
|
24
24
|
module Clients
|
25
25
|
|
26
|
-
class
|
26
|
+
class ShortSwitch < Client
|
27
27
|
|
28
28
|
self.register!
|
29
29
|
|
@@ -31,7 +31,7 @@ module Shortly
|
|
31
31
|
attr_accessor :apiKey
|
32
32
|
end
|
33
33
|
|
34
|
-
base_uri '
|
34
|
+
base_uri 'api.shortswitch.com'
|
35
35
|
|
36
36
|
#shorts provided url by making call to is.gd api with given options.
|
37
37
|
def self.shorten(url, options = {})
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright (c) 2011 Bagwan Pankaj
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
module Shortly
|
23
|
+
|
24
|
+
module Clients
|
25
|
+
|
26
|
+
class Snim < Client
|
27
|
+
|
28
|
+
self.register!
|
29
|
+
|
30
|
+
class << self
|
31
|
+
#login = "<your login>"
|
32
|
+
#apiKey = "<your apiKey>"
|
33
|
+
attr_accessor :login, :apiKey
|
34
|
+
end
|
35
|
+
|
36
|
+
base_uri 'http://sn.im/site'
|
37
|
+
|
38
|
+
#shorts provided url by making call to bitly api with given options.
|
39
|
+
def self.shorten(url, options = {})
|
40
|
+
validate_uri!(url)
|
41
|
+
options = {:snipapi => self.apiKey,:snipuser => self.login, :sniplink => url}.merge(options)
|
42
|
+
validate!(options)
|
43
|
+
response = post("/getsnip", post_params(options))
|
44
|
+
OpenStruct.new(response["snip"].merge(:shortUrl => response["snip"]["id"]))
|
45
|
+
end
|
46
|
+
|
47
|
+
#expands provided url by making call to bitly api with given options.
|
48
|
+
def self.expand(short_url, options = {})
|
49
|
+
analytics(short_url.gsub('http://sn.im/', ''), options)
|
50
|
+
end
|
51
|
+
|
52
|
+
#gets analytics
|
53
|
+
def self.analytics(short_id, options = {})
|
54
|
+
options = {:snipapi => self.apiKey,:snipuser => self.login, :snipid => short_id}.merge(options)
|
55
|
+
validate!(options)
|
56
|
+
response = post("/getsnipdetails", post_params(options))
|
57
|
+
OpenStruct.new(unescape_url(response)["snip"])
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def self.validate!(options)
|
63
|
+
raise NotAuthorizedError.new("Credentials required(login and apiKey)") unless
|
64
|
+
options.authenticable?(:snipapi, :snipuser)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.unescape_url(response)
|
68
|
+
response["snip"]["url"] = CGI.unescape(response["snip"]["url"]) if response["snip"]
|
69
|
+
response
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
data/lib/shortly.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'uri'
|
2
|
+
require 'cgi'
|
2
3
|
require 'ostruct'
|
3
4
|
require 'json'
|
4
5
|
require 'httparty'
|
@@ -7,11 +8,13 @@ require 'shortly/helper'
|
|
7
8
|
require 'shortly/errors'
|
8
9
|
require 'shortly/client'
|
9
10
|
require 'shortly/clients/bitly'
|
11
|
+
require 'shortly/clients/jmp'
|
10
12
|
require 'shortly/clients/googl'
|
11
13
|
require 'shortly/clients/isgd'
|
12
|
-
require 'shortly/clients/
|
14
|
+
require 'shortly/clients/shortswitch'
|
13
15
|
require 'shortly/clients/tinyurl'
|
14
16
|
require 'shortly/clients/vgd'
|
17
|
+
require 'shortly/clients/snim'
|
15
18
|
|
16
19
|
module Shortly
|
17
20
|
|
data/spec/shortly_spec.rb
CHANGED
@@ -9,9 +9,11 @@ describe "Shortly" do
|
|
9
9
|
@invalid_url = "bagwanpankaj.com"
|
10
10
|
@short_url = "http://goo.gl/17pbM"
|
11
11
|
@googl = Shortly::Clients::Googl
|
12
|
+
@uri = @googl.base_uri + @googl.send(:relative_path)
|
12
13
|
end
|
13
14
|
|
14
15
|
it "should get a short url from googl(provided valid url)" do
|
16
|
+
mock_request_for(@uri, :method => :post, :fixture => "googl_shorten")
|
15
17
|
res = @googl.shorten(@long_url)
|
16
18
|
res.shortUrl.should_not be_empty
|
17
19
|
res.shortUrl.should == @short_url
|
@@ -23,6 +25,7 @@ describe "Shortly" do
|
|
23
25
|
end
|
24
26
|
|
25
27
|
it "should get a long url back for given valid short url" do
|
28
|
+
mock_request_for(@uri + "?shortUrl=#{CGI.escape(@short_url)}", :method => :get, :fixture => "googl_expand")
|
26
29
|
res = @googl.expand(@short_url)
|
27
30
|
res.longUrl.should_not be_empty
|
28
31
|
res.longUrl.should == @long_url
|
@@ -34,9 +37,14 @@ describe "Shortly" do
|
|
34
37
|
end
|
35
38
|
|
36
39
|
it "should give analytics for given short url" do
|
40
|
+
mock_request_for(@uri + "?shortUrl=#{CGI.escape(@short_url)}&projection=FULL",
|
41
|
+
:fixture => "googl_analytics")
|
42
|
+
|
37
43
|
res = @googl.analytics(@short_url)
|
38
44
|
res.analytics.should_not be_empty
|
39
45
|
res.analytics.should be_an_instance_of(Hash)
|
46
|
+
res.analytics["week"].should be_an_instance_of(Hash)
|
47
|
+
res.analytics["day"].should be_an_instance_of(Hash)
|
40
48
|
end
|
41
49
|
|
42
50
|
it "should throw an error on wrong uri format" do
|
@@ -52,13 +60,18 @@ describe "Shortly" do
|
|
52
60
|
before(:all) do
|
53
61
|
@isgd = Shortly::Clients::Isgd
|
54
62
|
@long_url = "http://bagwanpankaj.com"
|
63
|
+
@shorturl = "http://is.gd/bs9smw"
|
55
64
|
@invalid_url = "bagwanpankaj.com"
|
65
|
+
@uri = @isgd.base_uri
|
56
66
|
end
|
57
67
|
|
58
68
|
it "should get a short url from Is.gd(provided valid url)" do
|
69
|
+
mock_request_for(@uri + "/create.php?url=#{CGI.escape(@long_url)}&format=json",
|
70
|
+
:fixture => "isgd_shorten")
|
71
|
+
|
59
72
|
res = @isgd.shorten(@long_url)
|
60
73
|
res.shorturl.should_not be_empty
|
61
|
-
res.shorturl.should == @
|
74
|
+
res.shorturl.should == @shorturl
|
62
75
|
end
|
63
76
|
|
64
77
|
it "result should be an instance of OpenStruct" do
|
@@ -85,25 +98,29 @@ describe "Shortly" do
|
|
85
98
|
@vgd = Shortly::Clients::Vgd
|
86
99
|
@long_url = "http://bagwanpankaj.com"
|
87
100
|
@invalid_url = "bagwanpankaj.com"
|
101
|
+
@uri = @vgd.base_uri
|
88
102
|
end
|
89
|
-
|
90
|
-
it "should get a short url from
|
103
|
+
|
104
|
+
it "should get a short url from v.gd(provided valid url)" do
|
105
|
+
mock_request_for(@uri + "/create.php?url=#{CGI.escape(@long_url)}&format=json",
|
106
|
+
:fixture => "vgd_shorten")
|
107
|
+
|
91
108
|
res = @vgd.shorten(@long_url)
|
92
109
|
res.shorturl.should_not be_empty
|
93
110
|
res.shorturl.should == @vgd.shorten(@long_url).shorturl
|
94
111
|
end
|
95
|
-
|
112
|
+
|
96
113
|
it "result should be an instance of OpenStruct" do
|
97
114
|
res = @vgd.shorten(@long_url)
|
98
115
|
res.should be_an_instance_of(OpenStruct)
|
99
116
|
end
|
100
|
-
|
117
|
+
|
101
118
|
it "should throw an error on wrong uri format" do
|
102
119
|
lambda do
|
103
120
|
@vgd.shorten(@invalid_url)
|
104
121
|
end.should raise_error(Shortly::Errors::InvalidURIError)
|
105
122
|
end
|
106
|
-
|
123
|
+
|
107
124
|
it "should raise MethodNotAvailableError if method is not implemented for" do
|
108
125
|
lambda do
|
109
126
|
@vgd.expand(@long_url)
|
@@ -116,14 +133,18 @@ describe "Shortly" do
|
|
116
133
|
|
117
134
|
before(:all) do
|
118
135
|
@bitly = Shortly::Clients::Bitly
|
119
|
-
@bitly.login = "
|
120
|
-
@bitly.apiKey = "
|
136
|
+
@bitly.login = "TEST_LOGIN"
|
137
|
+
@bitly.apiKey = "R_TEST_API_KEY"
|
121
138
|
@long_url = "http://bagwanpankaj.com"
|
122
139
|
@invalid_url = "bagwanpankaj.com"
|
123
140
|
@short_url = "http://bit.ly/dUdiIJ"
|
141
|
+
@uri = @bitly.base_uri + "/v3"
|
124
142
|
end
|
125
143
|
|
126
|
-
it "should get a short url from
|
144
|
+
it "should get a short url from bitly(provided valid url)" do
|
145
|
+
mock_request_for(@uri + "/shorten?longUrl=#{CGI.escape(@long_url)}&format=json&login=#{@bitly.login}&apiKey=#{@bitly.apiKey}",
|
146
|
+
:fixture => "bitly_shorten")
|
147
|
+
|
127
148
|
res = @bitly.shorten(@long_url)
|
128
149
|
res.url.should_not be_empty
|
129
150
|
res.url.should == @short_url
|
@@ -141,20 +162,70 @@ describe "Shortly" do
|
|
141
162
|
end
|
142
163
|
|
143
164
|
it "should expand a given short url" do
|
165
|
+
mock_request_for(@uri + "/expand?shortUrl=#{CGI.escape(@short_url)}&format=json&login=#{@bitly.login}&apiKey=#{@bitly.apiKey}",
|
166
|
+
:fixture => "bitly_expand")
|
167
|
+
|
144
168
|
res = @bitly.expand("http://bit.ly/dUdiIJ")
|
145
169
|
res.long_url.should == @long_url
|
146
170
|
end
|
147
171
|
|
148
172
|
end
|
149
173
|
|
174
|
+
#tests for client jmp
|
175
|
+
describe "Jmp" do
|
176
|
+
|
177
|
+
before(:all) do
|
178
|
+
@jmp = Shortly::Clients::Jmp
|
179
|
+
@jmp.login = "TEST_LOGIN"
|
180
|
+
@jmp.apiKey = "R_TEST_API_KEY"
|
181
|
+
@long_url = "http://bagwanpankaj.com"
|
182
|
+
@invalid_url = "bagwanpankaj.com"
|
183
|
+
@short_url = "http://j.mp/dUdiIJ"
|
184
|
+
@uri = @jmp.base_uri + '/v3'
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should get a short url from jmp(provided valid url)" do
|
188
|
+
mock_request_for(@uri + "/shorten?longUrl=#{CGI.escape(@long_url)}&format=json&login=#{@jmp.login}&apiKey=#{@jmp.apiKey}",
|
189
|
+
:fixture => "jmp_shorten")
|
190
|
+
|
191
|
+
res = @jmp.shorten(@long_url)
|
192
|
+
res.url.should_not be_empty
|
193
|
+
res.url.should == @short_url
|
194
|
+
end
|
195
|
+
|
196
|
+
it "result should be an instance of OpenStruct" do
|
197
|
+
res = @jmp.shorten(@long_url)
|
198
|
+
res.should be_an_instance_of(OpenStruct)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should throw an error on wrong uri format" do
|
202
|
+
lambda do
|
203
|
+
@jmp.shorten(@invalid_url)
|
204
|
+
end.should raise_error(Shortly::Errors::InvalidURIError)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should expand a given short url" do
|
208
|
+
mock_request_for(@uri + "/expand?shortUrl=#{CGI.escape(@short_url)}&format=json&login=#{@jmp.login}&apiKey=#{@jmp.apiKey}",
|
209
|
+
:fixture => "jmp_expand")
|
210
|
+
|
211
|
+
res = @jmp.expand(@short_url)
|
212
|
+
res.long_url.should == @long_url
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
150
217
|
#tests for client tinyurl
|
151
218
|
describe "TinyUrl" do
|
152
219
|
before(:all) do
|
153
220
|
@long_url = "http://bagwanpankaj.com"
|
154
221
|
@invalid_url = "bagwanpankaj.com"
|
222
|
+
@uri = Shortly::Clients::Tinyurl.base_uri
|
155
223
|
end
|
156
224
|
|
157
225
|
it "should get a short url from TinyUrl(provided valid url)" do
|
226
|
+
mock_request_for(@uri + "/api-create.php", :method => :post,
|
227
|
+
:fixture => "tinyurl_shorten", :content_type => "text/plain")
|
228
|
+
|
158
229
|
res = Shortly::Clients::Tinyurl.shorten(@long_url)
|
159
230
|
res.shorturl.should_not be_empty
|
160
231
|
res.shorturl.should == "http://tinyurl.com/6jt3pjr"
|
@@ -178,35 +249,81 @@ describe "Shortly" do
|
|
178
249
|
end
|
179
250
|
end
|
180
251
|
|
181
|
-
#tests for client
|
182
|
-
describe "
|
252
|
+
#tests for client ShortSwitch
|
253
|
+
describe "ShortSwitch" do
|
183
254
|
|
184
255
|
before(:all) do
|
185
|
-
Shortly::Clients::
|
186
|
-
|
256
|
+
@ss = Shortly::Clients::ShortSwitch
|
257
|
+
Shortly::Clients::ShortSwitch.apiKey = "TESTKEY"
|
258
|
+
@long_url = "http://bagwanpankaj.com"
|
187
259
|
@invalid_url = "bagwanpankaj.com"
|
188
|
-
@short_url = "http://demo.shortswitch.com/
|
260
|
+
@short_url = "http://demo.shortswitch.com/t"
|
261
|
+
@uri = @ss.base_uri
|
189
262
|
end
|
263
|
+
|
264
|
+
it "should get a short url from ShortSwitch(provided valid url)" do
|
265
|
+
mock_request_for(@uri + "/shorten?longUrl=#{CGI.escape(@long_url)}&format=json&apiKey=TESTKEY",
|
266
|
+
:fixture => "shortswitch_shorten")
|
190
267
|
|
191
|
-
|
192
|
-
res = Shortly::Clients::Lggd.shorten(@long_url)
|
268
|
+
res = Shortly::Clients::ShortSwitch.shorten(@long_url)
|
193
269
|
res.shortUrl.should_not be_empty
|
194
270
|
res.shortUrl.should == @short_url
|
195
271
|
end
|
196
272
|
|
197
273
|
it "result should be an instance of OpenStruct" do
|
198
|
-
res = Shortly::Clients::
|
274
|
+
res = Shortly::Clients::ShortSwitch.shorten(@long_url)
|
199
275
|
res.should be_an_instance_of(OpenStruct)
|
200
276
|
end
|
201
277
|
|
202
278
|
it "should throw an error on wrong uri format" do
|
203
279
|
lambda do
|
204
|
-
Shortly::Clients::
|
280
|
+
Shortly::Clients::ShortSwitch.shorten(@invalid_url)
|
205
281
|
end.should raise_error(Shortly::Errors::InvalidURIError)
|
206
282
|
end
|
207
283
|
|
208
284
|
end
|
209
285
|
|
286
|
+
#tests for client sn.im
|
287
|
+
describe "Snim" do
|
288
|
+
before(:all) do
|
289
|
+
@snim = Shortly::Clients::Snim
|
290
|
+
@snim.apiKey = "TESTKEY"
|
291
|
+
@snim.login = "TESTER"
|
292
|
+
@long_url = "http://bagwanpankaj.com/"
|
293
|
+
@invalid_url = "bagwanpankaj.com"
|
294
|
+
@short_url = "http://sn.im/1wvkof"
|
295
|
+
@uri = @snim.base_uri
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should get a short url from Snim(provided valid url)" do
|
299
|
+
mock_request_for(@uri + "/getsnip", :method => :post,
|
300
|
+
:fixture => "snim_shorten")
|
301
|
+
|
302
|
+
res = @snim.shorten(@long_url)
|
303
|
+
res.shortUrl.should_not be_empty
|
304
|
+
res.shortUrl.should == @short_url
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should get analytics from Snim(provided valid id)" do
|
308
|
+
mock_request_for(@uri + "/getsnipdetails", :method => :post,
|
309
|
+
:fixture => "snim_analytics")
|
310
|
+
|
311
|
+
res = @snim.analytics("1wvkof")
|
312
|
+
res.url.should_not be_empty
|
313
|
+
res.clicks.should_not be_nil
|
314
|
+
res.clicks.should == 10000
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should get long url from Snim(provided valid shorturl)" do
|
318
|
+
mock_request_for(@uri + "/getsnipdetails", :method => :post,
|
319
|
+
:fixture => "snim_analytics")
|
320
|
+
|
321
|
+
res = @snim.expand(@short_url)
|
322
|
+
res.url.should_not be_empty
|
323
|
+
res.url.should == @long_url
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
210
327
|
describe "Client" do
|
211
328
|
|
212
329
|
before(:all) do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'cgi'
|
3
4
|
require 'rspec'
|
4
5
|
require 'shortly'
|
5
|
-
|
6
|
+
require 'fakeweb'
|
6
7
|
# Requires supporting files with custom matchers and macros, etc,
|
7
8
|
# in ./support/ and its subdirectories.
|
8
9
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
10
|
+
include FakewebStub
|
11
|
+
FakeWeb.allow_net_connect = false
|
9
12
|
|
10
13
|
RSpec.configure do |config|
|
11
14
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FakewebStub
|
2
|
+
|
3
|
+
def mock_request_for(url, options = {})
|
4
|
+
|
5
|
+
method = options[:method] || :get
|
6
|
+
fixture = options[:fixture] || "Fakeweb request body"
|
7
|
+
content_type = options[:content_type] || "application/json"
|
8
|
+
body = begin
|
9
|
+
File.read(File.expand_path(File.dirname(__FILE__)) + "/../fixtures/#{fixture}.json")
|
10
|
+
rescue Errno::ENOENT
|
11
|
+
raise "Could not find fixture file named '#{fixture}'!"
|
12
|
+
end
|
13
|
+
|
14
|
+
FakeWeb.register_uri(method, url, :body => body, :status => ["200", "OK"], :content_type => content_type)
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shortly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 2
|
10
|
+
version: 0.3.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Bagwan Pankaj
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-26 00:00:00 +05:30
|
19
19
|
default_executable: shortly
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- 0
|
109
109
|
version: "0"
|
110
110
|
requirement: *id006
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
name: fakeweb
|
115
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
requirement: *id007
|
111
125
|
description: Ruby Wrapper for different Url Shortner Services Ruby Wrapper
|
112
126
|
email: bagwanpankaj@gmail.com
|
113
127
|
executables:
|
@@ -126,8 +140,9 @@ files:
|
|
126
140
|
- lib/shortly/clients/bitly.rb
|
127
141
|
- lib/shortly/clients/googl.rb
|
128
142
|
- lib/shortly/clients/isgd.rb
|
129
|
-
- lib/shortly/clients/
|
130
|
-
- lib/shortly/clients/
|
143
|
+
- lib/shortly/clients/jmp.rb
|
144
|
+
- lib/shortly/clients/shortswitch.rb
|
145
|
+
- lib/shortly/clients/snim.rb
|
131
146
|
- lib/shortly/clients/tinyurl.rb
|
132
147
|
- lib/shortly/clients/vgd.rb
|
133
148
|
- lib/shortly/errors.rb
|
@@ -135,6 +150,7 @@ files:
|
|
135
150
|
- README.textile
|
136
151
|
- spec/shortly_spec.rb
|
137
152
|
- spec/spec_helper.rb
|
153
|
+
- spec/support/fakeweb_stub.rb
|
138
154
|
has_rdoc: true
|
139
155
|
homepage: http://github.com/bagwanpankaj/shortly
|
140
156
|
licenses:
|
@@ -172,3 +188,4 @@ summary: Url Shortner Services Ruby Wrapper
|
|
172
188
|
test_files:
|
173
189
|
- spec/shortly_spec.rb
|
174
190
|
- spec/spec_helper.rb
|
191
|
+
- spec/support/fakeweb_stub.rb
|