bitly 0.2 → 0.3
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 +14 -0
- data/README.txt +5 -3
- data/bitly.gemspec +4 -4
- data/lib/bitly/client.rb +14 -12
- data/lib/bitly/url.rb +47 -7
- data/lib/bitly/utils.rb +6 -3
- data/lib/bitly/version.rb +1 -1
- data/test/bitly/test_client.rb +187 -0
- data/test/bitly/test_url.rb +168 -0
- data/test/bitly/test_utils.rb +76 -0
- data/test/test_bitly.rb +81 -65
- data/test/test_helper.rb +29 -0
- metadata +6 -2
data/History.txt
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
=== 0.3 / 2009-07-09
|
2
|
+
|
3
|
+
* 1 major enhancement
|
4
|
+
|
5
|
+
* a full set of tests, properly mocked
|
6
|
+
|
7
|
+
* 1 minor enhancement
|
8
|
+
|
9
|
+
* calling bitly.shorten(:history => 1) will add the url to the api user's history.
|
10
|
+
|
11
|
+
* 1 bug fix
|
12
|
+
|
13
|
+
* you can no longer call shorten with a keyword, this was unsupported in the API and consequently removed
|
14
|
+
|
1
15
|
=== 0.2 / 2009-06-23
|
2
16
|
|
3
17
|
* 1 enhancement
|
data/README.txt
CHANGED
@@ -6,6 +6,10 @@ A Ruby API for bit.ly
|
|
6
6
|
|
7
7
|
http://code.google.com/p/bitly-api/wiki/ApiDocumentation
|
8
8
|
|
9
|
+
== INSTALLATION:
|
10
|
+
|
11
|
+
gem install bitly
|
12
|
+
|
9
13
|
== USAGE:
|
10
14
|
|
11
15
|
Create a Bitly client using your username and api key as follows:
|
@@ -15,7 +19,7 @@ bitly = Bitly.new(username, api_key)
|
|
15
19
|
You can then use that client to shorten or expand urls or return more information or statistics as so:
|
16
20
|
|
17
21
|
bitly.shorten('http://www.google.com')
|
18
|
-
bitly.shorten('http://www.google.com',
|
22
|
+
bitly.shorten('http://www.google.com', :history => 1) # adds the url to the api user's history
|
19
23
|
bitly.expand('wQaT')
|
20
24
|
bitly.info('http://bit.ly/wQaT')
|
21
25
|
bitly.stats('http://bit.ly/wQaT')
|
@@ -33,8 +37,6 @@ u.hash #=> "2V6CFi"
|
|
33
37
|
u.info #=> a ruby hash of the JSON returned from the API
|
34
38
|
u.stats #=> a ruby hash of the JSON returned from the API
|
35
39
|
|
36
|
-
You should be able to specify a keyword when shortening (though at last test, this didn't seem to be working http://code.google.com/p/bitly-api/issues/detail?id=5). To do so, just add a keyword parameter:
|
37
|
-
|
38
40
|
bitly.shorten('http://www.google.com', 'keyword')
|
39
41
|
|
40
42
|
== LICENSE:
|
data/bitly.gemspec
CHANGED
@@ -2,22 +2,22 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{bitly}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Phil Nash"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-07-09}
|
10
10
|
s.description = %q{Use the bit.ly API to shorten or expand URLs}
|
11
11
|
s.email = %q{philnash@gmail.com}
|
12
12
|
s.extra_rdoc_files = ["lib/bitly/client.rb", "lib/bitly/url.rb", "lib/bitly/utils.rb", "lib/bitly/version.rb", "lib/bitly.rb", "README.txt"]
|
13
|
-
s.files = ["bitly.gemspec", "History.txt", "lib/bitly/client.rb", "lib/bitly/url.rb", "lib/bitly/utils.rb", "lib/bitly/version.rb", "lib/bitly.rb", "Manifest", "Rakefile", "README.txt", "test/test_bitly.rb"]
|
13
|
+
s.files = ["bitly.gemspec", "History.txt", "lib/bitly/client.rb", "lib/bitly/url.rb", "lib/bitly/utils.rb", "lib/bitly/version.rb", "lib/bitly.rb", "Manifest", "Rakefile", "README.txt", "test/test_bitly.rb", "test/bitly/test_client.rb", "test/bitly/test_url.rb", "test/bitly/test_utils.rb", "test/test_helper.rb"]
|
14
14
|
s.homepage = %q{http://github.com/philnash/bitly}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Bitly", "--main", "README.txt"]
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = %q{bitly}
|
18
18
|
s.rubygems_version = %q{1.3.4}
|
19
19
|
s.summary = %q{Use the bit.ly API to shorten or expand URLs}
|
20
|
-
s.test_files = ["test/test_bitly.rb"]
|
20
|
+
s.test_files = ["test/bitly/test_client.rb", "test/bitly/test_url.rb", "test/bitly/test_utils.rb", "test/test_bitly.rb", "test/test_helper.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
data/lib/bitly/client.rb
CHANGED
@@ -18,15 +18,15 @@ module Bitly
|
|
18
18
|
@login = login
|
19
19
|
@api_key = api_key
|
20
20
|
end
|
21
|
-
|
22
|
-
def shorten(input,
|
21
|
+
|
22
|
+
def shorten(input, opts={})
|
23
23
|
if input.is_a? String
|
24
|
-
request = create_url
|
24
|
+
request = create_url("shorten", :longUrl => input, :history => (opts[:history] ? 1 : nil))
|
25
25
|
result = get_result(request)
|
26
26
|
result = {:long_url => input}.merge result[input]
|
27
27
|
Bitly::Url.new(@login,@api_key,result)
|
28
28
|
elsif input.is_a? Array
|
29
|
-
request = create_url
|
29
|
+
request = create_url("shorten", :history => (opts[:history] ? 1 : nil))
|
30
30
|
request.query << "&" + input.map { |long_url| "longUrl=#{CGI.escape(long_url)}" }.join("&") unless input.nil?
|
31
31
|
result = get_result(request)
|
32
32
|
input.map do |long_url|
|
@@ -34,14 +34,14 @@ module Bitly
|
|
34
34
|
long_url = Bitly::Url.new(@login,@api_key,new_url)
|
35
35
|
end
|
36
36
|
else
|
37
|
-
raise ArgumentError
|
37
|
+
raise ArgumentError.new("Shorten requires either a url or an array of urls")
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def expand(input)
|
42
42
|
if input.is_a? String
|
43
43
|
if input.include? "bit.ly/"
|
44
|
-
hash = input
|
44
|
+
hash = create_hash_from_url(input)
|
45
45
|
request = create_url "expand", :hash => hash
|
46
46
|
result = get_result(request)
|
47
47
|
result = { :short_url => input, :hash => hash }.merge result[hash]
|
@@ -59,14 +59,14 @@ module Bitly
|
|
59
59
|
hsh = Bitly::Url.new(@login,@api_key,new_url)
|
60
60
|
end
|
61
61
|
else
|
62
|
-
raise ArgumentError
|
62
|
+
raise ArgumentError('Expand requires either a short url, a hash or an array of hashes')
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
def info(input)
|
67
67
|
if input.is_a? String
|
68
68
|
if input.include? "bit.ly/"
|
69
|
-
hash = input
|
69
|
+
hash = create_hash_from_url(input)
|
70
70
|
request = create_url 'info', :hash => hash
|
71
71
|
result = get_result(request)
|
72
72
|
result = { :short_url => "http://bit.ly/#{hash}", :hash => hash }.merge result[hash]
|
@@ -83,13 +83,15 @@ module Bitly
|
|
83
83
|
new_url = {:hash => hsh, :short_url => "http://bit.ly/#{hsh}"}.merge result[hsh]
|
84
84
|
hsh = Bitly::Url.new(@login,@api_key,:info => new_url)
|
85
85
|
end
|
86
|
+
else
|
87
|
+
raise ArgumentError.new('Info requires either a short url, a hash or an array of hashes')
|
86
88
|
end
|
87
89
|
end
|
88
90
|
|
89
91
|
def stats(input)
|
90
92
|
if input.is_a? String
|
91
93
|
if input.include? "bit.ly/"
|
92
|
-
hash = input
|
94
|
+
hash = create_hash_from_url(input)
|
93
95
|
request = create_url 'stats', :hash => hash
|
94
96
|
result = get_result(request)
|
95
97
|
result = { :short_url => "http://bit.ly/#{hash}", :hash => hash }.merge result
|
@@ -100,7 +102,7 @@ module Bitly
|
|
100
102
|
end
|
101
103
|
Bitly::Url.new(@login,@api_key,:stats => result)
|
102
104
|
else
|
103
|
-
raise ArgumentError
|
105
|
+
raise ArgumentError.new("Stats requires either a short url or a hash")
|
104
106
|
end
|
105
107
|
end
|
106
108
|
|
@@ -111,9 +113,9 @@ end
|
|
111
113
|
class BitlyError < StandardError
|
112
114
|
attr_reader :code
|
113
115
|
alias :msg :message
|
114
|
-
def initialize(msg, code
|
116
|
+
def initialize(msg, code)
|
115
117
|
@code = code
|
116
|
-
super("
|
118
|
+
super("#{msg} - '#{code}'")
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
data/lib/bitly/url.rb
CHANGED
@@ -3,19 +3,55 @@ module Bitly
|
|
3
3
|
class Url
|
4
4
|
include Bitly::Utils
|
5
5
|
|
6
|
-
|
6
|
+
attr_accessor :long_url, :short_url, :hash, :user_hash
|
7
|
+
attr_reader :info, :stats
|
8
|
+
VARIABLES = ['long_url', 'short_url', 'hash', 'user_hash']
|
7
9
|
|
8
10
|
def initialize(login,api_key,obj=nil)
|
9
11
|
unless obj.nil?
|
10
|
-
|
11
|
-
raise BitlyError.new(obj['errorMessage'],obj['errorCode'],'expand') if obj['statusCode'] == "ERROR"
|
12
|
-
|
12
|
+
raise BitlyError.new(result['errorMessage'],result['errorCode']) if obj['statusCode'] == "ERROR"
|
13
13
|
instance_variablise(obj, VARIABLES)
|
14
14
|
@info = obj[:info] if obj[:info]
|
15
15
|
@stats = obj[:stats] if obj[:stats]
|
16
16
|
end
|
17
17
|
@login = login
|
18
18
|
@api_key = api_key
|
19
|
+
raise ArgumentError.new("Please provide a login and api_key") if @login.nil? || @api_key.nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
def shorten(opts = {})
|
23
|
+
return @short_url if @short_url
|
24
|
+
unless @long_url.nil?
|
25
|
+
request = create_url("shorten", :longUrl => @long_url, :history => (opts[:history] ? 1 : nil))
|
26
|
+
result = get_result(request)[@long_url.gsub(/\/$/,'')]
|
27
|
+
if result['statusCode'] == "ERROR"
|
28
|
+
raise BitlyError.new(result['errorMessage'],result['errorCode'])
|
29
|
+
else
|
30
|
+
instance_variablise(result,VARIABLES)
|
31
|
+
return @short_url
|
32
|
+
end
|
33
|
+
else
|
34
|
+
raise ArgumentError.new("You need a long_url in order to shorten it")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def expand
|
39
|
+
return @long_url if @long_url
|
40
|
+
unless !(@short_url || @hash)
|
41
|
+
unless @hash
|
42
|
+
@hash = create_hash_from_url(@short_url)
|
43
|
+
end
|
44
|
+
request = create_url("expand", :hash => @hash)
|
45
|
+
result = get_result(request)[@hash]
|
46
|
+
if result['statusCode'] == "ERROR"
|
47
|
+
raise BitlyError.new(result['errorMessage'],result['errorCode'])
|
48
|
+
else
|
49
|
+
instance_variablise(result,VARIABLES)
|
50
|
+
return @long_url
|
51
|
+
end
|
52
|
+
else
|
53
|
+
raise ArgumentError.new("You need a short_url or a hash in order to expand it")
|
54
|
+
end
|
19
55
|
end
|
20
56
|
|
21
57
|
def info
|
@@ -26,14 +62,15 @@ module Bitly
|
|
26
62
|
instance_variablise(result, VARIABLES)
|
27
63
|
@info = result
|
28
64
|
elsif @short_url
|
29
|
-
hash = @short_url
|
65
|
+
@hash = create_hash_from_url(@short_url)
|
30
66
|
request = create_url "info", :hash => hash
|
31
67
|
result = get_result(request)[hash]
|
32
68
|
instance_variablise(result, VARIABLES)
|
33
69
|
@info = result
|
34
70
|
else
|
35
|
-
|
71
|
+
raise ArgumentError.new("You need a hash or short_url in order to get info")
|
36
72
|
end
|
73
|
+
return @info
|
37
74
|
else
|
38
75
|
@info
|
39
76
|
end
|
@@ -44,7 +81,10 @@ module Bitly
|
|
44
81
|
if @hash
|
45
82
|
request = create_url "stats", :hash => @hash
|
46
83
|
elsif @short_url
|
47
|
-
|
84
|
+
@hash = create_hash_from_url(@short_url)
|
85
|
+
request = create_url "stats", :hash => @hash
|
86
|
+
else
|
87
|
+
raise ArgumentError.new("You need a hash or short_url in order to get stats")
|
48
88
|
end
|
49
89
|
@stats = get_result(request)
|
50
90
|
else
|
data/lib/bitly/utils.rb
CHANGED
@@ -2,7 +2,6 @@ require 'cgi'
|
|
2
2
|
|
3
3
|
module Bitly
|
4
4
|
module Utils
|
5
|
-
private
|
6
5
|
def underscore(camel_cased_word) # stolen from rails
|
7
6
|
camel_cased_word.to_s.gsub(/::/, '/').
|
8
7
|
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
@@ -11,6 +10,10 @@ module Bitly
|
|
11
10
|
downcase
|
12
11
|
end
|
13
12
|
|
13
|
+
def create_hash_from_url(url)
|
14
|
+
url.gsub(/^.*bit.ly\//,'')
|
15
|
+
end
|
16
|
+
|
14
17
|
def attr_define(k,v)
|
15
18
|
instance_variable_set("@#{k}", v)
|
16
19
|
meta = class << self; self; end
|
@@ -42,12 +45,12 @@ module Bitly
|
|
42
45
|
begin
|
43
46
|
result = Crack::JSON.parse(Net::HTTP.get(request))
|
44
47
|
rescue
|
45
|
-
result = {'
|
48
|
+
result = {'errorMessage' => 'JSON Parse Error(Bit.ly messed up)', 'errorCode' => 69, 'statusCode' => 'ERROR'}
|
46
49
|
end
|
47
50
|
if result['statusCode'] == "OK"
|
48
51
|
result = result['results']
|
49
52
|
else
|
50
|
-
raise BitlyError.new(result['errorMessage'],result['errorCode']
|
53
|
+
raise BitlyError.new(result['errorMessage'],result['errorCode'])
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
data/lib/bitly/version.rb
CHANGED
@@ -0,0 +1,187 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
|
2
|
+
|
3
|
+
class TestClient < Test::Unit::TestCase
|
4
|
+
context "bitly module" do
|
5
|
+
should "create a new bitly client" do
|
6
|
+
b = Bitly.new(login, api_key)
|
7
|
+
assert_equal Bitly::Client, b.class
|
8
|
+
end
|
9
|
+
end
|
10
|
+
context "using the bitly client" do
|
11
|
+
setup do
|
12
|
+
@bitly = Bitly.new(login, api_key)
|
13
|
+
end
|
14
|
+
|
15
|
+
context "shortening" do
|
16
|
+
context "a single link" do
|
17
|
+
setup do
|
18
|
+
stub_get(/^http:\/\/api.bit.ly\/shorten\?.*longUrl=.*cnn.com.*$/,"cnn.json")
|
19
|
+
@url = @bitly.shorten('http://cnn.com')
|
20
|
+
end
|
21
|
+
should "return a Bitly::Url" do
|
22
|
+
assert_kind_of Bitly::Url, @url
|
23
|
+
end
|
24
|
+
should "return a short bitly url" do
|
25
|
+
assert_equal "http://bit.ly/15DlK", @url.short_url
|
26
|
+
end
|
27
|
+
should "save the long url" do
|
28
|
+
assert_equal "http://cnn.com", @url.long_url
|
29
|
+
end
|
30
|
+
end
|
31
|
+
context "multiple links" do
|
32
|
+
setup do
|
33
|
+
stub_get(/^http:\/\/api.bit.ly\/shorten\?.*longUrl=.*longUrl=.*$/,"cnn_and_google.json")
|
34
|
+
@urls = @bitly.shorten(['http://cnn.com', 'http://google.com'])
|
35
|
+
end
|
36
|
+
should "return an array of Bitly::Urls" do
|
37
|
+
assert_kind_of Array, @urls
|
38
|
+
assert_kind_of Bitly::Url, @urls[0]
|
39
|
+
end
|
40
|
+
should "shorten the urls in order" do
|
41
|
+
assert_equal "http://bit.ly/15DlK", @urls[0].short_url
|
42
|
+
assert_equal "http://bit.ly/11etr", @urls[1].short_url
|
43
|
+
end
|
44
|
+
should "save the long urls" do
|
45
|
+
assert_equal "http://cnn.com", @urls[0].long_url
|
46
|
+
assert_equal "http://google.com", @urls[1].long_url
|
47
|
+
end
|
48
|
+
end
|
49
|
+
context "no links" do
|
50
|
+
should "raise an ArgumentError" do
|
51
|
+
assert_raise ArgumentError do
|
52
|
+
@bitly.shorten
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
context "expanding" do
|
58
|
+
context "a hash" do
|
59
|
+
setup do
|
60
|
+
stub_get(/^http:\/\/api.bit.ly\/expand\?.*hash=31IqMl.*$/,"expand_cnn.json")
|
61
|
+
@url = @bitly.expand("31IqMl")
|
62
|
+
end
|
63
|
+
should "return a Bitly::Url" do
|
64
|
+
assert_kind_of Bitly::Url, @url
|
65
|
+
end
|
66
|
+
should "return the expanded url" do
|
67
|
+
assert_equal "http://cnn.com/", @url.long_url
|
68
|
+
end
|
69
|
+
should "save the hash" do
|
70
|
+
assert_equal "31IqMl", @url.hash
|
71
|
+
end
|
72
|
+
should "save the short url" do
|
73
|
+
assert_equal "http://bit.ly/31IqMl", @url.short_url
|
74
|
+
end
|
75
|
+
end
|
76
|
+
context "a short url" do
|
77
|
+
setup do
|
78
|
+
stub_get(/^http:\/\/api.bit.ly\/expand\?.*hash=31IqMl.*$/,"expand_cnn.json")
|
79
|
+
@url = @bitly.expand("http://bit.ly/31IqMl")
|
80
|
+
end
|
81
|
+
should "return a Bitly::Url" do
|
82
|
+
assert_kind_of Bitly::Url, @url
|
83
|
+
end
|
84
|
+
should "return the expanded url" do
|
85
|
+
assert_equal "http://cnn.com/", @url.long_url
|
86
|
+
end
|
87
|
+
should "save the hash" do
|
88
|
+
assert_equal "31IqMl", @url.hash
|
89
|
+
end
|
90
|
+
should "save the short url" do
|
91
|
+
assert_equal "http://bit.ly/31IqMl", @url.short_url
|
92
|
+
end
|
93
|
+
end
|
94
|
+
context "multiple hashes" do
|
95
|
+
setup do
|
96
|
+
stub_get(/^http:\/\/api.bit.ly\/expand\?.*hash=15DlK.*3j4ir4.*$/,"expand_cnn_and_google.json")
|
97
|
+
@urls = @bitly.expand(["15DlK","3j4ir4"])
|
98
|
+
end
|
99
|
+
should "return an array of Bitly::Urls" do
|
100
|
+
assert_kind_of Array, @urls
|
101
|
+
assert_kind_of Bitly::Url, @urls[0]
|
102
|
+
assert_kind_of Bitly::Url, @urls[1]
|
103
|
+
end
|
104
|
+
should "expand the hashes in order" do
|
105
|
+
assert_equal "http://cnn.com/", @urls[0].long_url
|
106
|
+
assert_equal "http://google.com/", @urls[1].long_url
|
107
|
+
end
|
108
|
+
should "save the hash to each url" do
|
109
|
+
assert_equal "15DlK", @urls[0].hash
|
110
|
+
assert_equal "3j4ir4", @urls[1].hash
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
context "to get info on" do
|
115
|
+
context "a single link" do
|
116
|
+
setup do
|
117
|
+
stub_get(/^http:\/\/api.bit.ly\/info\?.*hash=3j4ir4.*$/,"google_info.json")
|
118
|
+
@url = @bitly.info('http://bit.ly/3j4ir4')
|
119
|
+
end
|
120
|
+
should "return a Bitly::Url" do
|
121
|
+
assert_kind_of Bitly::Url, @url
|
122
|
+
end
|
123
|
+
should "return an info object with the url" do
|
124
|
+
assert_not_nil @url.info
|
125
|
+
end
|
126
|
+
end
|
127
|
+
context "a single hash" do
|
128
|
+
setup do
|
129
|
+
stub_get(/^http:\/\/api.bit.ly\/info\?.*hash=3j4ir4.*$/,"google_info.json")
|
130
|
+
@url = @bitly.info('3j4ir4')
|
131
|
+
end
|
132
|
+
should "return a Bitly::Url" do
|
133
|
+
assert_kind_of Bitly::Url, @url
|
134
|
+
end
|
135
|
+
should "return an info object with the url" do
|
136
|
+
assert_not_nil @url.info
|
137
|
+
end
|
138
|
+
end
|
139
|
+
context "a list of hashes" do
|
140
|
+
setup do
|
141
|
+
stub_get(/^http:\/\/api.bit.ly\/info\?.*hash=3j4ir4.*31IqMl.*$/,"google_and_cnn_info.json")
|
142
|
+
@urls = @bitly.info(['3j4ir4','31IqMl'])
|
143
|
+
end
|
144
|
+
should "return a Bitly::Url" do
|
145
|
+
assert_kind_of Array, @urls
|
146
|
+
end
|
147
|
+
should "return an info object with the url" do
|
148
|
+
assert_not_nil @urls[0].info
|
149
|
+
assert_not_nil @urls[1].info
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
context "to get stats on" do
|
154
|
+
context "a single link" do
|
155
|
+
setup do
|
156
|
+
stub_get(/^http:\/\/api.bit.ly\/stats\?.*hash=3j4ir4.*$/,"google_stats.json")
|
157
|
+
@url = @bitly.stats('http://bit.ly/3j4ir4')
|
158
|
+
end
|
159
|
+
should "return a Bitly::Url" do
|
160
|
+
assert_kind_of Bitly::Url, @url
|
161
|
+
end
|
162
|
+
should "return an stats object" do
|
163
|
+
assert_not_nil @url.stats
|
164
|
+
end
|
165
|
+
end
|
166
|
+
context "a single hash" do
|
167
|
+
setup do
|
168
|
+
stub_get(/^http:\/\/api.bit.ly\/stats\?.*hash=3j4ir4.*$/,"google_stats.json")
|
169
|
+
@url = @bitly.stats('3j4ir4')
|
170
|
+
end
|
171
|
+
should "return a Bitly::Url" do
|
172
|
+
assert_kind_of Bitly::Url, @url
|
173
|
+
end
|
174
|
+
should "return an stats object" do
|
175
|
+
assert_not_nil @url.stats
|
176
|
+
end
|
177
|
+
end
|
178
|
+
context "a list of hashes" do
|
179
|
+
should "return an argument error" do
|
180
|
+
assert_raise ArgumentError do
|
181
|
+
@bitly.stats(['3j4ir4','31IqMl'])
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
|
2
|
+
|
3
|
+
class TestUrl < Test::Unit::TestCase
|
4
|
+
context "a new Bitly::Url" do
|
5
|
+
should "require a login and api_key" do
|
6
|
+
assert_raise ArgumentError do Bitly::Url.new end
|
7
|
+
assert_raise ArgumentError do Bitly::Url.new(login) end
|
8
|
+
assert_raise ArgumentError do Bitly::Url.new(nil, api_key) end
|
9
|
+
assert_nothing_raised do
|
10
|
+
Bitly::Url.new(login, api_key)
|
11
|
+
Bitly::Url.new(login, api_key, :hash => '3j4ir4')
|
12
|
+
Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/3j4ir4')
|
13
|
+
Bitly::Url.new(login, api_key, :long_url => 'http://google.com/')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
context "shortening" do
|
17
|
+
context "with a long url" do
|
18
|
+
setup do
|
19
|
+
stub_get(/^http:\/\/api.bit.ly\/shorten\?.*longUrl=.*cnn.com.*$/,"cnn.json")
|
20
|
+
@url = Bitly::Url.new(login, api_key, :long_url => 'http://cnn.com/')
|
21
|
+
end
|
22
|
+
should "return a short url" do
|
23
|
+
assert_equal "http://bit.ly/15DlK", @url.shorten
|
24
|
+
end
|
25
|
+
end
|
26
|
+
context "with no long url" do
|
27
|
+
setup do
|
28
|
+
@url = Bitly::Url.new(login, api_key)
|
29
|
+
end
|
30
|
+
should "raise an error" do
|
31
|
+
assert_raise ArgumentError do
|
32
|
+
@url.shorten
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
context "with a short url already" do
|
37
|
+
setup do
|
38
|
+
@url = Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/31IqMl')
|
39
|
+
flexmock(@url).should_receive(:create_url).never
|
40
|
+
end
|
41
|
+
should "not need to call the api" do
|
42
|
+
assert_equal "http://bit.ly/31IqMl", @url.shorten
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
context "expanding" do
|
47
|
+
context "with a hash" do
|
48
|
+
setup do
|
49
|
+
stub_get(/^http:\/\/api.bit.ly\/expand\?.*hash=31IqMl.*$/,"expand_cnn.json")
|
50
|
+
@url = Bitly::Url.new(login, api_key, :hash => '31IqMl')
|
51
|
+
end
|
52
|
+
should "return an expanded url" do
|
53
|
+
assert_equal "http://cnn.com/", @url.expand
|
54
|
+
end
|
55
|
+
end
|
56
|
+
context "with a short url" do
|
57
|
+
setup do
|
58
|
+
stub_get(/^http:\/\/api.bit.ly\/expand\?.*hash=31IqMl.*$/,"expand_cnn.json")
|
59
|
+
@url = Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/31IqMl')
|
60
|
+
end
|
61
|
+
should "return an expanded url" do
|
62
|
+
assert_equal "http://cnn.com/", @url.expand
|
63
|
+
end
|
64
|
+
end
|
65
|
+
context "with no short url or hash" do
|
66
|
+
setup do
|
67
|
+
@url = Bitly::Url.new(login, api_key)
|
68
|
+
end
|
69
|
+
should "raise an error" do
|
70
|
+
assert_raise ArgumentError do
|
71
|
+
@url.expand
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
context "with a long url already" do
|
76
|
+
setup do
|
77
|
+
@url = Bitly::Url.new(login, api_key, :long_url => 'http://google.com')
|
78
|
+
flexmock(@url).should_receive(:create_url).never
|
79
|
+
end
|
80
|
+
should "not need to call the api" do
|
81
|
+
assert_equal "http://google.com", @url.expand
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
context "info" do
|
86
|
+
context "with a hash" do
|
87
|
+
setup do
|
88
|
+
stub_get(/^http:\/\/api.bit.ly\/info\?.*hash=3j4ir4.*$/,"google_info.json")
|
89
|
+
@url = Bitly::Url.new(login, api_key, :hash => '3j4ir4')
|
90
|
+
end
|
91
|
+
should "return info" do
|
92
|
+
assert_equal "Google", @url.info['htmlTitle']
|
93
|
+
end
|
94
|
+
end
|
95
|
+
context "with a short url" do
|
96
|
+
setup do
|
97
|
+
stub_get(/^http:\/\/api.bit.ly\/info\?.*hash=3j4ir4.*$/,"google_info.json")
|
98
|
+
@url = Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/3j4ir4')
|
99
|
+
end
|
100
|
+
should "return an expanded url" do
|
101
|
+
assert_equal "Google", @url.info['htmlTitle']
|
102
|
+
end
|
103
|
+
end
|
104
|
+
context "without a short url or hash" do
|
105
|
+
setup do
|
106
|
+
@url = Bitly::Url.new(login, api_key, :long_url => 'http://google.com')
|
107
|
+
end
|
108
|
+
should "raise an error" do
|
109
|
+
assert_raise ArgumentError do
|
110
|
+
@url.info
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
context "with info already" do
|
115
|
+
setup do
|
116
|
+
stub_get(/^http:\/\/api.bit.ly\/info\?.*hash=3j4ir4.*$/,"google_info.json")
|
117
|
+
@url = Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/3j4ir4')
|
118
|
+
@url.info
|
119
|
+
end
|
120
|
+
should "not call the api twice" do
|
121
|
+
flexmock(@url).should_receive(:create_url).never
|
122
|
+
@url.info
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
context "stats" do
|
127
|
+
context "with a hash" do
|
128
|
+
setup do
|
129
|
+
stub_get(/^http:\/\/api.bit.ly\/stats\?.*hash=3j4ir4.*$/,"google_stats.json")
|
130
|
+
@url = Bitly::Url.new(login, api_key, :hash => '3j4ir4')
|
131
|
+
end
|
132
|
+
should "return info" do
|
133
|
+
assert_equal 2644, @url.stats['clicks']
|
134
|
+
end
|
135
|
+
end
|
136
|
+
context "with a short url" do
|
137
|
+
setup do
|
138
|
+
stub_get(/^http:\/\/api.bit.ly\/stats\?.*hash=3j4ir4.*$/,"google_stats.json")
|
139
|
+
@url = Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/3j4ir4')
|
140
|
+
end
|
141
|
+
should "return an expanded url" do
|
142
|
+
assert_equal 2644, @url.stats['clicks']
|
143
|
+
end
|
144
|
+
end
|
145
|
+
context "without a short url or hash" do
|
146
|
+
setup do
|
147
|
+
@url = Bitly::Url.new(login, api_key, :long_url => 'http://google.com')
|
148
|
+
end
|
149
|
+
should "raise an error" do
|
150
|
+
assert_raise ArgumentError do
|
151
|
+
@url.stats
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
context "with info already" do
|
156
|
+
setup do
|
157
|
+
stub_get(/^http:\/\/api.bit.ly\/stats\?.*hash=3j4ir4.*$/,"google_stats.json")
|
158
|
+
@url = Bitly::Url.new(login, api_key, :short_url => 'http://bit.ly/3j4ir4')
|
159
|
+
@url.stats
|
160
|
+
end
|
161
|
+
should "not call the api twice" do
|
162
|
+
flexmock(@url).should_receive(:create_url).never
|
163
|
+
@url.stats
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
|
2
|
+
|
3
|
+
class TestUtils < Test::Unit::TestCase
|
4
|
+
include Bitly::Utils
|
5
|
+
API_VERSION = '2.0.1'
|
6
|
+
|
7
|
+
context "text utils" do
|
8
|
+
should "underscore a word" do
|
9
|
+
assert_equal "hello_world", underscore("HelloWorld")
|
10
|
+
end
|
11
|
+
should "create a hash from a short url" do
|
12
|
+
assert_equal "hello", create_hash_from_url("http://bit.ly/hello")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "class utils" do
|
17
|
+
should "turn a key value pair into an instance variable" do
|
18
|
+
attr_define('hello','goodbye')
|
19
|
+
assert_equal @hello, "goodbye"
|
20
|
+
end
|
21
|
+
|
22
|
+
should "turn a hash into instance variables" do
|
23
|
+
instance_variablise({'hello' => 'goodbye'}, ['hello'])
|
24
|
+
assert_equal @hello, "goodbye"
|
25
|
+
end
|
26
|
+
|
27
|
+
should "not turn nonspecified variables into instance variables" do
|
28
|
+
instance_variablise({'hello' => 'goodbye'}, [])
|
29
|
+
assert_nil @hello
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "creating a url" do
|
34
|
+
setup do
|
35
|
+
@api_key = api_key
|
36
|
+
@login = login
|
37
|
+
end
|
38
|
+
should "contain all the basic information" do
|
39
|
+
url = create_url.to_s
|
40
|
+
assert url.include?('http://api.bit.ly/')
|
41
|
+
assert url.include?("version=#{API_VERSION}")
|
42
|
+
assert url.include?("apiKey=#{api_key}")
|
43
|
+
assert url.include?("login=#{login}")
|
44
|
+
end
|
45
|
+
should "contain the right resource" do
|
46
|
+
url = create_url('shorten').to_s
|
47
|
+
assert url.include?('/shorten')
|
48
|
+
end
|
49
|
+
should "contain extra parameters" do
|
50
|
+
url = create_url('shorten', :longUrl => 'http://google.com').to_s
|
51
|
+
assert url.include?("longUrl=#{CGI.escape('http://google.com')}")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "fetching a url" do
|
56
|
+
context "successfully" do
|
57
|
+
setup do
|
58
|
+
stub_get("http://example.com","cnn.json")
|
59
|
+
end
|
60
|
+
should "return a json object successfully" do
|
61
|
+
result = get_result(URI.join("http://example.com"))
|
62
|
+
assert_equal Hash, result.class
|
63
|
+
end
|
64
|
+
end
|
65
|
+
context "unsuccessfully" do
|
66
|
+
setup do
|
67
|
+
stub_get("http://example.com", 'shorten_error.json')
|
68
|
+
end
|
69
|
+
should "raise BitlyError" do
|
70
|
+
assert_raise BitlyError do
|
71
|
+
result = get_result(URI.join("http://example.com"))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/test/test_bitly.rb
CHANGED
@@ -1,65 +1,81 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'rubygems'
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
1
|
+
# require 'test/unit'
|
2
|
+
# require 'rubygems'
|
3
|
+
# require 'shoulda'
|
4
|
+
# require 'flexmock'
|
5
|
+
# require 'bitly'
|
6
|
+
#
|
7
|
+
# class TestBitly < Test::Unit::TestCase
|
8
|
+
#
|
9
|
+
# context "with a bitly client" do
|
10
|
+
# setup do
|
11
|
+
# @api_key = 'test_key'
|
12
|
+
# @login = 'test_account'
|
13
|
+
# @bitly = Bitly.new(@login,@api_key)
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# context "shortening" do
|
17
|
+
#
|
18
|
+
# context "a single url" do
|
19
|
+
# setup do
|
20
|
+
#
|
21
|
+
# end
|
22
|
+
# def test_returns_single_short_url
|
23
|
+
# url = @bitly.shorten("http://cnn.com")
|
24
|
+
# assert_kind_of Bitly::Url, url
|
25
|
+
# assert_equal "http://cnn.com", url.long_url
|
26
|
+
# assert_equal "http://bit.ly/15DlK", url.short_url
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# def test_shortens_multiple_urls
|
30
|
+
# urls = @bitly.shorten(["http://cnn.com","http://google.com"])
|
31
|
+
# assert_equal "http://cnn.com", urls[0].long_url
|
32
|
+
# assert_equal "http://bit.ly/15DlK", urls[0].short_url
|
33
|
+
# assert_equal "http://google.com", urls[1].long_url
|
34
|
+
# assert_equal "http://bit.ly/11etr", urls[1].short_url
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# def test_can_shorten_a_url_with_parameters
|
38
|
+
# url = @bitly.shorten("http://www.google.com/search?hl=en&q=url&btnG=Google+Search&aq=f&oq=")
|
39
|
+
# assert_kind_of Bitly::Url, url
|
40
|
+
# assert_equal "http://www.google.com/search?hl=en&q=url&btnG=Google+Search&aq=f&oq=", url.long_url
|
41
|
+
# assert_equal "http://bit.ly/NqK6i", url.short_url
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# def test_returns_a_long_url
|
45
|
+
# urls = @bitly.expand(["2bYgqR","1RmnUT"])
|
46
|
+
# assert_kind_of Bitly::Url, urls[0]
|
47
|
+
# assert_equal "http://cnn.com", urls[0].long_url
|
48
|
+
# assert_equal "2bYgqR", urls[0].hash
|
49
|
+
# assert_equal "http://google.com", urls[1].long_url
|
50
|
+
# assert_equal "1RmnUT", urls[1].hash
|
51
|
+
# url = @bitly.expand("http://bit.ly/wQaT")
|
52
|
+
# assert_kind_of Bitly::Url, url
|
53
|
+
# assert_equal "http://bit.ly/wQaT", url.short_url
|
54
|
+
# assert_equal "http://google.com/", url.long_url
|
55
|
+
# assert_equal "wQaT", url.hash
|
56
|
+
# url2 = @bitly.expand("wQaT")
|
57
|
+
# assert_kind_of Bitly::Url, url2
|
58
|
+
# assert_equal "wQaT", url2.hash
|
59
|
+
# assert_equal "http://bit.ly/wQaT", url2.short_url
|
60
|
+
# assert_equal "http://google.com/", url2.long_url
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# # def test_returns_keyword_url
|
64
|
+
# # #kind of ghetto test but we need it to be different every time
|
65
|
+
# # require 'digest/sha1'
|
66
|
+
# # keyword = Digest::SHA1.hexdigest(DateTime.now.to_s)
|
67
|
+
# #
|
68
|
+
# # url = @bitly.shorten("http://google.com", :keyword => keyword)
|
69
|
+
# # assert_equal url.short_keyword_url, "http://bit.ly/#{keyword}"
|
70
|
+
# # end
|
71
|
+
#
|
72
|
+
# def test_returns_error_on_existing_keyword
|
73
|
+
# keyword = 'apple'
|
74
|
+
# assert_raise BitlyError do
|
75
|
+
# @bitly.shorten("http://apple.com/itunes", :keyword => keyword)
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
#
|
80
|
+
#
|
81
|
+
# end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'flexmock/test_unit'
|
5
|
+
require 'fakeweb'
|
6
|
+
|
7
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'bitly')
|
8
|
+
|
9
|
+
FakeWeb.allow_net_connect = false
|
10
|
+
|
11
|
+
def fixture_file(filename)
|
12
|
+
return '' if filename == ''
|
13
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
|
14
|
+
File.read(file_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def stub_get(url, filename, status=nil)
|
18
|
+
options = {:body => fixture_file(filename)}
|
19
|
+
options.merge!({:status => status}) unless status.nil?
|
20
|
+
|
21
|
+
FakeWeb.register_uri(:get, url, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def api_key
|
25
|
+
'test_key'
|
26
|
+
end
|
27
|
+
def login
|
28
|
+
'test_account'
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.3"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Nash
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-09 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -81,4 +81,8 @@ signing_key:
|
|
81
81
|
specification_version: 3
|
82
82
|
summary: Use the bit.ly API to shorten or expand URLs
|
83
83
|
test_files:
|
84
|
+
- test/bitly/test_client.rb
|
85
|
+
- test/bitly/test_url.rb
|
86
|
+
- test/bitly/test_utils.rb
|
84
87
|
- test/test_bitly.rb
|
88
|
+
- test/test_helper.rb
|