django-dynamic-admin-forms 3.2.12__tar.gz → 3.2.14__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 (63) hide show
  1. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.ambient-package-update/metadata.py +53 -53
  2. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.editorconfig +17 -17
  3. django_dynamic_admin_forms-3.2.14/.github/workflows/ci.yml +11 -0
  4. django_dynamic_admin_forms-3.2.12/.github/workflows/ci.yml → django_dynamic_admin_forms-3.2.14/.github/workflows/quality-gate.yml +91 -94
  5. django_dynamic_admin_forms-3.2.14/.github/workflows/release.yml +136 -0
  6. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.gitignore +160 -160
  7. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.pre-commit-config.yaml +59 -59
  8. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.readthedocs.yaml +31 -31
  9. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/CHANGES.md +152 -146
  10. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/CONTRIBUTING.md +75 -75
  11. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/LICENSE.md +21 -21
  12. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/MANIFEST.in +4 -4
  13. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/PKG-INFO +27 -36
  14. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/README.md +214 -224
  15. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/SECURITY.md +18 -18
  16. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/django_dynamic_admin_forms/__init__.py +3 -3
  17. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/django_dynamic_admin_forms/admin.py +80 -80
  18. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/django_dynamic_admin_forms/templates/admin/change_form.html +37 -37
  19. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/django_dynamic_admin_forms/urls.py +8 -8
  20. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/docs/Makefile +20 -20
  21. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/docs/conf.py +81 -81
  22. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/docs/features/changelog.rst +1 -1
  23. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/docs/index.rst +7 -7
  24. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/docs/make.bat +35 -35
  25. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/fixtures/fixtures-dev.json +474 -474
  26. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/manage.py +23 -23
  27. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/pyproject.toml +275 -271
  28. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/scripts/unix/install_requirements.sh +3 -3
  29. django_dynamic_admin_forms-3.2.14/scripts/unix/publish_to_pypi.sh +4 -0
  30. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/scripts/windows/install_requirements.ps1 +2 -2
  31. django_dynamic_admin_forms-3.2.14/scripts/windows/publish_to_pypi.ps1 +3 -0
  32. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/settings.py +86 -86
  33. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/admin.py +76 -76
  34. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/migrations/0004_skill_customer_skills.py +25 -25
  35. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/models.py +47 -47
  36. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/urls.py +23 -23
  37. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/tests/test_admin_generic.py +69 -69
  38. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/tests/test_admin_unit.py +140 -140
  39. django_dynamic_admin_forms-3.2.14/uv.lock +1353 -0
  40. django_dynamic_admin_forms-3.2.12/scripts/unix/publish_to_pypi.sh +0 -4
  41. django_dynamic_admin_forms-3.2.12/scripts/windows/publish_to_pypi.ps1 +0 -3
  42. django_dynamic_admin_forms-3.2.12/uv.lock +0 -1007
  43. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.ambient-package-update/templates/snippets/content.tpl +0 -0
  44. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.ambient-package-update/templates/snippets/installation.tpl +0 -0
  45. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/.python-version +0 -0
  46. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/django_dynamic_admin_forms/apps.py +0 -0
  47. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/django_dynamic_admin_forms/static/js/dynamic_admin.js +0 -0
  48. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/docs/demo.gif +0 -0
  49. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/cypress/integration/dynamic-select.spec.js +0 -0
  50. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/cypress/plugins/index.js +0 -0
  51. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/cypress/support/commands.js +0 -0
  52. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/cypress/support/index.js +0 -0
  53. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/cypress/support/paths.js +0 -0
  54. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/cypress.json +0 -0
  55. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/package.json +0 -0
  56. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/e2e/yarn.lock +0 -0
  57. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/__init__.py +0 -0
  58. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/apps.py +0 -0
  59. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/migrations/0001_initial.py +0 -0
  60. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/migrations/0002_extend_example.py +0 -0
  61. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/migrations/0003_example_file_field.py +0 -0
  62. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/testapp/migrations/__init__.py +0 -0
  63. {django_dynamic_admin_forms-3.2.12 → django_dynamic_admin_forms-3.2.14}/tests/__init__.py +0 -0
@@ -1,53 +1,53 @@
1
- from ambient_package_update.metadata.author import PackageAuthor
2
- from ambient_package_update.metadata.constants import (
3
- DEV_DEPENDENCIES,
4
- SUPPORTED_DJANGO_VERSIONS,
5
- SUPPORTED_PYTHON_VERSIONS,
6
- )
7
- from ambient_package_update.metadata.maintainer import PackageMaintainer
8
- from ambient_package_update.metadata.package import PackageMetadata
9
- from ambient_package_update.metadata.readme import ReadmeContent
10
- from ambient_package_update.metadata.ruff_ignored_inspection import RuffIgnoredInspection
11
-
12
- METADATA = PackageMetadata(
13
- package_name="django-dynamic-admin-forms",
14
- github_package_group="ambient-innovation",
15
- github_package_name="django_dynamic_admin",
16
- licenser="Ambient Innovation: GmbH",
17
- authors=[
18
- PackageAuthor(
19
- name="Ambient Digital",
20
- email="hello@ambient.digital",
21
- ),
22
- PackageAuthor(
23
- name="Fabian Binz",
24
- email="fabian.binz@ambient.digital",
25
- ),
26
- ],
27
- maintainer=PackageMaintainer(name="Ambient Digital", url="https://ambient.digital/", email="hello@ambient.digital"),
28
- license_year=2022,
29
- development_status="5 - Production/Stable",
30
- has_migrations=False,
31
- main_branch="main",
32
- claim="Add simple dynamic interaction to the otherwise static django admin.",
33
- readme_content=ReadmeContent(
34
- tagline="Add simple interactions to the otherwise static django admin.",
35
- ),
36
- supported_django_versions=SUPPORTED_DJANGO_VERSIONS,
37
- supported_python_versions=SUPPORTED_PYTHON_VERSIONS,
38
- dependencies=[
39
- f"Django>={SUPPORTED_DJANGO_VERSIONS[0]}",
40
- ],
41
- optional_dependencies={
42
- "dev": [
43
- *DEV_DEPENDENCIES,
44
- "unittest-parametrize~=1.4",
45
- ],
46
- },
47
- ruff_ignore_list=[
48
- RuffIgnoredInspection(
49
- key="RUF012", comment="Mutable class attributes should be annotated with `typing.ClassVar`"
50
- ),
51
- RuffIgnoredInspection(key="TRY003", comment="Avoid specifying long messages outside the exception class"),
52
- ],
53
- )
1
+ from ambient_package_update.metadata.author import PackageAuthor
2
+ from ambient_package_update.metadata.constants import (
3
+ DEV_DEPENDENCIES,
4
+ SUPPORTED_DJANGO_VERSIONS,
5
+ SUPPORTED_PYTHON_VERSIONS,
6
+ )
7
+ from ambient_package_update.metadata.maintainer import PackageMaintainer
8
+ from ambient_package_update.metadata.package import PackageMetadata
9
+ from ambient_package_update.metadata.readme import ReadmeContent
10
+ from ambient_package_update.metadata.ruff_ignored_inspection import RuffIgnoredInspection
11
+
12
+ METADATA = PackageMetadata(
13
+ package_name="django-dynamic-admin-forms",
14
+ github_package_group="ambient-innovation",
15
+ github_package_name="django_dynamic_admin",
16
+ licenser="Ambient Innovation: GmbH",
17
+ authors=[
18
+ PackageAuthor(
19
+ name="Ambient Digital",
20
+ email="hello@ambient.digital",
21
+ ),
22
+ PackageAuthor(
23
+ name="Fabian Binz",
24
+ email="fabian.binz@ambient.digital",
25
+ ),
26
+ ],
27
+ maintainer=PackageMaintainer(name="Ambient Digital", url="https://ambient.digital/", email="hello@ambient.digital"),
28
+ license_year=2022,
29
+ development_status="5 - Production/Stable",
30
+ has_migrations=False,
31
+ main_branch="main",
32
+ claim="Add simple dynamic interaction to the otherwise static django admin.",
33
+ readme_content=ReadmeContent(
34
+ tagline="Add simple interactions to the otherwise static django admin.",
35
+ ),
36
+ supported_django_versions=SUPPORTED_DJANGO_VERSIONS,
37
+ supported_python_versions=SUPPORTED_PYTHON_VERSIONS,
38
+ dependencies=[
39
+ f"Django>={SUPPORTED_DJANGO_VERSIONS[0]}",
40
+ ],
41
+ optional_dependencies={
42
+ "dev": [
43
+ *DEV_DEPENDENCIES,
44
+ "unittest-parametrize~=1.4",
45
+ ],
46
+ },
47
+ ruff_ignore_list=[
48
+ RuffIgnoredInspection(
49
+ key="RUF012", comment="Mutable class attributes should be annotated with `typing.ClassVar`"
50
+ ),
51
+ RuffIgnoredInspection(key="TRY003", comment="Avoid specifying long messages outside the exception class"),
52
+ ],
53
+ )
@@ -1,17 +1,17 @@
1
- # http://editorconfig.org
2
-
3
- root = true
4
-
5
- [*]
6
- charset = utf-8
7
- end_of_line = lf
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
-
11
- [*.{py,rst,ini}]
12
- indent_style = space
13
- indent_size = 4
14
-
15
- [*.yml]
16
- indent_style = space
17
- indent_size = 2
1
+ # http://editorconfig.org
2
+
3
+ root = true
4
+
5
+ [*]
6
+ charset = utf-8
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.{py,rst,ini}]
12
+ indent_style = space
13
+ indent_size = 4
14
+
15
+ [*.yml]
16
+ indent_style = space
17
+ indent_size = 2
@@ -0,0 +1,11 @@
1
+ name: Unit tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+
9
+ jobs:
10
+ ci:
11
+ uses: ./.github/workflows/quality-gate.yml
@@ -1,94 +1,91 @@
1
- name: Unit tests
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
-
9
- jobs:
10
- linting:
11
- runs-on: ubuntu-24.04
12
- steps:
13
- - uses: actions/checkout@v4
14
-
15
- - name: Set up Python 3.13
16
- uses: actions/setup-python@v5
17
- with:
18
- python-version: "3.13"
19
-
20
- - name: Install required packages
21
- run: pip install pre-commit
22
-
23
- - name: Run pre-commit hooks
24
- run: pre-commit run --all-files
25
-
26
- tests:
27
- name: Python ${{ matrix.python-version }}, django ${{ matrix.django-version }}
28
- runs-on: ubuntu-24.04
29
- strategy:
30
- matrix:
31
- python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', ]
32
- django-version: ['42', '52', '60', ]
33
-
34
- exclude:
35
- - python-version: '3.11'
36
- django-version: 60
37
- - python-version: '3.10'
38
- django-version: 60
39
- - python-version: '3.9'
40
- django-version: 52
41
- - python-version: "3.13"
42
- django-version: 42
43
-
44
- steps:
45
- - uses: actions/checkout@v4
46
- - name: setup python
47
- uses: actions/setup-python@v5
48
- with:
49
- python-version: ${{ matrix.python-version }}
50
- - name: Install uv
51
- uses: astral-sh/setup-uv@v5
52
- - name: Install tox
53
- run: uv pip install --system tox tox-uv
54
- - name: Run Tests
55
- env:
56
- TOXENV: django${{ matrix.django-version }}
57
- run: tox
58
- - name: Upload coverage data
59
- uses: actions/upload-artifact@v4
60
- with:
61
- name: coverage-data-${{ matrix.python-version }}-${{ matrix.django-version }}
62
- path: '${{ github.workspace }}/.coverage'
63
- include-hidden-files: true
64
- if-no-files-found: error
65
-
66
- coverage:
67
- name: Coverage
68
- runs-on: ubuntu-24.04
69
- needs: tests
70
- steps:
71
- - uses: actions/checkout@v4
72
-
73
- - uses: actions/setup-python@v5
74
- with:
75
- python-version: '3.13'
76
-
77
- - name: Install dependencies
78
- run: python -m pip install --upgrade coverage[toml]
79
-
80
- - name: Download data
81
- uses: actions/download-artifact@v4
82
- with:
83
- path: ${{ github.workspace }}/coverage-reports
84
- pattern: coverage-data-*
85
- merge-multiple: false
86
-
87
- - name: Combine coverage and fail if it's <100.0%
88
- run: |
89
- python -m coverage combine coverage-reports/*/.coverage
90
- python -m coverage xml
91
- python -m coverage html --skip-covered --skip-empty
92
- python -m coverage report --fail-under=100.0
93
- echo "## Coverage summary" >> $GITHUB_STEP_SUMMARY
94
- python -m coverage report --format=markdown >> $GITHUB_STEP_SUMMARY
1
+ name: CI jobs
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ jobs:
7
+ linting:
8
+ runs-on: ubuntu-24.04
9
+ steps:
10
+ - uses: actions/checkout@v6
11
+
12
+ - name: Set up Python 3.13
13
+ uses: actions/setup-python@v6
14
+ with:
15
+ python-version: "3.13"
16
+
17
+ - name: Install required packages
18
+ run: pip install pre-commit
19
+
20
+ - name: Run pre-commit hooks
21
+ run: pre-commit run --all-files
22
+
23
+ tests:
24
+ name: Python ${{ matrix.python-version }}, django ${{ matrix.django-version }}
25
+ runs-on: ubuntu-24.04
26
+ strategy:
27
+ matrix:
28
+ python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', ]
29
+ django-version: ['42', '52', '60', ]
30
+
31
+ exclude:
32
+ - python-version: '3.11'
33
+ django-version: 60
34
+ - python-version: '3.10'
35
+ django-version: 60
36
+ - python-version: '3.9'
37
+ django-version: 52
38
+ - python-version: "3.13"
39
+ django-version: 42
40
+
41
+ steps:
42
+ - uses: actions/checkout@v6
43
+ - name: setup python
44
+ uses: actions/setup-python@v6
45
+ with:
46
+ python-version: ${{ matrix.python-version }}
47
+ - name: Install uv
48
+ uses: astral-sh/setup-uv@v8.0.0
49
+ - name: Install tox
50
+ run: uv pip install --system tox tox-uv
51
+ - name: Run Tests
52
+ env:
53
+ TOXENV: django${{ matrix.django-version }}
54
+ run: tox
55
+ - name: Upload coverage data
56
+ uses: actions/upload-artifact@v7
57
+ with:
58
+ name: coverage-data-${{ matrix.python-version }}-${{ matrix.django-version }}
59
+ path: '${{ github.workspace }}/.coverage'
60
+ include-hidden-files: true
61
+ if-no-files-found: error
62
+
63
+ coverage:
64
+ name: Coverage
65
+ runs-on: ubuntu-24.04
66
+ needs: tests
67
+ steps:
68
+ - uses: actions/checkout@v6
69
+
70
+ - uses: actions/setup-python@v6
71
+ with:
72
+ python-version: '3.13'
73
+
74
+ - name: Install dependencies
75
+ run: python -m pip install --upgrade coverage[toml]
76
+
77
+ - name: Download data
78
+ uses: actions/download-artifact@v8
79
+ with:
80
+ path: ${{ github.workspace }}/coverage-reports
81
+ pattern: coverage-data-*
82
+ merge-multiple: false
83
+
84
+ - name: Combine coverage and fail if it's <100.0%
85
+ run: |
86
+ python -m coverage combine coverage-reports/*/.coverage
87
+ python -m coverage xml
88
+ python -m coverage html --skip-covered --skip-empty
89
+ python -m coverage report --fail-under=100.0
90
+ echo "## Coverage summary" >> $GITHUB_STEP_SUMMARY
91
+ python -m coverage report --format=markdown >> $GITHUB_STEP_SUMMARY
@@ -0,0 +1,136 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ # Restrictive default — each job declares only what it needs
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ ci:
14
+ uses: ./.github/workflows/quality-gate.yml
15
+
16
+ check-branch:
17
+ name: Verify tag is on main
18
+ runs-on: ubuntu-24.04
19
+ outputs:
20
+ on-main: ${{ steps.check.outputs.on-main }}
21
+ steps:
22
+ - uses: actions/checkout@v6
23
+ with:
24
+ fetch-depth: 0
25
+ - name: Check if tag is on main
26
+ id: check
27
+ run: |
28
+ git fetch origin main
29
+ if git merge-base --is-ancestor "${{ github.sha }}" origin/main; then
30
+ echo "on-main=true" >> $GITHUB_OUTPUT
31
+ else
32
+ echo "Tag is not on main, skipping release." >&2
33
+ echo "on-main=false" >> $GITHUB_OUTPUT
34
+ fi
35
+
36
+ build:
37
+ name: Build distribution packages
38
+ runs-on: ubuntu-24.04
39
+ needs: [ci, check-branch]
40
+ if: needs.check-branch.outputs.on-main == 'true'
41
+ permissions:
42
+ contents: read
43
+ steps:
44
+ - uses: actions/checkout@v6
45
+
46
+ - name: Set up Python 3.13
47
+ uses: actions/setup-python@v6
48
+ with:
49
+ python-version: "3.13"
50
+
51
+ - name: Install uv
52
+ uses: astral-sh/setup-uv@v8.0.0
53
+
54
+ - name: Build packages
55
+ run: uv build
56
+
57
+ - name: Upload distribution packages
58
+ uses: actions/upload-artifact@v7
59
+ with:
60
+ name: dist
61
+ path: dist/
62
+ if-no-files-found: error
63
+
64
+ sign:
65
+ name: Sign distribution packages
66
+ runs-on: ubuntu-24.04
67
+ needs: build
68
+ permissions:
69
+ id-token: write # required for Sigstore OIDC signing
70
+ contents: read
71
+ steps:
72
+ - name: Download distribution packages
73
+ uses: actions/download-artifact@v8
74
+ with:
75
+ name: dist
76
+ path: dist/
77
+
78
+ - name: Sign packages with Sigstore
79
+ uses: sigstore/gh-action-sigstore-python@v3.3.0
80
+ with:
81
+ inputs: >-
82
+ ./dist/*.tar.gz
83
+ ./dist/*.whl
84
+
85
+ - name: Upload signed distribution packages
86
+ uses: actions/upload-artifact@v7
87
+ with:
88
+ name: dist-signed
89
+ path: dist/
90
+ if-no-files-found: error
91
+
92
+ github-release:
93
+ name: Create GitHub Release
94
+ runs-on: ubuntu-24.04
95
+ needs: sign
96
+ permissions:
97
+ contents: write # required to create GitHub releases
98
+ steps:
99
+ - name: Download signed distribution packages
100
+ uses: actions/download-artifact@v8
101
+ with:
102
+ name: dist-signed
103
+ path: dist/
104
+
105
+ - name: Create GitHub Release
106
+ env:
107
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
108
+ run: |
109
+ shopt -s failglob
110
+ gh release create "${{ github.ref_name }}" \
111
+ --repo "${{ github.repository }}" \
112
+ --generate-notes \
113
+ dist/*
114
+
115
+ publish-pypi:
116
+ name: Publish to PyPI
117
+ runs-on: ubuntu-24.04
118
+ needs: sign
119
+ environment: pypi
120
+ permissions:
121
+ id-token: write # required for PyPI Trusted Publisher OIDC auth
122
+ contents: read
123
+ steps:
124
+ - name: Download signed distribution packages
125
+ uses: actions/download-artifact@v8
126
+ with:
127
+ name: dist-signed
128
+ path: dist/
129
+
130
+ - name: Remove Sigstore bundles (PyPI only accepts .whl and .tar.gz)
131
+ run: rm dist/*.sigstore.json
132
+
133
+ - name: Publish to PyPI
134
+ uses: pypa/gh-action-pypi-publish@release/v1
135
+ # Sigstore attestations are generated and uploaded to PyPI automatically
136
+ # when using Trusted Publishing — no extra configuration needed.