sphinx-autoapi 3.3.2__tar.gz → 3.3.3__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.
Files changed (132) hide show
  1. {sphinx_autoapi-3.3.2/sphinx_autoapi.egg-info → sphinx_autoapi-3.3.3}/PKG-INFO +14 -19
  2. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/__init__.py +2 -2
  3. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/_astroid_utils.py +1 -1
  4. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/_objects.py +3 -0
  5. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/_parser.py +20 -0
  6. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/module.rst +2 -16
  7. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/property.rst +1 -0
  8. sphinx_autoapi-3.3.3/pyproject.toml +103 -0
  9. sphinx_autoapi-3.3.2/CHANGELOG.rst +0 -771
  10. sphinx_autoapi-3.3.2/LICENSE.rst +0 -26
  11. sphinx_autoapi-3.3.2/MANIFEST.in +0 -4
  12. sphinx_autoapi-3.3.2/PKG-INFO +0 -158
  13. sphinx_autoapi-3.3.2/pyproject.toml +0 -54
  14. sphinx_autoapi-3.3.2/setup.cfg +0 -60
  15. sphinx_autoapi-3.3.2/setup.py +0 -2
  16. sphinx_autoapi-3.3.2/sphinx_autoapi.egg-info/SOURCES.txt +0 -130
  17. sphinx_autoapi-3.3.2/sphinx_autoapi.egg-info/dependency_links.txt +0 -1
  18. sphinx_autoapi-3.3.2/sphinx_autoapi.egg-info/requires.txt +0 -17
  19. sphinx_autoapi-3.3.2/sphinx_autoapi.egg-info/top_level.txt +0 -1
  20. sphinx_autoapi-3.3.2/tests/python/conftest.py +0 -66
  21. sphinx_autoapi-3.3.2/tests/python/pep695/conf.py +0 -18
  22. sphinx_autoapi-3.3.2/tests/python/pep695/example/example.py +0 -4
  23. sphinx_autoapi-3.3.2/tests/python/pep695/index.rst +0 -26
  24. sphinx_autoapi-3.3.2/tests/python/py310unionpipe/conf.py +0 -18
  25. sphinx_autoapi-3.3.2/tests/python/py310unionpipe/example/example.py +0 -18
  26. sphinx_autoapi-3.3.2/tests/python/py310unionpipe/index.rst +0 -26
  27. sphinx_autoapi-3.3.2/tests/python/py38positionalparams/conf.py +0 -17
  28. sphinx_autoapi-3.3.2/tests/python/py38positionalparams/example/example.py +0 -39
  29. sphinx_autoapi-3.3.2/tests/python/py38positionalparams/index.rst +0 -26
  30. sphinx_autoapi-3.3.2/tests/python/py3example/conf.py +0 -27
  31. sphinx_autoapi-3.3.2/tests/python/py3example/example/example.py +0 -217
  32. sphinx_autoapi-3.3.2/tests/python/py3example/example/example2.py +0 -2
  33. sphinx_autoapi-3.3.2/tests/python/py3example/index.rst +0 -25
  34. sphinx_autoapi-3.3.2/tests/python/py3implicitnamespace/conf.py +0 -18
  35. sphinx_autoapi-3.3.2/tests/python/py3implicitnamespace/index.rst +0 -26
  36. sphinx_autoapi-3.3.2/tests/python/py3implicitnamespace/namespace/example/__init__.py +0 -7
  37. sphinx_autoapi-3.3.2/tests/python/py3implicitnamespace/namespace/sibling/__init__.py +0 -8
  38. sphinx_autoapi-3.3.2/tests/python/py3implicitnamespace/namespace/sibling/sub_sibling.py +0 -8
  39. sphinx_autoapi-3.3.2/tests/python/pyannotationcommentsexample/conf.py +0 -18
  40. sphinx_autoapi-3.3.2/tests/python/pyannotationcommentsexample/example/example.py +0 -68
  41. sphinx_autoapi-3.3.2/tests/python/pyannotationcommentsexample/index.rst +0 -26
  42. sphinx_autoapi-3.3.2/tests/python/pyautodoc_typehints/conf.py +0 -28
  43. sphinx_autoapi-3.3.2/tests/python/pyautodoc_typehints/example/example.py +0 -8
  44. sphinx_autoapi-3.3.2/tests/python/pyautodoc_typehints/example/example2.py +0 -8
  45. sphinx_autoapi-3.3.2/tests/python/pyautodoc_typehints/index.rst +0 -25
  46. sphinx_autoapi-3.3.2/tests/python/pyemptyexample/conf.py +0 -26
  47. sphinx_autoapi-3.3.2/tests/python/pyemptyexample/index.rst +0 -25
  48. sphinx_autoapi-3.3.2/tests/python/pyexample/conf.py +0 -19
  49. sphinx_autoapi-3.3.2/tests/python/pyexample/example/example.py +0 -197
  50. sphinx_autoapi-3.3.2/tests/python/pyexample/index.rst +0 -22
  51. sphinx_autoapi-3.3.2/tests/python/pyexample/manualapi.rst +0 -9
  52. sphinx_autoapi-3.3.2/tests/python/pyexample/null.rst +0 -2
  53. sphinx_autoapi-3.3.2/tests/python/pyiexample/conf.py +0 -17
  54. sphinx_autoapi-3.3.2/tests/python/pyiexample/example/example.py +0 -2
  55. sphinx_autoapi-3.3.2/tests/python/pyiexample/example/example.pyi +0 -46
  56. sphinx_autoapi-3.3.2/tests/python/pyiexample/index.rst +0 -15
  57. sphinx_autoapi-3.3.2/tests/python/pyiexample2/conf.py +0 -16
  58. sphinx_autoapi-3.3.2/tests/python/pyiexample2/example/example.py +0 -8
  59. sphinx_autoapi-3.3.2/tests/python/pyiexample2/example/example.pyi +0 -2
  60. sphinx_autoapi-3.3.2/tests/python/pyiexample2/index.rst +0 -15
  61. sphinx_autoapi-3.3.2/tests/python/pyisubmoduleinit/conf.py +0 -16
  62. sphinx_autoapi-3.3.2/tests/python/pyisubmoduleinit/example/example.py +0 -0
  63. sphinx_autoapi-3.3.2/tests/python/pyisubmoduleinit/example/submodule_foo/__init__.pyi +0 -19
  64. sphinx_autoapi-3.3.2/tests/python/pyisubmoduleinit/index.rst +0 -15
  65. sphinx_autoapi-3.3.2/tests/python/pymovedconfpy/confpy/conf.py +0 -19
  66. sphinx_autoapi-3.3.2/tests/python/pymovedconfpy/example/example.py +0 -197
  67. sphinx_autoapi-3.3.2/tests/python/pymovedconfpy/index.rst +0 -22
  68. sphinx_autoapi-3.3.2/tests/python/pymovedconfpy/manualapi.rst +0 -9
  69. sphinx_autoapi-3.3.2/tests/python/pynorender/conf.py +0 -22
  70. sphinx_autoapi-3.3.2/tests/python/pynorender/example/_example.py +0 -7
  71. sphinx_autoapi-3.3.2/tests/python/pynorender/index.rst +0 -25
  72. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/__init__.py +0 -12
  73. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/_private_module.py +0 -11
  74. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/binary_data.py +0 -1
  75. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/foo.py +0 -68
  76. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/submodule.py +0 -6
  77. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/subpackage/__init__.py +0 -8
  78. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/subpackage/submodule.py +0 -21
  79. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/unicode_data.py +0 -1
  80. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/wildall/__init__.py +0 -1
  81. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/wildall/simple/__init__.py +0 -27
  82. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/wildcard/__init__.py +0 -1
  83. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/wildchain/__init__.py +0 -2
  84. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/complex/wildwildchain/__init__.py +0 -1
  85. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/conf.py +0 -17
  86. sphinx_autoapi-3.3.2/tests/python/pypackagecomplex/index.rst +0 -25
  87. sphinx_autoapi-3.3.2/tests/python/pypackageexample/conf.py +0 -18
  88. sphinx_autoapi-3.3.2/tests/python/pypackageexample/index.rst +0 -25
  89. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/__init__.py +0 -42
  90. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/_private_submodule.py +0 -6
  91. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/_private_subpackage/__init__.py +0 -13
  92. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/_private_subpackage/submodule.py +0 -41
  93. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/_private_subpackage/subpackage/__init__.py +0 -13
  94. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/_private_subpackage/subpackage/submodule.py +0 -41
  95. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/submodule.py +0 -84
  96. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/subpackage/__init__.py +0 -13
  97. sphinx_autoapi-3.3.2/tests/python/pypackageexample/package/subpackage/submodule.py +0 -41
  98. sphinx_autoapi-3.3.2/tests/python/pyskipexample/conf.py +0 -27
  99. sphinx_autoapi-3.3.2/tests/python/pyskipexample/example/example.py +0 -32
  100. sphinx_autoapi-3.3.2/tests/python/pyskipexample/index.rst +0 -25
  101. sphinx_autoapi-3.3.2/tests/python/pystdlib/conf.py +0 -24
  102. sphinx_autoapi-3.3.2/tests/python/pystdlib/index.rst +0 -25
  103. sphinx_autoapi-3.3.2/tests/python/pystdlib/stdlib/json.py +0 -9
  104. sphinx_autoapi-3.3.2/tests/python/pystdlib/stdlib/myast.py +0 -10
  105. sphinx_autoapi-3.3.2/tests/python/pystdlib/stdlib/myjson.py +0 -10
  106. sphinx_autoapi-3.3.2/tests/python/test_own_page_option.py +0 -997
  107. sphinx_autoapi-3.3.2/tests/python/test_parser.py +0 -126
  108. sphinx_autoapi-3.3.2/tests/python/test_pyintegration.py +0 -1360
  109. sphinx_autoapi-3.3.2/tests/templateexample/conf.py +0 -21
  110. sphinx_autoapi-3.3.2/tests/templateexample/example/example.py +0 -8
  111. sphinx_autoapi-3.3.2/tests/templateexample/index.rst +0 -26
  112. sphinx_autoapi-3.3.2/tests/templateexample/template_overrides/python/function.rst +0 -1
  113. sphinx_autoapi-3.3.2/tests/test_astroid_utils.py +0 -237
  114. sphinx_autoapi-3.3.2/tests/test_integration.py +0 -56
  115. sphinx_autoapi-3.3.2/tests/toctreeexample/conf.py +0 -18
  116. sphinx_autoapi-3.3.2/tests/toctreeexample/example/example.py +0 -8
  117. sphinx_autoapi-3.3.2/tests/toctreeexample/index.rst +0 -7
  118. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/README.rst +0 -0
  119. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/_mapper.py +0 -0
  120. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/directives.py +0 -0
  121. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/documenters.py +0 -0
  122. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/extension.py +0 -0
  123. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/inheritance_diagrams.py +0 -0
  124. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/settings.py +0 -0
  125. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/index.rst +0 -0
  126. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/attribute.rst +0 -0
  127. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/class.rst +0 -0
  128. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/data.rst +0 -0
  129. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/exception.rst +0 -0
  130. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/function.rst +0 -0
  131. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/method.rst +0 -0
  132. {sphinx_autoapi-3.3.2 → sphinx_autoapi-3.3.3}/autoapi/templates/python/package.rst +0 -0
@@ -1,15 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sphinx-autoapi
3
- Version: 3.3.2
3
+ Version: 3.3.3
4
4
  Summary: Sphinx API documentation generator
5
- Home-page: http://github.com/readthedocs/sphinx-autoapi
6
- Author: Eric Holscher
7
- Author-email: eric@ericholscher.com
8
- Maintainer: Ashley Whetter
9
- Maintainer-email: ashley@awhetter.co.uk
10
- License: MIT
11
- Project-URL: Documentation, https://sphinx-autoapi.readthedocs.io/en/latest/
12
- Classifier: Development Status :: 4 - Beta
5
+ Author-email: Eric Holscher <eric@ericholscher.com>
6
+ Maintainer-email: Ashley Whetter <ashley@awhetter.co.uk>
7
+ Requires-Python: >=3.8
8
+ Description-Content-Type: text/x-rst
9
+ Classifier: Development Status :: 5 - Production/Stable
13
10
  Classifier: Environment :: Plugins
14
11
  Classifier: Framework :: Sphinx :: Extension
15
12
  Classifier: Intended Audience :: Developers
@@ -21,19 +18,16 @@ Classifier: Programming Language :: Python :: 3.8
21
18
  Classifier: Programming Language :: Python :: 3.9
22
19
  Classifier: Programming Language :: Python :: 3.10
23
20
  Classifier: Programming Language :: Python :: 3.11
24
- Requires-Python: >=3.8
25
- Description-Content-Type: text/x-rst
26
- License-File: LICENSE.rst
27
- Requires-Dist: astroid>=2.7; python_version < "3.12"
28
- Requires-Dist: astroid>=3.0.0a1; python_version >= "3.12"
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Requires-Dist: astroid>=2.7;python_version<"3.12"
24
+ Requires-Dist: astroid>=3.0.0a1;python_version>="3.12"
29
25
  Requires-Dist: Jinja2
30
26
  Requires-Dist: PyYAML
31
27
  Requires-Dist: sphinx>=6.1.0
32
- Requires-Dist: stdlib_list; python_version < "3.10"
33
- Provides-Extra: docs
34
- Requires-Dist: furo; extra == "docs"
35
- Requires-Dist: sphinx; extra == "docs"
36
- Requires-Dist: sphinx_design; extra == "docs"
28
+ Requires-Dist: stdlib_list;python_version<"3.10"
29
+ Project-URL: Documentation, https://sphinx-autoapi.readthedocs.io/en/latest/
30
+ Project-URL: Homepage, http://github.com/readthedocs/sphinx-autoapi
37
31
 
38
32
  Sphinx AutoAPI
39
33
  ==============
@@ -156,3 +150,4 @@ License
156
150
 
157
151
  This project is licensed under the MIT License.
158
152
  See the `LICENSE.rst <LICENSE.rst>`_ file for details.
153
+
@@ -3,5 +3,5 @@
3
3
  from .extension import setup
4
4
 
5
5
  __all__ = ("setup",)
6
- __version__ = "3.3.2"
7
- __version_info__ = (3, 3, 2)
6
+ __version__ = "3.3.3"
7
+ __version_info__ = (3, 3, 3)
@@ -129,7 +129,7 @@ def get_full_basenames(node: astroid.nodes.ClassDef) -> Iterable[str]:
129
129
  node: The class definition node to resolve the bases of.
130
130
 
131
131
  Returns:
132
- The fullly qualified names.
132
+ The fully qualified names.
133
133
  """
134
134
  for base in node.bases:
135
135
  yield _resolve_annotation(base)
@@ -506,6 +506,9 @@ class PythonClass(PythonObject):
506
506
  def constructor(self):
507
507
  for child in self.children:
508
508
  if child.short_name == "__init__":
509
+ if not child.type == "method":
510
+ break
511
+
509
512
  return child
510
513
 
511
514
  return None
@@ -267,6 +267,26 @@ class Parser:
267
267
  if node.name == "__init__":
268
268
  for child in node.get_children():
269
269
  if isinstance(child, (astroid.nodes.Assign, astroid.nodes.AnnAssign)):
270
+ # Verify we are assigning to self.
271
+ if isinstance(child, astroid.nodes.Assign):
272
+ targets = child.targets
273
+ else:
274
+ targets = [child.target]
275
+
276
+ target_ok = True
277
+ for target in targets:
278
+ if not isinstance(target, astroid.nodes.AssignAttr):
279
+ target_ok = False
280
+ break
281
+ _object = target.expr
282
+ if (
283
+ not isinstance(_object, astroid.nodes.Name)
284
+ or _object.name != "self"
285
+ ):
286
+ target_ok = False
287
+ break
288
+ if not target_ok:
289
+ continue
270
290
  child_data = self._parse_assign(child)
271
291
  result.extend(data for data in child_data)
272
292
 
@@ -12,24 +12,10 @@
12
12
 
13
13
  {% endif %}
14
14
 
15
- {% block subpackages %}
16
- {% set visible_subpackages = obj.subpackages|selectattr("display")|list %}
17
- {% if visible_subpackages %}
18
- Subpackages
19
- -----------
20
-
21
- .. toctree::
22
- :maxdepth: 1
23
-
24
- {% for subpackage in visible_subpackages %}
25
- {{ subpackage.include_path }}
26
- {% endfor %}
27
-
28
-
29
- {% endif %}
30
- {% endblock %}
31
15
  {% block submodules %}
16
+ {% set visible_subpackages = obj.subpackages|selectattr("display")|list %}
32
17
  {% set visible_submodules = obj.submodules|selectattr("display")|list %}
18
+ {% set visible_submodules = (visible_subpackages + visible_submodules)|sort %}
33
19
  {% if visible_submodules %}
34
20
  Submodules
35
21
  ----------
@@ -15,6 +15,7 @@
15
15
  {% endfor %}
16
16
 
17
17
  {% if obj.docstring %}
18
+
18
19
  {{ obj.docstring|indent(3) }}
19
20
  {% endif %}
20
21
  {% endif %}
@@ -0,0 +1,103 @@
1
+ [build-system]
2
+ requires = ["flit_core >=3.2,<4"]
3
+ build-backend = "flit_core.buildapi"
4
+
5
+ [project]
6
+ name = "sphinx-autoapi"
7
+ authors = [{name = "Eric Holscher", email = "eric@ericholscher.com"}]
8
+ maintainers = [{name = "Ashley Whetter", email = "ashley@awhetter.co.uk"}]
9
+ description = "Sphinx API documentation generator"
10
+ license = {text = "LICENSE.rst"}
11
+ classifiers = [
12
+ "Development Status :: 5 - Production/Stable",
13
+ "Environment :: Plugins",
14
+ "Framework :: Sphinx :: Extension",
15
+ "Intended Audience :: Developers",
16
+ "License :: OSI Approved :: MIT License",
17
+ "Natural Language :: English",
18
+ "Programming Language :: Python",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.8",
21
+ "Programming Language :: Python :: 3.9",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ ]
27
+ requires-python = ">=3.8"
28
+ dependencies = [
29
+ 'astroid>=2.7;python_version<"3.12"',
30
+ 'astroid>=3.0.0a1;python_version>="3.12"',
31
+ "Jinja2",
32
+ "PyYAML",
33
+ "sphinx>=6.1.0",
34
+ 'stdlib_list;python_version<"3.10"',
35
+ ]
36
+ dynamic = ["version"]
37
+
38
+ [project.readme]
39
+ file = "README.rst"
40
+ content-type = "text/x-rst"
41
+
42
+ [project.urls]
43
+ Homepage = "http://github.com/readthedocs/sphinx-autoapi"
44
+ Documentation = "https://sphinx-autoapi.readthedocs.io/en/latest/"
45
+
46
+ [tool.flit.module]
47
+ name = "autoapi"
48
+
49
+ [tool.mypy]
50
+ # Start off with these
51
+ warn_unused_configs = true
52
+ warn_redundant_casts = true
53
+ warn_unused_ignores = true
54
+
55
+ # Getting these passing should be easy
56
+ strict_equality = true
57
+
58
+ # These shouldn't be too much additional work, but may be tricky to
59
+ # get passing if you use a lot of untyped libraries
60
+ disallow_subclassing_any = true
61
+ disallow_untyped_decorators = true
62
+ disallow_any_generics = true
63
+
64
+ # This one isn't too hard to get passing, but return on investment is lower
65
+ no_implicit_reexport = true
66
+
67
+ [[tool.mypy.overrides]]
68
+ module = "astroid.*"
69
+ ignore_missing_imports = true
70
+
71
+ [[tool.mypy.overrides]]
72
+ module = "autoapi.documenters"
73
+ ignore_errors = true
74
+
75
+ [[tool.mypy.overrides]]
76
+ module = "autoapi._astroid_utils"
77
+
78
+ # Strongly recommend enabling this one as soon as you can
79
+ check_untyped_defs = true
80
+
81
+ # These next few are various gradations of forcing use of type annotations
82
+ disallow_untyped_calls = true
83
+ disallow_incomplete_defs = true
84
+ disallow_untyped_defs = true
85
+
86
+ # This one can be tricky to get passing if you use a lot of untyped libraries
87
+ # Ignore until astroid is typed (https://github.com/pylint-dev/astroid/issues/2060)
88
+ warn_return_any = false
89
+
90
+ [tool.pytest.ini_options]
91
+ markers = [
92
+ "network: Tests that use network access.",
93
+ ]
94
+
95
+ [tool.ruff.lint.pydocstyle]
96
+ convention = "google"
97
+
98
+ [tool.towncrier]
99
+ directory = "docs/changes"
100
+ filename = "CHANGELOG.rst"
101
+ package = "autoapi"
102
+ title_format = "v{version} ({project_date})"
103
+ underlines = ["-", "^", "\""]