url_shortener 0.0.3 → 0.0.4
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/History.txt +15 -0
- data/Manifest.txt +6 -0
- data/README.rdoc +49 -21
- data/features/api_calls.feature +2 -2
- data/features/step_definitions/api_call_steps.rb +18 -24
- data/lib/url_shortener/client.rb +12 -7
- data/lib/url_shortener/error.rb +1 -1
- data/lib/url_shortener/response/expand.rb +28 -0
- data/lib/url_shortener/response/shorten.rb +55 -0
- data/lib/url_shortener/response.rb +11 -0
- data/lib/url_shortener.rb +4 -1
- data/spec/url_shortener/client_spec.rb +10 -2
- data/spec/url_shortener/response/expand_spec.rb +64 -0
- data/spec/url_shortener/response/shorten_spec.rb +278 -0
- data/spec/url_shortener/response_spec.rb +15 -0
- metadata +9 -3
data/History.txt
CHANGED
@@ -13,3 +13,18 @@
|
|
13
13
|
* 2 additions:
|
14
14
|
* adds url stats functionality
|
15
15
|
* adds url info functionality
|
16
|
+
|
17
|
+
=== 0.0.4 2009-11-15
|
18
|
+
|
19
|
+
* 4 additions:
|
20
|
+
* adds UrlShortener::Response
|
21
|
+
* adds UrlShortener::Response::Shorten
|
22
|
+
* adds UrlShortener::Response::Expand
|
23
|
+
* adds some convenience methods to the returned results for shortening and expanding urls
|
24
|
+
|
25
|
+
* 3 changes:
|
26
|
+
* api call method UrlShortener::Client#shorten now returns a UrlShortener::Response::Shorten object
|
27
|
+
* api call method UrlShortener::Client#expand now returns a UrlShortener::Response::Expand object
|
28
|
+
* other api call methods now return a UrlShortener::Response object
|
29
|
+
These changes are introduced to return the api call results in a flexible manner and provide more flexibility for manipulating result output
|
30
|
+
|
data/Manifest.txt
CHANGED
@@ -6,10 +6,16 @@ lib/url_shortener/authorize.rb
|
|
6
6
|
lib/url_shortener/client.rb
|
7
7
|
lib/url_shortener/error.rb
|
8
8
|
lib/url_shortener/interface.rb
|
9
|
+
lib/url_shortener/response.rb
|
10
|
+
lib/url_shortener/response/shorten.rb
|
11
|
+
lib/url_shortener/response/expand.rb
|
9
12
|
spec/spec_helper.rb
|
10
13
|
spec/url_shortener/authorize_spec.rb
|
11
14
|
spec/url_shortener/client_spec.rb
|
12
15
|
spec/url_shortener/interface_spec.rb
|
16
|
+
spec/url_shortener/response_spec.rb
|
17
|
+
spec/url_shortener/response/shorten_spec.rb
|
18
|
+
spec/url_shortener/response/expand_spec.rb
|
13
19
|
features/request_failure.feature
|
14
20
|
features/api_calls.feature
|
15
21
|
features/support/env.rb
|
data/README.rdoc
CHANGED
@@ -1,55 +1,83 @@
|
|
1
1
|
==Description
|
2
2
|
|
3
|
-
Url Shortener is a Ruby library / gem and API wrapper for bit.ly to shorten the urls.
|
3
|
+
Url Shortener is a Ruby library / gem and API wrapper for bit.ly to shorten/expand the urls and retrieve other information about them.
|
4
4
|
|
5
5
|
To use the url_shortener gem you need a bit.ly login and Api key.
|
6
6
|
|
7
7
|
* If you are registered at bit.ly then you already have it.
|
8
8
|
* If you are not registered then you can get it easily by registering at bit.ly as they give an api key to every registered user
|
9
9
|
|
10
|
+
==INSTALL
|
11
|
+
|
12
|
+
gem sources -a http://gemcutter.org
|
13
|
+
|
14
|
+
sudo gem install url_shortener
|
15
|
+
|
16
|
+
|
10
17
|
==USAGE
|
11
18
|
|
19
|
+
===Quick Start
|
20
|
+
|
21
|
+
* Start an irb session
|
22
|
+
|
23
|
+
require 'rubygems'
|
24
|
+
|
25
|
+
require 'url_shortener'
|
26
|
+
|
12
27
|
===To Shorten Urls
|
13
28
|
|
14
|
-
|
29
|
+
authorize = UrlShortener::Authorize.new 'your_bitly_login', 'your_bitly_api_key'
|
15
30
|
|
16
|
-
|
31
|
+
For example; authorize = UrlShortener::Authorize.new 'bitlyapidemo', 'R_0da49e0a9118ff35f52f629d2d71bf07'
|
17
32
|
|
18
|
-
|
33
|
+
client = UrlShortener::Client.new authorize
|
19
34
|
|
20
|
-
|
35
|
+
shorten = client.shorten('http://www.yahoo.com') # => UrlShortener::Response::Shorten object
|
21
36
|
|
22
|
-
|
37
|
+
shorten.result # => returns a hash of all data returned from bitly
|
23
38
|
|
24
|
-
|
39
|
+
shorten.urls # => Only returns the short urls
|
40
|
+
|
41
|
+
look for more convenience methods in the UrlShortener::Response::Shorten class
|
42
|
+
|
25
43
|
|
26
|
-
|
44
|
+
OR
|
27
45
|
|
28
|
-
|
46
|
+
shorten = client.shorten('http://www.yahoo.com', 'http://www.google.com', 'http://github.com')
|
29
47
|
|
30
|
-
|
48
|
+
shorten.result
|
49
|
+
|
50
|
+
shorten.urls
|
31
51
|
|
32
|
-
|
52
|
+
===To Expand Urls
|
33
53
|
|
34
|
-
|
54
|
+
expand = client.expand(:shortUrl => 'http://bit.ly/1RmnUT') # => UrlShortener::Response::Expand object
|
55
|
+
|
56
|
+
OR
|
35
57
|
|
36
|
-
|
58
|
+
expand = client.expand(:hash => '1RmnUT')
|
59
|
+
expand.result # => returns a hash of all data returned from bitly
|
60
|
+
expand.url # => returns a long url string
|
37
61
|
|
38
62
|
===To get stats
|
39
63
|
|
40
|
-
|
41
|
-
|
42
|
-
OR
|
64
|
+
stats = client.stats(:shortUrl => 'http://bit.ly/1RmnUT') # => UrlShortener::Response object
|
65
|
+
|
66
|
+
OR
|
43
67
|
|
44
|
-
|
68
|
+
stats = client.stats(:hash => '1RmnUT') # => UrlShortener::Response object
|
69
|
+
stats.result # => returns a hash of all data returned from bitly
|
70
|
+
#TODO: ADD convenience methods for stats
|
45
71
|
|
46
72
|
===To get url info
|
47
73
|
|
48
|
-
|
49
|
-
|
50
|
-
OR
|
74
|
+
info = client.info(:shortUrl => 'http://bit.ly/1RmnUT') # => UrlShortener::Response object
|
75
|
+
|
76
|
+
OR
|
51
77
|
|
52
|
-
|
78
|
+
info = client.info(:hash => '1RmnUT') # => UrlShortener::Response object
|
79
|
+
info.result # => returns a hash of all data returned from bitly
|
80
|
+
#TODO: ADD convenience methods for info api call
|
53
81
|
|
54
82
|
==Docs
|
55
83
|
|
data/features/api_calls.feature
CHANGED
@@ -30,7 +30,7 @@ Feature: REST calls to bit.ly API
|
|
30
30
|
And "bit.ly" is online
|
31
31
|
When I submit a request to expand a short url using the hash "2oV4lu"
|
32
32
|
Then I should get the response from "bit.ly"
|
33
|
-
And the expanded url should be "http://www.github.com/nas"
|
33
|
+
And the expanded url should be "http://www.github.com/nas" for "2oV4lu"
|
34
34
|
|
35
35
|
Scenario: Expand the short url when correct login and api key is present
|
36
36
|
Given I use "correct" "bit.ly" login name as "bitlyapidemo"
|
@@ -39,7 +39,7 @@ Feature: REST calls to bit.ly API
|
|
39
39
|
And "bit.ly" is online
|
40
40
|
When I submit a request to expand a short url using the short url "http://bit.ly/6NaDb"
|
41
41
|
Then I should get the response from "bit.ly"
|
42
|
-
And the expanded url should be "http://www.github.com/nas"
|
42
|
+
And the expanded url should be "http://www.github.com/nas" for "6NaDb"
|
43
43
|
|
44
44
|
Scenario: Get stats from the hash when correct login and api key is present
|
45
45
|
Given I use "correct" "bit.ly" login name as "bitlyapidemo"
|
@@ -2,82 +2,76 @@
|
|
2
2
|
# = When Steps =
|
3
3
|
# ==============
|
4
4
|
When /^I submit a request to shorten the url "([^\"]*)"$/ do |url|
|
5
|
-
@
|
5
|
+
@response = client.shorten(url)
|
6
6
|
end
|
7
7
|
|
8
8
|
When /^I submit a request to shorten the urls "([^\"]*)" and "([^\"]*)"$/ do |url1, url2|
|
9
|
-
@
|
9
|
+
@response = client.shorten(url1, url2)
|
10
10
|
end
|
11
11
|
|
12
12
|
|
13
13
|
When /^I submit a request to expand a short url using the hash "([^\"]*)"$/ do |hash|
|
14
|
-
@
|
14
|
+
@response = client.expand(:hash => hash)
|
15
15
|
end
|
16
16
|
|
17
17
|
When /^I submit a request to expand a short url using the short url "([^\"]*)"$/ do |short_url|
|
18
|
-
@
|
18
|
+
@response = client.expand(:shortUrl => short_url)
|
19
19
|
end
|
20
20
|
|
21
21
|
When /^I submit a request to get stats for a short url using the hash "([^\"]*)"$/ do |hash|
|
22
|
-
@
|
22
|
+
@response = client.stats(:hash => hash)
|
23
23
|
end
|
24
24
|
|
25
25
|
When /^I submit a request to get stats for a short url using the short url "([^\"]*)"$/ do |short_url|
|
26
|
-
@
|
26
|
+
@response = client.stats(:shortUrl => short_url)
|
27
27
|
end
|
28
28
|
|
29
29
|
When /^I submit a request to get info for a short url using the hash "([^\"]*)"$/ do |hash|
|
30
|
-
@
|
30
|
+
@response = client.info(:hash => hash)
|
31
31
|
end
|
32
32
|
|
33
33
|
When /^I submit a request to get info for a short url using the short url "([^\"]*)"$/ do |short_url|
|
34
|
-
@
|
34
|
+
@response = client.info(:shortUrl => short_url)
|
35
35
|
end
|
36
36
|
|
37
37
|
# ==============
|
38
38
|
# = Then Steps =
|
39
39
|
# ==============
|
40
40
|
Then /^I should get the response from "([^\"]*)"$/ do |arg1|
|
41
|
-
@
|
41
|
+
@response.should_not be_nil
|
42
42
|
end
|
43
43
|
|
44
44
|
Then /^the shorten url should be "([^\"]*)"$/ do |short_url|
|
45
|
-
@
|
45
|
+
@response.urls.should eql(short_url)
|
46
46
|
end
|
47
47
|
|
48
48
|
Then /^the shorten url should be "([^\"]*)" and "([^\"]*)"$/ do |expanded_url1, expanded_url2|
|
49
|
-
@
|
50
|
-
res['shortUrl'].should eql(expanded_url1) if res['nodeKey'] == 'http://www.github.com/nas'
|
51
|
-
res['shortUrl'].should eql(expanded_url2) if res['nodeKey'] == 'http://www.google.com'
|
52
|
-
end
|
49
|
+
@response.urls.should include(expanded_url1, expanded_url2)
|
53
50
|
end
|
54
51
|
|
55
52
|
Then /^the hash values should be "([^\"]*)" and "([^\"]*)"$/ do |hash1, hash2|
|
56
|
-
@
|
57
|
-
res['hash'].should eql(hash1) if res['nodeKey'] == 'http://www.github.com/nas'
|
58
|
-
res['hash'].should eql(hash2) if res['nodeKey'] == 'http://www.google.com'
|
59
|
-
end
|
53
|
+
@response.hashes.should include(hash1, hash2)
|
60
54
|
end
|
61
55
|
|
62
56
|
|
63
57
|
Then /^the hash should be "([^\"]*)"$/ do |hash|
|
64
|
-
@
|
58
|
+
@response.hashes.should eql(hash)
|
65
59
|
end
|
66
60
|
|
67
|
-
Then /^the expanded url should be "([^\"]*)"$/ do |expanded_url|
|
68
|
-
@
|
61
|
+
Then /^the expanded url should be "([^\"]*)" for "([^\"]*)"$/ do |expanded_url, request_parameter|
|
62
|
+
@response.url.should eql(expanded_url)
|
69
63
|
end
|
70
64
|
|
71
65
|
Then /^the result should have "([^\"]*)" and "([^\"]*)" keys in the returned hash$/ do |key1,key2|
|
72
|
-
@result.keys.should include(key1, key2)
|
66
|
+
@response.result.keys.should include(key1, key2)
|
73
67
|
end
|
74
68
|
|
75
69
|
Then /^the result should have "([^\"]*)" key in the returned hash$/ do |key|
|
76
|
-
@result.keys.should include(key)
|
70
|
+
@response.result.keys.should include(key)
|
77
71
|
end
|
78
72
|
|
79
73
|
Then /^the result doc hash should have "([^\"]*)", "([^\"]*)", "([^\"]*)", etc keys$/ do |key1, key2, key3|
|
80
|
-
@result['doc'].keys.should include(key1, key2, key3)
|
74
|
+
@response.result['doc'].keys.should include(key1, key2, key3)
|
81
75
|
end
|
82
76
|
|
83
77
|
private
|
data/lib/url_shortener/client.rb
CHANGED
@@ -16,29 +16,30 @@ module UrlShortener
|
|
16
16
|
# duplicate keys in a hash hence this solution
|
17
17
|
urls.collect!{|url| CGI.escape(url)}
|
18
18
|
end_point_with_params = "#{end_point('shorten')}?longUrl=#{urls.join('&longUrl=')}"
|
19
|
-
interface(end_point_with_params).get
|
19
|
+
response = interface(end_point_with_params).get
|
20
|
+
UrlShortener::Response::Shorten.new(response)
|
20
21
|
end
|
21
22
|
|
22
23
|
# Provide parameter as a key value pair of existing short url or its hash
|
23
24
|
# e.g. expand :shortUrl => 'http://bit.ly/15DlK' OR :hash => '31IqMl'
|
24
25
|
def expand(option)
|
25
26
|
check_request_parameters(option)
|
26
|
-
|
27
|
-
|
28
|
-
result = interface(nil, {:rest_url => end_point('expand')}.merge(option)).get[request_param]
|
29
|
-
return result['longUrl'] if result
|
27
|
+
response = interface(nil, endpoint_with_options('expand',option)).get
|
28
|
+
UrlShortener::Response::Expand.new(response)
|
30
29
|
end
|
31
30
|
|
32
31
|
# Provide parameter as a key value pair of existing short url or its hash
|
33
32
|
# e.g. stats :shortUrl => 'http://bit.ly/15DlK' #OR :hash => '31IqMl'
|
34
33
|
def stats(option)
|
35
34
|
check_request_parameters(option)
|
36
|
-
interface(nil,
|
35
|
+
response = interface(nil, endpoint_with_options('stats',option)).get
|
36
|
+
UrlShortener::Response.new(response)
|
37
37
|
end
|
38
38
|
|
39
39
|
def info(option)
|
40
40
|
check_request_parameters(option)
|
41
|
-
interface(nil,
|
41
|
+
response = interface(nil, endpoint_with_options('info',option)).get
|
42
|
+
UrlShortener::Response.new(response)
|
42
43
|
end
|
43
44
|
|
44
45
|
# If a complex url need to be passed then use end_point_with_params else
|
@@ -69,6 +70,10 @@ module UrlShortener
|
|
69
70
|
|
70
71
|
private
|
71
72
|
|
73
|
+
def endpoint_with_options(resource, option)
|
74
|
+
{:rest_url => end_point(resource)}.merge(option)
|
75
|
+
end
|
76
|
+
|
72
77
|
def check_request_parameters(option)
|
73
78
|
unless (option[:hash] || option[:shortUrl])
|
74
79
|
raise UrlShortener::IncompleteRequestParameter, "Either hash or the shorUrl is required to complete the operation."
|
data/lib/url_shortener/error.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
module UrlShortener
|
2
|
+
|
3
|
+
class Response::Expand < UrlShortener::Response
|
4
|
+
|
5
|
+
def initialize(response)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def url
|
10
|
+
return unless result_present?
|
11
|
+
return unless key_present?
|
12
|
+
url_hash = result.keys.first
|
13
|
+
result[url_hash]['longUrl']
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def result_present?
|
19
|
+
result && !result.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def key_present?
|
23
|
+
result_present?
|
24
|
+
result.keys && !result.keys.empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module UrlShortener
|
2
|
+
class Response::Shorten < UrlShortener::Response
|
3
|
+
|
4
|
+
def initialize(response)
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
def urls
|
9
|
+
raise_if_no_result
|
10
|
+
return result['nodeKeyVal']['shortUrl'] unless result['nodeKeyVal'].is_a?(Array)
|
11
|
+
result['nodeKeyVal'].collect{|res| res['shortUrl']}
|
12
|
+
end
|
13
|
+
|
14
|
+
def urls_with_long_url_keys
|
15
|
+
raise_if_no_result
|
16
|
+
return_single_or_mutiple_hash_values('shortUrl')
|
17
|
+
end
|
18
|
+
|
19
|
+
def hashes
|
20
|
+
raise_if_no_result
|
21
|
+
return result['nodeKeyVal']['hash'] unless result['nodeKeyVal'].is_a?(Array)
|
22
|
+
result['nodeKeyVal'].collect{|res| res['hash']}
|
23
|
+
end
|
24
|
+
|
25
|
+
def hashes_with_long_url_keys
|
26
|
+
raise_if_no_result
|
27
|
+
return_single_or_mutiple_hash_values('hash')
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def return_single_or_mutiple_hash_values(value)
|
33
|
+
return long_url_with_result(value) unless result['nodeKeyVal'].is_a?(Array)
|
34
|
+
return array_of_long_url_with_result(value)
|
35
|
+
end
|
36
|
+
|
37
|
+
def long_url_with_result(value)
|
38
|
+
hash = {}
|
39
|
+
hash[result['nodeKeyVal']['nodeKey']] = result['nodeKeyVal'][value]
|
40
|
+
return hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def array_of_long_url_with_result(value)
|
44
|
+
hash = {}
|
45
|
+
result['nodeKeyVal'].collect{|res| hash[res['nodeKey']] = res[value]}
|
46
|
+
return hash
|
47
|
+
end
|
48
|
+
|
49
|
+
def raise_if_no_result
|
50
|
+
if result.nil? || result['nodeKeyVal'].nil?
|
51
|
+
raise UrlShortener::NoResult, "Empty Result set."
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/url_shortener.rb
CHANGED
@@ -7,4 +7,7 @@ require 'cgi'
|
|
7
7
|
require 'url_shortener/error.rb'
|
8
8
|
require 'url_shortener/authorize.rb'
|
9
9
|
require 'url_shortener/client.rb'
|
10
|
-
require 'url_shortener/interface.rb'
|
10
|
+
require 'url_shortener/interface.rb'
|
11
|
+
require 'url_shortener/response.rb'
|
12
|
+
require 'url_shortener/response/shorten.rb'
|
13
|
+
require 'url_shortener/response/expand.rb'
|
@@ -115,6 +115,10 @@ describe UrlShortener::Client do
|
|
115
115
|
@interface.should_receive(:get)
|
116
116
|
@client.shorten(@url)
|
117
117
|
end
|
118
|
+
|
119
|
+
it "should return the UrlShortener::Response::Shorten object" do
|
120
|
+
@client.shorten(@url).should be_instance_of(UrlShortener::Response::Shorten)
|
121
|
+
end
|
118
122
|
|
119
123
|
end
|
120
124
|
|
@@ -218,12 +222,16 @@ describe UrlShortener::Client do
|
|
218
222
|
|
219
223
|
it "should return the long url of the hash provided" do
|
220
224
|
@interface.should_receive(:get).and_return('qweWE' => {'longUrl' => 'http://www.goog.com'})
|
221
|
-
@client.expand(:hash => @hash).should
|
225
|
+
@client.expand(:hash => @hash).result['qweWE'].values.should include('http://www.goog.com')
|
222
226
|
end
|
223
227
|
|
224
228
|
it "should return the long url for the shortUrl provided" do
|
225
229
|
@interface.should_receive(:get).and_return('wesSD' => {'longUrl' => 'http://www.goog.com'})
|
226
|
-
@client.expand(:shortUrl => @short_url).should
|
230
|
+
@client.expand(:shortUrl => @short_url).result['wesSD'].values.should include('http://www.goog.com')
|
231
|
+
end
|
232
|
+
|
233
|
+
it "should return the UrlShortener::Response::Expand object" do
|
234
|
+
@client.expand(:hash => @hash).should be_instance_of(UrlShortener::Response::Expand)
|
227
235
|
end
|
228
236
|
|
229
237
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe UrlShortener::Response::Expand do
|
4
|
+
|
5
|
+
describe "#url" do
|
6
|
+
before(:each) do
|
7
|
+
@result_hash = {"1RmnUT" => {"longUrl" => "http://google.com"}}
|
8
|
+
@expand = UrlShortener::Response::Expand.new(@result_hash)
|
9
|
+
@expand.stub!(:result).and_return(@result_hash)
|
10
|
+
@keys = ['1RmnUT']
|
11
|
+
@key = '1RmnUT'
|
12
|
+
@result_hash.stub!(:keys).and_return(@keys)
|
13
|
+
@keys.stub!(:first).and_return(@key)
|
14
|
+
@expand.stub!(:result_present?).and_return(true)
|
15
|
+
@expand.stub!(:key_present?).and_return(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should check if keys are present when results are present" do
|
19
|
+
@expand.stub!(:result_present?).and_return(true)
|
20
|
+
@expand.should_receive(:key_present?)
|
21
|
+
@expand.url.should
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should not check if keys are present when results are not present" do
|
25
|
+
@expand.stub!(:result_present?).and_return(false)
|
26
|
+
@expand.should_receive(:key_present?).never
|
27
|
+
@expand.url.should
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return nil if there are no keys" do
|
31
|
+
@expand.stub!(:key_present?).and_return(nil)
|
32
|
+
@expand.url.should eql(nil)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should check if results are present" do
|
36
|
+
@expand.should_receive(:result_present?)
|
37
|
+
@expand.url.should
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return nil is result is not present" do
|
41
|
+
@expand.stub!(:result_present?).and_return(nil)
|
42
|
+
@expand.url.should eql(nil)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should get the result" do
|
46
|
+
@expand.should_receive(:result).and_return(@result_hash)
|
47
|
+
@expand.url
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should find the keys in the result returned from bitley" do
|
51
|
+
@result_hash.should_receive(:keys).and_return(@keys)
|
52
|
+
@expand.url
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should get first key as there will be only key returning from bitly" do
|
56
|
+
@keys.should_receive(:first).and_return(@key)
|
57
|
+
@expand.url
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return the longUrl" do
|
61
|
+
@expand.url.should eql("http://google.com")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,278 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe UrlShortener::Response::Shorten do
|
4
|
+
|
5
|
+
describe "#urls" do
|
6
|
+
before(:each) do
|
7
|
+
@response = {'nodeKeyVal' => {'shortUrl' => 'http://a/short/url'}}
|
8
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
9
|
+
@shorten_response.stub!(:result).and_return(@response)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should get the result" do
|
13
|
+
@shorten_response.should_receive(:result).at_least(1).and_return(@response)
|
14
|
+
@shorten_response.urls
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should check whether result's nodeKeyVal values is an array" do
|
18
|
+
@response['nodeKeyVal'].should_receive(:is_a?).with(Array)
|
19
|
+
@shorten_response.urls
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should raise when there are no results" do
|
23
|
+
@shorten_response.should_receive(:raise_if_no_result)
|
24
|
+
@shorten_response.urls
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "when no results are returned" do
|
28
|
+
before(:each) do
|
29
|
+
@response = {}
|
30
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should raise error if there is no 'nodeKeyVal' key in the response parameter" do
|
34
|
+
lambda { @shorten_response.urls }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should raise error when if the response parameter or result is empty?" do
|
38
|
+
@response = nil
|
39
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
40
|
+
lambda { @shorten_response.urls }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "when returned result is not an array" do
|
45
|
+
before(:each) do
|
46
|
+
@response['nodeKeyVal'].stub!(:is_a?).and_return(false)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should return the short url" do
|
50
|
+
@shorten_response.urls.should eql('http://a/short/url')
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "when returned result is an array" do
|
56
|
+
before(:each) do
|
57
|
+
@response = {'nodeKeyVal' => [{'shortUrl' => 'http://a/short/url'}, {'shortUrl' => 'http://another/short/url'}]}
|
58
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
59
|
+
@shorten_response.stub!(:result).and_return(@response)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return an array of short urls" do
|
63
|
+
@shorten_response.urls.should include('http://a/short/url', 'http://another/short/url')
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#urls with long url keys" do
|
71
|
+
before(:each) do
|
72
|
+
@response = {'nodeKeyVal' => {'shortUrl' => 'http://a/short/url', 'nodeKey' => 'http://a/long/url'}}
|
73
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
74
|
+
@shorten_response.stub!(:result).and_return(@response)
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "when no results are returned" do
|
78
|
+
before(:each) do
|
79
|
+
@response = {}
|
80
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise error if there is no 'nodeKeyVal' key in the response parameter" do
|
84
|
+
lambda { @shorten_response.urls_with_long_url_keys }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should raise error when if the response parameter or result is empty?" do
|
88
|
+
@response = nil
|
89
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
90
|
+
lambda { @shorten_response.urls_with_long_url_keys }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "when returned result is not an array" do
|
95
|
+
before(:each) do
|
96
|
+
@response['nodeKeyVal'].stub!(:is_a?).and_return(false)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should return the long url as the hash key" do
|
100
|
+
@shorten_response.urls_with_long_url_keys.keys.should include('http://a/long/url')
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should return the short url as the hash value" do
|
104
|
+
@shorten_response.urls_with_long_url_keys.values.should include('http://a/short/url')
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "when returned result is an array" do
|
110
|
+
before(:each) do
|
111
|
+
@response = {'nodeKeyVal' => [{'shortUrl' => 'http://a1/short/url', 'nodeKey' => 'http://a1/long/url'},
|
112
|
+
{'shortUrl' => 'http://a2/short/url', 'nodeKey' => 'http://a2/long/url'}]}
|
113
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
114
|
+
@shorten_response.stub!(:result).and_return(@response)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should return long urls as keys" do
|
118
|
+
@shorten_response.urls_with_long_url_keys.keys.should include('http://a1/long/url', 'http://a2/long/url')
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should return short urls as values" do
|
122
|
+
@shorten_response.urls_with_long_url_keys.values.should include('http://a1/short/url', 'http://a2/short/url')
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should have the first long url key value set to the first short url" do
|
126
|
+
@shorten_response.urls_with_long_url_keys['http://a1/long/url'].should eql('http://a1/short/url')
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should have the second long url key value set to the second short url" do
|
130
|
+
@shorten_response.urls_with_long_url_keys['http://a2/long/url'].should eql('http://a2/short/url')
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should only have two keys values when two short urls are returned" do
|
134
|
+
@shorten_response.urls_with_long_url_keys.size.should eql(2)
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "#hashes" do
|
142
|
+
|
143
|
+
before(:each) do
|
144
|
+
@response = {'nodeKeyVal' => {'hash' => 'aHash'}}
|
145
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
146
|
+
@shorten_response.stub!(:result).and_return(@response)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should get the result" do
|
150
|
+
@shorten_response.should_receive(:result).at_least(1).and_return(@response)
|
151
|
+
@shorten_response.hashes
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should check whether result's nodeKeyVal values is an array" do
|
155
|
+
@response['nodeKeyVal'].should_receive(:is_a?).with(Array)
|
156
|
+
@shorten_response.hashes
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should raise when there are no results" do
|
160
|
+
@shorten_response.should_receive(:raise_if_no_result)
|
161
|
+
@shorten_response.hashes
|
162
|
+
end
|
163
|
+
|
164
|
+
describe "when no results are returned" do
|
165
|
+
before(:each) do
|
166
|
+
@response = {}
|
167
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should raise error if there is no 'nodeKeyVal' key in the response parameter" do
|
171
|
+
lambda { @shorten_response.hashes }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should raise error when if the response parameter or result is empty?" do
|
175
|
+
@response = nil
|
176
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
177
|
+
lambda { @shorten_response.hashes }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe "when returned result is not an array" do
|
182
|
+
before(:each) do
|
183
|
+
@response['nodeKeyVal'].stub!(:is_a?).and_return(false)
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should return the short url" do
|
187
|
+
@shorten_response.hashes.should eql('aHash')
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "when returned result is an array" do
|
193
|
+
before(:each) do
|
194
|
+
@response = {'nodeKeyVal' => [{'hash' => 'aHash'}, {'hash' => 'anHash'}]}
|
195
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
196
|
+
@shorten_response.stub!(:result).and_return(@response)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "should return an array of hashes" do
|
200
|
+
@shorten_response.hashes.should include('aHash', 'anHash')
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "#hashes with long url keys" do
|
208
|
+
before(:each) do
|
209
|
+
@response = {'nodeKeyVal' => {'hash' => 'aHash', 'nodeKey' => 'http://a/long/url'}}
|
210
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
211
|
+
@shorten_response.stub!(:result).and_return(@response)
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "when no results are returned" do
|
215
|
+
before(:each) do
|
216
|
+
@response = {}
|
217
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should raise error if there is no 'nodeKeyVal' key in the response parameter" do
|
221
|
+
lambda { @shorten_response.hashes_with_long_url_keys }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should raise error when if the response parameter or result is empty?" do
|
225
|
+
@response = nil
|
226
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
227
|
+
lambda { @shorten_response.hashes_with_long_url_keys }.should raise_error(UrlShortener::NoResult, "Empty Result set.")
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "when returned result is not an array" do
|
232
|
+
before(:each) do
|
233
|
+
@response['nodeKeyVal'].stub!(:is_a?).and_return(false)
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should return the long url as the hash key" do
|
237
|
+
@shorten_response.hashes_with_long_url_keys.keys.should include('http://a/long/url')
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should return the short url as the hash value" do
|
241
|
+
@shorten_response.hashes_with_long_url_keys.values.should include('aHash')
|
242
|
+
end
|
243
|
+
|
244
|
+
end
|
245
|
+
|
246
|
+
describe "when returned result is an array" do
|
247
|
+
before(:each) do
|
248
|
+
@response = {'nodeKeyVal' => [{'hash' => 'a1Hash', 'nodeKey' => 'http://a1/long/url'},
|
249
|
+
{'hash' => 'a2Hash', 'nodeKey' => 'http://a2/long/url'}]}
|
250
|
+
@shorten_response = UrlShortener::Response::Shorten.new(@response)
|
251
|
+
@shorten_response.stub!(:result).and_return(@response)
|
252
|
+
end
|
253
|
+
|
254
|
+
it "should return long urls as keys" do
|
255
|
+
@shorten_response.hashes_with_long_url_keys.keys.should include('http://a1/long/url', 'http://a2/long/url')
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should return hashes as values" do
|
259
|
+
@shorten_response.hashes_with_long_url_keys.values.should include('a1Hash', 'a2Hash')
|
260
|
+
end
|
261
|
+
|
262
|
+
it "should have the first long url key value set to the first hash value" do
|
263
|
+
@shorten_response.hashes_with_long_url_keys['http://a1/long/url'].should eql('a1Hash')
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should have the second long url key value set to the second hash value" do
|
267
|
+
@shorten_response.hashes_with_long_url_keys['http://a2/long/url'].should eql('a2Hash')
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should only have two keys values when two short urls are returned" do
|
271
|
+
@shorten_response.hashes_with_long_url_keys.size.should eql(2)
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
275
|
+
|
276
|
+
end
|
277
|
+
|
278
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe UrlShortener::Response do
|
4
|
+
|
5
|
+
describe ".new" do
|
6
|
+
before(:each) do
|
7
|
+
@response = {:a_key => 'value'}
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should set the result attribute" do
|
11
|
+
response = UrlShortener::Response.new(@response)
|
12
|
+
response.result.should eql(@response)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: url_shortener
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nasir Jamal
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-15 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,7 +22,7 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 0.4.5
|
24
24
|
version:
|
25
|
-
description: Url Shortener is a Ruby library / gem and API wrapper for bit.ly to shorten
|
25
|
+
description: Url Shortener is a Ruby library / gem and API wrapper for bit.ly to shorten/expand the urls and retrieve other information about them.
|
26
26
|
email: nas35_in@yahoo.com
|
27
27
|
executables: []
|
28
28
|
|
@@ -39,6 +39,9 @@ files:
|
|
39
39
|
- lib/url_shortener/client.rb
|
40
40
|
- lib/url_shortener/error.rb
|
41
41
|
- lib/url_shortener/interface.rb
|
42
|
+
- lib/url_shortener/response.rb
|
43
|
+
- lib/url_shortener/response/shorten.rb
|
44
|
+
- lib/url_shortener/response/expand.rb
|
42
45
|
has_rdoc: true
|
43
46
|
homepage: http://github.com/nas/url_shortener
|
44
47
|
licenses: []
|
@@ -72,6 +75,9 @@ test_files:
|
|
72
75
|
- spec/url_shortener/authorize_spec.rb
|
73
76
|
- spec/url_shortener/client_spec.rb
|
74
77
|
- spec/url_shortener/interface_spec.rb
|
78
|
+
- spec/url_shortener/response_spec.rb
|
79
|
+
- spec/url_shortener/response/shorten_spec.rb
|
80
|
+
- spec/url_shortener/response/expand_spec.rb
|
75
81
|
- features/api_calls.feature
|
76
82
|
- features/request_failure.feature
|
77
83
|
- features/support/env.rb
|