| 
									
										
										
										
											2010-07-28 19:30:56 +00:00
										 |  |  | # Copyright 2010 Google Inc. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | # you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | # You may obtain a copy of the License at | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | # distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | # See the License for the specific language governing permissions and | 
					
						
							|  |  |  | # limitations under the License. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  | require 'httpadapter' | 
					
						
							|  |  |  | require 'json' | 
					
						
							| 
									
										
										
										
											2010-10-20 23:49:15 +00:00
										 |  |  | require 'stringio' | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-15 08:21:21 +00:00
										 |  |  | require 'google/api_client/version' | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  | require 'google/api_client/errors' | 
					
						
							| 
									
										
										
										
											2011-05-04 22:43:33 +00:00
										 |  |  | require 'google/api_client/environment' | 
					
						
							| 
									
										
										
										
											2010-09-18 00:30:02 +00:00
										 |  |  | require 'google/api_client/discovery' | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  | require 'google/api_client/reference' | 
					
						
							|  |  |  | require 'google/api_client/result' | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:49:00 +00:00
										 |  |  | module Google | 
					
						
							| 
									
										
										
										
											2010-09-28 23:09:07 +00:00
										 |  |  |   # TODO(bobaman): Document all this stuff. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |   ## | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |   # This class manages APIs communication. | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |   class APIClient | 
					
						
							| 
									
										
										
										
											2010-09-28 23:09:07 +00:00
										 |  |  |     ## | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # Creates a new Google API client. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @param [Hash] options The configuration parameters for the client. | 
					
						
							|  |  |  |     # @option options [Symbol, #generate_authenticated_request] :authorization | 
					
						
							|  |  |  |     #   (:oauth_1) | 
					
						
							|  |  |  |     #   The authorization mechanism used by the client.  The following | 
					
						
							|  |  |  |     #   mechanisms are supported out-of-the-box: | 
					
						
							|  |  |  |     #   <ul> | 
					
						
							|  |  |  |     #     <li><code>:two_legged_oauth_1</code></li> | 
					
						
							|  |  |  |     #     <li><code>:oauth_1</code></li> | 
					
						
							|  |  |  |     #     <li><code>:oauth_2</code></li> | 
					
						
							|  |  |  |     #   </ul> | 
					
						
							|  |  |  |     # @option options [String] :host ("www.googleapis.com") | 
					
						
							|  |  |  |     #   The API hostname used by the client.  This rarely needs to be changed. | 
					
						
							| 
									
										
										
										
											2011-05-12 17:12:15 +00:00
										 |  |  |     # @option options [String] :application_name | 
					
						
							|  |  |  |     #   The name and version of the application using the client. This should | 
					
						
							|  |  |  |     #   be given in the form `"{name}/{version}"`. | 
					
						
							|  |  |  |     # @option options [String] :user_agent | 
					
						
							|  |  |  |     #   ("{app_name} google-api-ruby-client/{version} {os_name}/{os_version}") | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     #   The user agent used by the client.  Most developers will want to | 
					
						
							| 
									
										
										
										
											2011-05-12 17:12:15 +00:00
										 |  |  |     #   leave this value alone and use the `:application_name` option instead. | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |     def initialize(options={}) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       # Normalize key to String to allow indifferent access. | 
					
						
							|  |  |  |       options = options.inject({}) do |accu, (key, value)| | 
					
						
							|  |  |  |         accu[key.to_s] = value | 
					
						
							|  |  |  |         accu | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       # Almost all API usage will have a host of 'www.googleapis.com'. | 
					
						
							|  |  |  |       self.host = options["host"] || 'www.googleapis.com' | 
					
						
							| 
									
										
										
										
											2011-05-04 22:43:33 +00:00
										 |  |  |       # Most developers will want to leave this value alone and use the | 
					
						
							|  |  |  |       # application_name option. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       self.user_agent = options["user_agent"] || ( | 
					
						
							| 
									
										
										
										
											2011-05-04 22:43:33 +00:00
										 |  |  |         (options["application_name"] || '') | 
					
						
							|  |  |  |         'google-api-ruby-client/' + VERSION::STRING + | 
					
						
							|  |  |  |         ' ' + ENV::OS_VERSION | 
					
						
							|  |  |  |       ).strip | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       # The writer method understands a few Symbols and will generate useful | 
					
						
							|  |  |  |       # default authentication mechanisms. | 
					
						
							|  |  |  |       self.authorization = options["authorization"] || :oauth_2 | 
					
						
							| 
									
										
										
										
											2011-09-21 07:51:51 +00:00
										 |  |  |       self.key = options["key"] | 
					
						
							|  |  |  |       self.user_ip = options["user_ip"] | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       # The HTTP adapter controls all of the HTTP traffic the client generates. | 
					
						
							|  |  |  |       # By default, Net::HTTP is used, but adding support for other clients | 
					
						
							|  |  |  |       # is trivial. | 
					
						
							|  |  |  |       if options["http_adapter"] | 
					
						
							|  |  |  |         self.http_adapter = options["http_adapter"] | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         require 'httpadapter/adapters/net_http' | 
					
						
							|  |  |  |         # NOTE: Do not rely on this default value, as it may change | 
					
						
							|  |  |  |         self.http_adapter = HTTPAdapter::NetHTTPAdapter.new | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @discovery_uris = {} | 
					
						
							|  |  |  |       @discovery_documents = {} | 
					
						
							|  |  |  |       @discovered_apis = {} | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |       return self | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # Returns the authorization mechanism used by the client. | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @return [#generate_authenticated_request] The authorization mechanism. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     attr_reader :authorization | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # Sets the authorization mechanism used by the client. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @param [#generate_authenticated_request] new_authorization | 
					
						
							|  |  |  |     #   The new authorization mechanism. | 
					
						
							|  |  |  |     def authorization=(new_authorization) | 
					
						
							|  |  |  |       case new_authorization | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |       when :oauth_1, :oauth | 
					
						
							| 
									
										
										
										
											2010-09-13 21:54:43 +00:00
										 |  |  |         require 'signet/oauth_1/client' | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |         # NOTE: Do not rely on this default value, as it may change | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         new_authorization = Signet::OAuth1::Client.new( | 
					
						
							| 
									
										
										
										
											2010-09-13 21:54:43 +00:00
										 |  |  |           :temporary_credential_uri => | 
					
						
							|  |  |  |             'https://www.google.com/accounts/OAuthGetRequestToken', | 
					
						
							|  |  |  |           :authorization_uri => | 
					
						
							|  |  |  |             'https://www.google.com/accounts/OAuthAuthorizeToken', | 
					
						
							|  |  |  |           :token_credential_uri => | 
					
						
							|  |  |  |             'https://www.google.com/accounts/OAuthGetAccessToken', | 
					
						
							|  |  |  |           :client_credential_key => 'anonymous', | 
					
						
							|  |  |  |           :client_credential_secret => 'anonymous' | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2010-10-22 00:36:23 +00:00
										 |  |  |       when :two_legged_oauth_1, :two_legged_oauth | 
					
						
							|  |  |  |         require 'signet/oauth_1/client' | 
					
						
							|  |  |  |         # NOTE: Do not rely on this default value, as it may change | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         new_authorization = Signet::OAuth1::Client.new( | 
					
						
							| 
									
										
										
										
											2010-10-22 00:36:23 +00:00
										 |  |  |           :client_credential_key => nil, | 
					
						
							|  |  |  |           :client_credential_secret => nil, | 
					
						
							|  |  |  |           :two_legged => true | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       when :oauth_2 | 
					
						
							|  |  |  |         require 'signet/oauth_2/client' | 
					
						
							|  |  |  |         # NOTE: Do not rely on this default value, as it may change | 
					
						
							|  |  |  |         new_authorization = Signet::OAuth2::Client.new( | 
					
						
							|  |  |  |           :authorization_uri => | 
					
						
							|  |  |  |             'https://accounts.google.com/o/oauth2/auth', | 
					
						
							|  |  |  |           :token_credential_uri => | 
					
						
							|  |  |  |             'https://accounts.google.com/o/oauth2/token' | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |       when nil | 
					
						
							|  |  |  |         # No authorization mechanism | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         if !new_authorization.respond_to?(:generate_authenticated_request) | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |           raise TypeError, | 
					
						
							|  |  |  |             'Expected authorization mechanism to respond to ' + | 
					
						
							|  |  |  |             '#generate_authenticated_request.' | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       @authorization = new_authorization | 
					
						
							|  |  |  |       return @authorization | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-21 07:51:51 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # The application's API key issued by the API console. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [String] The API key.. | 
					
						
							|  |  |  |     attr_accessor :key | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # The IP address of the user this request is being performed on behalf of. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [String] The user's IP address. | 
					
						
							|  |  |  |     attr_accessor :user_ip | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |     ## | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # Returns the HTTP adapter used by the client. | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @return [HTTPAdapter] | 
					
						
							|  |  |  |     #   The HTTP adapter object.  The object must include the | 
					
						
							|  |  |  |     #   HTTPAdapter module and conform to its interface. | 
					
						
							|  |  |  |     attr_reader :http_adapter | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Returns the HTTP adapter used by the client. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @return [HTTPAdapter] | 
					
						
							|  |  |  |     #   The HTTP adapter object.  The object must include the | 
					
						
							|  |  |  |     #   HTTPAdapter module and conform to its interface. | 
					
						
							|  |  |  |     def http_adapter=(new_http_adapter) | 
					
						
							|  |  |  |       if new_http_adapter.kind_of?(HTTPAdapter) | 
					
						
							|  |  |  |         @http_adapter = new_http_adapter | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         raise TypeError, "Expected HTTPAdapter, got #{new_http_adapter.class}." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # The API hostname used by the client. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [String] | 
					
						
							|  |  |  |     #   The API hostname.  Should almost always be 'www.googleapis.com'. | 
					
						
							|  |  |  |     attr_accessor :host | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # The user agent used by the client. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [String] | 
					
						
							|  |  |  |     #   The user agent string used in the User-Agent header. | 
					
						
							|  |  |  |     attr_accessor :user_agent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # Returns the URI for the directory document. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [Addressable::URI] The URI of the directory document. | 
					
						
							|  |  |  |     def directory_uri | 
					
						
							|  |  |  |       template = Addressable::Template.new( | 
					
						
							| 
									
										
										
										
											2011-05-12 20:14:15 +00:00
										 |  |  |         "https://{host}/discovery/v1/apis" | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       ) | 
					
						
							| 
									
										
										
										
											2011-05-12 20:14:15 +00:00
										 |  |  |       return template.expand({"host" => self.host}) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # Manually registers a URI as a discovery document for a specific version | 
					
						
							|  |  |  |     # of an API. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @param [String, Symbol] api The service name. | 
					
						
							|  |  |  |     # @param [String] version The desired version of the service. | 
					
						
							|  |  |  |     # @param [Addressable::URI] uri The URI of the discovery document. | 
					
						
							|  |  |  |     def register_discovery_uri(api, version, uri) | 
					
						
							|  |  |  |       api = api.to_s | 
					
						
							|  |  |  |       version = version || 'v1' | 
					
						
							|  |  |  |       @discovery_uris["#{api}:#{version}"] = uri | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-13 21:54:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-28 23:09:07 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Returns the URI for the discovery document. | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @param [String, Symbol] api The service name. | 
					
						
							|  |  |  |     # @param [String] version The desired version of the service. | 
					
						
							| 
									
										
										
										
											2010-09-28 23:09:07 +00:00
										 |  |  |     # @return [Addressable::URI] The URI of the discovery document. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     def discovery_uri(api, version=nil) | 
					
						
							|  |  |  |       api = api.to_s | 
					
						
							|  |  |  |       version = version || 'v1' | 
					
						
							|  |  |  |       return @discovery_uris["#{api}:#{version}"] ||= (begin | 
					
						
							|  |  |  |         template = Addressable::Template.new( | 
					
						
							| 
									
										
										
										
											2011-05-12 20:14:15 +00:00
										 |  |  |           "https://{host}/discovery/v1/apis/" + | 
					
						
							|  |  |  |           "{api}/{version}/rest" | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         ) | 
					
						
							|  |  |  |         template.expand({ | 
					
						
							|  |  |  |           "host" => self.host, | 
					
						
							|  |  |  |           "api" => api, | 
					
						
							|  |  |  |           "version" => version | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |       end) | 
					
						
							| 
									
										
										
										
											2010-08-19 23:21:45 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-13 21:54:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-22 22:21:26 +00:00
										 |  |  |     ## | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # Manually registers a pre-loaded discovery document for a specific version | 
					
						
							|  |  |  |     # of an API. | 
					
						
							| 
									
										
										
										
											2010-10-22 22:21:26 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @param [String, Symbol] api The service name. | 
					
						
							|  |  |  |     # @param [String] version The desired version of the service. | 
					
						
							|  |  |  |     # @param [String, StringIO] discovery_document | 
					
						
							|  |  |  |     #   The contents of the discovery document. | 
					
						
							|  |  |  |     def register_discovery_document(api, version, discovery_document) | 
					
						
							|  |  |  |       api = api.to_s | 
					
						
							|  |  |  |       version = version || 'v1' | 
					
						
							|  |  |  |       if discovery_document.kind_of?(StringIO) | 
					
						
							|  |  |  |         discovery_document.rewind | 
					
						
							|  |  |  |         discovery_document = discovery_document.string | 
					
						
							|  |  |  |       elsif discovery_document.respond_to?(:to_str) | 
					
						
							|  |  |  |         discovery_document = discovery_document.to_str | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         raise TypeError, | 
					
						
							|  |  |  |           "Expected String or StringIO, got #{discovery_document.class}." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @discovery_documents["#{api}:#{version}"] = | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |         ::JSON.parse(discovery_document) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # Returns the parsed directory document. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [Hash] The parsed JSON from the directory document. | 
					
						
							|  |  |  |     def directory_document | 
					
						
							|  |  |  |       return @directory_document ||= (begin | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |         request = self.generate_request( | 
					
						
							|  |  |  |           :http_method => 'GET', | 
					
						
							|  |  |  |           :uri => self.directory_uri, | 
					
						
							|  |  |  |           :authenticated => false | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |         response = self.transmit(request) | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         status, headers, body = response | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |         if status >= 200 && status < 300
 | 
					
						
							|  |  |  |           # TODO(bobaman) Better status code handling? | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           merged_body = body.inject(StringIO.new) do |accu, chunk| | 
					
						
							|  |  |  |             accu.write(chunk) | 
					
						
							|  |  |  |             accu | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           ::JSON.parse(merged_body.string) | 
					
						
							|  |  |  |         elsif status >= 400 && status < 500
 | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |           _, request_uri, _, _ = request | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           raise ClientError, | 
					
						
							|  |  |  |             "Could not retrieve discovery document at: #{request_uri}" | 
					
						
							|  |  |  |         elsif status >= 500 && status < 600
 | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |           _, request_uri, _, _ = request | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           raise ServerError, | 
					
						
							|  |  |  |             "Could not retrieve discovery document at: #{request_uri}" | 
					
						
							|  |  |  |         elsif status > 600
 | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |           _, request_uri, _, _ = request | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |           raise TransmissionError, | 
					
						
							|  |  |  |             "Could not retrieve discovery document at: #{request_uri}" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end) | 
					
						
							| 
									
										
										
										
											2010-10-22 22:21:26 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Returns the parsed discovery document. | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @param [String, Symbol] api The service name. | 
					
						
							|  |  |  |     # @param [String] version The desired version of the service. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # @return [Hash] The parsed JSON from the discovery document. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     def discovery_document(api, version=nil) | 
					
						
							|  |  |  |       api = api.to_s | 
					
						
							|  |  |  |       version = version || 'v1' | 
					
						
							|  |  |  |       return @discovery_documents["#{api}:#{version}"] ||= (begin | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |         request = self.generate_request( | 
					
						
							|  |  |  |           :http_method => 'GET', | 
					
						
							|  |  |  |           :uri => self.discovery_uri(api, version), | 
					
						
							|  |  |  |           :authenticated => false | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |         response = self.transmit(request) | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |         status, headers, body = response | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |         if status >= 200 && status < 300
 | 
					
						
							|  |  |  |           # TODO(bobaman) Better status code handling? | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           merged_body = body.inject(StringIO.new) do |accu, chunk| | 
					
						
							|  |  |  |             accu.write(chunk) | 
					
						
							|  |  |  |             accu | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           ::JSON.parse(merged_body.string) | 
					
						
							|  |  |  |         elsif status >= 400 && status < 500
 | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |           _, request_uri, _, _ = request | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           raise ClientError, | 
					
						
							|  |  |  |             "Could not retrieve discovery document at: #{request_uri}" | 
					
						
							|  |  |  |         elsif status >= 500 && status < 600
 | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |           _, request_uri, _, _ = request | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           raise ServerError, | 
					
						
							|  |  |  |             "Could not retrieve discovery document at: #{request_uri}" | 
					
						
							|  |  |  |         elsif status > 600
 | 
					
						
							| 
									
										
										
										
											2011-09-22 07:41:13 +00:00
										 |  |  |           _, request_uri, _, _ = request | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |           raise TransmissionError, | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |             "Could not retrieve discovery document at: #{request_uri}" | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # Returns all APIs published in the directory document. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [Array] The list of available APIs. | 
					
						
							|  |  |  |     def discovered_apis | 
					
						
							|  |  |  |       @directory_apis ||= (begin | 
					
						
							|  |  |  |         document_base = self.directory_uri | 
					
						
							|  |  |  |         if self.directory_document && self.directory_document['items'] | 
					
						
							|  |  |  |           self.directory_document['items'].map do |discovery_document| | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |             Google::APIClient::API.new( | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |               document_base, | 
					
						
							|  |  |  |               discovery_document | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |             ) | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         else | 
					
						
							|  |  |  |           [] | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Returns the service object for a given service name and service version. | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @param [String, Symbol] api The service name. | 
					
						
							|  |  |  |     # @param [String] version The desired version of the service. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @return [Google::APIClient::API] The service object. | 
					
						
							|  |  |  |     def discovered_api(api, version=nil) | 
					
						
							|  |  |  |       if !api.kind_of?(String) && !api.kind_of?(Symbol) | 
					
						
							| 
									
										
										
										
											2010-09-30 21:33:23 +00:00
										 |  |  |         raise TypeError, | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |           "Expected String or Symbol, got #{api.class}." | 
					
						
							| 
									
										
										
										
											2010-09-30 21:33:23 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       api = api.to_s | 
					
						
							|  |  |  |       version = version || 'v1' | 
					
						
							|  |  |  |       return @discovered_apis["#{api}:#{version}"] ||= begin | 
					
						
							|  |  |  |         document_base = self.discovery_uri(api, version) | 
					
						
							|  |  |  |         discovery_document = self.discovery_document(api, version) | 
					
						
							|  |  |  |         if document_base && discovery_document | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |           Google::APIClient::API.new( | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |             document_base, | 
					
						
							|  |  |  |             discovery_document | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           nil | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-09-13 21:54:43 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Returns the method object for a given RPC name and service version. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @param [String, Symbol] rpc_name The RPC name of the desired method. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @param [String] version The desired version of the service. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @return [Google::APIClient::Method] The method object. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     def discovered_method(rpc_name, api, version=nil) | 
					
						
							| 
									
										
										
										
											2010-09-30 21:33:23 +00:00
										 |  |  |       if !rpc_name.kind_of?(String) && !rpc_name.kind_of?(Symbol) | 
					
						
							|  |  |  |         raise TypeError, | 
					
						
							|  |  |  |           "Expected String or Symbol, got #{rpc_name.class}." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       rpc_name = rpc_name.to_s | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       api = api.to_s | 
					
						
							|  |  |  |       version = version || 'v1' | 
					
						
							|  |  |  |       service = self.discovered_api(api, version) | 
					
						
							|  |  |  |       if service.to_h[rpc_name] | 
					
						
							|  |  |  |         return service.to_h[rpc_name] | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         return nil | 
					
						
							| 
									
										
										
										
											2010-09-16 23:40:08 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Returns the service object with the highest version number. | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @note <em>Warning</em>: This method should be used with great care. | 
					
						
							|  |  |  |     # As APIs are updated, minor differences between versions may cause | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # incompatibilities. Requesting a specific version will avoid this issue. | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @param [String, Symbol] api The name of the service. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     # @return [Google::APIClient::API] The service object. | 
					
						
							|  |  |  |     def preferred_version(api) | 
					
						
							|  |  |  |       if !api.kind_of?(String) && !api.kind_of?(Symbol) | 
					
						
							| 
									
										
										
										
											2010-09-30 21:33:23 +00:00
										 |  |  |         raise TypeError, | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |           "Expected String or Symbol, got #{api.class}." | 
					
						
							| 
									
										
										
										
											2010-09-30 21:33:23 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       api = api.to_s | 
					
						
							|  |  |  |       # TODO(bobaman): Update to use directory API. | 
					
						
							|  |  |  |       return self.discovered_apis.detect do |a| | 
					
						
							|  |  |  |         a.name == api && a.preferred == true | 
					
						
							| 
									
										
										
										
											2011-01-05 01:09:52 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Generates a request. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @param [Google::APIClient::Method, String] api_method | 
					
						
							|  |  |  |     #   The method object or the RPC name of the method being executed. | 
					
						
							|  |  |  |     # @param [Hash, Array] parameters | 
					
						
							|  |  |  |     #   The parameters to send to the method. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:50:27 +00:00
										 |  |  |     # @param [String] body The body of the request. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # @param [Hash, Array] headers The HTTP headers for the request. | 
					
						
							|  |  |  |     # @param [Hash] options | 
					
						
							|  |  |  |     #   The configuration parameters for the request. | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     #   - <code>:version</code> —  | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     #     The service version.  Only used if <code>api_method</code> is a | 
					
						
							|  |  |  |     #     <code>String</code>.  Defaults to <code>'v1'</code>. | 
					
						
							|  |  |  |     #   - <code>:authorization</code> —  | 
					
						
							|  |  |  |     #     The authorization mechanism for the response.  Used only if | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |     #     <code>:authenticated</code> is <code>true</code>. | 
					
						
							|  |  |  |     #   - <code>:authenticated</code> —  | 
					
						
							|  |  |  |     #     <code>true</code> if the request must be signed or otherwise | 
					
						
							|  |  |  |     #     authenticated, <code>false</code> | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |     #     otherwise.  Defaults to <code>true</code> if an authorization | 
					
						
							|  |  |  |     #     mechanism has been set, <code>false</code> otherwise. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @return [Array] The generated request. | 
					
						
							| 
									
										
										
										
											2010-10-07 22:12:34 +00:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @example | 
					
						
							|  |  |  |     #   request = client.generate_request( | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     #     :api_method => 'chili.activities.list', | 
					
						
							|  |  |  |     #     :parameters => | 
					
						
							|  |  |  |     #       {'scope' => '@self', 'userId' => '@me', 'alt' => 'json'} | 
					
						
							| 
									
										
										
										
											2010-10-07 22:12:34 +00:00
										 |  |  |     #   ) | 
					
						
							|  |  |  |     #   method, uri, headers, body = request | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     def generate_request(options={}) | 
					
						
							|  |  |  |       # Note: The merge method on a Hash object will coerce an API Reference | 
					
						
							|  |  |  |       # object into a Hash and merge with the default options. | 
					
						
							| 
									
										
										
										
											2010-09-16 23:40:08 +00:00
										 |  |  |       options={ | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         :version => 'v1', | 
					
						
							| 
									
										
										
										
											2011-09-21 07:51:51 +00:00
										 |  |  |         :authorization => self.authorization, | 
					
						
							|  |  |  |         :key => self.key, | 
					
						
							|  |  |  |         :user_ip => self.user_ip | 
					
						
							| 
									
										
										
										
											2010-09-16 23:40:08 +00:00
										 |  |  |       }.merge(options) | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |       # The Reference object is going to need this to do method ID lookups. | 
					
						
							|  |  |  |       options[:client] = self | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       # The default value for the :authenticated option depends on whether an | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |       # authorization mechanism has been set. | 
					
						
							|  |  |  |       if options[:authorization] | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         options = {:authenticated => true}.merge(options) | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         options = {:authenticated => false}.merge(options) | 
					
						
							| 
									
										
										
										
											2010-10-12 20:39:09 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |       reference = Google::APIClient::Reference.new(options) | 
					
						
							|  |  |  |       request = reference.to_request | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       if options[:authenticated] | 
					
						
							|  |  |  |         request = self.generate_authenticated_request(:request => request) | 
					
						
							| 
									
										
										
										
											2010-08-24 21:59:53 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-09-16 23:40:08 +00:00
										 |  |  |       return request | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     # Signs a request using the current authorization mechanism. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     # @param [Hash] options The options to pass through. | 
					
						
							| 
									
										
										
										
											2010-10-07 22:12:27 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     # @return [Array] The signed or otherwise authenticated request. | 
					
						
							|  |  |  |     def generate_authenticated_request(options={}) | 
					
						
							|  |  |  |       return authorization.generate_authenticated_request(options) | 
					
						
							| 
									
										
										
										
											2010-08-24 21:59:53 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							|  |  |  |     # Transmits the request using the current HTTP adapter. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @param [Array] request The request to transmit. | 
					
						
							|  |  |  |     # @param [#transmit] adapter The HTTP adapter. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @return [Array] The response from the server. | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     def transmit(request, adapter=self.http_adapter) | 
					
						
							| 
									
										
										
										
											2011-01-05 01:09:52 +00:00
										 |  |  |       if self.user_agent != nil | 
					
						
							|  |  |  |         # If there's no User-Agent header, set one. | 
					
						
							|  |  |  |         method, uri, headers, body = request | 
					
						
							|  |  |  |         unless headers.kind_of?(Enumerable) | 
					
						
							|  |  |  |           # We need to use some Enumerable methods, relying on the presence of | 
					
						
							|  |  |  |           # the #each method. | 
					
						
							|  |  |  |           class <<headers | 
					
						
							|  |  |  |             include Enumerable | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |         if self.user_agent.kind_of?(String) | 
					
						
							|  |  |  |           unless headers.any? { |k, v| k.downcase == 'User-Agent'.downcase } | 
					
						
							|  |  |  |             headers = headers.to_a.insert(0, ['User-Agent', self.user_agent]) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         elsif self.user_agent != nil | 
					
						
							|  |  |  |           raise TypeError, | 
					
						
							|  |  |  |             "Expected User-Agent to be String, got #{self.user_agent.class}" | 
					
						
							| 
									
										
										
										
											2011-01-05 01:09:52 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-05-04 11:44:35 +00:00
										 |  |  |       adapter.transmit([method, uri, headers, body]) | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     ## | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     # Executes a request, wrapping it in a Result object. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     # @param [Google::APIClient::Method, String] api_method | 
					
						
							|  |  |  |     #   The method object or the RPC name of the method being executed. | 
					
						
							|  |  |  |     # @param [Hash, Array] parameters | 
					
						
							|  |  |  |     #   The parameters to send to the method. | 
					
						
							|  |  |  |     # @param [String] body The body of the request. | 
					
						
							|  |  |  |     # @param [Hash, Array] headers The HTTP headers for the request. | 
					
						
							|  |  |  |     # @param [Hash] options | 
					
						
							|  |  |  |     #   The configuration parameters for the request. | 
					
						
							|  |  |  |     #   - <code>:version</code> —  | 
					
						
							|  |  |  |     #     The service version.  Only used if <code>api_method</code> is a | 
					
						
							|  |  |  |     #     <code>String</code>.  Defaults to <code>'v1'</code>. | 
					
						
							|  |  |  |     #   - <code>:adapter</code> —  | 
					
						
							|  |  |  |     #     The HTTP adapter. | 
					
						
							|  |  |  |     #   - <code>:authorization</code> —  | 
					
						
							|  |  |  |     #     The authorization mechanism for the response.  Used only if | 
					
						
							|  |  |  |     #     <code>:authenticated</code> is <code>true</code>. | 
					
						
							|  |  |  |     #   - <code>:authenticated</code> —  | 
					
						
							|  |  |  |     #     <code>true</code> if the request must be signed or otherwise | 
					
						
							|  |  |  |     #     authenticated, <code>false</code> | 
					
						
							|  |  |  |     #     otherwise.  Defaults to <code>true</code>. | 
					
						
							| 
									
										
										
										
											2010-10-05 23:46:43 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |     # @return [Array] The response from the API. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @example | 
					
						
							|  |  |  |     #   request = client.generate_request( | 
					
						
							|  |  |  |     #     :api_method => 'chili.activities.list', | 
					
						
							|  |  |  |     #     :parameters => | 
					
						
							|  |  |  |     #       {'scope' => '@self', 'userId' => '@me', 'alt' => 'json'} | 
					
						
							|  |  |  |     #   ) | 
					
						
							|  |  |  |     def execute(*params) | 
					
						
							|  |  |  |       # This block of code allows us to accept multiple parameter passing | 
					
						
							| 
									
										
										
										
											2011-08-02 20:20:54 +00:00
										 |  |  |       # styles, and maintaining some backwards compatibility. | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # Note: I'm extremely tempted to deprecate this style of execute call. | 
					
						
							|  |  |  |       if params.last.respond_to?(:to_hash) && params.size == 1
 | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |         options = params.pop | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         options = {} | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       options[:api_method] = params.shift if params.size > 0
 | 
					
						
							|  |  |  |       options[:parameters] = params.shift if params.size > 0
 | 
					
						
							|  |  |  |       options[:merged_body] = params.shift if params.size > 0
 | 
					
						
							|  |  |  |       options[:headers] = params.shift if params.size > 0
 | 
					
						
							|  |  |  |       options[:client] = self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       reference = Google::APIClient::Reference.new(options) | 
					
						
							|  |  |  |       request = self.generate_request(reference) | 
					
						
							|  |  |  |       response = self.transmit( | 
					
						
							|  |  |  |         request, | 
					
						
							|  |  |  |         options[:adapter] || self.http_adapter | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |       return Google::APIClient::Result.new(reference, request, response) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ## | 
					
						
							|  |  |  |     # Same as Google::APIClient#execute, but raises an exception if there was | 
					
						
							|  |  |  |     # an error. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @see Google::APIClient#execute | 
					
						
							|  |  |  |     def execute!(*params) | 
					
						
							|  |  |  |       result = self.execute(*params) | 
					
						
							|  |  |  |       status, _, _ = result.response | 
					
						
							| 
									
										
										
										
											2011-09-22 09:21:05 +00:00
										 |  |  |       if result.data.respond_to?(:error) && | 
					
						
							|  |  |  |           result.data.error.respond_to?(:message) | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |         # You're going to get a terrible error message if the response isn't | 
					
						
							|  |  |  |         # parsed successfully as an error. | 
					
						
							| 
									
										
										
										
											2011-09-22 09:21:05 +00:00
										 |  |  |         error_message = result.data.error.message | 
					
						
							|  |  |  |       elsif result.data['error'] && result.data['error']['message'] | 
					
						
							|  |  |  |         error_message = result.data['error']['message'] | 
					
						
							| 
									
										
										
										
											2011-07-29 22:07:04 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |       if status >= 400 && status < 500
 | 
					
						
							|  |  |  |         raise ClientError, | 
					
						
							|  |  |  |           error_message || "A client error has occurred." | 
					
						
							|  |  |  |       elsif status >= 500 && status < 600
 | 
					
						
							|  |  |  |         raise ServerError, | 
					
						
							|  |  |  |           error_message || "A server error has occurred." | 
					
						
							|  |  |  |       elsif status > 600
 | 
					
						
							|  |  |  |         raise TransmissionError, | 
					
						
							|  |  |  |           error_message || "A transmission error has occurred." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       return result | 
					
						
							| 
									
										
										
										
											2010-09-16 19:12:52 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-08-10 04:44:14 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2010-08-19 23:21:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | require 'google/api_client/version' |