google_drive_oauth 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fcd1258b321431a8bf2a022117cc073229839b5e
4
+ data.tar.gz: 9a45867273438eb625a3f4359f42d9d93cf5697a
5
+ SHA512:
6
+ metadata.gz: 6cfd12a4ccf7142bda2950a3c93f72622888db5a5b3898d585d07ec1de70cabf66e1f4def8e37065517d1bcd28b962edd7e539794d8ea8dc79c17f639134e98c
7
+ data.tar.gz: 8867c09cd0618f6cb65aacfe24acfcfa1a195e9b072ee022ce0cf5fb805d4ecb1b6a379fe5b5fc3cd0f9b218539bc633e933115e929b90ebd7ebd36e13c9200e
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.2
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in google_drive_oauth.gemspec
4
+ group :test do
5
+ gem 'rspec'
6
+ gem 'vcr'
7
+ gem 'webmock'
8
+ gem 'pry'
9
+ end
10
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Steve England
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
+ # GoogleDriveOauth
2
+
3
+ Thin wrapper around Oauth2 to make logging in with the Google Drive gem easier.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'google_drive_oauth'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install google_drive_oauth
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/stengland/google_drive_oauth/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'google_drive/oauth/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "google_drive_oauth"
8
+ spec.version = GoogleDrive::Oauth::VERSION
9
+ spec.authors = ["Steve England"]
10
+ spec.email = ["stephen.england@gmail.com"]
11
+ spec.summary = %q{Simplfies connecting to Google Drive}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "google_drive", "~> 1.0.0"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.6"
23
+ spec.add_development_dependency "rake"
24
+ end
@@ -0,0 +1,5 @@
1
+ module GoogleDrive
2
+ module Oauth
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
@@ -0,0 +1,49 @@
1
+ require 'google_drive'
2
+ require 'oauth2'
3
+
4
+ module GoogleDrive
5
+ class OAuth
6
+ REDIRECT_URL = "urn:ietf:wg:oauth:2.0:oob"
7
+
8
+ def initialize(options)
9
+ @options = options
10
+ end
11
+
12
+ def auth_url
13
+ client.auth_code.authorize_url(
14
+ :redirect_uri => REDIRECT_URL,
15
+ :scope => "https://www.googleapis.com/auth/drive " +
16
+ "https://spreadsheets.google.com/feeds/"
17
+ )
18
+ end
19
+
20
+ def get_token(authorization_code)
21
+ client.auth_code.get_token(
22
+ authorization_code,
23
+ :redirect_uri => REDIRECT_URL)
24
+ end
25
+
26
+ def drive_session(access_token: nil, refresh_token: options[:refresh_token])
27
+ access_token = load_token(refresh_token) if access_token.nil?
28
+ access_token = access_token.refresh! if access_token.token.empty? or access_token.expired?
29
+ GoogleDrive.login_with_oauth(access_token.token)
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :options
35
+
36
+ def load_token(refresh_token)
37
+ OAuth2::AccessToken.from_hash(client, {refresh_token: refresh_token})
38
+ end
39
+
40
+ def client
41
+ @client ||= OAuth2::Client.new(
42
+ options[:client_id], options[:client_secret],
43
+ :site => "https://accounts.google.com",
44
+ :token_url => "/o/oauth2/token",
45
+ :authorize_url => "/o/oauth2/auth")
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,455 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://accounts.google.com/o/oauth2/token
6
+ body:
7
+ encoding: US-ASCII
8
+ string: client_id=478899299614-91kb33lr539o6rjgb513l75q9gktap6s.apps.googleusercontent.com&client_secret=4TrXN3ksEWrQ_VBPV60BezwP&grant_type=refresh_token&refresh_token=1%2FWVbj1g9SSTIUCSwfPqxnTi1eKYji0JpmFglNF2_ivJI
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.1
12
+ Content-Type:
13
+ - application/x-www-form-urlencoded
14
+ Accept:
15
+ - ! '*/*'
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=utf-8
23
+ Cache-Control:
24
+ - no-cache, no-store, max-age=0, must-revalidate
25
+ Pragma:
26
+ - no-cache
27
+ Expires:
28
+ - Fri, 01 Jan 1990 00:00:00 GMT
29
+ Date:
30
+ - Thu, 16 Apr 2015 16:22:44 GMT
31
+ Content-Disposition:
32
+ - attachment; filename="json.txt"; filename*=UTF-8''json.txt
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ X-Frame-Options:
36
+ - SAMEORIGIN
37
+ X-Xss-Protection:
38
+ - 1; mode=block
39
+ Server:
40
+ - GSE
41
+ Alternate-Protocol:
42
+ - 443:quic,p=0.5
43
+ Accept-Ranges:
44
+ - none
45
+ Vary:
46
+ - Accept-Encoding
47
+ Transfer-Encoding:
48
+ - chunked
49
+ body:
50
+ encoding: US-ASCII
51
+ string: ! "{\n \"access_token\" : \"ya29.VwHvBaHF-u-V4p1cqENM_RNlCruj1XJ83u1RB6X42zOBXss10GP86vcpNNlD6HV-ZKVHB2jcKmplFw\",\n
52
+ \ \"token_type\" : \"Bearer\",\n \"expires_in\" : 3600\n}"
53
+ http_version:
54
+ recorded_at: Thu, 16 Apr 2015 16:22:44 GMT
55
+ - request:
56
+ method: get
57
+ uri: https://www.googleapis.com/discovery/v1/apis/drive/v2/rest
58
+ body:
59
+ encoding: US-ASCII
60
+ string: ''
61
+ headers:
62
+ User-Agent:
63
+ - ! "google_drive Ruby library/0.4.0 google-api-ruby-client/0.8.6 Linux/3.18.6-1-ARCH\n
64
+ (gzip)"
65
+ Accept-Encoding:
66
+ - gzip
67
+ Content-Type:
68
+ - ''
69
+ Accept:
70
+ - ! '*/*'
71
+ response:
72
+ status:
73
+ code: 200
74
+ message: !binary |-
75
+ T0s=
76
+ headers:
77
+ !binary "RXhwaXJlcw==":
78
+ - !binary |-
79
+ VGh1LCAxNiBBcHIgMjAxNSAxNjoyNzo0NCBHTVQ=
80
+ !binary "RGF0ZQ==":
81
+ - !binary |-
82
+ VGh1LCAxNiBBcHIgMjAxNSAxNjoyMjo0NCBHTVQ=
83
+ !binary "RXRhZw==":
84
+ - !binary |-
85
+ InllNm9ydjJGLTFucE1XM3U5c3VNM2E3QzVCby9EU0JISjl0d2ppQkxSaVMy
86
+ ZEE3QmU0QXNCUWsi
87
+ !binary "VmFyeQ==":
88
+ - !binary |-
89
+ T3JpZ2lu
90
+ - !binary |-
91
+ WC1PcmlnaW4=
92
+ !binary "Q29udGVudC1UeXBl":
93
+ - !binary |-
94
+ YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOA==
95
+ !binary "Q29udGVudC1FbmNvZGluZw==":
96
+ - !binary |-
97
+ Z3ppcA==
98
+ !binary "WC1Db250ZW50LVR5cGUtT3B0aW9ucw==":
99
+ - !binary |-
100
+ bm9zbmlmZg==
101
+ !binary "WC1GcmFtZS1PcHRpb25z":
102
+ - !binary |-
103
+ U0FNRU9SSUdJTg==
104
+ !binary "WC1Yc3MtUHJvdGVjdGlvbg==":
105
+ - !binary |-
106
+ MTsgbW9kZT1ibG9jaw==
107
+ !binary "Q29udGVudC1MZW5ndGg=":
108
+ - !binary |-
109
+ MTQ3MTU=
110
+ !binary "U2VydmVy":
111
+ - !binary |-
112
+ R1NF
113
+ !binary "Q2FjaGUtQ29udHJvbA==":
114
+ - !binary |-
115
+ cHVibGljLCBtYXgtYWdlPTMwMCwgbXVzdC1yZXZhbGlkYXRlLCBuby10cmFu
116
+ c2Zvcm0=
117
+ !binary "QWdl":
118
+ - !binary |-
119
+ MA==
120
+ !binary "QWx0ZXJuYXRlLVByb3RvY29s":
121
+ - !binary |-
122
+ NDQzOnF1aWMscD0wLjU=
123
+ body:
124
+ encoding: ASCII-8BIT
125
+ string: !binary |-
126
+ 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
453
+ http_version:
454
+ recorded_at: Thu, 16 Apr 2015 16:22:44 GMT
455
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,56 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://accounts.google.com/o/oauth2/token
6
+ body:
7
+ encoding: US-ASCII
8
+ string: client_id=478899299614-91kb33lr539o6rjgb513l75q9gktap6s.apps.googleusercontent.com&client_secret=4TrXN3ksEWrQ_VBPV60BezwP&code=4%2FALCU_YJmxE-ciVtbtX0kjI40tOJ8YNuK3Upg_0hMC2A.8mqF_IZbG-sUWmFiZwPfH03fnvqFmQI&grant_type=authorization_code&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.1
12
+ Content-Type:
13
+ - application/x-www-form-urlencoded
14
+ Accept:
15
+ - ! '*/*'
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=utf-8
23
+ Cache-Control:
24
+ - no-cache, no-store, max-age=0, must-revalidate
25
+ Pragma:
26
+ - no-cache
27
+ Expires:
28
+ - Fri, 01 Jan 1990 00:00:00 GMT
29
+ Date:
30
+ - Thu, 16 Apr 2015 16:09:56 GMT
31
+ Content-Disposition:
32
+ - attachment; filename="json.txt"; filename*=UTF-8''json.txt
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ X-Frame-Options:
36
+ - SAMEORIGIN
37
+ X-Xss-Protection:
38
+ - 1; mode=block
39
+ Server:
40
+ - GSE
41
+ Alternate-Protocol:
42
+ - 443:quic,p=0.5
43
+ Accept-Ranges:
44
+ - none
45
+ Vary:
46
+ - Accept-Encoding
47
+ Transfer-Encoding:
48
+ - chunked
49
+ body:
50
+ encoding: US-ASCII
51
+ string: ! "{\n \"access_token\" : \"ya29.VwGumv7WmhOZqkhgzmXOlekffSvbeNLzd4OVwxumhQr_0IAh1HJHdvUIE6iEz1gZoM1JWDlbGCoUNQ\",\n
52
+ \ \"token_type\" : \"Bearer\",\n \"expires_in\" : 3600,\n \"refresh_token\"
53
+ : \"1/WVbj1g9SSTIUCSwfPqxnTi1eKYji0JpmFglNF2_ivJI\"\n}"
54
+ http_version:
55
+ recorded_at: Thu, 16 Apr 2015 16:09:56 GMT
56
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,38 @@
1
+ require 'google_drive_oauth'
2
+ require 'vcr'
3
+ require 'pry'
4
+
5
+ VCR.configure do |c|
6
+ c.cassette_library_dir = 'spec/cassettes'
7
+ c.hook_into :webmock
8
+ c.configure_rspec_metadata!
9
+ end
10
+
11
+ describe GoogleDrive::OAuth do
12
+ let(:my_options) {{
13
+ client_id: '478899299614-91kb33lr539o6rjgb513l75q9gktap6s.apps.googleusercontent.com',
14
+ client_secret: '4TrXN3ksEWrQ_VBPV60BezwP',
15
+ refresh_token: '1/WVbj1g9SSTIUCSwfPqxnTi1eKYji0JpmFglNF2_ivJI'
16
+ }}
17
+ subject(:google_drive_oauth) { GoogleDrive::OAuth.new(my_options) }
18
+
19
+ describe 'auth_url' do
20
+ it "is a google account url" do
21
+ expect(subject.auth_url).to eq 'https://accounts.google.com/o/oauth2/auth?client_id=478899299614-91kb33lr539o6rjgb513l75q9gktap6s.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds%2F'
22
+ end
23
+ end
24
+
25
+ describe '#get_token', vcr: true do
26
+ it 'fetches a new token from google' do
27
+ my_code = '4/ALCU_YJmxE-ciVtbtX0kjI40tOJ8YNuK3Upg_0hMC2A.8mqF_IZbG-sUWmFiZwPfH03fnvqFmQI'
28
+ expect(google_drive_oauth.get_token(my_code)).to be_a OAuth2::AccessToken
29
+ end
30
+ end
31
+
32
+ describe '#drive_session', vcr: true do
33
+ it 'loads and returns a drive session' do
34
+ expect(google_drive_oauth.drive_session).to be_a GoogleDrive::Session
35
+ end
36
+ end
37
+
38
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: google_drive_oauth
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Steve England
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: google_drive
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email:
57
+ - stephen.england@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".ruby-version"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - google_drive_oauth.gemspec
69
+ - lib/google_drive/oauth/version.rb
70
+ - lib/google_drive_oauth.rb
71
+ - spec/cassettes/GoogleDrive_OAuth/_drive_session/loads_and_returns_a_drive_session.yml
72
+ - spec/cassettes/GoogleDrive_OAuth/_get_token/fetches_a_new_token_from_google.yml
73
+ - spec/google_drive_oauth_spec.rb
74
+ homepage: ''
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.5.1
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: Simplfies connecting to Google Drive
98
+ test_files:
99
+ - spec/cassettes/GoogleDrive_OAuth/_drive_session/loads_and_returns_a_drive_session.yml
100
+ - spec/cassettes/GoogleDrive_OAuth/_get_token/fetches_a_new_token_from_google.yml
101
+ - spec/google_drive_oauth_spec.rb