123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- """YAML utilities"""
- from __future__ import annotations
- import typing
- import yaml
- from apispec.utils import dedent, trim_docstring
- def dict_to_yaml(dic: dict, yaml_dump_kwargs: typing.Any | None = None) -> str:
- """Serializes a dictionary to YAML."""
- yaml_dump_kwargs = yaml_dump_kwargs or {}
- # By default, don't sort alphabetically to respect schema field ordering
- yaml_dump_kwargs.setdefault("sort_keys", False)
- return yaml.dump(dic, **yaml_dump_kwargs)
- def load_yaml_from_docstring(docstring: str) -> dict:
- """Loads YAML from docstring."""
- split_lines = trim_docstring(docstring).split("\n")
- # Cut YAML from rest of docstring
- for index, line in enumerate(split_lines):
- line = line.strip()
- if line.startswith("---"):
- cut_from = index
- break
- else:
- return {}
- yaml_string = "\n".join(split_lines[cut_from:])
- yaml_string = dedent(yaml_string)
- return yaml.safe_load(yaml_string) or {}
- PATH_KEYS = {"get", "put", "post", "delete", "options", "head", "patch"}
- def load_operations_from_docstring(docstring: str) -> dict:
- """Return a dictionary of OpenAPI operations parsed from a
- a docstring.
- """
- doc_data = load_yaml_from_docstring(docstring)
- return {
- key: val
- for key, val in doc_data.items()
- if key in PATH_KEYS or key.startswith("x-")
- }
|