google_drive_oauth 0.0.2

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.
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