openstatspec 0.6.0__tar.gz → 0.7.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. {openstatspec-0.6.0 → openstatspec-0.7.1}/.github/workflows/ci.yml +1 -1
  2. openstatspec-0.7.1/.github/workflows/release.yml +204 -0
  3. {openstatspec-0.6.0 → openstatspec-0.7.1}/CHANGELOG.md +18 -0
  4. {openstatspec-0.6.0 → openstatspec-0.7.1}/PKG-INFO +3 -2
  5. {openstatspec-0.6.0 → openstatspec-0.7.1}/README.md +1 -0
  6. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/release-readiness.md +7 -7
  7. openstatspec-0.7.1/docs/superpowers/plans/2026-08-12-python-v071-stable-pin.md +158 -0
  8. openstatspec-0.7.1/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md +35 -0
  9. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/transformations.md +4 -3
  10. openstatspec-0.7.1/openstatspec-specification/.github/workflows/ci.yml +22 -0
  11. openstatspec-0.7.1/openstatspec-specification/.github/workflows/release.yml +108 -0
  12. openstatspec-0.7.1/openstatspec-specification/.gitignore +5 -0
  13. openstatspec-0.7.1/openstatspec-specification/CHANGELOG.md +78 -0
  14. openstatspec-0.7.1/openstatspec-specification/CONTRIBUTING.md +28 -0
  15. openstatspec-0.7.1/openstatspec-specification/README.md +107 -0
  16. openstatspec-0.7.1/openstatspec-specification/RELEASING.md +60 -0
  17. openstatspec-0.7.1/openstatspec-specification/ROADMAP.md +134 -0
  18. openstatspec-0.7.1/openstatspec-specification/VERSIONING.md +35 -0
  19. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/LICENSE.md +10 -0
  20. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/README.md +23 -0
  21. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
  22. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
  23. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +226 -0
  24. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  25. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
  26. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
  27. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
  28. openstatspec-0.7.1/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
  29. openstatspec-0.7.1/openstatspec-specification/conformance/in-place-transformation-0.1.json +147 -0
  30. openstatspec-0.7.1/openstatspec-specification/conformance/in-place-transformation-0.2.json +481 -0
  31. openstatspec-0.7.1/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +107 -0
  32. openstatspec-0.7.1/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +255 -0
  33. openstatspec-0.7.1/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +1106 -0
  34. openstatspec-0.7.1/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +1747 -0
  35. openstatspec-0.7.1/openstatspec-specification/conformance/transformation-plan-0.1.json +140 -0
  36. openstatspec-0.7.1/openstatspec-specification/conformance/transformation-plan-0.2.json +1104 -0
  37. openstatspec-0.7.1/openstatspec-specification/docs/architecture.md +61 -0
  38. openstatspec-0.7.1/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
  39. openstatspec-0.7.1/openstatspec-specification/docs/mssql-dialect-roadmap.md +85 -0
  40. openstatspec-0.7.1/openstatspec-specification/docs/spss-profile.md +45 -0
  41. openstatspec-0.7.1/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +82 -0
  42. openstatspec-0.7.1/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +76 -0
  43. openstatspec-0.7.1/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +132 -0
  44. openstatspec-0.7.1/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +314 -0
  45. openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-profile-0.1.md +108 -0
  46. openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-profile-0.2.md +127 -0
  47. openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +88 -0
  48. openstatspec-0.7.1/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +100 -0
  49. openstatspec-0.7.1/openstatspec-specification/examples/basic-spss-mapping.md +19 -0
  50. openstatspec-0.7.1/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +30 -0
  51. openstatspec-0.7.1/openstatspec-specification/examples/spss-syntax-transformation.md +31 -0
  52. openstatspec-0.7.1/openstatspec-specification/examples/sql-transformation-workflow.md +87 -0
  53. openstatspec-0.7.1/openstatspec-specification/pyproject.toml +21 -0
  54. openstatspec-0.7.1/openstatspec-specification/sql/dialect-profile-baseline.json +1224 -0
  55. openstatspec-0.7.1/openstatspec-specification/sql/dialect-profiles.md +273 -0
  56. openstatspec-0.7.1/openstatspec-specification/sql/dolt-adapter-declaration-schema.json +61 -0
  57. openstatspec-0.7.1/openstatspec-specification/sql/dolt-adapter-declarations/README.md +33 -0
  58. openstatspec-0.7.1/openstatspec-specification/sql/profile-capabilities.md +55 -0
  59. openstatspec-0.7.1/openstatspec-specification/sql/schema-outline.sql +193 -0
  60. openstatspec-0.7.1/openstatspec-specification/sql/server-version-policy.md +72 -0
  61. openstatspec-0.7.1/openstatspec-specification/sql/transformation-plan-profile-schema.sql +45 -0
  62. openstatspec-0.7.1/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +209 -0
  63. openstatspec-0.7.1/openstatspec-specification/src/openstatspec_specification/__init__.py +19 -0
  64. openstatspec-0.7.1/openstatspec-specification/src/openstatspec_specification/dolt.py +1966 -0
  65. openstatspec-0.7.1/openstatspec-specification/tests/test_dolt_declarations.py +370 -0
  66. openstatspec-0.7.1/openstatspec-specification/tools/validate_repository.py +145 -0
  67. openstatspec-0.7.1/openstatspec-specification/transformation/plan-0.1.schema.json +170 -0
  68. openstatspec-0.7.1/openstatspec-specification/transformation/plan-0.2.schema.json +139 -0
  69. openstatspec-0.7.1/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
  70. openstatspec-0.7.1/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
  71. openstatspec-0.7.1/openstatspec-specification-package/.github/workflows/ci.yml +22 -0
  72. openstatspec-0.7.1/openstatspec-specification-package/.github/workflows/publish.yml +108 -0
  73. openstatspec-0.7.1/openstatspec-specification-package/.gitignore +5 -0
  74. openstatspec-0.7.1/openstatspec-specification-package/CHANGELOG.md +72 -0
  75. openstatspec-0.7.1/openstatspec-specification-package/CONTRIBUTING.md +28 -0
  76. openstatspec-0.7.1/openstatspec-specification-package/README.md +107 -0
  77. openstatspec-0.7.1/openstatspec-specification-package/RELEASING.md +60 -0
  78. openstatspec-0.7.1/openstatspec-specification-package/ROADMAP.md +134 -0
  79. openstatspec-0.7.1/openstatspec-specification-package/VERSIONING.md +35 -0
  80. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/LICENSE.md +10 -0
  81. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/README.md +23 -0
  82. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
  83. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
  84. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +226 -0
  85. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  86. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
  87. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
  88. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
  89. openstatspec-0.7.1/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
  90. openstatspec-0.7.1/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +147 -0
  91. openstatspec-0.7.1/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +481 -0
  92. openstatspec-0.7.1/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +107 -0
  93. openstatspec-0.7.1/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +255 -0
  94. openstatspec-0.7.1/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +1106 -0
  95. openstatspec-0.7.1/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +1747 -0
  96. openstatspec-0.7.1/openstatspec-specification-package/conformance/transformation-plan-0.1.json +140 -0
  97. openstatspec-0.7.1/openstatspec-specification-package/conformance/transformation-plan-0.2.json +1104 -0
  98. openstatspec-0.7.1/openstatspec-specification-package/docs/architecture.md +61 -0
  99. openstatspec-0.7.1/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +77 -0
  100. openstatspec-0.7.1/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +85 -0
  101. openstatspec-0.7.1/openstatspec-specification-package/docs/spss-profile.md +45 -0
  102. openstatspec-0.7.1/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +82 -0
  103. openstatspec-0.7.1/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +76 -0
  104. openstatspec-0.7.1/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +132 -0
  105. openstatspec-0.7.1/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +314 -0
  106. openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +108 -0
  107. openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +127 -0
  108. openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +88 -0
  109. openstatspec-0.7.1/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +100 -0
  110. openstatspec-0.7.1/openstatspec-specification-package/examples/basic-spss-mapping.md +19 -0
  111. openstatspec-0.7.1/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +30 -0
  112. openstatspec-0.7.1/openstatspec-specification-package/examples/spss-syntax-transformation.md +31 -0
  113. openstatspec-0.7.1/openstatspec-specification-package/examples/sql-transformation-workflow.md +87 -0
  114. openstatspec-0.7.1/openstatspec-specification-package/pyproject.toml +21 -0
  115. openstatspec-0.7.1/openstatspec-specification-package/sql/dialect-profile-baseline.json +1224 -0
  116. openstatspec-0.7.1/openstatspec-specification-package/sql/dialect-profiles.md +273 -0
  117. openstatspec-0.7.1/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +61 -0
  118. openstatspec-0.7.1/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +33 -0
  119. openstatspec-0.7.1/openstatspec-specification-package/sql/profile-capabilities.md +55 -0
  120. openstatspec-0.7.1/openstatspec-specification-package/sql/schema-outline.sql +193 -0
  121. openstatspec-0.7.1/openstatspec-specification-package/sql/server-version-policy.md +72 -0
  122. openstatspec-0.7.1/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +45 -0
  123. openstatspec-0.7.1/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +209 -0
  124. openstatspec-0.7.1/openstatspec-specification-package/src/openstatspec_specification/__init__.py +19 -0
  125. openstatspec-0.7.1/openstatspec-specification-package/src/openstatspec_specification/dolt.py +1966 -0
  126. openstatspec-0.7.1/openstatspec-specification-package/tests/test_dolt_declarations.py +370 -0
  127. openstatspec-0.7.1/openstatspec-specification-package/tools/validate_repository.py +145 -0
  128. openstatspec-0.7.1/openstatspec-specification-package/transformation/plan-0.1.schema.json +170 -0
  129. openstatspec-0.7.1/openstatspec-specification-package/transformation/plan-0.2.schema.json +139 -0
  130. openstatspec-0.7.1/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +70 -0
  131. openstatspec-0.7.1/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +57 -0
  132. {openstatspec-0.6.0 → openstatspec-0.7.1}/pyproject.toml +1 -1
  133. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/capabilities.py +3 -3
  134. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/validation.py +12 -1
  135. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_cli.py +3 -3
  136. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sql_profiles.py +4 -4
  137. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_transform_frontend.py +10 -0
  138. openstatspec-0.6.0/.github/workflows/release.yml +0 -85
  139. {openstatspec-0.6.0 → openstatspec-0.7.1}/.github/verify_release_ref.py +0 -0
  140. {openstatspec-0.6.0 → openstatspec-0.7.1}/.gitignore +0 -0
  141. {openstatspec-0.6.0 → openstatspec-0.7.1}/THIRD_PARTY_NOTICES.md +0 -0
  142. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/architecture.md +0 -0
  143. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/in-place-transformation.md +0 -0
  144. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/pyspssio-spike.md +0 -0
  145. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/sav-profile.md +0 -0
  146. {openstatspec-0.6.0 → openstatspec-0.7.1}/docs/sql-transformation-workflow.md +0 -0
  147. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/__init__.py +0 -0
  148. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/api.py +0 -0
  149. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/cli.py +0 -0
  150. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/core/__init__.py +0 -0
  151. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/core/results.py +0 -0
  152. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/__init__.py +0 -0
  153. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/sas/.gitkeep +0 -0
  154. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/__init__.py +0 -0
  155. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/binding.py +0 -0
  156. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/compiler.py +0 -0
  157. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/execution.py +0 -0
  158. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/spss/syntax.py +0 -0
  159. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/frontends/stata/.gitkeep +0 -0
  160. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/__init__.py +0 -0
  161. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/dictionary.py +0 -0
  162. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/raw_dictionary.py +0 -0
  163. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/spss/sav.py +0 -0
  164. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/__init__.py +0 -0
  165. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/catalog_api.py +0 -0
  166. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/catalog_verification.py +0 -0
  167. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/database_urls.py +0 -0
  168. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/dolt_conformance.py +0 -0
  169. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/inplace_transform.py +0 -0
  170. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/normative.py +0 -0
  171. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/profiles.py +0 -0
  172. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/wide.py +0 -0
  173. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/sql/workflow.py +0 -0
  174. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/__init__.py +0 -0
  175. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/errors.py +0 -0
  176. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/plan.py +0 -0
  177. {openstatspec-0.6.0 → openstatspec-0.7.1}/src/openstatspec/transform/schema.py +0 -0
  178. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/conformance.py +0 -0
  179. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_atomic_import.py +0 -0
  180. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_attribute_catalog.py +0 -0
  181. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_catalog_lifecycle.py +0 -0
  182. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_catalog_persistence_review.py +0 -0
  183. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_conditional_inplace_transform.py +0 -0
  184. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_document_round_trip.py +0 -0
  185. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_dolt_conformance.py +0 -0
  186. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_inplace_transform.py +0 -0
  187. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_loss_reports.py +0 -0
  188. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_normative_catalog.py +0 -0
  189. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_official_conformance.py +0 -0
  190. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_pyspssio_catalog_authority.py +0 -0
  191. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_release_ref.py +0 -0
  192. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_review_transaction_boundary.py +0 -0
  193. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sav_sqlite.py +0 -0
  194. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_spss_catalog_preflight.py +0 -0
  195. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sql_services.py +0 -0
  196. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_sql_workflow.py +0 -0
  197. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_strict_catalog_review.py +0 -0
  198. {openstatspec-0.6.0 → openstatspec-0.7.1}/tests/test_vls_compatible_names.py +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  uses: actions/checkout@v7
21
21
  with: &specification-checkout
22
22
  repository: OpenStatSpec/specification
23
- ref: f2fdf687d8cb32b944ca55a3e9e7215ffc603019
23
+ ref: cd8f198c68b849eb8ed018a894670a0904c2181d
24
24
  path: openstatspec-specification
25
25
  - name: Checkout required SPSS engine
26
26
  uses: actions/checkout@v7
@@ -0,0 +1,204 @@
1
+ name: Release
2
+
3
+ env:
4
+ OPENSTATSPEC_SPECIFICATION_DIR: ${{ github.workspace }}/openstatspec-specification
5
+ OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR: ${{ github.workspace }}/openstatspec-specification-package
6
+ OPENSTATSPEC_SPECIFICATION_PACKAGE_REF: 2778b784afcb63868ce3c3235a5f1fa190100f9d
7
+ OPENSTATSPEC_SPECIFICATION_PACKAGE_VERSION: 0.1.0
8
+
9
+ on:
10
+ push:
11
+ tags:
12
+ - "v*"
13
+ workflow_dispatch:
14
+ inputs:
15
+ release_ref:
16
+ description: "Existing release tag to rebuild and publish idempotently"
17
+ required: true
18
+ type: string
19
+
20
+ permissions:
21
+ contents: read
22
+
23
+ jobs:
24
+ build:
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
28
+ with:
29
+ ref: refs/tags/${{ inputs.release_ref || github.ref_name }}
30
+ fetch-depth: 0
31
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
32
+ with:
33
+ python-version: "3.13"
34
+ - name: Verify release tag exists and targets this package version
35
+ env:
36
+ RELEASE_TAG: ${{ inputs.release_ref || github.ref_name }}
37
+ run: |
38
+ set -eu
39
+ git fetch --force --no-tags origin "refs/tags/${RELEASE_TAG}:refs/tags/${RELEASE_TAG}"
40
+ python .github/verify_release_ref.py
41
+ - run: python -m pip install --upgrade pip build twine pytest
42
+ - name: Verify required SPSS engine is publicly installable
43
+ run: >-
44
+ python -m pip download --only-binary=:all: --no-deps
45
+ --dest /tmp/openstatspec-engine-release
46
+ openstatspec-pyspssio==0.5.1.post2
47
+ - name: Checkout normative specification fixtures
48
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
49
+ with:
50
+ repository: OpenStatSpec/specification
51
+ ref: cd8f198c68b849eb8ed018a894670a0904c2181d
52
+ path: openstatspec-specification
53
+ - name: Checkout specification package source
54
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
55
+ with:
56
+ repository: OpenStatSpec/specification
57
+ ref: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_REF }}
58
+ path: openstatspec-specification-package
59
+ - name: Verify specification package source
60
+ env:
61
+ SPECIFICATION_PACKAGE_DIR: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR }}
62
+ SPECIFICATION_PACKAGE_REF: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_REF }}
63
+ SPECIFICATION_PACKAGE_VERSION: ${{ env.OPENSTATSPEC_SPECIFICATION_PACKAGE_VERSION }}
64
+ run: |
65
+ python - <<'PY'
66
+ import os
67
+ import subprocess
68
+ import tomllib
69
+ from pathlib import Path
70
+
71
+ source = Path(os.environ["SPECIFICATION_PACKAGE_DIR"])
72
+ expected_ref = os.environ["SPECIFICATION_PACKAGE_REF"]
73
+ actual_ref = subprocess.check_output(
74
+ ["git", "rev-parse", "HEAD"], cwd=source, text=True,
75
+ ).strip()
76
+ if actual_ref != expected_ref:
77
+ raise SystemExit(
78
+ f"specification package ref {actual_ref!r} does not match "
79
+ f"expected {expected_ref!r}"
80
+ )
81
+ project = tomllib.loads(
82
+ (source / "pyproject.toml").read_text(encoding="utf-8")
83
+ )["project"]
84
+ if project["name"] != "openstatspec-specification":
85
+ raise SystemExit("unexpected specification package name")
86
+ expected_version = os.environ["SPECIFICATION_PACKAGE_VERSION"]
87
+ if project["version"] != expected_version:
88
+ raise SystemExit(
89
+ f"specification package version {project['version']!r} does "
90
+ f"not match expected {expected_version!r}"
91
+ )
92
+ for required in (
93
+ "pyproject.toml",
94
+ "src/openstatspec_specification/dolt.py",
95
+ "sql/dolt-adapter-declaration-schema.json",
96
+ ):
97
+ if not (source / required).is_file():
98
+ raise SystemExit(f"missing specification package resource: {required}")
99
+ PY
100
+ - name: Verify specification package tests and repository
101
+ run: |
102
+ python -m pip install -e "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR"
103
+ python -m pytest -q "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR/tests/test_dolt_declarations.py"
104
+ python "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR/tools/validate_repository.py"
105
+ - name: Build clean release distributions
106
+ run: |
107
+ rm -rf dist /tmp/openstatspec-release-dists
108
+ mkdir -p dist/openstatspec dist/openstatspec-specification \
109
+ /tmp/openstatspec-release-dists/openstatspec \
110
+ /tmp/openstatspec-release-dists/specification
111
+ python -m build --outdir /tmp/openstatspec-release-dists/openstatspec .
112
+ python -m build --outdir /tmp/openstatspec-release-dists/specification "$OPENSTATSPEC_SPECIFICATION_PACKAGE_DIR"
113
+ python -m twine check \
114
+ /tmp/openstatspec-release-dists/openstatspec/* \
115
+ /tmp/openstatspec-release-dists/specification/*
116
+ python - <<'PY'
117
+ from pathlib import Path
118
+ from shutil import copy2
119
+
120
+ sources = {
121
+ "openstatspec": (
122
+ Path("/tmp/openstatspec-release-dists/openstatspec"),
123
+ Path("dist/openstatspec"),
124
+ ),
125
+ "openstatspec_specification": (
126
+ Path("/tmp/openstatspec-release-dists/specification"),
127
+ Path("dist/openstatspec-specification"),
128
+ ),
129
+ }
130
+ copied = []
131
+ for normalized_name, (source, destination_dir) in sources.items():
132
+ destination_dir.mkdir(parents=True, exist_ok=True)
133
+ files = sorted(path for path in source.iterdir() if path.is_file())
134
+ if len(files) != 2 or {path.suffix for path in files} != {".whl", ".gz"}:
135
+ raise SystemExit(
136
+ f"expected one wheel and one sdist for {normalized_name}, got "
137
+ f"{[path.name for path in files]}"
138
+ )
139
+ for path in files:
140
+ normalized_artifact = path.name.replace("-", "_").lower()
141
+ if not normalized_artifact.startswith(normalized_name + "_"):
142
+ raise SystemExit(
143
+ f"unexpected artifact name for {normalized_name}: {path.name}"
144
+ )
145
+ destination = destination_dir / path.name
146
+ copy2(path, destination)
147
+ copied.append(destination)
148
+ if len(copied) != 4:
149
+ raise SystemExit(f"expected four release artifacts, got {len(copied)}")
150
+ print("release artifacts:", ", ".join(path.name for path in copied))
151
+ PY
152
+ - name: Checkout required SPSS engine
153
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
154
+ with:
155
+ repository: TonisOrmisson/pyspssio
156
+ ref: e069adf33c70bcd9e8e6ee495106479463a84fa2
157
+ path: openstatspec-pyspssio
158
+ - run: python -m pip install ./openstatspec-pyspssio
159
+ - run: python -m pip install -e ".[dev]"
160
+ - run: python -m pytest -m "not services"
161
+ - run: python -m venv /tmp/openstatspec-release-smoke
162
+ - run: /tmp/openstatspec-release-smoke/bin/python -m pip install ./openstatspec-pyspssio
163
+ - run: /tmp/openstatspec-release-smoke/bin/python -m pip install dist/openstatspec/openstatspec-*.whl
164
+ - run: /tmp/openstatspec-release-smoke/bin/openstatspec capabilities
165
+ - name: Smoke-test specification wheel
166
+ run: |
167
+ python -m venv /tmp/openstatspec-specification-release-smoke
168
+ /tmp/openstatspec-specification-release-smoke/bin/python -m pip install dist/openstatspec-specification/openstatspec_specification-*.whl
169
+ /tmp/openstatspec-specification-release-smoke/bin/python - <<'PY'
170
+ from openstatspec_specification import DoltDeclarationSource
171
+
172
+ source = DoltDeclarationSource.packaged()
173
+ schema = source.read_json("sql/dolt-adapter-declaration-schema.json")
174
+ if schema.get("schema_id") != "openstatspec-dolt-adapter-declaration-v1":
175
+ raise SystemExit("packaged specification schema has the wrong identifier")
176
+ PY
177
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
178
+ with:
179
+ name: python-distributions
180
+ path: dist/
181
+
182
+ publish:
183
+ needs: build
184
+ runs-on: ubuntu-latest
185
+ environment:
186
+ name: pypi
187
+ url: https://pypi.org/p/openstatspec
188
+ permissions:
189
+ id-token: write
190
+ steps:
191
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
192
+ with:
193
+ name: python-distributions
194
+ path: dist/
195
+ - name: Publish openstatspec to PyPI
196
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
197
+ with:
198
+ packages-dir: dist/openstatspec/
199
+ skip-existing: true
200
+ - name: Publish openstatspec-specification to PyPI
201
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
202
+ with:
203
+ packages-dir: dist/openstatspec-specification/
204
+ skip-existing: true
@@ -6,6 +6,24 @@ All notable changes to this reference implementation are documented here.
6
6
 
7
7
  _No unreleased changes._
8
8
 
9
+ ## 0.7.1 - 2026-08-12
10
+
11
+ ### Changed
12
+
13
+ - Pinned capability declarations, conformance fixtures, and release validation
14
+ to the published OpenStatSpec specification `v0.3.0` at exact commit
15
+ `cd8f198c68b849eb8ed018a894670a0904c2181d`.
16
+
17
+ ## 0.7.0 - 2026-08-11
18
+
19
+ ### Added
20
+
21
+ - Added root release workflow support for publishing the normative
22
+ `openstatspec-specification` companion distribution, with independent
23
+ artifact validation, smoke tests, and PyPI publishing.
24
+ - Carried the complete 0.6.0 transformation, PostgreSQL, and documentation
25
+ work forward into the versioned 0.7.0 release from `main`.
26
+
9
27
  ## 0.6.0 - 2026-08-05
10
28
 
11
29
  ### Added
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: openstatspec
3
- Version: 0.6.0
3
+ Version: 0.7.1
4
4
  Summary: Reference adapter for the OpenStatSpec relational contract
5
5
  Author: OpenStatSpec
6
6
  License: Apache-2.0
@@ -87,6 +87,7 @@ implemented capability boundary.
87
87
  ## SPSS-like transformation frontend
88
88
 
89
89
  The bounded SPSS-like frontend lowers `RECODE`, sequential `COMPUTE` and `IF`,
90
+ `STRING` declarations, and `DELETE VARIABLES`,
90
91
  `VARIABLE LABELS`, `VALUE LABELS`, numeric `FORMATS`, `VARIABLE LEVEL`, and
91
92
  `EXECUTE` into a language-neutral typed canonical plan. Conditions support
92
93
  parentheses, variable and numeric literal operands, comparisons, `AND`, and
@@ -68,6 +68,7 @@ implemented capability boundary.
68
68
  ## SPSS-like transformation frontend
69
69
 
70
70
  The bounded SPSS-like frontend lowers `RECODE`, sequential `COMPUTE` and `IF`,
71
+ `STRING` declarations, and `DELETE VARIABLES`,
71
72
  `VARIABLE LABELS`, `VALUE LABELS`, numeric `FORMATS`, `VARIABLE LEVEL`, and
72
73
  `EXECUTE` into a language-neutral typed canonical plan. Conditions support
73
74
  parentheses, variable and numeric literal operands, comparisons, `AND`, and
@@ -1,4 +1,4 @@
1
- # 0.5.0 release readiness
1
+ # 0.7.1 release readiness
2
2
 
3
3
  This page records the expected release contract, not a publication event.
4
4
  Creating a version tag remains a separate maintainer action.
@@ -69,6 +69,8 @@ The gate must prove that:
69
69
  plan hash and in-place result;
70
70
  - the exact bounded `COMPUTE`/`IF` program compiles to all seven ordered
71
71
  operations without dropping `FORMATS`, `VARIABLE LEVEL`, or `EXECUTE`;
72
+ - bounded `STRING` declarations and `DELETE VARIABLES` operations preserve
73
+ the resulting schema and physical-column identity on supported profiles;
72
74
  - boolean data results match the equivalent expression and the target's label,
73
75
  0/1 value labels, `F1.0` print/write format, and nominal level exist in the
74
76
  normative catalog;
@@ -112,12 +114,10 @@ capability claim, or implied support.
112
114
  4. Build with `python -m build` and install the generated wheel in a clean
113
115
  environment.
114
116
  5. Confirm `openstatspec capabilities` reflects the intended support boundary.
115
- 6. Confirm CI, release fixtures, and capabilities use the untagged OpenStatSpec
116
- specification release candidate at exact commit
117
- `f2fdf687d8cb32b944ca55a3e9e7215ffc603019`, publish
118
- `specification_status=release_candidate`, and leave
119
- `specification_release` null. If that exact commit receives a stable tag
120
- before this package is tagged, update the identity and re-run every gate.
117
+ 6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
118
+ specification `v0.3.0` at exact commit
119
+ `cd8f198c68b849eb8ed018a894670a0904c2181d`, publish
120
+ `specification_status=stable`, and set `specification_release` to `v0.3.0`.
121
121
  7. Review this document, the README, and CHANGELOG for accurate scope.
122
122
 
123
123
  The tag-triggered release workflow repeats the non-service test suite, builds
@@ -0,0 +1,158 @@
1
+ # Python 0.7.1 Stable Specification Pin Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Release Python adapter `0.7.1` with stable, exact provenance for specification `v0.3.0`.
6
+
7
+ **Architecture:** Keep the provenance values centralized in `src/openstatspec/sql/capabilities.py`; tests and capability declarations consume those values. CI and release-readiness documentation pin the same immutable specification commit, while the package version changes only in packaging metadata.
8
+
9
+ **Tech Stack:** Python 3.11–3.14, pytest, GitHub Actions, `python -m build`, Twine, PyPI Trusted Publishing.
10
+
11
+ ## Global Constraints
12
+
13
+ - Specification commit: `cd8f198c68b849eb8ed018a894670a0904c2181d`.
14
+ - Specification status: `stable`.
15
+ - Specification release: `v0.3.0`.
16
+ - Package version: `0.7.1`.
17
+ - Keep the SPSS engine pin, companion package pin, SQL profile matrix, and runtime behavior unchanged.
18
+ - Do not publish or change the normative specification package in this task.
19
+
20
+ ---
21
+
22
+ ### Task 1: Update provenance contract tests first
23
+
24
+ **Files:**
25
+ - Modify: `tests/test_cli.py:44-48`
26
+ - Modify: `tests/test_sql_profiles.py:32-40`
27
+
28
+ **Interfaces:**
29
+ - Consumes: public `openstatspec.capability_matrix()` and SQL profile declarations.
30
+ - Produces: executable expectations for stable `v0.3.0` provenance.
31
+
32
+ - [ ] **Step 1: Change the assertions to the stable identity**
33
+
34
+ Replace the candidate expectations with:
35
+
36
+ ```python
37
+ assert matrix["specification_status"] == "stable"
38
+ assert matrix["specification_release"] == "v0.3.0"
39
+ assert matrix["specification_commit"] == "cd8f198c68b849eb8ed018a894670a0904c2181d"
40
+ ```
41
+
42
+ Apply the same three values to each profile declaration assertion.
43
+
44
+ - [ ] **Step 2: Run the focused tests and confirm the expected red state**
45
+
46
+ Run:
47
+
48
+ ```bash
49
+ python -m pytest -q tests/test_cli.py::test_capability_matrix_is_public_and_cli_matches_engine_boundary tests/test_sql_profiles.py::test_profile_declarations_publish_stable_specification_provenance
50
+ ```
51
+
52
+ Expected: both tests fail because production constants still expose the old release-candidate identity.
53
+
54
+ - [ ] **Step 3: Commit the failing-test update**
55
+
56
+ ```bash
57
+ git add tests/test_cli.py tests/test_sql_profiles.py
58
+ git commit -m "test: expect stable specification v0.3.0"
59
+ ```
60
+
61
+ ### Task 2: Bind production provenance and release metadata
62
+
63
+ **Files:**
64
+ - Modify: `src/openstatspec/sql/capabilities.py:20-23`
65
+ - Modify: `pyproject.toml:7`
66
+ - Modify: `.github/workflows/ci.yml:23`
67
+ - Modify: `.github/workflows/release.yml:51`
68
+ - Modify: `docs/release-readiness.md:1,116-123`
69
+ - Modify: `CHANGELOG.md` after the `Unreleased` section
70
+
71
+ **Interfaces:**
72
+ - Consumes: the exact specification commit from the published `v0.3.0` tag.
73
+ - Produces: capability output and release automation identifying `stable`, `v0.3.0`, and `cd8f198c...`.
74
+
75
+ - [ ] **Step 1: Update the centralized capability constants**
76
+
77
+ Set the declarations to:
78
+
79
+ ```python
80
+ SPECIFICATION_COMMIT = "cd8f198c68b849eb8ed018a894670a0904c2181d"
81
+ SPECIFICATION_STATUS = "stable"
82
+ SPECIFICATION_RELEASE: str | None = "v0.3.0"
83
+ ```
84
+
85
+ - [ ] **Step 2: Bump the package and CI fixture pin**
86
+
87
+ Set `project.version` in `pyproject.toml` to `0.7.1`. Replace the old specification checkout ref in both workflows with the exact commit `cd8f198c68b849eb8ed018a894670a0904c2181d`; leave the companion package ref unchanged.
88
+
89
+ - [ ] **Step 3: Update release documentation and changelog**
90
+
91
+ Rename the readiness heading to `0.7.1 release readiness`, change its specification checklist to the stable commit/release identity, and add a dated `0.7.1` entry explaining that the adapter now pins published specification `v0.3.0`.
92
+
93
+ - [ ] **Step 4: Run focused tests and confirm green**
94
+
95
+ Run the focused command from Task 1. Expected: both tests pass.
96
+
97
+ - [ ] **Step 5: Commit the implementation and metadata**
98
+
99
+ ```bash
100
+ git add src/openstatspec/sql/capabilities.py pyproject.toml .github/workflows/ci.yml .github/workflows/release.yml docs/release-readiness.md CHANGELOG.md
101
+ git commit -m "release: pin Python adapter to specification v0.3.0"
102
+ ```
103
+
104
+ ### Task 3: Verify the complete Python release candidate
105
+
106
+ **Files:**
107
+ - Verify: all tracked files in the Python repository.
108
+
109
+ - [ ] **Step 1: Check the diff and stale current references**
110
+
111
+ Run:
112
+
113
+ ```bash
114
+ git diff --check
115
+ rg -n 'f2fdf687d8cb32b944ca55a3e9e7215ffc603019|specification_status.*release_candidate|specification_release.*None|version = "0\.7\.0"' src tests .github docs pyproject.toml
116
+ ```
117
+
118
+ Expected: no stale current references; historical changelog entries may retain their original release evidence.
119
+
120
+ - [ ] **Step 2: Run the non-service test suite**
121
+
122
+ ```bash
123
+ python -m pytest -m "not services"
124
+ ```
125
+
126
+ Expected: zero failures.
127
+
128
+ - [ ] **Step 3: Build and smoke-test the package**
129
+
130
+ ```bash
131
+ rm -rf /tmp/openstatspec-v071-dist /tmp/openstatspec-v071-smoke
132
+ python -m build --outdir /tmp/openstatspec-v071-dist
133
+ python -m twine check /tmp/openstatspec-v071-dist/*
134
+ python -m venv /tmp/openstatspec-v071-smoke
135
+ /tmp/openstatspec-v071-smoke/bin/python -m pip install ./openstatspec-pyspssio
136
+ /tmp/openstatspec-v071-smoke/bin/python -m pip install /tmp/openstatspec-v071-dist/openstatspec-0.7.1-*.whl
137
+ /tmp/openstatspec-v071-smoke/bin/openstatspec capabilities
138
+ ```
139
+
140
+ Expected: build and Twine checks pass, and capabilities reports `stable`, `v0.3.0`, and the exact commit.
141
+
142
+ ### Task 4: Review, publish, and release
143
+
144
+ - [ ] **Step 1: Run the local review loop and fix every actionable finding**
145
+
146
+ Review the complete branch diff against `origin/main`; repeat the tests after each fix until no actionable findings remain.
147
+
148
+ - [ ] **Step 2: Push the branch and open a draft PR**
149
+
150
+ Push `agent/stable-spec-v071` to `OpenStatSpec/python`, open a PR targeting `main`, mark it ready for review, and add `@codex review`.
151
+
152
+ - [ ] **Step 3: Iterate on GitHub review and CI**
153
+
154
+ Inspect every Codex review finding and failing check, fix actionable issues locally, push, and repeat until the review and required checks are clean.
155
+
156
+ - [ ] **Step 4: After merge, create and push annotated tag `v0.7.1`**
157
+
158
+ Verify the tag targets the merge commit and wait for tag-context CI to pass before relying on the existing PyPI workflow.
@@ -0,0 +1,35 @@
1
+ # Python 0.7.1 stable specification pin
2
+
3
+ ## Goal
4
+
5
+ Publish the Python adapter's first patch release after Python adapter `v0.7.0`
6
+ with its capability declarations and conformance fixtures bound to the
7
+ published OpenStatSpec specification `v0.3.0`.
8
+
9
+ ## Scope
10
+
11
+ - Bump the Python distribution from `0.7.0` to `0.7.1`.
12
+ - Replace the release-candidate specification identity with:
13
+ - commit `cd8f198c68b849eb8ed018a894670a0904c2181d`;
14
+ - status `stable`;
15
+ - release `v0.3.0`.
16
+ - Update unit expectations, CI fixture checkouts, release-readiness guidance,
17
+ and the changelog so every release surface carries the same identity.
18
+ - Keep the required SPSS engine pin, specification companion package pin,
19
+ database version matrix, and runtime behavior unchanged.
20
+ - Separately update the specification repository roadmap to mark the completed
21
+ `v0.3.0` release gates and current public release.
22
+
23
+ ## Release and verification
24
+
25
+ The Python change is reviewed through a pull request. Before tagging `v0.7.1`,
26
+ run the non-service suite, package build and wheel smoke test, and the full
27
+ GitHub CI matrix. The annotated `v0.7.1` tag must target the merged release
28
+ commit; its tag-context workflow must pass before the existing trusted-PyPI
29
+ workflow publishes the package artifacts.
30
+
31
+ ## Non-goals
32
+
33
+ This work does not add transformation behavior, change SQL dialect support,
34
+ modify the normative specification, or publish a new specification package
35
+ version.
@@ -4,9 +4,10 @@ OpenStatSpec separates transformation syntax, canonical meaning, and database
4
4
  mutation. This lets multiple language frontends produce the same plan without
5
5
  coupling the executor to any one language.
6
6
 
7
- The implemented bounded SPSS-like frontend accepts `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,22 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ specification:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ # v7.0.1: https://github.com/actions/checkout/commit/3d3c42e5aac5ba805825da76410c181273ba90b1
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
16
+ with:
17
+ persist-credentials: false
18
+ # v7.0.0: https://github.com/actions/setup-python/commit/5fda3b95a4ea91299a34e894583c3862153e4b97
19
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
20
+ with:
21
+ python-version: "3.13"
22
+ - run: python tools/validate_repository.py
@@ -0,0 +1,108 @@
1
+ name: Publish Python specification package
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "package-v*"
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ build:
14
+ name: Build and verify distribution
15
+ runs-on: ubuntu-latest
16
+
17
+ steps:
18
+ - name: Check out repository
19
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
+ with:
21
+ persist-credentials: false
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
25
+ with:
26
+ python-version: "3.13"
27
+
28
+ - name: Build distribution
29
+ run: |
30
+ python -m pip install --upgrade pip
31
+ python -m pip install build twine pytest
32
+ python -m pip install -e .
33
+ python -m pytest -q tests/test_dolt_declarations.py
34
+ python tools/validate_repository.py
35
+ python -m build
36
+
37
+ - name: Verify distribution metadata
38
+ run: python -m twine check dist/*
39
+
40
+ - name: Verify release tag version
41
+ if: startsWith(github.ref, 'refs/tags/package-v')
42
+ env:
43
+ RELEASE_TAG: ${{ github.ref_name }}
44
+ run: |
45
+ python - <<'PY'
46
+ import os
47
+ import tomllib
48
+ from pathlib import Path
49
+
50
+ project = tomllib.loads(Path("pyproject.toml").read_text())
51
+ version = project["project"]["version"]
52
+ tag = os.environ["RELEASE_TAG"]
53
+ if tag != f"package-v{version}":
54
+ raise SystemExit(
55
+ f"release tag {tag!r} does not match project version package-v{version}"
56
+ )
57
+ PY
58
+
59
+ - name: Store distribution artifacts
60
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
61
+ with:
62
+ name: python-package-distributions
63
+ path: dist/
64
+ if-no-files-found: error
65
+
66
+ publish-testpypi:
67
+ name: Publish to TestPyPI
68
+ if: github.event_name == 'workflow_dispatch'
69
+ needs: build
70
+ runs-on: ubuntu-latest
71
+ environment:
72
+ name: testpypi
73
+ url: https://test.pypi.org/p/openstatspec-specification
74
+ permissions:
75
+ id-token: write
76
+
77
+ steps:
78
+ - name: Download distribution artifacts
79
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
80
+ with:
81
+ name: python-package-distributions
82
+ path: dist/
83
+
84
+ - name: Publish distribution to TestPyPI
85
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
86
+ with:
87
+ repository-url: https://test.pypi.org/legacy/
88
+
89
+ publish-pypi:
90
+ name: Publish to PyPI
91
+ if: startsWith(github.ref, 'refs/tags/package-v')
92
+ needs: build
93
+ runs-on: ubuntu-latest
94
+ environment:
95
+ name: pypi
96
+ url: https://pypi.org/p/openstatspec-specification
97
+ permissions:
98
+ id-token: write
99
+
100
+ steps:
101
+ - name: Download distribution artifacts
102
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
103
+ with:
104
+ name: python-package-distributions
105
+ path: dist/
106
+
107
+ - name: Publish distribution to PyPI
108
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
@@ -0,0 +1,5 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ dist/
4
+ build/
5
+ *.egg-info/