Reorganized some of the code and removed unnecessary stuff.
git-svn-id: https://google-api-ruby-client.googlecode.com/svn/trunk@35 c1d61fac-ed7f-fcc1-18f7-ff78120a04ef
This commit is contained in:
		
							parent
							
								
									3a9d58108a
								
							
						
					
					
						commit
						f96412cf23
					
				
							
								
								
									
										16
									
								
								README
								
								
								
								
							
							
						
						
									
										16
									
								
								README
								
								
								
								
							|  | @ -15,7 +15,21 @@ The Google API Ruby Client makes it trivial to discover and access supported API | |||
| 
 | ||||
| == Example Usage | ||||
| 
 | ||||
|   # Some code goes here. | ||||
|     require 'google/api_client' | ||||
|     client = Google::APIClient.new(:service => 'buzz') | ||||
|     client.authorization.fetch_temporary_credential!( | ||||
|       :additional_parameters => { | ||||
|         'scope' => 'https://www.googleapis.com/auth/buzz' | ||||
|       } | ||||
|     ) | ||||
|     client.authorization.authorization_uri | ||||
|     # Redirect user here | ||||
|     client.authorization.fetch_token_credential!(:verifier => '12345') | ||||
|     response = client.execute( | ||||
|       'buzz.activities.list', | ||||
|       'scope' => '@self', 'userId' => '@me', 'alt' => 'json' | ||||
|     ) | ||||
|     status, headers, body = response | ||||
| 
 | ||||
| == Requirements | ||||
| 
 | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ | |||
| require 'httpadapter' | ||||
| require 'json' | ||||
| 
 | ||||
| require 'google/api_client/discovery/service' | ||||
| require 'google/api_client/discovery' | ||||
| 
 | ||||
| module Google #:nodoc: | ||||
|   ## | ||||
|  | @ -32,9 +32,9 @@ module Google #:nodoc: | |||
|     # Returns the parser used by the client. | ||||
|     def parser | ||||
|       unless @options[:parser] | ||||
|         require 'google/api_client/parser/json_parser' | ||||
|         require 'google/api_client/parsers/json_parser' | ||||
|         # NOTE: Do not rely on this default value, as it may change | ||||
|         @options[:parser] = JSONParser.new | ||||
|         @options[:parser] = JSONParser | ||||
|       end | ||||
|       return @options[:parser] | ||||
|     end | ||||
|  | @ -72,9 +72,9 @@ module Google #:nodoc: | |||
|       return @options[:discovery_uri] ||= (begin | ||||
|         if @options[:service] | ||||
|           service_id = @options[:service] | ||||
|           service_version = @options[:service_version] || '1.0' | ||||
|           service_version = @options[:service_version] || 'v1' | ||||
|           "http://www.googleapis.com/discovery/0.1/describe" + | ||||
|           "?api=#{service_id}&apiVersion=#{service_version}" | ||||
|           "?api=#{service_id}" | ||||
|         else | ||||
|           raise ArgumentError, | ||||
|             'Missing required configuration value, :discovery_uri.' | ||||
|  | @ -107,10 +107,9 @@ module Google #:nodoc: | |||
|         services = [] | ||||
|         for service_name in service_names | ||||
|           versions = self.discovery_document['data'][service_name] | ||||
|           for version_name in versions.keys() | ||||
|           for service_version in versions.keys() | ||||
|             service_description = | ||||
|               self.discovery_document['data'][service_name][version_name] | ||||
|             service_version = "%.1f" % version_name.gsub(/^v/, '').to_f | ||||
|               self.discovery_document['data'][service_name][service_version] | ||||
|             services << ::Google::APIClient::Service.new( | ||||
|               service_name, | ||||
|               service_version, | ||||
|  | @ -122,7 +121,7 @@ module Google #:nodoc: | |||
|       end) | ||||
|     end | ||||
| 
 | ||||
|     def discovered_service(service_name, service_version='1.0') | ||||
|     def discovered_service(service_name, service_version='v1') | ||||
|       for service in self.discovered_services | ||||
|         if service.name == service_name && | ||||
|             service.version.to_s == service_version.to_s | ||||
|  | @ -132,7 +131,7 @@ module Google #:nodoc: | |||
|       return nil | ||||
|     end | ||||
| 
 | ||||
|     def discovered_method(rpc_name, service_version='1.0') | ||||
|     def discovered_method(rpc_name, service_version='v1') | ||||
|       for service in self.discovered_services | ||||
|         # This looks kinda weird, but is not a real problem because there's | ||||
|         # almost always only one service, and this is memoized anyhow. | ||||
|  | @ -143,11 +142,24 @@ module Google #:nodoc: | |||
|       return nil | ||||
|     end | ||||
| 
 | ||||
|     def latest_service(service_name) | ||||
|       versions = {} | ||||
|       for service in self.discovered_services | ||||
|         next if service.name != service_name | ||||
|         sortable_version = service.version.gsub(/^v/, '').split('.').map do |v| | ||||
|           v.to_i | ||||
|         end | ||||
|         versions[sortable_version] = service | ||||
|       end | ||||
|       return versions[versions.keys.sort.last] | ||||
|     end | ||||
| 
 | ||||
|     def generate_request( | ||||
|         api_method, parameters={}, body='', headers=[], options={}) | ||||
|       options={ | ||||
|         :signed => true, | ||||
|         :service_version => '1.0' | ||||
|         :parser => self.parser, | ||||
|         :service_version => 'v1' | ||||
|       }.merge(options) | ||||
|       if api_method.kind_of?(String) | ||||
|         api_method = self.discovered_method( | ||||
|  | @ -172,8 +184,8 @@ module Google #:nodoc: | |||
|       return self.transmit_request(request) | ||||
|     end | ||||
| 
 | ||||
|     def transmit_request(request) | ||||
|       ::HTTPAdapter.transmit(request, self.http_adapter) | ||||
|     def transmit_request(request, adapter=self.http_adapter) | ||||
|       ::HTTPAdapter.transmit(request, adapter) | ||||
|     end | ||||
| 
 | ||||
|     def sign_request(request) | ||||
|  |  | |||
|  | @ -1,87 +0,0 @@ | |||
| # 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. | ||||
| 
 | ||||
| require 'json' | ||||
| require 'addressable/template' | ||||
| 
 | ||||
| module Google #:nodoc: | ||||
|   class APIClient #:nodoc: | ||||
|     ## | ||||
|     # A discovery document handler. | ||||
|     class Discovery | ||||
| 
 | ||||
|       ## | ||||
|       # The default discovery configuration values.  These may be overrided | ||||
|       # simply by passing in the same key to the constructor. | ||||
|       DEFAULTS = { | ||||
|       } | ||||
| 
 | ||||
|       ## | ||||
|       # A set of default configuration values specific to each service.  These | ||||
|       # may be overrided simply by passing in the same key to the constructor. | ||||
|       SERVICE_DEFAULTS = { | ||||
|       } | ||||
| 
 | ||||
|       ## | ||||
|       # Creates a new API discovery handler. | ||||
|       # | ||||
|       # @param [Hash] options | ||||
|       #   <code>:service</code>:: | ||||
|       #     The name of the service. | ||||
|       #   <code>:service_version</code>:: | ||||
|       #     The version of the service. | ||||
|       #   <code>:discovery_uri</code>:: | ||||
|       #     The URI of the discovery document. | ||||
|       # | ||||
|       # @return [Google::APIClient::Discovery] The API discovery handler. | ||||
|       def initialize(options={}) | ||||
|         if options[:service] && SERVICE_DEFAULTS[options[:service]] | ||||
|           @options = DEFAULTS.merge(SERVICE_DEFAULTS[options[:service]]) | ||||
|         else | ||||
|           @options = DEFAULTS.clone | ||||
|         end | ||||
|         @options.merge!(options) | ||||
|         if @options[:service] && !@options[:discovery_uri] | ||||
|           service_id = @options[:service] | ||||
|           service_version = @options[:service_version] || '1.0' | ||||
|           @options[:discovery_uri] = | ||||
|             "http://www.googleapis.com/discovery/0.1/describe" + | ||||
|             "?api=#{service_id}&apiVersion=#{service_version}" | ||||
|         end | ||||
|         unless @options[:discovery_uri] | ||||
|           raise ArgumentError, | ||||
|             'Missing required configuration value, :discovery_uri.' | ||||
|         end | ||||
|         # Handle any remaining configuration here | ||||
|       end | ||||
| 
 | ||||
|       ## | ||||
|       # Returns the configuration of the handler.  Configuration options that | ||||
|       # are not recognized by the handler are ignored. | ||||
|       # | ||||
|       # @return [Hash] The configuration options. | ||||
|       def options | ||||
|         return @options | ||||
|       end | ||||
| 
 | ||||
|       ## | ||||
|       # Returns the URI of the discovery document. | ||||
|       # | ||||
|       # @return [String] The URI of the discovery document. | ||||
|       def discovery_uri | ||||
|         return @options[:discovery_uri] | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -16,26 +16,24 @@ require 'json' | |||
| 
 | ||||
| module Google #:nodoc: | ||||
|   class APIClient #:nodoc: | ||||
| 
 | ||||
|     ## | ||||
|     # Provides a consistent interface by which to parse request and response | ||||
|     # content. | ||||
|     # TODO(mattpok): ensure floats, URLs, dates are parsed correctly | ||||
|     class JSONParser | ||||
|     module JSONParser | ||||
| 
 | ||||
|       def generate(hash) | ||||
|       def self.serialize(hash) | ||||
|         # JSON parser used can accept arrays as well, but we will limit | ||||
|         # to only allow hash to JSON string parsing to keep a simple interface | ||||
|         unless hash.instance_of? Hash | ||||
|           raise ArgumentError, | ||||
|             "JSON generate expected a Hash but got a #{hash.class}." | ||||
|         end | ||||
| 
 | ||||
|         return JSON.generate hash | ||||
|         return JSON.generate(hash) | ||||
|       end | ||||
| 
 | ||||
|       def parse(json_string) | ||||
|         return JSON.parse json_string | ||||
|       def self.parse(json_string) | ||||
|         return JSON.parse(json_string) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  | @ -1,28 +0,0 @@ | |||
| # 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. | ||||
| 
 | ||||
| module Google #:nodoc: | ||||
|   class APIClient #:nodoc: | ||||
| 
 | ||||
|     ## | ||||
|     # A simple request abstraction for API requests.  This is the primary | ||||
|     # request object that users will interact with. | ||||
|     # | ||||
|     class APIRequest | ||||
| 
 | ||||
|       def execute | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -1,29 +0,0 @@ | |||
| # 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. | ||||
| 
 | ||||
| module Google #:nodoc: | ||||
|   class APIClient #:nodoc: | ||||
| 
 | ||||
|     ## | ||||
|     # A simple response abstraction for API requests. Encapsulates raw repsonse | ||||
|     # data and allows user to parse response as a hash or model class. | ||||
|     # This is the primary response object that users will interact with. | ||||
|     # | ||||
|     class APIResponse | ||||
| 
 | ||||
|       def parse | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -1,46 +0,0 @@ | |||
| # 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. | ||||
| 
 | ||||
| require 'spec_helper' | ||||
| 
 | ||||
| require 'oauth' | ||||
| require 'google/api_client/discovery/discovery' | ||||
| 
 | ||||
| describe Google::APIClient::Discovery, 'configured for use with a service' do | ||||
|   before do | ||||
|     @discovery = Google::APIClient::Discovery.new(:service => :magic) | ||||
|   end | ||||
| 
 | ||||
|   it 'should have the correct discovery document URI' do | ||||
|     @discovery.discovery_uri.should == | ||||
|       'http://www.googleapis.com/discovery/0.1/describe' + | ||||
|       '?api=magic&apiVersion=1.0' | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| describe Google::APIClient::Discovery, | ||||
|     'configured for use with a specific service version' do | ||||
|   before do | ||||
|     @discovery = Google::APIClient::Discovery.new( | ||||
|       :service => :magic, | ||||
|       :service_version => 42.0 | ||||
|     ) | ||||
|   end | ||||
| 
 | ||||
|   it 'should have the correct discovery document URI' do | ||||
|     @discovery.discovery_uri.should == | ||||
|       'http://www.googleapis.com/discovery/0.1/describe' + | ||||
|       '?api=magic&apiVersion=42.0' | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1,71 @@ | |||
| # 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. | ||||
| 
 | ||||
| require 'spec_helper' | ||||
| 
 | ||||
| require 'signet/oauth_1/client' | ||||
| require 'httpadapter/adapters/net_http' | ||||
| 
 | ||||
| require 'google/api_client' | ||||
| require 'google/api_client/version' | ||||
| require 'google/api_client/parsers/json_parser' | ||||
| 
 | ||||
| describe Google::APIClient, 'configured for the prediction API' do | ||||
|   before do | ||||
|     @client = Google::APIClient.new(:service => 'prediction') | ||||
|   end | ||||
| 
 | ||||
|   it 'should have multiple versions available' do | ||||
|     @client.discovered_services.size.should > 1 | ||||
|   end | ||||
| 
 | ||||
|   it 'should correctly determine the latest version' do | ||||
|     @client.latest_service('prediction').version.should_not == 'v1' | ||||
|   end | ||||
| 
 | ||||
|   it 'should correctly determine the latest version' do | ||||
|     # Sanity check the algorithm | ||||
|     @client.discovered_services.clear | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('magic', 'v1', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('magic', 'v1.1', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('magic', 'v1.10', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('magic', 'v10.1', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('magic', 'v2.1', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('magic', 'v10.0', {}) | ||||
|     @client.latest_service('magic').version.should == 'v10.1' | ||||
|   end | ||||
| 
 | ||||
|   it 'should correctly determine the latest version' do | ||||
|     # Sanity check the algorithm | ||||
|     @client.discovered_services.clear | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('one', 'v3', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('two', 'v1', {}) | ||||
|     @client.discovered_services << | ||||
|       Google::APIClient::Service.new('two', 'v2', {}) | ||||
|     @client.latest_service('two').version.should == 'v2' | ||||
|   end | ||||
| 
 | ||||
|   it 'should return nil for bogus service names' do | ||||
|     # Sanity check the algorithm | ||||
|     @client.latest_service('bogus').should == nil | ||||
|   end | ||||
| end | ||||
|  | @ -15,25 +15,28 @@ | |||
| require 'spec_helper' | ||||
| 
 | ||||
| require 'json' | ||||
| require 'google/api_client/parser/json_parser' | ||||
| require 'google/api_client/parsers/json_parser' | ||||
| 
 | ||||
| describe Google::APIClient::JSONParser, 'generates json from hash' do | ||||
|   before do | ||||
|     @parser = Google::APIClient::JSONParser.new | ||||
|     @parser = Google::APIClient::JSONParser | ||||
|   end | ||||
| 
 | ||||
|   it 'should translate simple hash to JSON string' do | ||||
|     @parser.generate('test' => 23).should == "{\"test\":23}" | ||||
|     @parser.serialize('test' => 23).should == '{"test":23}' | ||||
|   end | ||||
| 
 | ||||
|   it 'should translate simple nested into to nested JSON string' do | ||||
|     @parser.generate({'test' => 23, 'test2' => {'foo' => 'baz', 12 => 3.14 }}).should == | ||||
|         "{\"test2\":{\"12\":3.14,\"foo\":\"baz\"},\"test\":23}" | ||||
|     @parser.serialize({ | ||||
|       'test' => 23, 'test2' => {'foo' => 'baz', 12 => 3.14 } | ||||
|     }).should == | ||||
|       '{"test2":{"12":3.14,"foo":"baz"},"test":23}' | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| describe Google::APIClient::JSONParser, 'parses json string into hash' do | ||||
|   before do | ||||
|     @parser = Google::APIClient::JSONParser.new | ||||
|     @parser = Google::APIClient::JSONParser | ||||
|   end | ||||
| 
 | ||||
|   it 'should parse simple json string into hash' do | ||||
|  | @ -41,8 +44,8 @@ describe Google::APIClient::JSONParser, 'parses json string into hash' do | |||
|   end | ||||
| 
 | ||||
|   it 'should parse nested json object into hash' do | ||||
|     @parser.parse('{"test":23, "test2":{"bar":"baz", "foo":3.14}}').should == | ||||
|         {'test' => 23, 'test2' => {'bar' => 'baz', 'foo' => 3.14}} | ||||
|     @parser.parse('{"test":23, "test2":{"bar":"baz", "foo":3.14}}').should == { | ||||
|       'test' => 23, 'test2' => {'bar' => 'baz', 'foo' => 3.14} | ||||
|     } | ||||
|   end | ||||
| end | ||||
| 
 | ||||
|  | @ -19,7 +19,7 @@ require 'httpadapter/adapters/net_http' | |||
| 
 | ||||
| require 'google/api_client' | ||||
| require 'google/api_client/version' | ||||
| require 'google/api_client/parser/json_parser' | ||||
| require 'google/api_client/parsers/json_parser' | ||||
| 
 | ||||
| describe Google::APIClient, 'with default configuration' do | ||||
|   before do | ||||
|  | @ -31,7 +31,7 @@ describe Google::APIClient, 'with default configuration' do | |||
|   end | ||||
| 
 | ||||
|   it 'should use the default JSON parser' do | ||||
|     @client.parser.should be_instance_of(Google::APIClient::JSONParser) | ||||
|     @client.parser.should be(Google::APIClient::JSONParser) | ||||
|   end | ||||
| 
 | ||||
|   it 'should use the default OAuth1 client configuration' do | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue