openstatspec 0.7.0__tar.gz → 0.8.0__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.
- {openstatspec-0.7.0 → openstatspec-0.8.0}/.github/workflows/ci.yml +11 -4
- {openstatspec-0.7.0 → openstatspec-0.8.0}/.github/workflows/release.yml +3 -3
- {openstatspec-0.7.0 → openstatspec-0.8.0}/CHANGELOG.md +32 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/PKG-INFO +24 -10
- {openstatspec-0.7.0 → openstatspec-0.8.0}/README.md +23 -9
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/release-readiness.md +81 -15
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/sav-profile.md +1 -1
- openstatspec-0.8.0/docs/superpowers/plans/2026-08-12-python-v071-stable-pin.md +158 -0
- openstatspec-0.8.0/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md +35 -0
- openstatspec-0.8.0/openstatspec-specification/.github/workflows/ci.yml +24 -0
- openstatspec-0.8.0/openstatspec-specification/.github/workflows/release.yml +108 -0
- openstatspec-0.8.0/openstatspec-specification/.gitignore +5 -0
- openstatspec-0.8.0/openstatspec-specification/CHANGELOG.md +116 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/README.md +42 -7
- openstatspec-0.8.0/openstatspec-specification/RELEASING.md +81 -0
- openstatspec-0.8.0/openstatspec-specification/ROADMAP.md +162 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/VERSIONING.md +10 -1
- openstatspec-0.8.0/openstatspec-specification/conformance/spss-syntax-frontend-0.3.json +714 -0
- openstatspec-0.8.0/openstatspec-specification/docs/database-io-policy-v1.md +146 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +5 -0
- openstatspec-0.8.0/openstatspec-specification/docs/spss-frontend-roadmap.md +158 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +5 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +2 -1
- openstatspec-0.8.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.3.md +164 -0
- openstatspec-0.8.0/openstatspec-specification/docs/superpowers/plans/2026-08-12-roadmap-v030-bookkeeping.md +64 -0
- openstatspec-0.8.0/openstatspec-specification/docs/superpowers/plans/2026-08-21-spss-frontend-03.md +1361 -0
- openstatspec-0.8.0/openstatspec-specification/docs/superpowers/specs/2026-08-21-spss-frontend-expansion-design.md +193 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-profile-0.2.md +2 -1
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +2 -1
- openstatspec-0.8.0/openstatspec-specification/examples/spss-syntax-transformation-0.3.md +41 -0
- openstatspec-0.8.0/openstatspec-specification/pyproject.toml +22 -0
- openstatspec-0.8.0/openstatspec-specification/sql/dialect-profile-baseline.json +1224 -0
- openstatspec-0.8.0/openstatspec-specification/sql/dialect-profiles.md +279 -0
- openstatspec-0.8.0/openstatspec-specification/sql/dolt-adapter-declaration-schema.json +61 -0
- openstatspec-0.8.0/openstatspec-specification/sql/dolt-adapter-declarations/README.md +40 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/profile-capabilities.md +18 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/server-version-policy.md +7 -0
- openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/__init__.py +19 -0
- openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/artifacts.py +923 -0
- openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/dolt.py +1966 -0
- openstatspec-0.8.0/openstatspec-specification/tests/test_contract_artifacts.py +272 -0
- openstatspec-0.8.0/openstatspec-specification/tests/test_dolt_declarations.py +370 -0
- openstatspec-0.8.0/openstatspec-specification/tools/validate_repository.py +178 -0
- openstatspec-0.8.0/openstatspec-specification/transformation/spss-syntax-frontend-0.3.schema.json +57 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/pyproject.toml +1 -1
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/api.py +8 -2
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/sav.py +4 -288
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/capabilities.py +71 -27
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/catalog_api.py +3 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/database_urls.py +17 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/dolt_conformance.py +5 -2
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/inplace_transform.py +3 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/wide.py +20 -300
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/workflow.py +9 -3
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_catalog_lifecycle.py +0 -56
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_catalog_persistence_review.py +0 -90
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_cli.py +6 -3
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_dolt_conformance.py +43 -49
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_loss_reports.py +2 -15
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_normative_catalog.py +1 -17
- openstatspec-0.8.0/tests/test_read_only_export.py +262 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_review_transaction_boundary.py +13 -82
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sql_profiles.py +36 -35
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sql_services.py +143 -13
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_strict_catalog_review.py +4 -3
- openstatspec-0.7.0/openstatspec-specification/.github/workflows/ci.yml +0 -15
- openstatspec-0.7.0/openstatspec-specification/.gitignore +0 -2
- openstatspec-0.7.0/openstatspec-specification/CHANGELOG.md +0 -57
- openstatspec-0.7.0/openstatspec-specification/ROADMAP.md +0 -112
- openstatspec-0.7.0/openstatspec-specification/sql/dialect-profile-baseline.json +0 -233
- openstatspec-0.7.0/openstatspec-specification/sql/dialect-profiles.md +0 -202
- openstatspec-0.7.0/openstatspec-specification/tools/validate_repository.py +0 -934
- {openstatspec-0.7.0 → openstatspec-0.8.0}/.github/verify_release_ref.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/.gitignore +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/THIRD_PARTY_NOTICES.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/architecture.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/in-place-transformation.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/pyspssio-spike.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/sql-transformation-workflow.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/transformations.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/CONTRIBUTING.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/LICENSE.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/README.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/in-place-transformation-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/in-place-transformation-0.2.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/transformation-plan-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/transformation-plan-0.2.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/architecture.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/mssql-dialect-roadmap.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-profile.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-profile-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/basic-spss-mapping.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/spss-syntax-transformation.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/sql-transformation-workflow.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/schema-outline.sql +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/transformation-plan-profile-schema.sql +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/plan-0.1.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/plan-0.2.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/.github/workflows/ci.yml +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/.github/workflows/publish.yml +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/.gitignore +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/CHANGELOG.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/CONTRIBUTING.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/README.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/RELEASING.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/ROADMAP.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/VERSIONING.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/LICENSE.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/README.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/transformation-plan-0.1.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/transformation-plan-0.2.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/architecture.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-profile.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/basic-spss-mapping.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/spss-syntax-transformation.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/sql-transformation-workflow.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/pyproject.toml +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dialect-profile-baseline.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dialect-profiles.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/profile-capabilities.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/schema-outline.sql +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/server-version-policy.md +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/src/openstatspec_specification/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/src/openstatspec_specification/dolt.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/tests/test_dolt_declarations.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/tools/validate_repository.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/plan-0.1.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/plan-0.2.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/cli.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/core/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/core/results.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/sas/.gitkeep +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/binding.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/compiler.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/execution.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/syntax.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/stata/.gitkeep +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/dictionary.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/raw_dictionary.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/catalog_verification.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/normative.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/profiles.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/__init__.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/errors.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/plan.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/schema.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/validation.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/conformance.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_atomic_import.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_attribute_catalog.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_conditional_inplace_transform.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_document_round_trip.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_inplace_transform.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_official_conformance.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_pyspssio_catalog_authority.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_release_ref.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sav_sqlite.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_spss_catalog_preflight.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sql_workflow.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_transform_frontend.py +0 -0
- {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_vls_compatible_names.py +0 -0
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
uses: actions/checkout@v7
|
|
21
21
|
with: &specification-checkout
|
|
22
22
|
repository: OpenStatSpec/specification
|
|
23
|
-
ref:
|
|
23
|
+
ref: 864e84479f554b8ee250ffed44c4dfb963750d4a
|
|
24
24
|
path: openstatspec-specification
|
|
25
25
|
- name: Checkout required SPSS engine
|
|
26
26
|
uses: actions/checkout@v7
|
|
@@ -53,9 +53,9 @@ jobs:
|
|
|
53
53
|
- run: python -m pip install --upgrade pip build
|
|
54
54
|
- run: python -m build
|
|
55
55
|
- run: python -m venv /tmp/openstatspec-wheel-smoke
|
|
56
|
-
- run: /tmp/openstatspec-wheel-smoke/bin/python -m pip install ./openstatspec-pyspssio
|
|
57
56
|
- 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
|
|
59
59
|
|
|
60
60
|
postgres-integration:
|
|
61
61
|
name: PostgreSQL ${{ matrix.postgres }} integration
|
|
@@ -143,7 +143,7 @@ jobs:
|
|
|
143
143
|
steps: *sql-test-steps
|
|
144
144
|
|
|
145
145
|
dolt-integration:
|
|
146
|
-
name: Dolt ${{ matrix.dolt }}
|
|
146
|
+
name: Dolt ${{ matrix.dolt }} default-write integration
|
|
147
147
|
runs-on: ubuntu-latest
|
|
148
148
|
strategy:
|
|
149
149
|
fail-fast: false
|
|
@@ -155,6 +155,7 @@ jobs:
|
|
|
155
155
|
image: dolthub/dolt:2.2.3@sha256:1a651e738a2e7275b9c69fec8c5f42c6e23954314405c412f4dc9287ee7c0080
|
|
156
156
|
env:
|
|
157
157
|
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/
|
|
158
159
|
OPENSTATSPEC_EXPECTED_DOLT_VERSION: ${{ matrix.dolt }}
|
|
159
160
|
OPENSTATSPEC_DOLT_IMAGE: ${{ matrix.image }}
|
|
160
161
|
steps:
|
|
@@ -186,6 +187,11 @@ jobs:
|
|
|
186
187
|
--workdir /var/lib/dolt \
|
|
187
188
|
"$OPENSTATSPEC_DOLT_IMAGE" sql \
|
|
188
189
|
-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"
|
|
189
195
|
docker run --detach --name openstatspec-dolt \
|
|
190
196
|
--publish 127.0.0.1:13308:3306 \
|
|
191
197
|
--volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
|
|
@@ -218,6 +224,7 @@ jobs:
|
|
|
218
224
|
break
|
|
219
225
|
PY
|
|
220
226
|
- run: python -m pytest -m "services and not candidate_evidence"
|
|
227
|
+
- run: python -m pytest tests/test_read_only_export.py
|
|
221
228
|
- name: Show Dolt logs on failure and stop server
|
|
222
229
|
if: always()
|
|
223
230
|
run: |
|
|
@@ -48,7 +48,7 @@ jobs:
|
|
|
48
48
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
49
49
|
with:
|
|
50
50
|
repository: OpenStatSpec/specification
|
|
51
|
-
ref:
|
|
51
|
+
ref: 864e84479f554b8ee250ffed44c4dfb963750d4a
|
|
52
52
|
path: openstatspec-specification
|
|
53
53
|
- name: Checkout specification package source
|
|
54
54
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
@@ -159,9 +159,9 @@ jobs:
|
|
|
159
159
|
- run: python -m pip install -e ".[dev]"
|
|
160
160
|
- run: python -m pytest -m "not services"
|
|
161
161
|
- run: python -m venv /tmp/openstatspec-release-smoke
|
|
162
|
-
- run: /tmp/openstatspec-release-smoke/bin/python -m pip install ./openstatspec-pyspssio
|
|
163
162
|
- 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
|
|
165
165
|
- name: Smoke-test specification wheel
|
|
166
166
|
run: |
|
|
167
167
|
python -m venv /tmp/openstatspec-specification-release-smoke
|
|
@@ -6,6 +6,38 @@ All notable changes to this reference implementation are documented here.
|
|
|
6
6
|
|
|
7
7
|
_No unreleased changes._
|
|
8
8
|
|
|
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
|
+
|
|
33
|
+
## 0.7.1 - 2026-08-12
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Pinned capability declarations, conformance fixtures, and release validation
|
|
38
|
+
to the published OpenStatSpec specification `v0.3.0` at exact commit
|
|
39
|
+
`cd8f198c68b849eb8ed018a894670a0904c2181d`.
|
|
40
|
+
|
|
9
41
|
## 0.7.0 - 2026-08-11
|
|
10
42
|
|
|
11
43
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: openstatspec
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Reference adapter for the OpenStatSpec relational contract
|
|
5
5
|
Author: OpenStatSpec
|
|
6
6
|
License: Apache-2.0
|
|
@@ -23,6 +23,10 @@ The reference Python implementation of the OpenStatSpec specification.
|
|
|
23
23
|
|
|
24
24
|
This package implements the specification; it does not define or extend it.
|
|
25
25
|
The normative model lives in the `OpenStatSpec/specification` repository.
|
|
26
|
+
Python 0.8.0 pins released specification `v0.5.0` at
|
|
27
|
+
`864e84479f554b8ee250ffed44c4dfb963750d4a` and selects SAV/ZSAV 1.0 with
|
|
28
|
+
`database_io_policy=openstatspec-database-io-v1`. This does not claim
|
|
29
|
+
implementation of the optional Transformation Workflow 0.3 profile.
|
|
26
30
|
|
|
27
31
|
## Boundaries
|
|
28
32
|
|
|
@@ -115,17 +119,19 @@ SAV/ZSAV export for the semantics exposed by that engine. SQLite is the local
|
|
|
115
119
|
reference path.
|
|
116
120
|
PostgreSQL, MySQL, MariaDB, and Dolt are each covered by separate service-backed CI
|
|
117
121
|
conformance checks. Dolt support is an independent core profile for the
|
|
118
|
-
|
|
119
|
-
noncanonical versions, and unknown MySQL-wire products fail closed.
|
|
122
|
+
exact write-supported versions 2.2.2 and 2.2.3; all other versions (including
|
|
123
|
+
2.3.0), noncanonical versions, and unknown MySQL-wire products fail closed for writes.
|
|
120
124
|
|
|
121
125
|
The supported family claims are broader than the deliberately exact CI
|
|
122
126
|
evidence points: PostgreSQL 17.x/18.x is exercised at 17.10/18.4, MySQL
|
|
123
127
|
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
|
|
124
128
|
11.4.12/11.8.8/12.3.2. Each service job checks the normalized live server
|
|
125
129
|
version against its exact matrix entry before that run can count as evidence.
|
|
126
|
-
Dolt
|
|
127
|
-
|
|
128
|
-
|
|
130
|
+
Dolt's default-write service checks run independently at exact versions 2.2.2
|
|
131
|
+
and 2.2.3 using immutable container-image digests. Release/CI owns this evidence;
|
|
132
|
+
normal callers need no declaration or evidence files. The optional explicit
|
|
133
|
+
`DoltConformanceSource` override remains strict and does not fall back to the
|
|
134
|
+
default policy if its declarations are missing, invalid, or mismatched.
|
|
129
135
|
|
|
130
136
|
| Engine/profile | Runtime supported policy | Exact CI-tested versions |
|
|
131
137
|
| --- | --- | --- |
|
|
@@ -133,7 +139,7 @@ immutable container-image digests.
|
|
|
133
139
|
| PostgreSQL | 17.x and 18.x | 17.10 and 18.4 |
|
|
134
140
|
| MySQL | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
|
|
135
141
|
| MariaDB | 11.4.x, 11.8.x, and 12.3.x | 11.4.12, 11.8.8, and 12.3.2 |
|
|
136
|
-
| Dolt | 2.2.
|
|
142
|
+
| Dolt writes | Exactly 2.2.2 and 2.2.3 | 2.2.2 and 2.2.3 |
|
|
137
143
|
|
|
138
144
|
Microsoft SQL Server (MSSQL) remains roadmap-only and is not a supported
|
|
139
145
|
runtime profile; see the specification's [MSSQL roadmap](https://github.com/OpenStatSpec/specification/blob/main/docs/mssql-dialect-roadmap.md).
|
|
@@ -143,7 +149,7 @@ Use these explicit SQLAlchemy URLs:
|
|
|
143
149
|
- SQLite: `sqlite:///dataset.sqlite`
|
|
144
150
|
- PostgreSQL: `postgresql+psycopg://user:password@host/database`
|
|
145
151
|
- MySQL/MariaDB: `mysql+pymysql://user:password@host/database`
|
|
146
|
-
- Dolt
|
|
152
|
+
- Dolt 2.2.2 or 2.2.3: `mysql+pymysql://user:password@host/database` (detected by server identity)
|
|
147
153
|
|
|
148
154
|
The Dolt core profile supports strict wide-table import, validation, and export;
|
|
149
155
|
the separate Transformation Workflow is unsupported.
|
|
@@ -151,8 +157,16 @@ the separate Transformation Workflow is unsupported.
|
|
|
151
157
|
Run `openstatspec capabilities` before an integration to inspect the
|
|
152
158
|
machine-readable feature matrix. Export is deliberately strict: if known
|
|
153
159
|
dictionary semantics cannot be reproduced, it stops until you pass the exact
|
|
154
|
-
diagnostic code with `--allow-loss`.
|
|
155
|
-
|
|
160
|
+
diagnostic code with `--allow-loss`. Diagnostics are returned to the caller, not
|
|
161
|
+
persisted. Reads, validation, and SAV/ZSAV export never write to the database,
|
|
162
|
+
including on failure. Export returns no `operation_id` and needs only read
|
|
163
|
+
permissions; Dolt reads have no write-version or write-variable-count gate.
|
|
164
|
+
Read operations reject missing SQLite files without creating them. Imports and transformations
|
|
165
|
+
use the packaged exact-version policy by default. Active driver/identity checks,
|
|
166
|
+
limit preflight, and the clean expected branch/HEAD guard for in-place apply
|
|
167
|
+
remain mandatory. Dolt's reported limits are adapter safety budgets, narrowed
|
|
168
|
+
by the active packet limit, not proven native server ceilings; full boundary
|
|
169
|
+
conformance is not claimed.
|
|
156
170
|
|
|
157
171
|
The matrix is also available to Python callers as
|
|
158
172
|
`openstatspec.capability_matrix()`. It distinguishes supported semantics from
|
|
@@ -4,6 +4,10 @@ The reference Python implementation of the OpenStatSpec specification.
|
|
|
4
4
|
|
|
5
5
|
This package implements the specification; it does not define or extend it.
|
|
6
6
|
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.
|
|
7
11
|
|
|
8
12
|
## Boundaries
|
|
9
13
|
|
|
@@ -96,17 +100,19 @@ SAV/ZSAV export for the semantics exposed by that engine. SQLite is the local
|
|
|
96
100
|
reference path.
|
|
97
101
|
PostgreSQL, MySQL, MariaDB, and Dolt are each covered by separate service-backed CI
|
|
98
102
|
conformance checks. Dolt support is an independent core profile for the
|
|
99
|
-
|
|
100
|
-
noncanonical versions, and unknown MySQL-wire products fail closed.
|
|
103
|
+
exact write-supported versions 2.2.2 and 2.2.3; all other versions (including
|
|
104
|
+
2.3.0), noncanonical versions, and unknown MySQL-wire products fail closed for writes.
|
|
101
105
|
|
|
102
106
|
The supported family claims are broader than the deliberately exact CI
|
|
103
107
|
evidence points: PostgreSQL 17.x/18.x is exercised at 17.10/18.4, MySQL
|
|
104
108
|
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
|
|
105
109
|
11.4.12/11.8.8/12.3.2. Each service job checks the normalized live server
|
|
106
110
|
version against its exact matrix entry before that run can count as evidence.
|
|
107
|
-
Dolt
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
Dolt's default-write service checks run independently at exact versions 2.2.2
|
|
112
|
+
and 2.2.3 using immutable container-image digests. Release/CI owns this evidence;
|
|
113
|
+
normal callers need no declaration or evidence files. The optional explicit
|
|
114
|
+
`DoltConformanceSource` override remains strict and does not fall back to the
|
|
115
|
+
default policy if its declarations are missing, invalid, or mismatched.
|
|
110
116
|
|
|
111
117
|
| Engine/profile | Runtime supported policy | Exact CI-tested versions |
|
|
112
118
|
| --- | --- | --- |
|
|
@@ -114,7 +120,7 @@ immutable container-image digests.
|
|
|
114
120
|
| PostgreSQL | 17.x and 18.x | 17.10 and 18.4 |
|
|
115
121
|
| MySQL | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
|
|
116
122
|
| MariaDB | 11.4.x, 11.8.x, and 12.3.x | 11.4.12, 11.8.8, and 12.3.2 |
|
|
117
|
-
| Dolt | 2.2.
|
|
123
|
+
| Dolt writes | Exactly 2.2.2 and 2.2.3 | 2.2.2 and 2.2.3 |
|
|
118
124
|
|
|
119
125
|
Microsoft SQL Server (MSSQL) remains roadmap-only and is not a supported
|
|
120
126
|
runtime profile; see the specification's [MSSQL roadmap](https://github.com/OpenStatSpec/specification/blob/main/docs/mssql-dialect-roadmap.md).
|
|
@@ -124,7 +130,7 @@ Use these explicit SQLAlchemy URLs:
|
|
|
124
130
|
- SQLite: `sqlite:///dataset.sqlite`
|
|
125
131
|
- PostgreSQL: `postgresql+psycopg://user:password@host/database`
|
|
126
132
|
- MySQL/MariaDB: `mysql+pymysql://user:password@host/database`
|
|
127
|
-
- Dolt
|
|
133
|
+
- Dolt 2.2.2 or 2.2.3: `mysql+pymysql://user:password@host/database` (detected by server identity)
|
|
128
134
|
|
|
129
135
|
The Dolt core profile supports strict wide-table import, validation, and export;
|
|
130
136
|
the separate Transformation Workflow is unsupported.
|
|
@@ -132,8 +138,16 @@ the separate Transformation Workflow is unsupported.
|
|
|
132
138
|
Run `openstatspec capabilities` before an integration to inspect the
|
|
133
139
|
machine-readable feature matrix. Export is deliberately strict: if known
|
|
134
140
|
dictionary semantics cannot be reproduced, it stops until you pass the exact
|
|
135
|
-
diagnostic code with `--allow-loss`.
|
|
136
|
-
|
|
141
|
+
diagnostic code with `--allow-loss`. Diagnostics are returned to the caller, not
|
|
142
|
+
persisted. Reads, validation, and SAV/ZSAV export never write to the database,
|
|
143
|
+
including on failure. Export returns no `operation_id` and needs only read
|
|
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
|
|
146
|
+
use the packaged exact-version policy by default. Active driver/identity checks,
|
|
147
|
+
limit preflight, and the clean expected branch/HEAD guard for in-place apply
|
|
148
|
+
remain mandatory. Dolt's reported limits are adapter safety budgets, narrowed
|
|
149
|
+
by the active packet limit, not proven native server ceilings; full boundary
|
|
150
|
+
conformance is not claimed.
|
|
137
151
|
|
|
138
152
|
The matrix is also available to Python callers as
|
|
139
153
|
`openstatspec.capability_matrix()`. It distinguishes supported semantics from
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
# 0.
|
|
1
|
+
# 0.8.0 release readiness
|
|
2
2
|
|
|
3
3
|
This page records the expected release contract, not a publication event.
|
|
4
4
|
Creating a version tag remains a separate maintainer action.
|
|
5
5
|
|
|
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
|
+
|
|
6
13
|
## Supported workflow
|
|
7
14
|
|
|
8
15
|
For a supported unencrypted SAV or ZSAV source, the adapter imports one source
|
|
@@ -20,15 +27,17 @@ database contract.
|
|
|
20
27
|
| PostgreSQL | `postgresql+psycopg://…` | 17.x and 18.x | 17.10 and 18.4 |
|
|
21
28
|
| MySQL | `mysql+pymysql://…` | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
|
|
22
29
|
| 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://…` | 2.2.
|
|
30
|
+
| Dolt writes | `mysql+pymysql://…` | Exactly 2.2.2 and 2.2.3 | 2.2.2 and 2.2.3 |
|
|
24
31
|
|
|
25
32
|
Separate service matrices test the shared MySQL/MariaDB profile contract while
|
|
26
33
|
retaining distinct active-server identities and version claims. Dolt is an
|
|
27
|
-
independent core profile
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
independent core profile with a packaged exact-version write policy; normal
|
|
35
|
+
callers supply no conformance files. An explicit external declaration source
|
|
36
|
+
remains a strict override. Read-only validation/export has no write-version gate.
|
|
37
|
+
The optional Transformation Workflow remains SQLite-only. This does not claim
|
|
38
|
+
coverage for every server configuration or proven Dolt native limit ceilings.
|
|
39
|
+
Dolt capabilities report adapter safety budgets and active packet constraints;
|
|
40
|
+
full boundary conformance remains pending.
|
|
32
41
|
Every server service job compares the normalized live product version with its
|
|
33
42
|
exact matrix entry, so a moved or mismatched image cannot substantiate the CI
|
|
34
43
|
declaration. SQLite's optional Transformation Workflow retains its narrower
|
|
@@ -102,6 +111,51 @@ implemented openstatspec.frontends.spss package. Stata and SAS remain empty
|
|
|
102
111
|
source-tree placeholders and must expose no compiler, apply API, CLI choice,
|
|
103
112
|
capability claim, or implied support.
|
|
104
113
|
|
|
114
|
+
## Prior default Dolt write verification (before the 0.8.0 pin)
|
|
115
|
+
|
|
116
|
+
Local release verification used the exact 2.2.2 and 2.2.3 image digests in
|
|
117
|
+
`.github/workflows/ci.yml`, isolated ports 13482/13483, and disposable `/tmp`
|
|
118
|
+
database directories. With `PYTHONPATH=src:../pyspssio`,
|
|
119
|
+
`OPENSTATSPEC_SPECIFICATION_DIR=/tmp/oss-php-spec-cd8f198`, and each matching
|
|
120
|
+
`OPENSTATSPEC_DOLT_URL` / `OPENSTATSPEC_EXPECTED_DOLT_VERSION`:
|
|
121
|
+
|
|
122
|
+
- `../python/.venv/bin/python -m pytest`: **366 passed, 49 skipped per pin**.
|
|
123
|
+
- CI selection `-m 'services and not candidate_evidence'`: **7 passed,
|
|
124
|
+
41 skipped per pin**; other database services were not configured locally.
|
|
125
|
+
- Dolt 2.3.0 on port 13387: read-only export and unknown-version write rejection
|
|
126
|
+
checks passed (**19 passed**) using disposable fixture databases/users.
|
|
127
|
+
- `python -m compileall -q src tests` and `git diff --check` passed.
|
|
128
|
+
|
|
129
|
+
Live failures exposed and now cover two previously dormant write blockers:
|
|
130
|
+
owned table additions being misclassified as unrelated diffs, and Dolt retaining
|
|
131
|
+
`@@autocommit=1` despite the driver's setting. Writes now explicitly begin their
|
|
132
|
+
transaction. The candidate storage/identifier/column smoke probe also passed on
|
|
133
|
+
both pins; it does **not** establish full value/row/statement limit conformance.
|
|
134
|
+
|
|
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
|
+
|
|
105
159
|
## Maintainer checks before tagging
|
|
106
160
|
|
|
107
161
|
1. Publish the pinned `openstatspec-pyspssio==0.5.1.post2` engine distribution
|
|
@@ -110,16 +164,28 @@ capability claim, or implied support.
|
|
|
110
164
|
2. Run `python -m pytest -m "not services"`.
|
|
111
165
|
3. Confirm the GitHub Actions matrix is green for exact PostgreSQL 17.10/18.4,
|
|
112
166
|
MySQL 8.4.11/9.7.2, MariaDB 11.4.12/11.8.8/12.3.2, and exact Dolt
|
|
113
|
-
2.2.2/2.2.3 service evidence from the immutable image pins in CI.
|
|
167
|
+
2.2.2/2.2.3 service evidence from the immutable image pins in CI. The Dolt
|
|
168
|
+
jobs must perform default import/validate/SAV+ZSAV export, in-place recode
|
|
169
|
+
and labels with unchanged dataset/table counts and HEAD, injected data,
|
|
170
|
+
catalog, and audit rollback checks, and failed-import cleanup. Release/CI
|
|
171
|
+
owns this evidence, not per-user runtime declaration files. Candidate limit
|
|
172
|
+
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.
|
|
114
179
|
4. Build with `python -m build` and install the generated wheel in a clean
|
|
115
|
-
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.
|
|
116
183
|
5. Confirm `openstatspec capabilities` reflects the intended support boundary.
|
|
117
|
-
6. Confirm CI, release fixtures, and capabilities use the
|
|
118
|
-
specification
|
|
119
|
-
`
|
|
120
|
-
`specification_status=
|
|
121
|
-
|
|
122
|
-
before this package is tagged, update the identity and re-run every gate.
|
|
184
|
+
6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
|
|
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.
|
|
123
189
|
7. Review this document, the README, and CHANGELOG for accurate scope.
|
|
124
190
|
|
|
125
191
|
The tag-triggered release workflow repeats the non-service test suite, builds
|
|
@@ -49,7 +49,7 @@ equivalence of supported values, order, and dictionary metadata.
|
|
|
49
49
|
|
|
50
50
|
The `openstatspec capabilities` command and the
|
|
51
51
|
`openstatspec.capability_matrix()` function are the machine-readable declaration
|
|
52
|
-
of this boundary. It records the pinned source commit and installed engine version, and the adapter stores the same identity in
|
|
52
|
+
of this boundary. It records the pinned source commit and installed engine version, and the adapter stores the same identity in import operation records. Export is database-read-only: no operation, fidelity, recovery, or Dolt-history records are written, even on failure. Loss diagnostics are returned to the caller. Dolt export identifies the server and validates the catalog and data without requiring write-conformance declarations; write entry points retain that requirement. The matrix deliberately distinguishes a supported feature from a feature that the underlying engine cannot observe or write faithfully.
|
|
53
53
|
|
|
54
54
|
| SPSS semantic | Pinned pyspssio status | Behaviour |
|
|
55
55
|
| --- | --- | --- |
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Python 0.7.1 Stable Specification Pin Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
+
|
|
5
|
+
**Goal:** Release Python adapter `0.7.1` with stable, exact provenance for specification `v0.3.0`.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Keep the provenance values centralized in `src/openstatspec/sql/capabilities.py`; tests and capability declarations consume those values. CI and release-readiness documentation pin the same immutable specification commit, while the package version changes only in packaging metadata.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Python 3.11–3.14, pytest, GitHub Actions, `python -m build`, Twine, PyPI Trusted Publishing.
|
|
10
|
+
|
|
11
|
+
## Global Constraints
|
|
12
|
+
|
|
13
|
+
- Specification commit: `cd8f198c68b849eb8ed018a894670a0904c2181d`.
|
|
14
|
+
- Specification status: `stable`.
|
|
15
|
+
- Specification release: `v0.3.0`.
|
|
16
|
+
- Package version: `0.7.1`.
|
|
17
|
+
- Keep the SPSS engine pin, companion package pin, SQL profile matrix, and runtime behavior unchanged.
|
|
18
|
+
- Do not publish or change the normative specification package in this task.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
### Task 1: Update provenance contract tests first
|
|
23
|
+
|
|
24
|
+
**Files:**
|
|
25
|
+
- Modify: `tests/test_cli.py:44-48`
|
|
26
|
+
- Modify: `tests/test_sql_profiles.py:32-40`
|
|
27
|
+
|
|
28
|
+
**Interfaces:**
|
|
29
|
+
- Consumes: public `openstatspec.capability_matrix()` and SQL profile declarations.
|
|
30
|
+
- Produces: executable expectations for stable `v0.3.0` provenance.
|
|
31
|
+
|
|
32
|
+
- [ ] **Step 1: Change the assertions to the stable identity**
|
|
33
|
+
|
|
34
|
+
Replace the candidate expectations with:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
assert matrix["specification_status"] == "stable"
|
|
38
|
+
assert matrix["specification_release"] == "v0.3.0"
|
|
39
|
+
assert matrix["specification_commit"] == "cd8f198c68b849eb8ed018a894670a0904c2181d"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Apply the same three values to each profile declaration assertion.
|
|
43
|
+
|
|
44
|
+
- [ ] **Step 2: Run the focused tests and confirm the expected red state**
|
|
45
|
+
|
|
46
|
+
Run:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
python -m pytest -q tests/test_cli.py::test_capability_matrix_is_public_and_cli_matches_engine_boundary tests/test_sql_profiles.py::test_profile_declarations_publish_stable_specification_provenance
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Expected: both tests fail because production constants still expose the old release-candidate identity.
|
|
53
|
+
|
|
54
|
+
- [ ] **Step 3: Commit the failing-test update**
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
git add tests/test_cli.py tests/test_sql_profiles.py
|
|
58
|
+
git commit -m "test: expect stable specification v0.3.0"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Task 2: Bind production provenance and release metadata
|
|
62
|
+
|
|
63
|
+
**Files:**
|
|
64
|
+
- Modify: `src/openstatspec/sql/capabilities.py:20-23`
|
|
65
|
+
- Modify: `pyproject.toml:7`
|
|
66
|
+
- Modify: `.github/workflows/ci.yml:23`
|
|
67
|
+
- Modify: `.github/workflows/release.yml:51`
|
|
68
|
+
- Modify: `docs/release-readiness.md:1,116-123`
|
|
69
|
+
- Modify: `CHANGELOG.md` after the `Unreleased` section
|
|
70
|
+
|
|
71
|
+
**Interfaces:**
|
|
72
|
+
- Consumes: the exact specification commit from the published `v0.3.0` tag.
|
|
73
|
+
- Produces: capability output and release automation identifying `stable`, `v0.3.0`, and `cd8f198c...`.
|
|
74
|
+
|
|
75
|
+
- [ ] **Step 1: Update the centralized capability constants**
|
|
76
|
+
|
|
77
|
+
Set the declarations to:
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
SPECIFICATION_COMMIT = "cd8f198c68b849eb8ed018a894670a0904c2181d"
|
|
81
|
+
SPECIFICATION_STATUS = "stable"
|
|
82
|
+
SPECIFICATION_RELEASE: str | None = "v0.3.0"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- [ ] **Step 2: Bump the package and CI fixture pin**
|
|
86
|
+
|
|
87
|
+
Set `project.version` in `pyproject.toml` to `0.7.1`. Replace the old specification checkout ref in both workflows with the exact commit `cd8f198c68b849eb8ed018a894670a0904c2181d`; leave the companion package ref unchanged.
|
|
88
|
+
|
|
89
|
+
- [ ] **Step 3: Update release documentation and changelog**
|
|
90
|
+
|
|
91
|
+
Rename the readiness heading to `0.7.1 release readiness`, change its specification checklist to the stable commit/release identity, and add a dated `0.7.1` entry explaining that the adapter now pins published specification `v0.3.0`.
|
|
92
|
+
|
|
93
|
+
- [ ] **Step 4: Run focused tests and confirm green**
|
|
94
|
+
|
|
95
|
+
Run the focused command from Task 1. Expected: both tests pass.
|
|
96
|
+
|
|
97
|
+
- [ ] **Step 5: Commit the implementation and metadata**
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
git add src/openstatspec/sql/capabilities.py pyproject.toml .github/workflows/ci.yml .github/workflows/release.yml docs/release-readiness.md CHANGELOG.md
|
|
101
|
+
git commit -m "release: pin Python adapter to specification v0.3.0"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Task 3: Verify the complete Python release candidate
|
|
105
|
+
|
|
106
|
+
**Files:**
|
|
107
|
+
- Verify: all tracked files in the Python repository.
|
|
108
|
+
|
|
109
|
+
- [ ] **Step 1: Check the diff and stale current references**
|
|
110
|
+
|
|
111
|
+
Run:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
git diff --check
|
|
115
|
+
rg -n 'f2fdf687d8cb32b944ca55a3e9e7215ffc603019|specification_status.*release_candidate|specification_release.*None|version = "0\.7\.0"' src tests .github docs pyproject.toml
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Expected: no stale current references; historical changelog entries may retain their original release evidence.
|
|
119
|
+
|
|
120
|
+
- [ ] **Step 2: Run the non-service test suite**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
python -m pytest -m "not services"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Expected: zero failures.
|
|
127
|
+
|
|
128
|
+
- [ ] **Step 3: Build and smoke-test the package**
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
rm -rf /tmp/openstatspec-v071-dist /tmp/openstatspec-v071-smoke
|
|
132
|
+
python -m build --outdir /tmp/openstatspec-v071-dist
|
|
133
|
+
python -m twine check /tmp/openstatspec-v071-dist/*
|
|
134
|
+
python -m venv /tmp/openstatspec-v071-smoke
|
|
135
|
+
/tmp/openstatspec-v071-smoke/bin/python -m pip install ./openstatspec-pyspssio
|
|
136
|
+
/tmp/openstatspec-v071-smoke/bin/python -m pip install /tmp/openstatspec-v071-dist/openstatspec-0.7.1-*.whl
|
|
137
|
+
/tmp/openstatspec-v071-smoke/bin/openstatspec capabilities
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Expected: build and Twine checks pass, and capabilities reports `stable`, `v0.3.0`, and the exact commit.
|
|
141
|
+
|
|
142
|
+
### Task 4: Review, publish, and release
|
|
143
|
+
|
|
144
|
+
- [ ] **Step 1: Run the local review loop and fix every actionable finding**
|
|
145
|
+
|
|
146
|
+
Review the complete branch diff against `origin/main`; repeat the tests after each fix until no actionable findings remain.
|
|
147
|
+
|
|
148
|
+
- [ ] **Step 2: Push the branch and open a draft PR**
|
|
149
|
+
|
|
150
|
+
Push `agent/stable-spec-v071` to `OpenStatSpec/python`, open a PR targeting `main`, mark it ready for review, and add `@codex review`.
|
|
151
|
+
|
|
152
|
+
- [ ] **Step 3: Iterate on GitHub review and CI**
|
|
153
|
+
|
|
154
|
+
Inspect every Codex review finding and failing check, fix actionable issues locally, push, and repeat until the review and required checks are clean.
|
|
155
|
+
|
|
156
|
+
- [ ] **Step 4: After merge, create and push annotated tag `v0.7.1`**
|
|
157
|
+
|
|
158
|
+
Verify the tag targets the merge commit and wait for tag-context CI to pass before relying on the existing PyPI workflow.
|
openstatspec-0.8.0/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Python 0.7.1 stable specification pin
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Publish the Python adapter's first patch release after Python adapter `v0.7.0`
|
|
6
|
+
with its capability declarations and conformance fixtures bound to the
|
|
7
|
+
published OpenStatSpec specification `v0.3.0`.
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
- Bump the Python distribution from `0.7.0` to `0.7.1`.
|
|
12
|
+
- Replace the release-candidate specification identity with:
|
|
13
|
+
- commit `cd8f198c68b849eb8ed018a894670a0904c2181d`;
|
|
14
|
+
- status `stable`;
|
|
15
|
+
- release `v0.3.0`.
|
|
16
|
+
- Update unit expectations, CI fixture checkouts, release-readiness guidance,
|
|
17
|
+
and the changelog so every release surface carries the same identity.
|
|
18
|
+
- Keep the required SPSS engine pin, specification companion package pin,
|
|
19
|
+
database version matrix, and runtime behavior unchanged.
|
|
20
|
+
- Separately update the specification repository roadmap to mark the completed
|
|
21
|
+
`v0.3.0` release gates and current public release.
|
|
22
|
+
|
|
23
|
+
## Release and verification
|
|
24
|
+
|
|
25
|
+
The Python change is reviewed through a pull request. Before tagging `v0.7.1`,
|
|
26
|
+
run the non-service suite, package build and wheel smoke test, and the full
|
|
27
|
+
GitHub CI matrix. The annotated `v0.7.1` tag must target the merged release
|
|
28
|
+
commit; its tag-context workflow must pass before the existing trusted-PyPI
|
|
29
|
+
workflow publishes the package artifacts.
|
|
30
|
+
|
|
31
|
+
## Non-goals
|
|
32
|
+
|
|
33
|
+
This work does not add transformation behavior, change SQL dialect support,
|
|
34
|
+
modify the normative specification, or publish a new specification package
|
|
35
|
+
version.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
specification:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
# v7.0.1: https://github.com/actions/checkout/commit/3d3c42e5aac5ba805825da76410c181273ba90b1
|
|
15
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
|
|
16
|
+
with:
|
|
17
|
+
persist-credentials: false
|
|
18
|
+
# v7.0.0: https://github.com/actions/setup-python/commit/5fda3b95a4ea91299a34e894583c3862153e4b97
|
|
19
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.13"
|
|
22
|
+
- run: python -m pip install --disable-pip-version-check -e ".[dev]"
|
|
23
|
+
- run: python -m pytest
|
|
24
|
+
- run: python tools/validate_repository.py
|