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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
"""Common methods for parsing."""
import enum
import typing as T
PARAM_KEYWORDS = {
"param",
"parameter",
"arg",
"argument",
"attribute",
"key",
"keyword",
}
RAISES_KEYWORDS = {"raises", "raise", "except", "exception"}
DEPRECATION_KEYWORDS = {"deprecation", "deprecated"}
RETURNS_KEYWORDS = {"return", "returns"}
YIELDS_KEYWORDS = {"yield", "yields"}
EXAMPLES_KEYWORDS = {"example", "examples"}
class ParseError(RuntimeError):
"""Base class for all parsing related errors."""
class DocstringStyle(enum.Enum):
"""Docstring style."""
REST = 1
GOOGLE = 2
NUMPYDOC = 3
EPYDOC = 4
AUTO = 255
class RenderingStyle(enum.Enum):
"""Rendering style when unparsing parsed docstrings."""
COMPACT = 1
CLEAN = 2
EXPANDED = 3
class DocstringMeta:
"""Docstring meta information.
Symbolizes lines in form of
:param arg: description
:raises ValueError: if something happens
"""
def __init__(
self, args: T.List[str], description: T.Optional[str]
) -> None:
"""Initialize self.
:param args: list of arguments. The exact content of this variable is
dependent on the kind of docstring; it's used to distinguish
between custom docstring meta information items.
:param description: associated docstring description.
"""
self.args = args
self.description = description
class DocstringParam(DocstringMeta):
"""DocstringMeta symbolizing :param metadata."""
def __init__(
self,
args: T.List[str],
description: T.Optional[str],
arg_name: str,
type_name: T.Optional[str],
is_optional: T.Optional[bool],
default: T.Optional[str],
) -> None:
"""Initialize self."""
super().__init__(args, description)
self.arg_name = arg_name
self.type_name = type_name
self.is_optional = is_optional
self.default = default
class DocstringReturns(DocstringMeta):
"""DocstringMeta symbolizing :returns or :yields metadata."""
def __init__(
self,
args: T.List[str],
description: T.Optional[str],
type_name: T.Optional[str],
is_generator: bool,
return_name: T.Optional[str] = None,
) -> None:
"""Initialize self."""
super().__init__(args, description)
self.type_name = type_name
self.is_generator = is_generator
self.return_name = return_name
class DocstringRaises(DocstringMeta):
"""DocstringMeta symbolizing :raises metadata."""
def __init__(
self,
args: T.List[str],
description: T.Optional[str],
type_name: T.Optional[str],
) -> None:
"""Initialize self."""
super().__init__(args, description)
self.type_name = type_name
self.description = description
class DocstringDeprecated(DocstringMeta):
"""DocstringMeta symbolizing deprecation metadata."""
def __init__(
self,
args: T.List[str],
description: T.Optional[str],
version: T.Optional[str],
) -> None:
"""Initialize self."""
super().__init__(args, description)
self.version = version
self.description = description
class DocstringExample(DocstringMeta):
"""DocstringMeta symbolizing example metadata."""
def __init__(
self,
args: T.List[str],
snippet: T.Optional[str],
description: T.Optional[str],
) -> None:
"""Initialize self."""
super().__init__(args, description)
self.snippet = snippet
self.description = description
class Docstring:
"""Docstring object representation."""
def __init__(
self,
style=None, # type: T.Optional[DocstringStyle]
) -> None:
"""Initialize self."""
self.short_description = None # type: T.Optional[str]
self.long_description = None # type: T.Optional[str]
self.blank_after_short_description = False
self.blank_after_long_description = False
self.meta = [] # type: T.List[DocstringMeta]
self.style = style # type: T.Optional[DocstringStyle]
@property
def description(self) -> T.Optional[str]:
"""Return the full description of the function
Returns None if the docstring did not include any description
"""
ret = []
if self.short_description:
ret.append(self.short_description)
if self.blank_after_short_description:
ret.append("")
if self.long_description:
ret.append(self.long_description)
if not ret:
return None
return "\n".join(ret)
@property
def params(self) -> T.List[DocstringParam]:
"""Return a list of information on function params."""
return [item for item in self.meta if isinstance(item, DocstringParam)]
@property
def raises(self) -> T.List[DocstringRaises]:
"""Return a list of information on the exceptions that the function
may raise.
"""
return [
item for item in self.meta if isinstance(item, DocstringRaises)
]
@property
def returns(self) -> T.Optional[DocstringReturns]:
"""Return a single information on function return.
Takes the first return information.
"""
for item in self.meta:
if isinstance(item, DocstringReturns):
return item
return None
@property
def many_returns(self) -> T.List[DocstringReturns]:
"""Return a list of information on function return."""
return [
item for item in self.meta if isinstance(item, DocstringReturns)
]
@property
def deprecation(self) -> T.Optional[DocstringDeprecated]:
"""Return a single information on function deprecation notes."""
for item in self.meta:
if isinstance(item, DocstringDeprecated):
return item
return None
@property
def examples(self) -> T.List[DocstringExample]:
"""Return a list of information on function examples."""
return [
item for item in self.meta if isinstance(item, DocstringExample)
]
|