OpenAPI spec parsing: add custom templates w/ warning

This commit is contained in:
mDuo13
2019-10-01 17:01:08 -07:00
parent f4d7460a26
commit c2d8cd7f5a
7 changed files with 276 additions and 23 deletions

View File

@@ -0,0 +1,64 @@
# {{title}}
{{description}}
**Warning:** {{spec.info.title}} is early alpha software. API methods and data formats are likely to change frequently in ways that break backwards compatibility.
{% if type is defined %}- **Type:** {{type|title}}
{% elif oneOf is defined %}- **Possible Types:**
{% for option in oneOf -%}
{% if option.enum is defined %}
- One of the following {% if option.type is defined %}{{option.type|title}}s{% else %}values{% endif %}:
{% for suboption in option.enum %}
- `{{suboption}}`
{% endfor -%}
{% else %}
- {{option.type|title}}
{% endif -%}
{% endfor -%}
{% elif anyOf is defined %}- **Possible Types:**
{% for option in anyOf -%}
{% if option.enum is defined %}
- Any of the following {% if option.type is defined %}{{option.type|title}}s{% else %}values{% endif %}:
{% for suboption in option.enum %}
- `{{suboption}}`
{% endfor -%}
{% else %}
- {{option.type|title}}
{% endif -%}
{% endfor -%}
{% elif allOf is defined %}- **Possible Types:**
{% for option in allOf -%}
{% if option.enum is defined %}
- Must qualify as all of the following {% if option.type is defined %}{{option.type|title}}s{% else %}values{% endif %}:
{% for suboption in option.enum %}
- `{{suboption}}`
{% endfor -%}
{% else %}
- {{option.type|title}}
{% endif -%}
{% endfor -%}
{% endif -%}
{% if enum is defined %}- **Possible Values:**
{% for option in enum %}
- `{{option}}`
{% endfor %}{% endif %}
{% if pattern is defined %}- **Pattern:** `{{pattern}}`
{% endif -%}
{% if example is defined %}- **Example:** `{{example}}`
{% endif -%}
{% if properties is defined %}
This type can contain the following fields:
| Field | Type | Required? | Description |
|-------|------|-----------|-------------|
{%- for name,field in properties.items() %}
| `{{name}}` | {{field.type|title}}{% if "items" in field.keys() and "title" in field["items"].keys() %} of [{{field["items"].title}}]({{type_link(field["items"].title)}}){% endif %} {% if field["title"] is defined %}([{{field.title}}]({{type_link(field.title)}})){% endif %} | {{"Required" if name in required else "Optional"}} | {{field.description}} |
{%- endfor %}
{% if additionalProperties is defined and additionalProperties == True %}This type MUST NOT contain any additional fields.{% endif %}
{% elif type == "array" and items is defined %}
Each member of the array is a ***TODO*** {{items}}
{% endif %}

View File

@@ -0,0 +1,11 @@
# {{api_title}} Data Types
**Warning:** {{spec.info.title}} is early alpha software. API methods and data formats are likely to change frequently in ways that break backwards compatibility.
The following data types are defined for this API:
| Name | Type | Description |
|------|------|-------------|
{%- for key,schema in schemas %}
| `{{schema.title}}` | {{schema.type|title}}{% if "items" in schema.keys() and "title" in schema["items"].keys() %} of [{{schema["items"].title}}]({{type_link(schema["items"].title)}}){% endif %} {% if schema["title"] is defined %}([{{schema.title}}]({{type_link(schema.title)}})){% endif %} | {% if schema.description is defined %}{{schema.description}}{% endif %} |
{%- endfor %}

View File

@@ -0,0 +1,107 @@
# {{summary}}
{{description}}
**Warning:** {{spec.info.title}} is early alpha software. API methods and data formats are likely to change frequently in ways that break backwards compatibility.
## Request Format
```
{{method|upper}} {{path}}
{%- if method in ["post","put","delete"] and requestBody is defined %}
{{ x_example_request_body }}
{% endif %}
```
{% if path_params|length %}
This API method uses the following path parameters:
| Field | Value | Required? | Description |
|---|---|---|---|
{%- for param in path_params %}
| `{{param.name}}` | {% if param.schema is defined %}{% if param.schema.oneOf is defined %}(Varies){% else %}{{param.schema.type|title}}{% endif %} {% if param.schema["title"] is defined %}([{{param.schema.title}}]({{type_link(param.schema.title)}})){% endif %}{% else %}(Unspecified){% endif %} | {{"Required" if param.required else "Optional"}} | {{param.description}} |
{%- endfor %}
{% endif %}
{% if query_params|length %}
This API method uses the following query parameters:
| Field | Value | Required? | Description |
|---|---|---|---|
{%- for param in query_params %}
| `{{param.name}}` | {% if param.schema is defined %}{% if param.schema.oneOf is defined %}(Varies){% else %}{{param.schema.type|title}}{% if "items" in param.schema.keys() and "title" in param.schema["items"].keys() %} of [{{param.schema["items"].title}}]({{type_link(param.schema["items"].title)}}){% endif %}{% endif %} {% if param.schema["title"] is defined %}([{{param.schema.title}}]({{type_link(param.schema.title)}})){% endif %}{% else %}(Unspecified){% endif %} | {{"Required" if param.required else "Optional"}} | {{param.description}} |
{%- endfor %}
{% endif %}
{% if requestBody is defined %}
{{requestBody.description}}
{% if requestBody.content is defined %}
{% for mediatype,thisbody in requestBody.content.items() %}
{% if thisbody.schema is defined %}
**Media type:** {{mediatype|replace("*","\*")}}
{% if thisbody.schema.title is defined %}
Formatted as a [{{thisbody.schema.title}}]({{type_link(thisbody.schema.title)}})
{% endif %}
{% if thisbody.schema.properties is defined %}
The request uses the following fields:
| Field | Type | Required? | Description |
|-------|------|-----------|-------------|
{%- for name,field in thisbody.schema.properties.items() %}
| `{{name}}` | {{field.type|title}}{% if "items" in field.keys() and "title" in field["items"].keys() %} of [{{field["items"].title}}]({{type_link(field["items"].title)}}){% endif %} {% if field["title"] is defined %}([{{field.title}}]({{type_link(field.title)}})){% endif %} | {{"Required" if name in required else "May be omitted"}} | {% if field.description is defined %}{{field.description}}{% endif %} |
{%- endfor %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
## Response Formats
{% for response_code, response in responses.items() %}
### {{response_code}} {{HTTP_STATUS_CODES[response_code]}}
{{ response.description}}
{% if response.content is defined %}
{% for mediatype,thisbody in response.content.items() %}
{% if thisbody.schema is defined %}
**Media type:** {{mediatype|replace("*","\*")}}
{% if thisbody.schema.title is defined %}
Formatted as a [{{thisbody.schema.title}}]({{type_link(thisbody.schema.title)}})
{% endif %}
{% if thisbody.schema.properties is defined %}
The response uses the following fields:
| Field | Type | Required? | Description |
|-------|------|-----------|-------------|
{%- for name,field in thisbody.schema.properties.items() %}
| `{{name}}` | {{field.type|title}}{% if "items" in field.keys() and "title" in field["items"].keys() %} of [{{field["items"].title}}]({{type_link(field["items"].title)}}){% endif %} {% if field["title"] is defined %}([{{field.title}}]({{type_link(field.title)}})){% endif %} | {{"Required" if name in required else "May be omitted"}} | {% if field.description is defined %}{{field.description}}{% endif %} |
{%- endfor %}
{% endif %}{# TODO: handle allOf, etc. #}
{% if thisbody.examples is defined and thisbody.examples|length > 0 %}
#### Example Response(s)
{% for body_name,body_sample in thisbody.examples %}
_{{body_name}}_
```
{{body_sample|pprint}}
```
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}

View File

@@ -0,0 +1,17 @@
# {{info.title}} {{info.version}} {{tag.name|title}} Methods
{{tag.description}}
**Warning:** {{info.title}} is early alpha software. API methods and data formats are likely to change frequently in ways that break backwards compatibility.
| Summary | Path |
|:--------|:-----|
{%- set reflinks = [] -%}
{%- for path,method,endpoint in endpoints_by_tag(tag.name) %}
{%- set _ = reflinks.append("["+endpoint.summary+"]: "+method_link(path, method, endpoint) ) %}
| [{{endpoint.summary}}][] | [`{{method|upper}} {{path}}`][{{endpoint.summary}}] |
{%- endfor %}
{% for reflink in reflinks -%}
{{reflink}}
{% endfor %}

View File

@@ -0,0 +1,51 @@
# {{info.title}} {{info.version}} Methods
{{info.description}}
**Warning:** {{spec.info.title}} is early alpha software. API methods and data formats are likely to change frequently in ways that break backwards compatibility.
{% if tags %}
View API methods by category:
{% for tag in tags %}
- [{{tag.name|title}} Methods](#{{slugify(tag.name)|lower}}-methods)
{% endfor %}
{% endif %}
{% for tag in tags %}
{% if endpoints_by_tag(tag.name)|list|length %}
## {{tag.name|title}} Methods
{{tag.description}}
| Summary | Path |
|:--------|:-----|
{%- set reflinks = [] -%}
{%- for path,method,endpoint in endpoints_by_tag(tag.name) %}
{%- set _ = reflinks.append("["+endpoint.summary+"]: "+method_link(path, method, endpoint) ) %}
| [{{endpoint.summary}}][] | [`{{method|upper}} {{path}}`][{{endpoint.summary}}] |
{%- endfor %}
{% for reflink in reflinks -%}
{{reflink}}
{% endfor %}
{% endif %}
{% endfor %}
{% if endpoints_by_tag("Uncategorized")|list|length %}
## Uncategorized Methods
| Name | Path | Summary |
|:-----|:-----|:--------|
{%- set reflinks = [] -%}
{%- for path,method,endpoint in endpoints_by_tag("Uncategorized") %}
{%- set _ = reflinks.append("["+endpoint.operationId+"]: "+method_link(path, method, endpoint) ) %}
| [{{endpoint.operationId}}][] | [`{{method|upper}} {{path}}`][{{endpoint.operationId}}] | {{endpoint.summary}} |
{%- endfor %}
{% for reflink in reflinks -%}
{{reflink}}
{% endfor %}
{% endif %}