pychrony 2.0.1__tar.gz → 2.0.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 (141) hide show
  1. {pychrony-2.0.1 → pychrony-2.0.2}/.github/workflows/ci.yml +15 -2
  2. {pychrony-2.0.1 → pychrony-2.0.2}/.github/workflows/docs.yml +4 -1
  3. {pychrony-2.0.1 → pychrony-2.0.2}/.github/workflows/release.yml +34 -1
  4. {pychrony-2.0.1/src/pychrony.egg-info → pychrony-2.0.2}/PKG-INFO +1 -1
  5. {pychrony-2.0.1 → pychrony-2.0.2/src/pychrony.egg-info}/PKG-INFO +1 -1
  6. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/SOURCES.txt +0 -1
  7. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/scm_file_list.json +0 -1
  8. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/scm_version.json +2 -2
  9. pychrony-2.0.1/.github/workflows/publish.yml +0 -69
  10. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.analyze.md +0 -0
  11. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.checklist.md +0 -0
  12. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.clarify.md +0 -0
  13. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.constitution.md +0 -0
  14. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.implement.md +0 -0
  15. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.plan.md +0 -0
  16. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.specify.md +0 -0
  17. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.tasks.md +0 -0
  18. {pychrony-2.0.1 → pychrony-2.0.2}/.claude/commands/speckit.taskstoissues.md +0 -0
  19. {pychrony-2.0.1 → pychrony-2.0.2}/.dockerignore +0 -0
  20. {pychrony-2.0.1 → pychrony-2.0.2}/.github/dependabot.yml +0 -0
  21. {pychrony-2.0.1 → pychrony-2.0.2}/.gitignore +0 -0
  22. {pychrony-2.0.1 → pychrony-2.0.2}/.gitmodules +0 -0
  23. {pychrony-2.0.1 → pychrony-2.0.2}/.python-version +0 -0
  24. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/memory/constitution.md +0 -0
  25. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  26. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/scripts/bash/common.sh +0 -0
  27. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
  28. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/scripts/bash/execute-task-generation.sh +0 -0
  29. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/scripts/bash/setup-plan.sh +0 -0
  30. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/scripts/bash/update-agent-context.sh +0 -0
  31. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/templates/agent-file-template.md +0 -0
  32. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/templates/checklist-template.md +0 -0
  33. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/templates/plan-template.md +0 -0
  34. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/templates/spec-template.md +0 -0
  35. {pychrony-2.0.1 → pychrony-2.0.2}/.specify/templates/tasks-template.md +0 -0
  36. {pychrony-2.0.1 → pychrony-2.0.2}/CLAUDE.md +0 -0
  37. {pychrony-2.0.1 → pychrony-2.0.2}/LICENSE +0 -0
  38. {pychrony-2.0.1 → pychrony-2.0.2}/LICENSES/LGPL-2.1-or-later.txt +0 -0
  39. {pychrony-2.0.1 → pychrony-2.0.2}/README.md +0 -0
  40. {pychrony-2.0.1 → pychrony-2.0.2}/TESTING.md +0 -0
  41. {pychrony-2.0.1 → pychrony-2.0.2}/docker/Dockerfile.test +0 -0
  42. {pychrony-2.0.1 → pychrony-2.0.2}/docker/docker-compose.test.yml +0 -0
  43. {pychrony-2.0.1 → pychrony-2.0.2}/docs/api/index.md +0 -0
  44. {pychrony-2.0.1 → pychrony-2.0.2}/docs/index.md +0 -0
  45. {pychrony-2.0.1 → pychrony-2.0.2}/mkdocs.yml +0 -0
  46. {pychrony-2.0.1 → pychrony-2.0.2}/pyproject.toml +0 -0
  47. {pychrony-2.0.1 → pychrony-2.0.2}/setup.cfg +0 -0
  48. {pychrony-2.0.1 → pychrony-2.0.2}/setup.py +0 -0
  49. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/checklists/requirements.md +0 -0
  50. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/contracts/package.md +0 -0
  51. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/data-model.md +0 -0
  52. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/plan.md +0 -0
  53. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/quickstart.md +0 -0
  54. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/research.md +0 -0
  55. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/spec.md +0 -0
  56. {pychrony-2.0.1 → pychrony-2.0.2}/specs/001-python-scaffold/tasks.md +0 -0
  57. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/checklists/requirements.md +0 -0
  58. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/contracts/python-api.md +0 -0
  59. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/data-model.md +0 -0
  60. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/plan.md +0 -0
  61. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/quickstart.md +0 -0
  62. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/research.md +0 -0
  63. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/spec.md +0 -0
  64. {pychrony-2.0.1 → pychrony-2.0.2}/specs/002-tracking-binding/tasks.md +0 -0
  65. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/checklists/requirements.md +0 -0
  66. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/contracts/api.md +0 -0
  67. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/contracts/python-api.md +0 -0
  68. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/data-model.md +0 -0
  69. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/plan.md +0 -0
  70. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/quickstart.md +0 -0
  71. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/research.md +0 -0
  72. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/spec.md +0 -0
  73. {pychrony-2.0.1 → pychrony-2.0.2}/specs/003-multiple-reports-bindings/tasks.md +0 -0
  74. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/checklists/requirements.md +0 -0
  75. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/data-model.md +0 -0
  76. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/plan.md +0 -0
  77. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/quickstart.md +0 -0
  78. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/research.md +0 -0
  79. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/spec.md +0 -0
  80. {pychrony-2.0.1 → pychrony-2.0.2}/specs/004-categorical-enums/tasks.md +0 -0
  81. {pychrony-2.0.1 → pychrony-2.0.2}/specs/005-pypi-packaging/checklists/requirements.md +0 -0
  82. {pychrony-2.0.1 → pychrony-2.0.2}/specs/005-pypi-packaging/plan.md +0 -0
  83. {pychrony-2.0.1 → pychrony-2.0.2}/specs/005-pypi-packaging/quickstart.md +0 -0
  84. {pychrony-2.0.1 → pychrony-2.0.2}/specs/005-pypi-packaging/research.md +0 -0
  85. {pychrony-2.0.1 → pychrony-2.0.2}/specs/005-pypi-packaging/spec.md +0 -0
  86. {pychrony-2.0.1 → pychrony-2.0.2}/specs/005-pypi-packaging/tasks.md +0 -0
  87. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/analysis-report.md +0 -0
  88. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/checklists/requirements.md +0 -0
  89. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/contracts/mock-api.md +0 -0
  90. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/data-model.md +0 -0
  91. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/plan.md +0 -0
  92. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/quickstart.md +0 -0
  93. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/research.md +0 -0
  94. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/spec.md +0 -0
  95. {pychrony-2.0.1 → pychrony-2.0.2}/specs/006-protocol-test-mocks/tasks.md +0 -0
  96. {pychrony-2.0.1 → pychrony-2.0.2}/specs/007-api-docs-github-pages/tasks.md +0 -0
  97. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/__init__.py +0 -0
  98. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/_core/__init__.py +0 -0
  99. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/_core/_bindings.py +0 -0
  100. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/_core/_build_bindings.py +0 -0
  101. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/_core/_fields.py +0 -0
  102. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/exceptions.py +0 -0
  103. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/models.py +0 -0
  104. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/py.typed +0 -0
  105. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony/testing.py +0 -0
  106. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/dependency_links.txt +0 -0
  107. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/entry_points.txt +0 -0
  108. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/requires.txt +0 -0
  109. {pychrony-2.0.1 → pychrony-2.0.2}/src/pychrony.egg-info/top_level.txt +0 -0
  110. {pychrony-2.0.1 → pychrony-2.0.2}/tests/__init__.py +0 -0
  111. {pychrony-2.0.1 → pychrony-2.0.2}/tests/conftest.py +0 -0
  112. {pychrony-2.0.1 → pychrony-2.0.2}/tests/contract/__init__.py +0 -0
  113. {pychrony-2.0.1 → pychrony-2.0.2}/tests/contract/test_api.py +0 -0
  114. {pychrony-2.0.1 → pychrony-2.0.2}/tests/contract/test_api_stability.py +0 -0
  115. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/__init__.py +0 -0
  116. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/conftest.py +0 -0
  117. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/test_connection.py +0 -0
  118. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/test_enums.py +0 -0
  119. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/test_rtcdata.py +0 -0
  120. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/test_sources.py +0 -0
  121. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/test_sourcestats.py +0 -0
  122. {pychrony-2.0.1 → pychrony-2.0.2}/tests/integration/test_tracking.py +0 -0
  123. {pychrony-2.0.1 → pychrony-2.0.2}/tests/mocks/__init__.py +0 -0
  124. {pychrony-2.0.1 → pychrony-2.0.2}/tests/mocks/config.py +0 -0
  125. {pychrony-2.0.1 → pychrony-2.0.2}/tests/mocks/context.py +0 -0
  126. {pychrony-2.0.1 → pychrony-2.0.2}/tests/mocks/scenarios.py +0 -0
  127. {pychrony-2.0.1 → pychrony-2.0.2}/tests/mocks/session.py +0 -0
  128. {pychrony-2.0.1 → pychrony-2.0.2}/tests/test_import.py +0 -0
  129. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/__init__.py +0 -0
  130. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_connection.py +0 -0
  131. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_enums.py +0 -0
  132. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_exceptions.py +0 -0
  133. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_leap_scenarios.py +0 -0
  134. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_mock_config.py +0 -0
  135. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_mock_scenarios.py +0 -0
  136. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_models.py +0 -0
  137. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_rtc_scenarios.py +0 -0
  138. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_source_scenarios.py +0 -0
  139. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_testing.py +0 -0
  140. {pychrony-2.0.1 → pychrony-2.0.2}/tests/unit/test_validation.py +0 -0
  141. {pychrony-2.0.1 → pychrony-2.0.2}/uv.lock +0 -0
@@ -22,6 +22,7 @@ jobs:
22
22
  # Keep this matrix in sync with the classifiers and the cibuildwheel
23
23
  # `build` allowlist in pyproject.toml, and with release.yml.
24
24
  test:
25
+ name: Tests (Python ${{ matrix.python-version }})
25
26
  runs-on: ubuntu-latest
26
27
  timeout-minutes: 10
27
28
  strategy:
@@ -49,6 +50,7 @@ jobs:
49
50
  # Lint and type checking. Results do not vary by interpreter, so this
50
51
  # runs once rather than once per matrix entry.
51
52
  lint:
53
+ name: Lint and type check
52
54
  runs-on: ubuntu-latest
53
55
  timeout-minutes: 10
54
56
  steps:
@@ -75,6 +77,7 @@ jobs:
75
77
  run: uv run ty check src/
76
78
 
77
79
  docs:
80
+ name: Docs build
78
81
  runs-on: ubuntu-latest
79
82
  timeout-minutes: 10
80
83
 
@@ -102,6 +105,7 @@ jobs:
102
105
  # Full suite in Docker with libchrony - the only place integration
103
106
  # tests run against a live chronyd.
104
107
  docker-tests:
108
+ name: Integration tests (Docker)
105
109
  runs-on: ubuntu-latest
106
110
  timeout-minutes: 20
107
111
  steps:
@@ -123,15 +127,24 @@ jobs:
123
127
  cache-from: type=gha
124
128
  cache-to: type=gha,mode=max
125
129
 
130
+ # chronyd answers commands before it has resolved its pool and server
131
+ # names, and the source list grows as each name resolves. Tests that
132
+ # walk the source list race that growth, so wait until no source has an
133
+ # unresolved address. chronyc also fails until the command socket is up.
126
134
  - name: Run tests
127
135
  run: |
128
136
  docker run --rm --cap-add=SYS_TIME pychrony-test:latest sh -c '
129
137
  chronyd
130
138
  i=0
131
- until chronyc -n tracking >/dev/null 2>&1; do
139
+ until chronyc -n activity 2>/dev/null | grep -q "^0 sources with unknown address"; do
132
140
  i=$((i + 1))
133
- if [ "$i" -ge 40 ]; then echo "chronyd not ready after 20s"; exit 1; fi
141
+ if [ "$i" -ge 40 ]; then
142
+ echo "chronyd sources not resolved after 20s"
143
+ chronyc -n activity
144
+ exit 1
145
+ fi
134
146
  sleep 0.5
135
147
  done
148
+ echo "chronyd sources resolved after $i polls"
136
149
  pytest tests/ -v --tb=short
137
150
  '
@@ -6,7 +6,7 @@ on:
6
6
  tags: [ 'v*' ]
7
7
 
8
8
  permissions:
9
- contents: write
9
+ contents: read
10
10
 
11
11
  concurrency:
12
12
  group: docs-deploy
@@ -14,8 +14,11 @@ concurrency:
14
14
 
15
15
  jobs:
16
16
  deploy:
17
+ name: Deploy documentation
17
18
  runs-on: ubuntu-latest
18
19
  timeout-minutes: 15
20
+ permissions:
21
+ contents: write # mike pushes the built site to the gh-pages branch
19
22
 
20
23
  steps:
21
24
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
@@ -8,6 +8,12 @@ on:
8
8
  permissions:
9
9
  contents: read
10
10
 
11
+ # Never cancel a release in progress: a half-finished run can leave Test PyPI
12
+ # holding a version that production PyPI never gets.
13
+ concurrency:
14
+ group: release-${{ github.ref }}
15
+ cancel-in-progress: false
16
+
11
17
  jobs:
12
18
  build-wheels:
13
19
  name: Build wheels (${{ matrix.arch }})
@@ -76,7 +82,7 @@ jobs:
76
82
  timeout-minutes: 15
77
83
  permissions:
78
84
  contents: read
79
- id-token: write
85
+ id-token: write # OIDC token for Test PyPI Trusted Publishing
80
86
 
81
87
  steps:
82
88
  - name: Download all artifacts
@@ -146,3 +152,30 @@ jobs:
146
152
  assert pychrony.__version__ == expected, \
147
153
  f'Version mismatch: {pychrony.__version__} != {expected}'
148
154
  "
155
+
156
+ # Production publish lives in this workflow, after verification, so it can
157
+ # only ever upload the artifacts this tag-push run built and Test PyPI served.
158
+ # The `pypi` environment's required reviewer gates it. To retry a failed
159
+ # publish, re-run this job from the Release run.
160
+ publish-pypi:
161
+ name: Publish to Production PyPI
162
+ needs: verify-testpypi
163
+ runs-on: ubuntu-latest
164
+ environment: pypi
165
+ timeout-minutes: 15
166
+ permissions:
167
+ contents: read
168
+ id-token: write # OIDC token for PyPI Trusted Publishing
169
+
170
+ steps:
171
+ - name: Download all artifacts
172
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
173
+ with:
174
+ path: dist/
175
+ merge-multiple: true
176
+
177
+ - name: List artifacts
178
+ run: ls -la dist/
179
+
180
+ - name: Publish to PyPI
181
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pychrony
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Python bindings for chrony NTP client
5
5
  Author-email: arunderwood <arunderwood@users.noreply.github.com>
6
6
  License-Expression: MIT AND LGPL-2.1-or-later
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pychrony
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Python bindings for chrony NTP client
5
5
  Author-email: arunderwood <arunderwood@users.noreply.github.com>
6
6
  License-Expression: MIT AND LGPL-2.1-or-later
@@ -22,7 +22,6 @@ uv.lock
22
22
  .github/dependabot.yml
23
23
  .github/workflows/ci.yml
24
24
  .github/workflows/docs.yml
25
- .github/workflows/publish.yml
26
25
  .github/workflows/release.yml
27
26
  .specify/memory/constitution.md
28
27
  .specify/scripts/bash/check-prerequisites.sh
@@ -13,7 +13,6 @@
13
13
  ".github/dependabot.yml",
14
14
  ".github/workflows/ci.yml",
15
15
  ".github/workflows/docs.yml",
16
- ".github/workflows/publish.yml",
17
16
  ".github/workflows/release.yml",
18
17
  ".gitignore",
19
18
  ".gitmodules",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "2.0.1",
2
+ "tag": "2.0.2",
3
3
  "distance": 0,
4
- "node": "g55fad8e9674fe3fd8c2746e533b8819e7799c87c",
4
+ "node": "g8cd3694007006be9e3da9440e32efb2c4ee38058",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-24"
@@ -1,69 +0,0 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- # Auto-trigger after successful Release workflow
5
- workflow_run:
6
- workflows: ["Release"]
7
- types: [completed]
8
- # Manual fallback
9
- workflow_dispatch:
10
- inputs:
11
- release_tag:
12
- description: 'Release tag to publish (e.g., v0.1.0)'
13
- required: true
14
- type: string
15
-
16
- permissions:
17
- contents: read
18
-
19
- jobs:
20
- publish-pypi:
21
- name: Publish to Production PyPI
22
- runs-on: ubuntu-latest
23
- environment: pypi
24
- permissions:
25
- contents: read
26
- id-token: write
27
- timeout-minutes: 15
28
- # workflow_run matches by workflow *name*, so a fork PR that adds its own
29
- # "Release" workflow on pull_request would also trigger this job. Accept only
30
- # runs from a push (a tag, for the real Release) in this repository.
31
- if: >
32
- (github.event_name == 'workflow_run' &&
33
- github.event.workflow_run.conclusion == 'success' &&
34
- github.event.workflow_run.event == 'push' &&
35
- github.event.workflow_run.head_repository.full_name == github.repository) ||
36
- github.event_name == 'workflow_dispatch'
37
-
38
- steps:
39
- - name: Download artifacts (from triggering workflow_run)
40
- if: github.event_name == 'workflow_run'
41
- uses: dawidd6/action-download-artifact@d63b86af1b34672e53c440b1b83979861906bad7 # v24
42
- with:
43
- workflow: release.yml
44
- run_id: ${{ github.event.workflow_run.id }}
45
- name: ^(wheels-.*|sdist)$
46
- name_is_regexp: true
47
- path: dist/
48
- merge_multiple: true
49
- if_no_artifact_found: fail
50
-
51
- - name: Download artifacts (from manual dispatch)
52
- if: github.event_name == 'workflow_dispatch'
53
- uses: dawidd6/action-download-artifact@d63b86af1b34672e53c440b1b83979861906bad7 # v24
54
- with:
55
- workflow: release.yml
56
- name: ^(wheels-.*|sdist)$
57
- name_is_regexp: true
58
- path: dist/
59
- merge_multiple: true
60
- search_artifacts: true
61
- workflow_conclusion: success
62
- branch: ${{ github.event.inputs.release_tag }}
63
- if_no_artifact_found: fail
64
-
65
- - name: List artifacts
66
- run: ls -la dist/
67
-
68
- - name: Publish to PyPI
69
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
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