Source code for pydantic_openapi_helper.core
from typing import List, Any, Dict
from pydantic.schema import schema
from .helper import clean_schemas
from .inheritance import get_schemas_inheritance
"""base open api dictionary for all schemas."""
_base_open_api = {
"openapi": "3.0.2",
"servers": [],
"info": {},
"externalDocs": {},
"tags": [],
"x-tagGroups": [
{
"name": "Models",
"tags": []
}
],
"paths": {},
"components": {"schemas": {}}
}
[docs]def get_openapi(
base_object: List[Any],
title: str = None,
version: str = None,
openapi_version: str = "3.0.2",
description: str = None,
info: dict = None,
external_docs: dict = None,
inheritance: bool = False,
add_discriminator: bool = True
) -> Dict:
"""Get openapi compatible dictionary from a list of Pydantic objects.
Args:
base_objects: A list of Pydantic model objects to be included in the OpenAPI
schema.
title: An optional title for OpenAPI title in info field.
version: Schema version to set the version in info.
openapi_version: Version for OpenAPI schema. Default is 3.0.2.
description: A short description for schema info.
info: Schema info as a dictionary. You can use this input to provide title,
version and description together.
external_docs: Link to external docs for schema.
inheritance: A boolean to wheather the OpenAPI specification should be modified
to use polymorphism. We use Pydantic to generate the initial version and then
post-process the output dictionary to generate the new schema.
Returns:
Dict -- OpenAPI schema as a dictionary.
"""
open_api = dict(_base_open_api)
open_api['openapi'] = openapi_version
if info:
open_api['info'] = info
if title:
open_api['info']['title'] = title
if not version:
raise ValueError(
'Schema version must be specified as argument or from distribution metadata'
)
if version:
open_api['info']['version'] = version
if description:
open_api['info']['description'] = description
if external_docs:
open_api['externalDocs'] = external_docs
if not inheritance:
schemas = schema(base_object, ref_prefix='#/components/schemas/')['definitions']
else:
schemas = get_schemas_inheritance(base_object)
schemas, tags, tag_names = clean_schemas(
schemas, add_tags=True, add_discriminator=inheritance and add_discriminator,
add_type=True
)
open_api['tags'] = tags
open_api['x-tagGroups'][0]['tags'] = tag_names
open_api['components']['schemas'] = schemas
return open_api