Skip to content

Commit 564ec42

Browse files
kalinchernevdrGrove
authored andcommitted
Tags property parsing refactoring (#36)
1 parent c809ffc commit 564ec42

File tree

5 files changed

+90
-69
lines changed

5 files changed

+90
-69
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ node_modules
2929
# JSDoc
3030
jsdoc
3131

32-
# Cloud9 editor
32+
# Editors
3333
.c9
34+
.idea

example/routes.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ module.exports.setup = function(app) {
3333

3434
/**
3535
* @swagger
36-
* tag:
36+
* tags:
3737
* name: Users
3838
* description: User management and login
3939
*/
4040

4141
/**
4242
* @swagger
43-
* tag:
43+
* tags:
4444
* - name: Login
4545
* description: Login
4646
* - name: Accounts
@@ -52,7 +52,7 @@ module.exports.setup = function(app) {
5252
* /login:
5353
* post:
5454
* description: Login to the application
55-
* tag: [Users, Login]
55+
* tags: [Users, Login]
5656
* produces:
5757
* - application/json
5858
* parameters:
@@ -78,7 +78,7 @@ module.exports.setup = function(app) {
7878
* /users:
7979
* get:
8080
* description: Returns users
81-
* tag:
81+
* tags:
8282
* - Users
8383
* produces:
8484
* - application/json
@@ -97,7 +97,7 @@ module.exports.setup = function(app) {
9797
* /users:
9898
* post:
9999
* description: Returns users
100-
* tag: [Users]
100+
* tags: [Users]
101101
* produces:
102102
* - application/json
103103
* parameters:

lib/index.js

+47-9
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,42 @@ function objectMerge(obj1, obj2) {
8888
return obj3;
8989
}
9090

91+
/**
92+
* Yields a warning for a given deprecated property.
93+
* @function
94+
* @param {string} propertyName - The property to warn about.
95+
*/
96+
function deprecatedPropertyWarning(propertyName) {
97+
if (propertyName === 'tag') {
98+
console.warn('tag will be deprecated in v2.0.0');
99+
console.warn('Please use tags as it aligns with the swagger v2.0 spec.');
100+
}
101+
}
102+
103+
/**
104+
* Adds the tags property to a swagger object.
105+
* @function
106+
* @param {object} conf - Flexible configuration.
107+
*/
108+
function attachTags(conf) {
109+
var tag = conf.tag;
110+
var swaggerObject = conf.swaggerObject;
111+
var propertyName = conf.propertyName;
112+
113+
// Correct deprecated property.
114+
if (propertyName === 'tag') {
115+
propertyName = 'tags';
116+
}
117+
118+
if (Array.isArray(tag)) {
119+
for (var i = 0; i < tag.length; i = i + 1) {
120+
swaggerObject[propertyName].push(tag[i]);
121+
}
122+
} else {
123+
swaggerObject[propertyName].push(tag);
124+
}
125+
}
126+
91127
/**
92128
* Adds the data in to the swagger object.
93129
* @function
@@ -99,14 +135,15 @@ function addDataToSwaggerObject(swaggerObject, data) {
99135
for (var i = 0; i < data.length; i = i + 1) {
100136
var pathObject = data[i];
101137
var propertyNames = Object.getOwnPropertyNames(pathObject);
138+
// Iterating the properties of the a given pathObject.
102139
for (var j = 0; j < propertyNames.length; j = j + 1) {
103140
var propertyName = propertyNames[j];
104-
var keyName = propertyName + 's';
105141
switch (propertyName) {
106142
case 'securityDefinition':
107143
case 'response':
108144
case 'parameter':
109145
case 'definition': {
146+
var keyName = propertyName + 's';
110147
var definitionNames = Object
111148
.getOwnPropertyNames(pathObject[propertyName]);
112149
for (var k = 0; k < definitionNames.length; k = k + 1) {
@@ -116,17 +153,18 @@ function addDataToSwaggerObject(swaggerObject, data) {
116153
}
117154
break;
118155
}
119-
case 'tag': {
156+
case 'tag':
157+
case 'tags': {
158+
deprecatedPropertyWarning(propertyName);
120159
var tag = pathObject[propertyName];
121-
if (Array.isArray(tag)) {
122-
for (var t = 0; t < tag.length; t = t + 1) {
123-
swaggerObject[keyName].push(tag[t]);
124-
}
125-
} else {
126-
swaggerObject[keyName].push(tag);
127-
}
160+
attachTags({
161+
tag: tag,
162+
swaggerObject: swaggerObject,
163+
propertyName: propertyName,
164+
});
128165
break;
129166
}
167+
// Assumes a path property if nothing else matches.
130168
default: {
131169
swaggerObject.paths[propertyName] = objectMerge(
132170
swaggerObject.paths[propertyName], pathObject[propertyName]

test/swagger-spec.json

+26-35
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,22 @@
2121
"/login": {
2222
"post": {
2323
"description": "Login to the application",
24-
"tag": [
24+
"tags": [
2525
"Users",
2626
"Login"
2727
],
2828
"produces": [
2929
"application/json"
3030
],
31-
"parameters": [
32-
{
33-
"$ref": "#/parameters/username"
34-
},
35-
{
36-
"name": "password",
37-
"description": "User's password.",
38-
"in": "formData",
39-
"required": true,
40-
"type": "string"
41-
}
42-
],
31+
"parameters": [{
32+
"$ref": "#/parameters/username"
33+
}, {
34+
"name": "password",
35+
"description": "User's password.",
36+
"in": "formData",
37+
"required": true,
38+
"type": "string"
39+
}],
4340
"responses": {
4441
"200": {
4542
"description": "login",
@@ -54,7 +51,7 @@
5451
"/users": {
5552
"get": {
5653
"description": "Returns users",
57-
"tag": [
54+
"tags": [
5855
"Users"
5956
],
6057
"produces": [
@@ -68,17 +65,15 @@
6865
},
6966
"post": {
7067
"description": "Returns users",
71-
"tag": [
68+
"tags": [
7269
"Users"
7370
],
7471
"produces": [
7572
"application/json"
7673
],
77-
"parameters": [
78-
{
79-
"$ref": "#/parameters/username"
80-
}
81-
],
74+
"parameters": [{
75+
"$ref": "#/parameters/username"
76+
}],
8277
"responses": {
8378
"200": {
8479
"description": "users"
@@ -124,18 +119,14 @@
124119
}
125120
},
126121
"securityDefinitions": {},
127-
"tags": [
128-
{
129-
"name": "Users",
130-
"description": "User management and login"
131-
},
132-
{
133-
"name": "Login",
134-
"description": "Login"
135-
},
136-
{
137-
"name": "Accounts",
138-
"description": "Accounts"
139-
}
140-
]
141-
}
122+
"tags": [{
123+
"name": "Users",
124+
"description": "User management and login"
125+
}, {
126+
"name": "Login",
127+
"description": "Login"
128+
}, {
129+
"name": "Accounts",
130+
"description": "Accounts"
131+
}]
132+
}

test/test.js

+10-19
Original file line numberDiff line numberDiff line change
@@ -8,62 +8,53 @@ var swaggerSpec = require('./swagger-spec.json');
88

99

1010
// Check against saved swagger spec
11-
function equalsToBeSwaggerSpec(res) {
12-
11+
function swaggerSpecIsCompliant(res) {
1312
// Check if result equals expected spec
1413
if (JSON.stringify(res.body) !== JSON.stringify(swaggerSpec)) {
1514
throw new Error('Returned spec does not equal the expected result');
1615
}
17-
1816
}
1917

20-
21-
describe('example app', function() {
22-
23-
it('homepage', function(done) {
18+
// Testing an example app parsing documentation with swagger-jsdoc.
19+
describe('example app', function () {
20+
it('homepage returns a success code', function (done) {
2421
request(app)
2522
.get('/')
2623
.expect(200)
27-
.end(function(err) {
24+
.end(function (err) {
2825
if (err) {
2926
return done(err);
3027
}
3128
done();
3229
});
3330
});
3431

35-
it('login', function(done) {
32+
it('login authentication returns a success code', function (done) {
3633
request(app)
3734
.post('/login')
3835
.send({
3936
username: 'user@domain.com',
4037
password: 'Password',
4138
})
4239
.expect(200)
43-
.end(function(err) {
40+
.end(function (err) {
4441
if (err) {
4542
return done(err);
4643
}
4744
done();
4845
});
4946
});
5047

51-
});
52-
53-
54-
describe('swagger spec', function() {
55-
56-
it('equals expected result', function(done) {
48+
it('produced swagger spec is as expected', function (done) {
5749
request(app)
5850
.get('/api-docs.json')
5951
.expect(200)
60-
.expect(equalsToBeSwaggerSpec)
61-
.end(function(err) {
52+
.expect(swaggerSpecIsCompliant)
53+
.end(function (err) {
6254
if (err) {
6355
return done(err);
6456
}
6557
done();
6658
});
6759
});
68-
6960
});

0 commit comments

Comments
 (0)