Path: blob/main/singlestoredb/docstring/common.py
469 views
"""Common methods for parsing."""1import enum2import typing as T34PARAM_KEYWORDS = {5'param',6'parameter',7'arg',8'argument',9'attribute',10'key',11'keyword',12}13RAISES_KEYWORDS = {'raises', 'raise', 'except', 'exception'}14DEPRECATION_KEYWORDS = {'deprecation', 'deprecated'}15RETURNS_KEYWORDS = {'return', 'returns'}16YIELDS_KEYWORDS = {'yield', 'yields'}17EXAMPLES_KEYWORDS = {'example', 'examples'}181920class ParseError(RuntimeError):21"""Base class for all parsing related errors."""222324class DocstringStyle(enum.Enum):25"""Docstring style."""2627REST = 128GOOGLE = 229NUMPYDOC = 330EPYDOC = 431AUTO = 255323334class RenderingStyle(enum.Enum):35"""Rendering style when unparsing parsed docstrings."""3637COMPACT = 138CLEAN = 239EXPANDED = 3404142class DocstringMeta:43"""Docstring meta information.4445Symbolizes lines in form of4647:param arg: description48:raises ValueError: if something happens49"""5051def __init__(52self, args: T.List[str], description: T.Optional[str],53) -> None:54"""Initialize self.5556:param args: list of arguments. The exact content of this variable is57dependent on the kind of docstring; it's used to distinguish58between custom docstring meta information items.59:param description: associated docstring description.60"""61self.args = args62self.description = description636465class DocstringParam(DocstringMeta):66"""DocstringMeta symbolizing :param metadata."""6768def __init__(69self,70args: T.List[str],71description: T.Optional[str],72arg_name: str,73type_name: T.Optional[str],74is_optional: T.Optional[bool],75default: T.Optional[str],76) -> None:77"""Initialize self."""78super().__init__(args, description)79self.arg_name = arg_name80self.type_name = type_name81self.is_optional = is_optional82self.default = default838485class DocstringReturns(DocstringMeta):86"""DocstringMeta symbolizing :returns or :yields metadata."""8788def __init__(89self,90args: T.List[str],91description: T.Optional[str],92type_name: T.Optional[str],93is_generator: bool,94return_name: T.Optional[str] = None,95) -> None:96"""Initialize self."""97super().__init__(args, description)98self.type_name = type_name99self.is_generator = is_generator100self.return_name = return_name101102103class DocstringRaises(DocstringMeta):104"""DocstringMeta symbolizing :raises metadata."""105106def __init__(107self,108args: T.List[str],109description: T.Optional[str],110type_name: T.Optional[str],111) -> None:112"""Initialize self."""113super().__init__(args, description)114self.type_name = type_name115self.description = description116117118class DocstringDeprecated(DocstringMeta):119"""DocstringMeta symbolizing deprecation metadata."""120121def __init__(122self,123args: T.List[str],124description: T.Optional[str],125version: T.Optional[str],126) -> None:127"""Initialize self."""128super().__init__(args, description)129self.version = version130self.description = description131132133class DocstringExample(DocstringMeta):134"""DocstringMeta symbolizing example metadata."""135136def __init__(137self,138args: T.List[str],139snippet: T.Optional[str],140description: T.Optional[str],141post_snippet: T.Optional[str] = None,142) -> None:143"""Initialize self."""144super().__init__(args, description)145self.snippet = snippet146self.description = description147self.post_snippet = post_snippet148149150class Docstring:151"""Docstring object representation."""152153def __init__(154self,155style=None, # type: T.Optional[DocstringStyle]156) -> None:157"""Initialize self."""158self.short_description = None # type: T.Optional[str]159self.long_description = None # type: T.Optional[str]160self.blank_after_short_description = False161self.blank_after_long_description = False162self.meta = [] # type: T.List[DocstringMeta]163self.style = style # type: T.Optional[DocstringStyle]164165@property166def description(self) -> T.Optional[str]:167"""Return the full description of the function168169Returns None if the docstring did not include any description170"""171ret = []172if self.short_description:173ret.append(self.short_description)174if self.blank_after_short_description:175ret.append('')176if self.long_description:177ret.append(self.long_description)178179if not ret:180return None181182return '\n'.join(ret)183184@property185def params(self) -> T.List[DocstringParam]:186"""Return a list of information on function params."""187return [item for item in self.meta if isinstance(item, DocstringParam)]188189@property190def raises(self) -> T.List[DocstringRaises]:191"""Return a list of information on the exceptions that the function192may raise.193"""194return [195item for item in self.meta if isinstance(item, DocstringRaises)196]197198@property199def returns(self) -> T.Optional[DocstringReturns]:200"""Return a single information on function return.201202Takes the first return information.203"""204for item in self.meta:205if isinstance(item, DocstringReturns):206return item207return None208209@property210def many_returns(self) -> T.List[DocstringReturns]:211"""Return a list of information on function return."""212return [213item for item in self.meta if isinstance(item, DocstringReturns)214]215216@property217def deprecation(self) -> T.Optional[DocstringDeprecated]:218"""Return a single information on function deprecation notes."""219for item in self.meta:220if isinstance(item, DocstringDeprecated):221return item222return None223224@property225def examples(self) -> T.List[DocstringExample]:226"""Return a list of information on function examples."""227return [228item for item in self.meta if isinstance(item, DocstringExample)229]230231232