chooong.datasift 0.1.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 (274) hide show
  1. chooong_datasift-0.1.0/.github/RELEASING.md +137 -0
  2. chooong_datasift-0.1.0/.github/actions/tooling/action.yml +15 -0
  3. chooong_datasift-0.1.0/.github/release-targets.json +10 -0
  4. chooong_datasift-0.1.0/.github/workflows/artifacts.yml +160 -0
  5. chooong_datasift-0.1.0/.github/workflows/benchmarks.yml +67 -0
  6. chooong_datasift-0.1.0/.github/workflows/checks.yml +30 -0
  7. chooong_datasift-0.1.0/.github/workflows/ci.yml +16 -0
  8. chooong_datasift-0.1.0/.github/workflows/docs-pages.yml +38 -0
  9. chooong_datasift-0.1.0/.github/workflows/release.yml +101 -0
  10. chooong_datasift-0.1.0/.pymarkdown.json +6 -0
  11. chooong_datasift-0.1.0/CHANGELOG.md +22 -0
  12. chooong_datasift-0.1.0/CONTRIBUTING.md +28 -0
  13. chooong_datasift-0.1.0/LICENSE +201 -0
  14. chooong_datasift-0.1.0/PKG-INFO +424 -0
  15. chooong_datasift-0.1.0/README.md +277 -0
  16. chooong_datasift-0.1.0/SECURITY.md +26 -0
  17. chooong_datasift-0.1.0/THIRD_PARTY_NOTICES.txt +2491 -0
  18. chooong_datasift-0.1.0/datasift-core/Cargo.lock +1608 -0
  19. chooong_datasift-0.1.0/datasift-core/Cargo.toml +46 -0
  20. chooong_datasift-0.1.0/datasift-core/README.md +72 -0
  21. chooong_datasift-0.1.0/datasift-core/src/discovery.rs +202 -0
  22. chooong_datasift-0.1.0/datasift-core/src/encoding.rs +69 -0
  23. chooong_datasift-0.1.0/datasift-core/src/engine.rs +1093 -0
  24. chooong_datasift-0.1.0/datasift-core/src/filter.rs +771 -0
  25. chooong_datasift-0.1.0/datasift-core/src/input.rs +183 -0
  26. chooong_datasift-0.1.0/datasift-core/src/lib.rs +443 -0
  27. chooong_datasift-0.1.0/datasift-core/src/output.rs +542 -0
  28. chooong_datasift-0.1.0/datasift-core/src/recovery.rs +443 -0
  29. chooong_datasift-0.1.0/datasift-core/src/rules.rs +528 -0
  30. chooong_datasift-0.1.0/datasift-core/src/value.rs +170 -0
  31. chooong_datasift-0.1.0/datasift-core/src/xlsx.rs +883 -0
  32. chooong_datasift-0.1.0/datasift-core/tests/pipeline/export.rs +227 -0
  33. chooong_datasift-0.1.0/datasift-core/tests/support/mod.rs +41 -0
  34. chooong_datasift-0.1.0/datasift-core/tests/support/workbook.rs +49 -0
  35. chooong_datasift-0.1.0/datasift-core/tests/unit/discovery.rs +137 -0
  36. chooong_datasift-0.1.0/datasift-core/tests/unit/encoding.rs +103 -0
  37. chooong_datasift-0.1.0/datasift-core/tests/unit/filter.rs +182 -0
  38. chooong_datasift-0.1.0/datasift-core/tests/unit/input.rs +188 -0
  39. chooong_datasift-0.1.0/datasift-core/tests/unit/output.rs +57 -0
  40. chooong_datasift-0.1.0/datasift-core/tests/unit/recovery.rs +160 -0
  41. chooong_datasift-0.1.0/datasift-core/tests/unit/rules.rs +147 -0
  42. chooong_datasift-0.1.0/datasift-core/tests/unit/value.rs +51 -0
  43. chooong_datasift-0.1.0/datasift-core/tests/unit/xlsx.rs +78 -0
  44. chooong_datasift-0.1.0/docs/api/cli.md +116 -0
  45. chooong_datasift-0.1.0/docs/api/filters.md +167 -0
  46. chooong_datasift-0.1.0/docs/api/json-schema.md +38 -0
  47. chooong_datasift-0.1.0/docs/api/python.md +158 -0
  48. chooong_datasift-0.1.0/docs/assets/brand/favicon.png +0 -0
  49. chooong_datasift-0.1.0/docs/assets/brand/logo-bright.jpeg +0 -0
  50. chooong_datasift-0.1.0/docs/assets/brand/logo.jpeg +0 -0
  51. chooong_datasift-0.1.0/docs/concepts/column-mapping.md +36 -0
  52. chooong_datasift-0.1.0/docs/concepts/data-types.md +118 -0
  53. chooong_datasift-0.1.0/docs/concepts/filters.md +34 -0
  54. chooong_datasift-0.1.0/docs/concepts/streaming.md +40 -0
  55. chooong_datasift-0.1.0/docs/concepts/table-discovery.md +91 -0
  56. chooong_datasift-0.1.0/docs/development/architecture.md +42 -0
  57. chooong_datasift-0.1.0/docs/development/benchmarks.md +59 -0
  58. chooong_datasift-0.1.0/docs/development/contributing.md +78 -0
  59. chooong_datasift-0.1.0/docs/guides/advanced-filtering.md +88 -0
  60. chooong_datasift-0.1.0/docs/guides/automatic-table-discovery.md +38 -0
  61. chooong_datasift-0.1.0/docs/guides/batch-processing.md +67 -0
  62. chooong_datasift-0.1.0/docs/guides/column-selection.md +48 -0
  63. chooong_datasift-0.1.0/docs/guides/complex-layouts.md +362 -0
  64. chooong_datasift-0.1.0/docs/guides/csv.md +127 -0
  65. chooong_datasift-0.1.0/docs/guides/error-handling.md +109 -0
  66. chooong_datasift-0.1.0/docs/guides/excel.md +67 -0
  67. chooong_datasift-0.1.0/docs/guides/exporting.md +95 -0
  68. chooong_datasift-0.1.0/docs/guides/performance.md +28 -0
  69. chooong_datasift-0.1.0/docs/guides/table-inspection.md +69 -0
  70. chooong_datasift-0.1.0/docs/guides/validation.md +138 -0
  71. chooong_datasift-0.1.0/docs/index.md +59 -0
  72. chooong_datasift-0.1.0/docs/installation.md +47 -0
  73. chooong_datasift-0.1.0/docs/quickstart.md +76 -0
  74. chooong_datasift-0.1.0/docs/reference/errors.md +68 -0
  75. chooong_datasift-0.1.0/docs/reference/file-safety.md +76 -0
  76. chooong_datasift-0.1.0/docs/reference/limits.md +49 -0
  77. chooong_datasift-0.1.0/docs/stylesheets/chooong.css +71 -0
  78. chooong_datasift-0.1.0/licenses/third-party/018b1cb87efdf7a04c2fcc13d57ed63f62149113fb207b27ea13430d64f13513.txt +201 -0
  79. chooong_datasift-0.1.0/licenses/third-party/01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f.txt +3 -0
  80. chooong_datasift-0.1.0/licenses/third-party/0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a.txt +201 -0
  81. chooong_datasift-0.1.0/licenses/third-party/025436edff4cfcdde17a5811fdea78892d8482efd1abdec5a17872d07a4f2112.txt +25 -0
  82. chooong_datasift-0.1.0/licenses/third-party/03548525ec3706de58e48ef6e3c455582557a0ad3b54a2da9a3819add35dfb72.txt +209 -0
  83. chooong_datasift-0.1.0/licenses/third-party/0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb.txt +25 -0
  84. chooong_datasift-0.1.0/licenses/third-party/074e6e32c86a4c0ef8b3ed25b721ca23aca83df277cd88106ef7177c354615ff.txt +73 -0
  85. chooong_datasift-0.1.0/licenses/third-party/0cec06e0e55fbc3dc5cee4fca9b607f66cb8f4e4dbcf3b3c013594dd156732e9.txt +177 -0
  86. chooong_datasift-0.1.0/licenses/third-party/0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f.txt +21 -0
  87. chooong_datasift-0.1.0/licenses/third-party/10c8f8922ec0a74e8721148bfc5b5e18c4f989d62e38f5580a501a3e3c1d0391.txt +21 -0
  88. chooong_datasift-0.1.0/licenses/third-party/11789f45bb180841cd362a5eee6789c68ddb573a11105e30768c308a6add0190.txt +17 -0
  89. chooong_datasift-0.1.0/licenses/third-party/123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e.txt +25 -0
  90. chooong_datasift-0.1.0/licenses/third-party/172020dbfd5b53a226dfde77616190a48dcff519b0bc0e6deb91a8450782c4af.txt +34 -0
  91. chooong_datasift-0.1.0/licenses/third-party/1847e0e0698142ed4347c1441a9fa81c8fbddd44b1d8bbcd5e3647f991759d7f.txt +19 -0
  92. chooong_datasift-0.1.0/licenses/third-party/1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df.txt +26 -0
  93. chooong_datasift-0.1.0/licenses/third-party/209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b.txt +26 -0
  94. chooong_datasift-0.1.0/licenses/third-party/23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d.txt +7 -0
  95. chooong_datasift-0.1.0/licenses/third-party/23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3.txt +23 -0
  96. chooong_datasift-0.1.0/licenses/third-party/268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5.txt +220 -0
  97. chooong_datasift-0.1.0/licenses/third-party/29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4.txt +26 -0
  98. chooong_datasift-0.1.0/licenses/third-party/3290ae0fbc9ddb77d2239121d710f0bb9d31b3b4744e6d97fe01e652b4c1870b.txt +29 -0
  99. chooong_datasift-0.1.0/licenses/third-party/32c76dbe0e73d79100d5ece77c158399f2e2541bc5c78548a4ba45c1cb53c5c9.txt +178 -0
  100. chooong_datasift-0.1.0/licenses/third-party/35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab.txt +176 -0
  101. chooong_datasift-0.1.0/licenses/third-party/377c2e7c53250cc5905c0b0532d35973392af16ffb9596a41d99d202cf3617c9.txt +29 -0
  102. chooong_datasift-0.1.0/licenses/third-party/378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397.txt +25 -0
  103. chooong_datasift-0.1.0/licenses/third-party/3823dda7cf046602f4b4e77ec8e227863dc4736037cc85bb33d9f19febe16bb7.txt +258 -0
  104. chooong_datasift-0.1.0/licenses/third-party/3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c.txt +25 -0
  105. chooong_datasift-0.1.0/licenses/third-party/42a35170233e83e18856792e748de4c1ce4a63b2afce9a370c89ef3fe23f9f2d.txt +21 -0
  106. chooong_datasift-0.1.0/licenses/third-party/42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737.txt +26 -0
  107. chooong_datasift-0.1.0/licenses/third-party/436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d.txt +26 -0
  108. chooong_datasift-0.1.0/licenses/third-party/45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42.txt +25 -0
  109. chooong_datasift-0.1.0/licenses/third-party/47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865.txt +7 -0
  110. chooong_datasift-0.1.0/licenses/third-party/495c30b45120f8af07cfa26eb9cb1ebfe8324560dca2b3b1e76cad1b9b6b489a.txt +29 -0
  111. chooong_datasift-0.1.0/licenses/third-party/4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f.txt +25 -0
  112. chooong_datasift-0.1.0/licenses/third-party/4da95ec4ecb65b738d470b7d762894ad9c97da93e6cbfb18b570fc2c96f4b871.txt +25 -0
  113. chooong_datasift-0.1.0/licenses/third-party/508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1.txt +19 -0
  114. chooong_datasift-0.1.0/licenses/third-party/516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406.txt +201 -0
  115. chooong_datasift-0.1.0/licenses/third-party/523a42c25d245dde9c015f882cec7f4555aad883382a6cf19b4b7d9b2cd5419b.txt +26 -0
  116. chooong_datasift-0.1.0/licenses/third-party/58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79.txt +21 -0
  117. chooong_datasift-0.1.0/licenses/third-party/5a93d5831e1297ab10fe643e1a631e83be392896da14ee2951285a79012df69d.txt +11 -0
  118. chooong_datasift-0.1.0/licenses/third-party/5b3d8a674979e158328c57f5c4cc12150df79d0bdf12c86eafc2e9c6006a2d4e.txt +29 -0
  119. chooong_datasift-0.1.0/licenses/third-party/61d383b05b87d78f94d2937e2580cce47226d17823c0430fbcad09596537efcf.txt +21 -0
  120. chooong_datasift-0.1.0/licenses/third-party/62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3.txt +25 -0
  121. chooong_datasift-0.1.0/licenses/third-party/62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a.txt +176 -0
  122. chooong_datasift-0.1.0/licenses/third-party/6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb.txt +25 -0
  123. chooong_datasift-0.1.0/licenses/third-party/65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee.txt +25 -0
  124. chooong_datasift-0.1.0/licenses/third-party/66e3ee1fa7f909ad3c612d556f2a0cdabcd809ad6e66f3b0605015ac64841b70.txt +21 -0
  125. chooong_datasift-0.1.0/licenses/third-party/696759d65dfe558ff7d9f031c76db19ec5c0767470fb67c4e8d990820d1e99c9.txt +201 -0
  126. chooong_datasift-0.1.0/licenses/third-party/6b1691fdee3b03c3946696a7be125fcf50eff310b9486fac850c1b8aea91478b.txt +29 -0
  127. chooong_datasift-0.1.0/licenses/third-party/6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51.txt +187 -0
  128. chooong_datasift-0.1.0/licenses/third-party/70c9d40f1f9545c3f133b8a67206e89da850f6468eed072281bb3701514114a9.txt +25 -0
  129. chooong_datasift-0.1.0/licenses/third-party/7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349.txt +25 -0
  130. chooong_datasift-0.1.0/licenses/third-party/73b9dc2e79c7308998dd30296e073aefaefb944a68fb89aa412c23c0edcabcaa.txt +25 -0
  131. chooong_datasift-0.1.0/licenses/third-party/74db5baf44a41b1000312c673544b3374e4198af5605c7f9080a402cec42cfa3.txt +57 -0
  132. chooong_datasift-0.1.0/licenses/third-party/769f80b5bcb42ed0af4e4d2fd74e1ac9bf843cb80c5a29219d1ef3544428a6bb.txt +201 -0
  133. chooong_datasift-0.1.0/licenses/third-party/7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0.txt +25 -0
  134. chooong_datasift-0.1.0/licenses/third-party/7b724c8fa4a82af733caccabdaa21e2bf8bcb0822fe62d5cf03f99d458438705.txt +201 -0
  135. chooong_datasift-0.1.0/licenses/third-party/7ca1297d23644e30bd489193a82a33f324e5fe33f25df4195649b91b883df967.txt +27 -0
  136. chooong_datasift-0.1.0/licenses/third-party/831e0f43ad0bf014c1c4fec5767aae470434c1d66d6e671be2d823e729063e25.txt +28 -0
  137. chooong_datasift-0.1.0/licenses/third-party/838118388fe5c2e7f1dbbaeed13e1c7f3ebf88be91319c7c1d77c18e987d1a50.txt +26 -0
  138. chooong_datasift-0.1.0/licenses/third-party/83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32.txt +24 -0
  139. chooong_datasift-0.1.0/licenses/third-party/84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151.txt +11 -0
  140. chooong_datasift-0.1.0/licenses/third-party/8569ebf6bf52937b961d9c9c934d8400a2bb6b09651a9afacbb3fc18fe5c09b1.txt +25 -0
  141. chooong_datasift-0.1.0/licenses/third-party/8764a597675778ddfd4e25f81b08a05dbcf089ac05662df7613fe67f150e3aa2.txt +25 -0
  142. chooong_datasift-0.1.0/licenses/third-party/87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b.txt +201 -0
  143. chooong_datasift-0.1.0/licenses/third-party/90567e2718bf7fd65a71a3a43c5596488e80e5f51ed02bfea6fec54458b5f3d1.txt +8266 -0
  144. chooong_datasift-0.1.0/licenses/third-party/90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5.txt +12 -0
  145. chooong_datasift-0.1.0/licenses/third-party/946c9835d8034d24404f8cfec5f4654cee5dad17e944afc3d06d742cf2882831.txt +240 -0
  146. chooong_datasift-0.1.0/licenses/third-party/98181e7249d0c01737645ec982499ce99a0f07eb8f7d625b8840d799d10dbc01.txt +25 -0
  147. chooong_datasift-0.1.0/licenses/third-party/9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3.txt +202 -0
  148. chooong_datasift-0.1.0/licenses/third-party/a01a418b6ffb1de8f4c3814e386b35e1a93a14529b68f17d286550f355b298e1.txt +21 -0
  149. chooong_datasift-0.1.0/licenses/third-party/a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2.txt +201 -0
  150. chooong_datasift-0.1.0/licenses/third-party/a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9.txt +176 -0
  151. chooong_datasift-0.1.0/licenses/third-party/a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f.txt +21 -0
  152. chooong_datasift-0.1.0/licenses/third-party/a8799c2a07dabcb8d52481f885c5ab7000acb8a4d3cd9503fbcb97c84d350e65.txt +29 -0
  153. chooong_datasift-0.1.0/licenses/third-party/a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5.txt +201 -0
  154. chooong_datasift-0.1.0/licenses/third-party/aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf.txt +201 -0
  155. chooong_datasift-0.1.0/licenses/third-party/ab499c75a0f0da8e0fe83bf9ba3a27e5c39705310f07107c6c66b69958d2401c.txt +21 -0
  156. chooong_datasift-0.1.0/licenses/third-party/aecc100d0547aa3bcbe04bcf5cb87c7db0be11004602adfa5056edf8bb847b35.txt +201 -0
  157. chooong_datasift-0.1.0/licenses/third-party/af59cea35d7f5e2777a713b8d155d65efa2c339eb43f3c14e868c6ac8506edad.txt +26 -0
  158. chooong_datasift-0.1.0/licenses/third-party/afcbe3b2e6b37172b5a9ca869ee4c0b8cdc09316e5d4384864154482c33e5af6.txt +25 -0
  159. chooong_datasift-0.1.0/licenses/third-party/b05785f9f18e6716bab63424b11454513b9943a222595b70411009202fc592b5.txt +18 -0
  160. chooong_datasift-0.1.0/licenses/third-party/b1181a40b2a7b25cf66fd01481713bc1005df082c53ef73e851e55071b102744.txt +19 -0
  161. chooong_datasift-0.1.0/licenses/third-party/b71bd43a069ca0641a9ecfe585ca7b3c53b5cc1608f8b68321168698e28b5ea1.txt +25 -0
  162. chooong_datasift-0.1.0/licenses/third-party/bfb1112d49db5b1daecdfef24bd7e2f3ea0bafb33aa67aa0ab51e2bf8407c03d.txt +11 -0
  163. chooong_datasift-0.1.0/licenses/third-party/c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b.txt +201 -0
  164. chooong_datasift-0.1.0/licenses/third-party/c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383.txt +21 -0
  165. chooong_datasift-0.1.0/licenses/third-party/c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08.txt +202 -0
  166. chooong_datasift-0.1.0/licenses/third-party/c9bff75738922193e67fa726fa225535870d2aa1059f91452c411736284ad566.txt +23 -0
  167. chooong_datasift-0.1.0/licenses/third-party/cc8cc7f31c5f26b85702a161ba09bbe8b77a473c370709939e89db848b9d1f30.txt +29 -0
  168. chooong_datasift-0.1.0/licenses/third-party/cdea3888d561fddcce138060983f9e78c81fc7927a50938303508a8d254ee8fc.txt +21 -0
  169. chooong_datasift-0.1.0/licenses/third-party/cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30.txt +202 -0
  170. chooong_datasift-0.1.0/licenses/third-party/d00d6d48df2db6f91e4ca9c656e5e30782d5becf52bb3e5bfd0aff467bd37781.txt +29 -0
  171. chooong_datasift-0.1.0/licenses/third-party/d2e7ec5355c96eeade56b09187ceb48a6a30299da3ce7531a66d3d11405ab963.txt +25 -0
  172. chooong_datasift-0.1.0/licenses/third-party/d415a86ccfd794129666247cbbadebee7a6d0ac3ff701c76c07b0f9424f0307d.txt +29 -0
  173. chooong_datasift-0.1.0/licenses/third-party/da28ccc6b158fc2d8cccc74e99794b1cff1d29bd7bbeb019442fcf0c04c6cad9.txt +25 -0
  174. chooong_datasift-0.1.0/licenses/third-party/db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a.txt +1 -0
  175. chooong_datasift-0.1.0/licenses/third-party/e196ffeb5ab101e9ec8bbe395c9f367c5380ee2d28c47e5c03371523798a9af7.txt +29 -0
  176. chooong_datasift-0.1.0/licenses/third-party/e34c58338bd89d43e709e226610d8f32b3e3c47f4ad9a99a8dc1d4ac7842488e.txt +15 -0
  177. chooong_datasift-0.1.0/licenses/third-party/e5b198d7f809311723889814d99a92f808c69e89a847efa7a7b65270f5fdeae6.txt +13 -0
  178. chooong_datasift-0.1.0/licenses/third-party/e72111c52b7d96ebe25348dee19f0744f444d3c95ae6b1ecb6ccaecc5bce05ba.txt +19 -0
  179. chooong_datasift-0.1.0/licenses/third-party/ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055.txt +25 -0
  180. chooong_datasift-0.1.0/licenses/third-party/ef2b3bbd7b718a7881253226313f103e89b379e1279681a3c1ebcb65a27d209d.txt +25 -0
  181. chooong_datasift-0.1.0/licenses/third-party/f0c1d22de8bd3b776a40f2691f08b84e91c7bafc78b72a51150e231002b88db3.txt +29 -0
  182. chooong_datasift-0.1.0/licenses/third-party/f0cf9b1c62bbe3bd3a69f5f79c7158f513f612b4940a0a812d1db39d605318bc.txt +23 -0
  183. chooong_datasift-0.1.0/licenses/third-party/f59bcb1c02654665f78a5f290bae76b6358137675f6459f51e6d474a4623d8ea.txt +21 -0
  184. chooong_datasift-0.1.0/licenses/third-party/f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1.txt +39 -0
  185. chooong_datasift-0.1.0/licenses/third-party/f8218253704e32441cafea1b9b3bcb2c6a3c51c5553cd8513d179290202bccb2.txt +21 -0
  186. chooong_datasift-0.1.0/licenses/third-party/fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7.txt +25 -0
  187. chooong_datasift-0.1.0/licenses/third-party/fd80a26fbb3f644af1fa994134446702932968519797227e07a1368dea80f0bc.txt +5 -0
  188. chooong_datasift-0.1.0/licenses/third-party/ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2.txt +25 -0
  189. chooong_datasift-0.1.0/mkdocs.yml +96 -0
  190. chooong_datasift-0.1.0/pyproject.toml +202 -0
  191. chooong_datasift-0.1.0/release/__init__.py +1 -0
  192. chooong_datasift-0.1.0/release/prepare.py +92 -0
  193. chooong_datasift-0.1.0/release/push.py +125 -0
  194. chooong_datasift-0.1.0/release/shared.py +141 -0
  195. chooong_datasift-0.1.0/rust-toolchain.toml +4 -0
  196. chooong_datasift-0.1.0/scripts/__init__.py +0 -0
  197. chooong_datasift-0.1.0/scripts/artifacts.py +825 -0
  198. chooong_datasift-0.1.0/scripts/bench.py +11 -0
  199. chooong_datasift-0.1.0/scripts/docs.py +329 -0
  200. chooong_datasift-0.1.0/scripts/license_binary.py +166 -0
  201. chooong_datasift-0.1.0/scripts/licenses.py +810 -0
  202. chooong_datasift-0.1.0/scripts/verify_publish.py +110 -0
  203. chooong_datasift-0.1.0/src/chooong/datasift/__init__.py +103 -0
  204. chooong_datasift-0.1.0/src/chooong/datasift/__main__.py +95 -0
  205. chooong_datasift-0.1.0/src/chooong/datasift/models.py +383 -0
  206. chooong_datasift-0.1.0/src/chooong/datasift/py.typed +0 -0
  207. chooong_datasift-0.1.0/src/chooong/datasift/reader.py +191 -0
  208. chooong_datasift-0.1.0/src/chooong/datasift/rust.pyi +34 -0
  209. chooong_datasift-0.1.0/tests/__init__.py +0 -0
  210. chooong_datasift-0.1.0/tests/api/__init__.py +0 -0
  211. chooong_datasift-0.1.0/tests/api/test_iterators.py +69 -0
  212. chooong_datasift-0.1.0/tests/api/test_models.py +86 -0
  213. chooong_datasift-0.1.0/tests/api/test_reader.py +28 -0
  214. chooong_datasift-0.1.0/tests/benchmarks/README.md +9 -0
  215. chooong_datasift-0.1.0/tests/benchmarks/__init__.py +1 -0
  216. chooong_datasift-0.1.0/tests/benchmarks/conftest.py +33 -0
  217. chooong_datasift-0.1.0/tests/benchmarks/generate.py +144 -0
  218. chooong_datasift-0.1.0/tests/benchmarks/models.py +114 -0
  219. chooong_datasift-0.1.0/tests/benchmarks/runner.py +251 -0
  220. chooong_datasift-0.1.0/tests/benchmarks/test_export.py +16 -0
  221. chooong_datasift-0.1.0/tests/benchmarks/test_filter_complexity.py +16 -0
  222. chooong_datasift-0.1.0/tests/benchmarks/test_memory.py +26 -0
  223. chooong_datasift-0.1.0/tests/benchmarks/test_regression.py +20 -0
  224. chooong_datasift-0.1.0/tests/benchmarks/test_scalability.py +16 -0
  225. chooong_datasift-0.1.0/tests/benchmarks/test_smoke.py +45 -0
  226. chooong_datasift-0.1.0/tests/benchmarks/test_throughput.py +20 -0
  227. chooong_datasift-0.1.0/tests/benchmarks/worker.py +202 -0
  228. chooong_datasift-0.1.0/tests/conftest.py +42 -0
  229. chooong_datasift-0.1.0/tests/discovery/__init__.py +0 -0
  230. chooong_datasift-0.1.0/tests/discovery/test_headers.py +394 -0
  231. chooong_datasift-0.1.0/tests/discovery/test_row_classes.py +75 -0
  232. chooong_datasift-0.1.0/tests/discovery/test_sources.py +274 -0
  233. chooong_datasift-0.1.0/tests/discovery/test_tables.py +207 -0
  234. chooong_datasift-0.1.0/tests/discovery/test_worksheets.py +64 -0
  235. chooong_datasift-0.1.0/tests/filtering/__init__.py +0 -0
  236. chooong_datasift-0.1.0/tests/filtering/test_operators.py +114 -0
  237. chooong_datasift-0.1.0/tests/filtering/test_projection.py +136 -0
  238. chooong_datasift-0.1.0/tests/filtering/test_validation.py +70 -0
  239. chooong_datasift-0.1.0/tests/fixtures/__init__.py +0 -0
  240. chooong_datasift-0.1.0/tests/fixtures/csv.py +11 -0
  241. chooong_datasift-0.1.0/tests/fixtures/excel.py +475 -0
  242. chooong_datasift-0.1.0/tests/fixtures/masks.py +111 -0
  243. chooong_datasift-0.1.0/tests/fixtures/results.py +52 -0
  244. chooong_datasift-0.1.0/tests/formats/__init__.py +0 -0
  245. chooong_datasift-0.1.0/tests/formats/test_csv.py +26 -0
  246. chooong_datasift-0.1.0/tests/formats/test_excel.py +178 -0
  247. chooong_datasift-0.1.0/tests/integration/__init__.py +0 -0
  248. chooong_datasift-0.1.0/tests/integration/test_cli.py +487 -0
  249. chooong_datasift-0.1.0/tests/integration/test_quickstart.py +79 -0
  250. chooong_datasift-0.1.0/tests/output/__init__.py +0 -0
  251. chooong_datasift-0.1.0/tests/output/test_ndjson.py +62 -0
  252. chooong_datasift-0.1.0/tests/output/test_recovery.py +217 -0
  253. chooong_datasift-0.1.0/tests/streaming/__init__.py +0 -0
  254. chooong_datasift-0.1.0/tests/streaming/test_batches.py +27 -0
  255. chooong_datasift-0.1.0/tests/streaming/test_statistics.py +89 -0
  256. chooong_datasift-0.1.0/tests/types/__init__.py +0 -0
  257. chooong_datasift-0.1.0/tests/types/test_datetime.py +96 -0
  258. chooong_datasift-0.1.0/tests/types/test_money.py +53 -0
  259. chooong_datasift-0.1.0/tests/types/test_numeric.py +80 -0
  260. chooong_datasift-0.1.0/tooling/__init__.py +0 -0
  261. chooong_datasift-0.1.0/tooling/tests/__init__.py +0 -0
  262. chooong_datasift-0.1.0/tooling/tests/conftest.py +206 -0
  263. chooong_datasift-0.1.0/tooling/tests/fixtures.py +139 -0
  264. chooong_datasift-0.1.0/tooling/tests/license_fixtures.py +135 -0
  265. chooong_datasift-0.1.0/tooling/tests/test_artifacts.py +261 -0
  266. chooong_datasift-0.1.0/tooling/tests/test_benchmark_platform.py +34 -0
  267. chooong_datasift-0.1.0/tooling/tests/test_documentation.py +221 -0
  268. chooong_datasift-0.1.0/tooling/tests/test_licenses.py +455 -0
  269. chooong_datasift-0.1.0/tooling/tests/test_preparation.py +85 -0
  270. chooong_datasift-0.1.0/tooling/tests/test_publish_verification.py +45 -0
  271. chooong_datasift-0.1.0/tooling/tests/test_pypi_verification.py +59 -0
  272. chooong_datasift-0.1.0/tooling/tests/test_release.py +145 -0
  273. chooong_datasift-0.1.0/tooling/tests/test_release_push.py +64 -0
  274. chooong_datasift-0.1.0/uv.lock +1719 -0
@@ -0,0 +1,137 @@
1
+ # Releasing
2
+
3
+ Version `0.1.0` remains unreleased. Publishing requires explicit authorization;
4
+ Pages deployment remains disabled.
5
+ The project version in `pyproject.toml` is authoritative; Cargo and both lockfiles
6
+ must agree. Preparation supports canonical final PEP 440 versions (`X.Y.Z`).
7
+
8
+ ## Prepare and review
9
+
10
+ From a clean, current `main` with uv, Rust and authenticated GitHub CLI installed:
11
+
12
+ <!-- check: syntax -->
13
+
14
+ ```bash
15
+ uv run release/prepare.py --version 0.1.0 --dry-run
16
+ uv run release/prepare.py --version 0.1.0
17
+ uv run release/push.py --dry-run
18
+ uv run release/push.py
19
+ ```
20
+
21
+ The changelog retains exactly one `## Unreleased` heading with user-facing notes.
22
+ Preparation checks PyPI, synchronizes version entries and moves Unreleased notes
23
+ into one versioned section. Repeating it does not duplicate notes. Network failures
24
+ block preparation. The push command stages only release files, creates
25
+ `release/vX.Y.Z` and opens or reuses one PR against `main`. Neither command creates
26
+ a tag, merges a PR or publishes a release. Unrelated changes are rejected.
27
+
28
+ ## Validate distributions
29
+
30
+ CI and **Release dry run** share the five-platform ABI3 build matrix: Linux x86_64
31
+ and ARM64, macOS x86_64 and ARM64, and Windows x86_64. Every wheel and the sdist is
32
+ installed in isolated Python 3.12, 3.13 and 3.14 environments on a matching runner.
33
+ Builds use `uvx` with the Maturin version pinned in `pyproject.toml`, the Rust
34
+ toolchain from `rust-toolchain.toml`, and `--release --locked`. Python 3.12 is
35
+ installed explicitly for the ABI3 build. Linux uses `ziglang==0.15.2` as a
36
+ build-only linker with `--zig --compatibility manylinux_2_28 --auditwheel check`;
37
+ macOS and Windows use their native toolchains. No Maturin GitHub Action is required.
38
+ The gate binds each artifact and JUnit report to one commit/version and checks
39
+ metadata, tags, licenses, inventories and SHA-256 hashes. Missing platforms,
40
+ failed/skipped tests or modified bytes block the complete set. `.gitattributes`
41
+ checks out `LICENSE` with LF endings on every build host, including Windows;
42
+ license comparisons remain byte-for-byte and do not normalize artifact contents.
43
+
44
+ Run **Release dry run** manually with the committed version and `publish: false`.
45
+ Validation jobs run for both private and public repositories. Record actual
46
+ platform results in the PR. Benchmarks are a separate
47
+ manual workflow; see [Benchmarks](../docs/development/benchmarks.md).
48
+
49
+ For a local artifact, put exactly one wheel or sdist in `bundle/dist/`:
50
+
51
+ <!-- check: syntax -->
52
+
53
+ ```bash
54
+ uv run python scripts/artifacts.py plan
55
+ uv run python scripts/artifacts.py test --kind wheel --target macos-arm64
56
+ # For the sdist, use a separate bundle:
57
+ uv run python scripts/artifacts.py test --kind sdist --target sdist --bundle sdist-bundle
58
+ # After collecting all native wheel receipts and the sdist receipt:
59
+ uv run python scripts/artifacts.py gate --bundle bundle --output verified
60
+ ```
61
+
62
+ The checkout must be clean and committed for testing/gating. Synthetic tooling
63
+ fixtures test rejection logic and do not qualify native platforms.
64
+
65
+ ## Authorize publication separately
66
+
67
+ After the release PR is merged, review and explicitly approve its exact commit.
68
+ Only then create a non-overwriting `vX.Y.Z` tag on that commit. Tag creation and
69
+ push are manual owner actions. The workflow does not run automatically on tags.
70
+
71
+ Publishing requires `PYPI_PUBLISH_ENABLED=true`, verified PyPI project ownership
72
+ and Trusted Publisher configuration, and a protected `pypi` environment with
73
+ required reviewers. Disable any historical
74
+ GitLab publisher/broker permissions before activation. Do not change repository
75
+ visibility or organization billing settings as part of release preparation.
76
+
77
+ Once these prerequisites are satisfied, dispatch the release workflow on that tag with the
78
+ matching version, exact `approved-commit` and `publish: true`. It verifies the tag,
79
+ commit and ancestry on `main`, builds/tests once and hands immutable artifact ID
80
+ and authenticated checksums to the environment-gated OIDC publisher. The publisher
81
+ rechecks bytes without rebuilding, refuses `skip-existing`, and verifies the exact
82
+ published file set and downloaded PyPI bytes. GitHub Release creation follows only
83
+ after that verification. A partial upload needs investigation before recovery.
84
+
85
+ The publishing job directly requires both `release-identity` and `distributions`
86
+ to succeed. Keep this explicit identity gate even when distribution builds also
87
+ depend on it.
88
+
89
+ ## Documentation deployment
90
+
91
+ Pages deployment remains hard-disabled. The prepared workflow builds the site,
92
+ checks its sources/examples and uploads only `site/`. Enabling deployment needs
93
+ an explicit reviewed change to the literal `false` guards,
94
+ `PAGES_DEPLOY_ENABLED=true` and an authorized GitHub Pages environment. Do not
95
+ change repository visibility, organization settings or budget guards as a shortcut.
96
+ The package Documentation URL stays on GitHub until Pages is reachable and authorized.
97
+
98
+ ## Publisher identity
99
+
100
+ Configure a pending PyPI Trusted Publisher for distribution `chooong.datasift`
101
+ with owner `chooong-group`, repository `chooong.datasift`, workflow `release.yml`
102
+ and environment `pypi`. The workflow filename is case-sensitive. Configure this
103
+ in the owning PyPI account; a repository setting cannot establish PyPI ownership.
104
+ Use OIDC rather than adding a PyPI API token to GitHub secrets.
105
+
106
+ Restrict `.github/workflows/release.yml` to the release owner with an active
107
+ [Actions policy](https://docs.github.com/en/actions/how-tos/administer/control-workflow-execution).
108
+ A manual trigger alone allows users with repository write access to start workflows.
109
+ Configure the owner as a required reviewer in the `pypi` environment. For the
110
+ owner to start and approve the same deployment, leave **Prevent self-review** off;
111
+ see [environment protection](https://docs.github.com/en/actions/reference/workflows-and-actions/deployments-and-environments).
112
+ Restrict deployments to version tags (`v*`, type `tag`), not branch `main`.
113
+ The workflow independently checks exact version, approved commit and main ancestry;
114
+ the tag pattern alone is not release authorization. Verify the reviewer and tag
115
+ rules through GitHub settings after saving them. If the repository plan cannot
116
+ enforce approval, keep publishing disabled until an approved protection mechanism
117
+ is available. Do not upgrade billing or relax checks to bypass that limitation.
118
+
119
+ ## First public release review
120
+
121
+ Review all reachable branches, commit messages, authors, PR bodies/comments,
122
+ review attachments and historical workflow logs/artifacts before changing
123
+ visibility. Squash merging a PR removes neither old PR records nor commits still
124
+ reachable through branches or GitHub PR refs. Deleting a working-tree document
125
+ also does not erase its history. Resolve sensitive findings with the owner before
126
+ exposure; secret rotation and GitHub support may be necessary. Never rewrite
127
+ history or delete records as an automatic preparation step.
128
+
129
+ Keep the changelog as the release-note source. Prepare the versioned section only
130
+ under a separate release authorization; review its text before the publisher
131
+ creates the GitHub Release. Do not add CI logs, process ledgers or local paths to
132
+ user-facing release notes. README installation instructions are version-independent
133
+ and its PyPI badge reads the version dynamically. Release preparation changes only
134
+ package metadata, lockfiles and CHANGELOG.md; README.md must remain byte-identical
135
+ through preparation and subsequent releases. Keep documentation hosting changes
136
+ separate from release version updates; check Pages anonymously before changing
137
+ repository documentation links.
@@ -0,0 +1,15 @@
1
+ name: Locked Python and Rust tooling
2
+ description: Install the pinned uv version, locked development dependencies and Rust toolchain
3
+ runs:
4
+ using: composite
5
+ steps:
6
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
7
+ with:
8
+ version: "0.11.21"
9
+ enable-cache: false
10
+ - shell: bash
11
+ run: uv sync --frozen --no-install-project --python 3.13
12
+ - shell: bash
13
+ run: uv run --frozen --no-sync python -c 'import sysconfig; print(sysconfig.get_path("scripts"))' >> "$GITHUB_PATH"
14
+ - shell: bash
15
+ run: rustup show
@@ -0,0 +1,10 @@
1
+ {
2
+ "format_version": 1,
3
+ "wheels": [
4
+ {"id": "linux-x86_64", "runner": "ubuntu-24.04", "system": "Linux", "machine": "x86_64", "rust_target": "x86_64-unknown-linux-gnu", "platform_tag": "manylinux_2_28_x86_64", "manylinux": "2_28"},
5
+ {"id": "linux-arm64", "runner": "ubuntu-24.04-arm", "system": "Linux", "machine": "arm64", "rust_target": "aarch64-unknown-linux-gnu", "platform_tag": "manylinux_2_28_aarch64", "manylinux": "2_28"},
6
+ {"id": "windows-x86_64", "runner": "windows-2022", "system": "Windows", "machine": "x86_64", "rust_target": "x86_64-pc-windows-msvc", "platform_tag": "win_amd64", "manylinux": null},
7
+ {"id": "macos-x86_64", "runner": "macos-15-intel", "system": "Darwin", "machine": "x86_64", "rust_target": "x86_64-apple-darwin", "platform_tag": "macosx_11_0_x86_64", "manylinux": null},
8
+ {"id": "macos-arm64", "runner": "macos-15", "system": "Darwin", "machine": "arm64", "rust_target": "aarch64-apple-darwin", "platform_tag": "macosx_11_0_arm64", "manylinux": null}
9
+ ]
10
+ }
@@ -0,0 +1,160 @@
1
+ name: Build and test distributions
2
+ on:
3
+ workflow_call:
4
+ inputs:
5
+ version:
6
+ type: string
7
+ required: false
8
+ default: ""
9
+ outputs:
10
+ artifact-id:
11
+ value: ${{ jobs.gate.outputs.artifact-id }}
12
+ description: Immutable artifact containing the verified distribution set
13
+ checksums-sha256:
14
+ value: ${{ jobs.gate.outputs.checksums-sha256 }}
15
+ description: Authenticated checksum manifest for the publishing job
16
+ concurrency:
17
+ group: artifacts-${{ github.workflow }}-${{ github.ref }}
18
+ cancel-in-progress: false
19
+ permissions:
20
+ contents: read
21
+ jobs:
22
+ plan:
23
+ runs-on: ubuntu-24.04
24
+ timeout-minutes: 15
25
+ outputs:
26
+ matrix: ${{ steps.plan.outputs.matrix }}
27
+ maturin: ${{ steps.plan.outputs.maturin }}
28
+ rust: ${{ steps.plan.outputs.rust }}
29
+ python: ${{ steps.plan.outputs.python }}
30
+ steps:
31
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
32
+ with:
33
+ persist-credentials: false
34
+ - uses: ./.github/actions/tooling
35
+ - id: plan
36
+ env:
37
+ RELEASE_VERSION: ${{ inputs.version }}
38
+ run: |
39
+ args=()
40
+ if [ -n "$RELEASE_VERSION" ]; then args+=(--version "$RELEASE_VERSION"); fi
41
+ uv run --frozen --no-sync python scripts/artifacts.py plan --commit "$GITHUB_SHA" --github-output "$GITHUB_OUTPUT" "${args[@]}"
42
+ wheel:
43
+ needs: plan
44
+ strategy:
45
+ fail-fast: false
46
+ matrix: ${{ fromJSON(needs.plan.outputs.matrix) }}
47
+ runs-on: ${{ matrix.runner }}
48
+ timeout-minutes: 40
49
+ defaults:
50
+ run:
51
+ shell: bash
52
+ env:
53
+ MACOSX_DEPLOYMENT_TARGET: "11.0"
54
+ steps:
55
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
56
+ with:
57
+ persist-credentials: false
58
+ - uses: ./.github/actions/tooling
59
+ - run: mkdir -p bundle/dist bundle/evidence
60
+ - name: Build the native ABI3 wheel with pinned Maturin
61
+ env:
62
+ MATURIN_VERSION: ${{ needs.plan.outputs.maturin }}
63
+ RUSTUP_TOOLCHAIN: ${{ needs.plan.outputs.rust }}
64
+ BUILD_PYTHON: ${{ needs.plan.outputs.python }}
65
+ RUST_TARGET: ${{ matrix.rust_target }}
66
+ MANYLINUX: ${{ matrix.manylinux }}
67
+ run: |
68
+ uv python install "$BUILD_PYTHON"
69
+ build_python=$(uv python find "$BUILD_PYTHON")
70
+ rustup target add "$RUST_TARGET" --toolchain "$RUSTUP_TOOLCHAIN"
71
+ rustc --version
72
+ tools=()
73
+ args=()
74
+ if [ -n "$MANYLINUX" ]; then
75
+ # Zig supplies the older glibc baseline on the native Ubuntu runners.
76
+ tools+=(--with ziglang==0.15.2)
77
+ args+=(--zig --compatibility "manylinux_$MANYLINUX" --auditwheel check)
78
+ fi
79
+ uvx --python "$BUILD_PYTHON" --from "maturin==$MATURIN_VERSION" "${tools[@]}" maturin build \
80
+ --release --locked --target "$RUST_TARGET" --out bundle/dist \
81
+ --interpreter "$build_python" "${args[@]}"
82
+ - name: Audit the actual wheel and dependency licenses
83
+ env:
84
+ TARGET_ID: ${{ matrix.id }}
85
+ run: uv run --frozen --no-sync python scripts/licenses.py audit --dist bundle/dist --output "bundle/licenses/$TARGET_ID.json"
86
+ - name: Preserve license findings even when release is blocked
87
+ if: ${{ always() }}
88
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
89
+ with:
90
+ name: license-audit-${{ matrix.id }}
91
+ path: bundle/licenses/
92
+ if-no-files-found: error
93
+ retention-days: 7
94
+ - name: Install the exact wheel and test all supported Python versions natively
95
+ env:
96
+ TARGET_ID: ${{ matrix.id }}
97
+ run: uv run --frozen --no-sync python scripts/artifacts.py test --kind wheel --target "$TARGET_ID" --commit "$GITHUB_SHA"
98
+ - run: uv run --frozen --no-sync twine check bundle/dist/*
99
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
100
+ with:
101
+ name: candidate-${{ matrix.id }}
102
+ path: bundle/
103
+ if-no-files-found: error
104
+ retention-days: 7
105
+ sdist:
106
+ needs: plan
107
+ runs-on: ubuntu-24.04
108
+ timeout-minutes: 40
109
+ steps:
110
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
111
+ with:
112
+ persist-credentials: false
113
+ - uses: ./.github/actions/tooling
114
+ - run: uv build --sdist --out-dir bundle/dist
115
+ - name: Audit the actual source distribution and dependency licenses
116
+ run: uv run --frozen --no-sync python scripts/licenses.py audit --dist bundle/dist --output bundle/licenses/sdist.json
117
+ - name: Preserve license findings even when release is blocked
118
+ if: ${{ always() }}
119
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
120
+ with:
121
+ name: license-audit-sdist
122
+ path: bundle/licenses/
123
+ if-no-files-found: error
124
+ retention-days: 7
125
+ - name: Build and install the exact sdist in clean Python 3.12, 3.13 and 3.14 environments
126
+ run: uv run --frozen --no-sync python scripts/artifacts.py test --kind sdist --target sdist --commit "$GITHUB_SHA"
127
+ - run: uv run --frozen --no-sync twine check bundle/dist/*
128
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
129
+ with:
130
+ name: candidate-sdist
131
+ path: bundle/
132
+ if-no-files-found: error
133
+ retention-days: 7
134
+ gate:
135
+ needs: [plan, wheel, sdist]
136
+ runs-on: ubuntu-24.04
137
+ timeout-minutes: 15
138
+ outputs:
139
+ artifact-id: ${{ steps.upload.outputs.artifact-id }}
140
+ checksums-sha256: ${{ steps.gate.outputs.checksums-sha256 }}
141
+ steps:
142
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
143
+ with:
144
+ persist-credentials: false
145
+ - uses: ./.github/actions/tooling
146
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
147
+ with:
148
+ pattern: candidate-*
149
+ merge-multiple: true
150
+ path: bundle
151
+ - id: gate
152
+ run: uv run --frozen --no-sync python scripts/artifacts.py gate --commit "$GITHUB_SHA" --github-output "$GITHUB_OUTPUT"
153
+ - run: uv run --frozen --no-sync twine check verified/dist/*
154
+ - id: upload
155
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
156
+ with:
157
+ name: verified-candidate
158
+ path: verified/
159
+ if-no-files-found: error
160
+ retention-days: 7
@@ -0,0 +1,67 @@
1
+ name: Performance measurements
2
+ on:
3
+ workflow_dispatch:
4
+ inputs:
5
+ baseline-tag:
6
+ description: Optional previously released vX.Y.Z tag; empty creates an initial baseline
7
+ required: false
8
+ type: string
9
+ permissions:
10
+ contents: read
11
+ concurrency:
12
+ group: benchmarks-${{ github.ref }}
13
+ cancel-in-progress: false
14
+ jobs:
15
+ benchmark:
16
+ runs-on: ubuntu-24.04
17
+ timeout-minutes: 120
18
+ steps:
19
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
+ with:
21
+ persist-credentials: false
22
+ fetch-depth: 0
23
+ - uses: ./.github/actions/tooling
24
+ - name: Build and install the exact release-profile candidate
25
+ shell: bash
26
+ run: |
27
+ uv build --wheel --out-dir candidate-dist
28
+ uv export --frozen --no-dev --no-emit-project --output-file candidate-dist/runtime-requirements.txt
29
+ uv venv --python 3.13 candidate-env
30
+ uv pip install --python candidate-env/bin/python --require-hashes -r candidate-dist/runtime-requirements.txt
31
+ uv pip install --python candidate-env/bin/python --no-deps candidate-dist/*.whl
32
+ uv pip check --python candidate-env/bin/python
33
+ - name: Prepare an optional released baseline on the same runner
34
+ env:
35
+ BASELINE_TAG: ${{ inputs.baseline-tag }}
36
+ GH_TOKEN: ${{ github.token }}
37
+ shell: bash
38
+ run: |
39
+ if [ -n "$BASELINE_TAG" ]; then
40
+ [[ "$BASELINE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]
41
+ gh release view "$BASELINE_TAG" --json isDraft,isPrerelease --jq 'select(.isDraft == false and .isPrerelease == false)' | grep -q .
42
+ git worktree add --detach "$RUNNER_TEMP/baseline" "$BASELINE_TAG"
43
+ uv build --wheel --directory "$RUNNER_TEMP/baseline" --out-dir "$RUNNER_TEMP/baseline-dist"
44
+ uv venv --python 3.13 baseline-env
45
+ uv pip install --python baseline-env/bin/python --require-hashes -r candidate-dist/runtime-requirements.txt
46
+ uv pip install --python baseline-env/bin/python --no-deps "$RUNNER_TEMP"/baseline-dist/*.whl
47
+ uv pip check --python baseline-env/bin/python
48
+ fi
49
+ - name: Alternate baseline and candidate measurements
50
+ env:
51
+ BASELINE_TAG: ${{ inputs.baseline-tag }}
52
+ shell: bash
53
+ run: |
54
+ args=()
55
+ if [ -n "$BASELINE_TAG" ]; then
56
+ args+=(--benchmark-baseline-python "$GITHUB_WORKSPACE/baseline-env/bin/python" --benchmark-baseline-ref "$BASELINE_TAG")
57
+ fi
58
+ uv run --frozen --no-sync pytest tests/benchmarks/ -m benchmark --benchmark-python "$GITHUB_WORKSPACE/candidate-env/bin/python" --benchmark-output "$RUNNER_TEMP/measurements" --benchmark-build-profile release "${args[@]}"
59
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
60
+ if: always()
61
+ with:
62
+ name: performance-${{ github.sha }}
63
+ path: |
64
+ ${{ runner.temp }}/measurements/results.json
65
+ ${{ runner.temp }}/measurements/results.md
66
+ if-no-files-found: error
67
+ retention-days: 30
@@ -0,0 +1,30 @@
1
+ name: Source checks
2
+ on:
3
+ workflow_call:
4
+ permissions:
5
+ contents: read
6
+ jobs:
7
+ source:
8
+ runs-on: ubuntu-24.04
9
+ timeout-minutes: 20
10
+ steps:
11
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
12
+ with:
13
+ persist-credentials: false
14
+ - uses: ./.github/actions/tooling
15
+ - run: uv lock --check
16
+ # Fail fast on editable source; artifact jobs validate exact installed distributions.
17
+ - run: uv sync --frozen
18
+ - run: uv run --frozen --no-sync pytest tests/ -m "not benchmark" --cov --cov-report=term-missing
19
+ - run: uv run --frozen --no-sync ruff check src tests tooling scripts release
20
+ - run: uv run --frozen --no-sync ruff format --check src tests tooling scripts release
21
+ - run: uv run --frozen --no-sync mypy src scripts release
22
+ - run: uv run --frozen --no-sync mypy --strict tests/benchmarks/*.py
23
+ - run: uv run --frozen --no-sync pytest tooling/tests/
24
+ - run: uv run --frozen --no-sync python scripts/artifacts.py plan
25
+ - run: cargo fmt --manifest-path datasift-core/Cargo.toml -- --check
26
+ - run: cargo clippy --manifest-path datasift-core/Cargo.toml --locked --all-targets -- -D warnings
27
+ - run: cargo test --manifest-path datasift-core/Cargo.toml --locked
28
+ - run: uv run --frozen --no-sync python scripts/docs.py
29
+ - run: uv run --frozen --no-sync mkdocs build --strict
30
+ - run: git diff --check
@@ -0,0 +1,16 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+ permissions:
7
+ contents: read
8
+ concurrency:
9
+ group: ci-${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+ jobs:
12
+ checks:
13
+ uses: ./.github/workflows/checks.yml
14
+ distributions:
15
+ needs: checks
16
+ uses: ./.github/workflows/artifacts.yml
@@ -0,0 +1,38 @@
1
+ name: Documentation deployment
2
+ on:
3
+ workflow_dispatch:
4
+ concurrency:
5
+ group: docs-pages-${{ github.ref }}
6
+ cancel-in-progress: false
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ build:
11
+ if: ${{ vars.PAGES_DEPLOY_ENABLED == 'true' && github.ref == 'refs/heads/main' }}
12
+ runs-on: ubuntu-24.04
13
+ timeout-minutes: 15
14
+ steps:
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
16
+ with:
17
+ persist-credentials: false
18
+ - uses: ./.github/actions/tooling
19
+ - run: uv sync --frozen
20
+ - run: uv run --frozen --no-sync python scripts/docs.py
21
+ - run: uv run --frozen --no-sync mkdocs build --strict
22
+ - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
23
+ with:
24
+ path: site
25
+ deploy:
26
+ if: ${{ vars.PAGES_DEPLOY_ENABLED == 'true' && github.ref == 'refs/heads/main' }}
27
+ needs: build
28
+ runs-on: ubuntu-24.04
29
+ timeout-minutes: 10
30
+ environment:
31
+ name: github-pages
32
+ url: ${{ steps.deployment.outputs.page_url }}
33
+ permissions:
34
+ pages: write
35
+ id-token: write
36
+ steps:
37
+ - id: deployment
38
+ uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
@@ -0,0 +1,101 @@
1
+ name: Release dry run
2
+ # No release/tag trigger: preparation must not publish anything automatically.
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: Exact version already committed in pyproject.toml and Cargo.toml
8
+ required: true
9
+ type: string
10
+ publish:
11
+ description: Publish only with repository enablement and protected environment approval
12
+ required: false
13
+ type: boolean
14
+ default: false
15
+ approved-commit:
16
+ description: Exact reviewed release commit SHA (required for publishing)
17
+ required: false
18
+ type: string
19
+ permissions:
20
+ contents: read
21
+ concurrency:
22
+ group: release-${{ github.ref }}
23
+ cancel-in-progress: false
24
+ jobs:
25
+ checks:
26
+ uses: ./.github/workflows/checks.yml
27
+ release-identity:
28
+ runs-on: ubuntu-24.04
29
+ timeout-minutes: 10
30
+ steps:
31
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
32
+ with:
33
+ persist-credentials: false
34
+ fetch-depth: 0
35
+ - name: Validate the explicitly approved tag and commit for publishing
36
+ if: inputs.publish
37
+ env:
38
+ VERSION: ${{ inputs.version }}
39
+ APPROVED_COMMIT: ${{ inputs.approved-commit }}
40
+ shell: bash
41
+ run: |
42
+ test "$GITHUB_REF" = "refs/tags/v$VERSION"
43
+ test "$GITHUB_SHA" = "$APPROVED_COMMIT"
44
+ test "$(git rev-parse "$GITHUB_REF^{commit}")" = "$GITHUB_SHA"
45
+ git merge-base --is-ancestor "$GITHUB_SHA" origin/main
46
+ distributions:
47
+ needs: [checks, release-identity]
48
+ uses: ./.github/workflows/artifacts.yml
49
+ with:
50
+ version: ${{ inputs.version }}
51
+ publish:
52
+ needs: [release-identity, distributions]
53
+ # Publishing also requires the exact approved identity and protected pypi environment.
54
+ if: ${{ inputs.publish && vars.PYPI_PUBLISH_ENABLED == 'true' && startsWith(github.ref, 'refs/tags/v') }}
55
+ runs-on: ubuntu-24.04
56
+ timeout-minutes: 10
57
+ environment:
58
+ name: pypi
59
+ permissions:
60
+ contents: read
61
+ id-token: write
62
+ steps:
63
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
64
+ with:
65
+ persist-credentials: false
66
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
67
+ with:
68
+ artifact-ids: ${{ needs.distributions.outputs.artifact-id }}
69
+ path: verified
70
+ - name: Recheck gate-authenticated bytes without building or installing project code
71
+ env:
72
+ EXPECTED_SHA256: ${{ needs.distributions.outputs.checksums-sha256 }}
73
+ run: python scripts/verify_publish.py verified "$EXPECTED_SHA256"
74
+ - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1
75
+ with:
76
+ packages-dir: verified/dist/
77
+ skip-existing: false
78
+ - name: Verify the published filenames and bytes on PyPI
79
+ env:
80
+ EXPECTED_SHA256: ${{ needs.distributions.outputs.checksums-sha256 }}
81
+ VERSION: ${{ inputs.version }}
82
+ run: python scripts/verify_publish.py verified "$EXPECTED_SHA256" --pypi-version "$VERSION"
83
+ github-release:
84
+ needs: publish
85
+ if: ${{ needs.publish.result == 'success' }}
86
+ runs-on: ubuntu-24.04
87
+ timeout-minutes: 10
88
+ permissions:
89
+ contents: write
90
+ steps:
91
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
92
+ with:
93
+ persist-credentials: false
94
+ - name: Publish GitHub release only after verified PyPI publication
95
+ env:
96
+ GH_TOKEN: ${{ github.token }}
97
+ VERSION: ${{ inputs.version }}
98
+ shell: bash
99
+ run: |
100
+ python -c 'import os,pathlib; text=pathlib.Path("CHANGELOG.md").read_text(); version=os.environ["VERSION"]; notes=text.split("## "+version+"\n",1)[1].split("\n## ",1)[0]; pathlib.Path("release-notes.md").write_text(notes)'
101
+ gh release create "v$VERSION" --verify-tag --title "v$VERSION" --notes-file release-notes.md
@@ -0,0 +1,6 @@
1
+ {
2
+ "plugins": {
3
+ "md013": {"line_length": 100, "code_blocks": false, "tables": false}
4
+ },
5
+ "extensions": {"markdown-tables": {"enabled": true}, "markdown-task-list-items": {"enabled": true}}
6
+ }
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.1.0
6
+
7
+ ### Added
8
+
9
+ - Streaming XLSX/XLSM and CSV input with deterministic multi-file/glob ordering.
10
+ - Automatic table discovery, worksheet selection, repeated/normalized headers,
11
+ adjacent and stacked tables, explicit column bindings and source windows.
12
+ - Composable filters, ordered projection, required/default/type rules and
13
+ explicit row classification, with exact Decimal, Money and temporal values.
14
+ - Typed Python models, immutable matching rows, closeable batches and ordered
15
+ matched/rejected records with source metadata, reasons and scan statistics.
16
+ - Native NDJSON/Parquet export and CLI, with staged output, journaled commit and
17
+ recovery bound to caller destinations and an independently trusted journal hash.
18
+ - CPython 3.12–3.14 support using a native Python 3.12 stable ABI extension.
19
+
20
+ ### Fixed
21
+
22
+ - Accept equivalent absolute Windows parent paths when validating recovery journals.
@@ -0,0 +1,28 @@
1
+ # Contributing
2
+
3
+ Work on a feature branch and submit one focused pull request. Preserve public
4
+ contracts and use synthetic inputs; never attach personal workbooks or secrets.
5
+
6
+ Install CPython 3.12–3.14, uv, Rust 1.95.0 and a native linker, then run:
7
+
8
+ <!-- check: syntax -->
9
+
10
+ ```bash
11
+ uv sync --frozen
12
+ ```
13
+
14
+ The canonical [contributor guide](docs/development/contributing.md) lists exact
15
+ lint, type, test, documentation and build commands. Run those checks before
16
+ submitting changes. It also explains runnable documentation examples and local
17
+ verification against installed wheels.
18
+
19
+ Update affected guides/API references with behavior changes. Keep
20
+ [CHANGELOG.md](CHANGELOG.md) limited to features, breaking changes, relevant
21
+ bugfixes and security changes. Report observed test failures and validation gaps
22
+ in the PR, not in public usage guides.
23
+
24
+ See [architecture](docs/development/architecture.md),
25
+ [Rust tests](datasift-core/README.md#test-structure),
26
+ [benchmarks](docs/development/benchmarks.md) and
27
+ [release procedures](.github/RELEASING.md). Version changes, tags and publication
28
+ require a separate explicit release decision. Contributions use [Apache-2.0](LICENSE).