Skip to content

Commit 0913d7e

Browse files
committed
hide ns with all hidden resources from swagger docs
1 parent 41382d9 commit 0913d7e

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Current
88

99
- Fix `@api.expect(..., validate=False)` decorators for an :class:`Api` where `validate=True` is set on the constructor
1010
- Ensure `basePath` is always a path
11+
- Hide Namespaces with all hidden Resources from Swagger documentation
1112

1213
0.12.1 (2018-09-28)
1314
-------------------

flask_restplus/swagger.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,14 @@ def parse_docstring(obj):
132132
return parsed
133133

134134

135+
def is_hidden(resource):
136+
'''
137+
Determine whether a Resource has been hidden from Swagger documentation
138+
i.e. by using Api.doc(False) decorator
139+
'''
140+
return hasattr(resource, "__apidoc__") and resource.__apidoc__ is False
141+
142+
135143
class Swagger(object):
136144
'''
137145
A Swagger documentation wrapper for an API instance.
@@ -224,8 +232,13 @@ def extract_tags(self, api):
224232
tags.append(tag)
225233
by_name[tag['name']] = tag
226234
for ns in api.namespaces:
235+
# hide namespaces without any Resources
227236
if not ns.resources:
228237
continue
238+
# hide namespaces with all Resources hidden from Swagger documentation
239+
resources = (resource for resource, urls, kwargs in ns.resources)
240+
if all(is_hidden(r) for r in resources):
241+
continue
229242
if ns.name not in by_name:
230243
tags.append({
231244
'name': ns.name,

tests/test_swagger.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,30 @@ def get(self):
297297
data = client.get_specs('')
298298
assert data['tags'] == [{'name': 'ns'}]
299299

300+
def test_specs_endpoint_namespace_all_resources_hidden(self, app, client):
301+
api = restplus.Api(app)
302+
ns = api.namespace('ns')
303+
304+
@ns.route('/test', endpoint='test', doc=False)
305+
class TestResource(restplus.Resource):
306+
def get(self):
307+
return {}
308+
309+
@ns.route('/test2', endpoint='test2')
310+
@ns.hide
311+
class TestResource2(restplus.Resource):
312+
def get(self):
313+
return {}
314+
315+
@ns.route('/test3', endpoint='test3')
316+
@ns.doc(False)
317+
class TestResource3(restplus.Resource):
318+
def get(self):
319+
return {}
320+
321+
data = client.get_specs('')
322+
assert data['tags'] == []
323+
300324
def test_specs_authorizations(self, app, client):
301325
authorizations = {
302326
'apikey': {

0 commit comments

Comments
 (0)