google-api-client 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +8 -0
- data/Gemfile +9 -7
- data/Gemfile.lock +44 -25
- data/Rakefile +1 -10
- data/bin/google-api +4 -4
- data/lib/google/api_client.rb +27 -30
- data/lib/google/api_client/discovery/media.rb +5 -5
- data/lib/google/api_client/discovery/method.rb +11 -6
- data/lib/google/api_client/reference.rb +61 -31
- data/lib/google/api_client/result.rb +22 -0
- data/lib/google/api_client/version.rb +1 -1
- data/spec/google/api_client/batch_spec.rb +17 -13
- data/spec/google/api_client/discovery_spec.rb +156 -148
- data/spec/google/api_client/media_spec.rb +19 -12
- data/spec/google/api_client/result_spec.rb +44 -9
- data/spec/google/api_client/service_account_spec.rb +6 -6
- data/spec/google/api_client_spec.rb +25 -27
- data/spec/spec_helper.rb +6 -4
- data/tasks/gem.rake +8 -11
- data/tasks/spec.rake +22 -49
- metadata +168 -127
- data/spec/spec.opts +0 -2
@@ -25,22 +25,22 @@ describe Google::APIClient::UploadIO do
|
|
25
25
|
media = Google::APIClient::UploadIO.new('doesnotexist', 'text/plain')
|
26
26
|
end).should raise_error
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
describe 'with a file' do
|
30
30
|
before do
|
31
31
|
@file = File.expand_path('files/sample.txt', fixtures_path)
|
32
32
|
@media = Google::APIClient::UploadIO.new(@file, 'text/plain')
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it 'should report the correct file length' do
|
36
36
|
@media.length.should == File.size(@file)
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
it 'should have a mime type' do
|
40
40
|
@media.content_type.should == 'text/plain'
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
describe 'with StringIO' do
|
45
45
|
before do
|
46
46
|
@content = "hello world"
|
@@ -50,7 +50,7 @@ describe Google::APIClient::UploadIO do
|
|
50
50
|
it 'should report the correct file length' do
|
51
51
|
@media.length.should == @content.length
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
it 'should have a mime type' do
|
55
55
|
@media.content_type.should == 'text/plain'
|
56
56
|
end
|
@@ -58,9 +58,16 @@ describe Google::APIClient::UploadIO do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
describe Google::APIClient::ResumableUpload do
|
61
|
+
CLIENT ||= Google::APIClient.new
|
62
|
+
|
63
|
+
after do
|
64
|
+
# Reset client to not-quite-pristine state
|
65
|
+
CLIENT.key = nil
|
66
|
+
CLIENT.user_ip = nil
|
67
|
+
end
|
68
|
+
|
61
69
|
before do
|
62
|
-
@
|
63
|
-
@drive = @client.discovered_api('drive', 'v1')
|
70
|
+
@drive = CLIENT.discovered_api('drive', 'v1')
|
64
71
|
@file = File.expand_path('files/sample.txt', fixtures_path)
|
65
72
|
@media = Google::APIClient::UploadIO.new(@file, 'text/plain')
|
66
73
|
@uploader = Google::APIClient::ResumableUpload.new(
|
@@ -68,7 +75,7 @@ describe Google::APIClient::ResumableUpload do
|
|
68
75
|
@media,
|
69
76
|
'https://www.googleapis.com/upload/drive/v1/files/12345')
|
70
77
|
end
|
71
|
-
|
78
|
+
|
72
79
|
it 'should consider 20x status as complete' do
|
73
80
|
api_client = stub('api', :execute => mock_result(200))
|
74
81
|
@uploader.send_chunk(api_client)
|
@@ -93,8 +100,8 @@ describe Google::APIClient::ResumableUpload do
|
|
93
100
|
@uploader.send_chunk(api_client)
|
94
101
|
@uploader.location.should == 'https://www.googleapis.com/upload/drive/v1/files/abcdef'
|
95
102
|
end
|
96
|
-
|
97
|
-
it 'should resume from the saved range reported by the server' do
|
103
|
+
|
104
|
+
it 'should resume from the saved range reported by the server' do
|
98
105
|
api_client = mock('api')
|
99
106
|
api_client.should_receive(:execute).and_return(mock_result(308, 'range' => '0-99'))
|
100
107
|
api_client.should_receive(:execute).with(
|
@@ -107,7 +114,7 @@ describe Google::APIClient::ResumableUpload do
|
|
107
114
|
@uploader.send_chunk(api_client) # Send bytes 0-199, only 0-99 saved
|
108
115
|
@uploader.send_chunk(api_client) # Send bytes 100-299
|
109
116
|
end
|
110
|
-
|
117
|
+
|
111
118
|
it 'should resync the offset after 5xx errors' do
|
112
119
|
api_client = mock('api')
|
113
120
|
api_client.should_receive(:execute).and_return(mock_result(500))
|
@@ -132,5 +139,5 @@ describe Google::APIClient::ResumableUpload do
|
|
132
139
|
reference = Google::APIClient::Reference.new(:api_method => @drive.files.insert)
|
133
140
|
stub('result', :status => status, :headers => headers, :reference => reference)
|
134
141
|
end
|
135
|
-
|
142
|
+
|
136
143
|
end
|
@@ -18,14 +18,12 @@ require 'google/api_client'
|
|
18
18
|
require 'google/api_client/version'
|
19
19
|
|
20
20
|
describe Google::APIClient::Result do
|
21
|
-
|
22
|
-
@client = Google::APIClient.new
|
23
|
-
end
|
21
|
+
CLIENT ||= Google::APIClient.new
|
24
22
|
|
25
23
|
describe 'with the plus API' do
|
26
24
|
before do
|
27
|
-
|
28
|
-
@plus =
|
25
|
+
CLIENT.authorization = nil
|
26
|
+
@plus = CLIENT.discovered_api('plus', 'v1')
|
29
27
|
@reference = Google::APIClient::Reference.new({
|
30
28
|
:api_method => @plus.activities.list,
|
31
29
|
:parameters => {
|
@@ -71,16 +69,20 @@ describe Google::APIClient::Result do
|
|
71
69
|
@result = Google::APIClient::Result.new(@reference, @request, @response)
|
72
70
|
end
|
73
71
|
|
72
|
+
it 'should indicate a successful response' do
|
73
|
+
@result.error?.should be_false
|
74
|
+
end
|
75
|
+
|
74
76
|
it 'should return the correct next page token' do
|
75
77
|
@result.next_page_token.should == 'NEXT+PAGE+TOKEN'
|
76
78
|
end
|
77
79
|
|
78
80
|
it 'should escape the next page token when calling next_page' do
|
79
81
|
reference = @result.next_page
|
80
|
-
reference.parameters.should include('pageToken')
|
81
|
-
reference.parameters['pageToken'].should == 'NEXT+PAGE+TOKEN'
|
82
|
-
|
83
|
-
|
82
|
+
Hash[reference.parameters].should include('pageToken')
|
83
|
+
Hash[reference.parameters]['pageToken'].should == 'NEXT+PAGE+TOKEN'
|
84
|
+
url = reference.to_request.to_env(Faraday.default_connection)[:url]
|
85
|
+
url.to_s.should include('pageToken=NEXT%2BPAGE%2BTOKEN')
|
84
86
|
end
|
85
87
|
|
86
88
|
it 'should return content type correctly' do
|
@@ -146,5 +148,38 @@ describe Google::APIClient::Result do
|
|
146
148
|
@result.data.items.should be_empty
|
147
149
|
end
|
148
150
|
end
|
151
|
+
|
152
|
+
describe 'with JSON error response' do
|
153
|
+
before do
|
154
|
+
@response.stub(:body).and_return(
|
155
|
+
<<-END_OF_STRING
|
156
|
+
{
|
157
|
+
"error": {
|
158
|
+
"errors": [
|
159
|
+
{
|
160
|
+
"domain": "global",
|
161
|
+
"reason": "parseError",
|
162
|
+
"message": "Parse Error"
|
163
|
+
}
|
164
|
+
],
|
165
|
+
"code": 400,
|
166
|
+
"message": "Parse Error"
|
167
|
+
}
|
168
|
+
}
|
169
|
+
END_OF_STRING
|
170
|
+
)
|
171
|
+
@response.stub(:status).and_return(400)
|
172
|
+
@result = Google::APIClient::Result.new(@reference, @request, @response)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should return error status correctly' do
|
176
|
+
@result.error?.should be_true
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should return the correct error message' do
|
180
|
+
@result.error_message.should == 'Parse Error'
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
149
184
|
end
|
150
185
|
end
|
@@ -17,21 +17,21 @@ require 'spec_helper'
|
|
17
17
|
require 'google/api_client'
|
18
18
|
|
19
19
|
describe Google::APIClient::JWTAsserter do
|
20
|
-
|
20
|
+
|
21
21
|
before do
|
22
22
|
@key = OpenSSL::PKey::RSA.new 2048
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
it 'should generate valid JWTs' do
|
26
26
|
asserter = Google::APIClient::JWTAsserter.new('client1', 'scope1 scope2', @key)
|
27
27
|
jwt = asserter.to_jwt
|
28
|
-
jwt.should_not == nil
|
29
|
-
|
28
|
+
jwt.should_not == nil
|
29
|
+
|
30
30
|
claim = JWT.decode(jwt, @key.public_key, true)
|
31
31
|
claim["iss"].should == 'client1'
|
32
32
|
claim["scope"].should == 'scope1 scope2'
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it 'should send valid access token request' do
|
36
36
|
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
37
37
|
stub.post('/o/oauth2/token') do |env|
|
@@ -48,7 +48,7 @@ describe Google::APIClient::JWTAsserter do
|
|
48
48
|
connection = Faraday.new(:url => 'https://accounts.google.com') do |builder|
|
49
49
|
builder.adapter(:test, stubs)
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
asserter = Google::APIClient::JWTAsserter.new('client1', 'scope1 scope2', @key)
|
53
53
|
auth = asserter.authorize(nil, { :connection => connection})
|
54
54
|
auth.should_not == nil?
|
@@ -14,11 +14,11 @@
|
|
14
14
|
|
15
15
|
require 'spec_helper'
|
16
16
|
|
17
|
-
gem 'faraday', '~> 0.
|
17
|
+
gem 'faraday', '~> 0.8.1'
|
18
18
|
require 'faraday'
|
19
19
|
require 'faraday/utils'
|
20
20
|
|
21
|
-
gem 'signet', '~> 0.
|
21
|
+
gem 'signet', '~> 0.4.0'
|
22
22
|
require 'signet/oauth_1/client'
|
23
23
|
|
24
24
|
require 'google/api_client'
|
@@ -26,26 +26,26 @@ require 'google/api_client/version'
|
|
26
26
|
|
27
27
|
shared_examples_for 'configurable user agent' do
|
28
28
|
it 'should allow the user agent to be modified' do
|
29
|
-
|
30
|
-
|
29
|
+
client.user_agent = 'Custom User Agent/1.2.3'
|
30
|
+
client.user_agent.should == 'Custom User Agent/1.2.3'
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'should allow the user agent to be set to nil' do
|
34
|
-
|
35
|
-
|
34
|
+
client.user_agent = nil
|
35
|
+
client.user_agent.should == nil
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'should not allow the user agent to be used with bogus values' do
|
39
39
|
(lambda do
|
40
|
-
|
41
|
-
|
40
|
+
client.user_agent = 42
|
41
|
+
client.transmit(
|
42
42
|
['GET', 'http://www.google.com/', [], []]
|
43
43
|
)
|
44
44
|
end).should raise_error(TypeError)
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'should transmit a User-Agent header when sending requests' do
|
48
|
-
|
48
|
+
client.user_agent = 'Custom User Agent/1.2.3'
|
49
49
|
request = Faraday::Request.new(:get) do |req|
|
50
50
|
req.url('http://www.google.com/')
|
51
51
|
end
|
@@ -53,48 +53,46 @@ shared_examples_for 'configurable user agent' do
|
|
53
53
|
stub.get('/') do |env|
|
54
54
|
headers = env[:request_headers]
|
55
55
|
headers.should have_key('User-Agent')
|
56
|
-
headers['User-Agent'].should ==
|
56
|
+
headers['User-Agent'].should == client.user_agent
|
57
57
|
[200, {}, ['']]
|
58
58
|
end
|
59
59
|
end
|
60
60
|
connection = Faraday.new(:url => 'https://www.google.com') do |builder|
|
61
61
|
builder.adapter(:test, stubs)
|
62
62
|
end
|
63
|
-
|
63
|
+
client.transmit(:request => request, :connection => connection)
|
64
64
|
stubs.verify_stubbed_calls
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
68
|
describe Google::APIClient do
|
69
|
-
|
70
|
-
@client = Google::APIClient.new
|
71
|
-
end
|
69
|
+
let(:client) { Google::APIClient.new }
|
72
70
|
|
73
71
|
it 'should make its version number available' do
|
74
72
|
Google::APIClient::VERSION::STRING.should be_instance_of(String)
|
75
73
|
end
|
76
74
|
|
77
75
|
it 'should default to OAuth 2' do
|
78
|
-
Signet::OAuth2::Client.should ===
|
76
|
+
Signet::OAuth2::Client.should === client.authorization
|
79
77
|
end
|
80
78
|
|
81
79
|
it_should_behave_like 'configurable user agent'
|
82
80
|
|
83
81
|
describe 'configured for OAuth 1' do
|
84
82
|
before do
|
85
|
-
|
83
|
+
client.authorization = :oauth_1
|
86
84
|
end
|
87
85
|
|
88
86
|
it 'should use the default OAuth1 client configuration' do
|
89
|
-
|
87
|
+
client.authorization.temporary_credential_uri.to_s.should ==
|
90
88
|
'https://www.google.com/accounts/OAuthGetRequestToken'
|
91
|
-
|
89
|
+
client.authorization.authorization_uri.to_s.should include(
|
92
90
|
'https://www.google.com/accounts/OAuthAuthorizeToken'
|
93
91
|
)
|
94
|
-
|
92
|
+
client.authorization.token_credential_uri.to_s.should ==
|
95
93
|
'https://www.google.com/accounts/OAuthGetAccessToken'
|
96
|
-
|
97
|
-
|
94
|
+
client.authorization.client_credential_key.should == 'anonymous'
|
95
|
+
client.authorization.client_credential_secret.should == 'anonymous'
|
98
96
|
end
|
99
97
|
|
100
98
|
it_should_behave_like 'configurable user agent'
|
@@ -102,7 +100,7 @@ describe Google::APIClient do
|
|
102
100
|
|
103
101
|
describe 'configured for OAuth 2' do
|
104
102
|
before do
|
105
|
-
|
103
|
+
client.authorization = :oauth_2
|
106
104
|
end
|
107
105
|
|
108
106
|
# TODO
|
@@ -111,7 +109,7 @@ describe Google::APIClient do
|
|
111
109
|
|
112
110
|
describe 'when executing requests' do
|
113
111
|
before do
|
114
|
-
|
112
|
+
client.authorization = :oauth_2
|
115
113
|
@connection = Faraday.new(:url => 'https://www.googleapis.com') do |builder|
|
116
114
|
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
117
115
|
stub.get('/test') do |env|
|
@@ -123,16 +121,16 @@ describe Google::APIClient do
|
|
123
121
|
end
|
124
122
|
|
125
123
|
it 'should use default authorization' do
|
126
|
-
|
127
|
-
|
124
|
+
client.authorization.access_token = "12345"
|
125
|
+
client.execute(:http_method => :get,
|
128
126
|
:uri => 'https://www.googleapis.com/test',
|
129
127
|
:connection => @connection)
|
130
128
|
end
|
131
129
|
|
132
130
|
it 'should use request scoped authorization when provided' do
|
133
|
-
|
131
|
+
client.authorization.access_token = "abcdef"
|
134
132
|
new_auth = Signet::OAuth2::Client.new(:access_token => '12345')
|
135
|
-
|
133
|
+
client.execute(:http_method => :get,
|
136
134
|
:uri => 'https://www.googleapis.com/test',
|
137
135
|
:connection => @connection,
|
138
136
|
:authorization => new_auth)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
lib_dir = File.expand_path("../lib", spec_dir)
|
3
|
-
|
4
|
-
$LOAD_PATH.unshift(lib_dir)
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
5
2
|
$LOAD_PATH.uniq!
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
end
|
data/tasks/gem.rake
CHANGED
@@ -24,23 +24,20 @@ namespace :gem do
|
|
24
24
|
s.rdoc_options.concat ['--main', 'README.md']
|
25
25
|
|
26
26
|
# Dependencies used in the main library
|
27
|
-
s.add_runtime_dependency('signet', '>= 0.
|
28
|
-
s.add_runtime_dependency('addressable', '>= 2.2
|
29
|
-
s.add_runtime_dependency('autoparse', '>= 0.3.1')
|
30
|
-
s.add_runtime_dependency('faraday', '~> 0.7.0')
|
31
|
-
s.add_runtime_dependency('multi_json', '>= 1.3.0')
|
32
|
-
s.add_runtime_dependency('extlib', '>= 0.9.15')
|
27
|
+
s.add_runtime_dependency('signet', '>= 0.4.1')
|
28
|
+
s.add_runtime_dependency('addressable', '>= 2.3.2')
|
33
29
|
s.add_runtime_dependency('uuidtools', '>= 2.1.0')
|
30
|
+
s.add_runtime_dependency('autoparse', '>= 0.3.2')
|
31
|
+
s.add_runtime_dependency('faraday', '~> 0.8.1')
|
32
|
+
s.add_runtime_dependency('multi_json', '>= 1.0.0')
|
33
|
+
s.add_runtime_dependency('extlib', '>= 0.9.15')
|
34
34
|
|
35
35
|
# Dependencies used in the CLI
|
36
|
-
s.add_runtime_dependency('launchy', '>= 2.
|
36
|
+
s.add_runtime_dependency('launchy', '>= 2.1.1')
|
37
37
|
|
38
38
|
# Dependencies used in the examples
|
39
|
-
s.add_development_dependency('sinatra', '>= 1.2.0')
|
40
|
-
|
41
39
|
s.add_development_dependency('rake', '>= 0.9.0')
|
42
|
-
s.add_development_dependency('rspec', '
|
43
|
-
s.add_development_dependency('rcov', '>= 0.9.9')
|
40
|
+
s.add_development_dependency('rspec', '>= 2.11.0')
|
44
41
|
|
45
42
|
s.require_path = 'lib'
|
46
43
|
|
data/tasks/spec.rake
CHANGED
@@ -1,16 +1,28 @@
|
|
1
|
-
require 'spec/rake/verify_rcov'
|
2
1
|
require 'rake/clean'
|
2
|
+
require 'rspec/core/rake_task'
|
3
3
|
|
4
4
|
CLOBBER.include('coverage', 'specdoc')
|
5
5
|
|
6
6
|
namespace :spec do
|
7
|
-
|
8
|
-
t.
|
9
|
-
t.
|
7
|
+
RSpec::Core::RakeTask.new(:all) do |t|
|
8
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
9
|
+
t.rspec_opts = ['--color', '--format', 'documentation']
|
10
|
+
t.rcov = false
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Generate HTML Specdocs for all specs.'
|
14
|
+
RSpec::Core::RakeTask.new(:specdoc) do |t|
|
15
|
+
specdoc_path = File.expand_path('../../specdoc', __FILE__)
|
16
|
+
|
17
|
+
t.rspec_opts = %W( --format html --out #{File.join(specdoc_path, 'index.html')} )
|
18
|
+
t.fail_on_error = false
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec::Core::RakeTask.new(:rcov) do |t|
|
10
22
|
if RCOV_ENABLED
|
11
23
|
if `which rcov`.strip == ""
|
12
24
|
STDERR.puts(
|
13
|
-
|
25
|
+
"Please install rcov and ensure that its binary is in the PATH:"
|
14
26
|
)
|
15
27
|
STDERR.puts("sudo gem install rcov")
|
16
28
|
exit(1)
|
@@ -19,51 +31,12 @@ namespace :spec do
|
|
19
31
|
else
|
20
32
|
t.rcov = false
|
21
33
|
end
|
22
|
-
t.rcov_opts =
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
'--exclude', '1\\.8\\/gems',
|
28
|
-
'--exclude', '1\\.9\\/gems',
|
29
|
-
'--exclude', '\\.rvm',
|
30
|
-
'--exclude', '\\/Library\\/Ruby',
|
31
|
-
]
|
32
|
-
end
|
33
|
-
|
34
|
-
Spec::Rake::SpecTask.new(:all) do |t|
|
35
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
36
|
-
t.spec_opts = ['--require', 'rubygems', '--color', '--format', 'specdoc']
|
37
|
-
t.rcov = false
|
38
|
-
end
|
39
|
-
|
40
|
-
Spec::Rake::SpecTask.new(:fast) do |t|
|
41
|
-
t.spec_files = FileList['spec/**/*_spec.rb'].exclude(
|
42
|
-
'spec/**/*_slow_spec.rb'
|
34
|
+
t.rcov_opts = %w(
|
35
|
+
--exclude gems/
|
36
|
+
--exclude spec/
|
37
|
+
--exclude lib/google/api_client/environment.rb
|
38
|
+
--exclude lib/compat
|
43
39
|
)
|
44
|
-
t.spec_opts = ['--require', 'rubygems', '--color', '--format', 'specdoc']
|
45
|
-
t.rcov = false
|
46
|
-
end
|
47
|
-
|
48
|
-
if RCOV_ENABLED
|
49
|
-
RCov::VerifyTask.new(:verify) do |t|
|
50
|
-
t.threshold = 65.0
|
51
|
-
t.index_html = 'coverage/index.html'
|
52
|
-
end
|
53
|
-
|
54
|
-
task :verify => :rcov
|
55
|
-
end
|
56
|
-
|
57
|
-
desc 'Generate HTML Specdocs for all specs'
|
58
|
-
Spec::Rake::SpecTask.new(:specdoc) do |t|
|
59
|
-
specdoc_path = File.expand_path(
|
60
|
-
File.join(File.dirname(__FILE__), '../specdoc/'))
|
61
|
-
Dir.mkdir(specdoc_path) if !File.exist?(specdoc_path)
|
62
|
-
|
63
|
-
output_file = File.join(specdoc_path, 'index.html')
|
64
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
65
|
-
t.spec_opts = ['--format', "\"html:#{output_file}\"", '--diff']
|
66
|
-
t.fail_on_error = false
|
67
40
|
end
|
68
41
|
|
69
42
|
namespace :rcov do
|