Path: blob/main/singlestoredb/docstring/tests/test_parser.py
469 views
"""Tests for generic docstring routines."""1import typing as T23import pytest45from singlestoredb.docstring.common import DocstringStyle6from singlestoredb.docstring.common import ParseError7from singlestoredb.docstring.parser import parse8910@pytest.mark.parametrize(11'source, expected',12[13pytest.param(None, None, id='No __doc__'),14('', None),15('\n', None),16('Short description', 'Short description'),17('\nShort description\n', 'Short description'),18('\n Short description\n', 'Short description'),19],20)21def test_short_description(22source: T.Optional[str], expected: T.Optional[str],23) -> None:24"""Test parsing short description."""25docstring = parse(source)26assert docstring.short_description == expected27assert docstring.description == expected28assert docstring.long_description is None29assert not docstring.meta303132def test_rest() -> None:33"""Test ReST-style parser autodetection."""34docstring = parse(35"""36Short description3738Long description3940Causing people to indent:4142A lot sometimes4344:param spam: spam desc45:param int bla: bla desc46:param str yay:47:raises ValueError: exc desc48:returns tuple: ret desc49""",50)5152assert docstring.style == DocstringStyle.REST53assert docstring.short_description == 'Short description'54assert docstring.long_description == (55'Long description\n\n'56'Causing people to indent:\n\n'57' A lot sometimes'58)59assert docstring.description == (60'Short description\n\n'61'Long description\n\n'62'Causing people to indent:\n\n'63' A lot sometimes'64)65assert len(docstring.params) == 366assert docstring.params[0].arg_name == 'spam'67assert docstring.params[0].type_name is None68assert docstring.params[0].description == 'spam desc'69assert docstring.params[1].arg_name == 'bla'70assert docstring.params[1].type_name == 'int'71assert docstring.params[1].description == 'bla desc'72assert docstring.params[2].arg_name == 'yay'73assert docstring.params[2].type_name == 'str'74assert docstring.params[2].description == ''75assert len(docstring.raises) == 176assert docstring.raises[0].type_name == 'ValueError'77assert docstring.raises[0].description == 'exc desc'78assert docstring.returns is not None79assert docstring.returns.type_name == 'tuple'80assert docstring.returns.description == 'ret desc'81assert docstring.many_returns is not None82assert len(docstring.many_returns) == 183assert docstring.many_returns[0] == docstring.returns848586def test_google() -> None:87"""Test Google-style parser autodetection."""88docstring = parse(89"""Short description9091Long description9293Causing people to indent:9495A lot sometimes9697Args:98spam: spam desc99bla (int): bla desc100yay (str):101102Raises:103ValueError: exc desc104105Returns:106tuple: ret desc107""",108)109110assert docstring.style == DocstringStyle.GOOGLE111assert docstring.short_description == 'Short description'112assert docstring.long_description == (113'Long description\n\n'114'Causing people to indent:\n\n'115' A lot sometimes'116)117assert docstring.description == (118'Short description\n\n'119'Long description\n\n'120'Causing people to indent:\n\n'121' A lot sometimes'122)123assert len(docstring.params) == 3124assert docstring.params[0].arg_name == 'spam'125assert docstring.params[0].type_name is None126assert docstring.params[0].description == 'spam desc'127assert docstring.params[1].arg_name == 'bla'128assert docstring.params[1].type_name == 'int'129assert docstring.params[1].description == 'bla desc'130assert docstring.params[2].arg_name == 'yay'131assert docstring.params[2].type_name == 'str'132assert docstring.params[2].description == ''133assert len(docstring.raises) == 1134assert docstring.raises[0].type_name == 'ValueError'135assert docstring.raises[0].description == 'exc desc'136assert docstring.returns is not None137assert docstring.returns.type_name == 'tuple'138assert docstring.returns.description == 'ret desc'139assert docstring.many_returns is not None140assert len(docstring.many_returns) == 1141assert docstring.many_returns[0] == docstring.returns142143144def test_numpydoc() -> None:145"""Test numpydoc-style parser autodetection."""146docstring = parse(147"""Short description148149Long description150151Causing people to indent:152153A lot sometimes154155Parameters156----------157spam158spam desc159bla : int160bla desc161yay : str162163Raises164------165ValueError166exc desc167168Other Parameters169----------------170this_guy : int, optional171you know him172173Returns174-------175tuple176ret desc177178See Also179--------180multiple lines...181something else?182183Warnings184--------185multiple lines...186none of this is real!187""",188)189190assert docstring.style == DocstringStyle.NUMPYDOC191assert docstring.short_description == 'Short description'192assert docstring.long_description == (193'Long description\n\n'194'Causing people to indent:\n\n'195' A lot sometimes'196)197assert docstring.description == (198'Short description\n\n'199'Long description\n\n'200'Causing people to indent:\n\n'201' A lot sometimes'202)203assert len(docstring.params) == 4204assert docstring.params[0].arg_name == 'spam'205assert docstring.params[0].type_name is None206assert docstring.params[0].description == 'spam desc'207assert docstring.params[1].arg_name == 'bla'208assert docstring.params[1].type_name == 'int'209assert docstring.params[1].description == 'bla desc'210assert docstring.params[2].arg_name == 'yay'211assert docstring.params[2].type_name == 'str'212assert docstring.params[2].description is None213assert docstring.params[3].arg_name == 'this_guy'214assert docstring.params[3].type_name == 'int'215assert docstring.params[3].is_optional216assert docstring.params[3].description == 'you know him'217218assert len(docstring.raises) == 1219assert docstring.raises[0].type_name == 'ValueError'220assert docstring.raises[0].description == 'exc desc'221assert docstring.returns is not None222assert docstring.returns.type_name == 'tuple'223assert docstring.returns.description == 'ret desc'224assert docstring.many_returns is not None225assert len(docstring.many_returns) == 1226assert docstring.many_returns[0] == docstring.returns227228229def test_autodetection_error_detection() -> None:230"""Test autodection for the case where one of the parsers throws an error231and another one succeeds.232"""233source = """234Does something useless235236:param 3 + 3 a: a param237"""238239with pytest.raises(ParseError):240# assert that one of the parsers does raise241parse(source, DocstringStyle.REST)242243# assert that autodetection still works244docstring = parse(source)245246assert docstring247assert docstring.style == DocstringStyle.GOOGLE248249250