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.
- pyproject_api-1.9.0/.github/FUNDING.yml +1 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/workflows/check.yaml +1 -2
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/workflows/release.yaml +2 -2
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.pre-commit-config.yaml +6 -6
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/PKG-INFO +9 -10
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/docs/conf.py +33 -1
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/pyproject.toml +8 -12
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_backend.py +5 -7
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_backend.pyi +2 -1
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_frontend.py +8 -5
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_version.py +2 -2
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_via_fresh_subprocess.py +4 -3
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_frontend.py +2 -2
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_frontend_setuptools.py +4 -2
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tox.ini +9 -10
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/dependabot.yml +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.github/release.yml +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.gitignore +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/.readthedocs.yml +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/CODE_OF_CONDUCT.md +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/LICENSE +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/README.md +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/docs/api.rst +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/docs/index.rst +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/__init__.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/__main__.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/_util.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/src/pyproject_api/py.typed +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/_build_sdist.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/demo_pkg_inline/build.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/demo_pkg_inline/pyproject.toml +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_backend.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_main.py +0 -0
- {pyproject_api-1.7.2 → pyproject_api-1.9.0}/tests/test_util.py +0 -0
- {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@
|
|
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@
|
|
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.
|
|
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:
|
|
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.
|
|
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.
|
|
16
|
+
additional_dependencies: ["tomli>=2.2.1"]
|
|
17
17
|
- repo: https://github.com/tox-dev/tox-ini-fmt
|
|
18
|
-
rev: "1.4.
|
|
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: "
|
|
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.
|
|
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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pyproject-api
|
|
3
|
-
Version: 1.
|
|
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.
|
|
32
|
-
Requires-Dist: packaging>=24.
|
|
33
|
-
Requires-Dist: tomli>=2.
|
|
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>=
|
|
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>=
|
|
38
|
+
Requires-Dist: pytest-cov>=6; extra == 'testing'
|
|
40
39
|
Requires-Dist: pytest-mock>=3.14; extra == 'testing'
|
|
41
|
-
Requires-Dist: pytest>=8.3.
|
|
42
|
-
Requires-Dist: setuptools>=75.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
51
|
-
"tomli>=2.
|
|
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>=
|
|
54
|
+
"sphinx-autodoc-typehints>=3",
|
|
56
55
|
]
|
|
57
56
|
optional-dependencies.testing = [
|
|
58
57
|
"covdefaults>=2.3",
|
|
59
|
-
"pytest>=8.3.
|
|
60
|
-
"pytest-cov>=
|
|
58
|
+
"pytest>=8.3.4",
|
|
59
|
+
"pytest-cov>=6",
|
|
61
60
|
"pytest-mock>=3.14",
|
|
62
|
-
"setuptools>=75.
|
|
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}"
|
|
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={
|
|
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 {}"
|
|
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: {}"
|
|
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 {}"
|
|
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
|
|
@@ -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
|
|
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[
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
@@ -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,
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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>=
|
|
75
|
-
uv>=0.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|