From eacd1d7f6f4fead76e49c3b973b1a7fb118fcb8c Mon Sep 17 00:00:00 2001 From: Alejo Arias Date: Sat, 2 Apr 2016 16:28:22 +0200 Subject: [PATCH 1/2] Add support for specific docs for each method of an endpoint --- flask_swagger.py | 55 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/flask_swagger.py b/flask_swagger.py index d41ae7d..51926e3 100644 --- a/flask_swagger.py +++ b/flask_swagger.py @@ -17,21 +17,53 @@ def _sanitize(comment): return comment.replace('\n', '
') if comment else comment -def _parse_docstring(obj, process_doc): +def _get_swag(doc, process_doc): first_line, other_lines, swag = None, None, None - full_doc = inspect.getdoc(obj) - if full_doc: - line_feed = full_doc.find('\n') + if doc: + line_feed = doc.find('\n') if line_feed != -1: - first_line = process_doc(full_doc[:line_feed]) - yaml_sep = full_doc[line_feed+1:].find('---') + first_line = process_doc(doc[:line_feed]) + yaml_sep = doc[line_feed+1:].find('---') if yaml_sep != -1: - other_lines = process_doc(full_doc[line_feed+1:line_feed+yaml_sep]) - swag = yaml.load(full_doc[line_feed+yaml_sep:]) + other_lines = process_doc(doc[line_feed+1:line_feed+yaml_sep]) + swag = yaml.load(doc[line_feed+yaml_sep:]) else: - other_lines = process_doc(full_doc[line_feed+1:]) + other_lines = process_doc(doc[line_feed+1:]) + else: + first_line = doc + return first_line, other_lines, swag + + +def _parse_docstring(obj, process_doc, current_verb, verbs): + first_line, other_lines, swag = None, None, None + full_doc = inspect.getdoc(obj) + if full_doc: + # check if verbs are defined in doc + indexes = [] + current_verb_index = None + for v in verbs: + index = full_doc.find(v+':') + if index != -1: + indexes.append(index) + if v == current_verb: + current_verb_index = index + indexes.sort() + if indexes: + if current_verb_index is not None: + start = indexes[indexes.index(current_verb_index)] + end = indexes[start+1] if start < len(indexes)+1 else None + # skip the verb line + start += full_doc[start:end].find('\n')+1 + temp_doc = full_doc[start:end] + # remove indentation + first_line = temp_doc.split('\n')[0] + indentation = len(first_line) - len(first_line.lstrip()) + doc = "" + for line in temp_doc.split('\n'): + doc += line[indentation:]+'\n' + first_line, other_lines, swag = _get_swag(doc, process_doc) else: - first_line = full_doc + first_line, other_lines, swag = _get_swag(full_doc, process_doc) return first_line, other_lines, swag @@ -140,8 +172,9 @@ def spec(): else: methods[verb.lower()] = endpoint operations = dict() + verbs = [k for k in methods.keys()] for verb, method in methods.items(): - summary, description, swag = _parse_docstring(method, process_doc) + summary, description, swag = _parse_docstring(method, process_doc, verb, verbs) if swag is not None: # we only add endpoints with swagger data in the docstrings defs = swag.get('definitions', []) defs = _extract_definitions(defs) From fa2a76ac7d984d9638e0bcfaca3d820695232167 Mon Sep 17 00:00:00 2001 From: Alejo Arias Date: Tue, 5 Apr 2016 12:28:05 +0200 Subject: [PATCH 2/2] fixed bug where an endpoint documented with its verbs would fail when only one verb is present --- flask_swagger.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/flask_swagger.py b/flask_swagger.py index 51926e3..5675947 100644 --- a/flask_swagger.py +++ b/flask_swagger.py @@ -50,11 +50,12 @@ def _parse_docstring(obj, process_doc, current_verb, verbs): indexes.sort() if indexes: if current_verb_index is not None: - start = indexes[indexes.index(current_verb_index)] - end = indexes[start+1] if start < len(indexes)+1 else None + start_index = indexes.index(current_verb_index) + end_index = start_index+1 if start_index+1 < len(indexes) else None + current_verb_stop = indexes[end_index] if end_index else None # skip the verb line - start += full_doc[start:end].find('\n')+1 - temp_doc = full_doc[start:end] + current_verb_index += full_doc[current_verb_index:current_verb_stop].find('\n')+1 + temp_doc = full_doc[current_verb_index:current_verb_stop] # remove indentation first_line = temp_doc.split('\n')[0] indentation = len(first_line) - len(first_line.lstrip())