pyproject-api 1.12.3__tar.gz → 1.12.5__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 (52) hide show
  1. pyproject_api-1.12.5/.github/workflows/check.yaml +67 -0
  2. pyproject_api-1.12.5/.github/workflows/codeql.yaml +22 -0
  3. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/workflows/news.yaml +3 -6
  4. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/workflows/prepare-release.yaml +9 -2
  5. pyproject_api-1.12.5/.github/workflows/release.yaml +56 -0
  6. pyproject_api-1.12.5/.github/workflows/scorecard.yaml +26 -0
  7. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/workflows/upgrade-release-tools.yaml +1 -1
  8. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.pre-commit-config.yaml +3 -3
  9. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/CONTRIBUTING.md +4 -0
  10. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/PKG-INFO +7 -6
  11. pyproject_api-1.12.5/README.md +11 -0
  12. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/api.rst +8 -0
  13. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/changelog.rst +21 -0
  14. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/pylock.toml +204 -205
  15. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/pyproject.toml +6 -5
  16. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/_frontend.py +2 -5
  17. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/_util.py +5 -2
  18. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/_version.py +2 -2
  19. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/test_frontend.py +27 -0
  20. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/test_frontend_setuptools.py +1 -2
  21. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/test_util.py +41 -0
  22. pyproject_api-1.12.3/.github/workflows/check.yaml +0 -83
  23. pyproject_api-1.12.3/.github/workflows/codeql.yaml +0 -41
  24. pyproject_api-1.12.3/.github/workflows/release.yaml +0 -118
  25. pyproject_api-1.12.3/README.md +0 -10
  26. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/FUNDING.yaml +0 -0
  27. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/SECURITY.md +0 -0
  28. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/THREAT_MODEL.md +0 -0
  29. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/dependabot.yaml +0 -0
  30. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.github/release.yaml +0 -0
  31. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.gitignore +0 -0
  32. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/.readthedocs.yml +0 -0
  33. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/CODE_OF_CONDUCT.md +0 -0
  34. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/LICENSE +0 -0
  35. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/changelog.d/.gitkeep +0 -0
  36. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/changelog.d/template.jinja2 +0 -0
  37. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/conf.py +0 -0
  38. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/contributing.rst +0 -0
  39. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/docs/index.rst +0 -0
  40. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/__init__.py +0 -0
  41. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/__main__.py +0 -0
  42. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/_backend.py +0 -0
  43. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/_backend.pyi +0 -0
  44. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/_via_fresh_subprocess.py +0 -0
  45. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/src/pyproject_api/py.typed +0 -0
  46. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/_build_sdist.py +0 -0
  47. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/demo_pkg_inline/build.py +0 -0
  48. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/demo_pkg_inline/pyproject.toml +0 -0
  49. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/test_backend.py +0 -0
  50. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/test_main.py +0 -0
  51. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tests/test_version.py +0 -0
  52. {pyproject_api-1.12.3 → pyproject_api-1.12.5}/tox.toml +0 -0
@@ -0,0 +1,67 @@
1
+ name: 🧪 check
2
+ on:
3
+ workflow_dispatch:
4
+ push:
5
+ branches: ["main"]
6
+ tags-ignore: ["**"]
7
+ pull_request:
8
+ types: [opened, synchronize, reopened]
9
+ schedule:
10
+ - cron: "43 7 * * *"
11
+ concurrency:
12
+ group: check-${{ github.ref }}
13
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
14
+ permissions:
15
+ contents: read
16
+ jobs:
17
+ test:
18
+ name: 🧪 Test
19
+ uses: tox-dev/github-workflows/.github/workflows/check.yaml@13381289334b15375958be7f7438f3c3d860e575 # 6.5.5
20
+ permissions:
21
+ contents: read
22
+ with:
23
+ include: |
24
+ [
25
+ {"env": "3.15"},
26
+ {"env": "3.15t", "python": "3.15t"},
27
+ {"env": "3.14", "python": "3.14"},
28
+ {"env": "3.13", "python": "3.13"},
29
+ {"env": "3.12", "python": "3.12"},
30
+ {"env": "3.11", "python": "3.11"},
31
+ {"env": "type"},
32
+ {"env": "dev"},
33
+ {"env": "pkg_meta"},
34
+ {"env": "3.15", "os": "windows-2025-vs2026"},
35
+ {"env": "3.15t", "python": "3.15t", "os": "windows-2025-vs2026"},
36
+ {"env": "3.14", "python": "3.14", "os": "windows-2025-vs2026"},
37
+ {"env": "3.13", "python": "3.13", "os": "windows-2025-vs2026"},
38
+ {"env": "3.12", "python": "3.12", "os": "windows-2025-vs2026"},
39
+ {"env": "3.11", "python": "3.11", "os": "windows-2025-vs2026"},
40
+ {"env": "type", "os": "windows-2025-vs2026"},
41
+ {"env": "dev", "os": "windows-2025-vs2026"},
42
+ {"env": "pkg_meta", "os": "windows-2025-vs2026"},
43
+ {"env": "3.15", "os": "macos-26"}
44
+ ]
45
+ release:
46
+ name: 🏷️ Release dry run
47
+ uses: $/.github/workflows/prepare-release.yaml
48
+ permissions:
49
+ contents: read
50
+ pull-requests: read
51
+ with:
52
+ dry-run: true
53
+ hooks:
54
+ name: 🧹 Hooks under the cooldown
55
+ uses: tox-dev/github-workflows/.github/workflows/cooled-hooks.yaml@0c4cffd63033d38196319524d101caae1eef925b # 6.7.2
56
+ permissions:
57
+ contents: read
58
+ gate:
59
+ name: 🚦 ${{ github.event_name == 'pull_request' && 'Required checks pass' || 'Non-PR checks pass' }}
60
+ if: ${{ !cancelled() }} # codespell:ignore cancelled
61
+ needs: [test, release, hooks]
62
+ runs-on: ubuntu-26.04
63
+ steps:
64
+ - name: 🚦 Require all needed jobs to pass
65
+ uses: tox-dev/github-workflows/required-checks@13381289334b15375958be7f7438f3c3d860e575 # 6.5.5
66
+ with:
67
+ needs: ${{ toJSON(needs) }}
@@ -0,0 +1,22 @@
1
+ name: 🛡️ CodeQL
2
+ on:
3
+ workflow_dispatch:
4
+ push:
5
+ branches: ["main"]
6
+ pull_request:
7
+ schedule:
8
+ - cron: "0 9 * * 2"
9
+ concurrency:
10
+ group: codeql-${{ github.ref }}
11
+ cancel-in-progress: true
12
+ permissions: {}
13
+ jobs:
14
+ analyze:
15
+ name: 🛡️ Analyze
16
+ uses: tox-dev/github-workflows/.github/workflows/codeql.yaml@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
17
+ permissions:
18
+ contents: read
19
+ security-events: write
20
+ with:
21
+ languages: '["actions","python"]'
22
+ paths-ignore: '["tests"]'
@@ -2,9 +2,6 @@ name: 📝 Changelog
2
2
  on:
3
3
  pull_request:
4
4
  types: [opened, reopened, synchronize, labeled, unlabeled]
5
- concurrency:
6
- group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
7
- cancel-in-progress: true
8
5
  permissions:
9
6
  contents: read
10
7
  pull-requests: read
@@ -19,15 +16,15 @@ jobs:
19
16
  fetch-depth: 0
20
17
  persist-credentials: false
21
18
  - name: 🐍 Install uv
22
- uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
19
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
23
20
  with:
24
21
  version: latest-known
25
22
  python-version: "3.15"
26
23
  enable-cache: false
27
24
  - name: 📦 Install locked release tools
28
- uses: tox-dev/github-workflows/install-locked-tools@57a765127aae73adf7d0e24a7fe0f067f2d3ea3e # 6.2.1
25
+ uses: tox-dev/github-workflows/install-locked-tools@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
29
26
  with:
30
27
  groups: release-news
31
28
  venv: ${{ runner.temp }}/release-tools
32
29
  - name: 🔍 Validate news fragments
33
- uses: tox-dev/github-workflows/validate-news@57a765127aae73adf7d0e24a7fe0f067f2d3ea3e # 6.2.1
30
+ uses: tox-dev/github-workflows/validate-news@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
@@ -12,15 +12,22 @@ on:
12
12
  - minor
13
13
  - patch
14
14
  default: auto
15
+ workflow_call:
16
+ inputs:
17
+ dry-run:
18
+ description: Assemble the release without pushing, for the pull request gate
19
+ type: boolean
20
+ required: true
15
21
  permissions: {}
16
22
  jobs:
17
23
  prepare:
18
24
  name: 🏷️ Prepare Towncrier release
19
- uses: tox-dev/github-workflows/.github/workflows/prepare-towncrier-release.yaml@57a765127aae73adf7d0e24a7fe0f067f2d3ea3e # 6.2.1
25
+ uses: tox-dev/github-workflows/.github/workflows/prepare-towncrier-release.yaml@0c4cffd63033d38196319524d101caae1eef925b # 6.7.2
20
26
  permissions:
21
27
  contents: read
22
28
  pull-requests: read
23
29
  secrets:
24
30
  RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
25
31
  with:
26
- bump: ${{ inputs.bump }}
32
+ bump: ${{ inputs.bump || 'auto' }}
33
+ dry-run: ${{ inputs.dry-run == true }}
@@ -0,0 +1,56 @@
1
+ name: 🚀 Release to PyPI
2
+ on:
3
+ push:
4
+ tags: ["*"]
5
+ permissions:
6
+ contents: read
7
+ concurrency:
8
+ group: release-${{ github.ref }}
9
+ cancel-in-progress: false
10
+ jobs:
11
+ build:
12
+ name: 🏗️ Build
13
+ uses: tox-dev/github-workflows/.github/workflows/validate-python-release.yaml@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
14
+ permissions:
15
+ contents: read
16
+ github-notes:
17
+ name: 📝 Render GitHub Release notes
18
+ uses: tox-dev/github-workflows/.github/workflows/release-notes.yaml@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
19
+ permissions:
20
+ contents: read
21
+ with:
22
+ tag: ${{ github.ref_name }}
23
+ changelog: docs/changelog.rst
24
+ artifact-url: https://pypi.org/project/pyproject-api/${{ github.ref_name }}/
25
+ release:
26
+ name: 🚀 Publish to PyPI
27
+ needs: [build, github-notes]
28
+ runs-on: ubuntu-26.04
29
+ environment:
30
+ name: release
31
+ url: https://pypi.org/project/pyproject-api/${{ github.ref_name }}
32
+ permissions:
33
+ id-token: write
34
+ steps:
35
+ - name: 📩 Download distributions
36
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
37
+ with:
38
+ artifact-ids: ${{ needs.build.outputs.distributions-artifact-id }}
39
+ path: dist/
40
+ - name: 🚀 Publish to PyPI
41
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
42
+ with:
43
+ packages-dir: dist
44
+ attestations: true
45
+ github-release:
46
+ name: 🚀 Publish GitHub Release
47
+ needs: [build, release, github-notes]
48
+ uses: tox-dev/github-workflows/.github/workflows/github-release.yaml@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
49
+ permissions:
50
+ contents: write
51
+ with:
52
+ project: pyproject-api
53
+ version: ${{ github.ref_name }}
54
+ tag: ${{ github.ref_name }}
55
+ artifact-pattern: python-package-distributions
56
+ notes-artifact-id: ${{ needs.github-notes.outputs.artifact-id }}
@@ -0,0 +1,26 @@
1
+ name: 🛡️ scorecard
2
+ on:
3
+ branch_protection_rule:
4
+ schedule:
5
+ - cron: "30 7 * * 2"
6
+ push:
7
+ branches: ["main"]
8
+ workflow_dispatch:
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+ permissions: {}
13
+ jobs:
14
+ analysis:
15
+ name: 🛡️ Scorecard analysis
16
+ if: github.repository == 'tox-dev/pyproject-api'
17
+ permissions:
18
+ actions: read # read workflow runs for the Packaging check
19
+ checks: read # read check runs for the CI-Tests and SAST checks
20
+ contents: read # check out and scan the repository
21
+ id-token: write # authenticate the results published to the scorecard API
22
+ issues: read # read issue activity for the Maintained check
23
+ pull-requests: read # read reviews for the Code-Review check
24
+ security-events: write # upload the SARIF results to code scanning
25
+ statuses: read # read commit statuses for the CI-Tests check
26
+ uses: tox-dev/github-workflows/.github/workflows/scorecard.yaml@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
@@ -10,7 +10,7 @@ concurrency:
10
10
  jobs:
11
11
  upgrade:
12
12
  name: 🔀 Upgrade release tools
13
- uses: tox-dev/github-workflows/.github/workflows/upgrade-release-tools.yaml@57a765127aae73adf7d0e24a7fe0f067f2d3ea3e # 6.2.1
13
+ uses: tox-dev/github-workflows/.github/workflows/upgrade-release-tools.yaml@bceb5c005e19823dc8835f536f53f172ae223927 # 6.5.0
14
14
  permissions:
15
15
  contents: read
16
16
  secrets:
@@ -9,7 +9,7 @@ repos:
9
9
  - id: end-of-file-fixer
10
10
  - id: trailing-whitespace
11
11
  - repo: https://github.com/python-jsonschema/check-jsonschema
12
- rev: 0494aa7fa1314e98913a41227d8f0a515b2c1049 # frozen: 0.38.2
12
+ rev: a76b92851fc9eede9f9bc4073eb55202f34eb0df # frozen: 0.39.0
13
13
  hooks:
14
14
  - id: check-github-workflows
15
15
  args: ["--verbose"]
@@ -30,7 +30,7 @@ repos:
30
30
  hooks:
31
31
  - id: pyproject-fmt
32
32
  - repo: https://github.com/astral-sh/ruff-pre-commit
33
- rev: "38bfb07c0c64c304f47eb52090f8288150c77730" # frozen: v0.17.1
33
+ rev: "25bcf95026b96e2dd3c0aec3090c3d6ef6ca2e6c" # frozen: v0.17.3
34
34
  hooks:
35
35
  - id: ruff-format
36
36
  - id: ruff
@@ -44,7 +44,7 @@ repos:
44
44
  ^docs/changelog[.]rst$ # Only the generated release history.
45
45
  args: ["-l", "120", "--preserve-adornments"]
46
46
  additional_dependencies:
47
- - "sphinx==9.1.1"
47
+ - "sphinx==9.2.0"
48
48
  - repo: https://github.com/zizmorcore/zizmor-pre-commit
49
49
  rev: c92afdf2c6ca336aaa8f39e2bd8d48f62dbd8e1f # frozen: v1.31.1
50
50
  hooks:
@@ -2,3 +2,7 @@
2
2
 
3
3
  See the [contributing guide](https://pyproject-api.readthedocs.io/en/latest/contributing.html) for release note rules
4
4
  and local checks.
5
+
6
+ ## Tests
7
+
8
+ Add a test for every new feature and bug fix. A change without a test needs a reason in the pull request description.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyproject-api
3
- Version: 1.12.3
3
+ Version: 1.12.5
4
4
  Import-Name: pyproject_api
5
5
  Summary: API to interact with the python pyproject.toml based projects
6
6
  Project-URL: Changelog, https://github.com/tox-dev/pyproject-api/blob/main/docs/changelog.rst
@@ -29,13 +29,14 @@ Requires-Python: >=3.11
29
29
  Requires-Dist: packaging>=26.3
30
30
  Description-Content-Type: text/markdown
31
31
 
32
- # [`pyproject-api`][RTD]
32
+ # [`pyproject-api`][rtd]
33
33
 
34
34
  [![PyPI](https://img.shields.io/pypi/v/pyproject-api?style=flat-square)](https://pypi.org/project/pyproject-api/)
35
- [![Supported Python
36
- versions](https://img.shields.io/pypi/pyversions/pyproject-api.svg)](https://pypi.org/project/pyproject-api/)
35
+ [![Supported Python versions](https://img.shields.io/pypi/pyversions/pyproject-api.svg)](https://pypi.org/project/pyproject-api/)
37
36
  [![Downloads](https://static.pepy.tech/badge/pyproject-api/month)](https://pepy.tech/project/pyproject-api)
38
37
  [![check](https://github.com/tox-dev/pyproject-api/actions/workflows/check.yaml/badge.svg)](https://github.com/tox-dev/pyproject-api/actions/workflows/check.yaml)
39
- [![Documentation Status](https://readthedocs.org/projects/pyproject-api/badge/?version=latest)][RTD]
38
+ [![Documentation Status](https://readthedocs.org/projects/pyproject-api/badge/?version=latest)][rtd]
39
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/tox-dev/pyproject-api/badge)](https://scorecard.dev/viewer/?uri=github.com/tox-dev/pyproject-api)
40
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/16251/badge)](https://www.bestpractices.dev/projects/16251)
40
41
 
41
- [RTD]: https://pyproject-api.rtfd.io
42
+ [rtd]: https://pyproject-api.rtfd.io
@@ -0,0 +1,11 @@
1
+ # [`pyproject-api`][rtd]
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/pyproject-api?style=flat-square)](https://pypi.org/project/pyproject-api/)
4
+ [![Supported Python versions](https://img.shields.io/pypi/pyversions/pyproject-api.svg)](https://pypi.org/project/pyproject-api/)
5
+ [![Downloads](https://static.pepy.tech/badge/pyproject-api/month)](https://pepy.tech/project/pyproject-api)
6
+ [![check](https://github.com/tox-dev/pyproject-api/actions/workflows/check.yaml/badge.svg)](https://github.com/tox-dev/pyproject-api/actions/workflows/check.yaml)
7
+ [![Documentation Status](https://readthedocs.org/projects/pyproject-api/badge/?version=latest)][rtd]
8
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/tox-dev/pyproject-api/badge)](https://scorecard.dev/viewer/?uri=github.com/tox-dev/pyproject-api)
9
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/16251/badge)](https://www.bestpractices.dev/projects/16251)
10
+
11
+ [rtd]: https://pyproject-api.rtfd.io
@@ -16,6 +16,14 @@ backend runs from the project directory. Result paths retain the spelling of the
16
16
  directory argument. Configuration settings and generic command arguments are
17
17
  passed through unchanged.
18
18
 
19
+ Metadata preparation replaces a symlink used as the output directory with a real directory, leaving the link target
20
+ untouched. Dangling links are replaced too. Paths resolving to the project root or one of its ancestors are still
21
+ rejected before cleanup.
22
+
23
+ Metadata preparation clears the output directory before calling the metadata hook. If cleanup fails, the filesystem
24
+ error propagates and the hook is not called. When extracting metadata from a built wheel, cleanup errors stop extraction
25
+ after the wheel has been built.
26
+
19
27
  .. autoclass:: OptionalHooks
20
28
 
21
29
  Exceptions
@@ -5,6 +5,27 @@ Release History
5
5
 
6
6
  .. towncrier release notes start
7
7
 
8
+ .. _release-1-12-5:
9
+
10
+ v1.12.5 (2026-11-07)
11
+ --------------------
12
+
13
+ .. _release-1-12-5-fixed:
14
+
15
+ Fixed
16
+ ^^^^^
17
+
18
+ - Propagate filesystem errors when clearing nested metadata directories (:pr:`357`) by :user:`Quinnod345` and
19
+ :user:`gaborbernat`.
20
+ - Replace a symlink passed to ``ensure_empty_dir`` instead of following it, so a dangling link no longer raises
21
+ ``FileExistsError`` and a link to a directory no longer has its target emptied (:pr:`354`) by :user:`abhishekcpp007`
22
+ and :user:`gaborbernat`.
23
+
24
+ .. _release-1-12-4:
25
+
26
+ v1.12.4 (2026-11-04)
27
+ --------------------
28
+
8
29
  .. _release-1-12-3:
9
30
 
10
31
  v1.12.3 (2026-11-02)