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.
- chooong_datasift-0.1.0/.github/RELEASING.md +137 -0
- chooong_datasift-0.1.0/.github/actions/tooling/action.yml +15 -0
- chooong_datasift-0.1.0/.github/release-targets.json +10 -0
- chooong_datasift-0.1.0/.github/workflows/artifacts.yml +160 -0
- chooong_datasift-0.1.0/.github/workflows/benchmarks.yml +67 -0
- chooong_datasift-0.1.0/.github/workflows/checks.yml +30 -0
- chooong_datasift-0.1.0/.github/workflows/ci.yml +16 -0
- chooong_datasift-0.1.0/.github/workflows/docs-pages.yml +38 -0
- chooong_datasift-0.1.0/.github/workflows/release.yml +101 -0
- chooong_datasift-0.1.0/.pymarkdown.json +6 -0
- chooong_datasift-0.1.0/CHANGELOG.md +22 -0
- chooong_datasift-0.1.0/CONTRIBUTING.md +28 -0
- chooong_datasift-0.1.0/LICENSE +201 -0
- chooong_datasift-0.1.0/PKG-INFO +424 -0
- chooong_datasift-0.1.0/README.md +277 -0
- chooong_datasift-0.1.0/SECURITY.md +26 -0
- chooong_datasift-0.1.0/THIRD_PARTY_NOTICES.txt +2491 -0
- chooong_datasift-0.1.0/datasift-core/Cargo.lock +1608 -0
- chooong_datasift-0.1.0/datasift-core/Cargo.toml +46 -0
- chooong_datasift-0.1.0/datasift-core/README.md +72 -0
- chooong_datasift-0.1.0/datasift-core/src/discovery.rs +202 -0
- chooong_datasift-0.1.0/datasift-core/src/encoding.rs +69 -0
- chooong_datasift-0.1.0/datasift-core/src/engine.rs +1093 -0
- chooong_datasift-0.1.0/datasift-core/src/filter.rs +771 -0
- chooong_datasift-0.1.0/datasift-core/src/input.rs +183 -0
- chooong_datasift-0.1.0/datasift-core/src/lib.rs +443 -0
- chooong_datasift-0.1.0/datasift-core/src/output.rs +542 -0
- chooong_datasift-0.1.0/datasift-core/src/recovery.rs +443 -0
- chooong_datasift-0.1.0/datasift-core/src/rules.rs +528 -0
- chooong_datasift-0.1.0/datasift-core/src/value.rs +170 -0
- chooong_datasift-0.1.0/datasift-core/src/xlsx.rs +883 -0
- chooong_datasift-0.1.0/datasift-core/tests/pipeline/export.rs +227 -0
- chooong_datasift-0.1.0/datasift-core/tests/support/mod.rs +41 -0
- chooong_datasift-0.1.0/datasift-core/tests/support/workbook.rs +49 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/discovery.rs +137 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/encoding.rs +103 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/filter.rs +182 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/input.rs +188 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/output.rs +57 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/recovery.rs +160 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/rules.rs +147 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/value.rs +51 -0
- chooong_datasift-0.1.0/datasift-core/tests/unit/xlsx.rs +78 -0
- chooong_datasift-0.1.0/docs/api/cli.md +116 -0
- chooong_datasift-0.1.0/docs/api/filters.md +167 -0
- chooong_datasift-0.1.0/docs/api/json-schema.md +38 -0
- chooong_datasift-0.1.0/docs/api/python.md +158 -0
- chooong_datasift-0.1.0/docs/assets/brand/favicon.png +0 -0
- chooong_datasift-0.1.0/docs/assets/brand/logo-bright.jpeg +0 -0
- chooong_datasift-0.1.0/docs/assets/brand/logo.jpeg +0 -0
- chooong_datasift-0.1.0/docs/concepts/column-mapping.md +36 -0
- chooong_datasift-0.1.0/docs/concepts/data-types.md +118 -0
- chooong_datasift-0.1.0/docs/concepts/filters.md +34 -0
- chooong_datasift-0.1.0/docs/concepts/streaming.md +40 -0
- chooong_datasift-0.1.0/docs/concepts/table-discovery.md +91 -0
- chooong_datasift-0.1.0/docs/development/architecture.md +42 -0
- chooong_datasift-0.1.0/docs/development/benchmarks.md +59 -0
- chooong_datasift-0.1.0/docs/development/contributing.md +78 -0
- chooong_datasift-0.1.0/docs/guides/advanced-filtering.md +88 -0
- chooong_datasift-0.1.0/docs/guides/automatic-table-discovery.md +38 -0
- chooong_datasift-0.1.0/docs/guides/batch-processing.md +67 -0
- chooong_datasift-0.1.0/docs/guides/column-selection.md +48 -0
- chooong_datasift-0.1.0/docs/guides/complex-layouts.md +362 -0
- chooong_datasift-0.1.0/docs/guides/csv.md +127 -0
- chooong_datasift-0.1.0/docs/guides/error-handling.md +109 -0
- chooong_datasift-0.1.0/docs/guides/excel.md +67 -0
- chooong_datasift-0.1.0/docs/guides/exporting.md +95 -0
- chooong_datasift-0.1.0/docs/guides/performance.md +28 -0
- chooong_datasift-0.1.0/docs/guides/table-inspection.md +69 -0
- chooong_datasift-0.1.0/docs/guides/validation.md +138 -0
- chooong_datasift-0.1.0/docs/index.md +59 -0
- chooong_datasift-0.1.0/docs/installation.md +47 -0
- chooong_datasift-0.1.0/docs/quickstart.md +76 -0
- chooong_datasift-0.1.0/docs/reference/errors.md +68 -0
- chooong_datasift-0.1.0/docs/reference/file-safety.md +76 -0
- chooong_datasift-0.1.0/docs/reference/limits.md +49 -0
- chooong_datasift-0.1.0/docs/stylesheets/chooong.css +71 -0
- chooong_datasift-0.1.0/licenses/third-party/018b1cb87efdf7a04c2fcc13d57ed63f62149113fb207b27ea13430d64f13513.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f.txt +3 -0
- chooong_datasift-0.1.0/licenses/third-party/0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/025436edff4cfcdde17a5811fdea78892d8482efd1abdec5a17872d07a4f2112.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/03548525ec3706de58e48ef6e3c455582557a0ad3b54a2da9a3819add35dfb72.txt +209 -0
- chooong_datasift-0.1.0/licenses/third-party/0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/074e6e32c86a4c0ef8b3ed25b721ca23aca83df277cd88106ef7177c354615ff.txt +73 -0
- chooong_datasift-0.1.0/licenses/third-party/0cec06e0e55fbc3dc5cee4fca9b607f66cb8f4e4dbcf3b3c013594dd156732e9.txt +177 -0
- chooong_datasift-0.1.0/licenses/third-party/0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/10c8f8922ec0a74e8721148bfc5b5e18c4f989d62e38f5580a501a3e3c1d0391.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/11789f45bb180841cd362a5eee6789c68ddb573a11105e30768c308a6add0190.txt +17 -0
- chooong_datasift-0.1.0/licenses/third-party/123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/172020dbfd5b53a226dfde77616190a48dcff519b0bc0e6deb91a8450782c4af.txt +34 -0
- chooong_datasift-0.1.0/licenses/third-party/1847e0e0698142ed4347c1441a9fa81c8fbddd44b1d8bbcd5e3647f991759d7f.txt +19 -0
- chooong_datasift-0.1.0/licenses/third-party/1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d.txt +7 -0
- chooong_datasift-0.1.0/licenses/third-party/23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3.txt +23 -0
- chooong_datasift-0.1.0/licenses/third-party/268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5.txt +220 -0
- chooong_datasift-0.1.0/licenses/third-party/29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/3290ae0fbc9ddb77d2239121d710f0bb9d31b3b4744e6d97fe01e652b4c1870b.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/32c76dbe0e73d79100d5ece77c158399f2e2541bc5c78548a4ba45c1cb53c5c9.txt +178 -0
- chooong_datasift-0.1.0/licenses/third-party/35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab.txt +176 -0
- chooong_datasift-0.1.0/licenses/third-party/377c2e7c53250cc5905c0b0532d35973392af16ffb9596a41d99d202cf3617c9.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/3823dda7cf046602f4b4e77ec8e227863dc4736037cc85bb33d9f19febe16bb7.txt +258 -0
- chooong_datasift-0.1.0/licenses/third-party/3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/42a35170233e83e18856792e748de4c1ce4a63b2afce9a370c89ef3fe23f9f2d.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865.txt +7 -0
- chooong_datasift-0.1.0/licenses/third-party/495c30b45120f8af07cfa26eb9cb1ebfe8324560dca2b3b1e76cad1b9b6b489a.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/4da95ec4ecb65b738d470b7d762894ad9c97da93e6cbfb18b570fc2c96f4b871.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1.txt +19 -0
- chooong_datasift-0.1.0/licenses/third-party/516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/523a42c25d245dde9c015f882cec7f4555aad883382a6cf19b4b7d9b2cd5419b.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/5a93d5831e1297ab10fe643e1a631e83be392896da14ee2951285a79012df69d.txt +11 -0
- chooong_datasift-0.1.0/licenses/third-party/5b3d8a674979e158328c57f5c4cc12150df79d0bdf12c86eafc2e9c6006a2d4e.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/61d383b05b87d78f94d2937e2580cce47226d17823c0430fbcad09596537efcf.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a.txt +176 -0
- chooong_datasift-0.1.0/licenses/third-party/6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/66e3ee1fa7f909ad3c612d556f2a0cdabcd809ad6e66f3b0605015ac64841b70.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/696759d65dfe558ff7d9f031c76db19ec5c0767470fb67c4e8d990820d1e99c9.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/6b1691fdee3b03c3946696a7be125fcf50eff310b9486fac850c1b8aea91478b.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51.txt +187 -0
- chooong_datasift-0.1.0/licenses/third-party/70c9d40f1f9545c3f133b8a67206e89da850f6468eed072281bb3701514114a9.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/73b9dc2e79c7308998dd30296e073aefaefb944a68fb89aa412c23c0edcabcaa.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/74db5baf44a41b1000312c673544b3374e4198af5605c7f9080a402cec42cfa3.txt +57 -0
- chooong_datasift-0.1.0/licenses/third-party/769f80b5bcb42ed0af4e4d2fd74e1ac9bf843cb80c5a29219d1ef3544428a6bb.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/7b724c8fa4a82af733caccabdaa21e2bf8bcb0822fe62d5cf03f99d458438705.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/7ca1297d23644e30bd489193a82a33f324e5fe33f25df4195649b91b883df967.txt +27 -0
- chooong_datasift-0.1.0/licenses/third-party/831e0f43ad0bf014c1c4fec5767aae470434c1d66d6e671be2d823e729063e25.txt +28 -0
- chooong_datasift-0.1.0/licenses/third-party/838118388fe5c2e7f1dbbaeed13e1c7f3ebf88be91319c7c1d77c18e987d1a50.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32.txt +24 -0
- chooong_datasift-0.1.0/licenses/third-party/84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151.txt +11 -0
- chooong_datasift-0.1.0/licenses/third-party/8569ebf6bf52937b961d9c9c934d8400a2bb6b09651a9afacbb3fc18fe5c09b1.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/8764a597675778ddfd4e25f81b08a05dbcf089ac05662df7613fe67f150e3aa2.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/90567e2718bf7fd65a71a3a43c5596488e80e5f51ed02bfea6fec54458b5f3d1.txt +8266 -0
- chooong_datasift-0.1.0/licenses/third-party/90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5.txt +12 -0
- chooong_datasift-0.1.0/licenses/third-party/946c9835d8034d24404f8cfec5f4654cee5dad17e944afc3d06d742cf2882831.txt +240 -0
- chooong_datasift-0.1.0/licenses/third-party/98181e7249d0c01737645ec982499ce99a0f07eb8f7d625b8840d799d10dbc01.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3.txt +202 -0
- chooong_datasift-0.1.0/licenses/third-party/a01a418b6ffb1de8f4c3814e386b35e1a93a14529b68f17d286550f355b298e1.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9.txt +176 -0
- chooong_datasift-0.1.0/licenses/third-party/a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/a8799c2a07dabcb8d52481f885c5ab7000acb8a4d3cd9503fbcb97c84d350e65.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/ab499c75a0f0da8e0fe83bf9ba3a27e5c39705310f07107c6c66b69958d2401c.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/aecc100d0547aa3bcbe04bcf5cb87c7db0be11004602adfa5056edf8bb847b35.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/af59cea35d7f5e2777a713b8d155d65efa2c339eb43f3c14e868c6ac8506edad.txt +26 -0
- chooong_datasift-0.1.0/licenses/third-party/afcbe3b2e6b37172b5a9ca869ee4c0b8cdc09316e5d4384864154482c33e5af6.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/b05785f9f18e6716bab63424b11454513b9943a222595b70411009202fc592b5.txt +18 -0
- chooong_datasift-0.1.0/licenses/third-party/b1181a40b2a7b25cf66fd01481713bc1005df082c53ef73e851e55071b102744.txt +19 -0
- chooong_datasift-0.1.0/licenses/third-party/b71bd43a069ca0641a9ecfe585ca7b3c53b5cc1608f8b68321168698e28b5ea1.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/bfb1112d49db5b1daecdfef24bd7e2f3ea0bafb33aa67aa0ab51e2bf8407c03d.txt +11 -0
- chooong_datasift-0.1.0/licenses/third-party/c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b.txt +201 -0
- chooong_datasift-0.1.0/licenses/third-party/c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08.txt +202 -0
- chooong_datasift-0.1.0/licenses/third-party/c9bff75738922193e67fa726fa225535870d2aa1059f91452c411736284ad566.txt +23 -0
- chooong_datasift-0.1.0/licenses/third-party/cc8cc7f31c5f26b85702a161ba09bbe8b77a473c370709939e89db848b9d1f30.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/cdea3888d561fddcce138060983f9e78c81fc7927a50938303508a8d254ee8fc.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30.txt +202 -0
- chooong_datasift-0.1.0/licenses/third-party/d00d6d48df2db6f91e4ca9c656e5e30782d5becf52bb3e5bfd0aff467bd37781.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/d2e7ec5355c96eeade56b09187ceb48a6a30299da3ce7531a66d3d11405ab963.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/d415a86ccfd794129666247cbbadebee7a6d0ac3ff701c76c07b0f9424f0307d.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/da28ccc6b158fc2d8cccc74e99794b1cff1d29bd7bbeb019442fcf0c04c6cad9.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a.txt +1 -0
- chooong_datasift-0.1.0/licenses/third-party/e196ffeb5ab101e9ec8bbe395c9f367c5380ee2d28c47e5c03371523798a9af7.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/e34c58338bd89d43e709e226610d8f32b3e3c47f4ad9a99a8dc1d4ac7842488e.txt +15 -0
- chooong_datasift-0.1.0/licenses/third-party/e5b198d7f809311723889814d99a92f808c69e89a847efa7a7b65270f5fdeae6.txt +13 -0
- chooong_datasift-0.1.0/licenses/third-party/e72111c52b7d96ebe25348dee19f0744f444d3c95ae6b1ecb6ccaecc5bce05ba.txt +19 -0
- chooong_datasift-0.1.0/licenses/third-party/ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/ef2b3bbd7b718a7881253226313f103e89b379e1279681a3c1ebcb65a27d209d.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/f0c1d22de8bd3b776a40f2691f08b84e91c7bafc78b72a51150e231002b88db3.txt +29 -0
- chooong_datasift-0.1.0/licenses/third-party/f0cf9b1c62bbe3bd3a69f5f79c7158f513f612b4940a0a812d1db39d605318bc.txt +23 -0
- chooong_datasift-0.1.0/licenses/third-party/f59bcb1c02654665f78a5f290bae76b6358137675f6459f51e6d474a4623d8ea.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1.txt +39 -0
- chooong_datasift-0.1.0/licenses/third-party/f8218253704e32441cafea1b9b3bcb2c6a3c51c5553cd8513d179290202bccb2.txt +21 -0
- chooong_datasift-0.1.0/licenses/third-party/fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7.txt +25 -0
- chooong_datasift-0.1.0/licenses/third-party/fd80a26fbb3f644af1fa994134446702932968519797227e07a1368dea80f0bc.txt +5 -0
- chooong_datasift-0.1.0/licenses/third-party/ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2.txt +25 -0
- chooong_datasift-0.1.0/mkdocs.yml +96 -0
- chooong_datasift-0.1.0/pyproject.toml +202 -0
- chooong_datasift-0.1.0/release/__init__.py +1 -0
- chooong_datasift-0.1.0/release/prepare.py +92 -0
- chooong_datasift-0.1.0/release/push.py +125 -0
- chooong_datasift-0.1.0/release/shared.py +141 -0
- chooong_datasift-0.1.0/rust-toolchain.toml +4 -0
- chooong_datasift-0.1.0/scripts/__init__.py +0 -0
- chooong_datasift-0.1.0/scripts/artifacts.py +825 -0
- chooong_datasift-0.1.0/scripts/bench.py +11 -0
- chooong_datasift-0.1.0/scripts/docs.py +329 -0
- chooong_datasift-0.1.0/scripts/license_binary.py +166 -0
- chooong_datasift-0.1.0/scripts/licenses.py +810 -0
- chooong_datasift-0.1.0/scripts/verify_publish.py +110 -0
- chooong_datasift-0.1.0/src/chooong/datasift/__init__.py +103 -0
- chooong_datasift-0.1.0/src/chooong/datasift/__main__.py +95 -0
- chooong_datasift-0.1.0/src/chooong/datasift/models.py +383 -0
- chooong_datasift-0.1.0/src/chooong/datasift/py.typed +0 -0
- chooong_datasift-0.1.0/src/chooong/datasift/reader.py +191 -0
- chooong_datasift-0.1.0/src/chooong/datasift/rust.pyi +34 -0
- chooong_datasift-0.1.0/tests/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/api/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/api/test_iterators.py +69 -0
- chooong_datasift-0.1.0/tests/api/test_models.py +86 -0
- chooong_datasift-0.1.0/tests/api/test_reader.py +28 -0
- chooong_datasift-0.1.0/tests/benchmarks/README.md +9 -0
- chooong_datasift-0.1.0/tests/benchmarks/__init__.py +1 -0
- chooong_datasift-0.1.0/tests/benchmarks/conftest.py +33 -0
- chooong_datasift-0.1.0/tests/benchmarks/generate.py +144 -0
- chooong_datasift-0.1.0/tests/benchmarks/models.py +114 -0
- chooong_datasift-0.1.0/tests/benchmarks/runner.py +251 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_export.py +16 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_filter_complexity.py +16 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_memory.py +26 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_regression.py +20 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_scalability.py +16 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_smoke.py +45 -0
- chooong_datasift-0.1.0/tests/benchmarks/test_throughput.py +20 -0
- chooong_datasift-0.1.0/tests/benchmarks/worker.py +202 -0
- chooong_datasift-0.1.0/tests/conftest.py +42 -0
- chooong_datasift-0.1.0/tests/discovery/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/discovery/test_headers.py +394 -0
- chooong_datasift-0.1.0/tests/discovery/test_row_classes.py +75 -0
- chooong_datasift-0.1.0/tests/discovery/test_sources.py +274 -0
- chooong_datasift-0.1.0/tests/discovery/test_tables.py +207 -0
- chooong_datasift-0.1.0/tests/discovery/test_worksheets.py +64 -0
- chooong_datasift-0.1.0/tests/filtering/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/filtering/test_operators.py +114 -0
- chooong_datasift-0.1.0/tests/filtering/test_projection.py +136 -0
- chooong_datasift-0.1.0/tests/filtering/test_validation.py +70 -0
- chooong_datasift-0.1.0/tests/fixtures/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/fixtures/csv.py +11 -0
- chooong_datasift-0.1.0/tests/fixtures/excel.py +475 -0
- chooong_datasift-0.1.0/tests/fixtures/masks.py +111 -0
- chooong_datasift-0.1.0/tests/fixtures/results.py +52 -0
- chooong_datasift-0.1.0/tests/formats/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/formats/test_csv.py +26 -0
- chooong_datasift-0.1.0/tests/formats/test_excel.py +178 -0
- chooong_datasift-0.1.0/tests/integration/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/integration/test_cli.py +487 -0
- chooong_datasift-0.1.0/tests/integration/test_quickstart.py +79 -0
- chooong_datasift-0.1.0/tests/output/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/output/test_ndjson.py +62 -0
- chooong_datasift-0.1.0/tests/output/test_recovery.py +217 -0
- chooong_datasift-0.1.0/tests/streaming/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/streaming/test_batches.py +27 -0
- chooong_datasift-0.1.0/tests/streaming/test_statistics.py +89 -0
- chooong_datasift-0.1.0/tests/types/__init__.py +0 -0
- chooong_datasift-0.1.0/tests/types/test_datetime.py +96 -0
- chooong_datasift-0.1.0/tests/types/test_money.py +53 -0
- chooong_datasift-0.1.0/tests/types/test_numeric.py +80 -0
- chooong_datasift-0.1.0/tooling/__init__.py +0 -0
- chooong_datasift-0.1.0/tooling/tests/__init__.py +0 -0
- chooong_datasift-0.1.0/tooling/tests/conftest.py +206 -0
- chooong_datasift-0.1.0/tooling/tests/fixtures.py +139 -0
- chooong_datasift-0.1.0/tooling/tests/license_fixtures.py +135 -0
- chooong_datasift-0.1.0/tooling/tests/test_artifacts.py +261 -0
- chooong_datasift-0.1.0/tooling/tests/test_benchmark_platform.py +34 -0
- chooong_datasift-0.1.0/tooling/tests/test_documentation.py +221 -0
- chooong_datasift-0.1.0/tooling/tests/test_licenses.py +455 -0
- chooong_datasift-0.1.0/tooling/tests/test_preparation.py +85 -0
- chooong_datasift-0.1.0/tooling/tests/test_publish_verification.py +45 -0
- chooong_datasift-0.1.0/tooling/tests/test_pypi_verification.py +59 -0
- chooong_datasift-0.1.0/tooling/tests/test_release.py +145 -0
- chooong_datasift-0.1.0/tooling/tests/test_release_push.py +64 -0
- 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,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).
|