openstatspec 0.6.0__tar.gz → 0.7.1__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.6.0 → openstatspec-0.7.1}/.github/workflows/ci.yml +1 -1
- openstatspec-0.7.1/.github/workflows/release.yml +204 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/CHANGELOG.md +18 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/PKG-INFO +3 -2
- {openstatspec-0.6.0 → openstatspec-0.7.1}/README.md +1 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/release-readiness.md +7 -7
- openstatspec-0.7.1/docs/superpowers/plans/2026-08-12-python-v071-stable-pin.md +158 -0
- openstatspec-0.7.1/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md +35 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/transformations.md +4 -3
- openstatspec-0.7.1/openstatspec-specification/.github/workflows/ci.yml +22 -0
- openstatspec-0.7.1/openstatspec-specification/.github/workflows/release.yml +108 -0
- openstatspec-0.7.1/openstatspec-specification/.gitignore +5 -0
- openstatspec-0.7.1/openstatspec-specification/CHANGELOG.md +78 -0
- openstatspec-0.7.1/openstatspec-specification/CONTRIBUTING.md +28 -0
- openstatspec-0.7.1/openstatspec-specification/README.md +107 -0
- openstatspec-0.7.1/openstatspec-specification/RELEASING.md +60 -0
- openstatspec-0.7.1/openstatspec-specification/ROADMAP.md +134 -0
- openstatspec-0.7.1/openstatspec-specification/VERSIONING.md +35 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/LICENSE.md +10 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/README.md +23 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +226 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/in-place-transformation-0.1.json +147 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/in-place-transformation-0.2.json +481 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +107 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +255 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +1106 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +1747 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/transformation-plan-0.1.json +140 -0
- openstatspec-0.7.1/openstatspec-specification/conformance/transformation-plan-0.2.json +1104 -0
- openstatspec-0.7.1/openstatspec-specification/docs/architecture.md +61 -0
- openstatspec-0.7.1/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
- openstatspec-0.7.1/openstatspec-specification/docs/mssql-dialect-roadmap.md +85 -0
- openstatspec-0.7.1/openstatspec-specification/docs/spss-profile.md +45 -0
- openstatspec-0.7.1/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +82 -0
- openstatspec-0.7.1/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +76 -0
- openstatspec-0.7.1/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +132 -0
- openstatspec-0.7.1/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +314 -0
- openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-profile-0.1.md +108 -0
- openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-profile-0.2.md +127 -0
- openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +88 -0
- openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +100 -0
- openstatspec-0.7.1/openstatspec-specification/examples/basic-spss-mapping.md +19 -0
- openstatspec-0.7.1/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +30 -0
- openstatspec-0.7.1/openstatspec-specification/examples/spss-syntax-transformation.md +31 -0
- openstatspec-0.7.1/openstatspec-specification/examples/sql-transformation-workflow.md +87 -0
- openstatspec-0.7.1/openstatspec-specification/pyproject.toml +21 -0
- openstatspec-0.7.1/openstatspec-specification/sql/dialect-profile-baseline.json +1224 -0
- openstatspec-0.7.1/openstatspec-specification/sql/dialect-profiles.md +273 -0
- openstatspec-0.7.1/openstatspec-specification/sql/dolt-adapter-declaration-schema.json +61 -0
- openstatspec-0.7.1/openstatspec-specification/sql/dolt-adapter-declarations/README.md +33 -0
- openstatspec-0.7.1/openstatspec-specification/sql/profile-capabilities.md +55 -0
- openstatspec-0.7.1/openstatspec-specification/sql/schema-outline.sql +193 -0
- openstatspec-0.7.1/openstatspec-specification/sql/server-version-policy.md +72 -0
- openstatspec-0.7.1/openstatspec-specification/sql/transformation-plan-profile-schema.sql +45 -0
- openstatspec-0.7.1/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +209 -0
- openstatspec-0.7.1/openstatspec-specification/src/openstatspec_specification/__init__.py +19 -0
- openstatspec-0.7.1/openstatspec-specification/src/openstatspec_specification/dolt.py +1966 -0
- openstatspec-0.7.1/openstatspec-specification/tests/test_dolt_declarations.py +370 -0
- openstatspec-0.7.1/openstatspec-specification/tools/validate_repository.py +145 -0
- openstatspec-0.7.1/openstatspec-specification/transformation/plan-0.1.schema.json +170 -0
- openstatspec-0.7.1/openstatspec-specification/transformation/plan-0.2.schema.json +139 -0
- openstatspec-0.7.1/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
- openstatspec-0.7.1/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
- openstatspec-0.7.1/openstatspec-specification-package/.github/workflows/ci.yml +22 -0
- openstatspec-0.7.1/openstatspec-specification-package/.github/workflows/publish.yml +108 -0
- openstatspec-0.7.1/openstatspec-specification-package/.gitignore +5 -0
- openstatspec-0.7.1/openstatspec-specification-package/CHANGELOG.md +72 -0
- openstatspec-0.7.1/openstatspec-specification-package/CONTRIBUTING.md +28 -0
- openstatspec-0.7.1/openstatspec-specification-package/README.md +107 -0
- openstatspec-0.7.1/openstatspec-specification-package/RELEASING.md +60 -0
- openstatspec-0.7.1/openstatspec-specification-package/ROADMAP.md +134 -0
- openstatspec-0.7.1/openstatspec-specification-package/VERSIONING.md +35 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/LICENSE.md +10 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/README.md +23 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +226 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +147 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +481 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +107 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +255 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +1106 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +1747 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/transformation-plan-0.1.json +140 -0
- openstatspec-0.7.1/openstatspec-specification-package/conformance/transformation-plan-0.2.json +1104 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/architecture.md +61 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +85 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/spss-profile.md +45 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +82 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +76 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +132 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +314 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +108 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +127 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +88 -0
- openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +100 -0
- openstatspec-0.7.1/openstatspec-specification-package/examples/basic-spss-mapping.md +19 -0
- openstatspec-0.7.1/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +30 -0
- openstatspec-0.7.1/openstatspec-specification-package/examples/spss-syntax-transformation.md +31 -0
- openstatspec-0.7.1/openstatspec-specification-package/examples/sql-transformation-workflow.md +87 -0
- openstatspec-0.7.1/openstatspec-specification-package/pyproject.toml +21 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/dialect-profile-baseline.json +1224 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/dialect-profiles.md +273 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +61 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +33 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/profile-capabilities.md +55 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/schema-outline.sql +193 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/server-version-policy.md +72 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +45 -0
- openstatspec-0.7.1/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +209 -0
- openstatspec-0.7.1/openstatspec-specification-package/src/openstatspec_specification/__init__.py +19 -0
- openstatspec-0.7.1/openstatspec-specification-package/src/openstatspec_specification/dolt.py +1966 -0
- openstatspec-0.7.1/openstatspec-specification-package/tests/test_dolt_declarations.py +370 -0
- openstatspec-0.7.1/openstatspec-specification-package/tools/validate_repository.py +145 -0
- openstatspec-0.7.1/openstatspec-specification-package/transformation/plan-0.1.schema.json +170 -0
- openstatspec-0.7.1/openstatspec-specification-package/transformation/plan-0.2.schema.json +139 -0
- openstatspec-0.7.1/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
- openstatspec-0.7.1/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/pyproject.toml +1 -1
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/capabilities.py +3 -3
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/validation.py +12 -1
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_cli.py +3 -3
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sql_profiles.py +4 -4
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_transform_frontend.py +10 -0
- openstatspec-0.6.0/.github/workflows/release.yml +0 -85
- {openstatspec-0.6.0 → openstatspec-0.7.1}/.github/verify_release_ref.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/.gitignore +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/THIRD_PARTY_NOTICES.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/architecture.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/in-place-transformation.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/pyspssio-spike.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/sav-profile.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/sql-transformation-workflow.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/api.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/cli.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/core/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/core/results.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/sas/.gitkeep +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/binding.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/compiler.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/execution.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/syntax.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/stata/.gitkeep +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/dictionary.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/raw_dictionary.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/sav.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/catalog_api.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/catalog_verification.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/database_urls.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/dolt_conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/inplace_transform.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/normative.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/profiles.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/wide.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/workflow.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/errors.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/plan.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/schema.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_atomic_import.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_attribute_catalog.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_catalog_lifecycle.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_catalog_persistence_review.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_conditional_inplace_transform.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_document_round_trip.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_dolt_conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_inplace_transform.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_loss_reports.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_normative_catalog.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_official_conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_pyspssio_catalog_authority.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_release_ref.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_review_transaction_boundary.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sav_sqlite.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_spss_catalog_preflight.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sql_services.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sql_workflow.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_strict_catalog_review.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.1}/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: cd8f198c68b849eb8ed018a894670a0904c2181d
|
|
24
24
|
path: openstatspec-specification
|
|
25
25
|
- name: Checkout required SPSS engine
|
|
26
26
|
uses: actions/checkout@v7
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
env:
|
|
4
|
+
OPENSTATSPEC_SPECIFICATION_DIR: ${{ github.workspace }}/openstatspec-specification
|
|
5
|
+
OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR: ${{ github.workspace }}/openstatspec-specification-package
|
|
6
|
+
OPENSTATSPEC_SPECIFICATION_PACKAGE_REF: 2778b784afcb63868ce3c3235a5f1fa190100f9d
|
|
7
|
+
OPENSTATSPEC_SPECIFICATION_PACKAGE_VERSION: 0.1.0
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
push:
|
|
11
|
+
tags:
|
|
12
|
+
- "v*"
|
|
13
|
+
workflow_dispatch:
|
|
14
|
+
inputs:
|
|
15
|
+
release_ref:
|
|
16
|
+
description: "Existing release tag to rebuild and publish idempotently"
|
|
17
|
+
required: true
|
|
18
|
+
type: string
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
build:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
28
|
+
with:
|
|
29
|
+
ref: refs/tags/${{ inputs.release_ref || github.ref_name }}
|
|
30
|
+
fetch-depth: 0
|
|
31
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
32
|
+
with:
|
|
33
|
+
python-version: "3.13"
|
|
34
|
+
- name: Verify release tag exists and targets this package version
|
|
35
|
+
env:
|
|
36
|
+
RELEASE_TAG: ${{ inputs.release_ref || github.ref_name }}
|
|
37
|
+
run: |
|
|
38
|
+
set -eu
|
|
39
|
+
git fetch --force --no-tags origin "refs/tags/${RELEASE_TAG}:refs/tags/${RELEASE_TAG}"
|
|
40
|
+
python .github/verify_release_ref.py
|
|
41
|
+
- run: python -m pip install --upgrade pip build twine pytest
|
|
42
|
+
- name: Verify required SPSS engine is publicly installable
|
|
43
|
+
run: >-
|
|
44
|
+
python -m pip download --only-binary=:all: --no-deps
|
|
45
|
+
--dest /tmp/openstatspec-engine-release
|
|
46
|
+
openstatspec-pyspssio==0.5.1.post2
|
|
47
|
+
- name: Checkout normative specification fixtures
|
|
48
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
49
|
+
with:
|
|
50
|
+
repository: OpenStatSpec/specification
|
|
51
|
+
ref: cd8f198c68b849eb8ed018a894670a0904c2181d
|
|
52
|
+
path: openstatspec-specification
|
|
53
|
+
- name: Checkout specification package source
|
|
54
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
55
|
+
with:
|
|
56
|
+
repository: OpenStatSpec/specification
|
|
57
|
+
ref: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_REF }}
|
|
58
|
+
path: openstatspec-specification-package
|
|
59
|
+
- name: Verify specification package source
|
|
60
|
+
env:
|
|
61
|
+
SPECIFICATION_PACKAGE_DIR: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR }}
|
|
62
|
+
SPECIFICATION_PACKAGE_REF: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_REF }}
|
|
63
|
+
SPECIFICATION_PACKAGE_VERSION: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_VERSION }}
|
|
64
|
+
run: |
|
|
65
|
+
python - <<'PY'
|
|
66
|
+
import os
|
|
67
|
+
import subprocess
|
|
68
|
+
import tomllib
|
|
69
|
+
from pathlib import Path
|
|
70
|
+
|
|
71
|
+
source = Path(os.environ["SPECIFICATION_PACKAGE_DIR"])
|
|
72
|
+
expected_ref = os.environ["SPECIFICATION_PACKAGE_REF"]
|
|
73
|
+
actual_ref = subprocess.check_output(
|
|
74
|
+
["git", "rev-parse", "HEAD"], cwd=source, text=True,
|
|
75
|
+
).strip()
|
|
76
|
+
if actual_ref != expected_ref:
|
|
77
|
+
raise SystemExit(
|
|
78
|
+
f"specification package ref {actual_ref!r} does not match "
|
|
79
|
+
f"expected {expected_ref!r}"
|
|
80
|
+
)
|
|
81
|
+
project = tomllib.loads(
|
|
82
|
+
(source / "pyproject.toml").read_text(encoding="utf-8")
|
|
83
|
+
)["project"]
|
|
84
|
+
if project["name"] != "openstatspec-specification":
|
|
85
|
+
raise SystemExit("unexpected specification package name")
|
|
86
|
+
expected_version = os.environ["SPECIFICATION_PACKAGE_VERSION"]
|
|
87
|
+
if project["version"] != expected_version:
|
|
88
|
+
raise SystemExit(
|
|
89
|
+
f"specification package version {project['version']!r} does "
|
|
90
|
+
f"not match expected {expected_version!r}"
|
|
91
|
+
)
|
|
92
|
+
for required in (
|
|
93
|
+
"pyproject.toml",
|
|
94
|
+
"src/openstatspec_specification/dolt.py",
|
|
95
|
+
"sql/dolt-adapter-declaration-schema.json",
|
|
96
|
+
):
|
|
97
|
+
if not (source / required).is_file():
|
|
98
|
+
raise SystemExit(f"missing specification package resource: {required}")
|
|
99
|
+
PY
|
|
100
|
+
- name: Verify specification package tests and repository
|
|
101
|
+
run: |
|
|
102
|
+
python -m pip install -e "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR"
|
|
103
|
+
python -m pytest -q "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR/tests/test_dolt_declarations.py"
|
|
104
|
+
python "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR/tools/validate_repository.py"
|
|
105
|
+
- name: Build clean release distributions
|
|
106
|
+
run: |
|
|
107
|
+
rm -rf dist /tmp/openstatspec-release-dists
|
|
108
|
+
mkdir -p dist/openstatspec dist/openstatspec-specification \
|
|
109
|
+
/tmp/openstatspec-release-dists/openstatspec \
|
|
110
|
+
/tmp/openstatspec-release-dists/specification
|
|
111
|
+
python -m build --outdir /tmp/openstatspec-release-dists/openstatspec .
|
|
112
|
+
python -m build --outdir /tmp/openstatspec-release-dists/specification "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR"
|
|
113
|
+
python -m twine check \
|
|
114
|
+
/tmp/openstatspec-release-dists/openstatspec/* \
|
|
115
|
+
/tmp/openstatspec-release-dists/specification/*
|
|
116
|
+
python - <<'PY'
|
|
117
|
+
from pathlib import Path
|
|
118
|
+
from shutil import copy2
|
|
119
|
+
|
|
120
|
+
sources = {
|
|
121
|
+
"openstatspec": (
|
|
122
|
+
Path("/tmp/openstatspec-release-dists/openstatspec"),
|
|
123
|
+
Path("dist/openstatspec"),
|
|
124
|
+
),
|
|
125
|
+
"openstatspec_specification": (
|
|
126
|
+
Path("/tmp/openstatspec-release-dists/specification"),
|
|
127
|
+
Path("dist/openstatspec-specification"),
|
|
128
|
+
),
|
|
129
|
+
}
|
|
130
|
+
copied = []
|
|
131
|
+
for normalized_name, (source, destination_dir) in sources.items():
|
|
132
|
+
destination_dir.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
files = sorted(path for path in source.iterdir() if path.is_file())
|
|
134
|
+
if len(files) != 2 or {path.suffix for path in files} != {".whl", ".gz"}:
|
|
135
|
+
raise SystemExit(
|
|
136
|
+
f"expected one wheel and one sdist for {normalized_name}, got "
|
|
137
|
+
f"{[path.name for path in files]}"
|
|
138
|
+
)
|
|
139
|
+
for path in files:
|
|
140
|
+
normalized_artifact = path.name.replace("-", "_").lower()
|
|
141
|
+
if not normalized_artifact.startswith(normalized_name + "_"):
|
|
142
|
+
raise SystemExit(
|
|
143
|
+
f"unexpected artifact name for {normalized_name}: {path.name}"
|
|
144
|
+
)
|
|
145
|
+
destination = destination_dir / path.name
|
|
146
|
+
copy2(path, destination)
|
|
147
|
+
copied.append(destination)
|
|
148
|
+
if len(copied) != 4:
|
|
149
|
+
raise SystemExit(f"expected four release artifacts, got {len(copied)}")
|
|
150
|
+
print("release artifacts:", ", ".join(path.name for path in copied))
|
|
151
|
+
PY
|
|
152
|
+
- name: Checkout required SPSS engine
|
|
153
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
154
|
+
with:
|
|
155
|
+
repository: TonisOrmisson/pyspssio
|
|
156
|
+
ref: e069adf33c70bcd9e8e6ee495106479463a84fa2
|
|
157
|
+
path: openstatspec-pyspssio
|
|
158
|
+
- run: python -m pip install ./openstatspec-pyspssio
|
|
159
|
+
- run: python -m pip install -e ".[dev]"
|
|
160
|
+
- run: python -m pytest -m "not services"
|
|
161
|
+
- run: python -m venv /tmp/openstatspec-release-smoke
|
|
162
|
+
- run: /tmp/openstatspec-release-smoke/bin/python -m pip install ./openstatspec-pyspssio
|
|
163
|
+
- run: /tmp/openstatspec-release-smoke/bin/python -m pip install dist/openstatspec/openstatspec-*.whl
|
|
164
|
+
- run: /tmp/openstatspec-release-smoke/bin/openstatspec capabilities
|
|
165
|
+
- name: Smoke-test specification wheel
|
|
166
|
+
run: |
|
|
167
|
+
python -m venv /tmp/openstatspec-specification-release-smoke
|
|
168
|
+
/tmp/openstatspec-specification-release-smoke/bin/python -m pip install dist/openstatspec-specification/openstatspec_specification-*.whl
|
|
169
|
+
/tmp/openstatspec-specification-release-smoke/bin/python - <<'PY'
|
|
170
|
+
from openstatspec_specification import DoltDeclarationSource
|
|
171
|
+
|
|
172
|
+
source = DoltDeclarationSource.packaged()
|
|
173
|
+
schema = source.read_json("sql/dolt-adapter-declaration-schema.json")
|
|
174
|
+
if schema.get("schema_id") != "openstatspec-dolt-adapter-declaration-v1":
|
|
175
|
+
raise SystemExit("packaged specification schema has the wrong identifier")
|
|
176
|
+
PY
|
|
177
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
178
|
+
with:
|
|
179
|
+
name: python-distributions
|
|
180
|
+
path: dist/
|
|
181
|
+
|
|
182
|
+
publish:
|
|
183
|
+
needs: build
|
|
184
|
+
runs-on: ubuntu-latest
|
|
185
|
+
environment:
|
|
186
|
+
name: pypi
|
|
187
|
+
url: https://pypi.org/p/openstatspec
|
|
188
|
+
permissions:
|
|
189
|
+
id-token: write
|
|
190
|
+
steps:
|
|
191
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
192
|
+
with:
|
|
193
|
+
name: python-distributions
|
|
194
|
+
path: dist/
|
|
195
|
+
- name: Publish openstatspec to PyPI
|
|
196
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
197
|
+
with:
|
|
198
|
+
packages-dir: dist/openstatspec/
|
|
199
|
+
skip-existing: true
|
|
200
|
+
- name: Publish openstatspec-specification to PyPI
|
|
201
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
202
|
+
with:
|
|
203
|
+
packages-dir: dist/openstatspec-specification/
|
|
204
|
+
skip-existing: true
|
|
@@ -6,6 +6,24 @@ All notable changes to this reference implementation are documented here.
|
|
|
6
6
|
|
|
7
7
|
_No unreleased changes._
|
|
8
8
|
|
|
9
|
+
## 0.7.1 - 2026-08-12
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Pinned capability declarations, conformance fixtures, and release validation
|
|
14
|
+
to the published OpenStatSpec specification `v0.3.0` at exact commit
|
|
15
|
+
`cd8f198c68b849eb8ed018a894670a0904c2181d`.
|
|
16
|
+
|
|
17
|
+
## 0.7.0 - 2026-08-11
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Added root release workflow support for publishing the normative
|
|
22
|
+
`openstatspec-specification` companion distribution, with independent
|
|
23
|
+
artifact validation, smoke tests, and PyPI publishing.
|
|
24
|
+
- Carried the complete 0.6.0 transformation, PostgreSQL, and documentation
|
|
25
|
+
work forward into the versioned 0.7.0 release from `main`.
|
|
26
|
+
|
|
9
27
|
## 0.6.0 - 2026-08-05
|
|
10
28
|
|
|
11
29
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: openstatspec
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Reference adapter for the OpenStatSpec relational contract
|
|
5
5
|
Author: OpenStatSpec
|
|
6
6
|
License: Apache-2.0
|
|
@@ -87,6 +87,7 @@ implemented capability boundary.
|
|
|
87
87
|
## SPSS-like transformation frontend
|
|
88
88
|
|
|
89
89
|
The bounded SPSS-like frontend lowers `RECODE`, sequential `COMPUTE` and `IF`,
|
|
90
|
+
`STRING` declarations, and `DELETE VARIABLES`,
|
|
90
91
|
`VARIABLE LABELS`, `VALUE LABELS`, numeric `FORMATS`, `VARIABLE LEVEL`, and
|
|
91
92
|
`EXECUTE` into a language-neutral typed canonical plan. Conditions support
|
|
92
93
|
parentheses, variable and numeric literal operands, comparisons, `AND`, and
|
|
@@ -68,6 +68,7 @@ implemented capability boundary.
|
|
|
68
68
|
## SPSS-like transformation frontend
|
|
69
69
|
|
|
70
70
|
The bounded SPSS-like frontend lowers `RECODE`, sequential `COMPUTE` and `IF`,
|
|
71
|
+
`STRING` declarations, and `DELETE VARIABLES`,
|
|
71
72
|
`VARIABLE LABELS`, `VALUE LABELS`, numeric `FORMATS`, `VARIABLE LEVEL`, and
|
|
72
73
|
`EXECUTE` into a language-neutral typed canonical plan. Conditions support
|
|
73
74
|
parentheses, variable and numeric literal operands, comparisons, `AND`, and
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 0.
|
|
1
|
+
# 0.7.1 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.
|
|
@@ -69,6 +69,8 @@ The gate must prove that:
|
|
|
69
69
|
plan hash and in-place result;
|
|
70
70
|
- the exact bounded `COMPUTE`/`IF` program compiles to all seven ordered
|
|
71
71
|
operations without dropping `FORMATS`, `VARIABLE LEVEL`, or `EXECUTE`;
|
|
72
|
+
- bounded `STRING` declarations and `DELETE VARIABLES` operations preserve
|
|
73
|
+
the resulting schema and physical-column identity on supported profiles;
|
|
72
74
|
- boolean data results match the equivalent expression and the target's label,
|
|
73
75
|
0/1 value labels, `F1.0` print/write format, and nominal level exist in the
|
|
74
76
|
normative catalog;
|
|
@@ -112,12 +114,10 @@ capability claim, or implied support.
|
|
|
112
114
|
4. Build with `python -m build` and install the generated wheel in a clean
|
|
113
115
|
environment.
|
|
114
116
|
5. Confirm `openstatspec capabilities` reflects the intended support boundary.
|
|
115
|
-
6. Confirm CI, release fixtures, and capabilities use the
|
|
116
|
-
specification
|
|
117
|
-
`
|
|
118
|
-
`specification_status=
|
|
119
|
-
`specification_release` null. If that exact commit receives a stable tag
|
|
120
|
-
before this package is tagged, update the identity and re-run every gate.
|
|
117
|
+
6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
|
|
118
|
+
specification `v0.3.0` at exact commit
|
|
119
|
+
`cd8f198c68b849eb8ed018a894670a0904c2181d`, publish
|
|
120
|
+
`specification_status=stable`, and set `specification_release` to `v0.3.0`.
|
|
121
121
|
7. Review this document, the README, and CHANGELOG for accurate scope.
|
|
122
122
|
|
|
123
123
|
The tag-triggered release workflow repeats the non-service test suite, builds
|
|
@@ -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.7.1/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.
|
|
@@ -4,9 +4,10 @@ OpenStatSpec separates transformation syntax, canonical meaning, and database
|
|
|
4
4
|
mutation. This lets multiple language frontends produce the same plan without
|
|
5
5
|
coupling the executor to any one language.
|
|
6
6
|
|
|
7
|
-
The implemented bounded SPSS-like frontend accepts `
|
|
8
|
-
`COMPUTE` and `IF`, `
|
|
9
|
-
`VARIABLE
|
|
7
|
+
The implemented bounded SPSS-like frontend accepts bounded `STRING`
|
|
8
|
+
declarations, `RECODE`, sequential `COMPUTE` and `IF`, `DELETE VARIABLES`,
|
|
9
|
+
`VARIABLE LABELS`, `VALUE LABELS`, numeric `FORMATS`, `VARIABLE LEVEL`, and
|
|
10
|
+
`EXECUTE`. Predicates support typed variable/literal
|
|
10
11
|
operands, parentheses, numeric comparisons, `AND`, and `OR`. String comparison
|
|
11
12
|
and v0.2 string assignment fail closed until exact profile-independent
|
|
12
13
|
collation and explicit-width semantics are available; arbitrary SPSS, Python,
|
|
@@ -0,0 +1,22 @@
|
|
|
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 tools/validate_repository.py
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
name: Publish Python specification package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "package-v*"
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
build:
|
|
14
|
+
name: Build and verify distribution
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Check out repository
|
|
19
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
20
|
+
with:
|
|
21
|
+
persist-credentials: false
|
|
22
|
+
|
|
23
|
+
- name: Set up Python
|
|
24
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.13"
|
|
27
|
+
|
|
28
|
+
- name: Build distribution
|
|
29
|
+
run: |
|
|
30
|
+
python -m pip install --upgrade pip
|
|
31
|
+
python -m pip install build twine pytest
|
|
32
|
+
python -m pip install -e .
|
|
33
|
+
python -m pytest -q tests/test_dolt_declarations.py
|
|
34
|
+
python tools/validate_repository.py
|
|
35
|
+
python -m build
|
|
36
|
+
|
|
37
|
+
- name: Verify distribution metadata
|
|
38
|
+
run: python -m twine check dist/*
|
|
39
|
+
|
|
40
|
+
- name: Verify release tag version
|
|
41
|
+
if: startsWith(github.ref, 'refs/tags/package-v')
|
|
42
|
+
env:
|
|
43
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
44
|
+
run: |
|
|
45
|
+
python - <<'PY'
|
|
46
|
+
import os
|
|
47
|
+
import tomllib
|
|
48
|
+
from pathlib import Path
|
|
49
|
+
|
|
50
|
+
project = tomllib.loads(Path("pyproject.toml").read_text())
|
|
51
|
+
version = project["project"]["version"]
|
|
52
|
+
tag = os.environ["RELEASE_TAG"]
|
|
53
|
+
if tag != f"package-v{version}":
|
|
54
|
+
raise SystemExit(
|
|
55
|
+
f"release tag {tag!r} does not match project version package-v{version}"
|
|
56
|
+
)
|
|
57
|
+
PY
|
|
58
|
+
|
|
59
|
+
- name: Store distribution artifacts
|
|
60
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
61
|
+
with:
|
|
62
|
+
name: python-package-distributions
|
|
63
|
+
path: dist/
|
|
64
|
+
if-no-files-found: error
|
|
65
|
+
|
|
66
|
+
publish-testpypi:
|
|
67
|
+
name: Publish to TestPyPI
|
|
68
|
+
if: github.event_name == 'workflow_dispatch'
|
|
69
|
+
needs: build
|
|
70
|
+
runs-on: ubuntu-latest
|
|
71
|
+
environment:
|
|
72
|
+
name: testpypi
|
|
73
|
+
url: https://test.pypi.org/p/openstatspec-specification
|
|
74
|
+
permissions:
|
|
75
|
+
id-token: write
|
|
76
|
+
|
|
77
|
+
steps:
|
|
78
|
+
- name: Download distribution artifacts
|
|
79
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
80
|
+
with:
|
|
81
|
+
name: python-package-distributions
|
|
82
|
+
path: dist/
|
|
83
|
+
|
|
84
|
+
- name: Publish distribution to TestPyPI
|
|
85
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
86
|
+
with:
|
|
87
|
+
repository-url: https://test.pypi.org/legacy/
|
|
88
|
+
|
|
89
|
+
publish-pypi:
|
|
90
|
+
name: Publish to PyPI
|
|
91
|
+
if: startsWith(github.ref, 'refs/tags/package-v')
|
|
92
|
+
needs: build
|
|
93
|
+
runs-on: ubuntu-latest
|
|
94
|
+
environment:
|
|
95
|
+
name: pypi
|
|
96
|
+
url: https://pypi.org/p/openstatspec-specification
|
|
97
|
+
permissions:
|
|
98
|
+
id-token: write
|
|
99
|
+
|
|
100
|
+
steps:
|
|
101
|
+
- name: Download distribution artifacts
|
|
102
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
103
|
+
with:
|
|
104
|
+
name: python-package-distributions
|
|
105
|
+
path: dist/
|
|
106
|
+
|
|
107
|
+
- name: Publish distribution to PyPI
|
|
108
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|