Coverage for src/griffe_typingdoc/_docstrings.py: 64.71%
30 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-18 01:26 +0100
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-18 01:26 +0100
1"""Helpers to build docstring sections."""
3from __future__ import annotations
5from typing import TYPE_CHECKING, Any
7from griffe import (
8 DocstringParameter,
9 DocstringRaise,
10 DocstringReceive,
11 DocstringReturn,
12 DocstringSectionAdmonition,
13 DocstringSectionOtherParameters,
14 DocstringSectionParameters,
15 DocstringSectionRaises,
16 DocstringSectionReceives,
17 DocstringSectionReturns,
18 DocstringSectionWarns,
19 DocstringSectionYields,
20 DocstringWarn,
21 DocstringYield,
22)
24if TYPE_CHECKING:
25 from collections.abc import Iterable
27 from griffe import Function, Parameter
30def _no_self_params(func: Function) -> list[Parameter]:
31 if func.parent and func.parent.is_class and func.parameters and func.parameters[0].name in {"self", "cls"}:
32 return list(func.parameters)[1:]
33 return list(func.parameters)
36def _to_parameters_section(params_dict: dict[str, dict[str, Any]], func: Function) -> DocstringSectionParameters:
37 return DocstringSectionParameters(
38 [
39 DocstringParameter(
40 name=param_name,
41 description=param_doc["description"],
42 annotation=param_doc["annotation"],
43 value=func.parameters[param_name].default, # type: ignore[arg-type]
44 )
45 for param_name, param_doc in params_dict.items()
46 ],
47 )
50def _to_other_parameters_section(params_dict: dict[str, dict[str, Any]]) -> DocstringSectionOtherParameters:
51 return DocstringSectionOtherParameters(
52 [
53 DocstringParameter(
54 name=param_name,
55 description=param_doc["description"],
56 annotation=param_doc["annotation"],
57 )
58 for param_name, param_doc in params_dict.items()
59 ],
60 )
63def _to_yields_section(yield_data: Iterable[dict[str, Any]]) -> DocstringSectionYields:
64 return DocstringSectionYields(
65 [
66 DocstringYield(
67 name=yield_dict.get("name", ""),
68 description=yield_dict.get("doc", ""),
69 annotation=yield_dict["annotation"],
70 )
71 for yield_dict in yield_data
72 ],
73 )
76def _to_receives_section(receive_data: Iterable[dict[str, Any]]) -> DocstringSectionReceives:
77 return DocstringSectionReceives(
78 [
79 DocstringReceive(
80 name=receive_dict.get("name", ""),
81 description=receive_dict.get("doc", ""),
82 annotation=receive_dict["annotation"],
83 )
84 for receive_dict in receive_data
85 ],
86 )
89def _to_returns_section(return_data: Iterable[dict[str, Any]]) -> DocstringSectionReturns:
90 return DocstringSectionReturns(
91 [
92 DocstringReturn(
93 name=return_dict.get("name", ""),
94 description=return_dict.get("doc", ""),
95 annotation=return_dict["annotation"],
96 )
97 for return_dict in return_data
98 ],
99 )
102def _to_warns_section(warn_data: Iterable[dict[str, Any]]) -> DocstringSectionWarns:
103 return DocstringSectionWarns(
104 [
105 DocstringWarn(
106 annotation=warn_dict["annotation"],
107 description=warn_dict.get("description", ""),
108 )
109 for warn_dict in warn_data
110 ],
111 )
114def _to_raises_section(raise_data: Iterable[dict[str, Any]]) -> DocstringSectionRaises:
115 return DocstringSectionRaises(
116 [
117 DocstringRaise(
118 annotation=raise_dict["annotation"],
119 description=raise_dict.get("description", ""),
120 )
121 for raise_dict in raise_data
122 ],
123 )
126def _to_deprecated_section(deprecation_data: dict[str, Any]) -> DocstringSectionAdmonition:
127 description = deprecation_data["description"]
128 description_lines = deprecation_data["description"].split("\n")
129 if len(description_lines) > 1:
130 title = description_lines[0].strip()
131 description = "\n".join(description_lines[1:]).strip()
132 else:
133 title = description
134 description = ""
135 return DocstringSectionAdmonition(kind="danger", title=title, text=description)