Merge branch 'release/1.6.2' into production

This commit is contained in:
Miroslav Bajtoš 2014-12-12 13:56:53 +01:00
commit 453485da08
5 changed files with 38 additions and 25 deletions

View File

@ -1,3 +1,9 @@
2014-12-12, Version 1.6.2
=========================
* Move 200 response to `type` on the operation object. See #75. (Samuel Reed)
2014-12-08, Version 1.6.1 2014-12-08, Version 1.6.1
========================= =========================

View File

@ -125,17 +125,9 @@ var routeHelper = module.exports = {
var responseDoc = modelHelper.LDLPropToSwaggerDataType(returns); var responseDoc = modelHelper.LDLPropToSwaggerDataType(returns);
// Note: Swagger Spec does not provide a way how to specify
// that the responseModel is "array of X". However,
// Swagger UI converts Arrays to the item types anyways,
// therefore it should be ok to do the same here.
var responseModel = responseDoc.type === 'array' ?
responseDoc.items.type : responseDoc.type;
var responseMessages = [{ var responseMessages = [{
code: route.returns && route.returns.length ? 200 : 204, code: route.returns && route.returns.length ? 200 : 204,
message: 'Request was successful', message: 'Request was successful'
responseModel: responseModel
}]; }];
if (route.errors) { if (route.errors) {
@ -145,9 +137,10 @@ var routeHelper = module.exports = {
var apiDoc = { var apiDoc = {
path: routeHelper.convertPathFragments(route.path), path: routeHelper.convertPathFragments(route.path),
// Create the operation doc. // Create the operation doc.
// Note that we are not calling `extendWithType`, as the response type // We are using extendWithType to use `type` for the top-level (200)
// is specified in the first response message. // response type. We use responseModels for error responses.
operations: [{ // see https://github.com/strongloop/loopback-explorer/issues/75
operations: [routeHelper.extendWithType({
method: routeHelper.convertVerb(route.verb), method: routeHelper.convertVerb(route.verb),
// [strml] remove leading model name from op, swagger uses leading // [strml] remove leading model name from op, swagger uses leading
// path as class name so it remains unique between models. // path as class name so it remains unique between models.
@ -158,7 +151,7 @@ var routeHelper = module.exports = {
summary: typeConverter.convertText(route.description), summary: typeConverter.convertText(route.description),
notes: typeConverter.convertText(route.notes), notes: typeConverter.convertText(route.notes),
deprecated: route.deprecated deprecated: route.deprecated
}] }, returns)]
}; };
return apiDoc; return apiDoc;

View File

@ -98,7 +98,11 @@ function Swagger(loopbackApplication, swaggerApp, opts) {
addTypeToModels(type); addTypeToModels(type);
}); });
addTypeToModels(routeDoc.type); if (routeDoc.type === 'array') {
addTypeToModels(routeDoc.items.type);
} else {
addTypeToModels(routeDoc.type);
}
routeDoc.responseMessages.forEach(function(msg) { routeDoc.responseMessages.forEach(function(msg) {
addTypeToModels(msg.responseModel); addTypeToModels(msg.responseModel);

View File

@ -1,6 +1,6 @@
{ {
"name": "loopback-explorer", "name": "loopback-explorer",
"version": "1.6.1", "version": "1.6.2",
"description": "Browse and test your LoopBack app's APIs", "description": "Browse and test your LoopBack app's APIs",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {

View File

@ -13,8 +13,8 @@ describe('route-helper', function() {
{ arg: 'avg', type: 'number' } { arg: 'avg', type: 'number' }
] ]
}); });
expect(doc.operations[0].type).to.equal(undefined); expect(doc.operations[0].type).to.equal('object');
expect(getResponseType(doc.operations[0])).to.equal('object'); expect(getResponseType(doc.operations[0])).to.equal(undefined);
}); });
it('converts path params when they exist in the route name', function() { it('converts path params when they exist in the route name', function() {
@ -61,12 +61,22 @@ describe('route-helper', function() {
] ]
}); });
var opDoc = doc.operations[0]; var opDoc = doc.operations[0];
// Note: swagger-ui treat arrays of X the same way as object X expect(getResponseType(opDoc)).to.equal(undefined);
expect(getResponseType(opDoc)).to.equal('customType');
// NOTE(bajtos) this would be the case if there was a single response type // NOTE(bajtos) this would be the case if there was a single response type
// expect(opDoc.type).to.equal('array'); expect(opDoc.type).to.equal('array');
// expect(opDoc.items).to.eql({type: 'customType'}); expect(opDoc.items).to.eql({type: 'customType'});
});
it('correctly converts return types (format)', function() {
var doc = createAPIDoc({
returns: [
{arg: 'data', type: 'buffer'}
]
});
var opDoc = doc.operations[0];
expect(opDoc.type).to.equal('string');
expect(opDoc.format).to.equal('byte');
}); });
it('includes `notes` metadata', function() { it('includes `notes` metadata', function() {
@ -149,11 +159,11 @@ describe('route-helper', function() {
var doc = createAPIDoc({ var doc = createAPIDoc({
returns: [{ name: 'result', type: 'object', root: true }] returns: [{ name: 'result', type: 'object', root: true }]
}); });
expect(doc.operations[0].type).to.eql('object');
expect(doc.operations[0].responseMessages).to.eql([ expect(doc.operations[0].responseMessages).to.eql([
{ {
code: 200, code: 200,
message: 'Request was successful', message: 'Request was successful'
responseModel: 'object'
} }
]); ]);
}); });
@ -162,11 +172,11 @@ describe('route-helper', function() {
var doc = createAPIDoc({ var doc = createAPIDoc({
returns: [] returns: []
}); });
expect(doc.operations[0].type).to.eql('void');
expect(doc.operations[0].responseMessages).to.eql([ expect(doc.operations[0].responseMessages).to.eql([
{ {
code: 204, code: 204,
message: 'Request was successful', message: 'Request was successful'
responseModel: 'void'
} }
]); ]);
}); });