From 2d25008c862b76bbb81a06c20ca3f549b2983c32 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 30 Sep 2016 13:09:02 +0100 Subject: [PATCH] Handle nested documetns --- openapi_codec/__init__.py | 2 +- openapi_codec/encode.py | 19 ++++++++++--------- openapi_codec/utils.py | 13 +++++++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/openapi_codec/__init__.py b/openapi_codec/__init__.py index df39f07..5c363cd 100644 --- a/openapi_codec/__init__.py +++ b/openapi_codec/__init__.py @@ -8,7 +8,7 @@ from openapi_codec.decode import _parse_document -__version__ = '1.1.1' +__version__ = '1.1.2' class OpenAPICodec(BaseCodec): diff --git a/openapi_codec/encode.py b/openapi_codec/encode.py index 2f53af6..beddaa3 100644 --- a/openapi_codec/encode.py +++ b/openapi_codec/encode.py @@ -1,6 +1,5 @@ -import coreapi from coreapi.compat import urlparse -from openapi_codec.utils import get_method, get_encoding, get_location +from openapi_codec.utils import get_method, get_encoding, get_location, get_links_from_document def generate_swagger_object(document): @@ -35,16 +34,18 @@ def _add_tag_prefix(item): def _get_links(document): """ - Return a list of (operation_id, [tags], link) + Return a list of (operation_id, link, [tags]) """ # Extract all the links from the first or second level of the document. links = [] - for key, link in document.links.items(): - links.append((key, link, [])) - for key0, obj in document.data.items(): - if isinstance(obj, coreapi.Object): - for key1, link in obj.links.items(): - links.append((key1, link, [key0])) + for keys, link in get_links_from_document(document): + if len(keys) > 1: + operation_id = '_'.join(keys[1:]) + tags = [keys[0]] + else: + operation_id = keys[0] + tags = [] + links.append((operation_id, link, tags)) # Determine if the operation ids each have unique names or not. operation_ids = [item[0] for item in links] diff --git a/openapi_codec/utils.py b/openapi_codec/utils.py index a3aa71c..b7c324e 100644 --- a/openapi_codec/utils.py +++ b/openapi_codec/utils.py @@ -1,3 +1,16 @@ +def get_links_from_document(node, keys=()): + links = [] + for key, link in getattr(node, 'links', {}).items(): + # Get all the resources at this level + index = keys + (key,) + links.append((index, link)) + for key, child in getattr(node, 'data', {}).items(): + # Descend into any nested structures. + index = keys + (key,) + links.extend(get_links_from_document(child, index)) + return links + + def get_method(link): method = link.action.lower() if not method: