pycargoebuild 0.17.0__tar.gz → 0.17.2__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 (42) hide show
  1. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/PKG-INFO +2 -2
  2. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/__init__.py +1 -1
  3. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/__main__.py +16 -19
  4. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/cargo.py +7 -11
  5. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/ebuild.py +11 -7
  6. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/fetch.py +6 -2
  7. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/format.py +4 -2
  8. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pycargoebuild/license.py +8 -4
  9. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/pyproject.toml +4 -22
  10. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/test_cargo.py +20 -0
  11. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/test_ebuild.py +1 -1
  12. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/tox.ini +4 -3
  13. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/COPYING +0 -0
  14. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/README.rst +0 -0
  15. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/data/share/bash-completion/completions/pycargoebuild +0 -0
  16. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/__init__.py +0 -0
  17. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/alass-2.0.0.ebuild +0 -0
  18. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/attest-0.1.0.ebuild +0 -0
  19. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/bindgen-0.63.0.ebuild +0 -0
  20. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/blake3-0.3.3.ebuild +0 -0
  21. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/cryptography-38.0.3.ebuild +0 -0
  22. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/fish-shell-4.8.0.ebuild +0 -0
  23. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/fractal-5.0.0.ebuild +0 -0
  24. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/lemmy_server-0.18.0.ebuild +0 -0
  25. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/license-mapping.conf +0 -0
  26. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/mdbook-linkcheck-0.7.7.ebuild +0 -0
  27. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/milkshake-terminal-0.0.0.ebuild +0 -0
  28. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/news_flash_gtk-0.0.0.ebuild +0 -0
  29. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/qiskit-terra-0.22.3.ebuild +0 -0
  30. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/ruffle_core-0.1.0.ebuild +0 -0
  31. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/rustic-rs-0.5.0.ebuild +0 -0
  32. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/rustls-0.20.7.ebuild +0 -0
  33. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/rustworkx-0.12.1.ebuild +0 -0
  34. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/setuptools-rust-1.5.2.ebuild +0 -0
  35. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/synapse-0.1.0.ebuild +0 -0
  36. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/test_integration.py +0 -0
  37. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/integration_test/watchfiles-0.18.1.ebuild +0 -0
  38. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/__init__.py +0 -0
  39. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/conftest.py +0 -0
  40. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/test_fetch.py +0 -0
  41. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/test_format.py +0 -0
  42. {pycargoebuild-0.17.0 → pycargoebuild-0.17.2}/test/test_license.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycargoebuild
3
- Version: 0.17.0
3
+ Version: 0.17.2
4
4
  Summary: A generator for Rust/Cargo ebuilds written in Python
5
5
  Author-email: Michał Górny <mgorny@gentoo.org>
6
6
  Requires-Python: >=3.10
@@ -9,7 +9,7 @@ Classifier: License :: OSI Approved :: GNU General Public License v2 or later (G
9
9
  License-File: COPYING
10
10
  Requires-Dist: jinja2
11
11
  Requires-Dist: license_expression
12
- Requires-Dist: tomli >= 1.2.3; python_version < '3.11'
12
+ Requires-Dist: tomli >= 2.4.0; python_version < '3.15'
13
13
  Requires-Dist: rich ; extra == "pretty-log"
14
14
  Requires-Dist: pytest ; extra == "test"
15
15
  Project-URL: Repository, https://gitweb.gentoo.org/proj/pycargoebuild.git/
@@ -4,4 +4,4 @@
4
4
 
5
5
  """A generator for Rust/Cargo ebuilds written in Python"""
6
6
 
7
- __version__ = "0.17.0"
7
+ __version__ = "0.17.2"
@@ -2,6 +2,8 @@
2
2
  # (c) 2022-2026 Michał Górny <mgorny@gentoo.org>
3
3
  # SPDX-License-Identifier: GPL-2.0-or-later
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import argparse
6
8
  import datetime
7
9
  import enum
@@ -18,7 +20,7 @@ import tempfile
18
20
  import typing
19
21
  from pathlib import Path, PurePosixPath
20
22
 
21
- if sys.version_info >= (3, 11):
23
+ if sys.version_info >= (3, 15):
22
24
  import tomllib
23
25
  else:
24
26
  import tomli as tomllib
@@ -90,7 +92,7 @@ def main(prog_name: str, *argv: str) -> int:
90
92
  action="store_true",
91
93
  help="Force overwriting the output file")
92
94
  opt_g.add_argument("-i", "--input", "--inplace",
93
- type=argparse.FileType("r", encoding="utf-8"),
95
+ type=Path,
94
96
  metavar="INPUT",
95
97
  help="Update the CRATES and LICENSE variables "
96
98
  "in the specified ebuild instead of creating "
@@ -117,7 +119,7 @@ def main(prog_name: str, *argv: str) -> int:
117
119
  default="auto",
118
120
  help="Fetcher to use")
119
121
  cfg_g.add_argument("-l", "--license-mapping",
120
- type=argparse.FileType("r", encoding="utf-8"),
122
+ type=Path,
121
123
  help="Path to license-mapping.conf file (default: "
122
124
  "get from Portage)")
123
125
  cfg_g.add_argument("--no-config",
@@ -191,10 +193,8 @@ def main(prog_name: str, *argv: str) -> int:
191
193
  if default_distdir is not None:
192
194
  args.distdir = Path(default_distdir)
193
195
  if args.license_mapping is None:
194
- default_license_mapping = config_toml_paths.get("license-mapping")
195
- if default_license_mapping is not None:
196
- args.license_mapping = open(default_license_mapping, "r",
197
- encoding="utf-8")
196
+ # may still be None
197
+ args.license_mapping = config_toml_paths.get("license-mapping")
198
198
 
199
199
  if args.distdir is None or args.license_mapping is None:
200
200
  from portage import create_trees
@@ -204,11 +204,10 @@ def main(prog_name: str, *argv: str) -> int:
204
204
  args.distdir = Path(tree["porttree"].settings["DISTDIR"])
205
205
  if args.license_mapping is None:
206
206
  repo = Path(tree["porttree"].dbapi.repositories["gentoo"].location)
207
- args.license_mapping = open(repo / "metadata/license-mapping.conf",
208
- "r", encoding="utf-8")
207
+ args.license_mapping = repo / "metadata/license-mapping.conf"
209
208
 
210
- load_license_mapping(args.license_mapping)
211
- args.license_mapping.close()
209
+ with open(args.license_mapping, "r", encoding="utf-8") as f:
210
+ load_license_mapping(f)
212
211
  MAPPING.update(
213
212
  (k.lower(), v) for k, v
214
213
  in config_toml.get("license-mapping", {}).items())
@@ -348,7 +347,7 @@ def main(prog_name: str, *argv: str) -> int:
348
347
 
349
348
  if args.input is not None and args.output is None:
350
349
  # default to overwriting the input file
351
- outfile = Path(args.input.name)
350
+ outfile = args.input
352
351
  else:
353
352
  # This warning is only relevant when constructing a new ebuild,
354
353
  # as otherwise we do not update other metadata.
@@ -391,17 +390,16 @@ def main(prog_name: str, *argv: str) -> int:
391
390
  "overwrite it")
392
391
  return 1
393
392
  with tempfile.NamedTemporaryFile(mode="wb",
394
- dir=args.distdir,
393
+ dir=crate_tarball.parent,
395
394
  delete=False
396
395
  ) as cratef:
397
396
  try:
398
- # typing: https://github.com/python/typeshed/issues/11072
399
397
  with tarfile.open(fileobj=cratef,
400
398
  mode="w:xz",
401
399
  format=tarfile.GNU_FORMAT,
402
400
  encoding="UTF-8",
403
- preset=9 | lzma.PRESET_EXTREME, # type: ignore
404
- ) as tar_out: # type: ignore
401
+ preset=9 | lzma.PRESET_EXTREME,
402
+ ) as tar_out:
405
403
  os.fchmod(cratef.fileno(), 0o666 & ~umask)
406
404
  logging.info("Repacking crates ...")
407
405
  repack_crates(tar_out, crates)
@@ -418,7 +416,7 @@ def main(prog_name: str, *argv: str) -> int:
418
416
  try:
419
417
  if args.input is not None:
420
418
  ebuild = update_ebuild(
421
- args.input.read(),
419
+ args.input.read_text(encoding="utf-8"),
422
420
  pkg_meta,
423
421
  crates,
424
422
  distdir=args.distdir,
@@ -467,10 +465,9 @@ def main(prog_name: str, *argv: str) -> int:
467
465
  delete=False) as outf:
468
466
  try:
469
467
  if args.input is not None:
470
- st = os.stat(args.input.fileno())
468
+ st = args.input.stat()
471
469
  os.chown(outf.fileno(), st.st_uid, st.st_gid)
472
470
  os.chmod(outf.fileno(), stat.S_IMODE(st.st_mode))
473
- args.input.close()
474
471
  else:
475
472
  os.fchmod(outf.fileno(), 0o666 & ~umask)
476
473
  outf.write(ebuild)
@@ -1,7 +1,9 @@
1
1
  # pycargoebuild
2
- # (c) 2022-2024 Michał Górny <mgorny@gentoo.org>
2
+ # (c) 2022-2026 Michał Górny <mgorny@gentoo.org>
3
3
  # SPDX-License-Identifier: GPL-2.0-or-later
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import dataclasses
6
8
  import enum
7
9
  import functools
@@ -11,7 +13,7 @@ import typing
11
13
  import urllib.parse
12
14
  from pathlib import Path, PurePath
13
15
 
14
- if sys.version_info >= (3, 11):
16
+ if sys.version_info >= (3, 15):
15
17
  import tomllib
16
18
  else:
17
19
  import tomli as tomllib
@@ -131,10 +133,7 @@ class GitCrate(Crate):
131
133
  raise RuntimeError(
132
134
  f"{root_dir}/Cargo.toml not found in {filename}")
133
135
  with tarf:
134
- # tarfile.ExFileObject() is IO[bytes] while tomli/tomllib
135
- # expects BinaryIO -- but it actually is compatible
136
- # https://github.com/hukkin/tomli/issues/214
137
- return (tomllib.load(tarf).get("workspace", {}) # type: ignore
136
+ return (tomllib.load(tarf).get("workspace", {})
138
137
  .get("package", {}))
139
138
 
140
139
  @functools.cache
@@ -149,9 +148,6 @@ class GitCrate(Crate):
149
148
  if f is None:
150
149
  continue
151
150
 
152
- # tarfile.ExFileObject() is IO[bytes] while tomli/tomllib
153
- # expects BinaryIO -- but it actually is compatible
154
- # https://github.com/hukkin/tomli/issues/214
155
151
  try:
156
152
  metadata = get_package_metadata(
157
153
  f, workspace_toml) # type: ignore
@@ -190,7 +186,7 @@ class GitCrate(Crate):
190
186
  tarf = crate_tar.extractfile(tar_info)
191
187
  assert tarf is not None
192
188
  with tarf:
193
- if "workspace" in tomllib.load(tarf): # type: ignore
189
+ if "workspace" in tomllib.load(tarf):
194
190
  return path.parent
195
191
  return None
196
192
 
@@ -205,7 +201,7 @@ class PackageMetadata(typing.NamedTuple):
205
201
  homepage: str | None = None
206
202
 
207
203
  def with_replaced_license(self, new_license: str | None
208
- ) -> "PackageMetadata":
204
+ ) -> PackageMetadata:
209
205
  return PackageMetadata(name=self.name,
210
206
  version=self.version,
211
207
  features=self.features,
@@ -1,7 +1,9 @@
1
1
  # pycargoebuild
2
- # (c) 2022-2025 Michał Górny <mgorny@gentoo.org>
2
+ # (c) 2022-2026 Michał Górny <mgorny@gentoo.org>
3
3
  # SPDX-License-Identifier: GPL-2.0-or-later
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import datetime
6
8
  import logging
7
9
  import re
@@ -10,7 +12,6 @@ import tarfile
10
12
  import typing
11
13
  import urllib.parse
12
14
  from functools import partial
13
- from pathlib import Path
14
15
 
15
16
  import jinja2
16
17
  import license_expression
@@ -26,6 +27,9 @@ from pycargoebuild.cargo import (
26
27
  from pycargoebuild.format import format_license_var
27
28
  from pycargoebuild.license import UnmatchedLicense, spdx_to_ebuild
28
29
 
30
+ if typing.TYPE_CHECKING:
31
+ from pathlib import Path
32
+
29
33
  EBUILD_TEMPLATE = """\
30
34
  # Copyright {{year}} Gentoo Authors
31
35
  # Distributed under the terms of the GNU General Public License v2
@@ -72,7 +76,7 @@ src_configure() {
72
76
  """
73
77
 
74
78
 
75
- def get_CRATES(crates: typing.Iterable[Crate],
79
+ def get_CRATES(crates: set[Crate],
76
80
  ) -> str:
77
81
  """
78
82
  Return the value of CRATES for the given crate list
@@ -231,7 +235,7 @@ def url_dquote_escape(value: str) -> str:
231
235
 
232
236
 
233
237
  def get_ebuild(pkg_meta: PackageMetadata,
234
- crates: typing.Iterable[Crate],
238
+ crates: set[Crate],
235
239
  distdir: Path,
236
240
  *,
237
241
  crate_license: bool = True,
@@ -251,7 +255,7 @@ def get_ebuild(pkg_meta: PackageMetadata,
251
255
  compiled_template = jinja_env.from_string(template)
252
256
 
253
257
  return compiled_template.render(
254
- crates=get_CRATES(crates if crate_tarball is None else ()),
258
+ crates=get_CRATES(crates if crate_tarball is None else set()),
255
259
  crate_licenses=(get_crate_LICENSE(crates, distdir, license_overrides)
256
260
  if crate_license else None),
257
261
  description=bash_dquote_escape(collapse_whitespace(
@@ -313,7 +317,7 @@ class GitCratesSubst(CountingSubst):
313
317
 
314
318
  def update_ebuild(ebuild: str,
315
319
  pkg_meta: PackageMetadata,
316
- crates: typing.Iterable[Crate],
320
+ crates: set[Crate],
317
321
  distdir: Path,
318
322
  *,
319
323
  crate_license: bool = True,
@@ -327,7 +331,7 @@ def update_ebuild(ebuild: str,
327
331
  if license_overrides is None:
328
332
  license_overrides = {}
329
333
  crates_repl = CountingSubst(
330
- partial(get_CRATES, crates if crate_tarball is None else ()))
334
+ partial(get_CRATES, crates if crate_tarball is None else set()))
331
335
  git_crates_repl = GitCratesSubst(partial(get_GIT_CRATES, crates, distdir))
332
336
  crate_license_repl = (
333
337
  CountingSubst(partial(get_crate_LICENSE, crates, distdir,
@@ -1,17 +1,21 @@
1
1
  # pycargoebuild
2
- # (c) 2022-2024 Michał Górny <mgorny@gentoo.org>
2
+ # (c) 2022-2026 Michał Górny <mgorny@gentoo.org>
3
3
  # SPDX-License-Identifier: GPL-2.0-or-later
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import hashlib
6
8
  import subprocess
7
9
  import sys
8
10
  import tempfile
9
11
  import typing
10
- from pathlib import Path
11
12
 
12
13
  from pycargoebuild import __version__
13
14
  from pycargoebuild.cargo import Crate, FileCrate
14
15
 
16
+ if typing.TYPE_CHECKING:
17
+ from pathlib import Path
18
+
15
19
 
16
20
  class ChecksumMismatchError(RuntimeError):
17
21
  def __init__(self,
@@ -1,14 +1,16 @@
1
1
  # pycargoebuild
2
- # (c) 2022-2024 Michał Górny <mgorny@gentoo.org>
2
+ # (c) 2022-2026 Michał Górny <mgorny@gentoo.org>
3
3
  # SPDX-License-Identifier: GPL-2.0-or-later
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import typing
6
8
  from textwrap import TextWrapper
7
9
 
8
10
 
9
11
  class CompoundGroup(typing.NamedTuple):
10
12
  prefix: list[str]
11
- values: list[typing.Union[str, "CompoundGroup"]]
13
+ values: list[str | CompoundGroup]
12
14
  suffix: list[str]
13
15
 
14
16
 
@@ -1,7 +1,9 @@
1
1
  # pycargoebuild
2
- # (c) 2022-2024 Michał Górny <mgorny@gentoo.org>
2
+ # (c) 2022-2026 Michał Górny <mgorny@gentoo.org>
3
3
  # SPDX-License-Identifier: GPL-2.0-or-later
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import configparser
6
8
  import logging
7
9
  import typing
@@ -23,7 +25,7 @@ class UnmatchedLicense(RuntimeError):
23
25
  self.crate = crate
24
26
 
25
27
 
26
- def load_license_mapping(f: typing.IO["str"]) -> None:
28
+ def load_license_mapping(f: typing.IO[str]) -> None:
27
29
  """Read license mapping from the specified file"""
28
30
  conf = configparser.ConfigParser(comment_prefixes=("#",),
29
31
  delimiters=("=",),
@@ -33,7 +35,9 @@ def load_license_mapping(f: typing.IO["str"]) -> None:
33
35
  MAPPING.update((k.lower(), v) for k, v in conf.items("spdx-to-ebuild"))
34
36
 
35
37
 
36
- def symbol_to_ebuild(license_symbol: license_expression.LicenseSymbol) -> str:
38
+ def symbol_to_ebuild(license_symbol: license_expression.LicenseSymbol |
39
+ license_expression.LicenseWithExceptionSymbol
40
+ ) -> str:
37
41
  full_key = str(license_symbol).lower()
38
42
  full_match = MAPPING.get(full_key)
39
43
  no_plus = MAPPING.get(full_key.replace("+", ""))
@@ -64,7 +68,7 @@ def spdx_to_ebuild(spdx: license_expression.Renderable) -> str:
64
68
  """
65
69
  Convert SPDX license expression to ebuild license string.
66
70
  """
67
- def sub(x: license_expression.LicenseExpression, in_or: bool
71
+ def sub(x: license_expression.Renderable, in_or: bool
68
72
  ) -> typing.Generator[str, None, None]:
69
73
  if isinstance(x, license_expression.AND):
70
74
  if in_or:
@@ -15,7 +15,7 @@ requires-python = ">=3.10"
15
15
  dependencies = [
16
16
  "jinja2",
17
17
  "license_expression",
18
- "tomli >= 1.2.3; python_version < '3.11'",
18
+ "tomli >= 2.4.0; python_version < '3.15'",
19
19
  ]
20
20
 
21
21
  [project.optional-dependencies]
@@ -41,27 +41,6 @@ include = [
41
41
  "tox.ini",
42
42
  ]
43
43
 
44
- [tool.mypy]
45
- disallow_untyped_defs = true
46
- no_implicit_optional = true
47
-
48
- [[tool.mypy.overrides]]
49
- module = [
50
- "integration_test.*",
51
- "test.*",
52
- ]
53
- # requiring explicit types for all test methods would be cumbersome
54
- disallow_untyped_defs = false
55
- check_untyped_defs = true
56
-
57
- [[tool.mypy.overrides]]
58
- module = [
59
- "license_expression.*",
60
- "portage.*",
61
- "rich.*",
62
- ]
63
- ignore_missing_imports = true
64
-
65
44
  [tool.pytest.ini_options]
66
45
  testpaths = [
67
46
  "test",
@@ -115,3 +94,6 @@ ignore = [
115
94
  [tool.ruff.lint.flake8-copyright]
116
95
  min-file-size = 1
117
96
  notice-rgx = "\\(c\\) \\d{4}(-\\d{4})?"
97
+
98
+ [tool.ty.analysis]
99
+ allowed-unresolved-imports = ["portage.**"]
@@ -256,6 +256,26 @@ def test_get_package_metadata_default_version():
256
256
  version="0.0.0"))
257
257
 
258
258
 
259
+ def test_get_package_metadata_toml_1_1():
260
+ input_toml = b"""
261
+ [package]
262
+ name = "test"
263
+ version = "0"
264
+ license = "MIT"
265
+
266
+ [dependencies]
267
+ foo = {
268
+ version = "2",
269
+ features = ["a", "b"],
270
+ }
271
+ """
272
+
273
+ assert (get_package_metadata(io.BytesIO(input_toml)) ==
274
+ PackageMetadata(name="test",
275
+ version="0",
276
+ license="MIT"))
277
+
278
+
259
279
  TOP_CARGO_TOML = b"""\
260
280
  [package]
261
281
  name = "toplevel"
@@ -275,7 +275,7 @@ def test_get_ebuild_no_license(real_license_mapping, crate_dir, crates):
275
275
 
276
276
 
277
277
  def test_get_ebuild_no_crates(real_license_mapping, pkg_meta):
278
- assert get_ebuild(pkg_meta, [], Path(".")) == textwrap.dedent(f"""\
278
+ assert get_ebuild(pkg_meta, set(), Path(".")) == textwrap.dedent(f"""\
279
279
  # Copyright {datetime.date.today().year} Gentoo Authors
280
280
  # Distributed under the terms of the GNU General Public License v2
281
281
 
@@ -1,15 +1,16 @@
1
1
  [tox]
2
- envlist = qa,py310,py311,py312,py313,py314
2
+ envlist = qa,py310,py311,py312,py313,py314,py315
3
3
  isolated_build = True
4
4
 
5
5
  [testenv]
6
6
  deps =
7
- mypy
7
+ ty
8
8
  extras =
9
+ pretty-log
9
10
  test
10
11
  commands =
11
12
  pytest -vv {posargs:test}
12
- mypy {posargs:integration_test pycargoebuild test}
13
+ ty check --python-version={py_dot_ver} {posargs:integration_test pycargoebuild test}
13
14
 
14
15
  [testenv:integration]
15
16
  deps =
File without changes