Skip to content

Commit 6431067

Browse files
committed
Prepare Python 0.8.0 release metadata and CI
1 parent 6a6af2b commit 6431067

10 files changed

Lines changed: 105 additions & 24 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
uses: actions/checkout@v7
2121
with: &specification-checkout
2222
repository: OpenStatSpec/specification
23-
ref: cd8f198c68b849eb8ed018a894670a0904c2181d
23+
ref: 864e84479f554b8ee250ffed44c4dfb963750d4a
2424
path: openstatspec-specification
2525
- name: Checkout required SPSS engine
2626
uses: actions/checkout@v7
@@ -53,9 +53,9 @@ jobs:
5353
- run: python -m pip install --upgrade pip build
5454
- run: python -m build
5555
- run: python -m venv /tmp/openstatspec-wheel-smoke
56-
- run: /tmp/openstatspec-wheel-smoke/bin/python -m pip install ./openstatspec-pyspssio
5756
- run: /tmp/openstatspec-wheel-smoke/bin/python -m pip install dist/*.whl
58-
- run: /tmp/openstatspec-wheel-smoke/bin/openstatspec capabilities
57+
- run: env -u PYTHONPATH /tmp/openstatspec-wheel-smoke/bin/openstatspec capabilities
58+
working-directory: /tmp
5959

6060
postgres-integration:
6161
name: PostgreSQL ${{ matrix.postgres }} integration
@@ -155,6 +155,7 @@ jobs:
155155
image: dolthub/dolt:2.2.3@sha256:1a651e738a2e7275b9c69fec8c5f42c6e23954314405c412f4dc9287ee7c0080
156156
env:
157157
OPENSTATSPEC_DOLT_URL: mysql+pymysql://openstatspec:openstatspec@127.0.0.1:13308/openstatspec
158+
OPENSTATSPEC_TEST_DOLT_ADMIN_URL: mysql+pymysql://openstatspec_test_admin:ci-admin@127.0.0.1:13308/
158159
OPENSTATSPEC_EXPECTED_DOLT_VERSION: ${{ matrix.dolt }}
159160
OPENSTATSPEC_DOLT_IMAGE: ${{ matrix.image }}
160161
steps:
@@ -186,6 +187,11 @@ jobs:
186187
--workdir /var/lib/dolt \
187188
"$OPENSTATSPEC_DOLT_IMAGE" sql \
188189
-q "CREATE USER 'openstatspec'@'%' IDENTIFIED BY 'openstatspec'; GRANT ALL PRIVILEGES ON openstatspec.* TO 'openstatspec'@'%'"
190+
docker run --rm \
191+
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
192+
--workdir /var/lib/dolt \
193+
"$OPENSTATSPEC_DOLT_IMAGE" sql \
194+
-q "CREATE USER 'openstatspec_test_admin'@'%' IDENTIFIED BY 'ci-admin'; GRANT ALL PRIVILEGES ON *.* TO 'openstatspec_test_admin'@'%' WITH GRANT OPTION"
189195
docker run --detach --name openstatspec-dolt \
190196
--publish 127.0.0.1:13308:3306 \
191197
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
@@ -218,6 +224,7 @@ jobs:
218224
break
219225
PY
220226
- run: python -m pytest -m "services and not candidate_evidence"
227+
- run: python -m pytest tests/test_read_only_export.py
221228
- name: Show Dolt logs on failure and stop server
222229
if: always()
223230
run: |

‎.github/workflows/release.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
4949
with:
5050
repository: OpenStatSpec/specification
51-
ref: cd8f198c68b849eb8ed018a894670a0904c2181d
51+
ref: 864e84479f554b8ee250ffed44c4dfb963750d4a
5252
path: openstatspec-specification
5353
- name: Checkout specification package source
5454
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
@@ -159,9 +159,9 @@ jobs:
159159
- run: python -m pip install -e ".[dev]"
160160
- run: python -m pytest -m "not services"
161161
- run: python -m venv /tmp/openstatspec-release-smoke
162-
- run: /tmp/openstatspec-release-smoke/bin/python -m pip install ./openstatspec-pyspssio
163162
- run: /tmp/openstatspec-release-smoke/bin/python -m pip install dist/openstatspec/openstatspec-*.whl
164-
- run: /tmp/openstatspec-release-smoke/bin/openstatspec capabilities
163+
- run: env -u PYTHONPATH /tmp/openstatspec-release-smoke/bin/openstatspec capabilities
164+
working-directory: /tmp
165165
- name: Smoke-test specification wheel
166166
run: |
167167
python -m venv /tmp/openstatspec-specification-release-smoke

‎CHANGELOG.md‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,30 @@ All notable changes to this reference implementation are documented here.
66

77
_No unreleased changes._
88

9+
## 0.8.0 - 2026-09-07
10+
11+
### Changed
12+
13+
- Pin released specification `v0.5.0` at exact commit
14+
`864e84479f554b8ee250ffed44c4dfb963750d4a`, with normative status `released`.
15+
Capabilities identify adapter version 0.8.0 and explicitly select SAV/ZSAV 1.0
16+
with `database_io_policy=openstatspec-database-io-v1`.
17+
- Reads, inspection, validation, and SAV/ZSAV export no longer write database
18+
operation/fidelity audit records, including on failure. Export diagnostics
19+
and loss consent remain operation-scoped; export results omit `operation_id`.
20+
- Default Dolt writes use the packaged tested exact-version policy for 2.2.2
21+
and 2.2.3 without user-supplied evidence files. Unknown/untested versions
22+
remain blocked before mutation; explicit external overrides remain strict.
23+
Safety budgets are not claimed as proven native server limits.
24+
- Dolt reads no longer require write-version declarations or the write
25+
variable-count ceiling. Missing SQLite files are rejected without creation.
26+
- Exact Dolt 2.2.2/2.2.3 CI explicitly runs SELECT-only export success/failure
27+
tests using a separate fixture-admin account; normal service permissions
28+
and adapter permissions are unchanged. Wheel smoke installs resolve the
29+
required engine from PyPI rather than a source checkout.
30+
31+
No optional Transformation Workflow 0.3 implementation is claimed.
32+
933
## 0.7.1 - 2026-08-12
1034

1135
### Changed

‎README.md‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ The reference Python implementation of the OpenStatSpec specification.
44

55
This package implements the specification; it does not define or extend it.
66
The normative model lives in the `OpenStatSpec/specification` repository.
7+
Python 0.8.0 pins released specification `v0.5.0` at
8+
`864e84479f554b8ee250ffed44c4dfb963750d4a` and selects SAV/ZSAV 1.0 with
9+
`database_io_policy=openstatspec-database-io-v1`. This does not claim
10+
implementation of the optional Transformation Workflow 0.3 profile.
711

812
## Boundaries
913

@@ -137,7 +141,8 @@ dictionary semantics cannot be reproduced, it stops until you pass the exact
137141
diagnostic code with `--allow-loss`. Diagnostics are returned to the caller, not
138142
persisted. Reads, validation, and SAV/ZSAV export never write to the database,
139143
including on failure. Export returns no `operation_id` and needs only read
140-
permissions; Dolt reads have no write-version gate. Imports and transformations
144+
permissions; Dolt reads have no write-version or write-variable-count gate.
145+
Read operations reject missing SQLite files without creating them. Imports and transformations
141146
use the packaged exact-version policy by default. Active driver/identity checks,
142147
limit preflight, and the clean expected branch/HEAD guard for in-place apply
143148
remain mandatory. Dolt's reported limits are adapter safety budgets, narrowed

‎docs/release-readiness.md‎

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
# 0.7.1 release readiness
1+
# 0.8.0 release readiness
22

33
This page records the expected release contract, not a publication event.
44
Creating a version tag remains a separate maintainer action.
55

6+
The release selects SAV/ZSAV 1.0 with the optional Database I/O Execution
7+
Policy `openstatspec-database-io-v1`. Reads and exports, including failures,
8+
write no database audit records; export results omit `operation_id` and return
9+
diagnostics to the caller. Reads must not create missing SQLite files or apply
10+
Dolt write-variable-count ceilings. This release does not claim implementation
11+
of the optional Transformation Workflow 0.3 profile.
12+
613
## Supported workflow
714

815
For a supported unencrypted SAV or ZSAV source, the adapter imports one source
@@ -104,7 +111,7 @@ implemented openstatspec.frontends.spss package. Stata and SAS remain empty
104111
source-tree placeholders and must expose no compiler, apply API, CLI choice,
105112
capability claim, or implied support.
106113

107-
## Default Dolt write verification
114+
## Prior default Dolt write verification (before the 0.8.0 pin)
108115

109116
Local release verification used the exact 2.2.2 and 2.2.3 image digests in
110117
`.github/workflows/ci.yml`, isolated ports 13482/13483, and disposable `/tmp`
@@ -125,6 +132,30 @@ owned table additions being misclassified as unrelated diffs, and Dolt retaining
125132
transaction. The candidate storage/identifier/column smoke probe also passed on
126133
both pins; it does **not** establish full value/row/statement limit conformance.
127134

135+
## 0.8.0 local verification
136+
137+
Using `../python/.venv/bin/python`, `PYTHONPATH=src:../pyspssio`, and
138+
`OPENSTATSPEC_SPECIFICATION_DIR=/tmp/oss-python-spec-v050-5dSTna` (an archive
139+
of exact `864e84479f554b8ee250ffed44c4dfb963750d4a`):
140+
141+
- `python -m pytest -ra`: **381 passed, 49 skipped**, with
142+
`OPENSTATSPEC_TEST_DOLT_ADMIN_URL=mysql+pymysql://root@127.0.0.1:13387/`
143+
exercising live Dolt 2.3.0 through disposable SELECT-only users.
144+
- Both immutable CI images, exact Dolt 2.2.2/2.2.3, bootstrapped with the
145+
unchanged service user and separate global fixture admin on ports 13582/13583:
146+
`python -m pytest -m 'services and not candidate_evidence'`: **7 passed,
147+
41 skipped, 382 deselected per pin**; explicit
148+
`python -m pytest tests/test_read_only_export.py`: **33 passed per pin**.
149+
- `python -m compileall -q src tests`, `git diff --check`, wheel/sdist build,
150+
and `python -m twine check /tmp/oss-python-v080-dist/*` passed.
151+
- A clean wheel install resolved the required engine from PyPI. Isolated
152+
imports came only from the smoke environment's `site-packages`; installed
153+
capabilities reported adapter 0.8.0, the selected policy, released v0.5.0
154+
provenance, and exactly 2.2.2/2.2.3 for default Dolt writes.
155+
156+
Other database services were not configured locally. This is local evidence,
157+
not a claim that the updated remote CI or release publication has completed.
158+
128159
## Maintainer checks before tagging
129160

130161
1. Publish the pinned `openstatspec-pyspssio==0.5.1.post2` engine distribution
@@ -139,13 +170,22 @@ both pins; it does **not** establish full value/row/statement limit conformance.
139170
catalog, and audit rollback checks, and failed-import cleanup. Release/CI
140171
owns this evidence, not per-user runtime declaration files. Candidate limit
141172
probes remain non-claiming and separate from these write gates.
173+
Each Dolt job must also run `python -m pytest tests/test_read_only_export.py`
174+
explicitly, outside the `services` marker filter. Bootstrap a separate
175+
`openstatspec_test_admin` on the isolated CI server with global database/user
176+
creation and grant privileges, and set `OPENSTATSPEC_TEST_DOLT_ADMIN_URL`.
177+
The fixture creates its own database and SELECT-only reader and removes
178+
both afterward; the normal service user remains unchanged.
142179
4. Build with `python -m build` and install the generated wheel in a clean
143-
environment.
180+
environment, resolving `openstatspec-pyspssio==0.5.1.post2` from PyPI.
181+
Run the installed CLI outside the source checkout with `PYTHONPATH` unset;
182+
verify adapter version `0.8.0` and the selected database I/O policy.
144183
5. Confirm `openstatspec capabilities` reflects the intended support boundary.
145184
6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
146-
specification `v0.3.0` at exact commit
147-
`cd8f198c68b849eb8ed018a894670a0904c2181d`, publish
148-
`specification_status=stable`, and set `specification_release` to `v0.3.0`.
185+
specification `v0.5.0` at exact commit
186+
`864e84479f554b8ee250ffed44c4dfb963750d4a`, publish
187+
`specification_status=released`, and set `specification_release` to `v0.5.0`.
188+
Use an exact checkout via `OPENSTATSPEC_SPECIFICATION_DIR` for local tests.
149189
7. Review this document, the README, and CHANGELOG for accurate scope.
150190

151191
The tag-triggered release workflow repeats the non-service test suite, builds

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "openstatspec"
7-
version = "0.7.1"
7+
version = "0.8.0"
88
description = "Reference adapter for the OpenStatSpec relational contract"
99
readme = "README.md"
1010
requires-python = ">=3.11"

‎src/openstatspec/api.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
)
3535
from .transform import TransformationPlan
3636
from .sql.database_urls import require_existing_database_url
37+
from .sql.dolt_conformance import ADAPTER_VERSION
3738
from .sql.capabilities import (
3839
SPECIFICATION_COMMIT, SPECIFICATION_RELEASE, SPECIFICATION_STATUS,
3940
active_connection, catalog_binding,
@@ -58,6 +59,7 @@ def capability_matrix(
5859
require_existing_database_url(database_url)
5960
declaration = {
6061
"specification": "OpenStatSpec",
62+
"adapter_version": ADAPTER_VERSION,
6163
"database_io_policy": "openstatspec-database-io-v1",
6264
"specification_status": SPECIFICATION_STATUS,
6365
"specification_release": SPECIFICATION_RELEASE,

‎src/openstatspec/sql/capabilities.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020

2121
# Release/build automation binds the adapter to the exact language-neutral
2222
# specification revision used for normative fixtures and profile semantics.
23-
SPECIFICATION_COMMIT = "cd8f198c68b849eb8ed018a894670a0904c2181d"
24-
SPECIFICATION_STATUS = "stable"
25-
SPECIFICATION_RELEASE: str | None = "v0.3.0"
23+
SPECIFICATION_COMMIT = "864e84479f554b8ee250ffed44c4dfb963750d4a"
24+
SPECIFICATION_STATUS = "released"
25+
SPECIFICATION_RELEASE: str | None = "v0.5.0"
2626

2727
DOLT_WRITE_CONFORMANCE = {
2828
"declaration_schema_id": "openstatspec-dolt-adapter-declaration-v1",

‎tests/test_cli.py‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ def test_cli_import_inspect_validate_and_export_emit_json(tmp_path, capsys) -> N
4242

4343
def test_capability_matrix_is_public_and_cli_matches_engine_boundary(capsys) -> None:
4444
matrix = openstatspec.capability_matrix()
45-
assert matrix["specification_status"] == "stable"
46-
assert matrix["specification_release"] == "v0.3.0"
47-
assert matrix["specification_commit"] == "cd8f198c68b849eb8ed018a894670a0904c2181d"
45+
assert matrix["adapter_version"] == "0.8.0"
46+
assert matrix["database_io_policy"] == "openstatspec-database-io-v1"
47+
assert matrix["specification_status"] == "released"
48+
assert matrix["specification_release"] == "v0.5.0"
49+
assert matrix["specification_commit"] == "864e84479f554b8ee250ffed44c4dfb963750d4a"
4850
assert matrix["directions"] == ["import", "export", "semantic_round_trip"]
4951
assert matrix["active_connection"] is None
5052
assert matrix["engine"]["package"] == "openstatspec-pyspssio"
@@ -82,6 +84,7 @@ def test_capability_matrix_is_public_and_cli_matches_engine_boundary(capsys) ->
8284

8385
def test_capability_matrix_reports_active_sqlite_limits(tmp_path) -> None:
8486
database_url = f"sqlite:///{tmp_path / 'capabilities.sqlite'}"
87+
sqlite3.connect(tmp_path / "capabilities.sqlite").close()
8588
matrix = openstatspec.capability_matrix(database_url=database_url)
8689
active = matrix["active_connection"]
8790
assert active["profile"] == "sqlite"

‎tests/test_sql_profiles.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ def test_profile_detection_tracks_supported_dialect_urls() -> None:
2929
assert profile_for_url("mariadb+mariadbconnector://user@host/database") is MYSQL
3030
assert profile_for_url("mysql+pymysql://user@host/dolt_database") is MYSQL
3131

32-
def test_profile_declarations_publish_stable_specification_provenance() -> None:
32+
def test_profile_declarations_publish_released_specification_provenance() -> None:
3333
for declaration in capabilities.profile_declarations().values():
34-
assert declaration["specification_status"] == "stable"
35-
assert declaration["specification_release"] == "v0.3.0"
34+
assert declaration["specification_status"] == "released"
35+
assert declaration["specification_release"] == "v0.5.0"
3636
assert (
3737
declaration["specification_commit"]
38-
== "cd8f198c68b849eb8ed018a894670a0904c2181d"
38+
== "864e84479f554b8ee250ffed44c4dfb963750d4a"
3939
)
4040

4141
def test_profile_preflight_fails_without_transforming_a_wide_dataset() -> None:

0 commit comments

Comments
 (0)