singlestoredb 1.16.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- singlestoredb/__init__.py +75 -0
- singlestoredb/ai/__init__.py +2 -0
- singlestoredb/ai/chat.py +139 -0
- singlestoredb/ai/embeddings.py +128 -0
- singlestoredb/alchemy/__init__.py +90 -0
- singlestoredb/apps/__init__.py +3 -0
- singlestoredb/apps/_cloud_functions.py +90 -0
- singlestoredb/apps/_config.py +72 -0
- singlestoredb/apps/_connection_info.py +18 -0
- singlestoredb/apps/_dashboards.py +47 -0
- singlestoredb/apps/_process.py +32 -0
- singlestoredb/apps/_python_udfs.py +100 -0
- singlestoredb/apps/_stdout_supress.py +30 -0
- singlestoredb/apps/_uvicorn_util.py +36 -0
- singlestoredb/auth.py +245 -0
- singlestoredb/config.py +484 -0
- singlestoredb/connection.py +1487 -0
- singlestoredb/converters.py +950 -0
- singlestoredb/docstring/__init__.py +33 -0
- singlestoredb/docstring/attrdoc.py +126 -0
- singlestoredb/docstring/common.py +230 -0
- singlestoredb/docstring/epydoc.py +267 -0
- singlestoredb/docstring/google.py +412 -0
- singlestoredb/docstring/numpydoc.py +562 -0
- singlestoredb/docstring/parser.py +100 -0
- singlestoredb/docstring/py.typed +1 -0
- singlestoredb/docstring/rest.py +256 -0
- singlestoredb/docstring/tests/__init__.py +1 -0
- singlestoredb/docstring/tests/_pydoctor.py +21 -0
- singlestoredb/docstring/tests/test_epydoc.py +729 -0
- singlestoredb/docstring/tests/test_google.py +1007 -0
- singlestoredb/docstring/tests/test_numpydoc.py +1100 -0
- singlestoredb/docstring/tests/test_parse_from_object.py +109 -0
- singlestoredb/docstring/tests/test_parser.py +248 -0
- singlestoredb/docstring/tests/test_rest.py +547 -0
- singlestoredb/docstring/tests/test_util.py +70 -0
- singlestoredb/docstring/util.py +141 -0
- singlestoredb/exceptions.py +120 -0
- singlestoredb/functions/__init__.py +16 -0
- singlestoredb/functions/decorator.py +201 -0
- singlestoredb/functions/dtypes.py +1793 -0
- singlestoredb/functions/ext/__init__.py +1 -0
- singlestoredb/functions/ext/arrow.py +375 -0
- singlestoredb/functions/ext/asgi.py +2133 -0
- singlestoredb/functions/ext/json.py +420 -0
- singlestoredb/functions/ext/mmap.py +413 -0
- singlestoredb/functions/ext/rowdat_1.py +724 -0
- singlestoredb/functions/ext/timer.py +89 -0
- singlestoredb/functions/ext/utils.py +218 -0
- singlestoredb/functions/signature.py +1578 -0
- singlestoredb/functions/typing/__init__.py +41 -0
- singlestoredb/functions/typing/numpy.py +20 -0
- singlestoredb/functions/typing/pandas.py +2 -0
- singlestoredb/functions/typing/polars.py +2 -0
- singlestoredb/functions/typing/pyarrow.py +2 -0
- singlestoredb/functions/utils.py +421 -0
- singlestoredb/fusion/__init__.py +11 -0
- singlestoredb/fusion/graphql.py +213 -0
- singlestoredb/fusion/handler.py +916 -0
- singlestoredb/fusion/handlers/__init__.py +0 -0
- singlestoredb/fusion/handlers/export.py +525 -0
- singlestoredb/fusion/handlers/files.py +690 -0
- singlestoredb/fusion/handlers/job.py +660 -0
- singlestoredb/fusion/handlers/models.py +250 -0
- singlestoredb/fusion/handlers/stage.py +502 -0
- singlestoredb/fusion/handlers/utils.py +324 -0
- singlestoredb/fusion/handlers/workspace.py +956 -0
- singlestoredb/fusion/registry.py +249 -0
- singlestoredb/fusion/result.py +399 -0
- singlestoredb/http/__init__.py +27 -0
- singlestoredb/http/connection.py +1267 -0
- singlestoredb/magics/__init__.py +34 -0
- singlestoredb/magics/run_personal.py +137 -0
- singlestoredb/magics/run_shared.py +134 -0
- singlestoredb/management/__init__.py +9 -0
- singlestoredb/management/billing_usage.py +148 -0
- singlestoredb/management/cluster.py +462 -0
- singlestoredb/management/export.py +295 -0
- singlestoredb/management/files.py +1102 -0
- singlestoredb/management/inference_api.py +105 -0
- singlestoredb/management/job.py +887 -0
- singlestoredb/management/manager.py +373 -0
- singlestoredb/management/organization.py +226 -0
- singlestoredb/management/region.py +169 -0
- singlestoredb/management/utils.py +423 -0
- singlestoredb/management/workspace.py +1927 -0
- singlestoredb/mysql/__init__.py +177 -0
- singlestoredb/mysql/_auth.py +298 -0
- singlestoredb/mysql/charset.py +214 -0
- singlestoredb/mysql/connection.py +2032 -0
- singlestoredb/mysql/constants/CLIENT.py +38 -0
- singlestoredb/mysql/constants/COMMAND.py +32 -0
- singlestoredb/mysql/constants/CR.py +78 -0
- singlestoredb/mysql/constants/ER.py +474 -0
- singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
- singlestoredb/mysql/constants/FIELD_TYPE.py +48 -0
- singlestoredb/mysql/constants/FLAG.py +15 -0
- singlestoredb/mysql/constants/SERVER_STATUS.py +10 -0
- singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
- singlestoredb/mysql/constants/__init__.py +0 -0
- singlestoredb/mysql/converters.py +271 -0
- singlestoredb/mysql/cursors.py +896 -0
- singlestoredb/mysql/err.py +92 -0
- singlestoredb/mysql/optionfile.py +20 -0
- singlestoredb/mysql/protocol.py +450 -0
- singlestoredb/mysql/tests/__init__.py +19 -0
- singlestoredb/mysql/tests/base.py +126 -0
- singlestoredb/mysql/tests/conftest.py +37 -0
- singlestoredb/mysql/tests/test_DictCursor.py +132 -0
- singlestoredb/mysql/tests/test_SSCursor.py +141 -0
- singlestoredb/mysql/tests/test_basic.py +452 -0
- singlestoredb/mysql/tests/test_connection.py +851 -0
- singlestoredb/mysql/tests/test_converters.py +58 -0
- singlestoredb/mysql/tests/test_cursor.py +141 -0
- singlestoredb/mysql/tests/test_err.py +16 -0
- singlestoredb/mysql/tests/test_issues.py +514 -0
- singlestoredb/mysql/tests/test_load_local.py +75 -0
- singlestoredb/mysql/tests/test_nextset.py +88 -0
- singlestoredb/mysql/tests/test_optionfile.py +27 -0
- singlestoredb/mysql/tests/thirdparty/__init__.py +6 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +323 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +865 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +110 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +224 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +101 -0
- singlestoredb/mysql/times.py +23 -0
- singlestoredb/notebook/__init__.py +16 -0
- singlestoredb/notebook/_objects.py +213 -0
- singlestoredb/notebook/_portal.py +352 -0
- singlestoredb/py.typed +0 -0
- singlestoredb/pytest.py +352 -0
- singlestoredb/server/__init__.py +0 -0
- singlestoredb/server/docker.py +452 -0
- singlestoredb/server/free_tier.py +267 -0
- singlestoredb/tests/__init__.py +0 -0
- singlestoredb/tests/alltypes.sql +307 -0
- singlestoredb/tests/alltypes_no_nulls.sql +208 -0
- singlestoredb/tests/empty.sql +0 -0
- singlestoredb/tests/ext_funcs/__init__.py +702 -0
- singlestoredb/tests/local_infile.csv +3 -0
- singlestoredb/tests/test.ipynb +18 -0
- singlestoredb/tests/test.sql +680 -0
- singlestoredb/tests/test2.ipynb +18 -0
- singlestoredb/tests/test2.sql +1 -0
- singlestoredb/tests/test_basics.py +1332 -0
- singlestoredb/tests/test_config.py +318 -0
- singlestoredb/tests/test_connection.py +3103 -0
- singlestoredb/tests/test_dbapi.py +27 -0
- singlestoredb/tests/test_exceptions.py +45 -0
- singlestoredb/tests/test_ext_func.py +1472 -0
- singlestoredb/tests/test_ext_func_data.py +1101 -0
- singlestoredb/tests/test_fusion.py +1527 -0
- singlestoredb/tests/test_http.py +288 -0
- singlestoredb/tests/test_management.py +1599 -0
- singlestoredb/tests/test_plugin.py +33 -0
- singlestoredb/tests/test_results.py +171 -0
- singlestoredb/tests/test_types.py +132 -0
- singlestoredb/tests/test_udf.py +737 -0
- singlestoredb/tests/test_udf_returns.py +459 -0
- singlestoredb/tests/test_vectorstore.py +51 -0
- singlestoredb/tests/test_xdict.py +333 -0
- singlestoredb/tests/utils.py +141 -0
- singlestoredb/types.py +373 -0
- singlestoredb/utils/__init__.py +0 -0
- singlestoredb/utils/config.py +950 -0
- singlestoredb/utils/convert_rows.py +69 -0
- singlestoredb/utils/debug.py +13 -0
- singlestoredb/utils/dtypes.py +205 -0
- singlestoredb/utils/events.py +65 -0
- singlestoredb/utils/mogrify.py +151 -0
- singlestoredb/utils/results.py +585 -0
- singlestoredb/utils/xdict.py +425 -0
- singlestoredb/vectorstore.py +192 -0
- singlestoredb/warnings.py +5 -0
- singlestoredb-1.16.1.dist-info/METADATA +165 -0
- singlestoredb-1.16.1.dist-info/RECORD +183 -0
- singlestoredb-1.16.1.dist-info/WHEEL +5 -0
- singlestoredb-1.16.1.dist-info/entry_points.txt +2 -0
- singlestoredb-1.16.1.dist-info/licenses/LICENSE +201 -0
- singlestoredb-1.16.1.dist-info/top_level.txt +3 -0
- sqlx/__init__.py +4 -0
- sqlx/magic.py +113 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Tests for parse_from_object function and attribute docstrings."""
|
|
2
|
+
from unittest.mock import patch
|
|
3
|
+
|
|
4
|
+
from singlestoredb.docstring import parse_from_object
|
|
5
|
+
|
|
6
|
+
# module_attr: int = 1
|
|
7
|
+
# """Description for module_attr"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# def test_from_module_attribute_docstrings() -> None:
|
|
11
|
+
# """Test the parse of attribute docstrings from a module."""
|
|
12
|
+
# from . import test_parse_from_object # pylint: disable=C0415,W0406
|
|
13
|
+
#
|
|
14
|
+
# docstring = parse_from_object(test_parse_from_object)
|
|
15
|
+
#
|
|
16
|
+
# assert 'parse_from_object' in docstring.short_description
|
|
17
|
+
# assert len(docstring.params) == 1
|
|
18
|
+
# assert docstring.params[0].arg_name == 'module_attr'
|
|
19
|
+
# assert docstring.params[0].type_name == 'int'
|
|
20
|
+
# assert docstring.params[0].description == 'Description for module_attr'
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_from_class_attribute_docstrings() -> None:
|
|
24
|
+
"""Test the parse of attribute docstrings from a class."""
|
|
25
|
+
|
|
26
|
+
class StandardCase:
|
|
27
|
+
"""Short description
|
|
28
|
+
Long description
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
attr_one: str
|
|
32
|
+
"""Description for attr_one"""
|
|
33
|
+
attr_two: bool = False
|
|
34
|
+
"""Description for attr_two"""
|
|
35
|
+
|
|
36
|
+
docstring = parse_from_object(StandardCase)
|
|
37
|
+
|
|
38
|
+
assert docstring.short_description == 'Short description'
|
|
39
|
+
assert docstring.long_description == 'Long description'
|
|
40
|
+
assert docstring.description == 'Short description\nLong description'
|
|
41
|
+
assert len(docstring.params) == 2
|
|
42
|
+
assert docstring.params[0].arg_name == 'attr_one'
|
|
43
|
+
assert docstring.params[0].type_name == 'str'
|
|
44
|
+
assert docstring.params[0].description == 'Description for attr_one'
|
|
45
|
+
assert docstring.params[1].arg_name == 'attr_two'
|
|
46
|
+
assert docstring.params[1].type_name == 'bool'
|
|
47
|
+
assert docstring.params[1].description == 'Description for attr_two'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_from_class_attribute_docstrings_without_type() -> None:
|
|
51
|
+
"""Test the parse of untyped attribute docstrings."""
|
|
52
|
+
|
|
53
|
+
class WithoutType: # pylint: disable=missing-class-docstring
|
|
54
|
+
attr_one = 'value'
|
|
55
|
+
"""Description for attr_one"""
|
|
56
|
+
|
|
57
|
+
docstring = parse_from_object(WithoutType)
|
|
58
|
+
|
|
59
|
+
assert docstring.short_description is None
|
|
60
|
+
assert docstring.long_description is None
|
|
61
|
+
assert docstring.description is None
|
|
62
|
+
assert len(docstring.params) == 1
|
|
63
|
+
assert docstring.params[0].arg_name == 'attr_one'
|
|
64
|
+
assert docstring.params[0].type_name is None
|
|
65
|
+
assert docstring.params[0].description == 'Description for attr_one'
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_from_class_without_source() -> None:
|
|
69
|
+
"""Test the parse of class when source is unavailable."""
|
|
70
|
+
|
|
71
|
+
class WithoutSource:
|
|
72
|
+
"""Short description"""
|
|
73
|
+
|
|
74
|
+
attr_one: str
|
|
75
|
+
"""Description for attr_one"""
|
|
76
|
+
|
|
77
|
+
with patch(
|
|
78
|
+
'inspect.getsource', side_effect=OSError('could not get source code'),
|
|
79
|
+
):
|
|
80
|
+
docstring = parse_from_object(WithoutSource)
|
|
81
|
+
|
|
82
|
+
assert docstring.short_description == 'Short description'
|
|
83
|
+
assert docstring.long_description is None
|
|
84
|
+
assert docstring.description == 'Short description'
|
|
85
|
+
assert len(docstring.params) == 0
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_from_function() -> None:
|
|
89
|
+
"""Test the parse of a function docstring."""
|
|
90
|
+
|
|
91
|
+
def a_function(param1: str, param2: int = 2) -> str:
|
|
92
|
+
"""Short description
|
|
93
|
+
Args:
|
|
94
|
+
param1: Description for param1
|
|
95
|
+
param2: Description for param2
|
|
96
|
+
"""
|
|
97
|
+
return f'{param1} {param2}'
|
|
98
|
+
|
|
99
|
+
docstring = parse_from_object(a_function)
|
|
100
|
+
|
|
101
|
+
assert docstring.short_description == 'Short description'
|
|
102
|
+
assert docstring.description == 'Short description'
|
|
103
|
+
assert len(docstring.params) == 2
|
|
104
|
+
assert docstring.params[0].arg_name == 'param1'
|
|
105
|
+
assert docstring.params[0].type_name is None
|
|
106
|
+
assert docstring.params[0].description == 'Description for param1'
|
|
107
|
+
assert docstring.params[1].arg_name == 'param2'
|
|
108
|
+
assert docstring.params[1].type_name is None
|
|
109
|
+
assert docstring.params[1].description == 'Description for param2'
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"""Tests for generic docstring routines."""
|
|
2
|
+
import typing as T
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from singlestoredb.docstring.common import DocstringStyle
|
|
7
|
+
from singlestoredb.docstring.common import ParseError
|
|
8
|
+
from singlestoredb.docstring.parser import parse
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.mark.parametrize(
|
|
12
|
+
'source, expected',
|
|
13
|
+
[
|
|
14
|
+
pytest.param(None, None, id='No __doc__'),
|
|
15
|
+
('', None),
|
|
16
|
+
('\n', None),
|
|
17
|
+
('Short description', 'Short description'),
|
|
18
|
+
('\nShort description\n', 'Short description'),
|
|
19
|
+
('\n Short description\n', 'Short description'),
|
|
20
|
+
],
|
|
21
|
+
)
|
|
22
|
+
def test_short_description(
|
|
23
|
+
source: T.Optional[str], expected: T.Optional[str],
|
|
24
|
+
) -> None:
|
|
25
|
+
"""Test parsing short description."""
|
|
26
|
+
docstring = parse(source)
|
|
27
|
+
assert docstring.short_description == expected
|
|
28
|
+
assert docstring.description == expected
|
|
29
|
+
assert docstring.long_description is None
|
|
30
|
+
assert not docstring.meta
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_rest() -> None:
|
|
34
|
+
"""Test ReST-style parser autodetection."""
|
|
35
|
+
docstring = parse(
|
|
36
|
+
"""
|
|
37
|
+
Short description
|
|
38
|
+
|
|
39
|
+
Long description
|
|
40
|
+
|
|
41
|
+
Causing people to indent:
|
|
42
|
+
|
|
43
|
+
A lot sometimes
|
|
44
|
+
|
|
45
|
+
:param spam: spam desc
|
|
46
|
+
:param int bla: bla desc
|
|
47
|
+
:param str yay:
|
|
48
|
+
:raises ValueError: exc desc
|
|
49
|
+
:returns tuple: ret desc
|
|
50
|
+
""",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
assert docstring.style == DocstringStyle.REST
|
|
54
|
+
assert docstring.short_description == 'Short description'
|
|
55
|
+
assert docstring.long_description == (
|
|
56
|
+
'Long description\n\n'
|
|
57
|
+
'Causing people to indent:\n\n'
|
|
58
|
+
' A lot sometimes'
|
|
59
|
+
)
|
|
60
|
+
assert docstring.description == (
|
|
61
|
+
'Short description\n\n'
|
|
62
|
+
'Long description\n\n'
|
|
63
|
+
'Causing people to indent:\n\n'
|
|
64
|
+
' A lot sometimes'
|
|
65
|
+
)
|
|
66
|
+
assert len(docstring.params) == 3
|
|
67
|
+
assert docstring.params[0].arg_name == 'spam'
|
|
68
|
+
assert docstring.params[0].type_name is None
|
|
69
|
+
assert docstring.params[0].description == 'spam desc'
|
|
70
|
+
assert docstring.params[1].arg_name == 'bla'
|
|
71
|
+
assert docstring.params[1].type_name == 'int'
|
|
72
|
+
assert docstring.params[1].description == 'bla desc'
|
|
73
|
+
assert docstring.params[2].arg_name == 'yay'
|
|
74
|
+
assert docstring.params[2].type_name == 'str'
|
|
75
|
+
assert docstring.params[2].description == ''
|
|
76
|
+
assert len(docstring.raises) == 1
|
|
77
|
+
assert docstring.raises[0].type_name == 'ValueError'
|
|
78
|
+
assert docstring.raises[0].description == 'exc desc'
|
|
79
|
+
assert docstring.returns is not None
|
|
80
|
+
assert docstring.returns.type_name == 'tuple'
|
|
81
|
+
assert docstring.returns.description == 'ret desc'
|
|
82
|
+
assert docstring.many_returns is not None
|
|
83
|
+
assert len(docstring.many_returns) == 1
|
|
84
|
+
assert docstring.many_returns[0] == docstring.returns
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_google() -> None:
|
|
88
|
+
"""Test Google-style parser autodetection."""
|
|
89
|
+
docstring = parse(
|
|
90
|
+
"""Short description
|
|
91
|
+
|
|
92
|
+
Long description
|
|
93
|
+
|
|
94
|
+
Causing people to indent:
|
|
95
|
+
|
|
96
|
+
A lot sometimes
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
spam: spam desc
|
|
100
|
+
bla (int): bla desc
|
|
101
|
+
yay (str):
|
|
102
|
+
|
|
103
|
+
Raises:
|
|
104
|
+
ValueError: exc desc
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
tuple: ret desc
|
|
108
|
+
""",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
assert docstring.style == DocstringStyle.GOOGLE
|
|
112
|
+
assert docstring.short_description == 'Short description'
|
|
113
|
+
assert docstring.long_description == (
|
|
114
|
+
'Long description\n\n'
|
|
115
|
+
'Causing people to indent:\n\n'
|
|
116
|
+
' A lot sometimes'
|
|
117
|
+
)
|
|
118
|
+
assert docstring.description == (
|
|
119
|
+
'Short description\n\n'
|
|
120
|
+
'Long description\n\n'
|
|
121
|
+
'Causing people to indent:\n\n'
|
|
122
|
+
' A lot sometimes'
|
|
123
|
+
)
|
|
124
|
+
assert len(docstring.params) == 3
|
|
125
|
+
assert docstring.params[0].arg_name == 'spam'
|
|
126
|
+
assert docstring.params[0].type_name is None
|
|
127
|
+
assert docstring.params[0].description == 'spam desc'
|
|
128
|
+
assert docstring.params[1].arg_name == 'bla'
|
|
129
|
+
assert docstring.params[1].type_name == 'int'
|
|
130
|
+
assert docstring.params[1].description == 'bla desc'
|
|
131
|
+
assert docstring.params[2].arg_name == 'yay'
|
|
132
|
+
assert docstring.params[2].type_name == 'str'
|
|
133
|
+
assert docstring.params[2].description == ''
|
|
134
|
+
assert len(docstring.raises) == 1
|
|
135
|
+
assert docstring.raises[0].type_name == 'ValueError'
|
|
136
|
+
assert docstring.raises[0].description == 'exc desc'
|
|
137
|
+
assert docstring.returns is not None
|
|
138
|
+
assert docstring.returns.type_name == 'tuple'
|
|
139
|
+
assert docstring.returns.description == 'ret desc'
|
|
140
|
+
assert docstring.many_returns is not None
|
|
141
|
+
assert len(docstring.many_returns) == 1
|
|
142
|
+
assert docstring.many_returns[0] == docstring.returns
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def test_numpydoc() -> None:
|
|
146
|
+
"""Test numpydoc-style parser autodetection."""
|
|
147
|
+
docstring = parse(
|
|
148
|
+
"""Short description
|
|
149
|
+
|
|
150
|
+
Long description
|
|
151
|
+
|
|
152
|
+
Causing people to indent:
|
|
153
|
+
|
|
154
|
+
A lot sometimes
|
|
155
|
+
|
|
156
|
+
Parameters
|
|
157
|
+
----------
|
|
158
|
+
spam
|
|
159
|
+
spam desc
|
|
160
|
+
bla : int
|
|
161
|
+
bla desc
|
|
162
|
+
yay : str
|
|
163
|
+
|
|
164
|
+
Raises
|
|
165
|
+
------
|
|
166
|
+
ValueError
|
|
167
|
+
exc desc
|
|
168
|
+
|
|
169
|
+
Other Parameters
|
|
170
|
+
----------------
|
|
171
|
+
this_guy : int, optional
|
|
172
|
+
you know him
|
|
173
|
+
|
|
174
|
+
Returns
|
|
175
|
+
-------
|
|
176
|
+
tuple
|
|
177
|
+
ret desc
|
|
178
|
+
|
|
179
|
+
See Also
|
|
180
|
+
--------
|
|
181
|
+
multiple lines...
|
|
182
|
+
something else?
|
|
183
|
+
|
|
184
|
+
Warnings
|
|
185
|
+
--------
|
|
186
|
+
multiple lines...
|
|
187
|
+
none of this is real!
|
|
188
|
+
""",
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
assert docstring.style == DocstringStyle.NUMPYDOC
|
|
192
|
+
assert docstring.short_description == 'Short description'
|
|
193
|
+
assert docstring.long_description == (
|
|
194
|
+
'Long description\n\n'
|
|
195
|
+
'Causing people to indent:\n\n'
|
|
196
|
+
' A lot sometimes'
|
|
197
|
+
)
|
|
198
|
+
assert docstring.description == (
|
|
199
|
+
'Short description\n\n'
|
|
200
|
+
'Long description\n\n'
|
|
201
|
+
'Causing people to indent:\n\n'
|
|
202
|
+
' A lot sometimes'
|
|
203
|
+
)
|
|
204
|
+
assert len(docstring.params) == 4
|
|
205
|
+
assert docstring.params[0].arg_name == 'spam'
|
|
206
|
+
assert docstring.params[0].type_name is None
|
|
207
|
+
assert docstring.params[0].description == 'spam desc'
|
|
208
|
+
assert docstring.params[1].arg_name == 'bla'
|
|
209
|
+
assert docstring.params[1].type_name == 'int'
|
|
210
|
+
assert docstring.params[1].description == 'bla desc'
|
|
211
|
+
assert docstring.params[2].arg_name == 'yay'
|
|
212
|
+
assert docstring.params[2].type_name == 'str'
|
|
213
|
+
assert docstring.params[2].description is None
|
|
214
|
+
assert docstring.params[3].arg_name == 'this_guy'
|
|
215
|
+
assert docstring.params[3].type_name == 'int'
|
|
216
|
+
assert docstring.params[3].is_optional
|
|
217
|
+
assert docstring.params[3].description == 'you know him'
|
|
218
|
+
|
|
219
|
+
assert len(docstring.raises) == 1
|
|
220
|
+
assert docstring.raises[0].type_name == 'ValueError'
|
|
221
|
+
assert docstring.raises[0].description == 'exc desc'
|
|
222
|
+
assert docstring.returns is not None
|
|
223
|
+
assert docstring.returns.type_name == 'tuple'
|
|
224
|
+
assert docstring.returns.description == 'ret desc'
|
|
225
|
+
assert docstring.many_returns is not None
|
|
226
|
+
assert len(docstring.many_returns) == 1
|
|
227
|
+
assert docstring.many_returns[0] == docstring.returns
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def test_autodetection_error_detection() -> None:
|
|
231
|
+
"""Test autodection for the case where one of the parsers throws an error
|
|
232
|
+
and another one succeeds.
|
|
233
|
+
"""
|
|
234
|
+
source = """
|
|
235
|
+
Does something useless
|
|
236
|
+
|
|
237
|
+
:param 3 + 3 a: a param
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
with pytest.raises(ParseError):
|
|
241
|
+
# assert that one of the parsers does raise
|
|
242
|
+
parse(source, DocstringStyle.REST)
|
|
243
|
+
|
|
244
|
+
# assert that autodetection still works
|
|
245
|
+
docstring = parse(source)
|
|
246
|
+
|
|
247
|
+
assert docstring
|
|
248
|
+
assert docstring.style == DocstringStyle.GOOGLE
|