1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
"""
sphinxcontrib.openapi
---------------------
The OpenAPI spec renderer for Sphinx. It's a new way to document your
RESTful API. Based on ``sphinxcontrib-httpdomain``.
:copyright: (c) 2016, Ihor Kalnytskyi.
:license: BSD, see LICENSE for details.
"""
try:
from importlib.metadata import distribution, PackageNotFoundError
except ImportError: # python < 3.8
from importlib_metadata import distribution, PackageNotFoundError
from sphinxcontrib.openapi import renderers, directive
try:
__version__ = distribution(__name__).version
except PackageNotFoundError:
# package is not installed
__version__ = None
_BUILTIN_RENDERERS = {
"httpdomain": renderers.HttpdomainRenderer,
"httpdomain:old": renderers.HttpdomainOldRenderer,
}
_DEFAULT_RENDERER_NAME = "httpdomain:old"
def _register_rendering_directives(app, conf):
"""Register rendering directives based on effective configuration."""
renderers_map = dict(_BUILTIN_RENDERERS, **conf.openapi_renderers)
for renderer_name, renderer_cls in renderers_map.items():
app.add_directive(
"openapi:%s" % renderer_name,
directive.create_directive_from_renderer(renderer_cls),
)
if conf.openapi_default_renderer not in renderers_map:
raise ValueError(
"invalid 'openapi_default_renderer' value: "
"no such renderer: '%s'" % conf.openapi_default_renderer
)
app.add_directive(
"openapi",
directive.create_directive_from_renderer(
renderers_map[conf.openapi_default_renderer]
),
)
def setup(app):
app.add_config_value("openapi_default_renderer", _DEFAULT_RENDERER_NAME, "html")
app.add_config_value("openapi_renderers", {}, "html")
from sphinxcontrib import httpdomain
for idx, fieldtype in enumerate(httpdomain.HTTPResource.doc_field_types):
if fieldtype.name == 'requestheader':
httpdomain.HTTPResource.doc_field_types[idx] = httpdomain.TypedField(
fieldtype.name,
label=fieldtype.label,
names=fieldtype.names,
typerolename='header',
typenames=('reqheadertype', ),
)
if fieldtype.name == 'responseheader':
httpdomain.HTTPResource.doc_field_types[idx] = httpdomain.TypedField(
fieldtype.name,
label=fieldtype.label,
names=fieldtype.names,
typerolename='header',
typenames=('resheadertype', ),
)
app.setup_extension("sphinxcontrib.httpdomain")
app.connect("config-inited", _register_rendering_directives)
return {"version": __version__, "parallel_read_safe": True}
|