Sphinx 8.2.0rc1__py3-none-any.whl → 8.2.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.

Potentially problematic release.


This version of Sphinx might be problematic. Click here for more details.

Files changed (164) hide show
  1. sphinx/__init__.py +2 -2
  2. sphinx/application.py +3 -3
  3. sphinx/domains/math.py +2 -0
  4. sphinx/domains/python/_annotations.py +26 -10
  5. sphinx/domains/python/_object.py +4 -1
  6. sphinx/ext/apidoc/__init__.py +46 -1
  7. sphinx/ext/apidoc/_cli.py +25 -25
  8. sphinx/ext/apidoc/_extension.py +262 -0
  9. sphinx/ext/apidoc/_generate.py +14 -14
  10. sphinx/ext/apidoc/_shared.py +51 -18
  11. sphinx/ext/autodoc/__init__.py +3 -3
  12. sphinx/ext/autodoc/directive.py +1 -1
  13. sphinx/ext/autodoc/mock.py +1 -1
  14. sphinx/ext/autosummary/__init__.py +11 -0
  15. sphinx/ext/napoleon/__init__.py +23 -24
  16. sphinx/ext/viewcode.py +12 -8
  17. sphinx/highlighting.py +1 -1
  18. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  19. sphinx/locale/ar/LC_MESSAGES/sphinx.po +2155 -2050
  20. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  21. sphinx/locale/bg/LC_MESSAGES/sphinx.po +2045 -1940
  22. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  23. sphinx/locale/bn/LC_MESSAGES/sphinx.po +2175 -2070
  24. sphinx/locale/ca/LC_MESSAGES/sphinx.js +3 -3
  25. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  26. sphinx/locale/ca/LC_MESSAGES/sphinx.po +2690 -2585
  27. sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.js +63 -0
  28. sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.mo +0 -0
  29. sphinx/locale/ca@valencia/LC_MESSAGES/sphinx.po +4216 -0
  30. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  31. sphinx/locale/cak/LC_MESSAGES/sphinx.po +2096 -1991
  32. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  33. sphinx/locale/cs/LC_MESSAGES/sphinx.po +2248 -2143
  34. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  35. sphinx/locale/cy/LC_MESSAGES/sphinx.po +2201 -2096
  36. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  37. sphinx/locale/da/LC_MESSAGES/sphinx.po +2282 -2177
  38. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  39. sphinx/locale/de/LC_MESSAGES/sphinx.po +2261 -2156
  40. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  41. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2045 -1940
  42. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  43. sphinx/locale/el/LC_MESSAGES/sphinx.po +2604 -2499
  44. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  45. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2045 -1940
  46. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  47. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2045 -1940
  48. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  49. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2631 -2526
  50. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  51. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2045 -1940
  52. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  53. sphinx/locale/eo/LC_MESSAGES/sphinx.po +2078 -1973
  54. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  55. sphinx/locale/es/LC_MESSAGES/sphinx.po +2633 -2528
  56. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  57. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2045 -1940
  58. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  59. sphinx/locale/et/LC_MESSAGES/sphinx.po +2449 -2344
  60. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  61. sphinx/locale/eu/LC_MESSAGES/sphinx.po +2241 -2136
  62. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  63. sphinx/locale/fa/LC_MESSAGES/sphinx.po +504 -500
  64. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  65. sphinx/locale/fi/LC_MESSAGES/sphinx.po +499 -495
  66. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  67. sphinx/locale/fr/LC_MESSAGES/sphinx.po +513 -509
  68. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  69. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +499 -495
  70. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  71. sphinx/locale/gl/LC_MESSAGES/sphinx.po +2644 -2539
  72. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  73. sphinx/locale/he/LC_MESSAGES/sphinx.po +499 -495
  74. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  75. sphinx/locale/hi/LC_MESSAGES/sphinx.po +504 -500
  76. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  77. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +499 -495
  78. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  79. sphinx/locale/hr/LC_MESSAGES/sphinx.po +501 -497
  80. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  81. sphinx/locale/hu/LC_MESSAGES/sphinx.po +499 -495
  82. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  83. sphinx/locale/id/LC_MESSAGES/sphinx.po +2609 -2504
  84. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  85. sphinx/locale/is/LC_MESSAGES/sphinx.po +499 -495
  86. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  87. sphinx/locale/it/LC_MESSAGES/sphinx.po +2265 -2160
  88. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  89. sphinx/locale/ja/LC_MESSAGES/sphinx.po +2621 -2516
  90. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  91. sphinx/locale/ka/LC_MESSAGES/sphinx.po +2567 -2462
  92. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  93. sphinx/locale/ko/LC_MESSAGES/sphinx.po +2631 -2526
  94. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  95. sphinx/locale/lt/LC_MESSAGES/sphinx.po +2214 -2109
  96. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  97. sphinx/locale/lv/LC_MESSAGES/sphinx.po +2218 -2113
  98. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  99. sphinx/locale/mk/LC_MESSAGES/sphinx.po +2088 -1983
  100. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  101. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2247 -2142
  102. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  103. sphinx/locale/ne/LC_MESSAGES/sphinx.po +2227 -2122
  104. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  105. sphinx/locale/nl/LC_MESSAGES/sphinx.po +2316 -2211
  106. sphinx/locale/pl/LC_MESSAGES/sphinx.js +2 -2
  107. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  108. sphinx/locale/pl/LC_MESSAGES/sphinx.po +2442 -2336
  109. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  110. sphinx/locale/pt/LC_MESSAGES/sphinx.po +2045 -1940
  111. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  112. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2657 -2552
  113. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  114. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2243 -2138
  115. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  116. sphinx/locale/ro/LC_MESSAGES/sphinx.po +2244 -2139
  117. sphinx/locale/ru/LC_MESSAGES/sphinx.js +1 -1
  118. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  119. sphinx/locale/ru/LC_MESSAGES/sphinx.po +2660 -2555
  120. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  121. sphinx/locale/si/LC_MESSAGES/sphinx.po +2134 -2029
  122. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  123. sphinx/locale/sk/LC_MESSAGES/sphinx.po +2614 -2509
  124. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  125. sphinx/locale/sl/LC_MESSAGES/sphinx.po +2167 -2062
  126. sphinx/locale/sphinx.pot +2069 -1964
  127. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  128. sphinx/locale/sq/LC_MESSAGES/sphinx.po +2661 -2556
  129. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  130. sphinx/locale/sr/LC_MESSAGES/sphinx.po +2213 -2108
  131. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  132. sphinx/locale/sv/LC_MESSAGES/sphinx.po +2229 -2124
  133. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  134. sphinx/locale/te/LC_MESSAGES/sphinx.po +2045 -1940
  135. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  136. sphinx/locale/tr/LC_MESSAGES/sphinx.po +2608 -2503
  137. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  138. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2167 -2062
  139. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  140. sphinx/locale/ur/LC_MESSAGES/sphinx.po +2045 -1940
  141. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  142. sphinx/locale/vi/LC_MESSAGES/sphinx.po +2204 -2099
  143. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  144. sphinx/locale/yue/LC_MESSAGES/sphinx.po +2045 -1940
  145. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  146. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2045 -1940
  147. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  148. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2659 -2554
  149. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  150. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2045 -1940
  151. sphinx/testing/path.py +8 -0
  152. sphinx/themes/basic/static/basic.css.jinja +0 -8
  153. sphinx/util/_files.py +2 -2
  154. sphinx/util/fileutil.py +2 -1
  155. sphinx/util/osutil.py +6 -1
  156. sphinx/writers/html5.py +2 -2
  157. sphinx/writers/latex.py +3 -2
  158. sphinx/writers/texinfo.py +3 -2
  159. sphinx/writers/text.py +2 -2
  160. {sphinx-8.2.0rc1.dist-info → sphinx-8.2.1.dist-info}/METADATA +8 -5
  161. {sphinx-8.2.0rc1.dist-info → sphinx-8.2.1.dist-info}/RECORD +164 -160
  162. {sphinx-8.2.0rc1.dist-info → sphinx-8.2.1.dist-info}/WHEEL +1 -1
  163. {sphinx-8.2.0rc1.dist-info → sphinx-8.2.1.dist-info}/entry_points.txt +0 -0
  164. {sphinx-8.2.0rc1.dist-info → sphinx-8.2.1.dist-info/licenses}/LICENSE.rst +0 -0
sphinx/testing/path.py CHANGED
@@ -58,18 +58,26 @@ class path(str): # NoQA: FURB189
58
58
  """Returns ``True`` if the path is a directory."""
59
59
  return os.path.isdir(self)
60
60
 
61
+ is_dir = isdir
62
+
61
63
  def isfile(self) -> bool:
62
64
  """Returns ``True`` if the path is a file."""
63
65
  return os.path.isfile(self)
64
66
 
67
+ is_file = isfile
68
+
65
69
  def islink(self) -> bool:
66
70
  """Returns ``True`` if the path is a symbolic link."""
67
71
  return os.path.islink(self)
68
72
 
73
+ is_symlink = islink
74
+
69
75
  def ismount(self) -> bool:
70
76
  """Returns ``True`` if the path is a mount point."""
71
77
  return os.path.ismount(self)
72
78
 
79
+ is_mount = ismount
80
+
73
81
  def rmtree(
74
82
  self,
75
83
  ignore_errors: bool = False,
@@ -741,14 +741,6 @@ abbr, acronym {
741
741
  cursor: help;
742
742
  }
743
743
 
744
- .translated {
745
- background-color: rgba(207, 255, 207, 0.2)
746
- }
747
-
748
- .untranslated {
749
- background-color: rgba(255, 207, 207, 0.2)
750
- }
751
-
752
744
  /* -- code displays --------------------------------------------------------- */
753
745
 
754
746
  pre {
sphinx/util/_files.py CHANGED
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
11
11
  from collections.abc import Set
12
12
 
13
13
 
14
- class FilenameUniqDict(dict[str, tuple[set[str], str]]):
14
+ class FilenameUniqDict(dict[str, tuple[set[str], str]]): # NoQA: FURB189
15
15
  """A dictionary that automatically generates unique names for its keys,
16
16
  interpreted as filenames, and keeps track of a set of docnames they
17
17
  appear in. Used for images and downloadable files in the environment.
@@ -61,7 +61,7 @@ class FilenameUniqDict(dict[str, tuple[set[str], str]]):
61
61
  self._existing = state
62
62
 
63
63
 
64
- class DownloadFiles(dict[Path, tuple[set[str], _StrPath]]):
64
+ class DownloadFiles(dict[Path, tuple[set[str], _StrPath]]): # NoQA: FURB189
65
65
  """A special dictionary for download files.
66
66
 
67
67
  .. important:: This class would be refactored in nearly future.
sphinx/util/fileutil.py CHANGED
@@ -140,7 +140,8 @@ def copy_asset(
140
140
  return
141
141
 
142
142
  for root, dirs, files in os.walk(source, followlinks=True):
143
- reldir = _relative_path(Path(root), source).as_posix()
143
+ root_p = Path(root)
144
+ reldir = _relative_path(root_p, source).as_posix()
144
145
  for dir in dirs.copy():
145
146
  if excluded(posixpath.join(reldir, dir)):
146
147
  dirs.remove(dir)
sphinx/util/osutil.py CHANGED
@@ -177,9 +177,14 @@ def _relative_path(path: Path, root: Path, /) -> Path:
177
177
  It returns the original path if *path* and *root* are on different drives,
178
178
  which may happen on Windows.
179
179
  """
180
+ # Path.relative_to() requires fully-resolved paths (no '..').
181
+ if '..' in path.parts:
182
+ path = path.resolve()
183
+ if '..' in root.parts:
184
+ root = root.resolve()
185
+
180
186
  if path.anchor != root.anchor or '..' in root.parts:
181
187
  # If the drives are different, no relative path exists.
182
- # Path.relative_to() requires fully-resolved paths (no '..').
183
188
  return path
184
189
  if sys.version_info[:2] < (3, 12):
185
190
  return Path(os.path.relpath(path, root))
sphinx/writers/html5.py CHANGED
@@ -906,8 +906,8 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
906
906
 
907
907
  def visit_abbreviation(self, node: Element) -> None:
908
908
  attrs = {}
909
- if node.hasattr('explanation'):
910
- attrs['title'] = node['explanation']
909
+ if explanation := node.get('explanation', ''):
910
+ attrs['title'] = explanation
911
911
  self.body.append(self.starttag(node, 'abbr', '', **attrs))
912
912
 
913
913
  def depart_abbreviation(self, node: Element) -> None:
sphinx/writers/latex.py CHANGED
@@ -2082,11 +2082,12 @@ class LaTeXTranslator(SphinxTranslator):
2082
2082
  self.body.append('}}')
2083
2083
 
2084
2084
  def visit_abbreviation(self, node: Element) -> None:
2085
+ explanation = node.get('explanation', '')
2085
2086
  abbr = node.astext()
2086
2087
  self.body.append(r'\sphinxstyleabbreviation{')
2087
2088
  # spell out the explanation once
2088
- if node.hasattr('explanation') and abbr not in self.handled_abbrs:
2089
- self.context.append('} (%s)' % self.encode(node['explanation']))
2089
+ if explanation and abbr not in self.handled_abbrs:
2090
+ self.context.append('} (%s)' % self.encode(explanation))
2090
2091
  self.handled_abbrs.add(abbr)
2091
2092
  else:
2092
2093
  self.context.append('}')
sphinx/writers/texinfo.py CHANGED
@@ -1537,10 +1537,11 @@ class TexinfoTranslator(SphinxTranslator):
1537
1537
  pass
1538
1538
 
1539
1539
  def visit_abbreviation(self, node: Element) -> None:
1540
+ explanation = node.get('explanation', '')
1540
1541
  abbr = node.astext()
1541
1542
  self.body.append('@abbr{')
1542
- if node.hasattr('explanation') and abbr not in self.handled_abbrs:
1543
- self.context.append(',%s}' % self.escape_arg(node['explanation']))
1543
+ if explanation and abbr not in self.handled_abbrs:
1544
+ self.context.append(',%s}' % self.escape_arg(explanation))
1544
1545
  self.handled_abbrs.add(abbr)
1545
1546
  else:
1546
1547
  self.context.append('}')
sphinx/writers/text.py CHANGED
@@ -1237,8 +1237,8 @@ class TextTranslator(SphinxTranslator):
1237
1237
  self.add_text('')
1238
1238
 
1239
1239
  def depart_abbreviation(self, node: Element) -> None:
1240
- if node.hasattr('explanation'):
1241
- self.add_text(' (%s)' % node['explanation'])
1240
+ if explanation := node.get('explanation', ''):
1241
+ self.add_text(f' ({explanation})')
1242
1242
 
1243
1243
  def visit_manpage(self, node: Element) -> None:
1244
1244
  return self.visit_literal_emphasis(node)
@@ -1,10 +1,11 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: Sphinx
3
- Version: 8.2.0rc1
3
+ Version: 8.2.1
4
4
  Summary: Python documentation generator
5
5
  Author-email: Adam Turner <aa-turner@users.noreply.github.com>, Georg Brandl <georg@python.org>
6
6
  Requires-Python: >=3.11
7
7
  Description-Content-Type: text/x-rst
8
+ License-Expression: BSD-2-Clause
8
9
  Classifier: Development Status :: 5 - Production/Stable
9
10
  Classifier: Environment :: Console
10
11
  Classifier: Environment :: Web Environment
@@ -15,7 +16,6 @@ Classifier: Intended Audience :: Information Technology
15
16
  Classifier: Intended Audience :: Other Audience
16
17
  Classifier: Intended Audience :: Science/Research
17
18
  Classifier: Intended Audience :: System Administrators
18
- Classifier: License :: OSI Approved :: BSD License
19
19
  Classifier: Operating System :: OS Independent
20
20
  Classifier: Programming Language :: Python
21
21
  Classifier: Programming Language :: Python :: 3
@@ -50,6 +50,7 @@ Classifier: Topic :: Text Processing :: Markup :: reStructuredText
50
50
  Classifier: Topic :: Text Processing :: Markup :: XML
51
51
  Classifier: Topic :: Utilities
52
52
  Classifier: Typing :: Typed
53
+ License-File: LICENSE.rst
53
54
  Requires-Dist: sphinxcontrib-applehelp>=1.0.7
54
55
  Requires-Dist: sphinxcontrib-devhelp>=1.0.6
55
56
  Requires-Dist: sphinxcontrib-htmlhelp>=2.0.6
@@ -68,18 +69,20 @@ Requires-Dist: roman-numerals-py>=1.0.0
68
69
  Requires-Dist: packaging>=23.0
69
70
  Requires-Dist: colorama>=0.4.6; sys_platform == 'win32'
70
71
  Requires-Dist: sphinxcontrib-websupport ; extra == "docs"
71
- Requires-Dist: ruff==0.9.6 ; extra == "lint"
72
+ Requires-Dist: ruff==0.9.7 ; extra == "lint"
72
73
  Requires-Dist: mypy==1.15.0 ; extra == "lint"
73
74
  Requires-Dist: sphinx-lint>=0.9 ; extra == "lint"
74
75
  Requires-Dist: types-colorama==0.4.15.20240311 ; extra == "lint"
75
76
  Requires-Dist: types-defusedxml==0.7.0.20240218 ; extra == "lint"
76
77
  Requires-Dist: types-docutils==0.21.0.20241128 ; extra == "lint"
77
78
  Requires-Dist: types-Pillow==10.2.0.20240822 ; extra == "lint"
78
- Requires-Dist: types-Pygments==2.19.0.20250107 ; extra == "lint"
79
+ Requires-Dist: types-Pygments==2.19.0.20250219 ; extra == "lint"
79
80
  Requires-Dist: types-requests==2.32.0.20241016 ; extra == "lint"
80
81
  Requires-Dist: types-urllib3==1.26.25.14 ; extra == "lint"
81
82
  Requires-Dist: pyright==1.1.394 ; extra == "lint"
82
83
  Requires-Dist: pytest>=8.0 ; extra == "lint"
84
+ Requires-Dist: pypi-attestations==0.0.21 ; extra == "lint"
85
+ Requires-Dist: betterproto==2.0.0b6 ; extra == "lint"
83
86
  Requires-Dist: pytest>=8.0 ; extra == "test"
84
87
  Requires-Dist: pytest-xdist[psutil]>=3.4 ; extra == "test"
85
88
  Requires-Dist: defusedxml>=0.7.1 ; extra == "test"