toolframe-auth 0.3.1__tar.gz → 0.3.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 (26) hide show
  1. toolframe_auth-0.3.2/.github/workflows/compatibility.yml +85 -0
  2. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/.github/workflows/publish.yml +6 -20
  3. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/PKG-INFO +7 -4
  4. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/README.md +5 -2
  5. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/docs/ci.md +4 -5
  6. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/docs/releasing.md +11 -10
  7. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/pyproject.toml +2 -2
  8. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/uv.lock +1 -1
  9. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/.github/workflows/ci.yml +0 -0
  10. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/.github/workflows/quality.yml +0 -0
  11. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/.gitignore +0 -0
  12. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/.pre-commit-config.yaml +0 -0
  13. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/CONTRIBUTING.md +0 -0
  14. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/LICENSE +0 -0
  15. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/NOTICE +0 -0
  16. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/cchk.toml +0 -0
  17. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/scripts/check_branch_name.py +0 -0
  18. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/scripts/ci.py +0 -0
  19. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/src/toolframe_auth/__init__.py +0 -0
  20. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/src/toolframe_auth/crypto.py +0 -0
  21. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/src/toolframe_auth/identities.py +0 -0
  22. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/src/toolframe_auth/migrations/v1.postgresql.sql +0 -0
  23. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/src/toolframe_auth/migrations/v2.postgresql.sql +0 -0
  24. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/src/toolframe_auth/plugin.py +0 -0
  25. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/tests/test_auth.py +0 -0
  26. {toolframe_auth-0.3.1 → toolframe_auth-0.3.2}/tests/test_identities.py +0 -0
@@ -0,0 +1,85 @@
1
+ name: SDK compatibility
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+ schedule:
8
+ - cron: '17 4 * * *'
9
+ workflow_dispatch:
10
+ workflow_call:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ wheel:
17
+ name: Build the shared plugin wheel
18
+ runs-on: ubuntu-24.04
19
+ timeout-minutes: 10
20
+ steps:
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ persist-credentials: false
24
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
25
+ with:
26
+ python-version: '3.14.7'
27
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
28
+ with:
29
+ version: '0.12.8'
30
+ enable-cache: false
31
+ - run: uv build --no-sources --wheel --out-dir build/compatibility-wheel
32
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
33
+ with:
34
+ name: compatibility-wheel
35
+ path: build/compatibility-wheel/*.whl
36
+ if-no-files-found: error
37
+ retention-days: 7
38
+
39
+ compatibility:
40
+ name: SDK ${{ matrix.sdk }}
41
+ needs: wheel
42
+ runs-on: ubuntu-24.04
43
+ timeout-minutes: 20
44
+ strategy:
45
+ fail-fast: false
46
+ matrix:
47
+ sdk: [minimum, latest]
48
+ steps:
49
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
50
+ with:
51
+ persist-credentials: false
52
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
53
+ with:
54
+ python-version: '3.14.7'
55
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
56
+ with:
57
+ version: '0.12.8'
58
+ enable-cache: false
59
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
60
+ with:
61
+ name: compatibility-wheel
62
+ path: build/compatibility-wheel
63
+ - name: Select the unchanged wheel
64
+ id: wheels
65
+ shell: bash
66
+ run: |
67
+ plugin=(build/compatibility-wheel/toolframe_auth-*.whl)
68
+ test "${#plugin[@]}" = 1
69
+ echo "plugin=${plugin[0]}" >> "$GITHUB_OUTPUT"
70
+ - name: Verify installed wheel and package tests
71
+ uses: toolframe/toolframe-sdk/.github/actions/plugin-compatibility@2e2a3d79f35fbdb04249e8351fe9c75fc2164269
72
+ with:
73
+ mode: ${{ matrix.sdk }}
74
+ wheel: ${{ steps.wheels.outputs.plugin }}
75
+ output: build/compatibility-${{ matrix.sdk }}
76
+ - name: Retain compatibility evidence
77
+ if: always()
78
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
79
+ with:
80
+ name: compatibility-${{ matrix.sdk }}
81
+ path: |
82
+ build/compatibility-${{ matrix.sdk }}/report.json
83
+ build/compatibility-${{ matrix.sdk }}/pytest.xml
84
+ if-no-files-found: warn
85
+ retention-days: 14
@@ -2,21 +2,12 @@ name: Publish Python package
2
2
 
3
3
  on:
4
4
  workflow_dispatch:
5
- inputs:
6
- repository:
7
- description: Package index (run this workflow on a v<project.version> tag)
8
- type: choice
9
- options:
10
- - testpypi
11
- - pypi
12
- default: testpypi
13
- required: true
14
5
 
15
6
  permissions:
16
7
  contents: read
17
8
 
18
9
  concurrency:
19
- group: publish-${{ github.repository }}-${{ github.ref }}-${{ inputs.repository }}
10
+ group: publish-${{ github.repository }}-${{ github.ref }}-pypi
20
11
  cancel-in-progress: false
21
12
 
22
13
  jobs:
@@ -26,12 +17,15 @@ jobs:
26
17
  with:
27
18
  release-ref: ${{ github.ref }}
28
19
 
20
+ compatibility:
21
+ uses: ./.github/workflows/compatibility.yml
22
+
29
23
  publish:
30
- needs: validate
24
+ needs: [validate, compatibility]
31
25
  runs-on: ubuntu-24.04
32
26
  timeout-minutes: 10
33
27
  environment:
34
- name: ${{ inputs.repository }}
28
+ name: pypi
35
29
  permissions:
36
30
  id-token: write
37
31
  steps:
@@ -41,15 +35,7 @@ jobs:
41
35
  name: toolframe-auth-dist
42
36
  path: dist
43
37
 
44
- - name: Publish to TestPyPI
45
- if: inputs.repository == 'testpypi'
46
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
47
- with:
48
- repository-url: https://test.pypi.org/legacy/
49
- packages-dir: dist/
50
-
51
38
  - name: Publish to PyPI
52
- if: inputs.repository == 'pypi'
53
39
  uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
54
40
  with:
55
41
  packages-dir: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: toolframe-auth
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Managed access passwords and sessions for Toolframe
5
5
  Project-URL: Homepage, https://github.com/toolframe/toolframe-auth
6
6
  Project-URL: Repository, https://github.com/toolframe/toolframe-auth
@@ -11,7 +11,7 @@ License-Expression: Apache-2.0
11
11
  License-File: LICENSE
12
12
  License-File: NOTICE
13
13
  Requires-Python: >=3.14
14
- Requires-Dist: toolframe-sdk<0.5,>=0.4
14
+ Requires-Dist: toolframe-sdk<1,>=0.4.0
15
15
  Description-Content-Type: text/markdown
16
16
 
17
17
  # Toolframe Auth
@@ -25,7 +25,7 @@ database files itself. It requires SDK 0.4 and `toolframe.sql`.
25
25
  With a running Toolframe application and an active SQL storage provider:
26
26
 
27
27
  ```sh
28
- toolframe --home APP plugin add pypi:toolframe-auth==0.3.1 --enable
28
+ toolframe --home APP plugin add pypi:toolframe-auth==0.3.2 --enable
29
29
  ```
30
30
 
31
31
  The [Entry Register template](https://github.com/toolframe/toolframe-core#readme)
@@ -107,7 +107,7 @@ uv build --wheel
107
107
 
108
108
  For the same isolated lint, tests, distribution and wheel-install checks used by
109
109
  GitHub Actions, run `python3.14 scripts/ci.py`. See [CI and publishing](docs/ci.md)
110
- for pinned sibling sources, local requirements and TestPyPI/PyPI setup.
110
+ for pinned sibling sources, local requirements and PyPI setup.
111
111
 
112
112
  Core owns access policy. Its compatible OIDC integration supports
113
113
  `access.failure_mode = "closed"` for protected deployments; the default preserves
@@ -129,3 +129,6 @@ retain its private keys and configuration with the application home. Existing
129
129
  SQLite records are not imported automatically.
130
130
 
131
131
  For development hooks and contribution rules, see [Contributing](CONTRIBUTING.md).
132
+
133
+ Plugin dependencies allow compatible SDK 0.x updates from the declared minimum.
134
+ See the [SDK compatibility policy](https://github.com/toolframe/toolframe-sdk/blob/main/docs/compatibility.md) for API guarantees and minimum/latest verification.
@@ -9,7 +9,7 @@ database files itself. It requires SDK 0.4 and `toolframe.sql`.
9
9
  With a running Toolframe application and an active SQL storage provider:
10
10
 
11
11
  ```sh
12
- toolframe --home APP plugin add pypi:toolframe-auth==0.3.1 --enable
12
+ toolframe --home APP plugin add pypi:toolframe-auth==0.3.2 --enable
13
13
  ```
14
14
 
15
15
  The [Entry Register template](https://github.com/toolframe/toolframe-core#readme)
@@ -91,7 +91,7 @@ uv build --wheel
91
91
 
92
92
  For the same isolated lint, tests, distribution and wheel-install checks used by
93
93
  GitHub Actions, run `python3.14 scripts/ci.py`. See [CI and publishing](docs/ci.md)
94
- for pinned sibling sources, local requirements and TestPyPI/PyPI setup.
94
+ for pinned sibling sources, local requirements and PyPI setup.
95
95
 
96
96
  Core owns access policy. Its compatible OIDC integration supports
97
97
  `access.failure_mode = "closed"` for protected deployments; the default preserves
@@ -113,3 +113,6 @@ retain its private keys and configuration with the application home. Existing
113
113
  SQLite records are not imported automatically.
114
114
 
115
115
  For development hooks and contribution rules, see [Contributing](CONTRIBUTING.md).
116
+
117
+ Plugin dependencies allow compatible SDK 0.x updates from the declared minimum.
118
+ See the [SDK compatibility policy](https://github.com/toolframe/toolframe-sdk/blob/main/docs/compatibility.md) for API guarantees and minimum/latest verification.
@@ -68,14 +68,13 @@ the default `GITHUB_TOKEN` cannot read another private repository. Fork pull
68
68
  requests cannot access that secret and require publicly readable dependencies
69
69
  to pass. Checkout credentials are not persisted.
70
70
 
71
- `publish.yml` supports manual dispatch only, with `testpypi` as the default and
72
- `pypi` as the other selection. Run it on an existing tag named exactly
73
- `v<project.version>` (currently `v0.1.1`). A branch ref or mismatched tag fails
74
- the version gate. The reusable CI workflow validates the selected `github.sha`,
71
+ `publish.yml` publishes to PyPI on manual dispatch only. Run it on an existing
72
+ tag named exactly `v<project.version>`. A branch ref or mismatched tag fails the
73
+ version gate. The reusable CI workflow validates the selected `github.sha`,
75
74
  and publishing downloads only that run's validated artifact. The publishing
76
75
  job has a 10-minute timeout and is the only job with `id-token: write`. It does
77
76
  not rebuild the distributions. Duplicate uploads fail; existing files are not
78
- silently skipped. Publish runs for the same tag and index are serialized without
77
+ silently skipped. Publish runs for the same tag are serialized without
79
78
  cancelling an in-progress run.
80
79
 
81
80
  ## Publication
@@ -10,13 +10,14 @@ artifacts produced by that successful run.
10
10
  Run the repository's existing validation workflow; its local commands and
11
11
  integration coverage are described in [CI](ci.md).
12
12
 
13
- Publish `toolframe-sdk==0.4.1` first. The coordinated order and native CLI channels are documented in
13
+ Publish any newly required SDK version before the plugin. Compatible Core or SDK
14
+ updates alone do not require a plugin release. The coordinated order and native CLI channels are documented in
14
15
  [Toolframe's release guide](https://github.com/toolframe/toolframe-core/blob/main/docs/releasing.md).
15
16
 
16
17
  ## Trusted Publishers
17
18
 
18
- Create GitHub environments named `testpypi` and `pypi`. On each corresponding
19
- package index, configure a normal or pending Trusted Publisher with these values:
19
+ Create a GitHub environment named `pypi`. On PyPI, configure a normal or
20
+ pending Trusted Publisher with these values:
20
21
 
21
22
  | Field | Value |
22
23
  | --- | --- |
@@ -24,7 +25,7 @@ package index, configure a normal or pending Trusted Publisher with these values
24
25
  | GitHub owner | `toolframe` |
25
26
  | GitHub repository | `toolframe-auth` |
26
27
  | Workflow filename | `publish.yml` |
27
- | Environment | `testpypi` or `pypi`, matching the index |
28
+ | Environment | `pypi` |
28
29
 
29
30
  If publishing from another owner, use that actual owner in the publisher binding.
30
31
  Follow [PyPI's Trusted Publishing guide](https://docs.pypi.org/trusted-publishers/using-a-publisher/).
@@ -40,7 +41,7 @@ sibling owner where the workflow exposes that variable.
40
41
  ## Publish and verify
41
42
 
42
43
  After the release commit and matching tag are available remotely, manually run
43
- `publish.yml` at `v0.3.1`, selecting `testpypi` first and then `pypi`.
44
+ `publish.yml` at the matching `v<project.version>` tag to publish to PyPI.
44
45
  A branch or mismatched tag is rejected. Downloaded files are the artifacts from
45
46
  that run; the publishing job does not rebuild them. Published files cannot be
46
47
  replaced under the same version.
@@ -49,11 +50,11 @@ After PyPI publication, verify a clean installation:
49
50
 
50
51
  ```sh
51
52
  uv venv --python 3.14.7 build/consumer
52
- uv pip install --python build/consumer/bin/python 'toolframe-auth==0.3.1'
53
+ uv pip install --python build/consumer/bin/python 'toolframe-auth==0.3.2'
53
54
  uv pip check --python build/consumer/bin/python
54
55
  ```
55
56
 
56
- TestPyPI does not mirror dependencies. Test the specific artifact against an
57
- explicit dependency source; a local or TestPyPI check alone does not demonstrate
58
- that production PyPI resolution works. Keep logs, hashes and exact revisions in
59
- CI artifacts or ignored local evidence directories.
57
+ Test the specific artifact with dependencies from PyPI. Local artifact checks
58
+ alone do not demonstrate that the published package resolves correctly from
59
+ PyPI. Keep logs, hashes and exact revisions in CI artifacts or ignored local
60
+ evidence directories.
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "toolframe-auth"
7
- version = "0.3.1"
7
+ version = "0.3.2"
8
8
  description = "Managed access passwords and sessions for Toolframe"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
11
11
  license-files = ["LICENSE", "NOTICE"]
12
12
  authors = [{ name = "byfb", email = "62798989+byfb@users.noreply.github.com" }]
13
13
  requires-python = ">=3.14"
14
- dependencies = ["toolframe-sdk<0.5,>=0.4"]
14
+ dependencies = ["toolframe-sdk<1,>=0.4.0"]
15
15
 
16
16
  [project.urls]
17
17
  Homepage = "https://github.com/toolframe/toolframe-auth"
@@ -282,7 +282,7 @@ wheels = [
282
282
 
283
283
  [[package]]
284
284
  name = "toolframe-auth"
285
- version = "0.3.1"
285
+ version = "0.3.2"
286
286
  source = { editable = "." }
287
287
  dependencies = [
288
288
  { name = "toolframe-sdk" },
File without changes
File without changes
File without changes