google-api-client 0.6.4 → 0.7.0.rc2
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 +7 -0
- data/CHANGELOG.md +11 -0
- data/{CONTRIB.md → CONTRIBUTING.md} +0 -0
- data/Gemfile +4 -3
- data/README.md +122 -96
- data/bin/google-api +0 -1
- data/lib/cacerts.pem +2183 -0
- data/lib/google/api_client.rb +28 -10
- data/lib/google/api_client/auth/compute_service_account.rb +28 -0
- data/lib/google/api_client/auth/file_storage.rb +87 -0
- data/lib/google/api_client/auth/installed_app.rb +8 -1
- data/lib/google/api_client/auth/jwt_asserter.rb +0 -11
- data/lib/google/api_client/client_secrets.rb +1 -1
- data/lib/google/api_client/discovery/method.rb +1 -0
- data/lib/google/api_client/gzip.rb +28 -0
- data/lib/google/api_client/media.rb +80 -5
- data/lib/google/api_client/request.rb +14 -9
- data/lib/google/api_client/service_account.rb +1 -0
- data/lib/google/api_client/version.rb +4 -3
- data/spec/google/api_client/batch_spec.rb +1 -1
- data/spec/google/api_client/discovery_spec.rb +36 -95
- data/spec/google/api_client/gzip_spec.rb +86 -0
- data/spec/google/api_client/media_spec.rb +49 -1
- data/spec/google/api_client/request_spec.rb +30 -0
- data/spec/google/api_client/result_spec.rb +3 -4
- data/spec/google/api_client/service_account_spec.rb +21 -0
- data/spec/google/api_client_spec.rb +17 -3
- data/spec/spec_helper.rb +3 -0
- data/tasks/gem.rake +3 -3
- metadata +86 -48
@@ -21,9 +21,10 @@ if !defined?(::Google::APIClient::VERSION)
|
|
21
21
|
class APIClient
|
22
22
|
module VERSION
|
23
23
|
MAJOR = 0
|
24
|
-
MINOR =
|
25
|
-
TINY =
|
26
|
-
|
24
|
+
MINOR = 7
|
25
|
+
TINY = 0
|
26
|
+
PATCH = 'rc2'
|
27
|
+
STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
@@ -234,7 +234,7 @@ describe Google::APIClient::BatchRequest do
|
|
234
234
|
it 'should convert to a correct HTTP request' do
|
235
235
|
batch = Google::APIClient::BatchRequest.new { |result| }
|
236
236
|
batch.add(@call1, '1').add(@call2, '2')
|
237
|
-
request = batch.to_env(
|
237
|
+
request = batch.to_env(CLIENT.connection)
|
238
238
|
boundary = Google::APIClient::BatchRequest::BATCH_BOUNDARY
|
239
239
|
request[:method].to_s.downcase.should == 'post'
|
240
240
|
request[:url].to_s.should == 'https://www.googleapis.com/batch'
|
@@ -18,29 +18,12 @@
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
20
|
require 'faraday'
|
21
|
-
require 'faraday/utils'
|
22
21
|
require 'multi_json'
|
23
22
|
require 'compat/multi_json'
|
24
23
|
require 'signet/oauth_1/client'
|
25
24
|
require 'google/api_client'
|
26
25
|
require 'google/api_client/version'
|
27
26
|
|
28
|
-
def TestHandler
|
29
|
-
def initialize(&block)
|
30
|
-
@block = block
|
31
|
-
end
|
32
|
-
|
33
|
-
def call(env)
|
34
|
-
@block.call(env)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def mock_connection(&block)
|
39
|
-
connection = Faraday.new do |builder|
|
40
|
-
use TestHandler block
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
27
|
describe Google::APIClient do
|
45
28
|
include ConnectionHelpers
|
46
29
|
CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT)
|
@@ -231,16 +214,15 @@ describe Google::APIClient do
|
|
231
214
|
conn.verify
|
232
215
|
end
|
233
216
|
|
234
|
-
it 'should generate valid requests when
|
235
|
-
pending("This is caused by Faraday's encoding of query parameters.")
|
217
|
+
it 'should generate valid requests when multivalued parameters are passed' do
|
236
218
|
conn = stub_connection do |stub|
|
237
219
|
stub.post('/prediction/v1.2/training?data=1&data=2') do |env|
|
238
|
-
env
|
220
|
+
env.params['data'].should include('1', '2')
|
239
221
|
end
|
240
222
|
end
|
241
223
|
request = CLIENT.execute(
|
242
224
|
:api_method => @prediction.training.insert,
|
243
|
-
:parameters =>
|
225
|
+
:parameters => {'data' => ['1', '2']},
|
244
226
|
:connection => conn
|
245
227
|
)
|
246
228
|
conn.verify
|
@@ -465,92 +447,29 @@ describe Google::APIClient do
|
|
465
447
|
'userId' => '107807692475771887386', 'collection' => 'bogus'
|
466
448
|
},
|
467
449
|
:authenticated => false
|
468
|
-
).to_env(
|
450
|
+
).to_env(CLIENT.connection)
|
469
451
|
end).should raise_error(ArgumentError)
|
470
452
|
end
|
471
453
|
end
|
472
|
-
|
473
|
-
describe 'with the latitude API' do
|
474
|
-
before do
|
475
|
-
CLIENT.authorization = nil
|
476
|
-
@latitude = CLIENT.discovered_api('latitude')
|
477
|
-
end
|
478
|
-
|
479
|
-
it 'should correctly determine the discovery URI' do
|
480
|
-
CLIENT.discovery_uri('latitude').should ===
|
481
|
-
'https://www.googleapis.com/discovery/v1/apis/latitude/v1/rest'
|
482
|
-
end
|
483
|
-
|
484
|
-
it 'should find APIs that are in the discovery document' do
|
485
|
-
CLIENT.discovered_api('latitude').name.should == 'latitude'
|
486
|
-
CLIENT.discovered_api('latitude').version.should == 'v1'
|
487
|
-
end
|
488
|
-
|
489
|
-
it 'should return a batch path' do
|
490
|
-
CLIENT.discovered_api('latitude').batch_path.should_not be_nil
|
491
|
-
end
|
492
|
-
|
493
|
-
it 'should find methods that are in the discovery document' do
|
494
|
-
CLIENT.discovered_method(
|
495
|
-
'latitude.currentLocation.get', 'latitude'
|
496
|
-
).name.should == 'get'
|
497
|
-
end
|
498
|
-
|
499
|
-
it 'should define the origin API in discovered methods' do
|
500
|
-
CLIENT.discovered_method(
|
501
|
-
'latitude.currentLocation.get', 'latitude'
|
502
|
-
).api.name.should == 'latitude'
|
503
|
-
end
|
504
|
-
|
505
|
-
it 'should not find methods that are not in the discovery document' do
|
506
|
-
CLIENT.discovered_method('latitude.bogus', 'latitude').should == nil
|
507
|
-
end
|
508
|
-
|
509
|
-
it 'should generate requests against the correct URIs' do
|
510
|
-
request = CLIENT.generate_request(
|
511
|
-
:api_method => @latitude.current_location.get,
|
512
|
-
:authenticated => false
|
513
|
-
)
|
514
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should ===
|
515
|
-
'https://www.googleapis.com/latitude/v1/currentLocation'
|
516
|
-
end
|
517
|
-
|
518
|
-
it 'should generate requests against the correct URIs' do
|
519
|
-
request = CLIENT.generate_request(
|
520
|
-
:api_method => @latitude.current_location.get,
|
521
|
-
:authenticated => false
|
522
|
-
)
|
523
|
-
request.to_env(Faraday.default_connection)[:url].to_s.should ===
|
524
|
-
'https://www.googleapis.com/latitude/v1/currentLocation'
|
525
|
-
end
|
526
|
-
|
527
|
-
it 'should not be able to execute requests without authorization' do
|
528
|
-
result = CLIENT.execute(
|
529
|
-
:api_method => @latitude.current_location.get,
|
530
|
-
:authenticated => false
|
531
|
-
)
|
532
|
-
result.response.status.should == 401
|
533
|
-
end
|
534
|
-
end
|
535
454
|
|
536
455
|
describe 'with the adsense API' do
|
537
456
|
before do
|
538
457
|
CLIENT.authorization = nil
|
539
|
-
@adsense = CLIENT.discovered_api('adsense', 'v1')
|
458
|
+
@adsense = CLIENT.discovered_api('adsense', 'v1.3')
|
540
459
|
end
|
541
460
|
|
542
461
|
it 'should correctly determine the discovery URI' do
|
543
|
-
CLIENT.discovery_uri('adsense').should ===
|
544
|
-
'https://www.googleapis.com/discovery/v1/apis/adsense/v1/rest'
|
462
|
+
CLIENT.discovery_uri('adsense', 'v1.3').to_s.should ===
|
463
|
+
'https://www.googleapis.com/discovery/v1/apis/adsense/v1.3/rest'
|
545
464
|
end
|
546
465
|
|
547
466
|
it 'should find APIs that are in the discovery document' do
|
548
|
-
CLIENT.discovered_api('adsense').name.should == 'adsense'
|
549
|
-
CLIENT.discovered_api('adsense').version.should == 'v1'
|
467
|
+
CLIENT.discovered_api('adsense', 'v1.3').name.should == 'adsense'
|
468
|
+
CLIENT.discovered_api('adsense', 'v1.3').version.should == 'v1.3'
|
550
469
|
end
|
551
470
|
|
552
471
|
it 'should return a batch path' do
|
553
|
-
CLIENT.discovered_api('adsense').batch_path.should_not be_nil
|
472
|
+
CLIENT.discovered_api('adsense', 'v1.3').batch_path.should_not be_nil
|
554
473
|
end
|
555
474
|
|
556
475
|
it 'should find methods that are in the discovery document' do
|
@@ -565,7 +484,7 @@ describe Google::APIClient do
|
|
565
484
|
|
566
485
|
it 'should generate requests against the correct URIs' do
|
567
486
|
conn = stub_connection do |stub|
|
568
|
-
stub.get('/adsense/v1/adclients') do |env|
|
487
|
+
stub.get('/adsense/v1.3/adclients') do |env|
|
569
488
|
end
|
570
489
|
end
|
571
490
|
request = CLIENT.execute(
|
@@ -595,7 +514,7 @@ describe Google::APIClient do
|
|
595
514
|
|
596
515
|
it 'should succeed when validating parameters in a correct call' do
|
597
516
|
conn = stub_connection do |stub|
|
598
|
-
stub.get('/adsense/v1/reports?dimension=DATE&endDate=2010-01-01&metric=PAGE_VIEWS&startDate=2000-01-01') do |env|
|
517
|
+
stub.get('/adsense/v1.3/reports?dimension=DATE&endDate=2010-01-01&metric=PAGE_VIEWS&startDate=2000-01-01') do |env|
|
599
518
|
end
|
600
519
|
end
|
601
520
|
(lambda do
|
@@ -630,9 +549,8 @@ describe Google::APIClient do
|
|
630
549
|
end
|
631
550
|
|
632
551
|
it 'should succeed when validating repeated parameters in a correct call' do
|
633
|
-
pending("This is caused by Faraday's encoding of query parameters.")
|
634
552
|
conn = stub_connection do |stub|
|
635
|
-
stub.get('/adsense/v1/reports?dimension=DATE&dimension=PRODUCT_CODE'+
|
553
|
+
stub.get('/adsense/v1.3/reports?dimension=DATE&dimension=PRODUCT_CODE'+
|
636
554
|
'&endDate=2010-01-01&metric=CLICKS&metric=PAGE_VIEWS&'+
|
637
555
|
'startDate=2000-01-01') do |env|
|
638
556
|
end
|
@@ -667,6 +585,29 @@ describe Google::APIClient do
|
|
667
585
|
)
|
668
586
|
end).should raise_error(ArgumentError)
|
669
587
|
end
|
588
|
+
|
589
|
+
it 'should generate valid requests when multivalued parameters are passed' do
|
590
|
+
conn = stub_connection do |stub|
|
591
|
+
stub.get('/adsense/v1.3/reports?dimension=DATE&dimension=PRODUCT_CODE'+
|
592
|
+
'&endDate=2010-01-01&metric=CLICKS&metric=PAGE_VIEWS&'+
|
593
|
+
'startDate=2000-01-01') do |env|
|
594
|
+
env.params['dimension'].should include('DATE', 'PRODUCT_CODE')
|
595
|
+
env.params['metric'].should include('CLICKS', 'PAGE_VIEWS')
|
596
|
+
end
|
597
|
+
end
|
598
|
+
request = CLIENT.execute(
|
599
|
+
:api_method => @adsense.reports.generate,
|
600
|
+
:parameters => {
|
601
|
+
'startDate' => '2000-01-01',
|
602
|
+
'endDate' => '2010-01-01',
|
603
|
+
'dimension' => ['DATE', 'PRODUCT_CODE'],
|
604
|
+
'metric' => ['PAGE_VIEWS', 'CLICKS']
|
605
|
+
},
|
606
|
+
:authenticated => false,
|
607
|
+
:connection => conn
|
608
|
+
)
|
609
|
+
conn.verify
|
610
|
+
end
|
670
611
|
end
|
671
612
|
|
672
613
|
describe 'with the Drive API' do
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# Copyright 2012 Google Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'spec_helper'
|
16
|
+
|
17
|
+
require 'google/api_client'
|
18
|
+
require 'google/api_client/version'
|
19
|
+
|
20
|
+
describe Google::APIClient::Gzip do
|
21
|
+
|
22
|
+
def create_connection(&block)
|
23
|
+
Faraday.new do |b|
|
24
|
+
b.response :gzip
|
25
|
+
b.adapter :test do |stub|
|
26
|
+
stub.get '/', &block
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should ignore non-zipped content' do
|
32
|
+
conn = create_connection do |env|
|
33
|
+
[200, {}, 'Hello world']
|
34
|
+
end
|
35
|
+
result = conn.get('/')
|
36
|
+
result.body.should == "Hello world"
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should decompress gziped content' do
|
40
|
+
conn = create_connection do |env|
|
41
|
+
[200, { 'Content-Encoding' => 'gzip'}, Base64.decode64('H4sICLVGwlEAA3RtcADzSM3JyVcozy/KSeECANXgObcMAAAA')]
|
42
|
+
end
|
43
|
+
result = conn.get('/')
|
44
|
+
result.body.should == "Hello world\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'with API Client' do
|
48
|
+
|
49
|
+
before do
|
50
|
+
@client = Google::APIClient.new(:application_name => 'test')
|
51
|
+
@client.authorization = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
it 'should send gzip in user agent' do
|
56
|
+
conn = create_connection do |env|
|
57
|
+
agent = env[:request_headers]['User-Agent']
|
58
|
+
agent.should_not be_nil
|
59
|
+
agent.should include 'gzip'
|
60
|
+
[200, {}, 'Hello world']
|
61
|
+
end
|
62
|
+
@client.execute(:uri => 'http://www.example.com/', :connection => conn)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should send gzip in accept-encoding' do
|
66
|
+
conn = create_connection do |env|
|
67
|
+
encoding = env[:request_headers]['Accept-Encoding']
|
68
|
+
encoding.should_not be_nil
|
69
|
+
encoding.should include 'gzip'
|
70
|
+
[200, {}, 'Hello world']
|
71
|
+
end
|
72
|
+
@client.execute(:uri => 'http://www.example.com/', :connection => conn)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should not send gzip in accept-encoding if disabled for request' do
|
76
|
+
conn = create_connection do |env|
|
77
|
+
encoding = env[:request_headers]['Accept-Encoding']
|
78
|
+
encoding.should_not include('gzip') unless encoding.nil?
|
79
|
+
[200, {}, 'Hello world']
|
80
|
+
end
|
81
|
+
response = @client.execute(:uri => 'http://www.example.com/', :gzip => false, :connection => conn)
|
82
|
+
puts response.status
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -57,6 +57,54 @@ describe Google::APIClient::UploadIO do
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
describe Google::APIClient::RangedIO do
|
61
|
+
before do
|
62
|
+
@source = StringIO.new("1234567890abcdef")
|
63
|
+
@io = Google::APIClient::RangedIO.new(@source, 1, 5)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should return the correct range when read entirely' do
|
67
|
+
@io.read.should == "23456"
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should maintain position' do
|
71
|
+
@io.read(1).should == '2'
|
72
|
+
@io.read(2).should == '34'
|
73
|
+
@io.read(2).should == '56'
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should allow rewinds' do
|
77
|
+
@io.read(2).should == '23'
|
78
|
+
@io.rewind()
|
79
|
+
@io.read(2).should == '23'
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should allow setting position' do
|
83
|
+
@io.pos = 3
|
84
|
+
@io.read.should == '56'
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should not allow position to be set beyond range' do
|
88
|
+
@io.pos = 10
|
89
|
+
@io.read.should == ''
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should return empty string when read amount is zero' do
|
93
|
+
@io.read(0).should == ''
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should return empty string at EOF if amount is nil' do
|
97
|
+
@io.read
|
98
|
+
@io.read.should == ''
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should return nil at EOF if amount is positive int' do
|
102
|
+
@io.read
|
103
|
+
@io.read(1).should == nil
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
60
108
|
describe Google::APIClient::ResumableUpload do
|
61
109
|
CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT)
|
62
110
|
|
@@ -125,7 +173,7 @@ describe Google::APIClient::ResumableUpload do
|
|
125
173
|
|
126
174
|
def mock_result(status, headers = {})
|
127
175
|
reference = Google::APIClient::Reference.new(:api_method => @drive.files.insert)
|
128
|
-
|
176
|
+
double('result', :status => status, :headers => headers, :reference => reference)
|
129
177
|
end
|
130
178
|
|
131
179
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Copyright 2012 Google Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'spec_helper'
|
16
|
+
|
17
|
+
require 'google/api_client'
|
18
|
+
require 'google/api_client/version'
|
19
|
+
|
20
|
+
describe Google::APIClient::Request do
|
21
|
+
CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT)
|
22
|
+
|
23
|
+
it 'should normalize parameter names to strings' do
|
24
|
+
request = Google::APIClient::Request.new(:uri => 'https://www.google.com', :parameters => {
|
25
|
+
:a => '1', 'b' => '2'
|
26
|
+
})
|
27
|
+
request.parameters['a'].should == '1'
|
28
|
+
request.parameters['b'].should == '2'
|
29
|
+
end
|
30
|
+
end
|
@@ -34,8 +34,8 @@ describe Google::APIClient::Result do
|
|
34
34
|
})
|
35
35
|
@request = @reference.to_http_request
|
36
36
|
|
37
|
-
# Response
|
38
|
-
@response =
|
37
|
+
# Response double
|
38
|
+
@response = double("response")
|
39
39
|
@response.stub(:status).and_return(200)
|
40
40
|
@response.stub(:headers).and_return({
|
41
41
|
'etag' => '12345',
|
@@ -78,11 +78,10 @@ describe Google::APIClient::Result do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
it 'should escape the next page token when calling next_page' do
|
81
|
-
pending("This is caused by Faraday's encoding of query parameters.")
|
82
81
|
reference = @result.next_page
|
83
82
|
Hash[reference.parameters].should include('pageToken')
|
84
83
|
Hash[reference.parameters]['pageToken'].should == 'NEXT+PAGE+TOKEN'
|
85
|
-
url = reference.to_env(
|
84
|
+
url = reference.to_env(CLIENT.connection)[:url]
|
86
85
|
url.to_s.should include('pageToken=NEXT%2BPAGE%2BTOKEN')
|
87
86
|
end
|
88
87
|
|
@@ -141,3 +141,24 @@ describe Google::APIClient::JWTAsserter do
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
+
describe Google::APIClient::ComputeServiceAccount do
|
145
|
+
include ConnectionHelpers
|
146
|
+
|
147
|
+
it 'should query metadata server' do
|
148
|
+
conn = stub_connection do |stub|
|
149
|
+
stub.get('/computeMetadata/v1beta1/instance/service-accounts/default/token') do |env|
|
150
|
+
env.url.host.should == 'metadata'
|
151
|
+
[200, {}, '{
|
152
|
+
"access_token" : "1/abcdef1234567890",
|
153
|
+
"token_type" : "Bearer",
|
154
|
+
"expires_in" : 3600
|
155
|
+
}']
|
156
|
+
end
|
157
|
+
end
|
158
|
+
service_account = Google::APIClient::ComputeServiceAccount.new
|
159
|
+
auth = service_account.fetch_access_token!({ :connection => conn })
|
160
|
+
auth.should_not == nil?
|
161
|
+
auth["access_token"].should == "1/abcdef1234567890"
|
162
|
+
conn.verify
|
163
|
+
end
|
164
|
+
end
|