Source code for pymend.docstring_parser.parser

"""The main parsing routine."""

from typing import Optional

from pymend.docstring_parser import epydoc, google, numpydoc, rest
from pymend.docstring_parser.common import (
    Docstring,
    DocstringStyle,
    ParseError,
    RenderingStyle,
)

_STYLE_MAP = {
    DocstringStyle.REST: rest,
    DocstringStyle.GOOGLE: google,
    DocstringStyle.NUMPYDOC: numpydoc,
    DocstringStyle.EPYDOC: epydoc,
}


[docs] def parse( text: Optional[str], style: DocstringStyle = DocstringStyle.AUTO ) -> Docstring: """Parse the docstring into its components. Parameters ---------- text : Optional[str] docstring text to parse style : DocstringStyle docstring style (Default value = DocstringStyle.AUTO) Returns ------- Docstring parsed docstring representation Raises ------ ParserError If none of the available module an parse the docstring """ if style != DocstringStyle.AUTO: return _STYLE_MAP[style].parse(text) exc: Optional[Exception] = None rets: list[Docstring] = [] for module in _STYLE_MAP.values(): try: ret = module.parse(text) except ParseError as ex: exc = ex else: rets.append(ret) if not rets and exc: raise exc return sorted(rets, key=lambda d: (len(d.examples), len(d.meta)), reverse=True)[0]
[docs] def compose( docstring: Docstring, style: DocstringStyle = DocstringStyle.AUTO, rendering_style: RenderingStyle = RenderingStyle.COMPACT, indent: str = " ", ) -> str: """Render a parsed docstring into docstring text. Parameters ---------- docstring : Docstring parsed docstring representation style : DocstringStyle docstring style to render (Default value = DocstringStyle.AUTO) indent : str the characters used as indentation in the docstring string (Default value = ' ') rendering_style : RenderingStyle The rendering style to use. (Default value = RenderingStyle.COMPACT) Returns ------- str docstring text Raises ------ ValueError If no output style could be determined. """ if style == DocstringStyle.AUTO: if docstring.style is None: msg = ( "Detected docstring.style of `None` and requested style of `AUTO`.\n" "Either the docstring to compose has to have its style set" " (for example by calling `parse`) or an " "output style has to be provided." ) raise ValueError(msg) style = docstring.style module = _STYLE_MAP[style] return module.compose(docstring, rendering_style=rendering_style, indent=indent)