pyproject-api 1.7.2__tar.gz → 1.9.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.
Files changed (35) hide show
  1. pyproject_api-1.9.0/.github/FUNDING.yml +1 -0
  2. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/workflows/check.yaml +1 -2
  3. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/workflows/release.yaml +2 -2
  4. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.pre-commit-config.yaml +6 -6
  5. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/PKG-INFO +9 -10
  6. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/docs/conf.py +33 -1
  7. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/pyproject.toml +8 -12
  8. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_backend.py +5 -7
  9. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_backend.pyi +2 -1
  10. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_frontend.py +8 -5
  11. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_version.py +2 -2
  12. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_via_fresh_subprocess.py +4 -3
  13. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_frontend.py +2 -2
  14. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_frontend_setuptools.py +4 -2
  15. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tox.ini +9 -10
  16. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/dependabot.yml +0 -0
  17. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/release.yml +0 -0
  18. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.gitignore +0 -0
  19. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.readthedocs.yml +0 -0
  20. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/CODE_OF_CONDUCT.md +0 -0
  21. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/LICENSE +0 -0
  22. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/README.md +0 -0
  23. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/docs/api.rst +0 -0
  24. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/docs/index.rst +0 -0
  25. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/__init__.py +0 -0
  26. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/__main__.py +0 -0
  27. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_util.py +0 -0
  28. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/py.typed +0 -0
  29. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/_build_sdist.py +0 -0
  30. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/demo_pkg_inline/build.py +0 -0
  31. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/demo_pkg_inline/pyproject.toml +0 -0
  32. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_backend.py +0 -0
  33. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_main.py +0 -0
  34. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_util.py +0 -0
  35. {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_version.py +0 -0
@@ -0,0 +1 @@
1
+ tidelift: "pypi/pyproject-api"
@@ -25,7 +25,6 @@ jobs:
25
25
  - "3.11"
26
26
  - "3.10"
27
27
  - "3.9"
28
- - "3.8"
29
28
  - type
30
29
  - dev
31
30
  - pkg_meta
@@ -42,7 +41,7 @@ jobs:
42
41
  with:
43
42
  fetch-depth: 0
44
43
  - name: Install the latest version of uv
45
- uses: astral-sh/setup-uv@v3
44
+ uses: astral-sh/setup-uv@v5
46
45
  with:
47
46
  enable-cache: true
48
47
  cache-dependency-glob: "pyproject.toml"
@@ -14,7 +14,7 @@ jobs:
14
14
  with:
15
15
  fetch-depth: 0
16
16
  - name: Install the latest version of uv
17
- uses: astral-sh/setup-uv@v3
17
+ uses: astral-sh/setup-uv@v5
18
18
  with:
19
19
  enable-cache: true
20
20
  cache-dependency-glob: "pyproject.toml"
@@ -43,6 +43,6 @@ jobs:
43
43
  name: ${{ env.dists-artifact-name }}
44
44
  path: dist/
45
45
  - name: Publish to PyPI
46
- uses: pypa/gh-action-pypi-publish@v1.10.1
46
+ uses: pypa/gh-action-pypi-publish@v1.12.3
47
47
  with:
48
48
  attestations: true
@@ -1,11 +1,11 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.6.0
3
+ rev: v5.0.0
4
4
  hooks:
5
5
  - id: end-of-file-fixer
6
6
  - id: trailing-whitespace
7
7
  - repo: https://github.com/python-jsonschema/check-jsonschema
8
- rev: 0.29.2
8
+ rev: 0.31.0
9
9
  hooks:
10
10
  - id: check-github-workflows
11
11
  args: [ "--verbose" ]
@@ -13,18 +13,18 @@ repos:
13
13
  rev: v2.3.0
14
14
  hooks:
15
15
  - id: codespell
16
- additional_dependencies: ["tomli>=2.0.1"]
16
+ additional_dependencies: ["tomli>=2.2.1"]
17
17
  - repo: https://github.com/tox-dev/tox-ini-fmt
18
- rev: "1.4.0"
18
+ rev: "1.4.1"
19
19
  hooks:
20
20
  - id: tox-ini-fmt
21
21
  args: ["-p", "fix"]
22
22
  - repo: https://github.com/tox-dev/pyproject-fmt
23
- rev: "2.2.3"
23
+ rev: "v2.5.0"
24
24
  hooks:
25
25
  - id: pyproject-fmt
26
26
  - repo: https://github.com/astral-sh/ruff-pre-commit
27
- rev: "v0.6.5"
27
+ rev: "v0.9.2"
28
28
  hooks:
29
29
  - id: ruff-format
30
30
  - id: ruff
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: pyproject-api
3
- Version: 1.7.2
3
+ Version: 1.9.0
4
4
  Summary: API to interact with the python pyproject.toml based projects
5
5
  Project-URL: Changelog, https://github.com/tox-dev/pyproject-api/releases
6
6
  Project-URL: Homepage, https://pyproject-api.readthedocs.io
@@ -19,7 +19,6 @@ Classifier: Operating System :: MacOS :: MacOS X
19
19
  Classifier: Operating System :: Microsoft :: Windows
20
20
  Classifier: Operating System :: POSIX
21
21
  Classifier: Programming Language :: Python :: 3 :: Only
22
- Classifier: Programming Language :: Python :: 3.8
23
22
  Classifier: Programming Language :: Python :: 3.9
24
23
  Classifier: Programming Language :: Python :: 3.10
25
24
  Classifier: Programming Language :: Python :: 3.11
@@ -28,18 +27,18 @@ Classifier: Programming Language :: Python :: 3.13
28
27
  Classifier: Topic :: Software Development :: Libraries
29
28
  Classifier: Topic :: Software Development :: Testing
30
29
  Classifier: Topic :: Utilities
31
- Requires-Python: >=3.8
32
- Requires-Dist: packaging>=24.1
33
- Requires-Dist: tomli>=2.0.1; python_version < '3.11'
30
+ Requires-Python: >=3.9
31
+ Requires-Dist: packaging>=24.2
32
+ Requires-Dist: tomli>=2.2.1; python_version < '3.11'
34
33
  Provides-Extra: docs
35
34
  Requires-Dist: furo>=2024.8.6; extra == 'docs'
36
- Requires-Dist: sphinx-autodoc-typehints>=2.4.1; extra == 'docs'
35
+ Requires-Dist: sphinx-autodoc-typehints>=3; extra == 'docs'
37
36
  Provides-Extra: testing
38
37
  Requires-Dist: covdefaults>=2.3; extra == 'testing'
39
- Requires-Dist: pytest-cov>=5; extra == 'testing'
38
+ Requires-Dist: pytest-cov>=6; extra == 'testing'
40
39
  Requires-Dist: pytest-mock>=3.14; extra == 'testing'
41
- Requires-Dist: pytest>=8.3.3; extra == 'testing'
42
- Requires-Dist: setuptools>=75.1; extra == 'testing'
40
+ Requires-Dist: pytest>=8.3.4; extra == 'testing'
41
+ Requires-Dist: setuptools>=75.8; extra == 'testing'
43
42
  Description-Content-Type: text/markdown
44
43
 
45
44
  # [`pyproject-api`](https://pyproject-api.readthedocs.io/en/latest/)
@@ -1,11 +1,20 @@
1
1
  # noqa: D100
2
2
  from __future__ import annotations
3
3
 
4
+ from typing import TYPE_CHECKING
5
+
6
+ from sphinx.domains.python import PythonDomain
7
+
4
8
  from pyproject_api import __version__
5
9
 
10
+ if TYPE_CHECKING:
11
+ from docutils.nodes import Element
12
+ from sphinx.application import Sphinx
13
+ from sphinx.builders import Builder
14
+ from sphinx.environment import BuildEnvironment
6
15
  project = name = "pyproject_api"
7
16
  company = "tox-dev"
8
- copyright = f"{company}" # noqa: A001
17
+ project_copyright = f"{company}"
9
18
  version, release = __version__, __version__.split("+")[0]
10
19
 
11
20
  extensions = [
@@ -38,3 +47,26 @@ intersphinx_mapping = {
38
47
 
39
48
  nitpicky = True
40
49
  nitpick_ignore = []
50
+
51
+
52
+ def setup(app: Sphinx) -> None: # noqa: D103
53
+ class PatchedPythonDomain(PythonDomain):
54
+ def resolve_xref( # noqa: PLR0913,PLR0917
55
+ self,
56
+ env: BuildEnvironment,
57
+ fromdocname: str,
58
+ builder: Builder,
59
+ type: str, # noqa: A002
60
+ target: str,
61
+ node: resolve_xref,
62
+ contnode: Element,
63
+ ) -> Element:
64
+ # fixup some wrongly resolved mappings
65
+ mapping = {
66
+ "pathlib._local.Path": "pathlib.Path",
67
+ }
68
+ if target in mapping:
69
+ target = node["reftarget"] = mapping[target]
70
+ return super().resolve_xref(env, fromdocname, builder, type, target, node, contnode)
71
+
72
+ app.add_domain(PatchedPythonDomain, override=True)
@@ -2,7 +2,7 @@
2
2
  build-backend = "hatchling.build"
3
3
  requires = [
4
4
  "hatch-vcs>=0.4",
5
- "hatchling>=1.25",
5
+ "hatchling>=1.27",
6
6
  ]
7
7
 
8
8
  [project]
@@ -23,7 +23,7 @@ maintainers = [
23
23
  authors = [
24
24
  { name = "Bernát Gábor", email = "gaborjbernat@gmail.com" },
25
25
  ]
26
- requires-python = ">=3.8"
26
+ requires-python = ">=3.9"
27
27
  classifiers = [
28
28
  "Development Status :: 5 - Production/Stable",
29
29
  "Framework :: tox",
@@ -33,7 +33,6 @@ classifiers = [
33
33
  "Operating System :: Microsoft :: Windows",
34
34
  "Operating System :: POSIX",
35
35
  "Programming Language :: Python :: 3 :: Only",
36
- "Programming Language :: Python :: 3.8",
37
36
  "Programming Language :: Python :: 3.9",
38
37
  "Programming Language :: Python :: 3.10",
39
38
  "Programming Language :: Python :: 3.11",
@@ -47,19 +46,19 @@ dynamic = [
47
46
  "version",
48
47
  ]
49
48
  dependencies = [
50
- "packaging>=24.1",
51
- "tomli>=2.0.1; python_version<'3.11'",
49
+ "packaging>=24.2",
50
+ "tomli>=2.2.1; python_version<'3.11'",
52
51
  ]
53
52
  optional-dependencies.docs = [
54
53
  "furo>=2024.8.6",
55
- "sphinx-autodoc-typehints>=2.4.1",
54
+ "sphinx-autodoc-typehints>=3",
56
55
  ]
57
56
  optional-dependencies.testing = [
58
57
  "covdefaults>=2.3",
59
- "pytest>=8.3.3",
60
- "pytest-cov>=5",
58
+ "pytest>=8.3.4",
59
+ "pytest-cov>=6",
61
60
  "pytest-mock>=3.14",
62
- "setuptools>=75.1",
61
+ "setuptools>=75.8",
63
62
  ]
64
63
  urls.Changelog = "https://github.com/tox-dev/pyproject-api/releases"
65
64
  urls.Homepage = "https://pyproject-api.readthedocs.io"
@@ -71,7 +70,6 @@ build.hooks.vcs.version-file = "src/pyproject_api/_version.py"
71
70
  version.source = "vcs"
72
71
 
73
72
  [tool.ruff]
74
- target-version = "py38"
75
73
  line-length = 120
76
74
  format.preview = true
77
75
  format.docstring-code-line-length = 100
@@ -80,8 +78,6 @@ lint.select = [
80
78
  "ALL",
81
79
  ]
82
80
  lint.ignore = [
83
- "ANN101", # Missing type annotation for `self` in method
84
- "ANN102", # Missing type annotation for `cls` in classmethod
85
81
  "ANN401", # Dynamically typed expressions
86
82
  "COM812", # Conflict with formatter
87
83
  "CPY", # No copyright statements
@@ -5,8 +5,6 @@ Please keep this file Python 2.7 compatible.
5
5
  See https://tox.readthedocs.io/en/rewrite/development.html#code-style-guide
6
6
  """
7
7
 
8
- from __future__ import print_function
9
-
10
8
  import importlib
11
9
  import json
12
10
  import locale
@@ -31,12 +29,12 @@ class BackendProxy:
31
29
  def __call__(self, name, *args, **kwargs):
32
30
  on_object = self if name.startswith("_") else self.backend
33
31
  if not hasattr(on_object, name):
34
- msg = "{!r} has no attribute {!r}".format(on_object, name)
32
+ msg = f"{on_object!r} has no attribute {name!r}"
35
33
  raise MissingCommand(msg)
36
34
  return getattr(on_object, name)(*args, **kwargs)
37
35
 
38
36
  def __str__(self):
39
- return "{}(backend={})".format(self.__class__.__name__, self.backend)
37
+ return f"{self.__class__.__name__}(backend={self.backend})"
40
38
 
41
39
  def _exit(self): # noqa: PLR6301
42
40
  return 0
@@ -69,7 +67,7 @@ def run(argv): # noqa: C901, PLR0912, PLR0915
69
67
  print("failed to start backend", file=sys.stderr)
70
68
  raise
71
69
  else:
72
- print("started backend {}".format(backend_proxy), file=sys.stdout)
70
+ print(f"started backend {backend_proxy}", file=sys.stdout)
73
71
  finally:
74
72
  flush() # pragma: no branch
75
73
  while True:
@@ -85,7 +83,7 @@ def run(argv): # noqa: C901, PLR0912, PLR0915
85
83
  result_file = parsed_message["result"]
86
84
  except Exception: # noqa: BLE001
87
85
  # ignore messages that are not valid JSON and contain a valid result path
88
- print("Backend: incorrect request to backend: {}".format(content), file=sys.stderr)
86
+ print(f"Backend: incorrect request to backend: {content}", file=sys.stderr)
89
87
  flush()
90
88
  else:
91
89
  result = {}
@@ -111,7 +109,7 @@ def run(argv): # noqa: C901, PLR0912, PLR0915
111
109
  traceback.print_exc()
112
110
  finally:
113
111
  # used as done marker by frontend
114
- print("Backend: Wrote response {} to {}".format(result, result_file))
112
+ print(f"Backend: Wrote response {result} to {result_file}")
115
113
  flush() # pragma: no branch
116
114
  if reuse_process is False: # pragma: no branch # no test for reuse process in root test env
117
115
  break
@@ -1,4 +1,5 @@
1
- from typing import Any, Sequence
1
+ from collections.abc import Sequence
2
+ from typing import Any
2
3
 
3
4
  class MissingCommand(TypeError): ... # noqa: N818
4
5
 
@@ -9,20 +9,23 @@ from contextlib import contextmanager
9
9
  from pathlib import Path
10
10
  from tempfile import NamedTemporaryFile, TemporaryDirectory
11
11
  from time import sleep
12
- from typing import Any, Dict, Iterator, List, Literal, NamedTuple, NoReturn, Optional, TypedDict, cast
12
+ from typing import TYPE_CHECKING, Any, Literal, NamedTuple, NoReturn, Optional, TypedDict, cast
13
13
  from zipfile import ZipFile
14
14
 
15
15
  from packaging.requirements import Requirement
16
16
 
17
17
  from pyproject_api._util import ensure_empty_dir
18
18
 
19
+ if TYPE_CHECKING:
20
+ from collections.abc import Iterator
21
+
19
22
  if sys.version_info >= (3, 11): # pragma: no cover (py311+)
20
23
  import tomllib
21
24
  else: # pragma: no cover (py311+)
22
25
  import tomli as tomllib
23
26
 
24
27
  _HERE = Path(__file__).parent
25
- ConfigSettings = Optional[Dict[str, Any]]
28
+ ConfigSettings = Optional[dict[str, Any]]
26
29
 
27
30
 
28
31
  class OptionalHooks(TypedDict, total=True):
@@ -276,7 +279,7 @@ class Frontend(ABC):
276
279
  result, out, err = [], "", ""
277
280
  if not isinstance(result, list) or not all(isinstance(i, str) for i in result):
278
281
  self._unexpected_response("get_requires_for_build_sdist", result, "list of string", out, err)
279
- return RequiresBuildSdistResult(tuple(Requirement(r) for r in cast(List[str], result)), out, err)
282
+ return RequiresBuildSdistResult(tuple(Requirement(r) for r in cast("list[str]", result)), out, err)
280
283
 
281
284
  def get_requires_for_build_wheel(self, config_settings: ConfigSettings | None = None) -> RequiresBuildWheelResult:
282
285
  """
@@ -291,7 +294,7 @@ class Frontend(ABC):
291
294
  result, out, err = [], "", ""
292
295
  if not isinstance(result, list) or not all(isinstance(i, str) for i in result):
293
296
  self._unexpected_response("get_requires_for_build_wheel", result, "list of string", out, err)
294
- return RequiresBuildWheelResult(tuple(Requirement(r) for r in cast(List[str], result)), out, err)
297
+ return RequiresBuildWheelResult(tuple(Requirement(r) for r in cast("list[str]", result)), out, err)
295
298
 
296
299
  def get_requires_for_build_editable(
297
300
  self,
@@ -309,7 +312,7 @@ class Frontend(ABC):
309
312
  result, out, err = [], "", ""
310
313
  if not isinstance(result, list) or not all(isinstance(i, str) for i in result):
311
314
  self._unexpected_response("get_requires_for_build_editable", result, "list of string", out, err)
312
- return RequiresBuildEditableResult(tuple(Requirement(r) for r in cast(List[str], result)), out, err)
315
+ return RequiresBuildEditableResult(tuple(Requirement(r) for r in cast("list[str]", result)), out, err)
313
316
 
314
317
  def prepare_metadata_for_build_wheel(
315
318
  self,
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.7.2'
16
- __version_tuple__ = version_tuple = (1, 7, 2)
15
+ __version__ = version = '1.9.0'
16
+ __version_tuple__ = version_tuple = (1, 9, 0)
@@ -5,11 +5,12 @@ import sys
5
5
  from contextlib import contextmanager
6
6
  from subprocess import PIPE, Popen # noqa: S404
7
7
  from threading import Thread
8
- from typing import IO, TYPE_CHECKING, Any, Iterator, Tuple, cast
8
+ from typing import IO, TYPE_CHECKING, Any, cast
9
9
 
10
10
  from ._frontend import CmdStatus, Frontend
11
11
 
12
12
  if TYPE_CHECKING:
13
+ from collections.abc import Iterator
13
14
  from pathlib import Path
14
15
 
15
16
  from packaging.requirements import Requirement
@@ -30,7 +31,7 @@ class SubprocessCmdStatus(CmdStatus, Thread):
30
31
  return self.process.returncode is not None
31
32
 
32
33
  def out_err(self) -> tuple[str, str]:
33
- return cast(Tuple[str, str], self._out_err)
34
+ return cast("tuple[str, str]", self._out_err)
34
35
 
35
36
 
36
37
  class SubprocessFrontend(Frontend):
@@ -71,7 +72,7 @@ class SubprocessFrontend(Frontend):
71
72
  cwd=self._root,
72
73
  env=env,
73
74
  )
74
- cast(IO[str], process.stdin).write(f"{os.linesep}{msg}{os.linesep}")
75
+ cast("IO[str]", process.stdin).write(f"{os.linesep}{msg}{os.linesep}")
75
76
  yield SubprocessCmdStatus(process)
76
77
 
77
78
  def send_cmd(self, cmd: str, **kwargs: Any) -> tuple[Any, str, str]:
@@ -177,7 +177,7 @@ def test_no_wheel_prepare_metadata_for_build_wheel(local_builder: Callable[[str]
177
177
  tmp_path = local_builder(txt)
178
178
  frontend = SubprocessFrontend(*SubprocessFrontend.create_args_from_folder(tmp_path)[:-1])
179
179
 
180
- with pytest.raises(RuntimeError, match="missing wheel file return by backed *"):
180
+ with pytest.raises(RuntimeError, match=r"missing wheel file return by backed *"):
181
181
  frontend.metadata_from_built(tmp_path, "wheel")
182
182
 
183
183
 
@@ -213,7 +213,7 @@ def test_bad_wheel_metadata_from_built_wheel(local_builder: Callable[[str], Path
213
213
  tmp_path = local_builder(txt)
214
214
  frontend = SubprocessFrontend(*SubprocessFrontend.create_args_from_folder(tmp_path)[:-1])
215
215
 
216
- with pytest.raises(RuntimeError, match="no .dist-info found inside generated wheel*"):
216
+ with pytest.raises(RuntimeError, match=r"no .dist-info found inside generated wheel*"):
217
217
  frontend.metadata_from_built(tmp_path, "wheel")
218
218
 
219
219
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import sys
4
4
  from contextlib import contextmanager
5
5
  from stat import S_IWGRP, S_IWOTH, S_IWUSR
6
- from typing import TYPE_CHECKING, Iterator, NamedTuple
6
+ from typing import TYPE_CHECKING, NamedTuple
7
7
 
8
8
  import pytest
9
9
 
@@ -11,6 +11,7 @@ from pyproject_api._frontend import BackendFailed
11
11
  from pyproject_api._via_fresh_subprocess import SubprocessFrontend
12
12
 
13
13
  if TYPE_CHECKING:
14
+ from collections.abc import Iterator
14
15
  from pathlib import Path
15
16
 
16
17
  from _pytest.tmpdir import TempPathFactory
@@ -73,7 +74,8 @@ def test_setuptools_prepare_metadata_for_build_wheel(frontend_setuptools: Subpro
73
74
  assert dist.metadata["Name"] == "demo"
74
75
  values = [v for k, v in dist.metadata.items() if k == "Requires-Dist"] # type: ignore[attr-defined]
75
76
  # ignore because "PackageMetadata" has no attribute "items"
76
- assert sorted(values) == ["magic >3", "requests >2"]
77
+ expected = ["magic>3", "requests>2"] if sys.version_info[0:2] > (3, 8) else ["magic >3", "requests >2"]
78
+ assert sorted(values) == expected
77
79
  assert isinstance(result.out, str)
78
80
  assert isinstance(result.err, str)
79
81
 
@@ -1,7 +1,7 @@
1
1
  [tox]
2
2
  requires =
3
- tox>=4.2
4
- tox-uv>=1.11
3
+ tox>=4.23.2
4
+ tox-uv>=1.17
5
5
  env_list =
6
6
  fix
7
7
  3.13
@@ -9,7 +9,6 @@ env_list =
9
9
  3.11
10
10
  3.10
11
11
  3.9
12
- 3.8
13
12
  docs
14
13
  type
15
14
  pkg_meta
@@ -23,7 +22,7 @@ extras =
23
22
  testing
24
23
  pass_env =
25
24
  DIFF_AGAINST
26
- PYTES_*
25
+ PYTEST_*
27
26
  set_env =
28
27
  COVERAGE_FILE = {work_dir}/.coverage.{env_name}
29
28
  COVERAGE_PROCESS_START = {tox_root}/pyproject.toml
@@ -40,7 +39,7 @@ commands =
40
39
  description = run static analysis and style check using flake8
41
40
  package = skip
42
41
  deps =
43
- pre-commit-uv>=4.1.1
42
+ pre-commit-uv>=4.1.4
44
43
  pass_env =
45
44
  HOMEPATH
46
45
  PROGRAMDATA
@@ -53,13 +52,13 @@ description = build documentation
53
52
  extras =
54
53
  docs
55
54
  commands =
56
- sphinx-build -d "{env_tmp_dir}{/}doc_tree" docs "{work_dir}{/}docs_out" --color -b html {posargs} -W
55
+ sphinx-build -d "{env_tmp_dir}{/}doc_tree" docs "{work_dir}{/}docs_out" --color -b html {posargs: -W}
57
56
  python -c 'print(r"documentation available under file://{work_dir}{/}docs_out{/}index.html")'
58
57
 
59
58
  [testenv:type]
60
59
  description = run type check on code base
61
60
  deps =
62
- mypy==1.11.2
61
+ mypy==1.14.1
63
62
  set_env =
64
63
  {tty:MYPY_FORCE_COLOR = 1}
65
64
  commands =
@@ -70,9 +69,9 @@ commands =
70
69
  description = check that the long description is valid
71
70
  skip_install = true
72
71
  deps =
73
- check-wheel-contents>=0.6
74
- twine>=5.1.1
75
- uv>=0.4.10
72
+ check-wheel-contents>=0.6.1
73
+ twine>=6.0.1
74
+ uv>=0.5.18
76
75
  commands =
77
76
  uv build --sdist --wheel --out-dir {env_tmp_dir} .
78
77
  twine check {env_tmp_dir}{/}*
File without changes
File without changes
File without changes