Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
singlestore-labs
GitHub Repository: singlestore-labs/singlestoredb-python
Path: blob/main/singlestoredb/docstring/common.py
469 views
1
"""Common methods for parsing."""
2
import enum
3
import typing as T
4
5
PARAM_KEYWORDS = {
6
'param',
7
'parameter',
8
'arg',
9
'argument',
10
'attribute',
11
'key',
12
'keyword',
13
}
14
RAISES_KEYWORDS = {'raises', 'raise', 'except', 'exception'}
15
DEPRECATION_KEYWORDS = {'deprecation', 'deprecated'}
16
RETURNS_KEYWORDS = {'return', 'returns'}
17
YIELDS_KEYWORDS = {'yield', 'yields'}
18
EXAMPLES_KEYWORDS = {'example', 'examples'}
19
20
21
class ParseError(RuntimeError):
22
"""Base class for all parsing related errors."""
23
24
25
class DocstringStyle(enum.Enum):
26
"""Docstring style."""
27
28
REST = 1
29
GOOGLE = 2
30
NUMPYDOC = 3
31
EPYDOC = 4
32
AUTO = 255
33
34
35
class RenderingStyle(enum.Enum):
36
"""Rendering style when unparsing parsed docstrings."""
37
38
COMPACT = 1
39
CLEAN = 2
40
EXPANDED = 3
41
42
43
class DocstringMeta:
44
"""Docstring meta information.
45
46
Symbolizes lines in form of
47
48
:param arg: description
49
:raises ValueError: if something happens
50
"""
51
52
def __init__(
53
self, args: T.List[str], description: T.Optional[str],
54
) -> None:
55
"""Initialize self.
56
57
:param args: list of arguments. The exact content of this variable is
58
dependent on the kind of docstring; it's used to distinguish
59
between custom docstring meta information items.
60
:param description: associated docstring description.
61
"""
62
self.args = args
63
self.description = description
64
65
66
class DocstringParam(DocstringMeta):
67
"""DocstringMeta symbolizing :param metadata."""
68
69
def __init__(
70
self,
71
args: T.List[str],
72
description: T.Optional[str],
73
arg_name: str,
74
type_name: T.Optional[str],
75
is_optional: T.Optional[bool],
76
default: T.Optional[str],
77
) -> None:
78
"""Initialize self."""
79
super().__init__(args, description)
80
self.arg_name = arg_name
81
self.type_name = type_name
82
self.is_optional = is_optional
83
self.default = default
84
85
86
class DocstringReturns(DocstringMeta):
87
"""DocstringMeta symbolizing :returns or :yields metadata."""
88
89
def __init__(
90
self,
91
args: T.List[str],
92
description: T.Optional[str],
93
type_name: T.Optional[str],
94
is_generator: bool,
95
return_name: T.Optional[str] = None,
96
) -> None:
97
"""Initialize self."""
98
super().__init__(args, description)
99
self.type_name = type_name
100
self.is_generator = is_generator
101
self.return_name = return_name
102
103
104
class DocstringRaises(DocstringMeta):
105
"""DocstringMeta symbolizing :raises metadata."""
106
107
def __init__(
108
self,
109
args: T.List[str],
110
description: T.Optional[str],
111
type_name: T.Optional[str],
112
) -> None:
113
"""Initialize self."""
114
super().__init__(args, description)
115
self.type_name = type_name
116
self.description = description
117
118
119
class DocstringDeprecated(DocstringMeta):
120
"""DocstringMeta symbolizing deprecation metadata."""
121
122
def __init__(
123
self,
124
args: T.List[str],
125
description: T.Optional[str],
126
version: T.Optional[str],
127
) -> None:
128
"""Initialize self."""
129
super().__init__(args, description)
130
self.version = version
131
self.description = description
132
133
134
class DocstringExample(DocstringMeta):
135
"""DocstringMeta symbolizing example metadata."""
136
137
def __init__(
138
self,
139
args: T.List[str],
140
snippet: T.Optional[str],
141
description: T.Optional[str],
142
post_snippet: T.Optional[str] = None,
143
) -> None:
144
"""Initialize self."""
145
super().__init__(args, description)
146
self.snippet = snippet
147
self.description = description
148
self.post_snippet = post_snippet
149
150
151
class Docstring:
152
"""Docstring object representation."""
153
154
def __init__(
155
self,
156
style=None, # type: T.Optional[DocstringStyle]
157
) -> None:
158
"""Initialize self."""
159
self.short_description = None # type: T.Optional[str]
160
self.long_description = None # type: T.Optional[str]
161
self.blank_after_short_description = False
162
self.blank_after_long_description = False
163
self.meta = [] # type: T.List[DocstringMeta]
164
self.style = style # type: T.Optional[DocstringStyle]
165
166
@property
167
def description(self) -> T.Optional[str]:
168
"""Return the full description of the function
169
170
Returns None if the docstring did not include any description
171
"""
172
ret = []
173
if self.short_description:
174
ret.append(self.short_description)
175
if self.blank_after_short_description:
176
ret.append('')
177
if self.long_description:
178
ret.append(self.long_description)
179
180
if not ret:
181
return None
182
183
return '\n'.join(ret)
184
185
@property
186
def params(self) -> T.List[DocstringParam]:
187
"""Return a list of information on function params."""
188
return [item for item in self.meta if isinstance(item, DocstringParam)]
189
190
@property
191
def raises(self) -> T.List[DocstringRaises]:
192
"""Return a list of information on the exceptions that the function
193
may raise.
194
"""
195
return [
196
item for item in self.meta if isinstance(item, DocstringRaises)
197
]
198
199
@property
200
def returns(self) -> T.Optional[DocstringReturns]:
201
"""Return a single information on function return.
202
203
Takes the first return information.
204
"""
205
for item in self.meta:
206
if isinstance(item, DocstringReturns):
207
return item
208
return None
209
210
@property
211
def many_returns(self) -> T.List[DocstringReturns]:
212
"""Return a list of information on function return."""
213
return [
214
item for item in self.meta if isinstance(item, DocstringReturns)
215
]
216
217
@property
218
def deprecation(self) -> T.Optional[DocstringDeprecated]:
219
"""Return a single information on function deprecation notes."""
220
for item in self.meta:
221
if isinstance(item, DocstringDeprecated):
222
return item
223
return None
224
225
@property
226
def examples(self) -> T.List[DocstringExample]:
227
"""Return a list of information on function examples."""
228
return [
229
item for item in self.meta if isinstance(item, DocstringExample)
230
]
231
232