Ruby: support binary (byte array) for body parameter and response

This commit is contained in:
xhh 2016-01-21 18:01:03 +08:00
parent 5d156916d7
commit aad0547b40
9 changed files with 167 additions and 48 deletions

View File

@ -86,6 +86,7 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig {
typeMapping.put("map", "Hash");
typeMapping.put("object", "Object");
typeMapping.put("file", "File");
typeMapping.put("binary", "Byte Array");
// remove modelPackage and apiPackage added by default
Iterator<CliOption> itr = cliOptions.iterator();

View File

@ -70,9 +70,10 @@ module {{moduleName}}
# http body (model)
{{^bodyParam}}post_body = nil
{{/bodyParam}}{{#bodyParam}}post_body = @api_client.object_to_http_body({{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}})
{{/bodyParam}}
{{/bodyParam}}{{#bodyParam}}{{#isBinary}}post_body = {{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}}
post_body = post_body.pack('C*') if post_body
{{/isBinary}}{{^isBinary}}post_body = @api_client.object_to_http_body({{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}})
{{/isBinary}}{{/bodyParam}}
auth_names = [{{#authMethods}}'{{name}}'{{#hasMore}}, {{/hasMore}}{{/authMethods}}]
data, status_code, headers = @api_client.call_api(:{{httpMethod}}, path,
:header_params => header_params,
@ -90,7 +91,3 @@ module {{moduleName}}
end
{{/operations}}
end

View File

@ -106,6 +106,9 @@ module {{moduleName}}
body = response.body
return nil if body.nil? || body.empty?
# handle binary response (byte array)
return body.bytes if return_type == 'Byte Array'
# handle file downloading - save response body into a tmp file and return the File instance
return download_file(response) if return_type == 'File'

View File

@ -51,7 +51,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:PUT, path,
:header_params => header_params,
@ -108,7 +107,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -166,7 +164,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -225,7 +222,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -286,7 +282,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['api_key']
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -353,7 +348,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -416,7 +410,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:DELETE, path,
:header_params => header_params,
@ -482,7 +475,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -495,9 +487,122 @@ module Petstore
end
return data, status_code, headers
end
# Fake endpoint to test byte array return by &#39;Find pet by ID&#39;
# Returns a pet when ID &lt; 10. ID &gt; 10 or nonintegers will simulate API error conditions
# @param pet_id ID of pet that needs to be fetched
# @param [Hash] opts the optional parameters
# @return [Byte Array]
def get_pet_by_id_with_byte_array(pet_id, opts = {})
data, status_code, headers = get_pet_by_id_with_byte_array_with_http_info(pet_id, opts)
return data
end
# Fake endpoint to test byte array return by &#39;Find pet by ID&#39;
# Returns a pet when ID &lt; 10. ID &gt; 10 or nonintegers will simulate API error conditions
# @param pet_id ID of pet that needs to be fetched
# @param [Hash] opts the optional parameters
# @return [Array<(Byte Array, Fixnum, Hash)>] Byte Array data, response status code and response headers
def get_pet_by_id_with_byte_array_with_http_info(pet_id, opts = {})
if @api_client.config.debugging
@api_client.config.logger.debug "Calling API: PetApi#get_pet_by_id_with_byte_array ..."
end
# verify the required parameter 'pet_id' is set
fail "Missing the required parameter 'pet_id' when calling get_pet_by_id_with_byte_array" if pet_id.nil?
# resource path
path = "/pet/{petId}?testing_byte_array=true".sub('{format}','json').sub('{' + 'petId' + '}', pet_id.to_s)
# query parameters
query_params = {}
# header parameters
header_params = {}
# HTTP header 'Accept' (if needed)
_header_accept = ['application/json', 'application/xml']
_header_accept_result = @api_client.select_header_accept(_header_accept) and header_params['Accept'] = _header_accept_result
# HTTP header 'Content-Type'
_header_content_type = []
header_params['Content-Type'] = @api_client.select_header_content_type(_header_content_type)
# form parameters
form_params = {}
# http body (model)
post_body = nil
auth_names = ['api_key']
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
:query_params => query_params,
:form_params => form_params,
:body => post_body,
:auth_names => auth_names,
:return_type => 'Byte Array')
if @api_client.config.debugging
@api_client.config.logger.debug "API called: PetApi#get_pet_by_id_with_byte_array\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
end
return data, status_code, headers
end
# Fake endpoint to test byte array in body parameter for adding a new pet to the store
#
# @param [Hash] opts the optional parameters
# @option opts [Byte Array] :body Pet object in the form of byte array
# @return [nil]
def add_pet_using_byte_array(opts = {})
add_pet_using_byte_array_with_http_info(opts)
return nil
end
# Fake endpoint to test byte array in body parameter for adding a new pet to the store
#
# @param [Hash] opts the optional parameters
# @option opts [Byte Array] :body Pet object in the form of byte array
# @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers
def add_pet_using_byte_array_with_http_info(opts = {})
if @api_client.config.debugging
@api_client.config.logger.debug "Calling API: PetApi#add_pet_using_byte_array ..."
end
# resource path
path = "/pet?testing_byte_array=true".sub('{format}','json')
# query parameters
query_params = {}
# header parameters
header_params = {}
# HTTP header 'Accept' (if needed)
_header_accept = ['application/json', 'application/xml']
_header_accept_result = @api_client.select_header_accept(_header_accept) and header_params['Accept'] = _header_accept_result
# HTTP header 'Content-Type'
_header_content_type = ['application/json', 'application/xml']
header_params['Content-Type'] = @api_client.select_header_content_type(_header_content_type)
# form parameters
form_params = {}
# http body (model)
post_body = opts[:'body']
post_body = post_body.pack('C*') if post_body
auth_names = ['petstore_auth']
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
:query_params => query_params,
:form_params => form_params,
:body => post_body,
:auth_names => auth_names)
if @api_client.config.debugging
@api_client.config.logger.debug "API called: PetApi#add_pet_using_byte_array\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
end
return data, status_code, headers
end
end
end

View File

@ -49,7 +49,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = ['api_key']
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -107,7 +106,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = []
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -168,7 +166,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = []
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -229,7 +226,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = []
data, status_code, headers = @api_client.call_api(:DELETE, path,
:header_params => header_params,
@ -244,7 +240,3 @@ module Petstore
end
end
end

View File

@ -51,7 +51,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = []
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -108,7 +107,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = []
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -165,7 +163,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = []
data, status_code, headers = @api_client.call_api(:POST, path,
:header_params => header_params,
@ -226,7 +223,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = []
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -282,7 +278,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = []
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -342,7 +337,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = []
data, status_code, headers = @api_client.call_api(:GET, path,
:header_params => header_params,
@ -405,7 +399,6 @@ module Petstore
# http body (model)
post_body = @api_client.object_to_http_body(opts[:'body'])
auth_names = []
data, status_code, headers = @api_client.call_api(:PUT, path,
:header_params => header_params,
@ -465,7 +458,6 @@ module Petstore
# http body (model)
post_body = nil
auth_names = []
data, status_code, headers = @api_client.call_api(:DELETE, path,
:header_params => header_params,
@ -480,7 +472,3 @@ module Petstore
end
end
end

View File

@ -106,6 +106,9 @@ module Petstore
body = response.body
return nil if body.nil? || body.empty?
# handle binary response (byte array)
return body.bytes if return_type == 'Byte Array'
# handle file downloading - save response body into a tmp file and return the File instance
return download_file(response) if return_type == 'File'

View File

@ -1,6 +1,16 @@
require 'spec_helper'
require 'json'
def serialize_json(o)
API_CLIENT.object_to_http_body(o)
end
def deserialize_json(s, type)
headers = {'Content-Type' => 'application/json'}
response = double('response', headers: headers, body: s)
API_CLIENT.deserialize(response, type)
end
describe "Pet" do
before do
@pet_api = Petstore::PetApi.new(API_CLIENT)
@ -84,6 +94,25 @@ describe "Pet" do
end
end
it "should create and get pet with byte array" do
pet = @pet_api.get_pet_by_id(@pet_id)
pet.id = @pet_id + 1
bytes = serialize_json(pet).bytes
@pet_api.add_pet_using_byte_array(body: bytes)
fetchedBytes = @pet_api.get_pet_by_id_with_byte_array(pet.id)
fetchedBytes.should be_a(Array)
fetchedBytes[0].should be_a(Fixnum)
fetched = deserialize_json(fetchedBytes.pack('C*'), 'Pet')
fetched.should be_a(Petstore::Pet)
fetched.id.should == pet.id
fetched.category.should be_a(Petstore::Category)
fetched.category.name.should == pet.category.name
@pet_api.delete_pet(pet.id)
end
it "should update a pet" do
pet = @pet_api.get_pet_by_id(@pet_id)
pet.id.should == @pet_id
@ -122,16 +151,18 @@ describe "Pet" do
end
it "should create a pet" do
pet = Petstore::Pet.new('id' => 10003, 'name' => "RUBY UNIT TESTING")
id = @pet_id + 1
pet = Petstore::Pet.new('id' => id, 'name' => "RUBY UNIT TESTING")
result = @pet_api.add_pet(:body => pet)
# nothing is returned
result.should be_nil
pet = @pet_api.get_pet_by_id(10003)
pet.id.should == 10003
pet = @pet_api.get_pet_by_id(id)
pet.id.should == id
pet.name.should == "RUBY UNIT TESTING"
@pet_api.delete_pet(10003)
@pet_api.delete_pet(id)
end
it "should upload a file to a pet" do

View File

@ -3,16 +3,15 @@ require 'spec_helper'
describe "Store" do
before do
@api = Petstore::StoreApi.new(API_CLIENT)
@order_id = prepare_store(@api)
end
after do
@api.delete_order(@order_id)
end
it "should fetch an order" do
@order_id = prepare_store(@api)
item = @api.get_order_by_id(@order_id)
item.id.should == @order_id
@api.delete_order(@order_id)
end
it "should featch the inventory" do