google-api-client 0.2.0 → 0.3.0

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.
@@ -0,0 +1,202 @@
1
+ # Copyright 2010 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 'stringio'
16
+ require 'json'
17
+ require 'addressable/uri'
18
+ require 'google/api_client/discovery'
19
+
20
+ module Google
21
+ class APIClient
22
+ class Reference
23
+ def initialize(options={})
24
+ # We only need this to do lookups on method ID String values
25
+ # It's optional, but method ID lookups will fail if the client is
26
+ # omitted.
27
+ @client = options[:client]
28
+ @version = options[:version] || 'v1'
29
+
30
+ self.api_method = options[:api_method]
31
+ self.parameters = options[:parameters] || {}
32
+ # These parameters are handled differently because they're not
33
+ # parameters to the API method, but rather to the API system.
34
+ self.parameters['key'] ||= options[:key] if options[:key]
35
+ self.parameters['userIp'] ||= options[:user_ip] if options[:user_ip]
36
+ self.headers = options[:headers] || []
37
+ if options[:body]
38
+ self.body = options[:body]
39
+ elsif options[:merged_body]
40
+ self.merged_body = options[:merged_body]
41
+ elsif options[:body_object]
42
+ if options[:body_object].respond_to?(:to_json)
43
+ serialized_body = options[:body_object].to_json
44
+ elsif options[:body_object].respond_to?(:to_hash)
45
+ serialized_body = JSON.generate(options[:body_object].to_hash)
46
+ else
47
+ raise TypeError,
48
+ 'Could not convert body object to JSON.' +
49
+ 'Must respond to :to_json or :to_hash.'
50
+ end
51
+ self.merged_body = serialized_body
52
+ else
53
+ self.merged_body = ''
54
+ end
55
+ unless self.api_method
56
+ self.http_method = options[:http_method] || 'GET'
57
+ self.uri = options[:uri]
58
+ unless self.parameters.empty?
59
+ self.uri.query_values =
60
+ (self.uri.query_values || {}).merge(self.parameters)
61
+ end
62
+ end
63
+ end
64
+
65
+ def api_method
66
+ return @api_method
67
+ end
68
+
69
+ def api_method=(new_api_method)
70
+ if new_api_method.kind_of?(Google::APIClient::Method) ||
71
+ new_api_method == nil
72
+ @api_method = new_api_method
73
+ elsif new_api_method.respond_to?(:to_str) ||
74
+ new_api_method.kind_of?(Symbol)
75
+ unless @client
76
+ raise ArgumentError,
77
+ "API method lookup impossible without client instance."
78
+ end
79
+ new_api_method = new_api_method.to_s
80
+ # This method of guessing the API is unreliable. This will fail for
81
+ # APIs where the first segment of the RPC name does not match the
82
+ # service name. However, this is a fallback mechanism anyway.
83
+ # Developers should be passing in a reference to the method, rather
84
+ # than passing in a string or symbol. This should raise an error
85
+ # in the case of a mismatch.
86
+ api = new_api_method[/^([^.]+)\./, 1]
87
+ @api_method = @client.discovered_method(
88
+ new_api_method, api, @version
89
+ )
90
+ if @api_method
91
+ # Ditch the client reference, we won't need it again.
92
+ @client = nil
93
+ else
94
+ raise ArgumentError, "API method could not be found."
95
+ end
96
+ else
97
+ raise TypeError,
98
+ "Expected Google::APIClient::Method, got #{new_api_method.class}."
99
+ end
100
+ end
101
+
102
+ def parameters
103
+ return @parameters
104
+ end
105
+
106
+ def parameters=(new_parameters)
107
+ # No type-checking needed, the Method class handles this.
108
+ @parameters = new_parameters
109
+ end
110
+
111
+ def body
112
+ return @body
113
+ end
114
+
115
+ def body=(new_body)
116
+ if new_body.respond_to?(:each)
117
+ @body = new_body
118
+ else
119
+ raise TypeError, "Expected body to respond to :each."
120
+ end
121
+ end
122
+
123
+ def merged_body
124
+ return (self.body.inject(StringIO.new) do |accu, chunk|
125
+ accu.write(chunk)
126
+ accu
127
+ end).string
128
+ end
129
+
130
+ def merged_body=(new_merged_body)
131
+ if new_merged_body.respond_to?(:string)
132
+ new_merged_body = new_merged_body.string
133
+ elsif new_merged_body.respond_to?(:to_str)
134
+ new_merged_body = new_merged_body.to_str
135
+ else
136
+ raise TypeError,
137
+ "Expected String or StringIO, got #{new_merged_body.class}."
138
+ end
139
+ self.body = [new_merged_body]
140
+ end
141
+
142
+ def headers
143
+ return @headers ||= []
144
+ end
145
+
146
+ def headers=(new_headers)
147
+ if new_headers.kind_of?(Array) || new_headers.kind_of?(Hash)
148
+ @headers = new_headers
149
+ else
150
+ raise TypeError, "Expected Hash or Array, got #{new_headers.class}."
151
+ end
152
+ end
153
+
154
+ def http_method
155
+ return @http_method ||= self.api_method.http_method
156
+ end
157
+
158
+ def http_method=(new_http_method)
159
+ if new_http_method.kind_of?(Symbol)
160
+ @http_method = new_http_method.to_s.upcase
161
+ elsif new_http_method.respond_to?(:to_str)
162
+ @http_method = new_http_method.to_str.upcase
163
+ else
164
+ raise TypeError,
165
+ "Expected String or Symbol, got #{new_http_method.class}."
166
+ end
167
+ end
168
+
169
+ def uri
170
+ return @uri ||= self.api_method.generate_uri(self.parameters)
171
+ end
172
+
173
+ def uri=(new_uri)
174
+ @uri = Addressable::URI.parse(new_uri)
175
+ end
176
+
177
+ def to_request
178
+ if self.api_method
179
+ return self.api_method.generate_request(
180
+ self.parameters, self.merged_body, self.headers
181
+ )
182
+ else
183
+ return [self.http_method, self.uri, self.headers, self.body]
184
+ end
185
+ end
186
+
187
+ def to_hash
188
+ options = {}
189
+ if self.api_method
190
+ options[:api_method] = self.api_method
191
+ options[:parameters] = self.parameters
192
+ else
193
+ options[:http_method] = self.http_method
194
+ options[:uri] = self.uri
195
+ end
196
+ options[:headers] = self.headers
197
+ options[:body] = self.body
198
+ return options
199
+ end
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,132 @@
1
+ # Copyright 2010 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
+ module Google
16
+ class APIClient
17
+ ##
18
+ # This class wraps a result returned by an API call.
19
+ class Result
20
+ def initialize(reference, request, response)
21
+ @reference = reference
22
+ @request = request
23
+ @response = response
24
+ end
25
+
26
+ attr_reader :reference
27
+
28
+ attr_reader :request
29
+
30
+ attr_reader :response
31
+
32
+ def status
33
+ return @response[0]
34
+ end
35
+
36
+ def headers
37
+ return @response[1]
38
+ end
39
+
40
+ def body
41
+ return @body ||= (begin
42
+ response_body = @response[2]
43
+ merged_body = (response_body.inject(StringIO.new) do |accu, chunk|
44
+ accu.write(chunk)
45
+ accu
46
+ end).string
47
+ end)
48
+ end
49
+
50
+ def data
51
+ return @data ||= (begin
52
+ _, content_type = self.headers.detect do |h, v|
53
+ h.downcase == 'Content-Type'.downcase
54
+ end
55
+ media_type = content_type[/^([^;]*);?.*$/, 1].strip.downcase
56
+ data = self.body
57
+ case media_type
58
+ when 'application/json'
59
+ data = ::JSON.parse(data)
60
+ # Strip data wrapper, if present
61
+ data = data['data'] if data.has_key?('data')
62
+ else
63
+ raise ArgumentError,
64
+ "Content-Type not supported for parsing: #{media_type}"
65
+ end
66
+ if @reference.api_method && @reference.api_method.response_schema
67
+ # Automatically parse using the schema designated for the
68
+ # response of this API method.
69
+ data = @reference.api_method.response_schema.new(data)
70
+ data
71
+ else
72
+ # Otherwise, return the raw unparsed value.
73
+ # This value must be indexable like a Hash.
74
+ data
75
+ end
76
+ end)
77
+ end
78
+
79
+ def pagination_type
80
+ return :token
81
+ end
82
+
83
+ def page_token_param
84
+ return "pageToken"
85
+ end
86
+
87
+ def next_page_token
88
+ if self.data.respond_to?(:next_page_token)
89
+ return self.data.next_page_token
90
+ elsif self.data.respond_to?(:[])
91
+ return self.data["nextPageToken"]
92
+ else
93
+ raise TypeError, "Data object did not respond to #next_page_token."
94
+ end
95
+ end
96
+
97
+ def next_page
98
+ merged_parameters = Hash[self.reference.parameters].merge({
99
+ self.page_token_param => self.next_page_token
100
+ })
101
+ # Because References can be coerced to Hashes, we can merge them,
102
+ # preserving all context except the API method parameters that we're
103
+ # using for pagination.
104
+ return Google::APIClient::Reference.new(
105
+ Hash[self.reference].merge(:parameters => merged_parameters)
106
+ )
107
+ end
108
+
109
+ def prev_page_token
110
+ if self.data.respond_to?(:prev_page_token)
111
+ return self.data.prev_page_token
112
+ elsif self.data.respond_to?(:[])
113
+ return self.data["prevPageToken"]
114
+ else
115
+ raise TypeError, "Data object did not respond to #next_page_token."
116
+ end
117
+ end
118
+
119
+ def prev_page
120
+ merged_parameters = Hash[self.reference.parameters].merge({
121
+ self.page_token_param => self.prev_page_token
122
+ })
123
+ # Because References can be coerced to Hashes, we can merge them,
124
+ # preserving all context except the API method parameters that we're
125
+ # using for pagination.
126
+ return Google::APIClient::Reference.new(
127
+ Hash[self.reference].merge(:parameters => merged_parameters)
128
+ )
129
+ end
130
+ end
131
+ end
132
+ end
@@ -13,14 +13,17 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- module Google
17
- class APIClient
18
- module VERSION
19
- MAJOR = 0
20
- MINOR = 2
21
- TINY = 0
16
+ # Used to prevent the class/module from being loaded more than once
17
+ if !defined?(::Google::APIClient::VERSION)
18
+ module Google
19
+ class APIClient
20
+ module VERSION
21
+ MAJOR = 0
22
+ MINOR = 3
23
+ TINY = 0
22
24
 
23
- STRING = [MAJOR, MINOR, TINY].join('.')
25
+ STRING = [MAJOR, MINOR, TINY].join('.')
26
+ end
24
27
  end
25
28
  end
26
29
  end
@@ -17,7 +17,12 @@ module Google
17
17
  if defined?(ActiveSupport::Inflector)
18
18
  INFLECTOR = ActiveSupport::Inflector
19
19
  else
20
- require 'extlib/inflection'
21
- INFLECTOR = Extlib::Inflection
20
+ begin
21
+ require 'extlib/inflection'
22
+ INFLECTOR = Extlib::Inflection
23
+ rescue LoadError
24
+ require 'active_support/inflector'
25
+ INFLECTOR = ActiveSupport::Inflector
26
+ end
22
27
  end
23
28
  end
@@ -14,6 +14,7 @@
14
14
 
15
15
  require 'spec_helper'
16
16
 
17
+ require 'json'
17
18
  require 'signet/oauth_1/client'
18
19
  require 'httpadapter/adapters/net_http'
19
20
 
@@ -66,6 +67,9 @@ describe Google::APIClient do
66
67
  describe 'with the prediction API' do
67
68
  before do
68
69
  @client.authorization = nil
70
+ # The prediction API no longer exposes a v1, so we have to be
71
+ # careful about looking up the wrong API version.
72
+ @prediction = @client.discovered_api('prediction', 'v1.2')
69
73
  end
70
74
 
71
75
  it 'should correctly determine the discovery URI' do
@@ -73,46 +77,83 @@ describe Google::APIClient do
73
77
  'https://www.googleapis.com/discovery/v1/apis/prediction/v1/rest'
74
78
  end
75
79
 
80
+ it 'should correctly determine the discovery URI if :user_ip is set' do
81
+ @client.user_ip = '127.0.0.1'
82
+ request = @client.generate_request(
83
+ :http_method => 'GET',
84
+ :uri => @client.discovery_uri('prediction', 'v1.2'),
85
+ :authenticated => false
86
+ )
87
+ http_method, uri, headers, body = request
88
+ uri.should === (
89
+ 'https://www.googleapis.com/discovery/v1/apis/prediction/v1.2/rest' +
90
+ '?userIp=127.0.0.1'
91
+ )
92
+ end
93
+
94
+ it 'should correctly determine the discovery URI if :key is set' do
95
+ @client.key = 'qwerty'
96
+ request = @client.generate_request(
97
+ :http_method => 'GET',
98
+ :uri => @client.discovery_uri('prediction', 'v1.2'),
99
+ :authenticated => false
100
+ )
101
+ http_method, uri, headers, body = request
102
+ uri.should === (
103
+ 'https://www.googleapis.com/discovery/v1/apis/prediction/v1.2/rest' +
104
+ '?key=qwerty'
105
+ )
106
+ end
107
+
108
+ it 'should correctly determine the discovery URI if both are set' do
109
+ @client.key = 'qwerty'
110
+ @client.user_ip = '127.0.0.1'
111
+ request = @client.generate_request(
112
+ :http_method => 'GET',
113
+ :uri => @client.discovery_uri('prediction', 'v1.2'),
114
+ :authenticated => false
115
+ )
116
+ http_method, uri, headers, body = request
117
+ uri.should === (
118
+ 'https://www.googleapis.com/discovery/v1/apis/prediction/v1.2/rest' +
119
+ '?key=qwerty&userIp=127.0.0.1'
120
+ )
121
+ end
122
+
76
123
  it 'should correctly generate API objects' do
77
- @client.discovered_api('prediction').name.should == 'prediction'
78
- @client.discovered_api('prediction').version.should == 'v1'
79
- @client.discovered_api(:prediction).name.should == 'prediction'
80
- @client.discovered_api(:prediction).version.should == 'v1'
124
+ @client.discovered_api('prediction', 'v1.2').name.should == 'prediction'
125
+ @client.discovered_api('prediction', 'v1.2').version.should == 'v1.2'
126
+ @client.discovered_api(:prediction, 'v1.2').name.should == 'prediction'
127
+ @client.discovered_api(:prediction, 'v1.2').version.should == 'v1.2'
81
128
  end
82
129
 
83
130
  it 'should discover methods' do
84
131
  @client.discovered_method(
85
- 'prediction.training.insert', 'prediction'
132
+ 'prediction.training.insert', 'prediction', 'v1.2'
86
133
  ).name.should == 'insert'
87
134
  @client.discovered_method(
88
- :'prediction.training.insert', :prediction
135
+ :'prediction.training.insert', :prediction, 'v1.2'
89
136
  ).name.should == 'insert'
90
- end
91
-
92
- it 'should discover methods' do
93
137
  @client.discovered_method(
94
- 'prediction.training.delete', 'prediction', 'v1.1'
138
+ 'prediction.training.delete', 'prediction', 'v1.2'
95
139
  ).name.should == 'delete'
96
140
  end
97
141
 
98
142
  it 'should not find methods that are not in the discovery document' do
99
143
  @client.discovered_method(
100
- 'prediction.training.delete', 'prediction', 'v1'
101
- ).should == nil
102
- @client.discovered_method(
103
- 'prediction.bogus', 'prediction', 'v1'
144
+ 'prediction.bogus', 'prediction', 'v1.2'
104
145
  ).should == nil
105
146
  end
106
147
 
107
148
  it 'should raise an error for bogus methods' do
108
149
  (lambda do
109
- @client.discovered_method(42, 'prediction', 'v1')
150
+ @client.discovered_method(42, 'prediction', 'v1.2')
110
151
  end).should raise_error(TypeError)
111
152
  end
112
153
 
113
154
  it 'should raise an error for bogus methods' do
114
155
  (lambda do
115
- @client.generate_request(@client.discovered_api('prediction'))
156
+ @client.generate_request(@client.discovered_api('prediction', 'v1.2'))
116
157
  end).should raise_error(TypeError)
117
158
  end
118
159
 
@@ -123,49 +164,50 @@ describe Google::APIClient do
123
164
 
124
165
  it 'should generate valid requests' do
125
166
  request = @client.generate_request(
126
- 'prediction.training.insert',
127
- {'data' => '12345', }
167
+ :api_method => @prediction.training.insert,
168
+ :parameters => {'data' => '12345', }
128
169
  )
129
170
  method, uri, headers, body = request
130
171
  method.should == 'POST'
131
172
  uri.should ==
132
- 'https://www.googleapis.com/prediction/v1/training?data=12345'
173
+ 'https://www.googleapis.com/prediction/v1.2/training?data=12345'
133
174
  (headers.inject({}) { |h,(k,v)| h[k]=v; h }).should == {}
134
175
  body.should respond_to(:each)
135
176
  end
136
177
 
137
178
  it 'should generate requests against the correct URIs' do
138
179
  request = @client.generate_request(
139
- :'prediction.training.insert',
140
- {'data' => '12345'}
180
+ :api_method => @prediction.training.insert,
181
+ :parameters => {'data' => '12345'}
141
182
  )
142
183
  method, uri, headers, body = request
143
184
  uri.should ==
144
- 'https://www.googleapis.com/prediction/v1/training?data=12345'
185
+ 'https://www.googleapis.com/prediction/v1.2/training?data=12345'
145
186
  end
146
187
 
147
188
  it 'should generate requests against the correct URIs' do
148
- prediction = @client.discovered_api('prediction', 'v1')
149
189
  request = @client.generate_request(
150
- prediction.training.insert,
151
- {'data' => '12345'}
190
+ :api_method => @prediction.training.insert,
191
+ :parameters => {'data' => '12345'}
152
192
  )
153
193
  method, uri, headers, body = request
154
194
  uri.should ==
155
- 'https://www.googleapis.com/prediction/v1/training?data=12345'
195
+ 'https://www.googleapis.com/prediction/v1.2/training?data=12345'
156
196
  end
157
197
 
158
198
  it 'should allow modification to the base URIs for testing purposes' do
159
- prediction = @client.discovered_api('prediction', 'v1')
199
+ prediction = @client.discovered_api('prediction', 'v1.2')
160
200
  prediction.method_base =
161
- 'https://testing-domain.googleapis.com/prediction/v1/'
201
+ 'https://testing-domain.googleapis.com/prediction/v1.2/'
162
202
  request = @client.generate_request(
163
- prediction.training.insert,
164
- {'data' => '123'}
203
+ :api_method => prediction.training.insert,
204
+ :parameters => {'data' => '123'}
165
205
  )
166
206
  method, uri, headers, body = request
167
- uri.should ==
168
- 'https://testing-domain.googleapis.com/prediction/v1/training?data=123'
207
+ uri.should == (
208
+ 'https://testing-domain.googleapis.com/' +
209
+ 'prediction/v1.2/training?data=123'
210
+ )
169
211
  end
170
212
 
171
213
  it 'should generate OAuth 1 requests' do
@@ -173,8 +215,8 @@ describe Google::APIClient do
173
215
  @client.authorization.token_credential_key = '12345'
174
216
  @client.authorization.token_credential_secret = '12345'
175
217
  request = @client.generate_request(
176
- 'prediction.training.insert',
177
- {'data' => '12345'}
218
+ :api_method => @prediction.training.insert,
219
+ :parameters => {'data' => '12345'}
178
220
  )
179
221
  method, uri, headers, body = request
180
222
  headers = headers.inject({}) { |h,(k,v)| h[k]=v; h }
@@ -186,8 +228,8 @@ describe Google::APIClient do
186
228
  @client.authorization = :oauth_2
187
229
  @client.authorization.access_token = '12345'
188
230
  request = @client.generate_request(
189
- 'prediction.training.insert',
190
- {'data' => '12345'}
231
+ :api_method => @prediction.training.insert,
232
+ :parameters => {'data' => '12345'}
191
233
  )
192
234
  method, uri, headers, body = request
193
235
  headers = headers.inject({}) { |h,(k,v)| h[k]=v; h }
@@ -199,88 +241,112 @@ describe Google::APIClient do
199
241
  @client.authorization = :oauth_1
200
242
  @client.authorization.token_credential_key = '12345'
201
243
  @client.authorization.token_credential_secret = '12345'
202
- response = @client.execute(
203
- 'prediction.training.insert',
244
+ result = @client.execute(
245
+ @prediction.training.insert,
204
246
  {'data' => '12345'}
205
247
  )
206
- status, headers, body = response
248
+ status, headers, body = result.response
207
249
  status.should == 401
208
250
  end
209
251
 
210
252
  it 'should not be able to execute improperly authorized requests' do
211
253
  @client.authorization = :oauth_2
212
254
  @client.authorization.access_token = '12345'
213
- response = @client.execute(
214
- 'prediction.training.insert',
255
+ result = @client.execute(
256
+ @prediction.training.insert,
215
257
  {'data' => '12345'}
216
258
  )
217
- status, headers, body = response
259
+ status, headers, body = result.response
218
260
  status.should == 401
219
261
  end
262
+
263
+ it 'should not be able to execute improperly authorized requests' do
264
+ (lambda do
265
+ @client.authorization = :oauth_1
266
+ @client.authorization.token_credential_key = '12345'
267
+ @client.authorization.token_credential_secret = '12345'
268
+ result = @client.execute!(
269
+ @prediction.training.insert,
270
+ {'data' => '12345'}
271
+ )
272
+ end).should raise_error(Google::APIClient::ClientError)
273
+ end
274
+
275
+ it 'should not be able to execute improperly authorized requests' do
276
+ (lambda do
277
+ @client.authorization = :oauth_2
278
+ @client.authorization.access_token = '12345'
279
+ result = @client.execute!(
280
+ @prediction.training.insert,
281
+ {'data' => '12345'}
282
+ )
283
+ end).should raise_error(Google::APIClient::ClientError)
284
+ end
285
+
286
+ it 'should correctly handle unnamed parameters' do
287
+ @client.authorization = :oauth_2
288
+ @client.authorization.access_token = '12345'
289
+ result = @client.execute(
290
+ @prediction.training.insert,
291
+ {},
292
+ JSON.generate({"id" => "bucket/object"}),
293
+ {'Content-Type' => 'application/json'}
294
+ )
295
+ method, uri, headers, body = result.request
296
+ Hash[headers]['Content-Type'].should == 'application/json'
297
+ end
220
298
  end
221
299
 
222
- describe 'with the buzz API' do
300
+ describe 'with the plus API' do
223
301
  before do
224
302
  @client.authorization = nil
225
- @buzz = @client.discovered_api('buzz')
303
+ @plus = @client.discovered_api('plus')
226
304
  end
227
305
 
228
306
  it 'should correctly determine the discovery URI' do
229
- @client.discovery_uri('buzz').should ===
230
- 'https://www.googleapis.com/discovery/v1/apis/buzz/v1/rest'
307
+ @client.discovery_uri('plus').should ===
308
+ 'https://www.googleapis.com/discovery/v1/apis/plus/v1/rest'
231
309
  end
232
310
 
233
311
  it 'should find APIs that are in the discovery document' do
234
- @client.discovered_api('buzz').name.should == 'buzz'
235
- @client.discovered_api('buzz').version.should == 'v1'
236
- @client.discovered_api(:buzz).name.should == 'buzz'
237
- @client.discovered_api(:buzz).version.should == 'v1'
312
+ @client.discovered_api('plus').name.should == 'plus'
313
+ @client.discovered_api('plus').version.should == 'v1'
314
+ @client.discovered_api(:plus).name.should == 'plus'
315
+ @client.discovered_api(:plus).version.should == 'v1'
238
316
  end
239
317
 
240
318
  it 'should find methods that are in the discovery document' do
241
319
  # TODO(bobaman) Fix this when the RPC names are correct
242
320
  @client.discovered_method(
243
- 'chili.activities.list', 'buzz'
321
+ 'plus.activities.list', 'plus'
244
322
  ).name.should == 'list'
245
323
  end
246
324
 
247
325
  it 'should not find methods that are not in the discovery document' do
248
- @client.discovered_method('buzz.bogus', 'buzz').should == nil
249
- end
250
-
251
- it 'should fail for string RPC names that do not match API name' do
252
- (lambda do
253
- @client.generate_request(
254
- 'chili.activities.list',
255
- {'alt' => 'json'},
256
- '',
257
- [],
258
- {:signed => false}
259
- )
260
- end).should raise_error(Google::APIClient::TransmissionError)
326
+ @client.discovered_method('plus.bogus', 'plus').should == nil
261
327
  end
262
328
 
263
329
  it 'should generate requests against the correct URIs' do
264
330
  request = @client.generate_request(
265
- @buzz.activities.list,
266
- {'userId' => 'hikingfan', 'scope' => '@public'},
267
- '',
268
- [],
269
- {:signed => false}
331
+ :api_method => @plus.activities.list,
332
+ :parameters => {
333
+ 'userId' => '107807692475771887386', 'collection' => 'public'
334
+ },
335
+ :authenticated => false
270
336
  )
271
337
  method, uri, headers, body = request
272
- uri.should ==
273
- 'https://www.googleapis.com/buzz/v1/activities/hikingfan/@public'
338
+ uri.should == (
339
+ 'https://www.googleapis.com/plus/v1/' +
340
+ 'people/107807692475771887386/activities/public'
341
+ )
274
342
  end
275
343
 
276
344
  it 'should correctly validate parameters' do
277
345
  (lambda do
278
346
  @client.generate_request(
279
- @buzz.activities.list,
280
- {'alt' => 'json'},
281
- '',
282
- [],
283
- {:signed => false}
347
+ :api_method => @plus.activities.list,
348
+ :parameters => {'alt' => 'json'},
349
+ :authenticated => false
284
350
  )
285
351
  end).should raise_error(ArgumentError)
286
352
  end
@@ -288,26 +354,14 @@ describe Google::APIClient do
288
354
  it 'should correctly validate parameters' do
289
355
  (lambda do
290
356
  @client.generate_request(
291
- @buzz.activities.list,
292
- {'userId' => 'hikingfan', 'scope' => '@bogus'},
293
- '',
294
- [],
295
- {:signed => false}
357
+ :api_method => @plus.activities.list,
358
+ :parameters => {
359
+ 'userId' => '107807692475771887386', 'collection' => 'bogus'
360
+ },
361
+ :authenticated => false
296
362
  )
297
363
  end).should raise_error(ArgumentError)
298
364
  end
299
-
300
- it 'should be able to execute requests without authorization' do
301
- response = @client.execute(
302
- @buzz.activities.list,
303
- {'alt' => 'json', 'userId' => 'hikingfan', 'scope' => '@public'},
304
- '',
305
- [],
306
- {:signed => false}
307
- )
308
- status, headers, body = response
309
- status.should == 200
310
- end
311
365
  end
312
366
 
313
367
  describe 'with the latitude API' do
@@ -338,11 +392,8 @@ describe Google::APIClient do
338
392
 
339
393
  it 'should generate requests against the correct URIs' do
340
394
  request = @client.generate_request(
341
- 'latitude.currentLocation.get',
342
- {},
343
- '',
344
- [],
345
- {:signed => false}
395
+ :api_method => 'latitude.currentLocation.get',
396
+ :authenticated => false
346
397
  )
347
398
  method, uri, headers, body = request
348
399
  uri.should ==
@@ -351,11 +402,8 @@ describe Google::APIClient do
351
402
 
352
403
  it 'should generate requests against the correct URIs' do
353
404
  request = @client.generate_request(
354
- @latitude.current_location.get,
355
- {},
356
- '',
357
- [],
358
- {:signed => false}
405
+ :api_method => @latitude.current_location.get,
406
+ :authenticated => false
359
407
  )
360
408
  method, uri, headers, body = request
361
409
  uri.should ==
@@ -363,14 +411,11 @@ describe Google::APIClient do
363
411
  end
364
412
 
365
413
  it 'should not be able to execute requests without authorization' do
366
- response = @client.execute(
367
- 'latitude.currentLocation.get',
368
- {},
369
- '',
370
- [],
371
- {:signed => false}
414
+ result = @client.execute(
415
+ :api_method => 'latitude.currentLocation.get',
416
+ :authenticated => false
372
417
  )
373
- status, headers, body = response
418
+ status, headers, body = result.response
374
419
  status.should == 401
375
420
  end
376
421
  end
@@ -403,11 +448,8 @@ describe Google::APIClient do
403
448
 
404
449
  it 'should generate requests against the correct URIs' do
405
450
  request = @client.generate_request(
406
- 'moderator.profiles.get',
407
- {},
408
- '',
409
- [],
410
- {:signed => false}
451
+ :api_method => 'moderator.profiles.get',
452
+ :authenticated => false
411
453
  )
412
454
  method, uri, headers, body = request
413
455
  uri.should ==
@@ -416,11 +458,8 @@ describe Google::APIClient do
416
458
 
417
459
  it 'should generate requests against the correct URIs' do
418
460
  request = @client.generate_request(
419
- @moderator.profiles.get,
420
- {},
421
- '',
422
- [],
423
- {:signed => false}
461
+ :api_method => @moderator.profiles.get,
462
+ :authenticated => false
424
463
  )
425
464
  method, uri, headers, body = request
426
465
  uri.should ==
@@ -428,14 +467,14 @@ describe Google::APIClient do
428
467
  end
429
468
 
430
469
  it 'should not be able to execute requests without authorization' do
431
- response = @client.execute(
470
+ result = @client.execute(
432
471
  'moderator.profiles.get',
433
472
  {},
434
473
  '',
435
474
  [],
436
- {:signed => false}
475
+ {:authenticated => false}
437
476
  )
438
- status, headers, body = response
477
+ status, headers, body = result.response
439
478
  status.should == 401
440
479
  end
441
480
  end