| """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, |
| ) -> None: |
| """Initialize self.""" |
| self.short_description = None |
| self.long_description = None |
| self.blank_after_short_description = False |
| self.blank_after_long_description = False |
| self.meta = [] |
| self.style = style |
|
|
| @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) |
| ] |
|
|