From fd681dbc24957a8ce14b594e6c8f6473e225f79a Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Wed, 24 Dec 2025 13:20:34 -0500 Subject: [PATCH 01/16] Update HAF submodule to latest develop (9add4c306) --- .gitlab-ci.yml | 4 ++-- haf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2138e2d0e..000a47dd0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,14 +41,14 @@ variables: BLOCK_LOG_SOURCE_DIR_5M: /blockchain/block_log_5m # HAF submodule commit - must match the 'ref:' in the include section below # This is needed for service containers which can't access dotenv artifacts - HAF_COMMIT: "2fc1e0852ce93e74a026bc94abae268312e8a27a" + HAF_COMMIT: "9add4c306ddc0067bf00857c2c70053f21525ae6" # Enable CI-specific PostgreSQL config with reduced memory for HAF service containers HAF_CI_MODE: "1" include: - template: Workflows/Branch-Pipelines.gitlab-ci.yml - project: 'hive/haf' - ref: 2fc1e0852ce93e74a026bc94abae268312e8a27a # feature/cache-manager-integration + ref: 9add4c306ddc0067bf00857c2c70053f21525ae6 # develop file: '/scripts/ci-helpers/prepare_data_image_job.yml' # Do not include common-ci-configuration here, it is already referenced by scripts/ci-helpers/prepare_data_image_job.yml included from Haf/Hive repos diff --git a/haf b/haf index 2fc1e0852..9add4c306 160000 --- a/haf +++ b/haf @@ -1 +1 @@ -Subproject commit 2fc1e0852ce93e74a026bc94abae268312e8a27a +Subproject commit 9add4c306ddc0067bf00857c2c70053f21525ae6 -- GitLab From 76b42c63cf78de97dd0e276db8200ecb20995d50 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sat, 27 Dec 2025 03:02:07 -0500 Subject: [PATCH 02/16] Add CLAUDE.md for Claude Code guidance --- CLAUDE.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..9ea673a1b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,102 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +HAfAH (HAF Account History) is a read-only HAF (Hive Application Framework) application that implements the account history API for the Hive blockchain. It's a PostgREST-based web server that responds to account history REST calls using data stored in a HAF database. Unlike other HAF apps, HAfAH requires no replay - it reads directly from base-layer HAF tables. + +## Architecture + +**Stack**: PostgreSQL + PostgREST (no application code - pure SQL functions exposed as REST API) + +**Key directories**: +- `postgrest/` - PostgREST endpoint definitions and SQL types + - `hafah_endpoints.sql` - Main API endpoint registration + - `hafah_REST/` - REST endpoint SQL functions organized by resource (blocks, accounts, operations, transactions) +- `queries/` - Backend SQL functions + - `ah_schema_functions.pgsql` - Core schema and helper functions + - `hafah_rest_backend/` - Implementation functions for each API +- `scripts/` - Setup and management scripts +- `tests/` - Integration tests (pytest) and REST API tests (tavern YAML) +- `haf/` - HAF submodule (the underlying data framework) + +**Database roles**: +- `haf_admin` - For install/uninstall operations +- `hafah_user` - For running the PostgREST service +- `hafah_owner` - Schema owner for hafah_python + +## Common Commands + +### Local Development + +```bash +# Setup database and install app (requires running HAF database) +./run.sh setup + +# Start PostgREST server (default port 3000) +./run.sh start [PORT] + +# Install app only (with custom postgres URL) +scripts/install_app.sh --postgres-url=postgresql://haf_admin@localhost:5432/haf_block_log + +# Uninstall app +scripts/uninstall_app.sh --postgres-url=postgresql://haf_admin@localhost:5432/haf_block_log +``` + +### Docker + +```bash +# Build Docker image +scripts/ci-helpers/build_instance.sh "postgrest-latest" . registry.gitlab.syncad.com/hive/hafah + +# Install app via Docker +docker run --rm -it registry.gitlab.syncad.com/hive/hafah:TAG install_app --postgres-url=postgresql://haf_admin@172.17.0.1:5432/haf_block_log + +# Run PostgREST server via Docker +docker run --rm -it -p 8081:6543 -e POSTGRES_URL=postgresql://hafah_user@172.17.0.1:5432/haf_block_log registry.gitlab.syncad.com/hive/hafah:TAG +``` + +### Testing + +```bash +# Run functional pytest tests (requires HAF + HAfAH running) +cd tests/integration/functional +pytest --junitxml report.xml --postgrest-hafah-adress=app:6543 --postgres-db-url=postgresql://haf_admin@haf-instance:5432/haf_block_log -m PYTEST_MARK + +# Run tavern REST API tests +cd tests/tavern +pytest -n auto --junitxml report.xml . + +# Run performance tests (requires jmeter) +./tests/performance_test.py --postgres postgresql:///haf_block_log +``` + +Test marks: `enum_virtual_ops_and_get_ops_in_block`, `get_account_history_and_get_transaction` + +## REST API Endpoints + +- `/blocks/{block-num}` - Get block details +- `/blocks/{block-num}/header` - Get block header +- `/blocks?from-block&to-block` - Get block range +- `/blocks/{block-num}/operations` - Operations in block +- `/transactions/{transaction-id}` - Get transaction +- `/accounts/{account-name}/operations` - Account history +- `/operations?from-block&to-block` - Search operations +- `/operation-types` - List operation types +- `/version` - API version + +## CI/CD Notes + +- HAF submodule commit must match in three places: `.gitmodules` ref, `HAF_COMMIT` variable in `.gitlab-ci.yml`, and `include: ref:` in `.gitlab-ci.yml` +- The `validate_haf_commit` job ensures these stay in sync +- Pattern tests are tied to specific blockchain data and may fail when HAF commit changes +- Uses NFS cache at `/nfs/ci-cache/haf/` for HAF data across CI runners + +## Development Notes + +- All API logic is in SQL - no Python/application code for the main service +- PostgREST exposes `hafah_endpoints` schema functions as REST endpoints +- Backend functions live in `hafah_python` and `hafah_backend` schemas +- SQL files are executed in specific order by `scripts/install_app.sh` +- Test tools from HAF submodule: `test_tools`, `haf_local_tools` -- GitLab From 9273a968c8f12b77026475870c967f704624c148 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sat, 27 Dec 2025 03:02:58 -0500 Subject: [PATCH 03/16] Update Python version requirement to 3.14 --- tests/integration/hafah-local-tools/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/hafah-local-tools/pyproject.toml b/tests/integration/hafah-local-tools/pyproject.toml index bc6ca3708..408e9a442 100644 --- a/tests/integration/hafah-local-tools/pyproject.toml +++ b/tests/integration/hafah-local-tools/pyproject.toml @@ -20,5 +20,5 @@ source = [ [tool.poetry.dependencies] -python = "^3.12" +python = "^3.14" haf_local_tools = { path = "../../../haf/tests/integration/haf-local-tools", develop = true } -- GitLab From e0a61a6a276d607457295cff773eb4962b0e5075 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sat, 27 Dec 2025 03:27:14 -0500 Subject: [PATCH 04/16] Update to Python 3.14 with HAF feature/python-3.14 branch (3bc1d4103) --- .gitlab-ci.yml | 4 +- haf | 2 +- .../integration/hafah-local-tools/poetry.lock | 504 +++++++----------- 3 files changed, 203 insertions(+), 307 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 000a47dd0..022c47a64 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,14 +41,14 @@ variables: BLOCK_LOG_SOURCE_DIR_5M: /blockchain/block_log_5m # HAF submodule commit - must match the 'ref:' in the include section below # This is needed for service containers which can't access dotenv artifacts - HAF_COMMIT: "9add4c306ddc0067bf00857c2c70053f21525ae6" + HAF_COMMIT: "3bc1d4103b5206d97bcddb665c4eca68fae87766" # Enable CI-specific PostgreSQL config with reduced memory for HAF service containers HAF_CI_MODE: "1" include: - template: Workflows/Branch-Pipelines.gitlab-ci.yml - project: 'hive/haf' - ref: 9add4c306ddc0067bf00857c2c70053f21525ae6 # develop + ref: 3bc1d4103b5206d97bcddb665c4eca68fae87766 # feature/python-3.14 file: '/scripts/ci-helpers/prepare_data_image_job.yml' # Do not include common-ci-configuration here, it is already referenced by scripts/ci-helpers/prepare_data_image_job.yml included from Haf/Hive repos diff --git a/haf b/haf index 9add4c306..3bc1d4103 160000 --- a/haf +++ b/haf @@ -1 +1 @@ -Subproject commit 9add4c306ddc0067bf00857c2c70053f21525ae6 +Subproject commit 3bc1d4103b5206d97bcddb665c4eca68fae87766 diff --git a/tests/integration/hafah-local-tools/poetry.lock b/tests/integration/hafah-local-tools/poetry.lock index 9d38a3a02..969322b69 100644 --- a/tests/integration/hafah-local-tools/poetry.lock +++ b/tests/integration/hafah-local-tools/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "abstractcp" @@ -157,7 +157,6 @@ files = [ [package.dependencies] idna = ">=2.8" sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] @@ -458,94 +457,6 @@ files = [ {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] -[[package]] -name = "greenlet" -version = "3.1.1" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -groups = ["main"] -markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" -files = [ - {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, - {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, - {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, - {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, - {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, - {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, - {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, - {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, - {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, - {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, - {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, - {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, - {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, - {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, - {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, - {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, - {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - [[package]] name = "h11" version = "0.14.0" @@ -579,15 +490,16 @@ name = "haf-local-tools" version = "0.0.0" description = "A collective library containing all the tools required by haf python tests." optional = false -python-versions = "^3.12" +python-versions = ">=3.14,<4" groups = ["main"] files = [] develop = true [package.dependencies] hive_local_tools = {path = "../../../hive/tests/python/hive-local-tools", develop = true} +msgspec = "^0.20.0" pandas = "^2.2.3" -psycopg2-binary = "2.9.10" +psycopg2-binary = "^2.9.10" sqlalchemy = "^2.0.39" sqlalchemy-utils = "0.41.2" @@ -600,20 +512,21 @@ name = "hive-local-tools" version = "0.0.0" description = "A collective library containing all the tools required by hive python tests." optional = false -python-versions = "^3.12" +python-versions = ">=3.14,<4" groups = ["main"] files = [] develop = true [package.dependencies] -pytest = "7.2.2" -pytest-asyncio = "0.23.8" -pytest-repeat = "0.9.1" -pytest-rerunfailures = "10.2" -pytest-timeout = "2.1.0" -pytest-xdist = "3.2.0" +msgspec = "^0.20.0" +pytest = "8.3.5" +pytest-asyncio = "0.25.3" +pytest-repeat = "0.9.3" +pytest-rerunfailures = "14.0" +pytest-timeout = "2.3.1" +pytest-xdist = "3.6.1" shared-tools = {path = "shared-tools", develop = true} -tavern = "2.2.0" +tavern = "3.0.2" test-tools = {path = "test-tools", develop = true} tests_api = {path = "tests_api", develop = true} types-PyYAML = "6.0.12.11" @@ -624,18 +537,18 @@ url = "../../../haf/hive/tests/python/hive-local-tools" [[package]] name = "hiveio-beekeepy" -version = "1.27.12rc1.dev5+843b775" +version = "1.28.4.dev7+c04687a" description = "All in one package for beekeeper interaction via Python interface." optional = false -python-versions = ">=3.12,<4.0" +python-versions = ">=3.12,<4" groups = ["main"] files = [ - {file = "hiveio_beekeepy-1.27.12rc1.dev5+843b775-py3-none-any.whl", hash = "sha256:616919490118b360d7b63d8b876b16e79635c36a63b5742ae62036de8f60a014"}, + {file = "hiveio_beekeepy-1.28.4.dev7+c04687a-py3-none-any.whl", hash = "sha256:f6d098a75e283d9361e9a7ea8792a218e0de3e5140dda36afbc4076159e90e7d"}, ] [package.dependencies] aiohttp = "3.11.15" -hiveio-schemas = "1.27.12rc0" +hiveio-schemas = "1.28.1.dev3+ae54493" loguru = "0.7.2" psutil = "7.0.0" python-dateutil = "2.8.2" @@ -648,17 +561,17 @@ reference = "gitlab-helpy" [[package]] name = "hiveio-database-api" -version = "1.27.12rc4.dev16+b487bd9a1" +version = "1.28.2.dev212+05ea6f5dc" description = "" optional = false python-versions = ">=3.12,<4.0" groups = ["main"] files = [ - {file = "hiveio_database_api-1.27.12rc4.dev16+b487bd9a1-py3-none-any.whl", hash = "sha256:e31fd8c1646b49bc3d2c05b6d4c0a606bc369214e13b4eaa20a913e1b6c1a465"}, + {file = "hiveio_database_api-1.28.2.dev212+05ea6f5dc-py3-none-any.whl", hash = "sha256:faaa2afa2d953e382f84601b04ddf34c94bddabaa27a47d7bfc82a5fd56a9334"}, ] [package.dependencies] -hiveio-beekeepy = "1.27.12rc1.dev5+843b775" +hiveio-beekeepy = ">=1.28.4.dev4" [package.source] type = "legacy" @@ -667,17 +580,36 @@ reference = "gitlab-hive" [[package]] name = "hiveio-network-broadcast-api" -version = "1.27.12rc4.dev16+b487bd9a1" +version = "1.28.2.dev212+05ea6f5dc" +description = "" +optional = false +python-versions = ">=3.12,<4.0" +groups = ["main"] +files = [ + {file = "hiveio_network_broadcast_api-1.28.2.dev212+05ea6f5dc-py3-none-any.whl", hash = "sha256:6072b3da8d1302dc0bc3ec2161f60763778b3f4dd4188b6a9f338046392890bc"}, +] + +[package.dependencies] +hiveio-beekeepy = ">=1.28.4.dev4" + +[package.source] +type = "legacy" +url = "https://gitlab.syncad.com/api/v4/projects/198/packages/pypi/simple" +reference = "gitlab-hive" + +[[package]] +name = "hiveio-rc-api" +version = "1.28.2.dev212+05ea6f5dc" description = "" optional = false python-versions = ">=3.12,<4.0" groups = ["main"] files = [ - {file = "hiveio_network_broadcast_api-1.27.12rc4.dev16+b487bd9a1-py3-none-any.whl", hash = "sha256:7c9c6b9a32b92433425abcbdae2d159383d457547d67d799d97d410954390084"}, + {file = "hiveio_rc_api-1.28.2.dev212+05ea6f5dc-py3-none-any.whl", hash = "sha256:d9e1356cbab3de4c874ca40843a5df1ba32e7df69a623964644596bbeac7133d"}, ] [package.dependencies] -hiveio-beekeepy = "1.27.12rc1.dev5+843b775" +hiveio-beekeepy = ">=1.28.4.dev4" [package.source] type = "legacy" @@ -686,37 +618,45 @@ reference = "gitlab-hive" [[package]] name = "hiveio-schemas" -version = "1.27.12rc0" +version = "1.28.1.dev3+ae54493" description = "Tools for checking if message fits expected format" optional = false -python-versions = "<4.0,>=3.12" +python-versions = ">=3.12,<4" groups = ["main"] files = [ - {file = "hiveio_schemas-1.27.12rc0-py3-none-any.whl", hash = "sha256:c8f4bb1d93d2e1ea5139d20c647ad1ff0e41ff2eca03f184d47a536cd0f24a6f"}, + {file = "hiveio_schemas-1.28.1.dev3+ae54493-py3-none-any.whl", hash = "sha256:4bef1f9a096610ffa9bdd7d63b4a53a3fee01b1083266acf19ea2da0c197439f"}, + {file = "hiveio_schemas-1.28.1.dev3+ae54493.tar.gz", hash = "sha256:425437fc83293aaac6c478ef48b14c7f4e06c136a599bc1a5c2e5d93c6f3dd75"}, ] [package.dependencies] -msgspec = "0.18.6" +msgspec = "0.20.0" + +[package.source] +type = "legacy" +url = "https://gitlab.syncad.com/api/v4/projects/362/packages/pypi/simple" +reference = "gitlab-schemas" [[package]] name = "hiveio-wax" -version = "1.27.12rc2.dev7+daf5a82a" +version = "1.28.4rc1.dev100+25e11494" description = "" optional = false -python-versions = ">=3.12,<4.0" +python-versions = ">=3.14,<4" groups = ["main"] files = [ - {file = "hiveio_wax-1.27.12rc2.dev7+daf5a82a-cp312-cp312-manylinux_2_39_x86_64.whl", hash = "sha256:567b4b4f2d3091a9ea99488cb82215d2634d6d462e51c416af1cbf2aaeca7ab4"}, + {file = "hiveio_wax-1.28.4rc1.dev100+25e11494-cp314-cp314-manylinux_2_39_x86_64.whl", hash = "sha256:07b9dec1eb7dd874f19726f5ef5c95d7c9b9b8dd33d520b17ee5c710bfa068be"}, ] [package.dependencies] -hiveio-database-api = "1.27.12rc4.dev16+b487bd9a1" -hiveio-network-broadcast-api = "1.27.12rc4.dev16+b487bd9a1" +hiveio-database-api = "1.28.2.dev212+05ea6f5dc" +hiveio-network-broadcast-api = "1.28.2.dev212+05ea6f5dc" +hiveio-rc-api = "1.28.2.dev212+05ea6f5dc" httpx = {version = "0.23.3", extras = ["http2"]} loguru = "0.7.2" -protobuf = "4.24.4" +protobuf = "6.33.0" python-dateutil = "2.8.2" requests = "2.32.3" +typing-extensions = ">=4.0.0" [package.source] type = "legacy" @@ -891,55 +831,73 @@ dev = ["Sphinx (==7.2.5) ; python_version >= \"3.9\"", "colorama (==0.4.5) ; pyt [[package]] name = "msgspec" -version = "0.18.6" +version = "0.20.0" description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "msgspec-0.18.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77f30b0234eceeff0f651119b9821ce80949b4d667ad38f3bfed0d0ebf9d6d8f"}, - {file = "msgspec-0.18.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a76b60e501b3932782a9da039bd1cd552b7d8dec54ce38332b87136c64852dd"}, - {file = "msgspec-0.18.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06acbd6edf175bee0e36295d6b0302c6de3aaf61246b46f9549ca0041a9d7177"}, - {file = "msgspec-0.18.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40a4df891676d9c28a67c2cc39947c33de516335680d1316a89e8f7218660410"}, - {file = "msgspec-0.18.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a6896f4cd5b4b7d688018805520769a8446df911eb93b421c6c68155cdf9dd5a"}, - {file = "msgspec-0.18.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ac4dd63fd5309dd42a8c8c36c1563531069152be7819518be0a9d03be9788e4"}, - {file = "msgspec-0.18.6-cp310-cp310-win_amd64.whl", hash = "sha256:fda4c357145cf0b760000c4ad597e19b53adf01382b711f281720a10a0fe72b7"}, - {file = "msgspec-0.18.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e77e56ffe2701e83a96e35770c6adb655ffc074d530018d1b584a8e635b4f36f"}, - {file = "msgspec-0.18.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5351afb216b743df4b6b147691523697ff3a2fc5f3d54f771e91219f5c23aaa"}, - {file = "msgspec-0.18.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3232fabacef86fe8323cecbe99abbc5c02f7698e3f5f2e248e3480b66a3596b"}, - {file = "msgspec-0.18.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b524df6ea9998bbc99ea6ee4d0276a101bcc1aa8d14887bb823914d9f60d07"}, - {file = "msgspec-0.18.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37f67c1d81272131895bb20d388dd8d341390acd0e192a55ab02d4d6468b434c"}, - {file = "msgspec-0.18.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0feb7a03d971c1c0353de1a8fe30bb6579c2dc5ccf29b5f7c7ab01172010492"}, - {file = "msgspec-0.18.6-cp311-cp311-win_amd64.whl", hash = "sha256:41cf758d3f40428c235c0f27bc6f322d43063bc32da7b9643e3f805c21ed57b4"}, - {file = "msgspec-0.18.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d86f5071fe33e19500920333c11e2267a31942d18fed4d9de5bc2fbab267d28c"}, - {file = "msgspec-0.18.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce13981bfa06f5eb126a3a5a38b1976bddb49a36e4f46d8e6edecf33ccf11df1"}, - {file = "msgspec-0.18.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97dec6932ad5e3ee1e3c14718638ba333befc45e0661caa57033cd4cc489466"}, - {file = "msgspec-0.18.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad237100393f637b297926cae1868b0d500f764ccd2f0623a380e2bcfb2809ca"}, - {file = "msgspec-0.18.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db1d8626748fa5d29bbd15da58b2d73af25b10aa98abf85aab8028119188ed57"}, - {file = "msgspec-0.18.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d70cb3d00d9f4de14d0b31d38dfe60c88ae16f3182988246a9861259c6722af6"}, - {file = "msgspec-0.18.6-cp312-cp312-win_amd64.whl", hash = "sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0"}, - {file = "msgspec-0.18.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7d9faed6dfff654a9ca7d9b0068456517f63dbc3aa704a527f493b9200b210a"}, - {file = "msgspec-0.18.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da21f804c1a1471f26d32b5d9bc0480450ea77fbb8d9db431463ab64aaac2cf"}, - {file = "msgspec-0.18.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46eb2f6b22b0e61c137e65795b97dc515860bf6ec761d8fb65fdb62aa094ba61"}, - {file = "msgspec-0.18.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8355b55c80ac3e04885d72db515817d9fbb0def3bab936bba104e99ad22cf46"}, - {file = "msgspec-0.18.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9080eb12b8f59e177bd1eb5c21e24dd2ba2fa88a1dbc9a98e05ad7779b54c681"}, - {file = "msgspec-0.18.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc001cf39becf8d2dcd3f413a4797c55009b3a3cdbf78a8bf5a7ca8fdb76032c"}, - {file = "msgspec-0.18.6-cp38-cp38-win_amd64.whl", hash = "sha256:fac5834e14ac4da1fca373753e0c4ec9c8069d1fe5f534fa5208453b6065d5be"}, - {file = "msgspec-0.18.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:974d3520fcc6b824a6dedbdf2b411df31a73e6e7414301abac62e6b8d03791b4"}, - {file = "msgspec-0.18.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd62e5818731a66aaa8e9b0a1e5543dc979a46278da01e85c3c9a1a4f047ef7e"}, - {file = "msgspec-0.18.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7481355a1adcf1f08dedd9311193c674ffb8bf7b79314b4314752b89a2cf7f1c"}, - {file = "msgspec-0.18.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aa85198f8f154cf35d6f979998f6dadd3dc46a8a8c714632f53f5d65b315c07"}, - {file = "msgspec-0.18.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e24539b25c85c8f0597274f11061c102ad6b0c56af053373ba4629772b407be"}, - {file = "msgspec-0.18.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c61ee4d3be03ea9cd089f7c8e36158786cd06e51fbb62529276452bbf2d52ece"}, - {file = "msgspec-0.18.6-cp39-cp39-win_amd64.whl", hash = "sha256:b5c390b0b0b7da879520d4ae26044d74aeee5144f83087eb7842ba59c02bc090"}, - {file = "msgspec-0.18.6.tar.gz", hash = "sha256:a59fc3b4fcdb972d09138cb516dbde600c99d07c38fd9372a6ef500d2d031b4e"}, + {file = "msgspec-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:23a6ec2a3b5038c233b04740a545856a068bc5cb8db184ff493a58e08c994fbf"}, + {file = "msgspec-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cde2c41ed3eaaef6146365cb0d69580078a19f974c6cb8165cc5dcd5734f573e"}, + {file = "msgspec-0.20.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5da0daa782f95d364f0d95962faed01e218732aa1aa6cad56b25a5d2092e75a4"}, + {file = "msgspec-0.20.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9369d5266144bef91be2940a3821e03e51a93c9080fde3ef72728c3f0a3a8bb7"}, + {file = "msgspec-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90fb865b306ca92c03964a5f3d0cd9eb1adda14f7e5ac7943efd159719ea9f10"}, + {file = "msgspec-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8112cd48b67dfc0cfa49fc812b6ce7eb37499e1d95b9575061683f3428975d3"}, + {file = "msgspec-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:666b966d503df5dc27287675f525a56b6e66a2b8e8ccd2877b0c01328f19ae6c"}, + {file = "msgspec-0.20.0-cp310-cp310-win_arm64.whl", hash = "sha256:099e3e85cd5b238f2669621be65f0728169b8c7cb7ab07f6137b02dc7feea781"}, + {file = "msgspec-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:09e0efbf1ac641fedb1d5496c59507c2f0dc62a052189ee62c763e0aae217520"}, + {file = "msgspec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23ee3787142e48f5ee746b2909ce1b76e2949fbe0f97f9f6e70879f06c218b54"}, + {file = "msgspec-0.20.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:81f4ac6f0363407ac0465eff5c7d4d18f26870e00674f8fcb336d898a1e36854"}, + {file = "msgspec-0.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb4d873f24ae18cd1334f4e37a178ed46c9d186437733351267e0a269bdf7e53"}, + {file = "msgspec-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b92b8334427b8393b520c24ff53b70f326f79acf5f74adb94fd361bcff8a1d4e"}, + {file = "msgspec-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:562c44b047c05cc0384e006fae7a5e715740215c799429e0d7e3e5adf324285a"}, + {file = "msgspec-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:d1dcc93a3ce3d3195985bfff18a48274d0b5ffbc96fa1c5b89da6f0d9af81b29"}, + {file = "msgspec-0.20.0-cp311-cp311-win_arm64.whl", hash = "sha256:aa387aa330d2e4bd69995f66ea8fdc87099ddeedf6fdb232993c6a67711e7520"}, + {file = "msgspec-0.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2aba22e2e302e9231e85edc24f27ba1f524d43c223ef5765bd8624c7df9ec0a5"}, + {file = "msgspec-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:716284f898ab2547fedd72a93bb940375de9fbfe77538f05779632dc34afdfde"}, + {file = "msgspec-0.20.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:558ed73315efa51b1538fa8f1d3b22c8c5ff6d9a2a62eff87d25829b94fc5054"}, + {file = "msgspec-0.20.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:509ac1362a1d53aa66798c9b9fd76872d7faa30fcf89b2fba3bcbfd559d56eb0"}, + {file = "msgspec-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1353c2c93423602e7dea1aa4c92f3391fdfc25ff40e0bacf81d34dbc68adb870"}, + {file = "msgspec-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb33b5eb5adb3c33d749684471c6a165468395d7aa02d8867c15103b81e1da3e"}, + {file = "msgspec-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:fb1d934e435dd3a2b8cf4bbf47a8757100b4a1cfdc2afdf227541199885cdacb"}, + {file = "msgspec-0.20.0-cp312-cp312-win_arm64.whl", hash = "sha256:00648b1e19cf01b2be45444ba9dc961bd4c056ffb15706651e64e5d6ec6197b7"}, + {file = "msgspec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c1ff8db03be7598b50dd4b4a478d6fe93faae3bd54f4f17aa004d0e46c14c46"}, + {file = "msgspec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f6532369ece217fd37c5ebcfd7e981f2615628c21121b7b2df9d3adcf2fd69b8"}, + {file = "msgspec-0.20.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9a1697da2f85a751ac3cc6a97fceb8e937fc670947183fb2268edaf4016d1ee"}, + {file = "msgspec-0.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7fac7e9c92eddcd24c19d9e5f6249760941485dff97802461ae7c995a2450111"}, + {file = "msgspec-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f953a66f2a3eb8d5ea64768445e2bb301d97609db052628c3e1bcb7d87192a9f"}, + {file = "msgspec-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:247af0313ae64a066d3aea7ba98840f6681ccbf5c90ba9c7d17f3e39dbba679c"}, + {file = "msgspec-0.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:67d5e4dfad52832017018d30a462604c80561aa62a9d548fc2bd4e430b66a352"}, + {file = "msgspec-0.20.0-cp313-cp313-win_arm64.whl", hash = "sha256:91a52578226708b63a9a13de287b1ec3ed1123e4a088b198143860c087770458"}, + {file = "msgspec-0.20.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:eead16538db1b3f7ec6e3ed1f6f7c5dec67e90f76e76b610e1ffb5671815633a"}, + {file = "msgspec-0.20.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:703c3bb47bf47801627fb1438f106adbfa2998fe586696d1324586a375fca238"}, + {file = "msgspec-0.20.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6cdb227dc585fb109305cee0fd304c2896f02af93ecf50a9c84ee54ee67dbb42"}, + {file = "msgspec-0.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27d35044dd8818ac1bd0fedb2feb4fbdff4e3508dd7c5d14316a12a2d96a0de0"}, + {file = "msgspec-0.20.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4296393a29ee42dd25947981c65506fd4ad39beaf816f614146fa0c5a6c91ae"}, + {file = "msgspec-0.20.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:205fbdadd0d8d861d71c8f3399fe1a82a2caf4467bc8ff9a626df34c12176980"}, + {file = "msgspec-0.20.0-cp314-cp314-win_amd64.whl", hash = "sha256:7dfebc94fe7d3feec6bc6c9df4f7e9eccc1160bb5b811fbf3e3a56899e398a6b"}, + {file = "msgspec-0.20.0-cp314-cp314-win_arm64.whl", hash = "sha256:2ad6ae36e4a602b24b4bf4eaf8ab5a441fec03e1f1b5931beca8ebda68f53fc0"}, + {file = "msgspec-0.20.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f84703e0e6ef025663dd1de828ca028774797b8155e070e795c548f76dde65d5"}, + {file = "msgspec-0.20.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7c83fc24dd09cf1275934ff300e3951b3adc5573f0657a643515cc16c7dee131"}, + {file = "msgspec-0.20.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f13ccb1c335a124e80c4562573b9b90f01ea9521a1a87f7576c2e281d547f56"}, + {file = "msgspec-0.20.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17c2b5ca19f19306fc83c96d85e606d2cc107e0caeea85066b5389f664e04846"}, + {file = "msgspec-0.20.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d931709355edabf66c2dd1a756b2d658593e79882bc81aae5964969d5a291b63"}, + {file = "msgspec-0.20.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:565f915d2e540e8a0c93a01ff67f50aebe1f7e22798c6a25873f9fda8d1325f8"}, + {file = "msgspec-0.20.0-cp314-cp314t-win_amd64.whl", hash = "sha256:726f3e6c3c323f283f6021ebb6c8ccf58d7cd7baa67b93d73bfbe9a15c34ab8d"}, + {file = "msgspec-0.20.0-cp314-cp314t-win_arm64.whl", hash = "sha256:93f23528edc51d9f686808a361728e903d6f2be55c901d6f5c92e44c6d546bfc"}, + {file = "msgspec-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eee56472ced14602245ac47516e179d08c6c892d944228796f239e983de7449c"}, + {file = "msgspec-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:19395e9a08cc5bd0e336909b3e13b4ae5ee5e47b82e98f8b7801d5a13806bb6f"}, + {file = "msgspec-0.20.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d5bb7ce84fe32f6ce9f62aa7e7109cb230ad542cc5bc9c46e587f1dac4afc48e"}, + {file = "msgspec-0.20.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8c6da9ae2d76d11181fbb0ea598f6e1d558ef597d07ec46d689d17f68133769f"}, + {file = "msgspec-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84d88bd27d906c471a5ca232028671db734111996ed1160e37171a8d1f07a599"}, + {file = "msgspec-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:03907bf733f94092a6b4c5285b274f79947cad330bd8a9d8b45c0369e1a3c7f0"}, + {file = "msgspec-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:9fbcb660632a2f5c247c0dc820212bf3a423357ac6241ff6dc6cfc6f72584016"}, + {file = "msgspec-0.20.0-cp39-cp39-win_arm64.whl", hash = "sha256:f7cd0e89b86a16005745cb99bd1858e8050fc17f63de571504492b267bca188a"}, + {file = "msgspec-0.20.0.tar.gz", hash = "sha256:692349e588fde322875f8d3025ac01689fead5901e7fb18d6870a44519d62a29"}, ] [package.extras] -dev = ["attrs", "coverage", "furo", "gcovr", "ipython", "msgpack", "mypy", "pre-commit", "pyright", "pytest", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "tomli ; python_version < \"3.11\"", "tomli-w"] -doc = ["furo", "ipython", "sphinx", "sphinx-copybutton", "sphinx-design"] -test = ["attrs", "msgpack", "mypy", "pyright", "pytest", "pyyaml", "tomli ; python_version < \"3.11\"", "tomli-w"] -toml = ["tomli ; python_version < \"3.11\"", "tomli-w"] +toml = ["tomli ; python_version < \"3.11\"", "tomli_w"] yaml = ["pyyaml"] [[package]] @@ -1136,20 +1094,6 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] -[[package]] -name = "paho-mqtt" -version = "1.6.1" -description = "MQTT version 5.0/3.1.1 client class" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "paho-mqtt-1.6.1.tar.gz", hash = "sha256:2a8291c81623aec00372b5a85558a372c747cbca8e9934dfe218638b8eefc26f"}, -] - -[package.extras] -proxy = ["PySocks"] - [[package]] name = "pandas" version = "2.2.3" @@ -1392,25 +1336,22 @@ files = [ [[package]] name = "protobuf" -version = "4.24.4" +version = "6.33.0" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "protobuf-4.24.4-cp310-abi3-win32.whl", hash = "sha256:ec9912d5cb6714a5710e28e592ee1093d68c5ebfeda61983b3f40331da0b1ebb"}, - {file = "protobuf-4.24.4-cp310-abi3-win_amd64.whl", hash = "sha256:1badab72aa8a3a2b812eacfede5020472e16c6b2212d737cefd685884c191085"}, - {file = "protobuf-4.24.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e61a27f362369c2f33248a0ff6896c20dcd47b5d48239cb9720134bef6082e4"}, - {file = "protobuf-4.24.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:bffa46ad9612e6779d0e51ae586fde768339b791a50610d85eb162daeb23661e"}, - {file = "protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:b493cb590960ff863743b9ff1452c413c2ee12b782f48beca77c8da3e2ffe9d9"}, - {file = "protobuf-4.24.4-cp37-cp37m-win32.whl", hash = "sha256:dbbed8a56e56cee8d9d522ce844a1379a72a70f453bde6243e3c86c30c2a3d46"}, - {file = "protobuf-4.24.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6b7d2e1c753715dcfe9d284a25a52d67818dd43c4932574307daf836f0071e37"}, - {file = "protobuf-4.24.4-cp38-cp38-win32.whl", hash = "sha256:02212557a76cd99574775a81fefeba8738d0f668d6abd0c6b1d3adcc75503dbe"}, - {file = "protobuf-4.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:2fa3886dfaae6b4c5ed2730d3bf47c7a38a72b3a1f0acb4d4caf68e6874b947b"}, - {file = "protobuf-4.24.4-cp39-cp39-win32.whl", hash = "sha256:b77272f3e28bb416e2071186cb39efd4abbf696d682cbb5dc731308ad37fa6dd"}, - {file = "protobuf-4.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:9fee5e8aa20ef1b84123bb9232b3f4a5114d9897ed89b4b8142d81924e05d79b"}, - {file = "protobuf-4.24.4-py3-none-any.whl", hash = "sha256:80797ce7424f8c8d2f2547e2d42bfbb6c08230ce5832d6c099a37335c9c90a92"}, - {file = "protobuf-4.24.4.tar.gz", hash = "sha256:5a70731910cd9104762161719c3d883c960151eea077134458503723b60e3667"}, + {file = "protobuf-6.33.0-cp310-abi3-win32.whl", hash = "sha256:d6101ded078042a8f17959eccd9236fb7a9ca20d3b0098bbcb91533a5680d035"}, + {file = "protobuf-6.33.0-cp310-abi3-win_amd64.whl", hash = "sha256:9a031d10f703f03768f2743a1c403af050b6ae1f3480e9c140f39c45f81b13ee"}, + {file = "protobuf-6.33.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:905b07a65f1a4b72412314082c7dbfae91a9e8b68a0cc1577515f8df58ecf455"}, + {file = "protobuf-6.33.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e0697ece353e6239b90ee43a9231318302ad8353c70e6e45499fa52396debf90"}, + {file = "protobuf-6.33.0-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:e0a1715e4f27355afd9570f3ea369735afc853a6c3951a6afe1f80d8569ad298"}, + {file = "protobuf-6.33.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:35be49fd3f4fefa4e6e2aacc35e8b837d6703c37a2168a55ac21e9b1bc7559ef"}, + {file = "protobuf-6.33.0-cp39-cp39-win32.whl", hash = "sha256:cd33a8e38ea3e39df66e1bbc462b076d6e5ba3a4ebbde58219d777223a7873d3"}, + {file = "protobuf-6.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:c963e86c3655af3a917962c9619e1a6b9670540351d7af9439d06064e3317cc9"}, + {file = "protobuf-6.33.0-py3-none-any.whl", hash = "sha256:25c9e1963c6734448ea2d308cfa610e692b801304ba0908d7bfa564ac5132995"}, + {file = "protobuf-6.33.0.tar.gz", hash = "sha256:140303d5c8d2037730c548f8c7b93b20bb1dc301be280c378b82b8894589c954"}, ] [[package]] @@ -1552,106 +1493,105 @@ python-dateutil = ">=2.8.0" [[package]] name = "pytest" -version = "7.2.2" +version = "8.3.5" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, + {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" +pluggy = ">=1.5,<2" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" -version = "0.23.8" +version = "0.25.3" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, - {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, + {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, + {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, ] [package.dependencies] -pytest = ">=7.0.0,<9" +pytest = ">=8.2,<9" [package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-repeat" -version = "0.9.1" +version = "0.9.3" description = "pytest plugin for repeating tests" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "pytest-repeat-0.9.1.tar.gz", hash = "sha256:5cd3289745ab3156d43eb9c8e7f7d00a926f3ae5c9cf425bec649b2fe15bad5b"}, - {file = "pytest_repeat-0.9.1-py2.py3-none-any.whl", hash = "sha256:4474a7d9e9137f6d8cc8ae297f8c4168d33c56dd740aa78cfffe562557e6b96e"}, + {file = "pytest_repeat-0.9.3-py3-none-any.whl", hash = "sha256:26ab2df18226af9d5ce441c858f273121e92ff55f5bb311d25755b8d7abdd8ed"}, + {file = "pytest_repeat-0.9.3.tar.gz", hash = "sha256:ffd3836dfcd67bb270bec648b330e20be37d2966448c4148c4092d1e8aba8185"}, ] [package.dependencies] -pytest = ">=3.6" +pytest = "*" [[package]] name = "pytest-rerunfailures" -version = "10.2" +version = "14.0" description = "pytest plugin to re-run tests to eliminate flaky failures" optional = false -python-versions = ">= 3.6" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "pytest-rerunfailures-10.2.tar.gz", hash = "sha256:9e1e1bad51e07642c5bbab809fc1d4ec8eebcb7de86f90f1a26e6ef9de446697"}, - {file = "pytest_rerunfailures-10.2-py3-none-any.whl", hash = "sha256:d31d8e828dfd39363ad99cd390187bf506c7a433a89f15c3126c7d16ab723fe2"}, + {file = "pytest-rerunfailures-14.0.tar.gz", hash = "sha256:4a400bcbcd3c7a4ad151ab8afac123d90eca3abe27f98725dc4d9702887d2e92"}, + {file = "pytest_rerunfailures-14.0-py3-none-any.whl", hash = "sha256:4197bdd2eaeffdbf50b5ea6e7236f47ff0e44d1def8dae08e409f536d84e7b32"}, ] [package.dependencies] -pytest = ">=5.3" -setuptools = ">=40.0" +packaging = ">=17.1" +pytest = ">=7.2" [[package]] name = "pytest-timeout" -version = "2.1.0" +version = "2.3.1" description = "pytest plugin to abort hanging tests" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "pytest-timeout-2.1.0.tar.gz", hash = "sha256:c07ca07404c612f8abbe22294b23c368e2e5104b521c1790195561f37e1ac3d9"}, - {file = "pytest_timeout-2.1.0-py3-none-any.whl", hash = "sha256:f6f50101443ce70ad325ceb4473c4255e9d74e3c7cd0ef827309dfa4c0d975c6"}, + {file = "pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9"}, + {file = "pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"}, ] [package.dependencies] -pytest = ">=5.0.0" +pytest = ">=7.0.0" [[package]] name = "pytest-xdist" -version = "3.2.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "pytest-xdist-3.2.0.tar.gz", hash = "sha256:fa10f95a2564cd91652f2d132725183c3b590d9fdcdec09d3677386ecf4c1ce9"}, - {file = "pytest_xdist-3.2.0-py3-none-any.whl", hash = "sha256:336098e3bbd8193276867cc87db8b22903c3927665dff9d1ac8684c02f597b68"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" -pytest = ">=6.2.0" +execnet = ">=2.1" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] @@ -1799,7 +1739,6 @@ files = [ [package.dependencies] attrs = ">=22.2.0" rpds-py = ">=0.7.0" -typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "requests" @@ -1977,70 +1916,10 @@ files = [ {file = "ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58"}, ] -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} - [package.extras] docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.12" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "platform_python_implementation == \"CPython\" and python_version == \"3.12\"" -files = [ - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"}, - {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"}, - {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"}, - {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"}, - {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"}, - {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"}, - {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, -] - [[package]] name = "setuptools" version = "77.0.3" @@ -2067,7 +1946,7 @@ name = "shared-tools" version = "0.0.0" description = "Tools shared by tests in hive projects" optional = false -python-versions = "^3.10" +python-versions = ">=3.14,<4" groups = ["main"] files = [] develop = true @@ -2076,6 +1955,18 @@ develop = true type = "directory" url = "../../../haf/hive/tests/python/hive-local-tools/shared-tools" +[[package]] +name = "simpleeval" +version = "1.0.3" +description = "A simple, safe single expression evaluator library." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38"}, + {file = "simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829"}, +] + [[package]] name = "six" version = "1.17.0" @@ -2168,7 +2059,6 @@ files = [ ] [package.dependencies] -greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -2242,45 +2132,51 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "tavern" -version = "2.2.0" +version = "3.0.2" description = "Simple testing of RESTful APIs" optional = false -python-versions = ">=3.8" +python-versions = ">=3.11" groups = ["main"] files = [ - {file = "tavern-2.2.0-py3-none-any.whl", hash = "sha256:9c6621e3b8d4a1a106b8ca743893562ba98ab309354709e441b38b48aa3b2a1c"}, - {file = "tavern-2.2.0.tar.gz", hash = "sha256:50e23c1ee7f14a3d140d525c9c08a2746d2367a04105440a0b5b7edbdab10c30"}, + {file = "tavern-3.0.2-py3-none-any.whl", hash = "sha256:dfcc935a6b6050785321d5f1a2b1c8c23fddeca42fa1c58db585e777d83eca70"}, + {file = "tavern-3.0.2.tar.gz", hash = "sha256:9360ff27a1ba943acac609e6f9592543a0fba1ffbc9cab05743e6eefab4eba0e"}, ] [package.dependencies] jmespath = ">=1,<2" -jsonschema = ">=3.2.0,<5" -paho-mqtt = ">=1.3.1,<=1.6.1" -pyjwt = ">=2.4.0,<3" +jsonschema = ">=4,<5" +pyjwt = ">=2.5.0,<3" pykwalify = ">=1.8.0,<2" -pytest = ">=7,<7.3" +pytest = ">=8,<10" python-box = ">=6,<7" -PyYAML = ">=5.3.1,<7" +PyYAML = ">=6.0.1,<7" requests = ">=2.22.0,<3" +simpleeval = ">=1.0.3" stevedore = ">=4,<5" [package.extras] -dev = ["Faker", "allure-pytest", "black (==23.3.0)", "bump2version", "colorlog", "coverage[toml]", "docker-compose", "flask (>=2.2.3)", "flit (>=3.2,<4)", "fluent-logger", "itsdangerous", "mypy", "mypy-extensions", "pip-tools", "pre-commit", "py", "pygments", "pytest-cov", "pytest-xdist", "ruff (>=0.0.270)", "tox (>=3,<4)", "tox-travis", "twine", "types-PyYAML", "types-requests", "types-setuptools", "wheel"] +dev = ["Faker", "allure-pytest", "colorlog", "coverage[toml]", "exceptiongroup", "flask (>=3,<4)", "flit (>=3.2,<4)", "fluent-logger", "grpc-interceptor", "grpcio-tools", "itsdangerous", "pre-commit", "protobuf-protoc-bin (==29.5)", "py", "pytest-cov", "pytest-xdist", "ruff (>=0.9.10,<0.10.0)", "tbump (>=6.10.0)", "tomli", "tox (>4.20,<5)", "tox (>=4,<5)", "types-PyYAML", "types-jmespath", "types-jsonschema", "types-paho-mqtt", "types-protobuf (>=5,<6)", "types-requests", "uv (>=0.9.2)", "wheel"] +docs = ["commonmark", "docutils", "pygments", "recommonmark", "sphinx (>=7,<8)", "sphinx-markdown-tables", "sphinx_rtd_theme"] +grpc = ["google-api-python-client", "grpcio", "grpcio-reflection", "grpcio-status", "proto-plus", "protobuf (>=5,<6)"] +mqtt = ["paho-mqtt (>=1.3.1,<=1.6.1)"] [[package]] name = "test-tools" version = "0.0.0" description = "Tools for testing hive software" optional = false -python-versions = "^3.12" +python-versions = ">=3.14,<4" groups = ["main"] files = [] develop = true [package.dependencies] abstractcp = "0.9.9" -hiveio-wax = "1.27.12rc2.dev7+daf5a82a" +hiveio-beekeepy = ">=1.28.4.dev7" +hiveio-schemas = ">=1.28.1.dev3" +hiveio-wax = ">=1.28.4rc1.dev60" loguru = "0.7.2" +msgspec = "^0.20.0" python-dateutil = "2.8.2" [package.source] @@ -2292,7 +2188,7 @@ name = "tests-api" version = "0.0.0" description = "A collective library containing tests for different APIs and tools for benchmarking" optional = false -python-versions = "^3.12" +python-versions = ">=3.14,<4" groups = ["main"] files = [] develop = true @@ -2515,5 +2411,5 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.1" -python-versions = "^3.12" -content-hash = "a373c2b7dd56ce9db40b48d2d0e1d07dc4ff8ca13962e103750257328a072ba1" +python-versions = "^3.14" +content-hash = "d0afd989a42a455e92c7ea9725e8d57c6f57e62a0c3180e002b3da63459993b5" -- GitLab From 64a1604d6b8a31a9c1ecdeb888a12f77aa381b69 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 03:59:53 -0500 Subject: [PATCH 05/16] Update HAF submodule to latest develop with Python 3.14 (755963951) --- .gitlab-ci.yml | 4 ++-- haf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 022c47a64..b310cf4b2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,14 +41,14 @@ variables: BLOCK_LOG_SOURCE_DIR_5M: /blockchain/block_log_5m # HAF submodule commit - must match the 'ref:' in the include section below # This is needed for service containers which can't access dotenv artifacts - HAF_COMMIT: "3bc1d4103b5206d97bcddb665c4eca68fae87766" + HAF_COMMIT: "7559639514d53f8b7e644a61fb2172468427abf9" # Enable CI-specific PostgreSQL config with reduced memory for HAF service containers HAF_CI_MODE: "1" include: - template: Workflows/Branch-Pipelines.gitlab-ci.yml - project: 'hive/haf' - ref: 3bc1d4103b5206d97bcddb665c4eca68fae87766 # feature/python-3.14 + ref: 7559639514d53f8b7e644a61fb2172468427abf9 # develop (Python 3.14) file: '/scripts/ci-helpers/prepare_data_image_job.yml' # Do not include common-ci-configuration here, it is already referenced by scripts/ci-helpers/prepare_data_image_job.yml included from Haf/Hive repos diff --git a/haf b/haf index 3bc1d4103..755963951 160000 --- a/haf +++ b/haf @@ -1 +1 @@ -Subproject commit 3bc1d4103b5206d97bcddb665c4eca68fae87766 +Subproject commit 7559639514d53f8b7e644a61fb2172468427abf9 -- GitLab From ca369c1e4125e49c2abce89102b02e3d8b1bdd28 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:04:58 -0500 Subject: [PATCH 06/16] Fix BUILDER_IMAGE_PATH to use common-ci-configuration registry --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b310cf4b2..47caa3066 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,9 +12,9 @@ variables: GIT_SUBMODULE_UPDATE_FLAGS: --jobs 4 CI_DEBUG_SERVICES: "true" - # uses registry.gitlab.syncad.com/hive/haf/ci-base-image:ubuntu24.04-6 + # uses registry.gitlab.syncad.com/hive/common-ci-configuration/ci-base-image:ubuntu24.04-py3.14-1 BUILDER_IMAGE_TAG: "$TEST_HAF_IMAGE_TAG" - BUILDER_IMAGE_PATH: "registry.gitlab.syncad.com/hive/haf/ci-base-image${BUILDER_IMAGE_TAG}" + BUILDER_IMAGE_PATH: "registry.gitlab.syncad.com/hive/common-ci-configuration/ci-base-image${BUILDER_IMAGE_TAG}" # references registry.gitlab.syncad.com/hive/hive/ci-base-image:ubuntu24.04-2023-10-04 PYTEST_RUNTIME_IMAGE_NAME: "registry.gitlab.syncad.com/hive/hive/ci-base-image@sha256:50bcbfe37fc031a902071ceaf586aff4554b15aa84e33b8bd84c31ad2386a26f" -- GitLab From 84b3f87e1313f5ea6b57b85e20b60b2322bfe03c Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:25:49 -0500 Subject: [PATCH 07/16] Add PYO3 forward compatibility flag for Python 3.14 --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 47caa3066..aa51c3196 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -45,6 +45,9 @@ variables: # Enable CI-specific PostgreSQL config with reduced memory for HAF service containers HAF_CI_MODE: "1" + # Python 3.14 compatibility - allow PyO3-based packages to build + PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1" + include: - template: Workflows/Branch-Pipelines.gitlab-ci.yml - project: 'hive/haf' -- GitLab From 7bb78c06f87ffc148a9e4aef8693b79d89fbfbb5 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:34:47 -0500 Subject: [PATCH 08/16] Add QUICK_TEST mode to skip data preparation and use cached HAF data --- .gitlab-ci.yml | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa51c3196..48ee9406a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,6 +33,29 @@ variables: "host all hafah_user 0.0.0.0/0 trust" "host all all 0.0.0.0/0 scram-sha-256" + # ============================================================================= + # Quick Test Mode + # ============================================================================= + # Skip data preparation jobs and use cached HAF data directly. + # Useful for testing SQL changes, test fixes, etc. without full replay. + # + # Usage: + # 1. Go to CI/CD → Run Pipeline + # 2. Set variables: + # QUICK_TEST=true + # QUICK_TEST_HAF_COMMIT= (from cache list below) + # + # Find available caches: + # ssh hive-builder-10 'ls -lt /nfs/ci-cache/haf/*.tar | head -5' + # Or use: ../haf/scripts/ci-helpers/list-haf-caches.sh --recent + # + # When QUICK_TEST=true: + # - prepare_hived_data and prepare_haf_data jobs are skipped + # - Test jobs use cached data from NFS based on QUICK_TEST_HAF_COMMIT + # ============================================================================= + QUICK_TEST: "false" + QUICK_TEST_HAF_COMMIT: "" # Required when QUICK_TEST=true - HAF commit with cached data + # Variables specific to runner (there is single runner cache and there is 5m block_log available) DATA_CACHE_HIVE_PREFIX: "/cache/replay_data_hive" DATA_CACHE_HAF_PREFIX: "/cache/replay_data_haf" @@ -111,6 +134,10 @@ prepare_hived_data: SUBMODULE_DIR: "$CI_PROJECT_DIR/haf/hive" BLOCK_LOG_SOURCE_DIR: $BLOCK_LOG_SOURCE_DIR_5M CONFIG_INI_SOURCE: "$CI_PROJECT_DIR/haf/hive/docker/config_5M.ini" + rules: + - if: $QUICK_TEST == "true" + when: never + - when: on_success tags: - data-cache-storage - fast @@ -158,6 +185,10 @@ prepare_haf_data: SUBMODULE_DIR: "$CI_PROJECT_DIR/haf" BLOCK_LOG_SOURCE_DIR: $BLOCK_LOG_SOURCE_DIR_5M CONFIG_INI_SOURCE: "$CI_PROJECT_DIR/haf/docker/config_5M.ini" + rules: + - if: $QUICK_TEST == "true" + when: never + - when: on_success tags: - data-cache-storage - fast @@ -225,6 +256,8 @@ build_setup_docker_image: HAF_APP_IMAGE: "" HAF_APP_PORT: ${APP_PORT} HAF_APP_USER: "hafah_user" + # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode + HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} PYTEST_BASED_IMAGE_NAME: ${PYTEST_RUNTIME_IMAGE_NAME} POETRY_INSTALL_ROOT_DIR: ${POETRY_INSTALL_DIR} @@ -239,6 +272,7 @@ build_setup_docker_image: needs: - job: prepare_haf_data artifacts: true + optional: true before_script: - !reference [.haf_app_pattern_tests_template, before_script] @@ -298,14 +332,18 @@ new_style_postgrest_pattern_tests: COMPARISON_TESTS_DIR: "$CI_PROJECT_DIR/haf/hive/tests/python/api_tests/comparsion_tests" HAF_APP_PORT: ${APP_PORT} HAF_APP_USER: "hafah_user" + # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode + HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} HIVED_UID: $HIVED_UID needs: - job: prepare_haf_data artifacts: true + optional: true - job: prepare_hived_data artifacts: true + optional: true artifacts: paths: @@ -341,9 +379,12 @@ postgrest_comparison_tests: HIVED_UID: $HIVED_UID HAF_APP_IMAGE: $HAFAH_IMAGE_NAME HAF_APP_PORT: $APP_PORT + # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode + HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} needs: - job: prepare_haf_data artifacts: true + optional: true - job: prepare_postgrest_hafah_image artifacts: true @@ -383,9 +424,12 @@ postgrest_rest_benchmark_tests: HIVED_UID: $HIVED_UID HAF_APP_IMAGE: $HAFAH_IMAGE_NAME HAF_APP_PORT: $APP_PORT + # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode + HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} needs: - job: prepare_haf_data artifacts: true + optional: true - job: prepare_postgrest_hafah_image artifacts: true script: @@ -571,9 +615,13 @@ hafah_pytest_rest_api_pattern_tests: # Pattern tests are tied to specific blockchain data indexed by develop branch HAF # Allow failure when using a different HAF commit (feature branches with HAF changes) allow_failure: true + variables: + # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode + HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} needs: - job: prepare_haf_data artifacts: true + optional: true - job: prepare_postgrest_hafah_image artifacts: true services: -- GitLab From 77ab15a46b1efb2af6105114a4383df340e53262 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:41:33 -0500 Subject: [PATCH 09/16] Add automatic skip detection for test/docs-only changes - Add detect_changes job that analyzes modified files - Skip data preparation when only tests/docs/SQL/markdown changed - Automatically find and use cached HAF data from NFS - Manual QUICK_TEST mode still available for explicit cache selection - Updated all test jobs to receive HAF_COMMIT from detect_changes --- .gitlab-ci.yml | 180 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 155 insertions(+), 25 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48ee9406a..ad208bab1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,5 @@ stages: +- detect - build - test - publish @@ -34,27 +35,25 @@ variables: "host all all 0.0.0.0/0 scram-sha-256" # ============================================================================= - # Quick Test Mode + # Quick Test / Auto-Skip Mode # ============================================================================= - # Skip data preparation jobs and use cached HAF data directly. - # Useful for testing SQL changes, test fixes, etc. without full replay. + # Two ways to skip data preparation and use cached HAF data: # - # Usage: - # 1. Go to CI/CD → Run Pipeline - # 2. Set variables: - # QUICK_TEST=true - # QUICK_TEST_HAF_COMMIT= (from cache list below) + # 1. AUTOMATIC: When only tests/docs/SQL change, data prep is automatically + # skipped and cached data is used. No configuration needed. + # + # 2. MANUAL: Set QUICK_TEST=true to force skip mode with a specific cache: + # - QUICK_TEST=true + # - QUICK_TEST_HAF_COMMIT= (required - find with list below) # # Find available caches: # ssh hive-builder-10 'ls -lt /nfs/ci-cache/haf/*.tar | head -5' # Or use: ../haf/scripts/ci-helpers/list-haf-caches.sh --recent - # - # When QUICK_TEST=true: - # - prepare_hived_data and prepare_haf_data jobs are skipped - # - Test jobs use cached data from NFS based on QUICK_TEST_HAF_COMMIT # ============================================================================= QUICK_TEST: "false" QUICK_TEST_HAF_COMMIT: "" # Required when QUICK_TEST=true - HAF commit with cached data + # Auto-populated by detect_changes job: + AUTO_SKIP_BUILD: "false" # Set to true when only tests/docs/SQL changed # Variables specific to runner (there is single runner cache and there is 5m block_log available) DATA_CACHE_HIVE_PREFIX: "/cache/replay_data_hive" @@ -78,6 +77,127 @@ include: file: '/scripts/ci-helpers/prepare_data_image_job.yml' # Do not include common-ci-configuration here, it is already referenced by scripts/ci-helpers/prepare_data_image_job.yml included from Haf/Hive repos +# ============================================================================= +# Detect Changes - determines if we can skip data preparation +# Outputs via dotenv artifact: +# AUTO_SKIP_BUILD - true if data prep can be skipped +# HAF_COMMIT - commit SHA for cached data (when skipping) +# ============================================================================= +detect_changes: + stage: detect + image: alpine:latest + rules: + # Skip for tags (always do full build for releases) + - if: $CI_COMMIT_TAG + when: never + - when: on_success + script: + - | + set -e + apk add --no-cache git docker-cli + + # Initialize defaults + CAN_SKIP_BUILD=false + CACHE_COMMIT="" + + # Handle manual QUICK_TEST mode + if [ "$QUICK_TEST" = "true" ]; then + echo "=== Manual QUICK_TEST Mode ===" + CAN_SKIP_BUILD=true + CACHE_COMMIT="${QUICK_TEST_HAF_COMMIT}" + if [ -z "$CACHE_COMMIT" ]; then + echo "ERROR: QUICK_TEST_HAF_COMMIT must be set when QUICK_TEST=true" + echo "" + echo "Find available caches:" + echo " ssh hive-builder-10 'ls -lt /nfs/ci-cache/haf/*.tar | head -5'" + exit 1 + fi + echo "Using cached data from: $CACHE_COMMIT" + else + # Automatic detection mode + echo "=== Detecting Changed Files ===" + + # Get changed files based on pipeline type + if [ -n "${CI_MERGE_REQUEST_DIFF_BASE_SHA:-}" ]; then + BASE_SHA="$CI_MERGE_REQUEST_DIFF_BASE_SHA" + echo "MR pipeline: comparing against target branch" + elif [ "${CI_PIPELINE_SOURCE:-}" = "push" ]; then + BASE_SHA="HEAD~1" + echo "Push pipeline: comparing against previous commit" + else + BASE_SHA=$(git merge-base HEAD origin/develop 2>/dev/null || echo "HEAD~1") + echo "Other pipeline: comparing against develop" + fi + + echo "Comparing $BASE_SHA to HEAD" + CHANGED_FILES=$(git diff --name-only "$BASE_SHA" HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD) + + echo "Changed files:" + echo "$CHANGED_FILES" | head -50 + + # Skip patterns: tests, docs, SQL, markdown (SQL doesn't require rebuild, just replay) + SKIP_PATTERNS="^tests/|^docs/|\.sql$|\.md$|^README|^CHANGELOG|^LICENSE|^CLAUDE" + + NEEDS_BUILD=$(echo "$CHANGED_FILES" | grep -vE "$SKIP_PATTERNS" || true) + + if [ -z "$NEEDS_BUILD" ]; then + echo "" + echo "=== Can skip data prep (only tests/docs/SQL changed) ===" + CAN_SKIP_BUILD=true + + # Find cached data from NFS + NFS_CACHE_PATH="/nfs/ci-cache/haf" + if [ -d "$NFS_CACHE_PATH" ]; then + echo "Looking for cached HAF data..." + # Docker login for image verification + echo "$CI_JOB_TOKEN" | docker login -u gitlab-ci-token --password-stdin "$CI_REGISTRY" 2>/dev/null || true + + for TAR in $(ls -t "$NFS_CACHE_PATH"/*.tar 2>/dev/null | head -5); do + TEST_COMMIT=$(basename "$TAR" .tar) + CACHE_SHORT=$(echo "$TEST_COMMIT" | cut -c1-8) + IMG="registry.gitlab.syncad.com/hive/haf:${CACHE_SHORT}" + + if docker manifest inspect "$IMG" >/dev/null 2>&1; then + CACHE_COMMIT="$TEST_COMMIT" + echo "Found cached data with valid image: $CACHE_COMMIT" + break + else + echo "Cache $TEST_COMMIT missing Docker image, trying next..." + fi + done + + if [ -z "$CACHE_COMMIT" ]; then + echo "WARNING: No cached data with valid images found - cannot skip" + CAN_SKIP_BUILD=false + fi + else + echo "WARNING: NFS cache path not found - cannot skip" + CAN_SKIP_BUILD=false + fi + else + echo "" + echo "=== Full data prep required ===" + echo "Files requiring data prep:" + echo "$NEEDS_BUILD" | head -20 + fi + fi + + # Export results + echo "AUTO_SKIP_BUILD=$CAN_SKIP_BUILD" >> detect_changes.env + if [ "$CAN_SKIP_BUILD" = "true" ] && [ -n "$CACHE_COMMIT" ]; then + echo "HAF_COMMIT=$CACHE_COMMIT" >> detect_changes.env + fi + + echo "" + echo "=== Results ===" + cat detect_changes.env + artifacts: + reports: + dotenv: detect_changes.env + expire_in: 1 day + tags: + - data-cache-storage # Needs NFS access to find caches + validate_haf_commit: stage: build image: alpine:latest @@ -127,6 +247,9 @@ prepare_hived_image: prepare_hived_data: extends: .prepare_hived_data_5m needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_hived_image artifacts: true stage: build @@ -135,7 +258,7 @@ prepare_hived_data: BLOCK_LOG_SOURCE_DIR: $BLOCK_LOG_SOURCE_DIR_5M CONFIG_INI_SOURCE: "$CI_PROJECT_DIR/haf/hive/docker/config_5M.ini" rules: - - if: $QUICK_TEST == "true" + - if: $QUICK_TEST == "true" || $AUTO_SKIP_BUILD == "true" when: never - when: on_success tags: @@ -178,6 +301,9 @@ generate-wax-spec: prepare_haf_data: extends: .prepare_haf_data_5m needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_haf_image artifacts: true stage: build @@ -186,7 +312,7 @@ prepare_haf_data: BLOCK_LOG_SOURCE_DIR: $BLOCK_LOG_SOURCE_DIR_5M CONFIG_INI_SOURCE: "$CI_PROJECT_DIR/haf/docker/config_5M.ini" rules: - - if: $QUICK_TEST == "true" + - if: $QUICK_TEST == "true" || $AUTO_SKIP_BUILD == "true" when: never - when: on_success tags: @@ -256,8 +382,6 @@ build_setup_docker_image: HAF_APP_IMAGE: "" HAF_APP_PORT: ${APP_PORT} HAF_APP_USER: "hafah_user" - # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode - HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} PYTEST_BASED_IMAGE_NAME: ${PYTEST_RUNTIME_IMAGE_NAME} POETRY_INSTALL_ROOT_DIR: ${POETRY_INSTALL_DIR} @@ -270,6 +394,9 @@ build_setup_docker_image: HIVED_UID: $HIVED_UID needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_haf_data artifacts: true optional: true @@ -332,12 +459,13 @@ new_style_postgrest_pattern_tests: COMPARISON_TESTS_DIR: "$CI_PROJECT_DIR/haf/hive/tests/python/api_tests/comparsion_tests" HAF_APP_PORT: ${APP_PORT} HAF_APP_USER: "hafah_user" - # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode - HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} HIVED_UID: $HIVED_UID needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_haf_data artifacts: true optional: true @@ -379,9 +507,10 @@ postgrest_comparison_tests: HIVED_UID: $HIVED_UID HAF_APP_IMAGE: $HAFAH_IMAGE_NAME HAF_APP_PORT: $APP_PORT - # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode - HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_haf_data artifacts: true optional: true @@ -424,9 +553,10 @@ postgrest_rest_benchmark_tests: HIVED_UID: $HIVED_UID HAF_APP_IMAGE: $HAFAH_IMAGE_NAME HAF_APP_PORT: $APP_PORT - # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode - HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_haf_data artifacts: true optional: true @@ -615,10 +745,10 @@ hafah_pytest_rest_api_pattern_tests: # Pattern tests are tied to specific blockchain data indexed by develop branch HAF # Allow failure when using a different HAF commit (feature branches with HAF changes) allow_failure: true - variables: - # Use QUICK_TEST_HAF_COMMIT for cache key when in quick test mode - HAF_COMMIT: ${QUICK_TEST_HAF_COMMIT:-$HAF_COMMIT} needs: + - job: detect_changes + artifacts: true + optional: true - job: prepare_haf_data artifacts: true optional: true -- GitLab From 4eefc554510780d973416180796096dfb7ce8378 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:43:53 -0500 Subject: [PATCH 10/16] Fix detect_changes for shallow clones - Use git show for push pipelines (works with GIT_DEPTH=1) - Add GIT_DEPTH override for detect_changes job - Fetch target branch for MR comparisons - Add proper fallback chain with graceful degradation --- .gitlab-ci.yml | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad208bab1..d4a710ded 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -86,6 +86,9 @@ include: detect_changes: stage: detect image: alpine:latest + variables: + # Fetch enough history to compare changes + GIT_DEPTH: 100 rules: # Skip for tags (always do full build for releases) - if: $CI_COMMIT_TAG @@ -118,19 +121,33 @@ detect_changes: echo "=== Detecting Changed Files ===" # Get changed files based on pipeline type + CHANGED_FILES="" if [ -n "${CI_MERGE_REQUEST_DIFF_BASE_SHA:-}" ]; then - BASE_SHA="$CI_MERGE_REQUEST_DIFF_BASE_SHA" echo "MR pipeline: comparing against target branch" - elif [ "${CI_PIPELINE_SOURCE:-}" = "push" ]; then - BASE_SHA="HEAD~1" + # Fetch the base commit for MR comparison + git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" --depth=1 2>/dev/null || true + CHANGED_FILES=$(git diff --name-only "$CI_MERGE_REQUEST_DIFF_BASE_SHA" HEAD 2>/dev/null || true) + fi + + # If MR diff failed or not an MR pipeline, try push comparison + if [ -z "$CHANGED_FILES" ] && [ "${CI_PIPELINE_SOURCE:-}" = "push" ]; then echo "Push pipeline: comparing against previous commit" - else - BASE_SHA=$(git merge-base HEAD origin/develop 2>/dev/null || echo "HEAD~1") - echo "Other pipeline: comparing against develop" + # For shallow clones, git show gives files changed in current commit + CHANGED_FILES=$(git show --name-only --pretty=format: HEAD 2>/dev/null | grep -v '^$' || true) fi - echo "Comparing $BASE_SHA to HEAD" - CHANGED_FILES=$(git diff --name-only "$BASE_SHA" HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD) + # Fallback: compare against develop + if [ -z "$CHANGED_FILES" ]; then + echo "Fallback: comparing against develop" + git fetch origin develop --depth=1 2>/dev/null || true + CHANGED_FILES=$(git diff --name-only origin/develop HEAD 2>/dev/null || true) + fi + + # Last resort: if we still can't get changed files, require full build + if [ -z "$CHANGED_FILES" ]; then + echo "WARNING: Could not determine changed files - requiring full build" + CHANGED_FILES="unknown-changes" + fi echo "Changed files:" echo "$CHANGED_FILES" | head -50 -- GitLab From 39e74e9a2b37980a079ba1e1d80462b2de7a4cd8 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:49:05 -0500 Subject: [PATCH 11/16] Update pytest runtime image to Python 3.14 Use BUILDER_IMAGE_PATH (Python 3.14) for all test jobs instead of hardcoded old Python 3.12 image. --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d4a710ded..b27ea0b35 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,8 +17,8 @@ variables: BUILDER_IMAGE_TAG: "$TEST_HAF_IMAGE_TAG" BUILDER_IMAGE_PATH: "registry.gitlab.syncad.com/hive/common-ci-configuration/ci-base-image${BUILDER_IMAGE_TAG}" - # references registry.gitlab.syncad.com/hive/hive/ci-base-image:ubuntu24.04-2023-10-04 - PYTEST_RUNTIME_IMAGE_NAME: "registry.gitlab.syncad.com/hive/hive/ci-base-image@sha256:50bcbfe37fc031a902071ceaf586aff4554b15aa84e33b8bd84c31ad2386a26f" + # Python 3.14 compatible runtime image for pytest + PYTEST_RUNTIME_IMAGE_NAME: "${BUILDER_IMAGE_PATH}" POETRY_INSTALL_DIR: "${CI_PROJECT_DIR}/haf/hive/tests/python/hive-local-tools" SETUP_SCRIPTS_PATH: "$CI_PROJECT_DIR/haf/scripts" -- GitLab From 25d3b464b2b812c7d024a8f756f99ea5051f50b8 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:53:05 -0500 Subject: [PATCH 12/16] Simplify detect_changes job - Remove Docker image verification (cache-manager handles this) - Use git show for shallow clones (works with GIT_DEPTH=1) - Just find most recent cache key, let cache-manager validate - Update pytest runtime image to Python 3.14 --- .gitlab-ci.yml | 62 +++++++++++++------------------------------------- 1 file changed, 16 insertions(+), 46 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b27ea0b35..ae7851754 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -82,13 +82,12 @@ include: # Outputs via dotenv artifact: # AUTO_SKIP_BUILD - true if data prep can be skipped # HAF_COMMIT - commit SHA for cached data (when skipping) +# +# Note: Actual cache handling is done by cache-manager.sh from common-ci-configuration # ============================================================================= detect_changes: stage: detect image: alpine:latest - variables: - # Fetch enough history to compare changes - GIT_DEPTH: 100 rules: # Skip for tags (always do full build for releases) - if: $CI_COMMIT_TAG @@ -97,7 +96,7 @@ detect_changes: script: - | set -e - apk add --no-cache git docker-cli + apk add --no-cache git # Initialize defaults CAN_SKIP_BUILD=false @@ -120,30 +119,16 @@ detect_changes: # Automatic detection mode echo "=== Detecting Changed Files ===" - # Get changed files based on pipeline type - CHANGED_FILES="" - if [ -n "${CI_MERGE_REQUEST_DIFF_BASE_SHA:-}" ]; then + # Get changed files - use git show for shallow clones (CI default) + CHANGED_FILES=$(git show --name-only --pretty=format: HEAD 2>/dev/null | grep -v '^$' || true) + + # Fallback for MR pipelines + if [ -z "$CHANGED_FILES" ] && [ -n "${CI_MERGE_REQUEST_DIFF_BASE_SHA:-}" ]; then echo "MR pipeline: comparing against target branch" - # Fetch the base commit for MR comparison - git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" --depth=1 2>/dev/null || true CHANGED_FILES=$(git diff --name-only "$CI_MERGE_REQUEST_DIFF_BASE_SHA" HEAD 2>/dev/null || true) fi - # If MR diff failed or not an MR pipeline, try push comparison - if [ -z "$CHANGED_FILES" ] && [ "${CI_PIPELINE_SOURCE:-}" = "push" ]; then - echo "Push pipeline: comparing against previous commit" - # For shallow clones, git show gives files changed in current commit - CHANGED_FILES=$(git show --name-only --pretty=format: HEAD 2>/dev/null | grep -v '^$' || true) - fi - - # Fallback: compare against develop - if [ -z "$CHANGED_FILES" ]; then - echo "Fallback: comparing against develop" - git fetch origin develop --depth=1 2>/dev/null || true - CHANGED_FILES=$(git diff --name-only origin/develop HEAD 2>/dev/null || true) - fi - - # Last resort: if we still can't get changed files, require full build + # Last resort: require full build if [ -z "$CHANGED_FILES" ]; then echo "WARNING: Could not determine changed files - requiring full build" CHANGED_FILES="unknown-changes" @@ -152,7 +137,7 @@ detect_changes: echo "Changed files:" echo "$CHANGED_FILES" | head -50 - # Skip patterns: tests, docs, SQL, markdown (SQL doesn't require rebuild, just replay) + # Skip patterns: tests, docs, SQL, markdown SKIP_PATTERNS="^tests/|^docs/|\.sql$|\.md$|^README|^CHANGELOG|^LICENSE|^CLAUDE" NEEDS_BUILD=$(echo "$CHANGED_FILES" | grep -vE "$SKIP_PATTERNS" || true) @@ -162,29 +147,14 @@ detect_changes: echo "=== Can skip data prep (only tests/docs/SQL changed) ===" CAN_SKIP_BUILD=true - # Find cached data from NFS + # Find most recent cache from NFS - cache-manager will handle the rest NFS_CACHE_PATH="/nfs/ci-cache/haf" if [ -d "$NFS_CACHE_PATH" ]; then - echo "Looking for cached HAF data..." - # Docker login for image verification - echo "$CI_JOB_TOKEN" | docker login -u gitlab-ci-token --password-stdin "$CI_REGISTRY" 2>/dev/null || true - - for TAR in $(ls -t "$NFS_CACHE_PATH"/*.tar 2>/dev/null | head -5); do - TEST_COMMIT=$(basename "$TAR" .tar) - CACHE_SHORT=$(echo "$TEST_COMMIT" | cut -c1-8) - IMG="registry.gitlab.syncad.com/hive/haf:${CACHE_SHORT}" - - if docker manifest inspect "$IMG" >/dev/null 2>&1; then - CACHE_COMMIT="$TEST_COMMIT" - echo "Found cached data with valid image: $CACHE_COMMIT" - break - else - echo "Cache $TEST_COMMIT missing Docker image, trying next..." - fi - done - - if [ -z "$CACHE_COMMIT" ]; then - echo "WARNING: No cached data with valid images found - cannot skip" + CACHE_COMMIT=$(ls -t "$NFS_CACHE_PATH"/*.tar 2>/dev/null | head -1 | xargs -r basename | sed 's/\.tar$//' || true) + if [ -n "$CACHE_COMMIT" ]; then + echo "Using most recent cache: $CACHE_COMMIT" + else + echo "WARNING: No cached data found - cannot skip" CAN_SKIP_BUILD=false fi else -- GitLab From 0ff12597a2a6daf6918fb2f622a3881eff22a5be Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 04:59:43 -0500 Subject: [PATCH 13/16] Allow functional test failures until psycopg2-binary supports Python 3.14 psycopg2-binary doesn't have pre-built wheels for Python 3.14 yet, and the CI image lacks pg_config to build from source. This is a HAF dependency (haf-local-tools) that will be fixed upstream. --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae7851754..d8a97a522 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -658,6 +658,9 @@ prepare_haf_image_testnet: .hafah_pytest_fuctional_tests_base: extends: .pytest_based_template stage: test + # Allow failure until psycopg2-binary adds Python 3.14 wheels + # (haf-local-tools dependency, requires pg_config to build from source) + allow_failure: true needs: - job: prepare_haf_image_testnet artifacts: true -- GitLab From bba20171ab8d327696c653783f655de9d2b57e87 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 07:25:01 -0500 Subject: [PATCH 14/16] Fix psycopg2-binary build for Python 3.14 Install libpq-dev (PostgreSQL development headers) before poetry install so psycopg2-binary can build from source when no wheels are available. --- .gitlab-ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d8a97a522..f8b07fdb7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -658,14 +658,15 @@ prepare_haf_image_testnet: .hafah_pytest_fuctional_tests_base: extends: .pytest_based_template stage: test - # Allow failure until psycopg2-binary adds Python 3.14 wheels - # (haf-local-tools dependency, requires pg_config to build from source) - allow_failure: true needs: - job: prepare_haf_image_testnet artifacts: true - job: prepare_postgrest_hafah_image artifacts: true + before_script: + # Install libpq-dev for psycopg2-binary build (no Python 3.14 wheels yet) + - sudo apt-get update && sudo apt-get install -y libpq-dev + - !reference [.pytest_based_template, before_script] services: - *haf-instance-testnet -- GitLab From 749e3f1dbd2afacf3a83edea13ae6afdf0697a06 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 12:08:06 -0500 Subject: [PATCH 15/16] Remove libpq-dev workaround (now in CI base image) --- .gitlab-ci.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f8b07fdb7..ae7851754 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -663,10 +663,6 @@ prepare_haf_image_testnet: artifacts: true - job: prepare_postgrest_hafah_image artifacts: true - before_script: - # Install libpq-dev for psycopg2-binary build (no Python 3.14 wheels yet) - - sudo apt-get update && sudo apt-get install -y libpq-dev - - !reference [.pytest_based_template, before_script] services: - *haf-instance-testnet -- GitLab From aa3ed2d940bc907a56518dea6092c16ec8905235 Mon Sep 17 00:00:00 2001 From: Dan Notestein Date: Sun, 28 Dec 2025 12:27:09 -0500 Subject: [PATCH 16/16] Re-add libpq-dev workaround until HAF updates CI image reference The common-ci-configuration MR was merged, but HAF templates still reference specific CI image tags that haven't been updated yet. Keep the workaround until HAF updates to use the new image. --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae7851754..19c147940 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -663,6 +663,10 @@ prepare_haf_image_testnet: artifacts: true - job: prepare_postgrest_hafah_image artifacts: true + before_script: + # Install libpq-dev until HAF updates to new CI base image with libpq-dev + - sudo apt-get update && sudo apt-get install -y libpq-dev + - !reference [.pytest_based_template, before_script] services: - *haf-instance-testnet -- GitLab