google-api 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +0 -1
- data/CHANGELOG.md +4 -0
- data/google-api.gemspec +2 -2
- data/lib/google-api.rb +0 -1
- data/spec/google-api/api_spec.rb +13 -52
- data/spec/google-api/client_spec.rb +20 -45
- data/spec/google-api/encrypter_spec.rb +1 -5
- data/spec/google-api_spec.rb +8 -16
- data/spec/spec_helper.rb +1 -1
- data/spec/support/oauthable_object.rb +1 -1
- metadata +7 -8
- data/lib/google-api/oauth2.rb +0 -16
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
data/google-api.gemspec
CHANGED
@@ -11,10 +11,10 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
12
12
|
gem.name = "google-api"
|
13
13
|
gem.require_paths = ["lib"]
|
14
|
-
gem.version = "0.
|
14
|
+
gem.version = "0.4.0"
|
15
15
|
|
16
16
|
gem.add_runtime_dependency 'mime-types', '~> 1.0'
|
17
|
-
gem.add_runtime_dependency 'oauth2', '~> 0.
|
17
|
+
gem.add_runtime_dependency 'oauth2', '~> 0.9.0'
|
18
18
|
gem.add_development_dependency 'bundler'
|
19
19
|
gem.add_development_dependency 'rake'
|
20
20
|
gem.add_development_dependency 'rspec'
|
data/lib/google-api.rb
CHANGED
data/spec/google-api/api_spec.rb
CHANGED
@@ -1,61 +1,48 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
shared_context "api call" do
|
4
|
-
|
5
4
|
let(:map) { fixture(:discovery_rest_drive)['resources']['files']['methods'] }
|
6
5
|
let(:api) { GoogleAPI::API.new(client.access_token, :drive, map) }
|
7
6
|
let(:stubbed_response) { OAuth2Response.new }
|
8
|
-
|
7
|
+
|
8
|
+
before do
|
9
9
|
GoogleAPI.discovered_apis[:drive] = fixture(:discovery_rest_drive)
|
10
10
|
client.client.connection = TEST_CONNECTION
|
11
11
|
end
|
12
|
-
|
13
12
|
end
|
14
13
|
|
15
14
|
describe GoogleAPI::API do
|
16
15
|
|
17
16
|
let(:object) { User.new }
|
18
17
|
let(:client) { GoogleAPI::Client.new(object) }
|
19
|
-
|
18
|
+
|
19
|
+
before do
|
20
20
|
GoogleAPI.configure do |config|
|
21
21
|
config.client_id = 'test id'
|
22
22
|
config.client_secret = 'test secret'
|
23
23
|
config.encryption_key = 'encryption key'
|
24
24
|
end
|
25
|
+
GoogleAPI.logger.stub(:error)
|
25
26
|
object.authenticated = true
|
26
27
|
end
|
27
28
|
|
28
29
|
describe "#initialize" do
|
30
|
+
subject { GoogleAPI::API.new(client.access_token, :drive, fixture(:discovery_rest_drive)['resources']) }
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
api.access_token.token.should == client.access_token.token
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should set the api attribute" do
|
37
|
-
api.api.should == :drive
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should set the map attribute" do
|
41
|
-
api.map.should == fixture(:discovery_rest_drive)['resources']
|
42
|
-
end
|
43
|
-
|
32
|
+
its(:api) { should == :drive }
|
33
|
+
its(:map) { should == fixture(:discovery_rest_drive)['resources'] }
|
34
|
+
its('access_token.token') { should == client.access_token.token }
|
44
35
|
end
|
45
36
|
|
46
37
|
describe "API method generation" do
|
47
|
-
|
48
38
|
context "when there are methods lower in the tree" do
|
49
|
-
|
50
39
|
it "should build another GoogleAPI::API class with the correct map" do
|
51
40
|
api = GoogleAPI::API.new(client.access_token, :drive, fixture(:discovery_rest_drive)['resources'])
|
52
41
|
api.files.should be_an_instance_of(GoogleAPI::API)
|
53
42
|
end
|
54
|
-
|
55
43
|
end
|
56
44
|
|
57
45
|
context "when the method tree is the lowest it can be" do
|
58
|
-
|
59
46
|
include_context "api call"
|
60
47
|
|
61
48
|
it "should call the #build_url method" do
|
@@ -65,40 +52,29 @@ describe GoogleAPI::API do
|
|
65
52
|
|
66
53
|
%w(POST PUT PATCH).each do |http_method|
|
67
54
|
context "when the method's HTTP method is #{http_method}" do
|
68
|
-
|
69
55
|
it "should raise ArgumentError if no body was passed" do
|
70
|
-
expect {
|
71
|
-
api.insert(media: '/Test/File/Path.txt')
|
72
|
-
}.to raise_error(ArgumentError)
|
56
|
+
expect { api.insert(media: '/Test/File/Path.txt') }.to raise_error(ArgumentError)
|
73
57
|
end
|
74
|
-
|
75
58
|
end
|
76
59
|
end
|
77
60
|
|
78
61
|
context "when the mediaUpload key is present" do
|
79
|
-
|
80
62
|
it "should call the #upload method" do
|
81
63
|
api.should_receive(:upload).with('post', 'https://www.googleapis.com/resumable/upload/drive/v2/files', body: {title: 'Test File.txt'}, media: '/Test/File/Path.txt')
|
82
64
|
api.insert(body: {title: 'Test File.txt'}, media: '/Test/File/Path.txt')
|
83
65
|
end
|
84
|
-
|
85
66
|
end
|
86
67
|
|
87
68
|
context "when it is a normal API method request" do
|
88
|
-
|
89
69
|
it "should delegate to the #request method" do
|
90
70
|
api.should_receive(:request).with('get', 'https://www.googleapis.com/drive/v2/files', {})
|
91
71
|
api.list
|
92
72
|
end
|
93
|
-
|
94
73
|
end
|
95
|
-
|
96
74
|
end
|
97
|
-
|
98
75
|
end
|
99
76
|
|
100
77
|
describe "#request" do
|
101
|
-
|
102
78
|
include_context "api call"
|
103
79
|
|
104
80
|
it "should build the correct headers hash" do
|
@@ -112,7 +88,6 @@ describe GoogleAPI::API do
|
|
112
88
|
end
|
113
89
|
|
114
90
|
context "when a request is successful" do
|
115
|
-
|
116
91
|
it "should only make the request attempt once" do
|
117
92
|
::OAuth2::AccessToken.any_instance.should_receive(:get).once.and_return(stubbed_response)
|
118
93
|
api.list
|
@@ -125,11 +100,9 @@ describe GoogleAPI::API do
|
|
125
100
|
it "should return the full Response object if body is blank" do
|
126
101
|
api.delete(fileId: 'adummyfileidnumber').should be_an_instance_of(::OAuth2::Response)
|
127
102
|
end
|
128
|
-
|
129
103
|
end
|
130
104
|
|
131
105
|
context "when a request fails and development mode is turned off" do
|
132
|
-
|
133
106
|
it "should attempt the request 5 times" do
|
134
107
|
::OAuth2::AccessToken.any_instance.should_receive(:put).exactly(5).times.and_return(OAuth2Response.new(404))
|
135
108
|
api.update(fileId: 'adummyfileidnumber', body: {bad: 'attribute'})
|
@@ -140,16 +113,13 @@ describe GoogleAPI::API do
|
|
140
113
|
::OAuth2::AccessToken.any_instance.should_receive(:put).once.and_return(stubbed_response)
|
141
114
|
api.update(fileId: 'adummyfileidnumber', body: {bad: 'attribute'})
|
142
115
|
end
|
143
|
-
|
144
116
|
end
|
145
|
-
|
146
117
|
end
|
147
118
|
|
148
119
|
describe "#upload" do
|
149
|
-
|
150
120
|
include_context "api call"
|
151
121
|
|
152
|
-
before
|
122
|
+
before { api.stub(:request).and_return(stubbed_response) }
|
153
123
|
|
154
124
|
it "should build the correct options hash that is passed to the first request" do
|
155
125
|
api.should_receive(:request).with('post', 'https://www.googleapis.com/resumable/upload/drive/v2/files', body: {title: 'Test File.txt', mimeType: 'application/x-ruby'}, headers: {'X-Upload-Content-Type' => 'application/x-ruby'})
|
@@ -158,27 +128,22 @@ describe GoogleAPI::API do
|
|
158
128
|
|
159
129
|
it "should change the original headers for the actual file upload" do
|
160
130
|
api.should_receive(:request)
|
161
|
-
api.should_receive(:request).with(:put, nil, body: File.read(File.expand_path('spec/spec_helper.rb')), headers: {'Content-Type' => 'application/x-ruby', 'Content-Length' => '
|
131
|
+
api.should_receive(:request).with(:put, nil, body: File.read(File.expand_path('spec/spec_helper.rb')), headers: {'Content-Type' => 'application/x-ruby', 'Content-Length' => '392'})
|
162
132
|
api.send(:upload, 'post', 'https://www.googleapis.com/resumable/upload/drive/v2/files', body: {title: 'Test File.txt'}, media: File.expand_path('spec/spec_helper.rb'))
|
163
133
|
end
|
164
|
-
|
165
134
|
end
|
166
135
|
|
167
136
|
describe "#build_url" do
|
168
|
-
|
169
137
|
include_context "api call"
|
170
138
|
|
171
139
|
context "when the mediaUpload key is present" do
|
172
|
-
|
173
140
|
it "should use the rootUrl of the discovered API" do
|
174
141
|
url, options = api.send(:build_url, map['insert'], media: File.expand_path('spec/spec_helper.rb'))
|
175
142
|
url.should == 'https://www.googleapis.com/resumable/upload/drive/v2/files'
|
176
143
|
end
|
177
|
-
|
178
144
|
end
|
179
145
|
|
180
146
|
context "when it is a normal API method request" do
|
181
|
-
|
182
147
|
it "should build the final URL" do
|
183
148
|
url, options = api.send(:build_url, map['get'], fileId: 'adummyfileidnumber', updateViewedDate: true)
|
184
149
|
url.should == 'https://www.googleapis.com/drive/v2/files/adummyfileidnumber?updateViewedDate=true'
|
@@ -190,13 +155,9 @@ describe GoogleAPI::API do
|
|
190
155
|
end
|
191
156
|
|
192
157
|
it "should raise ArgumentError if the parameter is required and the matching option isn't passed" do
|
193
|
-
expect {
|
194
|
-
api.send(:build_url, map['get'], updateViewedDate: true)
|
195
|
-
}.to raise_error(ArgumentError)
|
158
|
+
expect { api.send(:build_url, map['get'], updateViewedDate: true) }.to raise_error(ArgumentError)
|
196
159
|
end
|
197
|
-
|
198
160
|
end
|
199
|
-
|
200
161
|
end
|
201
162
|
|
202
163
|
end
|
@@ -3,114 +3,89 @@ require 'spec_helper'
|
|
3
3
|
describe GoogleAPI::Client do
|
4
4
|
|
5
5
|
let(:object) { User.new }
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
subject { GoogleAPI::Client.new(object) }
|
8
|
+
|
9
|
+
before do
|
8
10
|
GoogleAPI.configure do |config|
|
9
11
|
config.client_id = 'test id'
|
10
12
|
config.client_secret = 'test secret'
|
11
13
|
config.encryption_key = 'encryption key'
|
12
14
|
end
|
15
|
+
GoogleAPI.logger.stub(:info)
|
13
16
|
object.authenticated = true
|
14
|
-
|
17
|
+
subject.client.connection = TEST_CONNECTION
|
15
18
|
end
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
it "should set the object attribute" do
|
20
|
-
client = GoogleAPI::Client.new(object)
|
21
|
-
client.object.should == object
|
22
|
-
end
|
20
|
+
its(:object) { should == object }
|
21
|
+
its(:client) { should be_an_instance_of(::OAuth2::Client) }
|
23
22
|
|
23
|
+
describe "#initialize" do
|
24
24
|
it "should raise NoMethodError if the object isn't oauthable" do
|
25
|
-
expect {
|
26
|
-
GoogleAPI::Client.new(Class.new)
|
27
|
-
}.to raise_error(NoMethodError)
|
25
|
+
expect { GoogleAPI::Client.new(Class.new) }.to raise_error(NoMethodError)
|
28
26
|
end
|
29
27
|
|
30
28
|
it "should raise ArgumentError if the object isn't OAuth2 authenticated" do
|
31
29
|
object.authenticated = false
|
32
|
-
expect {
|
33
|
-
GoogleAPI::Client.new(object)
|
34
|
-
}.to raise_error(ArgumentError)
|
30
|
+
expect { GoogleAPI::Client.new(object) }.to raise_error(ArgumentError)
|
35
31
|
end
|
36
|
-
|
37
32
|
end
|
38
33
|
|
39
34
|
describe "#access_token" do
|
40
|
-
|
41
35
|
it "should call to the OAuth2 Access Token class" do
|
42
|
-
|
36
|
+
subject.access_token.token.should == object.oauth_hash[:access_token]
|
43
37
|
end
|
44
38
|
|
45
39
|
context "when the access token is expired" do
|
46
|
-
|
47
|
-
before(:each) { object.expires_at = Time.now - 86400 }
|
40
|
+
before { object.expires_at = Time.now - 86400 }
|
48
41
|
|
49
42
|
it "should call refresh on the OAuth2 Access Token" do
|
50
43
|
stubbed_access_token = Class.new
|
51
44
|
stubbed_access_token.stub(:token).and_return('test token')
|
52
45
|
::OAuth2::AccessToken.any_instance.should_receive(:refresh!).and_return(stubbed_access_token)
|
53
|
-
|
46
|
+
subject.access_token
|
54
47
|
end
|
55
48
|
|
56
49
|
it "should update the object's stored OAuth information" do
|
57
50
|
object.should_receive(:update_oauth!)
|
58
|
-
|
51
|
+
subject.access_token
|
59
52
|
end
|
60
|
-
|
61
53
|
end
|
62
54
|
|
63
55
|
context "when the access token is fresh" do
|
64
|
-
|
65
56
|
it "should not try and refresh the token again" do
|
66
57
|
::OAuth2::AccessToken.any_instance.should_not_receive(:refresh!)
|
67
|
-
|
58
|
+
subject.access_token
|
68
59
|
end
|
69
|
-
|
70
60
|
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
describe "#client" do
|
75
|
-
|
76
|
-
it "should create the OAuth2 Client instance" do
|
77
|
-
client.client.should be_an_instance_of(::OAuth2::Client)
|
78
|
-
end
|
79
|
-
|
80
61
|
end
|
81
62
|
|
82
63
|
describe "API method generation" do
|
83
|
-
|
84
64
|
context "when the API hasn't been discovered" do
|
85
|
-
|
86
65
|
it "should call out to the Discovery API" do
|
87
66
|
GoogleAPI.discovered_apis[:drive].should be_nil
|
88
|
-
|
67
|
+
subject.drive
|
89
68
|
GoogleAPI.discovered_apis[:drive].should == fixture(:discovery_rest_drive)
|
90
69
|
end
|
91
70
|
|
92
71
|
it "should save the Discovery API map to the cache" do
|
93
|
-
|
72
|
+
subject.drive
|
94
73
|
GoogleAPI.discovered_apis[:drive].should == fixture(:discovery_rest_drive)
|
95
74
|
end
|
96
|
-
|
97
75
|
end
|
98
76
|
|
99
77
|
context "when the API has already been discovered" do
|
100
|
-
|
101
78
|
it "should not fetch the Discovery API map" do
|
102
79
|
GoogleAPI.discovered_apis[:drive] = fixture(:discovery_drive)
|
103
80
|
::OAuth2::AccessToken.any_instance.should_not_receive(:get)
|
104
|
-
|
81
|
+
subject.drive
|
105
82
|
end
|
106
|
-
|
107
83
|
end
|
108
84
|
|
109
85
|
it "should build the GoogleAPI::API class" do
|
110
86
|
GoogleAPI::API.should_receive(:new).with(an_instance_of(::OAuth2::AccessToken), :drive, fixture(:discovery_rest_drive)['resources'])
|
111
|
-
|
87
|
+
subject.drive
|
112
88
|
end
|
113
|
-
|
114
89
|
end
|
115
90
|
|
116
91
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe GoogleAPI::Encrypter do
|
4
4
|
|
5
|
-
before
|
5
|
+
before do
|
6
6
|
GoogleAPI.configure do |config|
|
7
7
|
config.client_id = 'test id'
|
8
8
|
config.client_secret = 'test secret'
|
@@ -11,19 +11,15 @@ describe GoogleAPI::Encrypter do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe "#encrypt!" do
|
14
|
-
|
15
14
|
it "should return an encrypted version of the string" do
|
16
15
|
GoogleAPI::Encrypter.encrypt!('test').should == "MMLzeQigMLGcvTvHczYxjg=="
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
20
18
|
|
21
19
|
describe "#decrypt!" do
|
22
|
-
|
23
20
|
it "should return an decrypted version of the string" do
|
24
21
|
GoogleAPI::Encrypter.decrypt!("MMLzeQigMLGcvTvHczYxjg==").should == 'test'
|
25
22
|
end
|
26
|
-
|
27
23
|
end
|
28
24
|
|
29
25
|
end
|
data/spec/google-api_spec.rb
CHANGED
@@ -3,7 +3,6 @@ require 'spec_helper'
|
|
3
3
|
describe GoogleAPI do
|
4
4
|
|
5
5
|
describe "#configure" do
|
6
|
-
|
7
6
|
it "should raise an error when the CLIENT ID is blank" do
|
8
7
|
expect {
|
9
8
|
GoogleAPI.configure do |config|
|
@@ -88,32 +87,25 @@ describe GoogleAPI do
|
|
88
87
|
config.encryption_key = 'encryption key'
|
89
88
|
end
|
90
89
|
end
|
91
|
-
|
92
90
|
end
|
93
91
|
|
94
92
|
describe "#discovered_apis" do
|
93
|
+
subject { GoogleAPI.discovered_apis }
|
95
94
|
|
96
|
-
it
|
97
|
-
|
98
|
-
end
|
95
|
+
it { should be_an_instance_of(Hash) }
|
96
|
+
it { should be_empty }
|
99
97
|
|
100
|
-
|
101
|
-
GoogleAPI.discovered_apis[:test_api1] = {a: 1, b: 2, c: 3}
|
98
|
+
context "when a new api is cached" do
|
99
|
+
before { GoogleAPI.discovered_apis[:test_api1] = {a: 1, b: 2, c: 3} }
|
102
100
|
|
103
|
-
|
101
|
+
its([:test_api1]) { should == {a: 1, b: 2, c: 3} }
|
104
102
|
end
|
105
|
-
|
106
103
|
end
|
107
104
|
|
108
105
|
describe "#stdout_logger" do
|
106
|
+
subject { GoogleAPI.stdout_logger }
|
109
107
|
|
110
|
-
|
111
|
-
|
112
|
-
it "should create a new Logger object" do
|
113
|
-
logger = GoogleAPI.stdout_logger
|
114
|
-
logger.should be_an_instance_of(Logger)
|
115
|
-
end
|
116
|
-
|
108
|
+
it { should be_an_instance_of(Logger) }
|
117
109
|
end
|
118
110
|
|
119
111
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mime-types
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.
|
37
|
+
version: 0.9.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
45
|
+
version: 0.9.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: bundler
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,7 +128,6 @@ files:
|
|
128
128
|
- lib/google-api/api.rb
|
129
129
|
- lib/google-api/client.rb
|
130
130
|
- lib/google-api/encrypter.rb
|
131
|
-
- lib/google-api/oauth2.rb
|
132
131
|
- lib/google-api/railtie.rb
|
133
132
|
- spec/fixtures/discovery_drive.json
|
134
133
|
- spec/fixtures/discovery_rest_drive.json
|
@@ -158,7 +157,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
157
|
version: '0'
|
159
158
|
segments:
|
160
159
|
- 0
|
161
|
-
hash:
|
160
|
+
hash: 3431589687934800430
|
162
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
162
|
none: false
|
164
163
|
requirements:
|
@@ -167,10 +166,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
166
|
version: '0'
|
168
167
|
segments:
|
169
168
|
- 0
|
170
|
-
hash:
|
169
|
+
hash: 3431589687934800430
|
171
170
|
requirements: []
|
172
171
|
rubyforge_project:
|
173
|
-
rubygems_version: 1.8.
|
172
|
+
rubygems_version: 1.8.25
|
174
173
|
signing_key:
|
175
174
|
specification_version: 3
|
176
175
|
summary: A simple but powerful ruby API wrapper for Google's services.
|
data/lib/google-api/oauth2.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# This can go away once the below commit is released with OAuth2.
|
2
|
-
# https://github.com/intridea/oauth2/commit/8dc6feab9927c3fc03b8e0975909a96049a1cbd3
|
3
|
-
# Should be in 0.8.1 or 0.9.0
|
4
|
-
|
5
|
-
module OAuth2
|
6
|
-
class AccessToken
|
7
|
-
|
8
|
-
# Make a PATCH request with the Access Token
|
9
|
-
#
|
10
|
-
# @see AccessToken#request
|
11
|
-
def patch(path, opts={}, &block)
|
12
|
-
request(:patch, path, opts, &block)
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|