docsig 0.44.2__tar.gz → 0.45.0__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Stephen Whitlock
3
+ Copyright (c) 2024 Stephen Whitlock
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
docsig-0.45.0/PKG-INFO ADDED
@@ -0,0 +1,243 @@
1
+ Metadata-Version: 2.1
2
+ Name: docsig
3
+ Version: 0.45.0
4
+ Summary: Check signature params for proper documentation
5
+ Home-page: https://pypi.org/project/docsig/
6
+ License: MIT
7
+ Keywords: check,docs,docstring,params,signature
8
+ Author: jshwi
9
+ Author-email: stephen@jshwisolutions.com
10
+ Maintainer: jshwi
11
+ Maintainer-email: stephen@jshwisolutions.com
12
+ Requires-Python: >=3.8,<4.0
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.8
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Requires-Dist: Pygments (>=2.13.0,<3.0.0)
21
+ Requires-Dist: Sphinx (>=7.0.0,<8.0.0)
22
+ Requires-Dist: arcon (>=0.3.1)
23
+ Requires-Dist: astroid (>=3.0.1,<4.0.0)
24
+ Requires-Dist: object-colors (>=2.1.0,<3.0.0)
25
+ Requires-Dist: typing-extensions (>=4.8.0,<5.0.0)
26
+ Project-URL: Documentation, https://docsig.readthedocs.io/en/latest
27
+ Project-URL: Repository, https://github.com/jshwi/docsig
28
+ Description-Content-Type: text/x-rst
29
+
30
+ |
31
+
32
+ .. image:: https://raw.githubusercontent.com/jshwi/docsig/master/docs/static/docsig.svg
33
+ :alt: docsig logo
34
+ :width: 50%
35
+ :align: center
36
+
37
+ |
38
+
39
+ .. image:: https://img.shields.io/badge/License-MIT-yellow.svg
40
+ :target: https://opensource.org/licenses/MIT
41
+ :alt: License
42
+ .. image:: https://img.shields.io/pypi/v/docsig
43
+ :target: https://pypi.org/project/docsig/
44
+ :alt: PyPI
45
+ .. image:: https://github.com/jshwi/docsig/actions/workflows/build.yaml/badge.svg
46
+ :target: https://github.com/jshwi/docsig/actions/workflows/build.yaml
47
+ :alt: CI
48
+ .. image:: https://github.com/jshwi/docsig/actions/workflows/codeql-analysis.yml/badge.svg
49
+ :target: https://github.com/jshwi/docsig/actions/workflows/codeql-analysis.yml
50
+ :alt: CodeQL
51
+ .. image:: https://results.pre-commit.ci/badge/github/jshwi/docsig/master.svg
52
+ :target: https://results.pre-commit.ci/latest/github/jshwi/docsig/master
53
+ :alt: pre-commit.ci status
54
+ .. image:: https://codecov.io/gh/jshwi/docsig/branch/master/graph/badge.svg
55
+ :target: https://codecov.io/gh/jshwi/docsig
56
+ :alt: codecov.io
57
+ .. image:: https://readthedocs.org/projects/docsig/badge/?version=latest
58
+ :target: https://docsig.readthedocs.io/en/latest/?badge=latest
59
+ :alt: readthedocs.org
60
+ .. image:: https://img.shields.io/badge/python-3.8-blue.svg
61
+ :target: https://www.python.org/downloads/release/python-380
62
+ :alt: python3.8
63
+ .. image:: https://img.shields.io/badge/code%20style-black-000000.svg
64
+ :target: https://github.com/psf/black
65
+ :alt: Black
66
+ .. image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336
67
+ :target: https://pycqa.github.io/isort/
68
+ :alt: isort
69
+ .. image:: https://img.shields.io/badge/%20formatter-docformatter-fedcba.svg
70
+ :target: https://github.com/PyCQA/docformatter
71
+ :alt: docformatter
72
+ .. image:: https://img.shields.io/badge/linting-pylint-yellowgreen
73
+ :target: https://github.com/PyCQA/pylint
74
+ :alt: pylint
75
+ .. image:: https://img.shields.io/badge/security-bandit-yellow.svg
76
+ :target: https://github.com/PyCQA/bandit
77
+ :alt: Security Status
78
+ .. image:: https://snyk.io/test/github/jshwi/docsig/badge.svg
79
+ :target: https://snyk.io/test/github/jshwi/docsig/badge.svg
80
+ :alt: Known Vulnerabilities
81
+ .. image:: https://snyk.io/advisor/python/docsig/badge.svg
82
+ :target: https://snyk.io/advisor/python/docsig
83
+ :alt: docsig
84
+
85
+ Check signature params for proper documentation
86
+ -----------------------------------------------
87
+
88
+ Supports reStructuredText (``Sphinx``), ``NumPy``, and ``Google``
89
+
90
+ Contributing
91
+ ------------
92
+ If you are interested in contributing to ``docsig`` please read about contributing `here <https://github.com/jshwi/docsig/blob/master/CONTRIBUTING.md>`__
93
+
94
+ Installation
95
+ ------------
96
+
97
+ .. code-block:: console
98
+
99
+ $ pip install docsig
100
+
101
+ Usage
102
+ -----
103
+
104
+ Commandline
105
+ ***********
106
+
107
+ .. code-block:: console
108
+
109
+ usage: docsig [-h] [-v] [-l] [-c | -C] [-D] [-m] [-o] [-p] [-P] [-i] [-a] [-k]
110
+ [-n] [-S] [-s STR] [-d LIST] [-t LIST] [-e EXCLUDE]
111
+ [path [path ...]]
112
+
113
+ Check signature params for proper documentation
114
+
115
+ positional arguments:
116
+ path directories or files to check
117
+
118
+ optional arguments:
119
+ -h, --help show this help message and exit
120
+ -v, --version show program's version number and exit
121
+ -l, --list-checks display a list of all checks and their messages
122
+ -c, --check-class check class docstrings
123
+ -C, --check-class-constructor check __init__ methods. Note: mutually
124
+ incompatible with -c
125
+ -D, --check-dunders check dunder methods
126
+ -m, --check-protected-class-methods check public methods belonging to protected
127
+ classes
128
+ -o, --check-overridden check overridden methods
129
+ -p, --check-protected check protected functions and classes
130
+ -P, --check-property-returns check property return values
131
+ -i, --ignore-no-params ignore docstrings where parameters are not
132
+ documented
133
+ -a, --ignore-args ignore args prefixed with an asterisk
134
+ -k, --ignore-kwargs ignore kwargs prefixed with two asterisks
135
+ -n, --no-ansi disable ansi output
136
+ -S, --summary print a summarised report
137
+ -s STR, --string STR string to parse instead of files
138
+ -d LIST, --disable LIST comma separated list of rules to disable
139
+ -t LIST, --target LIST comma separated list of rules to target
140
+ -e EXCLUDE, --exclude EXCLUDE regular expression of files or dirs to exclude
141
+ from checks
142
+
143
+ Options can also be configured with the pyproject.toml file
144
+
145
+ If you find the output is too verbose then the report can be configured to display a summary
146
+
147
+ .. code-block:: toml
148
+
149
+ [tool.docsig]
150
+ check-dunders = false
151
+ check-overridden = false
152
+ check-protected = false
153
+ summary = true
154
+ disable = [
155
+ "E101",
156
+ "E102",
157
+ "E103",
158
+ ]
159
+ target = [
160
+ "E102",
161
+ "E103",
162
+ "E104",
163
+ ]
164
+
165
+ API
166
+ ***
167
+
168
+ .. code-block:: python
169
+
170
+ >>> from docsig import docsig
171
+
172
+ .. code-block:: python
173
+
174
+ >>> string = """
175
+ ... def function(param1, param2, param3) -> None:
176
+ ... '''
177
+ ...
178
+ ... :param param1: About param1.
179
+ ... :param param2: About param2.
180
+ ... :param param3: About param3.
181
+ ... '''
182
+ ... """
183
+ >>> docsig(string=string)
184
+ 0
185
+
186
+ .. code-block:: python
187
+
188
+ >>> string = """
189
+ ... def function(param1, param2) -> None:
190
+ ... '''
191
+ ...
192
+ ... :param param1: About param1.
193
+ ... :param param2: About param2.
194
+ ... :param param3: About param3.
195
+ ... '''
196
+ ... """
197
+ >>> docsig(string=string)
198
+ 2
199
+ -
200
+ def function(✓param1, ✓param2, ✖None) -> ✓None:
201
+ """
202
+ :param param1: ✓
203
+ :param param2: ✓
204
+ :param param3: ✖
205
+ """
206
+ <BLANKLINE>
207
+ E102: includes parameters that do not exist (params-do-not-exist)
208
+ <BLANKLINE>
209
+ 1
210
+
211
+ A full list of checks can be found `here <https://docsig.readthedocs.io/en/latest/docsig.html#docsig-messages>`__
212
+
213
+ Message Control
214
+ ***************
215
+
216
+ `Documentation on message control <https://github.com/jshwi/docsig/blob/master/docs/examples/message-control.rst>`_
217
+
218
+ Classes
219
+ *******
220
+
221
+ `Documenting classes <https://github.com/jshwi/docsig/blob/master/docs/examples/classes.rst>`_
222
+
223
+ pre-commit
224
+ **********
225
+
226
+ ``docsig`` can be used as a `pre-commit <https://pre-commit.com>`_ hook
227
+
228
+ It can be added to your .pre-commit-config.yaml as follows:
229
+
230
+ .. code-block:: yaml
231
+
232
+ repos:
233
+ - repo: https://github.com/jshwi/docsig
234
+ rev: v0.45.0
235
+ hooks:
236
+ - id: docsig
237
+ args:
238
+ - "--check-class"
239
+ - "--check-dunders"
240
+ - "--check-overridden"
241
+ - "--check-protected"
242
+ - "--summary"
243
+
@@ -0,0 +1,213 @@
1
+ |
2
+
3
+ .. image:: https://raw.githubusercontent.com/jshwi/docsig/master/docs/static/docsig.svg
4
+ :alt: docsig logo
5
+ :width: 50%
6
+ :align: center
7
+
8
+ |
9
+
10
+ .. image:: https://img.shields.io/badge/License-MIT-yellow.svg
11
+ :target: https://opensource.org/licenses/MIT
12
+ :alt: License
13
+ .. image:: https://img.shields.io/pypi/v/docsig
14
+ :target: https://pypi.org/project/docsig/
15
+ :alt: PyPI
16
+ .. image:: https://github.com/jshwi/docsig/actions/workflows/build.yaml/badge.svg
17
+ :target: https://github.com/jshwi/docsig/actions/workflows/build.yaml
18
+ :alt: CI
19
+ .. image:: https://github.com/jshwi/docsig/actions/workflows/codeql-analysis.yml/badge.svg
20
+ :target: https://github.com/jshwi/docsig/actions/workflows/codeql-analysis.yml
21
+ :alt: CodeQL
22
+ .. image:: https://results.pre-commit.ci/badge/github/jshwi/docsig/master.svg
23
+ :target: https://results.pre-commit.ci/latest/github/jshwi/docsig/master
24
+ :alt: pre-commit.ci status
25
+ .. image:: https://codecov.io/gh/jshwi/docsig/branch/master/graph/badge.svg
26
+ :target: https://codecov.io/gh/jshwi/docsig
27
+ :alt: codecov.io
28
+ .. image:: https://readthedocs.org/projects/docsig/badge/?version=latest
29
+ :target: https://docsig.readthedocs.io/en/latest/?badge=latest
30
+ :alt: readthedocs.org
31
+ .. image:: https://img.shields.io/badge/python-3.8-blue.svg
32
+ :target: https://www.python.org/downloads/release/python-380
33
+ :alt: python3.8
34
+ .. image:: https://img.shields.io/badge/code%20style-black-000000.svg
35
+ :target: https://github.com/psf/black
36
+ :alt: Black
37
+ .. image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336
38
+ :target: https://pycqa.github.io/isort/
39
+ :alt: isort
40
+ .. image:: https://img.shields.io/badge/%20formatter-docformatter-fedcba.svg
41
+ :target: https://github.com/PyCQA/docformatter
42
+ :alt: docformatter
43
+ .. image:: https://img.shields.io/badge/linting-pylint-yellowgreen
44
+ :target: https://github.com/PyCQA/pylint
45
+ :alt: pylint
46
+ .. image:: https://img.shields.io/badge/security-bandit-yellow.svg
47
+ :target: https://github.com/PyCQA/bandit
48
+ :alt: Security Status
49
+ .. image:: https://snyk.io/test/github/jshwi/docsig/badge.svg
50
+ :target: https://snyk.io/test/github/jshwi/docsig/badge.svg
51
+ :alt: Known Vulnerabilities
52
+ .. image:: https://snyk.io/advisor/python/docsig/badge.svg
53
+ :target: https://snyk.io/advisor/python/docsig
54
+ :alt: docsig
55
+
56
+ Check signature params for proper documentation
57
+ -----------------------------------------------
58
+
59
+ Supports reStructuredText (``Sphinx``), ``NumPy``, and ``Google``
60
+
61
+ Contributing
62
+ ------------
63
+ If you are interested in contributing to ``docsig`` please read about contributing `here <https://github.com/jshwi/docsig/blob/master/CONTRIBUTING.md>`__
64
+
65
+ Installation
66
+ ------------
67
+
68
+ .. code-block:: console
69
+
70
+ $ pip install docsig
71
+
72
+ Usage
73
+ -----
74
+
75
+ Commandline
76
+ ***********
77
+
78
+ .. code-block:: console
79
+
80
+ usage: docsig [-h] [-v] [-l] [-c | -C] [-D] [-m] [-o] [-p] [-P] [-i] [-a] [-k]
81
+ [-n] [-S] [-s STR] [-d LIST] [-t LIST] [-e EXCLUDE]
82
+ [path [path ...]]
83
+
84
+ Check signature params for proper documentation
85
+
86
+ positional arguments:
87
+ path directories or files to check
88
+
89
+ optional arguments:
90
+ -h, --help show this help message and exit
91
+ -v, --version show program's version number and exit
92
+ -l, --list-checks display a list of all checks and their messages
93
+ -c, --check-class check class docstrings
94
+ -C, --check-class-constructor check __init__ methods. Note: mutually
95
+ incompatible with -c
96
+ -D, --check-dunders check dunder methods
97
+ -m, --check-protected-class-methods check public methods belonging to protected
98
+ classes
99
+ -o, --check-overridden check overridden methods
100
+ -p, --check-protected check protected functions and classes
101
+ -P, --check-property-returns check property return values
102
+ -i, --ignore-no-params ignore docstrings where parameters are not
103
+ documented
104
+ -a, --ignore-args ignore args prefixed with an asterisk
105
+ -k, --ignore-kwargs ignore kwargs prefixed with two asterisks
106
+ -n, --no-ansi disable ansi output
107
+ -S, --summary print a summarised report
108
+ -s STR, --string STR string to parse instead of files
109
+ -d LIST, --disable LIST comma separated list of rules to disable
110
+ -t LIST, --target LIST comma separated list of rules to target
111
+ -e EXCLUDE, --exclude EXCLUDE regular expression of files or dirs to exclude
112
+ from checks
113
+
114
+ Options can also be configured with the pyproject.toml file
115
+
116
+ If you find the output is too verbose then the report can be configured to display a summary
117
+
118
+ .. code-block:: toml
119
+
120
+ [tool.docsig]
121
+ check-dunders = false
122
+ check-overridden = false
123
+ check-protected = false
124
+ summary = true
125
+ disable = [
126
+ "E101",
127
+ "E102",
128
+ "E103",
129
+ ]
130
+ target = [
131
+ "E102",
132
+ "E103",
133
+ "E104",
134
+ ]
135
+
136
+ API
137
+ ***
138
+
139
+ .. code-block:: python
140
+
141
+ >>> from docsig import docsig
142
+
143
+ .. code-block:: python
144
+
145
+ >>> string = """
146
+ ... def function(param1, param2, param3) -> None:
147
+ ... '''
148
+ ...
149
+ ... :param param1: About param1.
150
+ ... :param param2: About param2.
151
+ ... :param param3: About param3.
152
+ ... '''
153
+ ... """
154
+ >>> docsig(string=string)
155
+ 0
156
+
157
+ .. code-block:: python
158
+
159
+ >>> string = """
160
+ ... def function(param1, param2) -> None:
161
+ ... '''
162
+ ...
163
+ ... :param param1: About param1.
164
+ ... :param param2: About param2.
165
+ ... :param param3: About param3.
166
+ ... '''
167
+ ... """
168
+ >>> docsig(string=string)
169
+ 2
170
+ -
171
+ def function(✓param1, ✓param2, ✖None) -> ✓None:
172
+ """
173
+ :param param1: ✓
174
+ :param param2: ✓
175
+ :param param3: ✖
176
+ """
177
+ <BLANKLINE>
178
+ E102: includes parameters that do not exist (params-do-not-exist)
179
+ <BLANKLINE>
180
+ 1
181
+
182
+ A full list of checks can be found `here <https://docsig.readthedocs.io/en/latest/docsig.html#docsig-messages>`__
183
+
184
+ Message Control
185
+ ***************
186
+
187
+ `Documentation on message control <https://github.com/jshwi/docsig/blob/master/docs/examples/message-control.rst>`_
188
+
189
+ Classes
190
+ *******
191
+
192
+ `Documenting classes <https://github.com/jshwi/docsig/blob/master/docs/examples/classes.rst>`_
193
+
194
+ pre-commit
195
+ **********
196
+
197
+ ``docsig`` can be used as a `pre-commit <https://pre-commit.com>`_ hook
198
+
199
+ It can be added to your .pre-commit-config.yaml as follows:
200
+
201
+ .. code-block:: yaml
202
+
203
+ repos:
204
+ - repo: https://github.com/jshwi/docsig
205
+ rev: v0.45.0
206
+ hooks:
207
+ - id: docsig
208
+ args:
209
+ - "--check-class"
210
+ - "--check-dunders"
211
+ - "--check-overridden"
212
+ - "--check-protected"
213
+ - "--summary"
@@ -1,4 +1,5 @@
1
1
  """Check signature params for proper documentation."""
2
+
2
3
  from . import messages
3
4
  from ._core import docsig
4
5
  from ._main import main
@@ -4,6 +4,7 @@ docsig.__main__
4
4
 
5
5
  Module entry point.
6
6
  """
7
+
7
8
  import sys as _sys
8
9
 
9
10
  from docsig import main
@@ -2,6 +2,7 @@
2
2
  docsig._config
3
3
  ==============
4
4
  """
5
+
5
6
  from argparse import HelpFormatter as _HelpFormatter
6
7
  from pathlib import Path as _Path
7
8
 
@@ -132,3 +133,8 @@ class Parser(_ArgumentParser):
132
133
  metavar="LIST",
133
134
  help="comma separated list of rules to target",
134
135
  )
136
+ self.add_argument(
137
+ "-e",
138
+ "--exclude",
139
+ help="regular expression of files or dirs to exclude from checks",
140
+ )
@@ -2,6 +2,7 @@
2
2
  docsig._core
3
3
  ============
4
4
  """
5
+
5
6
  from __future__ import annotations as _
6
7
 
7
8
  from pathlib import Path as _Path
@@ -18,6 +19,25 @@ from ._report import generate_report as _generate_report
18
19
  from .messages import TEMPLATE as _TEMPLATE
19
20
  from .messages import E as _E
20
21
 
22
+ _DEFAULT_EXCLUDES = """\
23
+ (?x)^(
24
+ |\\.?venv
25
+ |\\.git
26
+ |\\.hg
27
+ |\\.idea
28
+ |\\.mypy_cache
29
+ |\\.nox
30
+ |\\.pytest_cache
31
+ |\\.svn
32
+ |\\.tox
33
+ |\\.vscode
34
+ |_?build
35
+ |__pycache__
36
+ |dist
37
+ |node_modules
38
+ )$
39
+ """
40
+
21
41
 
22
42
  def _print_checks() -> None:
23
43
  for msg in _E.values():
@@ -81,6 +101,7 @@ def docsig( # pylint: disable=too-many-locals,too-many-arguments
81
101
  summary: bool = False,
82
102
  targets: list[_Message] | None = None,
83
103
  disable: list[_Message] | None = None,
104
+ exclude: str | None = None,
84
105
  ) -> int:
85
106
  """Package's core functionality.
86
107
 
@@ -111,15 +132,22 @@ def docsig( # pylint: disable=too-many-locals,too-many-arguments
111
132
  :param summary: Print a summarised report.
112
133
  :param targets: List of errors to target.
113
134
  :param disable: List of errors to disable.
135
+ :param exclude: Regular expression of files and dirs to exclude from
136
+ checks.
114
137
  :return: Exit status for whether test failed or not.
115
138
  """
116
139
  if list_checks:
117
140
  return int(bool(_print_checks())) # type: ignore
118
141
 
142
+ excludes = [_DEFAULT_EXCLUDES]
143
+ if exclude is not None:
144
+ excludes.append(exclude)
145
+
119
146
  modules = _Modules(
120
147
  *tuple(_Path(i) for i in path),
121
148
  disable=disable or [],
122
149
  string=string,
150
+ excludes=excludes,
123
151
  ignore_args=ignore_args,
124
152
  ignore_kwargs=ignore_kwargs,
125
153
  check_class_constructor=check_class_constructor,
@@ -2,6 +2,7 @@
2
2
  docsig._decorators
3
3
  ==================
4
4
  """
5
+
5
6
  from __future__ import annotations as _
6
7
 
7
8
  import functools as _functools
@@ -2,6 +2,7 @@
2
2
  docsig._disable
3
3
  ===============
4
4
  """
5
+
5
6
  from __future__ import annotations as _
6
7
 
7
8
  import re as _re
@@ -2,6 +2,7 @@
2
2
  docsig._display
3
3
  ===============
4
4
  """
5
+
5
6
  from __future__ import annotations as _
6
7
 
7
8
  import typing as _t
@@ -2,6 +2,7 @@
2
2
  docsig._function
3
3
  ================
4
4
  """
5
+
5
6
  from __future__ import annotations as _
6
7
 
7
8
  import re as _re
@@ -318,7 +319,9 @@ class Function: # pylint: disable=too-many-arguments
318
319
  def _decorated_with(self, name: str) -> bool:
319
320
  if self._node.decorators is not None:
320
321
  for dec in self._node.decorators.nodes:
321
- return isinstance(dec, _ast.Name) and dec.name == name
322
+ return (isinstance(dec, _ast.Name) and dec.name == name) or (
323
+ isinstance(dec, _ast.Attribute) and dec.attrname == name
324
+ )
322
325
 
323
326
  return False
324
327
 
@@ -330,7 +333,13 @@ class Function: # pylint: disable=too-many-arguments
330
333
  @property
331
334
  def isproperty(self) -> bool:
332
335
  """Boolean value for whether function is a property."""
333
- return self.ismethod and self._decorated_with("property")
336
+ valid_properties = [
337
+ "property",
338
+ "cached_property",
339
+ ]
340
+ return self.ismethod and any(
341
+ self._decorated_with(i) for i in valid_properties
342
+ )
334
343
 
335
344
  @property
336
345
  def isoverloaded(self) -> bool:
@@ -2,6 +2,7 @@
2
2
  docsig._hooks
3
3
  =============
4
4
  """
5
+
5
6
  import sys as _sys
6
7
  from os import environ as _e
7
8
 
@@ -4,6 +4,7 @@ docsig._main
4
4
 
5
5
  Contains package entry point.
6
6
  """
7
+
7
8
  from __future__ import annotations as _
8
9
 
9
10
  from ._config import Parser as _Parser
@@ -40,4 +41,5 @@ def main() -> str | int:
40
41
  summary=parser.args.summary,
41
42
  targets=parser.args.target,
42
43
  disable=parser.args.disable,
44
+ exclude=parser.args.exclude,
43
45
  )
@@ -2,6 +2,7 @@
2
2
  docsig._message
3
3
  ===============
4
4
  """
5
+
5
6
  from __future__ import annotations as _
6
7
 
7
8
  import typing as _t