openstatspec 0.8.0__tar.gz → 0.9.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 (212) hide show
  1. {openstatspec-0.8.0 → openstatspec-0.9.0}/CHANGELOG.md +69 -2
  2. {openstatspec-0.8.0 → openstatspec-0.9.0}/PKG-INFO +14 -4
  3. {openstatspec-0.8.0 → openstatspec-0.9.0}/README.md +13 -3
  4. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/release-readiness.md +98 -8
  5. openstatspec-0.9.0/docs/transformations.md +460 -0
  6. {openstatspec-0.8.0 → openstatspec-0.9.0}/pyproject.toml +1 -1
  7. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/__init__.py +2 -2
  8. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/api.py +3 -1
  9. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/spss/__init__.py +4 -0
  10. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/spss/binding.py +64 -11
  11. openstatspec-0.9.0/src/openstatspec/frontends/spss/compiler.py +137 -0
  12. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/spss/execution.py +3 -1
  13. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/spss/syntax.py +138 -44
  14. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/spss/sav.py +12 -10
  15. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/inplace_transform.py +76 -17
  16. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/wide.py +181 -151
  17. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/workflow.py +79 -79
  18. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/transform/plan.py +14 -6
  19. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/transform/schema.py +4 -2
  20. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/transform/validation.py +32 -41
  21. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_atomic_import.py +117 -0
  22. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_cli.py +1 -1
  23. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_conditional_inplace_transform.py +95 -0
  24. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_dolt_conformance.py +9 -14
  25. openstatspec-0.9.0/tests/test_frontend_v03.py +227 -0
  26. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_inplace_transform.py +558 -13
  27. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_read_only_export.py +211 -7
  28. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_sql_services.py +232 -1
  29. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_sql_workflow.py +50 -0
  30. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_transform_frontend.py +146 -12
  31. openstatspec-0.8.0/docs/transformations.md +0 -219
  32. openstatspec-0.8.0/src/openstatspec/frontends/spss/compiler.py +0 -64
  33. {openstatspec-0.8.0 → openstatspec-0.9.0}/.github/verify_release_ref.py +0 -0
  34. {openstatspec-0.8.0 → openstatspec-0.9.0}/.github/workflows/ci.yml +0 -0
  35. {openstatspec-0.8.0 → openstatspec-0.9.0}/.github/workflows/release.yml +0 -0
  36. {openstatspec-0.8.0 → openstatspec-0.9.0}/.gitignore +0 -0
  37. {openstatspec-0.8.0 → openstatspec-0.9.0}/THIRD_PARTY_NOTICES.md +0 -0
  38. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/architecture.md +0 -0
  39. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/in-place-transformation.md +0 -0
  40. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/pyspssio-spike.md +0 -0
  41. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/sav-profile.md +0 -0
  42. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/sql-transformation-workflow.md +0 -0
  43. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/superpowers/plans/2026-08-12-python-v071-stable-pin.md +0 -0
  44. {openstatspec-0.8.0 → openstatspec-0.9.0}/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md +0 -0
  45. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/.github/workflows/ci.yml +0 -0
  46. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/.github/workflows/release.yml +0 -0
  47. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/.gitignore +0 -0
  48. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/CHANGELOG.md +0 -0
  49. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/CONTRIBUTING.md +0 -0
  50. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/README.md +0 -0
  51. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/RELEASING.md +0 -0
  52. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/ROADMAP.md +0 -0
  53. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/VERSIONING.md +0 -0
  54. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/LICENSE.md +0 -0
  55. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/README.md +0 -0
  56. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
  57. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
  58. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +0 -0
  59. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  60. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
  61. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
  62. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
  63. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
  64. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/in-place-transformation-0.1.json +0 -0
  65. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/in-place-transformation-0.2.json +0 -0
  66. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +0 -0
  67. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +0 -0
  68. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +0 -0
  69. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.3.json +0 -0
  70. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +0 -0
  71. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/transformation-plan-0.1.json +0 -0
  72. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/conformance/transformation-plan-0.2.json +0 -0
  73. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/architecture.md +0 -0
  74. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/database-io-policy-v1.md +0 -0
  75. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +0 -0
  76. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/mssql-dialect-roadmap.md +0 -0
  77. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/spss-frontend-roadmap.md +0 -0
  78. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/spss-profile.md +0 -0
  79. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +0 -0
  80. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +0 -0
  81. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +0 -0
  82. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.3.md +0 -0
  83. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +0 -0
  84. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/superpowers/plans/2026-08-12-roadmap-v030-bookkeeping.md +0 -0
  85. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/superpowers/plans/2026-08-21-spss-frontend-03.md +0 -0
  86. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/superpowers/specs/2026-08-21-spss-frontend-expansion-design.md +0 -0
  87. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/transformation-plan-profile-0.1.md +0 -0
  88. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/transformation-plan-profile-0.2.md +0 -0
  89. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +0 -0
  90. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +0 -0
  91. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/examples/basic-spss-mapping.md +0 -0
  92. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +0 -0
  93. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/examples/spss-syntax-transformation-0.3.md +0 -0
  94. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/examples/spss-syntax-transformation.md +0 -0
  95. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/examples/sql-transformation-workflow.md +0 -0
  96. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/pyproject.toml +0 -0
  97. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/dialect-profile-baseline.json +0 -0
  98. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/dialect-profiles.md +0 -0
  99. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/dolt-adapter-declaration-schema.json +0 -0
  100. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/dolt-adapter-declarations/README.md +0 -0
  101. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/profile-capabilities.md +0 -0
  102. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/schema-outline.sql +0 -0
  103. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/server-version-policy.md +0 -0
  104. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/transformation-plan-profile-schema.sql +0 -0
  105. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +0 -0
  106. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/src/openstatspec_specification/__init__.py +0 -0
  107. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/src/openstatspec_specification/artifacts.py +0 -0
  108. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/src/openstatspec_specification/dolt.py +0 -0
  109. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/tests/test_contract_artifacts.py +0 -0
  110. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/tests/test_dolt_declarations.py +0 -0
  111. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/tools/validate_repository.py +0 -0
  112. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/transformation/plan-0.1.schema.json +0 -0
  113. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/transformation/plan-0.2.schema.json +0 -0
  114. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
  115. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
  116. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.3.schema.json +0 -0
  117. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/.github/workflows/ci.yml +0 -0
  118. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/.github/workflows/publish.yml +0 -0
  119. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/.gitignore +0 -0
  120. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/CHANGELOG.md +0 -0
  121. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/CONTRIBUTING.md +0 -0
  122. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/README.md +0 -0
  123. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/RELEASING.md +0 -0
  124. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/ROADMAP.md +0 -0
  125. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/VERSIONING.md +0 -0
  126. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/LICENSE.md +0 -0
  127. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/README.md +0 -0
  128. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
  129. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
  130. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +0 -0
  131. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  132. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
  133. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
  134. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
  135. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
  136. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +0 -0
  137. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +0 -0
  138. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +0 -0
  139. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +0 -0
  140. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +0 -0
  141. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +0 -0
  142. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/transformation-plan-0.1.json +0 -0
  143. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/conformance/transformation-plan-0.2.json +0 -0
  144. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/architecture.md +0 -0
  145. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +0 -0
  146. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +0 -0
  147. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/spss-profile.md +0 -0
  148. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +0 -0
  149. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +0 -0
  150. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +0 -0
  151. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +0 -0
  152. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +0 -0
  153. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +0 -0
  154. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +0 -0
  155. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +0 -0
  156. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/examples/basic-spss-mapping.md +0 -0
  157. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +0 -0
  158. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/examples/spss-syntax-transformation.md +0 -0
  159. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/examples/sql-transformation-workflow.md +0 -0
  160. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/pyproject.toml +0 -0
  161. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/dialect-profile-baseline.json +0 -0
  162. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/dialect-profiles.md +0 -0
  163. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +0 -0
  164. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +0 -0
  165. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/profile-capabilities.md +0 -0
  166. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/schema-outline.sql +0 -0
  167. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/server-version-policy.md +0 -0
  168. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +0 -0
  169. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +0 -0
  170. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/src/openstatspec_specification/__init__.py +0 -0
  171. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/src/openstatspec_specification/dolt.py +0 -0
  172. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/tests/test_dolt_declarations.py +0 -0
  173. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/tools/validate_repository.py +0 -0
  174. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/transformation/plan-0.1.schema.json +0 -0
  175. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/transformation/plan-0.2.schema.json +0 -0
  176. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
  177. {openstatspec-0.8.0 → openstatspec-0.9.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
  178. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/cli.py +0 -0
  179. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/core/__init__.py +0 -0
  180. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/core/results.py +0 -0
  181. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/__init__.py +0 -0
  182. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/sas/.gitkeep +0 -0
  183. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/frontends/stata/.gitkeep +0 -0
  184. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/spss/__init__.py +0 -0
  185. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/spss/dictionary.py +0 -0
  186. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/spss/raw_dictionary.py +0 -0
  187. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/__init__.py +0 -0
  188. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/capabilities.py +0 -0
  189. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/catalog_api.py +0 -0
  190. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/catalog_verification.py +0 -0
  191. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/database_urls.py +0 -0
  192. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/dolt_conformance.py +0 -0
  193. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/normative.py +0 -0
  194. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/sql/profiles.py +0 -0
  195. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/transform/__init__.py +0 -0
  196. {openstatspec-0.8.0 → openstatspec-0.9.0}/src/openstatspec/transform/errors.py +0 -0
  197. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/conformance.py +0 -0
  198. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_attribute_catalog.py +0 -0
  199. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_catalog_lifecycle.py +0 -0
  200. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_catalog_persistence_review.py +0 -0
  201. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_document_round_trip.py +0 -0
  202. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_loss_reports.py +0 -0
  203. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_normative_catalog.py +0 -0
  204. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_official_conformance.py +0 -0
  205. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_pyspssio_catalog_authority.py +0 -0
  206. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_release_ref.py +0 -0
  207. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_review_transaction_boundary.py +0 -0
  208. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_sav_sqlite.py +0 -0
  209. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_spss_catalog_preflight.py +0 -0
  210. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_sql_profiles.py +0 -0
  211. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_strict_catalog_review.py +0 -0
  212. {openstatspec-0.8.0 → openstatspec-0.9.0}/tests/test_vls_compatible_names.py +0 -0
@@ -2,9 +2,76 @@
2
2
 
3
3
  All notable changes to this reference implementation are documented here.
4
4
 
5
- ## Unreleased
5
+ ## 0.9.0 - 2026-09-10
6
6
 
7
- _No unreleased changes._
7
+ This minor release adds the explicitly selected optional official SPSS Frontend
8
+ 0.3 and changes emitted Python schema-extension identifiers. Older readers cannot
9
+ load the new IDs; upgrade consumers before using new compiler output.
10
+
11
+ ### Added
12
+
13
+ - Implement explicitly selected official SPSS Frontend 0.3 over unchanged
14
+ Plan 0.1/0.2 through the shared parser/binder, with a strict
15
+ `compile_spss_request` boundary and opt-in live apply provenance. Support
16
+ comments, dictionary-order `TO`, grouped commands, finite open RECODE ranges,
17
+ additive ordered typed labels, inequality aliases, and canonical NOT lowering.
18
+ Precedence is comparisons → NOT → AND → OR; parentheses override it.
19
+ Tests cover all 90 effective normative cases plus request boundaries and
20
+ in-place SQLite identity/metadata/audit/no-artifact checks. Default APIs and
21
+ Python extension support/rejections remain unchanged.
22
+
23
+ ### Fixed
24
+
25
+ - Namespace new Python schema-change plans and SPSS output as
26
+ `openstatspec-python-schema-change-plan-v0.1` and
27
+ `openstatspec-python-schema-change-spss-v0.1`, retaining exported constant names.
28
+ The former `openstatspec-transformation-plan-v0.3` remains accepted as a
29
+ legacy Python extension with unchanged semantics, canonical JSON, and hashes;
30
+ stored audits are not migrated. New compilation changes schema-plan hashes.
31
+ - Clarify that specification `v0.5.0` has no official Plan 0.3. Its syntax-only
32
+ Frontend 0.3 over Plan 0.1/0.2 is separate from Python schema extensions.
33
+ Legacy acceptance and Python extension tests do not claim official conformance.
34
+ See [compatibility and migration](docs/transformations.md#contract-ownership-and-legacy-compatibility).
35
+
36
+ The specification remains pinned to released `v0.5.0` at exact commit
37
+ `864e84479f554b8ee250ffed44c4dfb963750d4a`; the required SPSS codec remains
38
+ `openstatspec-pyspssio==0.5.1.post2`. No catalog migration, dependency change,
39
+ new database support, or optional Transformation Workflow 0.3 implementation
40
+ is included.
41
+
42
+ ## 0.8.1 - 2026-09-10
43
+
44
+ ### Fixed
45
+
46
+ - Preserve other variables' shared value labels when replacing one variable's
47
+ labels. Reject deletion of variables referenced by published derived lineage
48
+ before any plan mutation, with `variable_has_dependents`.
49
+ - Enable and verify SQLite foreign keys on in-place apply connections.
50
+ - Read export values, dictionary metadata, import fidelity events and validation
51
+ reflection from one native database snapshot; close it before writing SAV/ZSAV.
52
+ - Scope transformation label reads to the target variable's dataset. Unrelated
53
+ malformed labels no longer fail the operation; malformed target-linked labels
54
+ still fail, and shared/foreign-owned linked label sets remain supported.
55
+
56
+ ### Performance
57
+
58
+ - Remove quadratic suffix/name scans from canonical-plan binding and reuse one
59
+ canonical plan encoding/hash per public canonical or SPSS apply.
60
+ - Remove redundant full case-row dictionary collections from database reads and
61
+ imports. Results remain buffered; this is not a streaming API.
62
+ - Avoid the discarded core relation hash during SQLite workflow registration,
63
+ retaining physical projection validation and derived-parent integrity checks.
64
+ Execution-time hashes remain required; their loop avoids a redundant tuple copy.
65
+
66
+ ### Documentation and cleanup
67
+
68
+ - Document numeric create/replace, RECODE and separately provisioned target
69
+ recipes, with bounded local SQLite measurements in the transformations manual.
70
+ - Remove an unreachable view-creation branch; workflow output remains
71
+ materialized-only.
72
+
73
+ The specification pin, engine dependency, database/profile claims, catalog schema,
74
+ public call signatures and Dolt-owned versioning policy remain unchanged.
8
75
 
9
76
  ## 0.8.0 - 2026-09-07
10
77
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openstatspec
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: Reference adapter for the OpenStatSpec relational contract
5
5
  Author: OpenStatSpec
6
6
  License: Apache-2.0
@@ -23,10 +23,11 @@ The reference Python implementation of the OpenStatSpec specification.
23
23
 
24
24
  This package implements the specification; it does not define or extend it.
25
25
  The normative model lives in the `OpenStatSpec/specification` repository.
26
- Python 0.8.0 pins released specification `v0.5.0` at
26
+ Python 0.9.0 pins released specification `v0.5.0` at
27
27
  `864e84479f554b8ee250ffed44c4dfb963750d4a` and selects SAV/ZSAV 1.0 with
28
- `database_io_policy=openstatspec-database-io-v1`. This does not claim
29
- implementation of the optional Transformation Workflow 0.3 profile.
28
+ `database_io_policy=openstatspec-database-io-v1`. It implements the explicitly
29
+ selected optional official SPSS Frontend 0.3 over unchanged Plan 0.1/0.2, not
30
+ the separate optional Transformation Workflow 0.3 profile.
30
31
 
31
32
  ## Boundaries
32
33
 
@@ -105,6 +106,15 @@ target before assignment. Dolt requires the caller's exact clean branch/HEAD,
105
106
  leaves success as an inspectable working-set diff, and never calls
106
107
  `DOLT_COMMIT`.
107
108
 
109
+ Explicitly select official Frontend 0.3 with `compile_spss_request`, or pass
110
+ `frontend_contract="openstatspec-spss-syntax-frontend-v0.3"` to the typed compiler
111
+ or in-place API. Default APIs and the CLI retain their compatibility behavior;
112
+ `STRING` and `DELETE VARIABLES` remain Python extensions, not official 0.3.
113
+ New schema-changing output uses Python-owned IDs that older readers cannot load.
114
+ Upgrade consumers first; legacy plans retain their canonical JSON and hashes,
115
+ and stored audits are not migrated. Recompiling schema-changing syntax changes
116
+ its plan hash. See [compatibility and migration](docs/transformations.md#contract-ownership-and-legacy-compatibility).
117
+
108
118
  See the [dataset transformations manual](docs/transformations.md) for schema
109
119
  installation, Python and CLI surfaces, database invariants, audit provenance,
110
120
  package layout, and extension guidance. Stata and SAS are unimplemented
@@ -4,10 +4,11 @@ The reference Python implementation of the OpenStatSpec specification.
4
4
 
5
5
  This package implements the specification; it does not define or extend it.
6
6
  The normative model lives in the `OpenStatSpec/specification` repository.
7
- Python 0.8.0 pins released specification `v0.5.0` at
7
+ Python 0.9.0 pins released specification `v0.5.0` at
8
8
  `864e84479f554b8ee250ffed44c4dfb963750d4a` and selects SAV/ZSAV 1.0 with
9
- `database_io_policy=openstatspec-database-io-v1`. This does not claim
10
- implementation of the optional Transformation Workflow 0.3 profile.
9
+ `database_io_policy=openstatspec-database-io-v1`. It implements the explicitly
10
+ selected optional official SPSS Frontend 0.3 over unchanged Plan 0.1/0.2, not
11
+ the separate optional Transformation Workflow 0.3 profile.
11
12
 
12
13
  ## Boundaries
13
14
 
@@ -86,6 +87,15 @@ target before assignment. Dolt requires the caller's exact clean branch/HEAD,
86
87
  leaves success as an inspectable working-set diff, and never calls
87
88
  `DOLT_COMMIT`.
88
89
 
90
+ Explicitly select official Frontend 0.3 with `compile_spss_request`, or pass
91
+ `frontend_contract="openstatspec-spss-syntax-frontend-v0.3"` to the typed compiler
92
+ or in-place API. Default APIs and the CLI retain their compatibility behavior;
93
+ `STRING` and `DELETE VARIABLES` remain Python extensions, not official 0.3.
94
+ New schema-changing output uses Python-owned IDs that older readers cannot load.
95
+ Upgrade consumers first; legacy plans retain their canonical JSON and hashes,
96
+ and stored audits are not migrated. Recompiling schema-changing syntax changes
97
+ its plan hash. See [compatibility and migration](docs/transformations.md#contract-ownership-and-legacy-compatibility).
98
+
89
99
  See the [dataset transformations manual](docs/transformations.md) for schema
90
100
  installation, Python and CLI surfaces, database invariants, audit provenance,
91
101
  package layout, and extension guidance. Stata and SAS are unimplemented
@@ -1,8 +1,23 @@
1
- # 0.8.0 release readiness
1
+ # 0.9.0 release readiness
2
2
 
3
3
  This page records the expected release contract, not a publication event.
4
4
  Creating a version tag remains a separate maintainer action.
5
5
 
6
+ ## Minor release scope
7
+
8
+ Version 0.9.0, dated 2026-09-10, adds explicitly selected official SPSS Frontend
9
+ 0.3 over unchanged Plan 0.1/0.2 and namespaces new Python schema-extension
10
+ output, as described in the [release notes](../CHANGELOG.md). The minor bump
11
+ reflects the optional frontend and old-reader incompatibility: upgrade consumers
12
+ before emitting the new Python IDs. Legacy plans retain their canonical JSON,
13
+ hashes and semantics; stored audits are not migrated. Recompiling schema-changing
14
+ syntax changes its plan hash. See [compatibility and migration](transformations.md#contract-ownership-and-legacy-compatibility).
15
+ There is no catalog migration, dependency change, new database support or
16
+ specification pin update. The required codec remains
17
+ `openstatspec-pyspssio==0.5.1.post2`.
18
+ The local 0.8.0/0.8.1 evidence below is historical, not verification of 0.9.0.
19
+ Re-run the gates below on the exact selected 0.9.0 release commit.
20
+
6
21
  The release selects SAV/ZSAV 1.0 with the optional Database I/O Execution
7
22
  Policy `openstatspec-database-io-v1`. Reads and exports, including failures,
8
23
  write no database audit records; export results omit `operation_id` and return
@@ -69,11 +84,24 @@ machine-readable loss report with the export result.
69
84
 
70
85
  The canonical transformation core and SPSS syntax frontend are separate public
71
86
  surfaces. A release must run the specification-owned canonical-plan and SPSS
72
- frontend conformance fixtures, then exercise both the generic plan apply API
73
- and the SPSS compatibility apply path.
87
+ frontend conformance fixtures, including `tests/test_frontend_v03.py` with all
88
+ 90 effective official Frontend 0.3 cases (35 declared plus inherited cases with
89
+ published overrides/supersessions) from exact specification commit
90
+ `864e84479f554b8ee250ffed44c4dfb963750d4a`. Then exercise the generic plan apply
91
+ API, SPSS compatibility apply path, and explicitly selected official 0.3 apply.
92
+ Python schema-extension and legacy acceptance tests are separate compatibility
93
+ evidence, not official Plan 0.3 conformance; no official Plan 0.3 exists.
74
94
 
75
95
  The gate must prove that:
76
96
 
97
+ - official Frontend 0.3 requests preserve exact Plan 0.1/0.2 objects and hashes,
98
+ source hashes, diagnostics and declared metadata across all 90 effective cases;
99
+ - strict request boundaries reject invalid input, default API/CLI support and
100
+ rejections remain unchanged, and official 0.3 rejects Python schema extensions;
101
+ - explicit official 0.3 SQLite apply preserves data/metadata semantics, dataset
102
+ and table identity, audit provenance and the no-copy/no-history boundary;
103
+ - new Python schema-extension IDs are emitted while legacy plans preserve their
104
+ canonical JSON, hashes and supplied identifiers without rewriting audits;
77
105
  - a TransformationPlan object and its strict JSON mapping produce the same
78
106
  plan hash and in-place result;
79
107
  - the exact bounded `COMPUTE`/`IF` program compiles to all seven ordered
@@ -104,7 +132,7 @@ The gate must prove that:
104
132
  neither HEAD nor branch and never commits or resets; state is rechecked after
105
133
  the dataset lock and success must leave an inspectable working-set diff;
106
134
  other supported SQL connections remain allowed; and
107
- - string comparisons and v0.2 string assignments fail closed until exact
135
+ - string comparisons and v0.2 string assignments remain fail-closed.
108
136
 
109
137
  The built wheel must contain the generic openstatspec.transform modules and the
110
138
  implemented openstatspec.frontends.spss package. Stata and SAS remain empty
@@ -156,12 +184,60 @@ of exact `864e84479f554b8ee250ffed44c4dfb963750d4a`):
156
184
  Other database services were not configured locally. This is local evidence,
157
185
  not a claim that the updated remote CI or release publication has completed.
158
186
 
159
- ## Maintainer checks before tagging
187
+ ## 0.8.1 local preparation verification
188
+
189
+ On Python 3.13.2 with SQLAlchemy 2.0.52 and the exact v0.5.0 specification
190
+ checkout, without configured database services:
191
+
192
+ - `python -m pytest -p no:cacheprovider -m 'not services'`: **414 passed,
193
+ 9 skipped, 53 deselected**. The release-ref guard tests also passed (**5**).
194
+ - `compileall`, `git diff --check`, wheel/sdist build and `twine check` passed.
195
+ - A clean wheel install outside the checkout resolved the required engine
196
+ `openstatspec-pyspssio==0.5.1.post2` from PyPI. Installed capabilities reported
197
+ 0.8.1, released specification v0.5.0 at the expected commit, and the selected
198
+ database I/O policy. Core, SPSS frontend and legacy compiler re-exports loaded
199
+ from `site-packages` without a source-path override.
200
+
201
+ This is local candidate evidence, not final release-commit service CI or
202
+ publication evidence. No v0.8.1 tag or registry upload was made by these checks.
203
+
204
+ ## 0.9.0 local preparation verification
205
+
206
+ Using `../python-release-081/.venv/bin/python` (Python 3.13.2), with
207
+ `PYTHONPATH=src` and
208
+ `OPENSTATSPEC_SPECIFICATION_DIR=/tmp/openstatspec-alignment-spec` at exact
209
+ `864e84479f554b8ee250ffed44c4dfb963750d4a`:
210
+
211
+ - The updated capability version assertion failed first on 0.8.1, then passed
212
+ on 0.9.0. Focused capability, release-ref and `test_frontend_v03.py` checks:
213
+ **169 passed**, including all **90 effective** official cases.
214
+ - `python -m pytest -p no:cacheprovider -m 'not services' -ra`:
215
+ **590 passed, 9 skipped, 55 deselected**. The skips require a live Dolt admin;
216
+ no database services were configured for this run.
217
+ - `python -m compileall -q src tests .github/verify_release_ref.py` and
218
+ `git diff --check` passed.
219
+ - `python -m build --outdir /tmp/openstatspec-v090-yhklqZ/dist .` and
220
+ `python -m twine check /tmp/openstatspec-v090-yhklqZ/dist/*` passed for the
221
+ 0.9.0 wheel and sdist.
222
+ - A fresh `/tmp/openstatspec-v090-yhklqZ/venv` installed that wheel with
223
+ dependencies from PyPI, including unchanged `openstatspec-pyspssio==0.5.1.post2`.
224
+ From `/tmp` with `PYTHONPATH` unset, CLI/API capabilities agreed on 0.9.0,
225
+ released v0.5.0 at the exact pin, and the database I/O policy. Core, frontend,
226
+ legacy compiler re-exports and codec imports came from `site-packages`.
227
+ An explicit official 0.3 comment/open-range RECODE request compiled to Plan
228
+ 0.1 without a database connection.
229
+
230
+ This is local preparation evidence, not final release-commit service CI or
231
+ publication evidence. No push, PR, tag or publication was performed.
232
+
233
+ ## Maintainer release checklist
160
234
 
161
235
  1. Publish the pinned `openstatspec-pyspssio==0.5.1.post2` engine distribution
162
236
  first and confirm that a clean environment can download it from PyPI. The
163
237
  main package has no fallback SPSS engine.
164
- 2. Run `python -m pytest -m "not services"`.
238
+ 2. Run `python -m pytest -m "not services"`, including the 90 effective official
239
+ Frontend 0.3 cases in `tests/test_frontend_v03.py` and existing canonical-plan,
240
+ frontend, legacy compatibility and in-place suites.
165
241
  3. Confirm the GitHub Actions matrix is green for exact PostgreSQL 17.10/18.4,
166
242
  MySQL 8.4.11/9.7.2, MariaDB 11.4.12/11.8.8/12.3.2, and exact Dolt
167
243
  2.2.2/2.2.3 service evidence from the immutable image pins in CI. The Dolt
@@ -179,14 +255,28 @@ not a claim that the updated remote CI or release publication has completed.
179
255
  4. Build with `python -m build` and install the generated wheel in a clean
180
256
  environment, resolving `openstatspec-pyspssio==0.5.1.post2` from PyPI.
181
257
  Run the installed CLI outside the source checkout with `PYTHONPATH` unset;
182
- verify adapter version `0.8.0` and the selected database I/O policy.
258
+ verify adapter version `0.9.0`, the selected database I/O policy, public and
259
+ legacy imports, and a simple explicitly selected official 0.3 compilation
260
+ without a database connection.
183
261
  5. Confirm `openstatspec capabilities` reflects the intended support boundary.
184
262
  6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
185
263
  specification `v0.5.0` at exact commit
186
264
  `864e84479f554b8ee250ffed44c4dfb963750d4a`, publish
187
265
  `specification_status=released`, and set `specification_release` to `v0.5.0`.
188
266
  Use an exact checkout via `OPENSTATSPEC_SPECIFICATION_DIR` for local tests.
189
- 7. Review this document, the README, and CHANGELOG for accurate scope.
267
+ 7. Review this document, the README, and CHANGELOG for accurate scope. Finalize
268
+ the 0.9.0 changelog date as 2026-09-10 before selecting the final release commit.
269
+ 8. Confirm the exact release commit's CI matrix and package smoke passed, and
270
+ verify the protected `pypi` environment and Trusted Publishing setup before
271
+ pushing a new annotated/protected `v0.9.0` tag. A `v*` tag push starts the
272
+ publishing workflow; it is not a preparation-only check. Do not move an
273
+ existing tag. The workflow also rebuilds the unchanged specification companion
274
+ package 0.1.0 at its existing pin and uses `skip-existing`; it does not release
275
+ the newer specification validator changes.
276
+ 9. After publication, verify the tag resolves to the intended commit, the
277
+ tag-triggered workflow succeeded, and PyPI installs `openstatspec==0.9.0` in a
278
+ clean environment. Record the tag, CI and registry evidence before claiming
279
+ the release is published.
190
280
 
191
281
  The tag-triggered release workflow repeats the non-service test suite, builds
192
282
  the distributions, and installs the wheel with the exact required SPSS engine