Skip to content

Commit 9232e1a

Browse files
tnt-devSteadBytes
authored andcommitted
Support envelope parameter in Swagger documentation (#673)
fix #390
1 parent d4ace9c commit 9232e1a

File tree

4 files changed

+40
-4
lines changed

4 files changed

+40
-4
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Current
99
- Ensure that exceptions raised in error handler, including programming errors, are logged (:issue:`705`, :pr:`706`)
1010
- Import the ABCs from 'collections.abc' instead of 'collections' by default as it is deprecated since Python3.7, and in 3.8 it will stop working. Python2.7 is still supported though.
1111
- Fix illegal characters in JSON references to model names (:issue:`651`)
12+
- Support ``envelope`` parameter in Swagger documentation (:pr:`390`)
1213

1314
0.13.0 (2019-08-12)
1415
-------------------
@@ -21,7 +22,6 @@ Current
2122
- Per route Swagger documentation for multiple routes on a ``Resource``
2223
- Fix Swagger `duplicate mapping key` problem from conflicts between response codes given as string or integer (:issue`661`)
2324

24-
2525
0.12.1 (2018-09-28)
2626
-------------------
2727

flask_restplus/namespace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ def marshal_with(self, fields, as_list=False, code=HTTPStatus.OK, description=No
240240
def wrapper(func):
241241
doc = {
242242
'responses': {
243-
str(code): (description, [fields]) if as_list else (description, fields)
243+
str(code): (description, [fields], kwargs) if as_list else (description, fields, kwargs)
244244
},
245245
'__mask__': kwargs.get('mask', True), # Mask values can't be determined outside app context
246246
}

flask_restplus/swagger.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ def register_errors(self):
372372
apidoc = getattr(handler, '__apidoc__', {})
373373
self.process_headers(response, apidoc)
374374
if 'responses' in apidoc:
375-
_, model = list(apidoc['responses'].values())[0]
375+
_, model, _ = list(apidoc['responses'].values())[0]
376376
response['schema'] = self.serialize_schema(model)
377377
responses[exception.__name__] = not_none(response)
378378
return responses
@@ -507,7 +507,11 @@ def responses_for(self, doc, method):
507507
else:
508508
responses[code] = {'description': description}
509509
if model:
510-
responses[code]['schema'] = self.serialize_schema(model)
510+
schema = self.serialize_schema(model)
511+
envelope = kwargs.get('envelope')
512+
if envelope:
513+
schema = {'properties': {envelope: schema}}
514+
responses[code]['schema'] = schema
511515
self.process_headers(responses[code], doc, method, kwargs.get('headers'))
512516
if 'model' in d:
513517
code = str(d.get('default_code', HTTPStatus.OK))

tests/test_swagger.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,38 @@ def get(self):
17521752
}
17531753
}
17541754

1755+
def test_marhsal_decorator_with_envelope(self, api, client):
1756+
person = api.model('Person', {
1757+
'name': restplus.fields.String,
1758+
'age': restplus.fields.Integer,
1759+
'birthdate': restplus.fields.DateTime,
1760+
})
1761+
1762+
@api.route('/model-as-dict/')
1763+
class ModelAsDict(restplus.Resource):
1764+
@api.marshal_with(person, envelope='person')
1765+
def get(self):
1766+
return {}
1767+
1768+
data = client.get_specs()
1769+
1770+
assert 'definitions' in data
1771+
assert 'Person' in data['definitions']
1772+
1773+
responses = data['paths']['/model-as-dict/']['get']['responses']
1774+
assert responses == {
1775+
'200': {
1776+
'description': 'Success',
1777+
'schema': {
1778+
'properties': {
1779+
'person': {
1780+
'$ref': '#/definitions/Person'
1781+
}
1782+
}
1783+
}
1784+
}
1785+
}
1786+
17551787
def test_model_as_flat_dict_with_marchal_decorator_list(self, api, client):
17561788
fields = api.model('Person', {
17571789
'name': restplus.fields.String,

0 commit comments

Comments
 (0)