diff --git a/lib/google/api_client.rb b/lib/google/api_client.rb
index ce0a97a10..1f51324bf 100644
--- a/lib/google/api_client.rb
+++ b/lib/google/api_client.rb
@@ -265,13 +265,13 @@ module Google
api_method = self.discovered_method(
api_method.to_s, options[:service_version]
)
- elsif !api_method.kind_of?(::Google::APIClient::Service)
+ elsif !api_method.kind_of?(::Google::APIClient::Method)
raise TypeError,
- "Expected String, Symbol, or Google::APIClient::Service, " +
+ "Expected String, Symbol, or Google::APIClient::Method, " +
"got #{api_method.class}."
end
unless api_method
- raise ArgumentError, "API method does not exist."
+ raise ArgumentError, "API method could not be found."
end
request = api_method.generate_request(parameters, body, headers)
if options[:signed]
diff --git a/lib/google/api_client/discovery.rb b/lib/google/api_client/discovery.rb
index 261a20caa..8976d2f9a 100644
--- a/lib/google/api_client/discovery.rb
+++ b/lib/google/api_client/discovery.rb
@@ -377,16 +377,74 @@ module Google
#
# @param [Hash, Array] parameters
# The parameters to send.
- # @param [String] body The body for the HTTP request.
+ # @param [String, StringIO] body The body for the HTTP request.
# @param [Hash, Array] headers The HTTP headers for the request.
#
# @return [Array] The generated HTTP request.
def generate_request(parameters={}, body='', headers=[])
+ if body.respond_to?(:string)
+ body = body.string
+ elsif body.respond_to?(:to_str)
+ body = body.to_str
+ else
+ raise TypeError, "Expected String or StringIO, got #{body.class}."
+ end
+ if !headers.kind_of?(Array) && !headers.kind_of?(Hash)
+ raise TypeError, "Expected Hash or Array, got #{headers.class}."
+ end
method = self.description['httpMethod'] || 'GET'
uri = self.generate_uri(parameters)
+ headers = headers.to_a if headers.kind_of?(Hash)
return [method, uri.to_str, headers, [body]]
end
+ ##
+ # Returns a Hash
of the parameter descriptions for
+ # this method.
+ #
+ # @return [Hash] The parameter descriptions.
+ def parameter_descriptions
+ @parameter_descriptions ||= Hash[self.description['parameters'] || {}]
+ end
+
+ ##
+ # Returns an Array
of the parameters for this method.
+ #
+ # @return [Array] The parameters.
+ def parameters
+ @parameters ||= Hash[self.description['parameters'] || {}].keys
+ end
+
+ ##
+ # Returns an Array
of the required parameters for this
+ # method.
+ #
+ # @return [Array] The required parameters.
+ #
+ # @example
+ # # A list of all required parameters.
+ # method.required_parameters
+ def required_parameters
+ @required_parameters ||= Hash[self.parameter_descriptions.select do |k, v|
+ v['required']
+ end].keys
+ end
+
+ ##
+ # Returns an Array
of the optional parameters for this
+ # method.
+ #
+ # @return [Array] The optional parameters.
+ #
+ # @example
+ # # A list of all optional parameters.
+ # method.optional_parameters
+ def optional_parameters
+ @optional_parameters ||= Hash[self.parameter_descriptions.reject do |k, v|
+ v['required']
+ end].keys
+ end
+
##
# Verifies that the parameters are valid for this method. Raises an
# exception if validation fails.
@@ -397,8 +455,7 @@ module Google
# @return [NilClass] nil
if validation passes.
def validate_parameters(parameters={})
parameters = self.normalize_parameters(parameters)
- parameter_description = self.description['parameters'] || {}
- required_variables = Hash[parameter_description.select do |k, v|
+ required_variables = Hash[self.parameter_descriptions.select do |k, v|
v['required']
end].keys
missing_variables = required_variables - parameters.keys
@@ -407,8 +464,8 @@ module Google
"Missing required parameters: #{missing_variables.join(', ')}."
end
parameters.each do |k, v|
- if parameter_description[k]
- pattern = parameter_description[k]['pattern']
+ if self.parameter_descriptions[k]
+ pattern = self.parameter_descriptions[k]['pattern']
if pattern
regexp = Regexp.new("^#{pattern}$")
if v !~ regexp
diff --git a/spec/google/api_client/discovery_spec.rb b/spec/google/api_client/discovery_spec.rb
index f12fa12e3..2b6f77ad3 100644
--- a/spec/google/api_client/discovery_spec.rb
+++ b/spec/google/api_client/discovery_spec.rb
@@ -160,7 +160,7 @@ describe Google::APIClient, 'configured for the prediction API' do
@client.latest_service('bogus').should == nil
end
- it 'should generate requests against the correct URIs' do
+ it 'should generate valid requests' do
request = @client.generate_request(
'prediction.training.insert',
{'query' => '12345'},
@@ -169,13 +169,30 @@ describe Google::APIClient, 'configured for the prediction API' do
{:signed => false}
)
method, uri, headers, body = request
+ method.should == 'POST'
+ uri.should ==
+ 'https://www.googleapis.com/prediction/v1/training?query=12345'
+ Hash[headers].should == {}
+ body.should respond_to(:each)
+ end
+
+ it 'should generate requests against the correct URIs' do
+ request = @client.generate_request(
+ :'prediction.training.insert',
+ {'query' => '12345'},
+ '',
+ [],
+ {:signed => false}
+ )
+ method, uri, headers, body = request
uri.should ==
'https://www.googleapis.com/prediction/v1/training?query=12345'
end
it 'should generate requests against the correct URIs' do
+ prediction = @client.discovered_service('prediction', 'v1')
request = @client.generate_request(
- :'prediction.training.insert',
+ prediction.training.insert,
{'query' => '12345'},
'',
[],
@@ -221,6 +238,12 @@ describe Google::APIClient, 'configured for the prediction API' do
@client.generate_request(42)
end).should raise_error(TypeError)
end
+
+ it 'should raise an error for bogus methods' do
+ (lambda do
+ @client.generate_request(@client.discovered_service('prediction'))
+ end).should raise_error(TypeError)
+ end
end
describe Google::APIClient, 'configured for the buzz API' do