Skip to content

Commit f0bdce0

Browse files
committed
Support the Dolt 2.2.x release family
1 parent 390c20e commit f0bdce0

10 files changed

Lines changed: 129 additions & 59 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 17 additions & 7 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: e94ae8349d2b0dffe0c65e820b4b22b8c074b7b5
23+
ref: d287c2cde9ade71f04e27dd012caec876901aed5
2424
path: openstatspec-specification
2525
- name: Checkout required SPSS engine
2626
uses: actions/checkout@v7
@@ -143,10 +143,20 @@ jobs:
143143
steps: *sql-test-steps
144144

145145
dolt-integration:
146-
name: Dolt 2.2.2 integration
146+
name: Dolt ${{ matrix.dolt }} integration
147147
runs-on: ubuntu-latest
148+
strategy:
149+
fail-fast: false
150+
matrix:
151+
include:
152+
- dolt: "2.2.2"
153+
image: dolthub/dolt:2.2.2@sha256:ae85afdd95317f0a982cab87fa3092a5a2e6689bc5de822ad7ae4f65b86d39a1
154+
- dolt: "2.2.3"
155+
image: dolthub/dolt:2.2.3@sha256:1a651e738a2e7275b9c69fec8c5f42c6e23954314405c412f4dc9287ee7c0080
148156
env:
149157
OPENSTATSPEC_DOLT_URL: mysql+pymysql://openstatspec:openstatspec@127.0.0.1:13308/openstatspec
158+
OPENSTATSPEC_EXPECTED_DOLT_VERSION: ${{ matrix.dolt }}
159+
OPENSTATSPEC_DOLT_IMAGE: ${{ matrix.image }}
150160
steps:
151161
- uses: actions/checkout@v7
152162
- name: Checkout OpenStatSpec specification fixtures
@@ -158,29 +168,29 @@ jobs:
158168
- uses: actions/setup-python@v7
159169
with:
160170
python-version: "3.12"
161-
- name: Initialize Dolt 2.2.2
171+
- name: Initialize Dolt ${{ matrix.dolt }}
162172
run: |
163173
mkdir -p "$RUNNER_TEMP/openstatspec-dolt"
164174
docker run --rm \
165175
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
166176
--workdir /var/lib/dolt \
167-
dolthub/dolt:2.2.2 init \
177+
"$OPENSTATSPEC_DOLT_IMAGE" init \
168178
--name "OpenStatSpec CI" --email "ci@openstatspec.org"
169179
docker run --rm \
170180
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
171181
--workdir /var/lib/dolt \
172-
dolthub/dolt:2.2.2 sql \
182+
"$OPENSTATSPEC_DOLT_IMAGE" sql \
173183
-q "CREATE DATABASE openstatspec"
174184
docker run --rm \
175185
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
176186
--workdir /var/lib/dolt \
177-
dolthub/dolt:2.2.2 sql \
187+
"$OPENSTATSPEC_DOLT_IMAGE" sql \
178188
-q "CREATE USER 'openstatspec'@'%' IDENTIFIED BY 'openstatspec'; GRANT ALL PRIVILEGES ON openstatspec.* TO 'openstatspec'@'%'"
179189
docker run --detach --name openstatspec-dolt \
180190
--publish 127.0.0.1:13308:3306 \
181191
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
182192
--workdir /var/lib/dolt \
183-
dolthub/dolt:2.2.2 sql-server -H 0.0.0.0 -l warning
193+
"$OPENSTATSPEC_DOLT_IMAGE" sql-server -H 0.0.0.0 -l warning
184194
- run: python -m pip install --upgrade pip
185195
- run: python -m pip install ./openstatspec-pyspssio
186196
- run: python -m pip install -e ".[dev,sql]"

‎.github/workflows/release.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747
uses: actions/checkout@v7
4848
with:
4949
repository: OpenStatSpec/specification
50-
ref: e94ae8349d2b0dffe0c65e820b4b22b8c074b7b5
50+
ref: d287c2cde9ade71f04e27dd012caec876901aed5
5151
path: openstatspec-specification
5252
- name: Checkout required SPSS engine
5353
uses: actions/checkout@v7

‎CHANGELOG.md‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@ All notable changes to this reference implementation are documented here.
1010
CI evidence: PostgreSQL 17.x/18.x at 17.10/18.4, MySQL 8.4.x/9.7.x at
1111
8.4.11/9.7.2, and MariaDB 11.4.x/11.8.x/12.3.x at
1212
11.4.12/11.8.8/12.3.2. Each service job verifies the live normalized version.
13-
- Dolt remains independently pinned and service-tested at exact version 2.2.2.
13+
- Dolt remains an independent core profile, now claiming canonical stable
14+
versions `>=2.2.2,<2.3.0` and running its complete service suite at exact
15+
versions 2.2.2 and 2.2.3 from immutable container-image pins.
1416
SQLite retains its core `>=3.24.0,<4.0.0` and optional workflow
1517
`>=3.35.0,<4.0.0` tiers. MSSQL remains unsupported and roadmap-only.
1618

1719
### Specification basis
1820

19-
- CI, release validation, and machine-readable capabilities use untagged
20-
OpenStatSpec specification `main` commit
21-
`e94ae8349d2b0dffe0c65e820b4b22b8c074b7b5`; the specification release value
22-
is null until that commit is tagged.
21+
- CI, release validation, and machine-readable capabilities use OpenStatSpec
22+
specification release `v0.1.0` at exact commit
23+
`d287c2cde9ade71f04e27dd012caec876901aed5`.
2324

2425
## 0.2.0 — 2026-07-30
2526

‎README.md‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,25 @@ in operation metadata. There is no fallback reader or writer. It supports unencr
6969
SAV/ZSAV export for the semantics exposed by that engine. SQLite is the local
7070
reference path.
7171
PostgreSQL, MySQL, MariaDB, and Dolt are each covered by separate service-backed CI
72-
conformance checks. Dolt support is an independent core profile pinned to 2.2.2;
73-
other Dolt versions and unknown MySQL-wire products fail closed.
72+
conformance checks. Dolt support is an independent core profile for the
73+
canonical stable range `>=2.2.2,<2.3.0`; earlier patches, other families,
74+
noncanonical versions, and unknown MySQL-wire products fail closed.
7475

7576
The supported family claims are broader than the deliberately exact CI
7677
evidence points: PostgreSQL 17.x/18.x is exercised at 17.10/18.4, MySQL
7778
8.4.x/9.7.x at 8.4.11/9.7.2, and MariaDB 11.4.x/11.8.x/12.3.x at
7879
11.4.12/11.8.8/12.3.2. Each service job checks the normalized live server
7980
version against its exact matrix entry before that run can count as evidence.
80-
Dolt remains a separate exact-version policy: its only claimed and CI-tested
81-
version is 2.2.2.
81+
Dolt claims the conservative 2.2.x range `>=2.2.2,<2.3.0`; its full service
82+
suite is exercised independently at exact versions 2.2.2 and 2.2.3 using
83+
immutable container-image digests.
8284

8385
Use these explicit SQLAlchemy URLs:
8486

8587
- SQLite: `sqlite:///dataset.sqlite`
8688
- PostgreSQL: `postgresql+psycopg://user:password@host/database`
8789
- MySQL/MariaDB: `mysql+pymysql://user:password@host/database`
88-
- Dolt 2.2.2: `mysql+pymysql://user:password@host/database` (detected by server identity)
90+
- Dolt `>=2.2.2,<2.3.0`: `mysql+pymysql://user:password@host/database` (detected by server identity)
8991

9092
The Dolt core profile supports strict wide-table import, validation, and export;
9193
the separate Transformation Workflow is unsupported.

‎docs/release-readiness.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ database contract.
2020
| PostgreSQL | `postgresql+psycopg://…` | 17.x and 18.x | 17.10 and 18.4 |
2121
| MySQL | `mysql+pymysql://…` | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
2222
| MariaDB | `mysql+pymysql://…` | 11.4.x, 11.8.x, and 12.3.x | 11.4.12, 11.8.8, and 12.3.2 |
23-
| Dolt | `mysql+pymysql://…` | Exact 2.2.2 | Exact 2.2.2 |
23+
| Dolt | `mysql+pymysql://…` | 2.2.x with `>=2.2.2,<2.3.0` | 2.2.2 and 2.2.3 |
2424

2525
Separate service matrices test the shared MySQL/MariaDB profile contract while
2626
retaining distinct active-server identities and version claims. Dolt is an
27-
independent core profile that fails closed unless the product version is exactly
28-
2.2.2; the optional Transformation Workflow remains SQLite-only. This does not
27+
independent core profile that accepts only canonical stable versions in
28+
`>=2.2.2,<2.3.0`; the optional Transformation Workflow remains SQLite-only. This does not
2929
claim coverage for every server configuration. The machine-readable capability
3030
declaration reports both the theoretical profile boundaries and effective
3131
limits observed from the active connection.
@@ -64,13 +64,13 @@ machine-readable loss report with the export result.
6464
2. Run `python -m pytest -m "not services"`.
6565
3. Confirm the GitHub Actions matrix is green for exact PostgreSQL 17.10/18.4,
6666
MySQL 8.4.11/9.7.2, MariaDB 11.4.12/11.8.8/12.3.2, and exact Dolt
67-
2.2.2 service evidence.
67+
2.2.2/2.2.3 service evidence from the immutable image pins in CI.
6868
4. Build with `python -m build` and install the generated wheel in a clean
6969
environment.
7070
5. Confirm `openstatspec capabilities` reflects the intended support boundary.
7171
6. Confirm the release tag matches the package version and that CI, release
72-
fixtures, and capabilities use untagged specification `main` commit
73-
`e94ae8349d2b0dffe0c65e820b4b22b8c074b7b5` with a null release value.
72+
fixtures, and capabilities use OpenStatSpec specification release `v0.1.0`
73+
at exact commit `d287c2cde9ade71f04e27dd012caec876901aed5`.
7474
7. Review this document, the README, and CHANGELOG for accurate scope.
7575

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

‎docs/sav-profile.md‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ points are PostgreSQL 17.x/18.x at 17.10/18.4, MySQL 8.4.x/9.7.x at
2121
11.4.12/11.8.8/12.3.2. CI compares each live normalized server version with
2222
that exact evidence point.
2323

24-
Dolt is an independent core profile pinned to exact server version 2.2.2 and
25-
detected over `mysql+pymysql` by active server identity; other Dolt versions
26-
and unknown MySQL-wire products fail closed. The core Dolt profile does not
24+
Dolt is an independent core profile for canonical stable versions in
25+
`>=2.2.2,<2.3.0`, detected over `mysql+pymysql` by active server identity and
26+
service-tested at exact versions 2.2.2 and 2.2.3. Earlier patches, other
27+
families, noncanonical versions, and unknown MySQL-wire products fail closed.
28+
The core Dolt profile does not
2729
claim support for the separate Transformation Workflow. An import that exceeds
2830
a target's strict single-table column or row envelope fails before it creates a
2931
dataset.

‎src/openstatspec/api.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def capability_matrix(database_url: str | None = None) -> Mapping[str, Any]:
3737
"""
3838
declaration = {
3939
"specification": "OpenStatSpec",
40-
"specification_status": "release_candidate",
40+
"specification_status": "released",
4141
"specification_release": SPECIFICATION_RELEASE,
4242
"specification_commit": SPECIFICATION_COMMIT,
4343
"profile": "SPSS SAV/ZSAV 1.0",

‎src/openstatspec/sql/capabilities.py‎

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
from .profiles import profile_for_url, validate_connection_url
1616
from ..core import UnsupportedOperationError
1717

18-
SPECIFICATION_COMMIT = "e94ae8349d2b0dffe0c65e820b4b22b8c074b7b5"
19-
SPECIFICATION_RELEASE: str | None = None
18+
SPECIFICATION_COMMIT = "d287c2cde9ade71f04e27dd012caec876901aed5"
19+
SPECIFICATION_RELEASE: str | None = "v0.1.0"
20+
21+
_DOLT_2_2_STABLE_VERSION = re.compile(r"2\.2\.(0|[1-9][0-9]*)")
2022

2123
SERVER_POLICIES = {
2224
"sqlite": {
@@ -28,8 +30,13 @@
2830
"ci": ["MySQL 8.4.11", "MySQL 9.7.2"],
2931
},
3032
"dolt": {
31-
"claimed": ["Dolt 2.2.2"],
32-
"ci": ["Dolt 2.2.2"],
33+
"claimed": ["Dolt 2.2.x"],
34+
"range": {
35+
"minimum_inclusive": "2.2.2",
36+
"maximum_exclusive": "2.3.0",
37+
},
38+
"ci": ["Dolt 2.2.2", "Dolt 2.2.3"],
39+
"exact_ci": ["2.2.2", "2.2.3"],
3340
},
3441
"mariadb": {
3542
"claimed": ["MariaDB 11.4.x", "MariaDB 11.8.x", "MariaDB 12.3.x"],
@@ -115,9 +122,10 @@ def active_connection(database_url: str) -> dict[str, Any]:
115122
raw_product_version = _required_text_probe(
116123
connection, "select DOLT_VERSION()", "DOLT_VERSION()",
117124
)
118-
if raw_product_version.strip() != "2.2.2":
125+
if not _dolt_version_supported(raw_product_version):
119126
raise UnsupportedOperationError(
120-
"The active Dolt product version must be exactly 2.2.2."
127+
"The active Dolt product version must be a canonical stable "
128+
"release in the supported range >=2.2.2,<2.3.0."
121129
)
122130
identity_source = "SELECT @@version, @@version_comment, DOLT_VERSION()"
123131
elif "mariadb" in identity_text:
@@ -153,7 +161,11 @@ def active_connection(database_url: str) -> dict[str, Any]:
153161
"profile": profile_name,
154162
"engine": profile_name,
155163
"product": profile_name,
156-
"transport": "mysql" if dialect in {"mysql", "mariadb"} else dialect,
164+
"transport": (
165+
"mysql_compatible" if profile_name == "dolt"
166+
else "mysql" if dialect in {"mysql", "mariadb"}
167+
else dialect
168+
),
157169
"driver": engine.dialect.driver,
158170
"server_version": _normalized_version(profile_name, raw_product_version),
159171
"raw_server_version": raw_product_version,
@@ -325,13 +337,18 @@ def _profile(
325337
"profile": name,
326338
"engine": name,
327339
"dialect": "mysql" if name == "dolt" else name,
328-
"transport": "mysql" if name == "dolt" else name,
340+
"transport": "mysql_compatible" if name == "dolt" else name,
329341
"specification_commit": SPECIFICATION_COMMIT,
330-
"specification_status": "release_candidate",
342+
"specification_status": "released",
331343
"specification_release": SPECIFICATION_RELEASE,
332344
"driver": "psycopg" if name == "postgresql" else "PyMySQL" if name in {"mysql", "mariadb", "dolt"} else "sqlite3",
333345
"claimed_server_versions": policy["claimed"],
346+
"claimed_version_range": policy.get("range"),
334347
"ci_tested_server_versions": policy["ci"],
348+
**(
349+
{"exact_ci_tested_versions": policy["exact_ci"]}
350+
if "exact_ci" in policy else {}
351+
),
335352
"theoretical_limits": theoretical,
336353
"proposed_adapter_limits": proposed,
337354
"observed_limits": observed_limits,
@@ -391,7 +408,7 @@ def _profile(
391408

392409
def server_version_supported(profile: str, raw_version: str) -> bool:
393410
if profile == "dolt":
394-
return raw_version.strip() == "2.2.2"
411+
return _dolt_version_supported(raw_version)
395412
version = _version_tuple(raw_version)
396413
if profile == "sqlite":
397414
return (3, 24) <= version[:2] < (4, 0)
@@ -404,6 +421,12 @@ def server_version_supported(profile: str, raw_version: str) -> bool:
404421
return version[:width] in allowed
405422

406423

424+
def _dolt_version_supported(raw_version: str) -> bool:
425+
"""Accept only canonical stable Dolt 2.2 patches at or above 2.2.2."""
426+
match = _DOLT_2_2_STABLE_VERSION.fullmatch(raw_version.strip())
427+
return match is not None and match.group(1) not in {"0", "1"}
428+
429+
407430
def _matched_claim(profile: str, raw_version: str) -> str | None:
408431
if not server_version_supported(profile, raw_version):
409432
return None

‎tests/test_cli.py‎

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

3939
def test_capability_matrix_is_public_and_cli_matches_engine_boundary(capsys) -> None:
4040
matrix = openstatspec.capability_matrix()
41-
assert matrix["specification_status"] == "release_candidate"
42-
assert matrix["specification_release"] is None
43-
assert matrix["specification_commit"] == "e94ae8349d2b0dffe0c65e820b4b22b8c074b7b5"
41+
assert matrix["specification_status"] == "released"
42+
assert matrix["specification_release"] == "v0.1.0"
43+
assert matrix["specification_commit"] == "d287c2cde9ade71f04e27dd012caec876901aed5"
4444
assert matrix["directions"] == ["import", "export", "semantic_round_trip"]
4545
assert matrix["active_connection"] is None
4646
assert matrix["engine"]["package"] == "openstatspec-pyspssio"

0 commit comments

Comments
 (0)