motion-oauth2 0.0.1
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/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +14 -0
- data/VERSION +1 -0
- data/example/fb_graph.rb +22 -0
- data/lib/motion-oauth2.rb +14 -0
- data/lib/motion/oauth2.rb +58 -0
- data/lib/motion/oauth2/debugger.rb +17 -0
- data/lib/motion/oauth2/error.rb +28 -0
- data/lib/motion/oauth2/response.rb +82 -0
- data/motion-oauth2.gemspec +19 -0
- data/spec/motion/oauth2_spec.rb +32 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/motion_stub.rb +14 -0
- metadata +134 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 nov matake
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Motion::Oauth2
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'motion-oauth2'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install motion-oauth2
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
$:.unshift("/Library/RubyMotion/lib")
|
3
|
+
require 'motion/project'
|
4
|
+
Bundler.setup
|
5
|
+
Bundler.require
|
6
|
+
|
7
|
+
namespace :spec do
|
8
|
+
desc "Run Motion::OAuth2 specs without compile"
|
9
|
+
task :lib do
|
10
|
+
sh "bacon #{Dir.glob("spec/**/*_spec.rb").join(' ')}"
|
11
|
+
end
|
12
|
+
task :motion => 'spec'
|
13
|
+
task :all => [:lib, :motion]
|
14
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/example/fb_graph.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# NOTE:
|
2
|
+
# FB doesn't support "Bearer" schema.
|
3
|
+
# You need to specify "OAuth" schema as the optional 2nd argument here.
|
4
|
+
oauth2 = Motion::OAuth2.new(ACCESS_TOKEN, :OAuth)
|
5
|
+
|
6
|
+
oauth2.get 'https://graph.facebook.com/me' do |res|
|
7
|
+
@res = res
|
8
|
+
case
|
9
|
+
when res.success?
|
10
|
+
if res.json?
|
11
|
+
puts "Hello #{res.body['name']}!" # => If response is JSON, it's automatically parsed.
|
12
|
+
else
|
13
|
+
puts res.body
|
14
|
+
end
|
15
|
+
when res.redirect?
|
16
|
+
# ignore
|
17
|
+
when res.error?
|
18
|
+
puts res.body
|
19
|
+
puts res.error.code # => OAuth2 error code as Symbol, or :unknown
|
20
|
+
puts res.error.description # => OAuth2 error description, or nil
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
unless defined?(Motion::Project::Config)
|
2
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'bubble-wrap/core'
|
6
|
+
require 'bubble-wrap/http'
|
7
|
+
|
8
|
+
Motion::Project::App.setup do |app|
|
9
|
+
Dir.glob(
|
10
|
+
File.join(File.dirname(__FILE__), 'motion/**/*.rb')
|
11
|
+
).each do |file|
|
12
|
+
app.files.unshift file
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Motion
|
2
|
+
class OAuth2
|
3
|
+
attr_accessor :access_token, :schema
|
4
|
+
|
5
|
+
def initialize(access_token, schema = :Bearer)
|
6
|
+
self.access_token = access_token
|
7
|
+
self.schema = schema
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(url, options = {}, &block)
|
11
|
+
request :get, url, options, &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def post(url, options = {}, &block)
|
15
|
+
request :post, url, options, &block
|
16
|
+
end
|
17
|
+
|
18
|
+
def put(url, options = {}, &block)
|
19
|
+
request :put, url, options, &block
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete(url, options = {}, &block)
|
23
|
+
request :delete, url, options, &block
|
24
|
+
end
|
25
|
+
|
26
|
+
def head(url, options = {}, &block)
|
27
|
+
request :head, url, options, &block
|
28
|
+
end
|
29
|
+
|
30
|
+
def patch(url, options = {}, &block)
|
31
|
+
request :patch, url, options, &block
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def request(method, url, options = {}, &block)
|
37
|
+
BubbleWrap::HTTP.send method, url, with_token(options) do |raw_response|
|
38
|
+
response = Response.new raw_response
|
39
|
+
if block.is_a? Proc
|
40
|
+
block.call response
|
41
|
+
else
|
42
|
+
# TODO:
|
43
|
+
# Warn here that developers should handle OAuth2 error here.
|
44
|
+
# But how to *warn* using NSLog??
|
45
|
+
NSLog "You don't care about OAuth2 errors? otherwise specify your own callback as block."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def with_token(options = {})
|
51
|
+
options[:headers] ||= {}
|
52
|
+
options[:headers].merge!(
|
53
|
+
Authorization: "#{schema} #{access_token}"
|
54
|
+
)
|
55
|
+
options
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Motion
|
2
|
+
class OAuth2
|
3
|
+
class Error
|
4
|
+
attr_accessor :raw, :code, :description, :url, :www_authenticate
|
5
|
+
|
6
|
+
def initialize(body, www_authenticate_header = nil)
|
7
|
+
self.raw = body
|
8
|
+
self.www_authenticate = www_authenticate_header
|
9
|
+
if oauth2_error?
|
10
|
+
self.code = body['error'].to_sym
|
11
|
+
self.description = body['description']
|
12
|
+
self.url = body['error_url']
|
13
|
+
else
|
14
|
+
self.code = :unknown
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def oauth2_error?
|
19
|
+
@body.is_a?(Hash) &&
|
20
|
+
[
|
21
|
+
'invalid_request',
|
22
|
+
'invalid_token',
|
23
|
+
'insufficient_scope'
|
24
|
+
].include?(body[:error])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Motion
|
2
|
+
class OAuth2
|
3
|
+
class Response
|
4
|
+
attr_accessor :raw_response
|
5
|
+
|
6
|
+
def initialize(raw_response)
|
7
|
+
self.raw_response = raw_response
|
8
|
+
end
|
9
|
+
|
10
|
+
def success?
|
11
|
+
(200..299).include? status_code
|
12
|
+
end
|
13
|
+
|
14
|
+
def redirect?
|
15
|
+
(300..399).include? status_code
|
16
|
+
end
|
17
|
+
|
18
|
+
def client_error?
|
19
|
+
(400..499).include? status_code
|
20
|
+
end
|
21
|
+
|
22
|
+
def server_error?
|
23
|
+
(500..599).include? status_code
|
24
|
+
end
|
25
|
+
|
26
|
+
def error?
|
27
|
+
client_error? || server_error?
|
28
|
+
end
|
29
|
+
|
30
|
+
def bad_request?
|
31
|
+
status_code = 400
|
32
|
+
end
|
33
|
+
|
34
|
+
def unauthorized?
|
35
|
+
status_code == 401
|
36
|
+
end
|
37
|
+
|
38
|
+
def forbidden?
|
39
|
+
status_code == 402
|
40
|
+
end
|
41
|
+
|
42
|
+
def not_found?
|
43
|
+
status_code == 400
|
44
|
+
end
|
45
|
+
|
46
|
+
def json?
|
47
|
+
!!json
|
48
|
+
end
|
49
|
+
|
50
|
+
def status_code
|
51
|
+
raw_response.status_code
|
52
|
+
end
|
53
|
+
|
54
|
+
def body
|
55
|
+
raw_response.body.to_str
|
56
|
+
end
|
57
|
+
|
58
|
+
def json
|
59
|
+
@json ||= case raw_response.headers['Content-Type']
|
60
|
+
when /^application\/json/
|
61
|
+
BubbleWrap::JSON.parse body
|
62
|
+
when /^text\/javascript/
|
63
|
+
# NOTE: FB Graph API uses text/javasctipt Content-Type for JSON response
|
64
|
+
case body
|
65
|
+
when /^(\[|\{)/
|
66
|
+
BubbleWrap::JSON.parse body
|
67
|
+
else
|
68
|
+
body
|
69
|
+
end
|
70
|
+
else
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def error
|
76
|
+
if error?
|
77
|
+
Error.new body, raw_response.headers['WWW-Authenticate']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.authors = ["nov matake"]
|
5
|
+
gem.email = ["nov@matake.jp"]
|
6
|
+
gem.description = %q{OAuth2 client library for RubyMotion apps, you need APIs right?}
|
7
|
+
gem.summary = %q{OAuth2 client library for RubyMotion apps}
|
8
|
+
gem.homepage = "https://github.com/nov/motion-oauth2"
|
9
|
+
gem.files = `git ls-files`.split($\)
|
10
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
11
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
12
|
+
gem.name = "motion-oauth2"
|
13
|
+
gem.require_paths = ["lib"]
|
14
|
+
gem.version = File.read("VERSION").delete("\n\r")
|
15
|
+
gem.add_runtime_dependency "bubble-wrap"
|
16
|
+
gem.add_development_dependency 'mocha', '0.11.4'
|
17
|
+
gem.add_development_dependency 'mocha-on-bacon'
|
18
|
+
gem.add_development_dependency 'bacon'
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path('../../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
describe Motion::OAuth2 do
|
4
|
+
before do
|
5
|
+
@client = Motion::OAuth2.new('access_token')
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.new' do
|
9
|
+
it 'should setup access token' do
|
10
|
+
client = Motion::OAuth2.new('access_token')
|
11
|
+
client.access_token.should == 'access_token'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should use Bearer schema as default' do
|
15
|
+
client = Motion::OAuth2.new('access_token')
|
16
|
+
client.schema.should == :Bearer
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should allow overwrite schema' do
|
20
|
+
client = Motion::OAuth2.new('access_token', :OAuth)
|
21
|
+
client.schema.should == :OAuth
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
[:get, :post, :put, :delete, :head, :patch].each do |method|
|
26
|
+
describe "##{method}" do
|
27
|
+
# TODO
|
28
|
+
# it 'should set OAuth2 Authorization header'
|
29
|
+
# others?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-oauth2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- nov matake
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bubble-wrap
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: mocha
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - '='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.11.4
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.11.4
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: mocha-on-bacon
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: bacon
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: OAuth2 client library for RubyMotion apps, you need APIs right?
|
79
|
+
email:
|
80
|
+
- nov@matake.jp
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- Gemfile
|
87
|
+
- LICENSE
|
88
|
+
- README.md
|
89
|
+
- Rakefile
|
90
|
+
- VERSION
|
91
|
+
- example/fb_graph.rb
|
92
|
+
- lib/motion-oauth2.rb
|
93
|
+
- lib/motion/oauth2.rb
|
94
|
+
- lib/motion/oauth2/debugger.rb
|
95
|
+
- lib/motion/oauth2/error.rb
|
96
|
+
- lib/motion/oauth2/response.rb
|
97
|
+
- motion-oauth2.gemspec
|
98
|
+
- spec/motion/oauth2_spec.rb
|
99
|
+
- spec/spec_helper.rb
|
100
|
+
- spec/support/motion_stub.rb
|
101
|
+
homepage: https://github.com/nov/motion-oauth2
|
102
|
+
licenses: []
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
hash: 1143494254103297252
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
hash: 1143494254103297252
|
125
|
+
requirements: []
|
126
|
+
rubyforge_project:
|
127
|
+
rubygems_version: 1.8.24
|
128
|
+
signing_key:
|
129
|
+
specification_version: 3
|
130
|
+
summary: OAuth2 client library for RubyMotion apps
|
131
|
+
test_files:
|
132
|
+
- spec/motion/oauth2_spec.rb
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/support/motion_stub.rb
|