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
|
# Generate a JSON schema of the Python handler configuration.
import json
from dataclasses import dataclass, fields
from os.path import join
from typing import Any
from mkdocs.config.defaults import MkDocsConfig
from mkdocs.plugins import get_plugin_logger
from mkdocstrings_handlers.python import PythonInputConfig, PythonInputOptions
# TODO: Update when Pydantic supports Python 3.14 (sources and duties as well).
try:
from pydantic import TypeAdapter
except ImportError:
TypeAdapter = None # type: ignore[assignment,misc]
_logger = get_plugin_logger(__name__)
def on_post_build(config: MkDocsConfig, **kwargs: Any) -> None: # noqa: ARG001
"""Write `schema.json` to the site directory."""
if TypeAdapter is None:
_logger.info("Pydantic is not installed, skipping JSON schema generation")
return
@dataclass
class PythonHandlerSchema:
python: PythonInputConfig
adapter = TypeAdapter(PythonHandlerSchema)
schema = adapter.json_schema()
schema["$schema"] = "https://json-schema.org/draft-07/schema"
with open(join(config.site_dir, "schema.json"), "w") as file:
json.dump(schema, file, indent=2)
_logger.debug("Generated JSON schema")
autorefs = config["plugins"]["autorefs"]
for field in fields(PythonInputConfig):
if f"setting-{field.name}" not in autorefs._primary_url_map:
_logger.warning(f"Handler setting `{field.name}` is not documented")
for field in fields(PythonInputOptions):
if f"option-{field.name}" not in autorefs._primary_url_map:
_logger.warning(f"Configuration option `{field.name}` is not documented")
|