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.
Files changed (188) hide show
  1. openstatspec-0.7.0/.github/workflows/release.yml +204 -0
  2. {openstatspec-0.6.0 → openstatspec-0.7.0}/CHANGELOG.md +10 -0
  3. {openstatspec-0.6.0 → openstatspec-0.7.0}/PKG-INFO +3 -2
  4. {openstatspec-0.6.0 → openstatspec-0.7.0}/README.md +1 -0
  5. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/release-readiness.md +3 -1
  6. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/transformations.md +4 -3
  7. openstatspec-0.7.0/openstatspec-specification/.github/workflows/ci.yml +15 -0
  8. openstatspec-0.7.0/openstatspec-specification/.gitignore +2 -0
  9. openstatspec-0.7.0/openstatspec-specification/CHANGELOG.md +57 -0
  10. openstatspec-0.7.0/openstatspec-specification/CONTRIBUTING.md +28 -0
  11. openstatspec-0.7.0/openstatspec-specification/README.md +100 -0
  12. openstatspec-0.7.0/openstatspec-specification/ROADMAP.md +112 -0
  13. openstatspec-0.7.0/openstatspec-specification/VERSIONING.md +35 -0
  14. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/LICENSE.md +10 -0
  15. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/README.md +23 -0
  16. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
  17. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
  18. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +226 -0
  19. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  20. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
  21. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
  22. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
  23. openstatspec-0.7.0/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
  24. openstatspec-0.7.0/openstatspec-specification/conformance/in-place-transformation-0.1.json +147 -0
  25. openstatspec-0.7.0/openstatspec-specification/conformance/in-place-transformation-0.2.json +481 -0
  26. openstatspec-0.7.0/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +107 -0
  27. openstatspec-0.7.0/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +255 -0
  28. openstatspec-0.7.0/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +1106 -0
  29. openstatspec-0.7.0/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +1747 -0
  30. openstatspec-0.7.0/openstatspec-specification/conformance/transformation-plan-0.1.json +140 -0
  31. openstatspec-0.7.0/openstatspec-specification/conformance/transformation-plan-0.2.json +1104 -0
  32. openstatspec-0.7.0/openstatspec-specification/docs/architecture.md +61 -0
  33. openstatspec-0.7.0/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
  34. openstatspec-0.7.0/openstatspec-specification/docs/mssql-dialect-roadmap.md +85 -0
  35. openstatspec-0.7.0/openstatspec-specification/docs/spss-profile.md +45 -0
  36. openstatspec-0.7.0/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +82 -0
  37. openstatspec-0.7.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +76 -0
  38. openstatspec-0.7.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +132 -0
  39. openstatspec-0.7.0/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +314 -0
  40. openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-profile-0.1.md +108 -0
  41. openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-profile-0.2.md +127 -0
  42. openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +88 -0
  43. openstatspec-0.7.0/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +100 -0
  44. openstatspec-0.7.0/openstatspec-specification/examples/basic-spss-mapping.md +19 -0
  45. openstatspec-0.7.0/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +30 -0
  46. openstatspec-0.7.0/openstatspec-specification/examples/spss-syntax-transformation.md +31 -0
  47. openstatspec-0.7.0/openstatspec-specification/examples/sql-transformation-workflow.md +87 -0
  48. openstatspec-0.7.0/openstatspec-specification/sql/dialect-profile-baseline.json +233 -0
  49. openstatspec-0.7.0/openstatspec-specification/sql/dialect-profiles.md +202 -0
  50. openstatspec-0.7.0/openstatspec-specification/sql/profile-capabilities.md +45 -0
  51. openstatspec-0.7.0/openstatspec-specification/sql/schema-outline.sql +193 -0
  52. openstatspec-0.7.0/openstatspec-specification/sql/server-version-policy.md +72 -0
  53. openstatspec-0.7.0/openstatspec-specification/sql/transformation-plan-profile-schema.sql +45 -0
  54. openstatspec-0.7.0/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +209 -0
  55. openstatspec-0.7.0/openstatspec-specification/tools/validate_repository.py +934 -0
  56. openstatspec-0.7.0/openstatspec-specification/transformation/plan-0.1.schema.json +170 -0
  57. openstatspec-0.7.0/openstatspec-specification/transformation/plan-0.2.schema.json +139 -0
  58. openstatspec-0.7.0/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
  59. openstatspec-0.7.0/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
  60. openstatspec-0.7.0/openstatspec-specification-package/.github/workflows/ci.yml +22 -0
  61. openstatspec-0.7.0/openstatspec-specification-package/.github/workflows/publish.yml +108 -0
  62. openstatspec-0.7.0/openstatspec-specification-package/.gitignore +5 -0
  63. openstatspec-0.7.0/openstatspec-specification-package/CHANGELOG.md +72 -0
  64. openstatspec-0.7.0/openstatspec-specification-package/CONTRIBUTING.md +28 -0
  65. openstatspec-0.7.0/openstatspec-specification-package/README.md +107 -0
  66. openstatspec-0.7.0/openstatspec-specification-package/RELEASING.md +60 -0
  67. openstatspec-0.7.0/openstatspec-specification-package/ROADMAP.md +134 -0
  68. openstatspec-0.7.0/openstatspec-specification-package/VERSIONING.md +35 -0
  69. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/LICENSE.md +10 -0
  70. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/README.md +23 -0
  71. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
  72. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
  73. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +226 -0
  74. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  75. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
  76. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
  77. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
  78. openstatspec-0.7.0/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
  79. openstatspec-0.7.0/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +147 -0
  80. openstatspec-0.7.0/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +481 -0
  81. openstatspec-0.7.0/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +107 -0
  82. openstatspec-0.7.0/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +255 -0
  83. openstatspec-0.7.0/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +1106 -0
  84. openstatspec-0.7.0/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +1747 -0
  85. openstatspec-0.7.0/openstatspec-specification-package/conformance/transformation-plan-0.1.json +140 -0
  86. openstatspec-0.7.0/openstatspec-specification-package/conformance/transformation-plan-0.2.json +1104 -0
  87. openstatspec-0.7.0/openstatspec-specification-package/docs/architecture.md +61 -0
  88. openstatspec-0.7.0/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
  89. openstatspec-0.7.0/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +85 -0
  90. openstatspec-0.7.0/openstatspec-specification-package/docs/spss-profile.md +45 -0
  91. openstatspec-0.7.0/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +82 -0
  92. openstatspec-0.7.0/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +76 -0
  93. openstatspec-0.7.0/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +132 -0
  94. openstatspec-0.7.0/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +314 -0
  95. openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +108 -0
  96. openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +127 -0
  97. openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +88 -0
  98. openstatspec-0.7.0/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +100 -0
  99. openstatspec-0.7.0/openstatspec-specification-package/examples/basic-spss-mapping.md +19 -0
  100. openstatspec-0.7.0/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +30 -0
  101. openstatspec-0.7.0/openstatspec-specification-package/examples/spss-syntax-transformation.md +31 -0
  102. openstatspec-0.7.0/openstatspec-specification-package/examples/sql-transformation-workflow.md +87 -0
  103. openstatspec-0.7.0/openstatspec-specification-package/pyproject.toml +21 -0
  104. openstatspec-0.7.0/openstatspec-specification-package/sql/dialect-profile-baseline.json +1224 -0
  105. openstatspec-0.7.0/openstatspec-specification-package/sql/dialect-profiles.md +273 -0
  106. openstatspec-0.7.0/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +61 -0
  107. openstatspec-0.7.0/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +33 -0
  108. openstatspec-0.7.0/openstatspec-specification-package/sql/profile-capabilities.md +55 -0
  109. openstatspec-0.7.0/openstatspec-specification-package/sql/schema-outline.sql +193 -0
  110. openstatspec-0.7.0/openstatspec-specification-package/sql/server-version-policy.md +72 -0
  111. openstatspec-0.7.0/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +45 -0
  112. openstatspec-0.7.0/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +209 -0
  113. openstatspec-0.7.0/openstatspec-specification-package/src/openstatspec_specification/__init__.py +19 -0
  114. openstatspec-0.7.0/openstatspec-specification-package/src/openstatspec_specification/dolt.py +1966 -0
  115. openstatspec-0.7.0/openstatspec-specification-package/tests/test_dolt_declarations.py +370 -0
  116. openstatspec-0.7.0/openstatspec-specification-package/tools/validate_repository.py +145 -0
  117. openstatspec-0.7.0/openstatspec-specification-package/transformation/plan-0.1.schema.json +170 -0
  118. openstatspec-0.7.0/openstatspec-specification-package/transformation/plan-0.2.schema.json +139 -0
  119. openstatspec-0.7.0/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
  120. openstatspec-0.7.0/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
  121. {openstatspec-0.6.0 → openstatspec-0.7.0}/pyproject.toml +1 -1
  122. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/validation.py +12 -1
  123. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_transform_frontend.py +10 -0
  124. openstatspec-0.6.0/.github/workflows/release.yml +0 -85
  125. {openstatspec-0.6.0 → openstatspec-0.7.0}/.github/verify_release_ref.py +0 -0
  126. {openstatspec-0.6.0 → openstatspec-0.7.0}/.github/workflows/ci.yml +0 -0
  127. {openstatspec-0.6.0 → openstatspec-0.7.0}/.gitignore +0 -0
  128. {openstatspec-0.6.0 → openstatspec-0.7.0}/THIRD_PARTY_NOTICES.md +0 -0
  129. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/architecture.md +0 -0
  130. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/in-place-transformation.md +0 -0
  131. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/pyspssio-spike.md +0 -0
  132. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/sav-profile.md +0 -0
  133. {openstatspec-0.6.0 → openstatspec-0.7.0}/docs/sql-transformation-workflow.md +0 -0
  134. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/__init__.py +0 -0
  135. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/api.py +0 -0
  136. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/cli.py +0 -0
  137. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/core/__init__.py +0 -0
  138. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/core/results.py +0 -0
  139. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/__init__.py +0 -0
  140. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/sas/.gitkeep +0 -0
  141. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/__init__.py +0 -0
  142. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/binding.py +0 -0
  143. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/compiler.py +0 -0
  144. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/execution.py +0 -0
  145. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/spss/syntax.py +0 -0
  146. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/frontends/stata/.gitkeep +0 -0
  147. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/__init__.py +0 -0
  148. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/dictionary.py +0 -0
  149. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/raw_dictionary.py +0 -0
  150. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/spss/sav.py +0 -0
  151. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/__init__.py +0 -0
  152. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/capabilities.py +0 -0
  153. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/catalog_api.py +0 -0
  154. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/catalog_verification.py +0 -0
  155. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/database_urls.py +0 -0
  156. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/dolt_conformance.py +0 -0
  157. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/inplace_transform.py +0 -0
  158. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/normative.py +0 -0
  159. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/profiles.py +0 -0
  160. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/wide.py +0 -0
  161. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/sql/workflow.py +0 -0
  162. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/__init__.py +0 -0
  163. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/errors.py +0 -0
  164. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/plan.py +0 -0
  165. {openstatspec-0.6.0 → openstatspec-0.7.0}/src/openstatspec/transform/schema.py +0 -0
  166. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/conformance.py +0 -0
  167. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_atomic_import.py +0 -0
  168. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_attribute_catalog.py +0 -0
  169. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_catalog_lifecycle.py +0 -0
  170. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_catalog_persistence_review.py +0 -0
  171. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_cli.py +0 -0
  172. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_conditional_inplace_transform.py +0 -0
  173. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_document_round_trip.py +0 -0
  174. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_dolt_conformance.py +0 -0
  175. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_inplace_transform.py +0 -0
  176. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_loss_reports.py +0 -0
  177. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_normative_catalog.py +0 -0
  178. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_official_conformance.py +0 -0
  179. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_pyspssio_catalog_authority.py +0 -0
  180. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_release_ref.py +0 -0
  181. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_review_transaction_boundary.py +0 -0
  182. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sav_sqlite.py +0 -0
  183. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_spss_catalog_preflight.py +0 -0
  184. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sql_profiles.py +0 -0
  185. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sql_services.py +0 -0
  186. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_sql_workflow.py +0 -0
  187. {openstatspec-0.6.0 → openstatspec-0.7.0}/tests/test_strict_catalog_review.py +0 -0
  188. {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.4
1
+ Metadata-Version: 2.5
2
2
  Name: openstatspec
3
- Version: 0.6.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.5.0 release readiness
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 `RECODE`, sequential
8
- `COMPUTE` and `IF`, `VARIABLE LABELS`, `VALUE LABELS`, numeric `FORMATS`,
9
- `VARIABLE LEVEL`, and `EXECUTE`. Predicates support typed variable/literal
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,15 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ specification:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v7
12
+ - uses: actions/setup-python@v7
13
+ with:
14
+ python-version: "3.13"
15
+ - run: python tools/validate_repository.py
@@ -0,0 +1,2 @@
1
+ __pycache__/
2
+ *.py[cod]
@@ -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.