bitly-oauth 0.1.0
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 +154 -0
- data/LICENSE +20 -0
- data/README.md +87 -0
- data/README.rdoc +35 -0
- data/Rakefile +42 -0
- data/VERSION +1 -0
- data/lib/bitly_oauth.rb +28 -0
- data/lib/bitly_oauth/access_token.rb +37 -0
- data/lib/bitly_oauth/client.rb +149 -0
- data/lib/bitly_oauth/country.rb +10 -0
- data/lib/bitly_oauth/day.rb +12 -0
- data/lib/bitly_oauth/error.rb +15 -0
- data/lib/bitly_oauth/lib/core_ext/hash.rb +27 -0
- data/lib/bitly_oauth/lib/core_ext/string.rb +5 -0
- data/lib/bitly_oauth/missing_url.rb +12 -0
- data/lib/bitly_oauth/realtime_link.rb +16 -0
- data/lib/bitly_oauth/referrer.rb +12 -0
- data/lib/bitly_oauth/referring_domain.rb +11 -0
- data/lib/bitly_oauth/response.rb +39 -0
- data/lib/bitly_oauth/url.rb +118 -0
- data/lib/bitly_oauth/user.rb +104 -0
- data/test/fixtures/9uX1TE.json +1 -0
- data/test/fixtures/9uX1TEclicks.json +1 -0
- data/test/fixtures/9uX1TEclicks2.json +1 -0
- data/test/fixtures/9uX1TEinfo.json +1 -0
- data/test/fixtures/9uX1TEinfo2.json +1 -0
- data/test/fixtures/auth_fail.json +1 -0
- data/test/fixtures/auth_success.json +1 -0
- data/test/fixtures/betaworks.json +1 -0
- data/test/fixtures/betaworks2.json +1 -0
- data/test/fixtures/betaworks_jmp.json +1 -0
- data/test/fixtures/betaworks_other_user.json +1 -0
- data/test/fixtures/bitly9uX1TE.json +1 -0
- data/test/fixtures/bitly_pro_domain.json +1 -0
- data/test/fixtures/clicks_by_day.json +1 -0
- data/test/fixtures/clicks_by_day1.json +1 -0
- data/test/fixtures/clicks_by_day2.json +1 -0
- data/test/fixtures/clicks_by_minute1_url.json +1 -0
- data/test/fixtures/clicks_by_minute2_url.json +1 -0
- data/test/fixtures/clicks_by_minute_hash.json +1 -0
- data/test/fixtures/clicks_by_minute_hashes.json +1 -0
- data/test/fixtures/country_hash.json +1 -0
- data/test/fixtures/country_hash2.json +1 -0
- data/test/fixtures/country_url.json +1 -0
- data/test/fixtures/failure.json +1 -0
- data/test/fixtures/invalid_bitly_pro_domain.json +1 -0
- data/test/fixtures/invalid_credentials.json +1 -0
- data/test/fixtures/invalid_domain.json +1 -0
- data/test/fixtures/invalid_user.json +1 -0
- data/test/fixtures/invalid_x_api_key.json +1 -0
- data/test/fixtures/lookup_multiple_url.json +1 -0
- data/test/fixtures/lookup_not_real_url.json +1 -0
- data/test/fixtures/lookup_single_url.json +1 -0
- data/test/fixtures/missing_hash.json +1 -0
- data/test/fixtures/multiple_info.json +1 -0
- data/test/fixtures/multiple_url_click.json +1 -0
- data/test/fixtures/multiple_urls.json +1 -0
- data/test/fixtures/not_bitly_pro_domain.json +1 -0
- data/test/fixtures/not_found_info.json +1 -0
- data/test/fixtures/referrer_hash.json +1 -0
- data/test/fixtures/referrer_hash2.json +1 -0
- data/test/fixtures/referrer_url.json +1 -0
- data/test/fixtures/success.json +1 -0
- data/test/fixtures/url_info.json +1 -0
- data/test/fixtures/user_clicks.json +32 -0
- data/test/fixtures/user_countries.json +60 -0
- data/test/fixtures/user_realtime_links.json +15 -0
- data/test/fixtures/user_referrers.json +1 -0
- data/test/fixtures/valid_user.json +1 -0
- data/test/integration/strategy/old_test_api_key.rb +20 -0
- data/test/integration/test_client.rb +709 -0
- data/test/integration/test_user.rb +97 -0
- data/test/test_helper.rb +54 -0
- data/test/unit/core_ext/test_hash.rb +69 -0
- data/test/unit/core_ext/test_string.rb +14 -0
- data/test/unit/test_bitly_oauth.rb +19 -0
- data/test/unit/test_client.rb +87 -0
- data/test/unit/test_country.rb +19 -0
- data/test/unit/test_day.rb +22 -0
- data/test/unit/test_error.rb +11 -0
- data/test/unit/test_missing.rb +34 -0
- data/test/unit/test_realtime_link.rb +30 -0
- data/test/unit/test_referrer.rb +19 -0
- data/test/unit/test_referring_domain.rb +21 -0
- data/test/unit/test_response.rb +86 -0
- data/test/unit/test_url.rb +156 -0
- data/test/unit/test_user.rb +17 -0
- metadata +215 -0
data/History.txt
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
=== 0.1.0 / 2012-1-21
|
2
|
+
* Rename Project to BitlyOAuth
|
3
|
+
|
4
|
+
* Remove Login and ApiKey Authentication
|
5
|
+
* Remove strategies
|
6
|
+
* Rollback version to 0.1.0
|
7
|
+
* Add Referring Domains Endpoint
|
8
|
+
|
9
|
+
=== 0.8.0 / 2012-1-17
|
10
|
+
|
11
|
+
* Major Refactor
|
12
|
+
|
13
|
+
* Adds Authentication Strategies
|
14
|
+
* Client supports OAuth & Login/ApiKey strategies
|
15
|
+
* User supports AccessToken strategy
|
16
|
+
* Forked original project. Pull requests in original project showed no movement.
|
17
|
+
|
18
|
+
=== 0.7.0 / 2011-1-8
|
19
|
+
|
20
|
+
* 1 major bug fix
|
21
|
+
|
22
|
+
* Updates OAuth2 gem and fixes OAuth class
|
23
|
+
|
24
|
+
* 1 minor enhancement
|
25
|
+
|
26
|
+
Adds link_history to user model
|
27
|
+
|
28
|
+
=== 0.6.2 / 2011-11-10
|
29
|
+
|
30
|
+
* 2 minor enhancements
|
31
|
+
|
32
|
+
* Adds days parameter to clicks_by_minute v3 API call
|
33
|
+
* Converts Readme to markdown
|
34
|
+
|
35
|
+
* 2 minor bug fixes
|
36
|
+
|
37
|
+
* Increases HTTParty version to avoid issues with Rubygems
|
38
|
+
* Stops mutating arguments on array methods
|
39
|
+
|
40
|
+
=== 0.6.1 / 2011-01-12
|
41
|
+
|
42
|
+
* 1 minor enhancement
|
43
|
+
|
44
|
+
* Updated OAuth2 gem and used extra information to save login and api_key to user objects
|
45
|
+
|
46
|
+
=== 0.6.0 / 2011-01-03
|
47
|
+
|
48
|
+
* 1 major enhancement
|
49
|
+
|
50
|
+
* Added OAuth 2 and User calls for the version 3 API
|
51
|
+
|
52
|
+
=== 0.5.5 / 2010-12-22
|
53
|
+
|
54
|
+
* 1 minor bug fix
|
55
|
+
|
56
|
+
* fixed method redifined warnings
|
57
|
+
|
58
|
+
=== 0.5.4 / 2010-12-01
|
59
|
+
|
60
|
+
* 4 minor enhancements
|
61
|
+
|
62
|
+
* Added referrers, countries, clicks_by_minute and clicks_by_day calls to the version 3 API
|
63
|
+
|
64
|
+
=== 0.5.3 / 2010-07-30
|
65
|
+
|
66
|
+
* 1 minor enhancement
|
67
|
+
|
68
|
+
* Added the info call to the version 3 API
|
69
|
+
|
70
|
+
=== 0.5.2 / 2010-07-18
|
71
|
+
|
72
|
+
* 1 minor enhancement
|
73
|
+
|
74
|
+
* Added the lookup call to the version 3 API.
|
75
|
+
|
76
|
+
=== 0.5.1 / 2010-05-26
|
77
|
+
|
78
|
+
* 1 bug fix
|
79
|
+
|
80
|
+
* When expanding a short url with the v3 module, user hash and short url weren't being set properly
|
81
|
+
|
82
|
+
=== 0.5.0 / 2010-05-12
|
83
|
+
|
84
|
+
* Loads of major enhancements
|
85
|
+
|
86
|
+
* Support for version 3 of the bit.ly API
|
87
|
+
* deprecation for version 2 client object
|
88
|
+
|
89
|
+
=== 0.4.0 / 2009-12-19
|
90
|
+
|
91
|
+
* 1 major enhancement
|
92
|
+
|
93
|
+
* support for j.mp urls
|
94
|
+
|
95
|
+
=== 0.3.2 / 2009-11-15
|
96
|
+
|
97
|
+
* 1 bug fix
|
98
|
+
|
99
|
+
* called the wrong variable in case of error in the creation of a Url object
|
100
|
+
|
101
|
+
=== 0.3.1 / 2009-07-29
|
102
|
+
|
103
|
+
* 1 minor enhancement
|
104
|
+
|
105
|
+
* removed require 'rubygems' from library (http://gist.github.com/54177)
|
106
|
+
|
107
|
+
=== 0.3 / 2009-07-09
|
108
|
+
|
109
|
+
* 1 major enhancement
|
110
|
+
|
111
|
+
* a full set of tests, properly mocked
|
112
|
+
|
113
|
+
* 1 minor enhancement
|
114
|
+
|
115
|
+
* calling bitly.shorten(:history => 1) will add the url to the api user's history.
|
116
|
+
|
117
|
+
* 1 bug fix
|
118
|
+
|
119
|
+
* you can no longer call shorten with a keyword, this was unsupported in the API and consequently removed
|
120
|
+
|
121
|
+
=== 0.2 / 2009-06-23
|
122
|
+
|
123
|
+
* 1 enhancement
|
124
|
+
|
125
|
+
* Depends on Crack instead of JSON, so can run on Jruby
|
126
|
+
|
127
|
+
* 1 bug fix
|
128
|
+
|
129
|
+
* Does not choke when bit.ly chokes. Returns a BitlyError instead
|
130
|
+
|
131
|
+
=== 0.1.4 / 2009-04-13
|
132
|
+
|
133
|
+
* 1 bug fix
|
134
|
+
|
135
|
+
* Urls with parameters were choking, changed to using CGI.
|
136
|
+
|
137
|
+
=== 0.1.2 / 2009-03-12
|
138
|
+
|
139
|
+
* 1 minor enhancement
|
140
|
+
|
141
|
+
* Allows to add a keyword for shortening urls
|
142
|
+
|
143
|
+
=== 0.1.1 / 2009-01-26
|
144
|
+
|
145
|
+
* 1 bug fix
|
146
|
+
|
147
|
+
* Didn't include dependency on JSON
|
148
|
+
|
149
|
+
=== 0.1.0 / 2009-01-26
|
150
|
+
|
151
|
+
* 1 major enhancement
|
152
|
+
|
153
|
+
* First release
|
154
|
+
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 jonstorer
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# bitly-oauth
|
2
|
+
|
3
|
+
## DESCRIPTION:
|
4
|
+
|
5
|
+
A Ruby API for [http://bit.ly](http://bit.ly)
|
6
|
+
|
7
|
+
[http://code.google.com/p/bitly-api/wiki/ApiDocumentation](http://code.google.com/p/bitly-api/wiki/ApiDocumentation)
|
8
|
+
|
9
|
+
## NOTE:
|
10
|
+
|
11
|
+
BitlyOAuth supports version 3 of the API as well as OAuth authenticate for user access.
|
12
|
+
|
13
|
+
To use, you will need a client id and client secret. Get yours at [http://bitly.com/a/account](http://bitly.com/a/account).
|
14
|
+
|
15
|
+
client = BitlyOAuth::Client.new(client_id, client_secret)
|
16
|
+
|
17
|
+
With a ``BitlyOAuth::Client`` you have access to the following API endpoints:
|
18
|
+
``shorten``, ``expand``, ``lookup``, ``info``, ``clicks``, ``clicks_by_minute``,
|
19
|
+
``clicks_by_day``, ``countries``, ``referrers``, ``referring_domains``,
|
20
|
+
``validate``, ``bitly_pro_domain`` See [http://bit.ly/apidocs](http://bit.ly/apidocs) for details.
|
21
|
+
|
22
|
+
## INSTALLATION:
|
23
|
+
|
24
|
+
gem install bitly-oauth
|
25
|
+
|
26
|
+
## USAGE:
|
27
|
+
|
28
|
+
Please see the Bit.ly API documentation [http://bit.ly/apidocs](http://bit.ly/apidocs) for details on the V3 API.
|
29
|
+
|
30
|
+
You can initialize a client through the following shortcut as well:
|
31
|
+
|
32
|
+
client = BitlyOAuth.new("client id", "client secret")
|
33
|
+
client.set_access_token_from_token('token')
|
34
|
+
|
35
|
+
You can then use that client to shorten or expand urls or return more information or statistics as so:
|
36
|
+
|
37
|
+
client.shorten('http://www.google.com')
|
38
|
+
client.shorten('http://www.google.com', :history => 1) # adds the url to the api user's history
|
39
|
+
|
40
|
+
client.expand('wQaT') || client.expand('http://bit.ly/wQaT')
|
41
|
+
client.info('wQaT') || client.info('http://bit.ly/wQaT')
|
42
|
+
client.stats('wQaT') || client.stats('http://bit.ly/wQaT')
|
43
|
+
|
44
|
+
Each can be used in all the methods described in the API docs, the shorten function, for example, takes a url or an array of urls.
|
45
|
+
|
46
|
+
Then functions ``shorten``, ``expand``, ``info``, and ``stats`` return a ``BitlyOAuth::Url`` object (or an array of ``BitlyOAuth::Url`` objects if you supplied an array as the input). You can then get all the information required from that object.
|
47
|
+
|
48
|
+
url = client.shorten('http://www.google.com') #=> BitlyOAuth::Url
|
49
|
+
|
50
|
+
url.clicks_by_day #=> an array of ``BitlyOAuth::Day``s
|
51
|
+
url.countries #=> an array of ``BitlyOAuth::Country``s
|
52
|
+
url.referrers #=> an array of ``BitlyOAuth::Referrer``s
|
53
|
+
url.clicks_by_minute #=> an array of 60 integers representing click counts over the last 60 minutes
|
54
|
+
url.created_by #=> string / http://bit.ly/apidocs#/v3/info
|
55
|
+
url.global_clicks #=> integer / http://bit.ly/apidocs#/v3/clicks
|
56
|
+
url.global_hash #=> string / http://bit.ly/apidocs#/v3/info
|
57
|
+
url.long_url #=> string / http://bit.ly/apidocs#/v3/expand
|
58
|
+
url.new_hash? #=> boolean / http://bit.ly/apidocs#/v3/shorten
|
59
|
+
url.short_url #=> string / http://bit.ly/apidocs#/v3/shorten
|
60
|
+
url.title #=> string / http://bit.ly/apidocs#/v3/info
|
61
|
+
url.user_clicks #=> integer / http://bit.ly/apidocs#/v3/clicks
|
62
|
+
url.user_hash #=> string / http://bit.ly/apidocs#/v3/expand
|
63
|
+
|
64
|
+
## LICENSE:
|
65
|
+
|
66
|
+
> (The MIT License)
|
67
|
+
>
|
68
|
+
> Copyright (c) 2012 Jonathon Storer
|
69
|
+
>
|
70
|
+
> Permission is hereby granted, free of charge, to any person obtaining
|
71
|
+
> a copy of this software and associated documentation files (the
|
72
|
+
> 'Software'), to deal in the Software without restriction, including
|
73
|
+
> without limitation the rights to use, copy, modify, merge, publish,
|
74
|
+
> distribute, sublicense, and/or sell copies of the Software, and to
|
75
|
+
> permit persons to whom the Software is furnished to do so, subject to
|
76
|
+
> the following conditions:
|
77
|
+
>
|
78
|
+
> The above copyright notice and this permission notice shall be
|
79
|
+
> included in all copies or substantial portions of the Software.
|
80
|
+
>
|
81
|
+
> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
82
|
+
> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
83
|
+
> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
84
|
+
> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
85
|
+
> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
86
|
+
> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
87
|
+
> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
= bitly
|
2
|
+
|
3
|
+
== DESCRIPTION:
|
4
|
+
|
5
|
+
A Ruby API for version 3 of the http://bit.ly API, including j.mp and bitly.Pro support.
|
6
|
+
|
7
|
+
http://api.bit.ly
|
8
|
+
|
9
|
+
== INSTALLATION:
|
10
|
+
|
11
|
+
<tt>gem install bitly-oauth</tt>
|
12
|
+
|
13
|
+
== USAGE:
|
14
|
+
|
15
|
+
Create a client using your client id and client secret from http://bit.ly
|
16
|
+
|
17
|
+
<tt>client = BitlyOAuth.new(client_id, client_secret)</tt>
|
18
|
+
|
19
|
+
Then use that client to shorten or expand urls and hashes.
|
20
|
+
|
21
|
+
<tt>client.shorten('http://google.com')</tt>
|
22
|
+
|
23
|
+
== Note on Patches/Pull Requests
|
24
|
+
|
25
|
+
* Fork the project.
|
26
|
+
* Make your feature addition or bug fix.
|
27
|
+
* Add tests for it. This is important so I don't break it in a
|
28
|
+
future version unintentionally.
|
29
|
+
* Commit, do not mess with rakefile, version, or history.
|
30
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
31
|
+
* Send me a pull request. Bonus points for topic branches.
|
32
|
+
|
33
|
+
== Copyright
|
34
|
+
|
35
|
+
Copyright (c) 2010 jonstorer. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'jeweler'
|
4
|
+
|
5
|
+
Jeweler::Tasks.new do |gem|
|
6
|
+
gem.name = "bitly-oauth"
|
7
|
+
gem.summary = "A ruby wrapper for the bit.ly API"
|
8
|
+
gem.description = <<-DESCRIPTION
|
9
|
+
A ruby wrapper for version 3 of the bit.ly API
|
10
|
+
Supports OAuth authentication
|
11
|
+
DESCRIPTION
|
12
|
+
gem.email = "jonathon.scott.storer@gmail.com"
|
13
|
+
gem.homepage = "http://github.com/jonstorer/bitly-oauth"
|
14
|
+
gem.authors = ["jonstorer"]
|
15
|
+
gem.add_dependency 'httparty', ">= 0.7.6"
|
16
|
+
gem.add_dependency 'oauth2', '>= 0.1.1'
|
17
|
+
gem.add_development_dependency "shoulda", ">= 0"
|
18
|
+
gem.add_development_dependency "jeweler", ">= 1.4.0"
|
19
|
+
gem.add_development_dependency "rcov", ">= 0"
|
20
|
+
gem.add_development_dependency "mocha", ">= 0.10.0"
|
21
|
+
gem.add_development_dependency "fakeweb", ">= 1.2.8"
|
22
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'rake/testtask'
|
26
|
+
Rake::TestTask.new(:test) do |test|
|
27
|
+
test.libs << 'lib' << 'test'
|
28
|
+
test.pattern = 'test/**/test_*.rb'
|
29
|
+
test.verbose = true
|
30
|
+
end
|
31
|
+
|
32
|
+
task :default => :test
|
33
|
+
|
34
|
+
require 'rake/rdoctask'
|
35
|
+
Rake::RDocTask.new do |rdoc|
|
36
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
37
|
+
|
38
|
+
rdoc.rdoc_dir = 'rdoc'
|
39
|
+
rdoc.title = "bitly-oauth #{version}"
|
40
|
+
rdoc.rdoc_files.include('README*')
|
41
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
42
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/bitly_oauth.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'httparty'
|
4
|
+
require 'oauth2'
|
5
|
+
require 'cgi'
|
6
|
+
require 'forwardable'
|
7
|
+
|
8
|
+
module BitlyOAuth
|
9
|
+
def self.new(*args)
|
10
|
+
BitlyOAuth::Client.new(*args)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'bitly_oauth/access_token'
|
15
|
+
require 'bitly_oauth/client'
|
16
|
+
require 'bitly_oauth/country'
|
17
|
+
require 'bitly_oauth/day'
|
18
|
+
require 'bitly_oauth/error'
|
19
|
+
require 'bitly_oauth/missing_url'
|
20
|
+
require 'bitly_oauth/realtime_link'
|
21
|
+
require 'bitly_oauth/referring_domain'
|
22
|
+
require 'bitly_oauth/referrer'
|
23
|
+
require 'bitly_oauth/response'
|
24
|
+
require 'bitly_oauth/url'
|
25
|
+
require 'bitly_oauth/user'
|
26
|
+
|
27
|
+
require 'bitly_oauth/lib/core_ext/hash'
|
28
|
+
require 'bitly_oauth/lib/core_ext/string'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module BitlyOAuth
|
2
|
+
class AccessToken
|
3
|
+
extend Forwardable
|
4
|
+
delegate [ :client, :token ] => :access_token
|
5
|
+
|
6
|
+
def initialize(access_token)
|
7
|
+
@access_token = access_token
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(method, options)
|
11
|
+
request(:get, method, options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def post(method, options)
|
15
|
+
request(:post, method, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def request(verb, method, options={})
|
20
|
+
response = access_token.send(verb, method, :params => params(options), :parse => :json)
|
21
|
+
response = BitlyOAuth::Response.new(response)
|
22
|
+
if response.success?
|
23
|
+
response.body
|
24
|
+
else
|
25
|
+
raise BitlyOAuth::Error.new(response)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def params(options={})
|
30
|
+
{ :access_token => access_token.token }.merge(options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def access_token
|
34
|
+
@access_token
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
module BitlyOAuth
|
2
|
+
class Client
|
3
|
+
extend Forwardable
|
4
|
+
delegate [ :get, :post ] => :access_token
|
5
|
+
|
6
|
+
BASE_URL = 'https://api-ssl.bit.ly/v3/'
|
7
|
+
|
8
|
+
def initialize(client_id, client_secret)
|
9
|
+
@client_id = client_id
|
10
|
+
@client_secret = client_secret
|
11
|
+
end
|
12
|
+
|
13
|
+
def authorize_url(redirect_url)
|
14
|
+
client.auth_code.authorize_url(:redirect_uri => redirect_url).gsub(/api-ssl.bit.ly/,'bitly.com')
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_access_token_from_code(code, redirect_url)
|
18
|
+
access_token = client.auth_code.get_token(code, :redirect_uri => redirect_url, :parse => :query)
|
19
|
+
BitlyOAuth::AccessToken.new(access_token)
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_access_token_from_code(*args)
|
23
|
+
@access_token ||= get_access_token_from_code(*args)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_access_token_from_token(token, params={})
|
27
|
+
params.stringify_keys!
|
28
|
+
access_token = ::OAuth2::AccessToken.new(client, token, params)
|
29
|
+
BitlyOAuth::AccessToken.new(access_token)
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_access_token_from_token(*args)
|
33
|
+
@access_token ||= get_access_token_from_token(*args)
|
34
|
+
end
|
35
|
+
|
36
|
+
def bitly_pro_domain(domain)
|
37
|
+
get(:bitly_pro_domain, :domain => domain)['bitly_pro_domain']
|
38
|
+
end
|
39
|
+
alias :pro? :bitly_pro_domain
|
40
|
+
|
41
|
+
# Validates a login and api key
|
42
|
+
def validate(x_login, x_api_key)
|
43
|
+
get(:validate, :x_login => x_login, :x_apiKey => x_api_key)['valid'] == 1
|
44
|
+
end
|
45
|
+
alias :valid? :validate
|
46
|
+
|
47
|
+
def shorten(long_url, options={})
|
48
|
+
response = get(:shorten, { :longUrl => long_url }.merge(options))
|
49
|
+
BitlyOAuth::Url.new(self, response)
|
50
|
+
end
|
51
|
+
|
52
|
+
def expand(input)
|
53
|
+
get_method(:expand, input)
|
54
|
+
end
|
55
|
+
|
56
|
+
def clicks(input)
|
57
|
+
get_method(:clicks, input)
|
58
|
+
end
|
59
|
+
|
60
|
+
def info(input)
|
61
|
+
get_method(:info, input)
|
62
|
+
end
|
63
|
+
|
64
|
+
def clicks_by_minute(input)
|
65
|
+
get_method(:clicks_by_minute, input)
|
66
|
+
end
|
67
|
+
|
68
|
+
def clicks_by_day(input, options={})
|
69
|
+
options.reject! { |k, v| k.to_s != 'days' }
|
70
|
+
get_method(:clicks_by_day, input, options)
|
71
|
+
end
|
72
|
+
|
73
|
+
def countries(input)
|
74
|
+
get_single_method(:countries, input)
|
75
|
+
end
|
76
|
+
|
77
|
+
def referrers(input)
|
78
|
+
get_single_method(:referrers, input)
|
79
|
+
end
|
80
|
+
|
81
|
+
def referring_domains(link, options={})
|
82
|
+
response = get('link/referring_domains', :link => link)
|
83
|
+
response['referring_domains'].map do |referring_domain|
|
84
|
+
BitlyOAuth::ReferringDomain.new(referring_domain)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def lookup(input)
|
89
|
+
input = input.to_a
|
90
|
+
response = get(:lookup, :url => input)
|
91
|
+
results = response['lookup'].inject([]) do |results, url|
|
92
|
+
index = input.index(url['long_url'] = url.delete('url'))
|
93
|
+
if url['error'].nil?
|
94
|
+
results[index] = BitlyOAuth::Url.new(self, url)
|
95
|
+
else
|
96
|
+
results[index] = BitlyOAuth::MissingUrl.new(url)
|
97
|
+
end
|
98
|
+
input[index] = nil
|
99
|
+
results
|
100
|
+
end
|
101
|
+
results.length > 1 ? results : results[0]
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def get_method(method, input, options={})
|
107
|
+
options.symbolize_keys!
|
108
|
+
input = input.to_a
|
109
|
+
|
110
|
+
input.each do |i|
|
111
|
+
(options[key_for(i)] ||= []) << i
|
112
|
+
end
|
113
|
+
|
114
|
+
response = get(method, options)
|
115
|
+
|
116
|
+
results = response[method.to_s].inject([]) do |results, url|
|
117
|
+
result_index = input.index(url['short_url'] || url['hash']) || input.index(url['global_hash'])
|
118
|
+
|
119
|
+
if url['error'].nil?
|
120
|
+
results[result_index] = BitlyOAuth::Url.new(self, url)
|
121
|
+
else
|
122
|
+
results[result_index] = BitlyOAuth::MissingUrl.new(url)
|
123
|
+
end
|
124
|
+
input[result_index] = nil
|
125
|
+
results
|
126
|
+
end
|
127
|
+
results.length > 1 ? results : results[0]
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_single_method(method, input)
|
131
|
+
raise ArgumentError.new("This method only takes a hash or url input") unless input.is_a? String
|
132
|
+
|
133
|
+
response = get(method, key_for(input) => input.to_a)
|
134
|
+
BitlyOAuth::Url.new(self, response)
|
135
|
+
end
|
136
|
+
|
137
|
+
def client
|
138
|
+
@client ||= ::OAuth2::Client.new(@client_id, @client_secret, :site => BASE_URL, :token_url => '/oauth/access_token')
|
139
|
+
end
|
140
|
+
|
141
|
+
def access_token
|
142
|
+
@access_token
|
143
|
+
end
|
144
|
+
|
145
|
+
def key_for(input)
|
146
|
+
input.match(/^http:\/\//) ? :shortUrl : :hash
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|