openstatspec 0.6.0__tar.gz → 0.7.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/.github/workflows/release.yml +204 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/CHANGELOG.md +10 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/PKG-INFO +3 -2
- {openstatspec-0.6.0 → openstatspec-0.7.0}/README.md +1 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/release-readiness.md +3 -1
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/transformations.md +4 -3
- openstatspec-0.7.0/openstatspec-specification/.github/workflows/ci.yml +15 -0
- openstatspec-0.7.0/openstatspec-specification/.gitignore +2 -0
- openstatspec-0.7.0/openstatspec-specification/CHANGELOG.md +57 -0
- openstatspec-0.7.0/openstatspec-specification/CONTRIBUTING.md +28 -0
- openstatspec-0.7.0/openstatspec-specification/README.md +100 -0
- openstatspec-0.7.0/openstatspec-specification/ROADMAP.md +112 -0
- openstatspec-0.7.0/openstatspec-specification/VERSIONING.md +35 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/LICENSE.md +10 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/README.md +23 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +226 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/in-place-transformation-0.1.json +147 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/in-place-transformation-0.2.json +481 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +107 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +255 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +1106 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +1747 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/transformation-plan-0.1.json +140 -0
- openstatspec-0.7.0/openstatspec-specification/conformance/transformation-plan-0.2.json +1104 -0
- openstatspec-0.7.0/openstatspec-specification/docs/architecture.md +61 -0
- openstatspec-0.7.0/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
- openstatspec-0.7.0/openstatspec-specification/docs/mssql-dialect-roadmap.md +85 -0
- openstatspec-0.7.0/openstatspec-specification/docs/spss-profile.md +45 -0
- openstatspec-0.7.0/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +82 -0
- openstatspec-0.7.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +76 -0
- openstatspec-0.7.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +132 -0
- openstatspec-0.7.0/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +314 -0
- openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-profile-0.1.md +108 -0
- openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-profile-0.2.md +127 -0
- openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +88 -0
- openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +100 -0
- openstatspec-0.7.0/openstatspec-specification/examples/basic-spss-mapping.md +19 -0
- openstatspec-0.7.0/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +30 -0
- openstatspec-0.7.0/openstatspec-specification/examples/spss-syntax-transformation.md +31 -0
- openstatspec-0.7.0/openstatspec-specification/examples/sql-transformation-workflow.md +87 -0
- openstatspec-0.7.0/openstatspec-specification/sql/dialect-profile-baseline.json +233 -0
- openstatspec-0.7.0/openstatspec-specification/sql/dialect-profiles.md +202 -0
- openstatspec-0.7.0/openstatspec-specification/sql/profile-capabilities.md +45 -0
- openstatspec-0.7.0/openstatspec-specification/sql/schema-outline.sql +193 -0
- openstatspec-0.7.0/openstatspec-specification/sql/server-version-policy.md +72 -0
- openstatspec-0.7.0/openstatspec-specification/sql/transformation-plan-profile-schema.sql +45 -0
- openstatspec-0.7.0/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +209 -0
- openstatspec-0.7.0/openstatspec-specification/tools/validate_repository.py +934 -0
- openstatspec-0.7.0/openstatspec-specification/transformation/plan-0.1.schema.json +170 -0
- openstatspec-0.7.0/openstatspec-specification/transformation/plan-0.2.schema.json +139 -0
- openstatspec-0.7.0/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
- openstatspec-0.7.0/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
- openstatspec-0.7.0/openstatspec-specification-package/.github/workflows/ci.yml +22 -0
- openstatspec-0.7.0/openstatspec-specification-package/.github/workflows/publish.yml +108 -0
- openstatspec-0.7.0/openstatspec-specification-package/.gitignore +5 -0
- openstatspec-0.7.0/openstatspec-specification-package/CHANGELOG.md +72 -0
- openstatspec-0.7.0/openstatspec-specification-package/CONTRIBUTING.md +28 -0
- openstatspec-0.7.0/openstatspec-specification-package/README.md +107 -0
- openstatspec-0.7.0/openstatspec-specification-package/RELEASING.md +60 -0
- openstatspec-0.7.0/openstatspec-specification-package/ROADMAP.md +134 -0
- openstatspec-0.7.0/openstatspec-specification-package/VERSIONING.md +35 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/LICENSE.md +10 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/README.md +23 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +226 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +147 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +481 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +107 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +255 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +1106 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +1747 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/transformation-plan-0.1.json +140 -0
- openstatspec-0.7.0/openstatspec-specification-package/conformance/transformation-plan-0.2.json +1104 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/architecture.md +61 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +85 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/spss-profile.md +45 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +82 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +76 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +132 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +314 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +108 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +127 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +88 -0
- openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +100 -0
- openstatspec-0.7.0/openstatspec-specification-package/examples/basic-spss-mapping.md +19 -0
- openstatspec-0.7.0/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +30 -0
- openstatspec-0.7.0/openstatspec-specification-package/examples/spss-syntax-transformation.md +31 -0
- openstatspec-0.7.0/openstatspec-specification-package/examples/sql-transformation-workflow.md +87 -0
- openstatspec-0.7.0/openstatspec-specification-package/pyproject.toml +21 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/dialect-profile-baseline.json +1224 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/dialect-profiles.md +273 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +61 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +33 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/profile-capabilities.md +55 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/schema-outline.sql +193 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/server-version-policy.md +72 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +45 -0
- openstatspec-0.7.0/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +209 -0
- openstatspec-0.7.0/openstatspec-specification-package/src/openstatspec_specification/__init__.py +19 -0
- openstatspec-0.7.0/openstatspec-specification-package/src/openstatspec_specification/dolt.py +1966 -0
- openstatspec-0.7.0/openstatspec-specification-package/tests/test_dolt_declarations.py +370 -0
- openstatspec-0.7.0/openstatspec-specification-package/tools/validate_repository.py +145 -0
- openstatspec-0.7.0/openstatspec-specification-package/transformation/plan-0.1.schema.json +170 -0
- openstatspec-0.7.0/openstatspec-specification-package/transformation/plan-0.2.schema.json +139 -0
- openstatspec-0.7.0/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
- openstatspec-0.7.0/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/pyproject.toml +1 -1
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/validation.py +12 -1
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_transform_frontend.py +10 -0
- openstatspec-0.6.0/.github/workflows/release.yml +0 -85
- {openstatspec-0.6.0 → openstatspec-0.7.0}/.github/verify_release_ref.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/.github/workflows/ci.yml +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/.gitignore +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/THIRD_PARTY_NOTICES.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/architecture.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/in-place-transformation.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/pyspssio-spike.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/sav-profile.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/sql-transformation-workflow.md +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/api.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/cli.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/core/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/core/results.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/sas/.gitkeep +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/binding.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/compiler.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/execution.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/syntax.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/stata/.gitkeep +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/dictionary.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/raw_dictionary.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/sav.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/capabilities.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/catalog_api.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/catalog_verification.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/database_urls.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/dolt_conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/inplace_transform.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/normative.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/profiles.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/wide.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/workflow.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/__init__.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/errors.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/plan.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/schema.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_atomic_import.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_attribute_catalog.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_catalog_lifecycle.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_catalog_persistence_review.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_cli.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_conditional_inplace_transform.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_document_round_trip.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_dolt_conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_inplace_transform.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_loss_reports.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_normative_catalog.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_official_conformance.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_pyspssio_catalog_authority.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_release_ref.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_review_transaction_boundary.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sav_sqlite.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_spss_catalog_preflight.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sql_profiles.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sql_services.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sql_workflow.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_strict_catalog_review.py +0 -0
- {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_vls_compatible_names.py +0 -0
|
@@ -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: f2fdf687d8cb32b944ca55a3e9e7215ffc603019
|
|
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,16 @@ All notable changes to this reference implementation are documented here.
|
|
|
6
6
|
|
|
7
7
|
_No unreleased changes._
|
|
8
8
|
|
|
9
|
+
## 0.7.0 - 2026-08-11
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added root release workflow support for publishing the normative
|
|
14
|
+
`openstatspec-specification` companion distribution, with independent
|
|
15
|
+
artifact validation, smoke tests, and PyPI publishing.
|
|
16
|
+
- Carried the complete 0.6.0 transformation, PostgreSQL, and documentation
|
|
17
|
+
work forward into the versioned 0.7.0 release from `main`.
|
|
18
|
+
|
|
9
19
|
## 0.6.0 - 2026-08-05
|
|
10
20
|
|
|
11
21
|
### 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.0
|
|
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.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.
|
|
@@ -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;
|
|
@@ -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,57 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
Target stable specification release: `v0.3.0` (not published).
|
|
6
|
+
|
|
7
|
+
Until a protected or signed `v0.3.0` tag targets this work, implementations MUST identify it with `specification_status: release_candidate`, `specification_release: null`, and the exact immutable specification commit. The entries below do not constitute a stable release.
|
|
8
|
+
|
|
9
|
+
- Added backward-compatible Transformation Plan and SPSS Syntax Frontend 0.2
|
|
10
|
+
contracts for sequential numeric `COMPUTE` and conditional `IF`, bounded
|
|
11
|
+
comparison/`AND`/`OR` expressions, `FORMATS`, `VARIABLE LEVEL`, and
|
|
12
|
+
`EXECUTE`.
|
|
13
|
+
- Defined exact SQL three-valued missing semantics and deterministic complete
|
|
14
|
+
plan JSON hashing while preserving every 0.1 contract, fixture, and hash.
|
|
15
|
+
- Kept create-target apply fail-closed on MySQL, MariaDB, and Dolt; these
|
|
16
|
+
profiles require a separately versioned physical-and-catalog provisioning
|
|
17
|
+
action followed by an existing-target apply with no automatic Dolt commit.
|
|
18
|
+
- Added independent synthetic golden fixtures, hashes, examples, and repository
|
|
19
|
+
validation gates for the new contracts.
|
|
20
|
+
- Corrected the SPSS Syntax Frontend 0.1 schema's `$defs` and `$ref` keywords
|
|
21
|
+
so typed value-label values are constrained as the existing contract states;
|
|
22
|
+
this is eligible for a patch-series backport under the schema-defect policy.
|
|
23
|
+
|
|
24
|
+
## v0.2.0 - 2026-07-31
|
|
25
|
+
|
|
26
|
+
- Added canonical Transformation Plan and SPSS Syntax Frontend profiles for a
|
|
27
|
+
bounded `RECODE`, `VARIABLE LABELS`, and `VALUE LABELS` subset.
|
|
28
|
+
- Added plan/frontend JSON Schemas, canonical-hash conformance cases, examples,
|
|
29
|
+
and repository validation gates.
|
|
30
|
+
- Added a product-neutral in-place binding for supported SQL profiles: direct
|
|
31
|
+
same-table data/metadata mutation, compact operation audit, no automatic
|
|
32
|
+
commit, and no derived/copy/snapshot/rollback history layer. Dolt adds a
|
|
33
|
+
controlled branch/HEAD/working-set context.
|
|
34
|
+
|
|
35
|
+
## v0.1.0 - 2026-07-31
|
|
36
|
+
|
|
37
|
+
- Defined conservative maintained release-series claims and exact CI targets
|
|
38
|
+
for MySQL 8.4.11/9.7.2, MariaDB 11.4.12/11.8.8/12.3.2 and PostgreSQL
|
|
39
|
+
17.10/18.4.
|
|
40
|
+
- Expanded the independent Dolt claim from exact 2.2.2 to the conservative
|
|
41
|
+
`>=2.2.2,<2.3.0` portion of 2.2.x and added exact 2.2.3 CI
|
|
42
|
+
evidence alongside retained 2.2.2 evidence.
|
|
43
|
+
- Clarified the non-conflicting SQLite core/optional-workflow policies.
|
|
44
|
+
- Added an explicitly unsupported Microsoft SQL Server dialect roadmap.
|
|
45
|
+
- Prepared the initial specification release as `v0.1.0`.
|
|
46
|
+
|
|
47
|
+
- Defined the strict one-source-dataset to one-wide-table relational contract.
|
|
48
|
+
- Added the normative operation and fidelity-event model.
|
|
49
|
+
- Added SQLite, PostgreSQL, and MySQL/MariaDB dialect capability profiles.
|
|
50
|
+
- Added generated CC0 SAV/ZSAV conformance fixtures and a machine-readable manifest.
|
|
51
|
+
- Added Python and PHP reference-adapter conformance coverage.
|
|
52
|
+
- Made the singular normative catalog the required source of truth for export.
|
|
53
|
+
- Added case-weight, typed multiple-response counted values, label-source, and explicit LOWEST/HIGHEST coverage.
|
|
54
|
+
- Required immutable specification identity, theoretical/effective SQL limits, tested server versions, and concrete canonical fixture expectations in capability declarations and conformance runs.
|
|
55
|
+
- Clarified prerelease identity, dimensioned identifier limits, and exclusive catalog namespace ownership.
|
|
56
|
+
- Added an independent, fail-closed Dolt 2.2.2 SQL profile with a dedicated-database binding, evidence-labelled adapter limits, and complete compensating cleanup for non-atomic DDL.
|
|
57
|
+
- Added optional SQL Transformation Workflow Profile 0.1 without changing the immutable source-faithful core contract.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Contributing to OpenStatSpec
|
|
2
|
+
|
|
3
|
+
OpenStatSpec is at release-candidate status. Contributions that make its source-faithful SPSS-to-relational contract clearer, testable, or implementable are welcome.
|
|
4
|
+
|
|
5
|
+
## Useful first contributions
|
|
6
|
+
|
|
7
|
+
- Propose a clarification when a mapping rule is ambiguous or incomplete. Describe the source behavior, the intended relational representation, and any fidelity risk.
|
|
8
|
+
- Add a small, lawful fixture that demonstrates a real SPSS dictionary or value edge case, along with the expected wide table and metadata outcome.
|
|
9
|
+
- Draft a dialect profile that states identifier, column, binary64, text, and row/value-size capabilities, plus the required preflight behavior.
|
|
10
|
+
- Report or contribute adapter support, including what source features it preserves and any machine-readable fidelity events it emits.
|
|
11
|
+
- Improve documentation, examples, or terminology when it helps an implementer apply the existing scope correctly.
|
|
12
|
+
|
|
13
|
+
## Scope guardrails
|
|
14
|
+
|
|
15
|
+
The standard preserves the source package's native rectangular dataset: one source dataset is one dedicated wide table, each case is a row, and each variable is a physical column. Metadata exists to preserve source semantics and exportability.
|
|
16
|
+
|
|
17
|
+
Do not propose a second data model as part of this contract. In particular, long-form cells, EAV/JSON value storage, automatic reshaping, splitting a source table, automatic harmonization, inferred respondent keys, and question/study/wave entities are outside scope.
|
|
18
|
+
|
|
19
|
+
If a relational target cannot faithfully represent a source dataset within its declared limits, the correct outcome is an atomic, machine-readable capability failure—not a silent transformation.
|
|
20
|
+
|
|
21
|
+
## How to propose a change
|
|
22
|
+
|
|
23
|
+
1. Check the relevant profile, schema outline, and example first.
|
|
24
|
+
2. Keep the proposal small and name the affected source behavior.
|
|
25
|
+
3. Explain the expected mapping and whether it changes conformance, fixtures, or a dialect capability declaration.
|
|
26
|
+
4. Include a minimal example or test fixture when practical.
|
|
27
|
+
|
|
28
|
+
There is no formal governance process in this draft yet. Clear, evidence-based proposals that preserve the strict scope are the best starting point.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# OpenStatSpec
|
|
2
|
+
|
|
3
|
+
OpenStatSpec is an open, SQL-oriented specification for representing a statistical data file and its dictionary metadata in a relational database without changing the source package's rectangular data model.
|
|
4
|
+
|
|
5
|
+
The first profile targets IBM SPSS Statistics system files. It maps one source dataset to one dedicated wide SQL table: each source case becomes one row and each source variable becomes one physical column. Supporting catalog tables retain only the metadata needed to interpret and export that SPSS dataset faithfully.
|
|
6
|
+
|
|
7
|
+
## Conformance scope
|
|
8
|
+
|
|
9
|
+
The [SPSS SAV/ZSAV profile](docs/spss-sav-zsav-profile-1.0.md) defines normative conformance language, a canonical relational schema, generated fixtures, and reference-adapter coverage. The SQL layer includes independent SQLite, PostgreSQL, MySQL/MariaDB/InnoDB, and Dolt profiles. Implementations must pin the exact specification commit they test against. Release identifiers and immutable provenance belong in tagged releases and capability declarations rather than in this README.
|
|
10
|
+
|
|
11
|
+
The [server-version policy](sql/server-version-policy.md) covers the maintained
|
|
12
|
+
MySQL 8.4.x/9.7.x, MariaDB 11.4.x/11.8.x/12.3.x and PostgreSQL 17.x/18.x
|
|
13
|
+
series while requiring exact patch-version CI evidence. Microsoft SQL Server
|
|
14
|
+
remains an explicitly unsupported [future dialect](docs/mssql-dialect-roadmap.md).
|
|
15
|
+
|
|
16
|
+
## Core contract
|
|
17
|
+
|
|
18
|
+
- One source dataset maps to exactly one dedicated SQL data table.
|
|
19
|
+
- One SPSS case maps to exactly one row, in source order.
|
|
20
|
+
- One SPSS variable maps to exactly one physical SQL column, in source order.
|
|
21
|
+
- The table contains a reserved technical ordinal column, `__case_ordinal`, used only to preserve case order. It is never exported as an SPSS variable.
|
|
22
|
+
- Numeric system-missing values map to SQL `NULL`; SPSS user-missing codes remain their original stored values and are described in metadata.
|
|
23
|
+
- Dates, times, and currencies remain SPSS numeric values plus SPSS format metadata.
|
|
24
|
+
- String blanks remain values, not missing values.
|
|
25
|
+
|
|
26
|
+
OpenStatSpec does not define long-form cells, EAV storage, table splitting, reshaping, automatic harmonization, or questionnaire/study entities. It does not infer respondent keys or combine datasets. All conformant database-object identifiers are generic; the double-underscore prefix is reserved for standard technical identifiers.
|
|
27
|
+
|
|
28
|
+
[Versioning](VERSIONING.md) defines compatibility and release rules. [Roadmap](ROADMAP.md) tracks remaining project work and maintainer setup.
|
|
29
|
+
|
|
30
|
+
## Optional SQL transformation workflow
|
|
31
|
+
|
|
32
|
+
The [SQL Transformation Workflow Profile 0.1](docs/sql-transformation-workflow-profile-0.1.md)
|
|
33
|
+
adds versioned, parameterized and auditable SQL-derived datasets beside the core.
|
|
34
|
+
It never reclassifies derived output as a source-faithful core dataset and never
|
|
35
|
+
permits a transformation to mutate a core import.
|
|
36
|
+
|
|
37
|
+
That separate derived-data profile is not used by the SPSS-like in-place
|
|
38
|
+
frontend below.
|
|
39
|
+
|
|
40
|
+
The release-candidate [Transformation Plan Profile 0.2](docs/transformation-plan-profile-0.2.md)
|
|
41
|
+
adds sequential bounded numeric assignment and conditional assignment to the
|
|
42
|
+
unchanged 0.1 operations. The
|
|
43
|
+
[SPSS Syntax Frontend Profile 0.2](docs/spss-syntax-frontend-profile-0.2.md)
|
|
44
|
+
lowers `COMPUTE`, `IF`, `FORMATS`, `VARIABLE LEVEL`, and `EXECUTE`
|
|
45
|
+
alongside the 0.1 `RECODE`, `VARIABLE LABELS`, and `VALUE LABELS` subset.
|
|
46
|
+
Programs using only the 0.1 subset retain exact 0.1 plan identity and hash. The
|
|
47
|
+
[in-place binding](docs/transformation-plan-sql-binding-0.2.md) applies the plan
|
|
48
|
+
to the same dataset and same physical wide table on supported SQL profiles. It
|
|
49
|
+
creates no derived dataset, data copy, or OpenStatSpec undo layer; Dolt-specific
|
|
50
|
+
history and commits remain Dolt's. MySQL, MariaDB, and Dolt require a new target
|
|
51
|
+
to be provisioned separately before an in-place transformation apply.
|
|
52
|
+
|
|
53
|
+
## Repository layout
|
|
54
|
+
|
|
55
|
+
- `sql/server-version-policy.md` — server release-series claims and exact reference-CI targets.
|
|
56
|
+
- `docs/mssql-dialect-roadmap.md` — unsupported future SQL Server dialect plan.
|
|
57
|
+
|
|
58
|
+
- `docs/architecture.md` — model boundary and catalog outline.
|
|
59
|
+
- `docs/spss-profile.md` — SPSS source-faithful mapping rules.
|
|
60
|
+
- [Python / pinned pyspssio implementation profile](docs/implementation-profiles/python-pyspssio-0.5.1.md) — Python adapter pyspssio capability boundary; it does not relax the normative SAV/ZSAV profile.
|
|
61
|
+
- `sql/dialect-profiles.md` — initial SQLite, PostgreSQL, MySQL/MariaDB and Dolt physical profiles.
|
|
62
|
+
- `sql/` — dialect-neutral schema outline and profile notes.
|
|
63
|
+
- `sql/transformation-workflow-profile-schema.sql` - optional derived-data
|
|
64
|
+
catalog outline, separate from the immutable core catalog.
|
|
65
|
+
- `transformation/plan-0.1.schema.json` — canonical transformation-plan schema.
|
|
66
|
+
- `sql/transformation-plan-profile-schema.sql` — compact in-place apply audit;
|
|
67
|
+
it is not a dataset-version catalog.
|
|
68
|
+
- `conformance/transformation-plan-0.2.json` and
|
|
69
|
+
`conformance/spss-syntax-frontend-0.2.json` — additive plan and frontend
|
|
70
|
+
conformance cases with independent golden hashes; `conformance/in-place-transformation-0.2.json`
|
|
71
|
+
fixes the same-dataset/same-table execution invariants and the additional
|
|
72
|
+
controlled Dolt context. The 0.1 schemas and fixtures remain unchanged.
|
|
73
|
+
- `examples/` — small illustrative mapping fixtures.
|
|
74
|
+
|
|
75
|
+
## Conformance principle
|
|
76
|
+
|
|
77
|
+
Implementations must preflight target capabilities before import. If the target cannot faithfully create one wide table because of column, identifier, string, or row limits, import must fail atomically with a machine-readable capability diagnostic. It must never silently truncate, drop, split, transpose, pivot, or transform source data.
|
|
78
|
+
|
|
79
|
+
This specification repository publishes only normative Transformation Plan and SPSS syntax frontend schemas, documentation, and declarative fixtures. Executable validation or behavioral conformance code, including parser, SQL-engine, transaction, and adapter behavior, belongs in each implementation or adapter repository.
|
|
80
|
+
|
|
81
|
+
## Who it is for
|
|
82
|
+
|
|
83
|
+
OpenStatSpec is for people and projects that need to move statistical datasets between SPSS and relational databases without turning the data into a different model. It is especially relevant to:
|
|
84
|
+
|
|
85
|
+
- implementers building SPSS import/export adapters or language libraries;
|
|
86
|
+
- data managers and statistical-data practitioners preserving SPSS dictionaries in SQL-backed workflows;
|
|
87
|
+
- database maintainers preparing a dialect profile with clear capability boundaries; and
|
|
88
|
+
- users who need an inspectable, source-faithful relational target for SPSS data.
|
|
89
|
+
|
|
90
|
+
## Trying the profile
|
|
91
|
+
|
|
92
|
+
Read the [SPSS profile](docs/spss-profile.md) and the [schema outline](sql/schema-outline.sql), then map a small unencrypted `.sav` or `.zsav` file to one dedicated wide table plus the catalog metadata. Preserve source case and variable order, retain raw values, and use the metadata tables to retain labels, missing-value rules, formats, and other dictionary semantics.
|
|
93
|
+
|
|
94
|
+
An implementation must publish its database dialect capabilities and reject any source dataset it cannot represent faithfully in one table. The [basic example](examples/basic-spss-mapping.md) illustrates the intended shape.
|
|
95
|
+
|
|
96
|
+
## Contribute and adopt
|
|
97
|
+
|
|
98
|
+
This profile welcomes real-world review. Implementers, statistical-data practitioners, and database maintainers are invited to test it against actual SPSS datasets and contribute findings, fixtures, dialect profiles, adapter support, or documentation improvements. Start with [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
99
|
+
|
|
100
|
+
The standard remains deliberately narrow: it defines a source-faithful relational representation, not a statistics engine, survey platform, harmonization system, or general data warehouse model.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Roadmap
|
|
2
|
+
|
|
3
|
+
This is a working to-do list for OpenStatSpec. Items below describe intended work, not promises of a release date or expanded scope.
|
|
4
|
+
|
|
5
|
+
## 1. Core SPSS relational specification
|
|
6
|
+
|
|
7
|
+
- [x] Complete the SPSS `.sav` and `.zsav` mapping rules for values, dictionary metadata, ordering, missing values, formats, attributes, documents, variable sets, and multiple-response sets.
|
|
8
|
+
- [x] Review the source-faithful wide-table contract for clarity and implementability.
|
|
9
|
+
- [x] Define the machine-readable fidelity-event and target-capability diagnostic fields.
|
|
10
|
+
- [ ] Review terminology and examples with statistical-data practitioners and adapter implementers.
|
|
11
|
+
|
|
12
|
+
## 2. Canonical fixtures and conformance tests
|
|
13
|
+
|
|
14
|
+
- [x] Create small lawful SPSS fixtures covering ordinary values and dictionary metadata.
|
|
15
|
+
- [x] Add edge-case fixtures for system-missing, user-missing values and ranges, strings, labels, formats, long names, and identifier collisions.
|
|
16
|
+
- [x] Define expected relational outcomes and semantic round-trip checks.
|
|
17
|
+
- [x] Publish conformance-test guidance for dialect profiles and adapters.
|
|
18
|
+
|
|
19
|
+
## 3. Reference adapters
|
|
20
|
+
|
|
21
|
+
Prerequisite: the core mapping and canonical fixtures are stable enough to test against.
|
|
22
|
+
|
|
23
|
+
- [x] Establish a Python reference-adapter repository that imports and exports the SPSS profile, reports fidelity events, and runs the canonical fixtures.
|
|
24
|
+
- [x] Establish a PHP reference-adapter repository with the same profile boundary and fixture expectations.
|
|
25
|
+
- [x] Document supported source features and declared database capabilities for each adapter.
|
|
26
|
+
|
|
27
|
+
## 4. CI, releases, and documentation
|
|
28
|
+
|
|
29
|
+
- [x] Add continuous checks for specification links, schema examples, fixtures, and adapter conformance once the relevant repositories exist.
|
|
30
|
+
- [x] Define versioning and compatibility guidance for the specification and profiles.
|
|
31
|
+
- [x] Publish release notes and tagged specification releases; `v0.2.0` is the
|
|
32
|
+
current public specification release.
|
|
33
|
+
- [ ] Expand implementation, dialect-profile, and adoption documentation from real adapter experience.
|
|
34
|
+
|
|
35
|
+
## 5. Future adapters
|
|
36
|
+
|
|
37
|
+
Prerequisite: the SPSS profile, fixtures, and reference-adapter lessons are mature.
|
|
38
|
+
|
|
39
|
+
- [ ] Assess separate source-faithful profiles and adapters for SAS, Stata, and other statistical packages.
|
|
40
|
+
- [ ] Do not begin a future adapter by broadening the relational contract; each profile must preserve the source package's native rectangular data model and declare its own fidelity boundary.
|
|
41
|
+
|
|
42
|
+
## 6. Optional SQL transformation workflow
|
|
43
|
+
|
|
44
|
+
- [x] Define an independent catalog for immutable SQL-derived datasets.
|
|
45
|
+
- [x] Define parameter binding, lineage, hashes, audit, metadata and weight
|
|
46
|
+
propagation, dialect boundaries, and atomic publication.
|
|
47
|
+
- [x] Add machine-readable positive and failure conformance cases.
|
|
48
|
+
- [ ] Run all cases in reference adapters before publishing profile 1.0.
|
|
49
|
+
|
|
50
|
+
## 7. Canonical transformation plans and syntax frontends
|
|
51
|
+
|
|
52
|
+
- [x] Define a language-neutral canonical plan for ordered recodes and variable
|
|
53
|
+
and value-label metadata operations.
|
|
54
|
+
- [x] Define a bounded SPSS-syntax frontend with stable diagnostics and
|
|
55
|
+
machine-readable conformance cases.
|
|
56
|
+
- [x] Define the in-place binding that preserves dataset/table identity on
|
|
57
|
+
supported SQL profiles and never creates an OpenStatSpec undo/copy layer.
|
|
58
|
+
- [ ] Run the in-place apply service matrix against every claimed SQL profile
|
|
59
|
+
before publishing execution claims.
|
|
60
|
+
- [ ] Evaluate additional language frontends as separate adapters that lower to
|
|
61
|
+
the same canonical plan.
|
|
62
|
+
|
|
63
|
+
## 8. Microsoft SQL Server dialect
|
|
64
|
+
|
|
65
|
+
Microsoft SQL Server is not currently supported. The
|
|
66
|
+
[MSSQL dialect roadmap](docs/mssql-dialect-roadmap.md) defines the future
|
|
67
|
+
scope without creating a capability claim.
|
|
68
|
+
|
|
69
|
+
- [ ] Select and pin Python and PHP driver stacks after fidelity and security evaluation.
|
|
70
|
+
- [ ] Define T-SQL types, quoting, catalog binding, identity probes and effective-limit preflight.
|
|
71
|
+
- [ ] Add exact cumulative-update CI services and complete conformance/fault-injection evidence.
|
|
72
|
+
- [ ] Publish an independent dialect profile only after both reference adapters pass the evidence gate.
|
|
73
|
+
- [ ] Evaluate Azure SQL identities separately; do not inherit a SQL Server claim implicitly.
|
|
74
|
+
|
|
75
|
+
## 9. Next release dependency order
|
|
76
|
+
|
|
77
|
+
The next release work must proceed in this order. Completion of an earlier
|
|
78
|
+
artifact is a dependency, not evidence that later adapter or service-matrix
|
|
79
|
+
work has passed.
|
|
80
|
+
|
|
81
|
+
1. [x] Merged Transformation Plan and SPSS Frontend profile 0.2 as
|
|
82
|
+
unreleased, release-candidate work for the planned specification `v0.3.0`.
|
|
83
|
+
2. [ ] Rebase Python `0.5.0` conditional transformations on the lifecycle
|
|
84
|
+
implementation, pin the final profile commit, and pass the combined service
|
|
85
|
+
and conformance gates before making an adapter claim.
|
|
86
|
+
3. [ ] Migrate PHP to the canonical transformation plan and pass the same
|
|
87
|
+
relevant conformance cases before it claims conditional profile 0.2 support.
|
|
88
|
+
4. [ ] Select the exact intended `v0.3.0` commit and require that
|
|
89
|
+
same commit to pass repository validation and all required reference-adapter
|
|
90
|
+
gates. Only after those gates pass and release-tag signing or protection is
|
|
91
|
+
configured, create a signed or protected `v0.3.0` tag on that commit.
|
|
92
|
+
Until then claims use `release_candidate`, a null release identifier, and
|
|
93
|
+
the exact tested commit.
|
|
94
|
+
|
|
95
|
+
The pending in-place service matrix and adapter conformance work in sections 6
|
|
96
|
+
and 7 remains required; implementation package publication does not complete
|
|
97
|
+
either evidence gate.
|
|
98
|
+
|
|
99
|
+
## Maintainer setup
|
|
100
|
+
|
|
101
|
+
These are maintainer actions, not implementation tasks for the specification repository itself.
|
|
102
|
+
|
|
103
|
+
- [x] Publish the OpenStatSpec Python distribution and establish its public PyPI
|
|
104
|
+
project. Published package releases establish the public project; they do not
|
|
105
|
+
by themselves re-verify owner security or the Trusted Publishing workflow.
|
|
106
|
+
- [ ] Re-verify secure PyPI/TestPyPI ownership and Trusted Publishing before the
|
|
107
|
+
next Python release workflow is relied on.
|
|
108
|
+
- [x] Register and publish the OpenStatSpec PHP package through Packagist. The
|
|
109
|
+
public package establishes the registry setup; repository update ownership
|
|
110
|
+
still needs release-process verification.
|
|
111
|
+
- [ ] Decide the release owner(s), tag naming convention, and release checklist for every repository.
|
|
112
|
+
- [ ] Protect the default branches and ensure release tags are created only by the agreed release workflow; `main` is currently unprotected.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Versioning and compatibility
|
|
2
|
+
|
|
3
|
+
OpenStatSpec uses semantic versioning for tagged specification releases.
|
|
4
|
+
|
|
5
|
+
- A major release may change normative relational semantics, required catalogue fields, conformance expectations, or the meaning of an existing requirement.
|
|
6
|
+
- A minor release may add backward-compatible optional metadata, a new independent source or SQL profile, or new fixtures that do not invalidate an implementation's existing declared conformance scope.
|
|
7
|
+
- A patch release may clarify wording, correct examples, or fix fixture and schema defects without changing normative meaning. A schema-defect correction may be backported to a published release series only when it restores the already-stated normative contract; it must not introduce new required behavior, broaden the accepted contract, or silently revise canonical artifacts.
|
|
8
|
+
|
|
9
|
+
Optional workflow profiles are versioned and claimed independently from the
|
|
10
|
+
core source profile. Adding or revising an optional profile does not authorize
|
|
11
|
+
changes to core datasets. A breaking workflow-profile change increments that
|
|
12
|
+
profile's major version even when the core version is unchanged.
|
|
13
|
+
|
|
14
|
+
Transformation Plan and frontend contracts are selected by their exact
|
|
15
|
+
contract identifiers. An implementation may support multiple versions
|
|
16
|
+
simultaneously. It MUST preserve the canonical bytes and hashes of accepted
|
|
17
|
+
older plans and MUST NOT silently reinterpret or rewrite an older plan under a
|
|
18
|
+
newer schema. A frontend that accepts a newer request contract but receives a
|
|
19
|
+
program entirely inside the 0.1 command subset emits the exact 0.1 plan
|
|
20
|
+
contract. Explicit recompilation to a newer plan is a new identified operation,
|
|
21
|
+
not migration of the old plan or audit row.
|
|
22
|
+
|
|
23
|
+
The SPSS SAV/ZSAV profile is versioned independently in its document and manifest. A conforming implementation must publish the exact profile version, immutable specification commit, specification status, supported directions, supported SQL profiles, and engine capability declaration it tested.
|
|
24
|
+
|
|
25
|
+
The immutable commit is mandatory for both release candidates and stable releases. `specification_release` is additive provenance, not an alternative to the commit:
|
|
26
|
+
|
|
27
|
+
- for untagged work on `main`, `specification_status` is `release_candidate` and `specification_release` is NULL;
|
|
28
|
+
- for a published tagged release candidate, `specification_status` remains `release_candidate` and `specification_release` is the exact prerelease identifier whose target is the declared commit; and
|
|
29
|
+
- for a published stable release, `specification_status` is `released` and `specification_release` is the exact release identifier whose target is the declared commit.
|
|
30
|
+
|
|
31
|
+
Development work on `main` is not a released standard. Release candidates may be used for interoperability testing but must be identified as such. A stable release is created only by a signed or protected tag after the repository validation and reference-adapter conformance gates pass.
|
|
32
|
+
|
|
33
|
+
A release-candidate tag is optional. An immutable commit is sufficient for CI and interoperability review. If maintainers publish a named release candidate, its protected or signed tag is recorded as `specification_release`, while the commit remains mandatory.
|
|
34
|
+
|
|
35
|
+
Adapter package versions are independent from specification versions. An adapter update that changes its declared conformance scope or fidelity behavior must document that change even when the specification version is unchanged.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Conformance fixture data: CC0-1.0
|
|
2
|
+
|
|
3
|
+
The generated `.sav` and `.zsav` fixture files in this directory are dedicated
|
|
4
|
+
to the public domain under [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/).
|
|
5
|
+
|
|
6
|
+
They contain synthetic test data only and must not contain any real respondents,
|
|
7
|
+
third-party datasets, or personal data.
|
|
8
|
+
|
|
9
|
+
The accompanying `generate-fixtures.sps` source is part of the OpenStatSpec
|
|
10
|
+
specification and follows the repository licence.
|