url_shortener 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,4 +1,10 @@
1
1
  === 0.0.1 2009-11-08
2
2
 
3
3
  * 1 major enhancement:
4
- * Initial release
4
+ * Initial release
5
+
6
+ === 0.0.2 2009-11-09
7
+
8
+ * 1 addition:
9
+ * adds url expander functionality
10
+
data/README.rdoc CHANGED
@@ -9,7 +9,11 @@ To use the url_shortener gem you need a bit.ly login and Api key.
9
9
 
10
10
  ==USAGE
11
11
 
12
- * authorize = UrlShortener::Authorize.new 'bitlyapidemo', 'R_0da49e0a9118ff35f52f629d2d71bf07'
12
+ ===To Shorten Urls
13
+
14
+ * authorize = UrlShortener::Authorize.new 'your_bitly_login', 'your_bitly_api_key'
15
+
16
+ * For example; authorize = UrlShortener::Authorize.new 'bitlyapidemo', 'R_0da49e0a9118ff35f52f629d2d71bf07'
13
17
 
14
18
  * client = UrlShortener::Client.new authorize
15
19
 
@@ -23,6 +27,26 @@ OR
23
27
 
24
28
  * results.each {|result| puts result['shortUrl']}
25
29
 
30
+ ==To Expand Urls
31
+
32
+ * authorize = UrlShortener::Authorize.new 'your_bitly_login', 'your_bitly_api_key'
33
+
34
+ * client = UrlShortener::Client.new authorize
35
+
36
+ * result = client.expand(:shortUrl => 'http://bit.ly/1RmnUT')
37
+
38
+ OR
39
+
40
+ * result = client.expand(:hash => '2bYgqR')
41
+
42
+ * result['longUrl']
43
+
44
+ OR
45
+
46
+ * results = client.shorten('http://www.yahoo.com', 'http://www.google.com', 'http://github.com')
47
+
48
+ * results.each {|result| puts result['shortUrl']}
49
+
26
50
 
27
51
  ==Tests
28
52
 
@@ -8,16 +8,39 @@ module UrlShortener
8
8
  validated?
9
9
  end
10
10
 
11
- def shorten(*url)
11
+ # To shorten multiple URLs in a single API call, pass multiple urls
12
+ # e.g. shorten('http://www.google.com', 'http://www.bit.ly')
13
+ def shorten(*urls)
12
14
  # HTTParty accepts a hash for url parameters but if more than one parameters are passed
13
15
  # to bitly then the url needs to have longUrl parameter multiple times but we cant have
14
16
  # duplicate keys in a hash hence this solution
15
- end_point_with_params = "#{end_point('shorten')}?longUrl=#{url.join('&longUrl=')}"
17
+ urls.collect!{|url| CGI.escape(url)}
18
+ end_point_with_params = "#{end_point('shorten')}?longUrl=#{urls.join('&longUrl=')}"
16
19
  interface(end_point_with_params).get['nodeKeyVal']
17
20
  end
18
21
 
19
- def interface(end_point_with_params)
20
- UrlShortener::Interface.new(end_point_with_params, :query => common_query_parameters)
22
+ # Provide parameter as a key value pair of existing short url or its hash
23
+ # e.g. expand :shortUrl => 'http://bit.ly/15DlK' OR :hash => '31IqMl'
24
+ def expand(option)
25
+ check_request_parameters(option)
26
+ /^.*\/(.*)$/.match option[:shortUrl] if option[:shortUrl]
27
+ request_param = option[:hash] ? option[:hash] : $1
28
+ result = interface(nil, {:rest_url => end_point('expand')}.merge(option)).get[request_param]
29
+ return result['longUrl'] if result
30
+ end
31
+
32
+ # If a complex url need to be passed then use end_point_with_params else
33
+ # set first parameter to nil while invoking this method and
34
+ # pass rest_url option e.g.
35
+ # interface(nil, {:rest_url => end_point('expand'), :another_key => 'value'})
36
+ def interface(end_point_with_params, options={})
37
+ if end_point_with_params.nil? && options[:rest_url].nil?
38
+ raise "You must provide either the endpoint as the first parameter or set the :rest_url options"
39
+ end
40
+ rest_url = end_point_with_params ? end_point_with_params : options[:rest_url]
41
+ options.delete(:rest_url)
42
+ params = common_query_parameters.merge!(options)
43
+ UrlShortener::Interface.new(rest_url, :query => params)
21
44
  end
22
45
 
23
46
  def common_query_parameters
@@ -34,6 +57,13 @@ module UrlShortener
34
57
 
35
58
  private
36
59
 
60
+ def check_request_parameters(option)
61
+ unless (option[:hash] || option[:shortUrl])
62
+ raise UrlShortener::IncompleteRequestParameter, "Either hash or the shorUrl is required to complete the operation."
63
+ end
64
+ true
65
+ end
66
+
37
67
  def validated?
38
68
  valid_authorize_attribute?
39
69
  end
@@ -15,4 +15,8 @@ module UrlShortener
15
15
 
16
16
  class NoResult < Error
17
17
  end
18
+
19
+ class UrlShortener::IncompleteRequestParameter < Error
20
+
21
+ end
18
22
  end
data/lib/url_shortener.rb CHANGED
@@ -3,6 +3,7 @@ $:.unshift(File.dirname(__FILE__)) unless
3
3
 
4
4
  require 'rubygems'
5
5
  require 'httparty'
6
+ require 'cgi'
6
7
  require 'url_shortener/error.rb'
7
8
  require 'url_shortener/authorize.rb'
8
9
  require 'url_shortener/client.rb'
@@ -83,46 +83,135 @@ describe UrlShortener::Client do
83
83
  end
84
84
  end
85
85
 
86
- describe "#shorten" do
86
+ describe "API actions" do
87
87
  before(:each) do
88
88
  authorize = UrlShortener::Authorize.new 'login', 'key'
89
89
  @client = UrlShortener::Client.new(authorize)
90
90
  @interface = stub('UrlShortener::Interface', :get => {})
91
91
  @client.stub!(:interface).and_return(@interface)
92
92
  end
93
-
94
- it "should get the end point" do
95
- @client.should_receive(:end_point)
96
- @client.shorten('a url')
97
- end
98
-
99
- it "should use the interface to connect to bitly" do
100
- @client.should_receive(:interface).and_return(@interface)
101
- @client.shorten('a url')
93
+ describe "#shorten" do
94
+ before(:each) do
95
+ @url = 'http://www.domain.com/path?params=value'
96
+ end
97
+
98
+ it "should do the url escaping" do
99
+ CGI.should_receive(:escape).with(@url)
100
+ @client.shorten(@url)
101
+ end
102
+
103
+ it "should get the end point" do
104
+ @client.should_receive(:end_point)
105
+ @client.shorten(@url)
106
+ end
107
+
108
+ it "should use the interface to connect to bitly" do
109
+ @client.should_receive(:interface).and_return(@interface)
110
+ @client.shorten(@url)
111
+ end
112
+
113
+ it "should get the data using interface" do
114
+ @interface.should_receive(:get)
115
+ @client.shorten(@url)
116
+ end
117
+
102
118
  end
103
-
104
- it "should get the data using interface" do
105
- @interface.should_receive(:get)
106
- @client.shorten('a url')
119
+
120
+ describe "#expand" do
121
+ before(:each) do
122
+ @hash = 'qweWE'
123
+ @short_url = 'http://bit.ly/wesSD'
124
+ @end_point = 'http://api.bit.ly/expand'
125
+ @client.stub!(:end_point).and_return(@end_point)
126
+ end
127
+
128
+ it "should raise IncompleteRequestParameter when key value pair for neither hash nor shortUrl is not present" do
129
+ lambda {@client.expand(:invalid => 'anyvalue')}.should raise_error(UrlShortener::IncompleteRequestParameter)
130
+ end
131
+
132
+ it "should get the end point" do
133
+ @client.should_receive(:end_point)
134
+ @client.expand(:hash => @hash)
135
+ end
136
+
137
+ it "should use the interface to connect to bitly and pass the hash when url hash is used" do
138
+ @client.should_receive(:interface).with(nil, {:rest_url => @end_point, :hash => 'qweWE'}).and_return(@interface)
139
+ @client.expand(:hash => @hash)
140
+ end
141
+
142
+ it "should use the interface to connect to bitly and pass the shortUrl when shortUrl is used" do
143
+ @client.should_receive(:interface).with(nil, {:rest_url => @end_point, :shortUrl => 'http://bit.ly/wesSD'}).and_return(@interface)
144
+ @client.expand(:shortUrl => @short_url)
145
+ end
146
+
147
+ it "should get the data using interface" do
148
+ @interface.should_receive(:get)
149
+ @client.expand(:hash => @hash)
150
+ end
151
+
152
+ it "should return the long url of the hash provided" do
153
+ @interface.should_receive(:get).and_return('qweWE' => {'longUrl' => 'http://www.goog.com'})
154
+ @client.expand(:hash => @hash).should eql('http://www.goog.com')
155
+ end
156
+
157
+ it "should return the long url for the shortUrl provided" do
158
+ @interface.should_receive(:get).and_return('wesSD' => {'longUrl' => 'http://www.goog.com'})
159
+ @client.expand(:shortUrl => @short_url).should eql('http://www.goog.com')
160
+ end
161
+
107
162
  end
108
-
109
163
  end
110
164
 
111
165
  describe "#interface" do
112
166
  before(:each) do
113
167
  authorize = UrlShortener::Authorize.new 'login', 'key'
114
168
  @client = UrlShortener::Client.new(authorize)
115
- @client.stub!(:common_query_parameters).and_return({})
169
+ @common_query_parameters = {}
170
+ @client.stub!(:common_query_parameters).and_return(@common_query_parameters)
171
+ @first_parameter = '/some/uri'
172
+ @url = '/a/url'
116
173
  end
117
174
 
118
175
  it "should initialize the interface object" do
119
176
  UrlShortener::Interface.should_receive(:new).with('/some/uri', :query => {})
120
- @client.interface('/some/uri')
177
+ @client.interface(@first_parameter)
121
178
  end
122
179
 
123
180
  it "should get the common query parameters" do
124
181
  @client.should_receive(:common_query_parameters)
125
- @client.interface('/some/uri')
182
+ @client.interface(@first_parameter)
183
+ end
184
+
185
+ it "should use the rest_url key from the options if first_parameter is set to nil" do
186
+ UrlShortener::Interface.should_receive(:new).with('/a/url', :query => {})
187
+ @client.interface(nil, {:rest_url => @url})
188
+ end
189
+
190
+ it "should use the first parameter if rest_url option as well as the first parameter is provided" do
191
+ UrlShortener::Interface.should_receive(:new).with('/some/uri', :query => {})
192
+ @client.interface(@first_parameter, {:rest_url => @url})
193
+ end
194
+
195
+ it "should raise an error when neither the first parameter is set nor the rest_url options" do
196
+ lambda { @client.interface(nil, {}) }.should raise_error("You must provide either the endpoint as the first parameter or set the :rest_url options")
197
+ end
198
+
199
+ it "should remove the rest_url key value from the options" do
200
+ options = {:rest_url => @url}
201
+ options.should_receive(:delete).with(:rest_url)
202
+ @client.interface(@first_parameter, options)
203
+ end
204
+
205
+ it "should merge the rest of the options passed to the common_query_parameters" do
206
+ options = {:rest_url => @url, :tt => 'val'}
207
+ @common_query_parameters.should_receive(:merge!).with(options)
208
+ @client.interface(@first_parameter, options)
209
+ end
210
+
211
+ it "should keys for the parameters that are passed in the options" do
212
+ options = {:rest_url => @url, :tt => 'val'}
213
+ UrlShortener::Interface.should_receive(:new).with('/a/url', :query => {:tt => 'val'})
214
+ @client.interface(nil, options)
126
215
  end
127
216
  end
128
217
 
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.1
4
+ version: 0.0.2
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-08 00:00:00 +00:00
12
+ date: 2009-11-09 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency