diff --git a/.flox/env/manifest.lock b/.flox/env/manifest.lock index 95450299..8b844769 100644 --- a/.flox/env/manifest.lock +++ b/.flox/env/manifest.lock @@ -13,6 +13,9 @@ "pkg-path": "cargo", "pkg-group": "rust-toolchain" }, + "cargo-audit": { + "pkg-path": "cargo-audit" + }, "cargo-llvm-cov": { "pkg-path": "cargo-llvm-cov", "pkg-group": "rust-toolchain" @@ -120,6 +123,9 @@ "vulture": { "pkg-path": "python312Packages.vulture" }, + "xenon": { + "pkg-path": "xenon" + }, "yamllint": { "pkg-path": "yamllint" } @@ -127,9 +133,6 @@ "hook": { "on-activate": "if [[ -f .env ]]; then\n set -a\n source .env\n set +a\nfi\n" }, - "profile": { - "common": "if [[ -f .env ]]; then\n set -a\n source .env\n set +a\nfi\n" - }, "options": { "systems": [ "aarch64-darwin", @@ -1353,6 +1356,122 @@ "group": "toplevel", "priority": 5 }, + { + "attr_path": "cargo-audit", + "broken": false, + "derivation": "/nix/store/5l5z80gx41n0kqd6r28h02bnb78qqaqa-cargo-audit-0.21.2.drv", + "description": "Audit Cargo.lock files for crates with security vulnerabilities", + "install_id": "cargo-audit", + "license": "[ MIT, Apache-2.0 ]", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "cargo-audit-0.21.2", + "pname": "cargo-audit", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T02:54:46.841606Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.21.2", + "outputs_to_install": [ + "out" + ], + "outputs": { + "out": "/nix/store/h3fclrsvyk6ylbw5hlwj23a5cpbc90i2-cargo-audit-0.21.2" + }, + "system": "aarch64-darwin", + "group": "toplevel", + "priority": 5 + }, + { + "attr_path": "cargo-audit", + "broken": false, + "derivation": "/nix/store/nr6nrc98qfmmgf4094nz6kgj6134gy6w-cargo-audit-0.21.2.drv", + "description": "Audit Cargo.lock files for crates with security vulnerabilities", + "install_id": "cargo-audit", + "license": "[ MIT, Apache-2.0 ]", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "cargo-audit-0.21.2", + "pname": "cargo-audit", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T03:04:24.702412Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.21.2", + "outputs_to_install": [ + "out" + ], + "outputs": { + "out": "/nix/store/wyfr4vw3wmgczajrj6ikfhq8wip0ash0-cargo-audit-0.21.2" + }, + "system": "aarch64-linux", + "group": "toplevel", + "priority": 5 + }, + { + "attr_path": "cargo-audit", + "broken": false, + "derivation": "/nix/store/ykfgywkz04yk9zg5hb2ash6ywqrj218b-cargo-audit-0.21.2.drv", + "description": "Audit Cargo.lock files for crates with security vulnerabilities", + "install_id": "cargo-audit", + "license": "[ MIT, Apache-2.0 ]", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "cargo-audit-0.21.2", + "pname": "cargo-audit", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T03:14:44.969242Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.21.2", + "outputs_to_install": [ + "out" + ], + "outputs": { + "out": "/nix/store/30y2a72jzbsais6d45nlcf5dhhnsm9yl-cargo-audit-0.21.2" + }, + "system": "x86_64-darwin", + "group": "toplevel", + "priority": 5 + }, + { + "attr_path": "cargo-audit", + "broken": false, + "derivation": "/nix/store/av867g4gjbdjd48dyndqm34dpbv54cfm-cargo-audit-0.21.2.drv", + "description": "Audit Cargo.lock files for crates with security vulnerabilities", + "install_id": "cargo-audit", + "license": "[ MIT, Apache-2.0 ]", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "cargo-audit-0.21.2", + "pname": "cargo-audit", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T03:23:59.181238Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.21.2", + "outputs_to_install": [ + "out" + ], + "outputs": { + "out": "/nix/store/x69l7ybsvq1zjgvi1d0rbq87nii5q2qb-cargo-audit-0.21.2" + }, + "system": "x86_64-linux", + "group": "toplevel", + "priority": 5 + }, { "attr_path": "cargo-nextest", "broken": false, @@ -3846,6 +3965,126 @@ "group": "toplevel", "priority": 5 }, + { + "attr_path": "xenon", + "broken": false, + "derivation": "/nix/store/yimma6wljfig168ilbki8iwfannznniz-xenon-0.9.3.drv", + "description": "Monitoring tool based on radon", + "install_id": "xenon", + "license": "MIT", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "xenon-0.9.3", + "pname": "xenon", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T02:57:24.134342Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.9.3", + "outputs_to_install": [ + "out" + ], + "outputs": { + "dist": "/nix/store/h707xs7v5p453a3ld80ykawgbmskqsmr-xenon-0.9.3-dist", + "out": "/nix/store/12fqv1v3pl5bj068xk6iarari7af9qfm-xenon-0.9.3" + }, + "system": "aarch64-darwin", + "group": "toplevel", + "priority": 5 + }, + { + "attr_path": "xenon", + "broken": false, + "derivation": "/nix/store/qn3i7jk8cmrq1syirx11lipk3i2hzcw0-xenon-0.9.3.drv", + "description": "Monitoring tool based on radon", + "install_id": "xenon", + "license": "MIT", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "xenon-0.9.3", + "pname": "xenon", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T03:07:48.320764Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.9.3", + "outputs_to_install": [ + "out" + ], + "outputs": { + "dist": "/nix/store/6gdi03dhwl9r1r1kk1isds1sdvxjlqk0-xenon-0.9.3-dist", + "out": "/nix/store/2cqazgb5nvvlw2m2i704ni55a0a070mx-xenon-0.9.3" + }, + "system": "aarch64-linux", + "group": "toplevel", + "priority": 5 + }, + { + "attr_path": "xenon", + "broken": false, + "derivation": "/nix/store/l6h708isjw1k8nxwf29lyl4zssg7xpnk-xenon-0.9.3.drv", + "description": "Monitoring tool based on radon", + "install_id": "xenon", + "license": "MIT", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "xenon-0.9.3", + "pname": "xenon", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T03:17:11.917914Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.9.3", + "outputs_to_install": [ + "out" + ], + "outputs": { + "dist": "/nix/store/rvgppp1fj1jpxkgyql9dni0b64gy07jn-xenon-0.9.3-dist", + "out": "/nix/store/13x9sz293mi4hkp2p3nn9hsm4qdbyx15-xenon-0.9.3" + }, + "system": "x86_64-darwin", + "group": "toplevel", + "priority": 5 + }, + { + "attr_path": "xenon", + "broken": false, + "derivation": "/nix/store/631zg34bnfrnqr3jfdgvh5glnm278ddf-xenon-0.9.3.drv", + "description": "Monitoring tool based on radon", + "install_id": "xenon", + "license": "MIT", + "locked_url": "https://github.com/flox/nixpkgs?rev=f61125a668a320878494449750330ca58b78c557", + "name": "xenon-0.9.3", + "pname": "xenon", + "rev": "f61125a668a320878494449750330ca58b78c557", + "rev_count": 907002, + "rev_date": "2025-12-05T15:54:32Z", + "scrape_date": "2025-12-07T03:27:23.885060Z", + "stabilities": [ + "unstable" + ], + "unfree": false, + "version": "0.9.3", + "outputs_to_install": [ + "out" + ], + "outputs": { + "dist": "/nix/store/sgjrpkpv7nri4pbwh07ixr5829rhkg43-xenon-0.9.3-dist", + "out": "/nix/store/4l814ds66cdq01prr8q5krjzz29fchri-xenon-0.9.3" + }, + "system": "x86_64-linux", + "group": "toplevel", + "priority": 5 + }, { "attr_path": "yamllint", "broken": false, diff --git a/.flox/env/manifest.toml b/.flox/env/manifest.toml index 21fbbf63..be5abf74 100644 --- a/.flox/env/manifest.toml +++ b/.flox/env/manifest.toml @@ -8,7 +8,6 @@ ruff.pkg-path = "ruff" ruff.version = "0.14.7" uv.pkg-path = "uv" vulture.pkg-path = "python312Packages.vulture" -yamllint.pkg-path = "yamllint" nushell.pkg-path = "nushell" fselect.pkg-path = "fselect" awscli2.pkg-path = "awscli2" @@ -46,6 +45,8 @@ direnv.pkg-path = "direnv" jq.pkg-path = "jq" markdownlint-cli.pkg-path = "markdownlint-cli" pre-commit.pkg-path = "pre-commit" +yamllint.pkg-path = "yamllint" +xenon.pkg-path = "xenon" [hook] on-activate = ''' diff --git a/.flox/pip.ini b/.flox/pip.ini new file mode 100644 index 00000000..7905638d --- /dev/null +++ b/.flox/pip.ini @@ -0,0 +1,2 @@ +[global] +require-virtualenv = true diff --git a/.github/workflows/run_claude_code_coding_agent.yaml b/.github/workflows/run_claude_code_coding_agent.yaml index 631b30bc..a07e4267 100644 --- a/.github/workflows/run_claude_code_coding_agent.yaml +++ b/.github/workflows/run_claude_code_coding_agent.yaml @@ -18,10 +18,16 @@ on: jobs: claude: if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || - (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) + (github.event_name == 'issue_comment' && + contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review_comment' && + contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review' && + contains(github.event.review.body, '@claude')) || + (github.event_name == 'issues' && ( + contains(github.event.issue.body, '@claude') || + contains(github.event.issue.title, '@claude') + )) runs-on: ubuntu-latest permissions: contents: read diff --git a/.github/workflows/run_code_checks.yaml b/.github/workflows/run_code_checks.yaml index 9bf207fa..7da9e27e 100644 --- a/.github/workflows/run_code_checks.yaml +++ b/.github/workflows/run_code_checks.yaml @@ -83,11 +83,23 @@ jobs: uses: flox/activate-action@v1 with: command: mask development markdown all + run_yaml_code_checks: + name: Run YAML code checks + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Install Flox + uses: flox/install-flox-action@v2 + - name: Run YAML code checks + uses: flox/activate-action@v1 + with: + command: mask development yaml all upload_test_coverage: needs: - run_rust_code_checks - run_python_code_checks - if: ${{ always() && (needs.run_rust_code_checks.result == 'success' || needs.run_python_code_checks.result == 'success') }} + if: always() && (needs.run_rust_code_checks.result == 'success' && needs.run_python_code_checks.result == 'success') name: Upload coverage to Coveralls runs-on: ubuntu-latest steps: diff --git a/.markdownlint.yaml b/.markdownlint.yaml index 414c5a86..a83561b7 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -1,3 +1,4 @@ +--- # Markdownlint configuration # See https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 828121a9..24411fb4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,3 +29,12 @@ repos: - markdown language: system fail_fast: true + - id: yaml + name: Check all YAML code + entry: mask development yaml all + pass_filenames: false + types: + - file + - yaml + language: system + fail_fast: true diff --git a/.yamllint b/.yamllint new file mode 100644 index 00000000..4c6591b0 --- /dev/null +++ b/.yamllint @@ -0,0 +1,13 @@ +--- +extends: default + +ignore: | + .venv/ + target/ + .flox/ + +rules: + line-length: + max: 120 + truthy: + allowed-values: ['true', 'false', 'on'] diff --git a/Cargo.lock b/Cargo.lock index f3720a8c..dc43b66d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,6 +72,12 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -111,6 +117,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f13d10a41ac8d2ec79ee34178d61e6f47a29c2edfe7ef1721c7383b0359e65" dependencies = [ + "half", "num-traits", ] @@ -256,7 +263,7 @@ version = "56.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3aa9e59c611ebc291c28582077ef25c97f1975383f1479b12f3b9ffee2ffabe" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[package]] @@ -300,6 +307,22 @@ dependencies = [ "serde_json", ] +[[package]] +name = "astral-tokio-tar" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec179a06c1769b1e42e1e2cbe74c7dcdb3d6383c838454d063eaac5bbb7ebbe5" +dependencies = [ + "filetime", + "futures-core", + "libc", + "portable-atomic", + "rustc-hash", + "tokio", + "tokio-stream", + "xattr", +] + [[package]] name = "async-channel" version = "2.5.0" @@ -331,7 +354,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -342,7 +365,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -356,9 +379,9 @@ dependencies = [ [[package]] name = "atoi_simd" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a49e05797ca52e312a0c658938b7d00693ef037799ef7187678f212d7684cf" +checksum = "8ad17c7c205c2c28b527b9845eeb91cf1b4d008b438f98ce0e628227a822758e" dependencies = [ "debug_unsafe", ] @@ -881,7 +904,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -940,15 +963,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] @@ -999,13 +1016,17 @@ dependencies = [ [[package]] name = "bollard" -version = "0.18.1" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ccca1260af6a459d75994ad5acc1651bcabcbdbc41467cc9786519ab854c30" +checksum = "87a52479c9237eb04047ddb94788c41ca0d26eaff8b697ecfbb4c32f7fdc3b1b" dependencies = [ + "async-stream", "base64 0.22.1", + "bitflags", + "bollard-buildkit-proto", "bollard-stubs", "bytes", + "chrono", "futures-core", "futures-util", "hex", @@ -1018,7 +1039,9 @@ dependencies = [ "hyper-util", "hyperlocal", "log", + "num", "pin-project-lite", + "rand 0.9.2", "rustls 0.23.36", "rustls-native-certs", "rustls-pemfile", @@ -1030,19 +1053,40 @@ dependencies = [ "serde_urlencoded", "thiserror 2.0.18", "tokio", + "tokio-stream", "tokio-util", + "tonic", "tower-service", "url", "winapi", ] +[[package]] +name = "bollard-buildkit-proto" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a885520bf6249ab931a764ffdb87b0ceef48e6e7d807cfdb21b751e086e1ad" +dependencies = [ + "prost", + "prost-types", + "tonic", + "tonic-prost", + "ureq 3.2.0", +] + [[package]] name = "bollard-stubs" -version = "1.47.1-rc.27.3.1" +version = "1.49.1-rc.28.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f179cfbddb6e77a5472703d4b30436bff32929c0aa8a9008ecf23d1d3cdd0da" +checksum = "5731fe885755e92beff1950774068e0cae67ea6ec7587381536fca84f1779623" dependencies = [ + "base64 0.22.1", + "bollard-buildkit-proto", + "bytes", + "chrono", + "prost", "serde", + "serde_json", "serde_repr", "serde_with", ] @@ -1067,7 +1111,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1142,7 +1186,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1181,9 +1225,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.55" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", "jobserver", @@ -1205,16 +1249,17 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -1434,7 +1479,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.10.0", + "bitflags", "crossterm_winapi", "libc", "parking_lot", @@ -1447,7 +1492,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.10.0", + "bitflags", "parking_lot", "rustix 0.38.44", ] @@ -1530,7 +1575,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1544,7 +1589,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1555,7 +1600,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1566,7 +1611,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1646,7 +1691,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1666,7 +1711,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.10.0", + "bitflags", "objc2", ] @@ -1678,7 +1723,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1788,13 +1833,12 @@ dependencies = [ [[package]] name = "etcetera" -version = "0.8.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +checksum = "de48cc4d1c1d97a20fd819def54b890cadde72ed3ad0c614822a0a433361be96" dependencies = [ "cfg-if", - "home", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -1848,6 +1892,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "ferroid" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb330bbd4cb7a5b9f559427f06f98a4f853a137c8298f3bd3f8ca57663e21986" +dependencies = [ + "portable-atomic", + "rand 0.9.2", + "web-time", +] + [[package]] name = "ff" version = "0.12.1" @@ -1973,9 +2028,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1988,9 +2043,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1998,15 +2053,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -2015,38 +2070,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2056,7 +2111,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2177,19 +2231,21 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ + "bytemuck", "cfg-if", "crunchy", "num-traits", + "serde", "zerocopy", ] [[package]] name = "halfbrown" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2c385c6df70fd180bbb673d93039dbd2cd34e41d782600bdf6e1ca7bce39aa" +checksum = "0c7ed2f2edad8a14c8186b847909a41fbb9c3eafa44f88bd891114ed5019da09" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", "serde", ] @@ -2211,8 +2267,6 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.1.5", - "rayon", - "serde", ] [[package]] @@ -2224,6 +2278,9 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", + "rayon", + "serde", + "serde_core", ] [[package]] @@ -2273,7 +2330,7 @@ checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" dependencies = [ "cfg-if", "libc", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -2444,6 +2501,19 @@ dependencies = [ "webpki-roots 1.0.6", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.8.1", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -2794,9 +2864,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.181" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libduckdb-sys" @@ -2826,7 +2896,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.10.0", + "bitflags", "libc", "redox_syscall 0.7.1", ] @@ -2931,9 +3001,9 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" dependencies = [ "libc", ] @@ -2992,17 +3062,17 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "9d5d26952a508f321b4d3d2e80e78fc2603eaefcdf0c30783867f19586518bdc" dependencies = [ "libc", "log", "openssl", - "openssl-probe 0.1.6", + "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework", "security-framework-sys", "tempfile", ] @@ -3013,7 +3083,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.10.0", + "bitflags", "cfg-if", "cfg_aliases", "libc", @@ -3076,6 +3146,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -3132,7 +3213,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.10.0", + "bitflags", "objc2", "objc2-foundation", ] @@ -3153,7 +3234,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.10.0", + "bitflags", "dispatch2", "objc2", ] @@ -3164,7 +3245,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.10.0", + "bitflags", "dispatch2", "objc2", "objc2-core-foundation", @@ -3197,7 +3278,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags 2.10.0", + "bitflags", "objc2", "objc2-core-foundation", "objc2-core-graphics", @@ -3215,7 +3296,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.10.0", + "bitflags", "block2", "libc", "objc2", @@ -3228,7 +3309,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.10.0", + "bitflags", "objc2", "objc2-core-foundation", ] @@ -3239,7 +3320,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.10.0", + "bitflags", "objc2", "objc2-core-foundation", "objc2-foundation", @@ -3251,7 +3332,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.10.0", + "bitflags", "block2", "objc2", "objc2-cloud-kit", @@ -3287,9 +3368,9 @@ dependencies = [ [[package]] name = "object_store" -version = "0.12.5" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbfbfff40aeccab00ec8a910b57ca8ecf4319b335c542f2edcd19dd25a1e2a00" +checksum = "c2858065e55c148d294a9f3aae3b0fa9458edadb41a108397094566f4e3c0dfb" dependencies = [ "async-trait", "base64 0.22.1", @@ -3332,7 +3413,7 @@ version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.10.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -3349,15 +3430,9 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - [[package]] name = "openssl-probe" version = "0.2.1" @@ -3435,7 +3510,7 @@ dependencies = [ "libc", "redox_syscall 0.5.18", "smallvec", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -3460,7 +3535,7 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -3504,7 +3579,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -3547,13 +3622,15 @@ dependencies = [ [[package]] name = "polars" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5f7feb5d56b954e691dff22a8b2d78d77433dcc93c35fe21c3777fdc121b697" +checksum = "899852b723e563dc3cbdc7ea833b14ec44e61309f55df29ba86d45cfd6bc141a" dependencies = [ "getrandom 0.2.17", "getrandom 0.3.4", "polars-arrow", + "polars-buffer", + "polars-compute", "polars-core", "polars-error", "polars-io", @@ -3568,13 +3645,14 @@ dependencies = [ [[package]] name = "polars-arrow" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b4fed2343961b3eea3db2cee165540c3e1ad9d5782350cc55a9e76cf440148" +checksum = "6f672743a042b72ace4f88b29f8205ab200b29c5ac976c0560899680c07d2d09" dependencies = [ "atoi_simd", - "bitflags 2.10.0", + "bitflags", "bytemuck", + "bytes", "chrono", "chrono-tz", "dyn-clone", @@ -3582,11 +3660,13 @@ dependencies = [ "ethnum", "getrandom 0.2.17", "getrandom 0.3.4", - "hashbrown 0.15.5", + "half", + "hashbrown 0.16.1", "itoa", "lz4", "num-traits", "polars-arrow-format", + "polars-buffer", "polars-error", "polars-schema", "polars-utils", @@ -3608,50 +3688,64 @@ dependencies = [ "serde", ] +[[package]] +name = "polars-buffer" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7011424c3a79ca9c1272c7b4f5fe98695d3bed45595e37bb23c16a2978c80c" +dependencies = [ + "bytemuck", + "either", + "serde", + "version_check", +] + [[package]] name = "polars-compute" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138785beda4e4a90a025219f09d0d15a671b2be9091513ede58e05db6ad4413f" +checksum = "42a32eca8e08ac4cc5de2ac3996d2b38567bba72cdb19bbfd94c370193ed51dd" dependencies = [ "atoi_simd", "bytemuck", "chrono", "either", "fast-float2", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "itoa", "num-traits", "polars-arrow", + "polars-buffer", "polars-error", "polars-utils", "rand 0.9.2", - "ryu", "serde", - "skiplist", "strength_reduce", "strum_macros 0.27.2", "version_check", + "zmij", ] [[package]] name = "polars-core" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77b1f08ef6dbb032bb1d0d3365464be950df9905f6827a95b24c4ca5518901d" +checksum = "726296966d04268ee9679c2062af2d06c83c7a87379be471defe616b244c5029" dependencies = [ - "bitflags 2.10.0", + "bitflags", "boxcar", "bytemuck", "chrono", "chrono-tz", "comfy-table", "either", - "hashbrown 0.15.5", + "getrandom 0.3.4", + "hashbrown 0.16.1", "indexmap 2.13.0", "itoa", "num-traits", "polars-arrow", + "polars-buffer", "polars-compute", "polars-dtype", "polars-error", @@ -3672,12 +3766,12 @@ dependencies = [ [[package]] name = "polars-dtype" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c43d0ea57168be4546c4d8064479ed8b29a9c79c31a0c7c367ee734b9b7158" +checksum = "51976dc46d42cd1e7ca252a9e3bdc90c63b0bfa7030047ebaf5250c2b7838fa6" dependencies = [ "boxcar", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "polars-arrow", "polars-error", "polars-utils", @@ -3687,9 +3781,9 @@ dependencies = [ [[package]] name = "polars-error" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cb5d98f59f8b94673ee391840440ad9f0d2170afced95fc98aa86f895563c0" +checksum = "8c13126f8baebc13dadf26a80dcf69a607977fc8a67b18671ad2cefc713a7bdd" dependencies = [ "object_store", "parking_lot", @@ -3701,17 +3795,19 @@ dependencies = [ [[package]] name = "polars-expr" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343931b818cf136349135ba11dbc18c27683b52c3477b1ba8ca606cf5ab1965c" +checksum = "2151f54b0ae5d6b86c3c47df0898ff90edfe774807823f742f36e44973d51ea1" dependencies = [ - "bitflags 2.10.0", - "hashbrown 0.15.5", + "bitflags", + "hashbrown 0.16.1", "num-traits", "polars-arrow", + "polars-buffer", "polars-compute", "polars-core", "polars-io", + "polars-json", "polars-ops", "polars-plan", "polars-row", @@ -3720,13 +3816,15 @@ dependencies = [ "rand 0.9.2", "rayon", "recursive", + "regex", + "version_check", ] [[package]] name = "polars-io" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10388c64b8155122488229a881d1c6f4fdc393bc988e764ab51b182fcb2307e4" +checksum = "059724d7762d7332cbc225e6504d996091b28fa1337716e06e5a81d9e54a34ad" dependencies = [ "async-trait", "atoi_simd", @@ -3737,7 +3835,7 @@ dependencies = [ "fs4", "futures", "glob", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "home", "itoa", "memchr", @@ -3746,6 +3844,8 @@ dependencies = [ "object_store", "percent-encoding", "polars-arrow", + "polars-buffer", + "polars-compute", "polars-core", "polars-error", "polars-json", @@ -3756,25 +3856,23 @@ dependencies = [ "rayon", "regex", "reqwest", - "ryu", "serde", "serde_json", "simd-json", "simdutf8", "tokio", - "tokio-util", - "url", + "zmij", ] [[package]] name = "polars-json" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26d1a04292a82183c8eba94fdf1584f200bfac5ac2f4a6c5652c8c8ed3bb41c" +checksum = "55581d4cc8f4122cae92d12aec997e6713ac483871391a7db09501604007be4b" dependencies = [ "chrono", "fallible-streaming-iterator", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "indexmap 2.13.0", "itoa", "num-traits", @@ -3782,22 +3880,23 @@ dependencies = [ "polars-compute", "polars-error", "polars-utils", - "ryu", "simd-json", "streaming-iterator", + "zmij", ] [[package]] name = "polars-lazy" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fb6e2c6c2fa4ea0c660df1c06cf56960c81e7c2683877995bae3d4e3d408147" +checksum = "02e1e24d4db8c349e9576564cfff47a3f08bb831dba9168f6599be178bc725e8" dependencies = [ - "bitflags 2.10.0", + "bitflags", "chrono", "either", "memchr", "polars-arrow", + "polars-buffer", "polars-compute", "polars-core", "polars-expr", @@ -3815,11 +3914,10 @@ dependencies = [ [[package]] name = "polars-mem-engine" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a856e98e253587c28d8132a5e7e5a75cb2c44731ca090f1481d45f1d123771" +checksum = "c394e4cd90186043d4051ce118e90794afbe81ac5eb9a51e358a56728e8ebde3" dependencies = [ - "futures", "memmap2", "polars-arrow", "polars-core", @@ -3833,14 +3931,13 @@ dependencies = [ "polars-utils", "rayon", "recursive", - "tokio", ] [[package]] name = "polars-ops" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf6062173fdc9ba05775548beb66e76643a148d9aeadc9984ed712bc4babd76" +checksum = "7e47b2d9b3627662650da0a8c76ce5101ed1c61b104cb2b3663e0dc711571b12" dependencies = [ "argminmax", "base64 0.22.1", @@ -3848,7 +3945,7 @@ dependencies = [ "chrono", "chrono-tz", "either", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "hex", "indexmap 2.13.0", "jsonpath_lib_polars_vendor", @@ -3856,6 +3953,7 @@ dependencies = [ "memchr", "num-traits", "polars-arrow", + "polars-buffer", "polars-compute", "polars-core", "polars-error", @@ -3874,9 +3972,9 @@ dependencies = [ [[package]] name = "polars-parquet" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1d769180dec070df0dc4b89299b364bf2cfe32b218ecc4ddd8f1a49ae60669" +checksum = "436bae3e89438cafe69400e7567057d7d9820d21ac9a4f69a33b413f2666f03d" dependencies = [ "async-stream", "base64 0.22.1", @@ -3885,14 +3983,16 @@ dependencies = [ "ethnum", "flate2", "futures", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "lz4", "num-traits", "polars-arrow", + "polars-buffer", "polars-compute", "polars-error", "polars-parquet-format", "polars-utils", + "regex", "serde", "simdutf8", "snap", @@ -3912,22 +4012,24 @@ dependencies = [ [[package]] name = "polars-plan" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd3a2e33ae4484fe407ab2d2ba5684f0889d1ccf3ad6b844103c03638e6d0a0" +checksum = "f7930d5ae1d006179e65f01af57c859307b5875a4cc078dc75257250b9ae5162" dependencies = [ - "bitflags 2.10.0", + "bitflags", + "blake3", "bytemuck", "bytes", "chrono", "chrono-tz", "either", "futures", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "memmap2", "num-traits", "percent-encoding", "polars-arrow", + "polars-buffer", "polars-compute", "polars-core", "polars-error", @@ -3941,19 +4043,22 @@ dependencies = [ "recursive", "regex", "sha2", + "slotmap", "strum_macros 0.27.2", + "tokio", "version_check", ] [[package]] name = "polars-row" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18734f17e0e348724df3ae65f3ee744c681117c04b041cac969dfceb05edabc0" +checksum = "d29ea1a4554fe06442db1d6229235cd358e8eacba96aed8718f612caf3e3a646" dependencies = [ - "bitflags 2.10.0", + "bitflags", "bytemuck", "polars-arrow", + "polars-buffer", "polars-compute", "polars-dtype", "polars-error", @@ -3962,9 +4067,9 @@ dependencies = [ [[package]] name = "polars-schema" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6c1ab13e04d5167661a9854ed1ea0482b2ed9b8a0f1118dabed7cd994a85e3" +checksum = "d688e73f9156f93cb29350be144c8f1e84c1bc705f00ee7f15eb9706a7971273" dependencies = [ "indexmap 2.13.0", "polars-error", @@ -3975,11 +4080,11 @@ dependencies = [ [[package]] name = "polars-sql" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e7766da02cc1d464994404d3e88a7a0ccd4933df3627c325480fbd9bbc0a11" +checksum = "100415f86069d7e9fbf54737148fc161a7c7316a6a7d375fb6cfc7fc64f570ae" dependencies = [ - "bitflags 2.10.0", + "bitflags", "hex", "polars-core", "polars-error", @@ -3988,7 +4093,6 @@ dependencies = [ "polars-plan", "polars-time", "polars-utils", - "rand 0.9.2", "regex", "serde", "sqlparser", @@ -3996,47 +4100,54 @@ dependencies = [ [[package]] name = "polars-stream" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f6c6ca1ea01f9dea424d167e4f33f5ec44cd67fbfac9efd40575ed20521f14" +checksum = "65a0c054bdf16efd16bbc587e8d5418ae28464d61afd735513579cd3c338fa70" dependencies = [ "async-channel", "async-trait", "atomic-waker", - "bitflags 2.10.0", + "bitflags", + "bytes", + "chrono-tz", "crossbeam-channel", "crossbeam-deque", "crossbeam-queue", "crossbeam-utils", "futures", + "memchr", "memmap2", + "num-traits", "parking_lot", "percent-encoding", "pin-project-lite", "polars-arrow", + "polars-buffer", + "polars-compute", "polars-core", "polars-error", "polars-expr", "polars-io", + "polars-json", "polars-mem-engine", "polars-ops", "polars-parquet", "polars-plan", + "polars-time", "polars-utils", "rand 0.9.2", "rayon", "recursive", "slotmap", "tokio", - "tokio-util", "version_check", ] [[package]] name = "polars-time" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a3a6e279a7a984a0b83715660f9e880590c6129ec2104396bfa710bcd76dee" +checksum = "72e80404e1e418c997230e3b2972c3be331f45df8bdd3150fe3bef562c7a332f" dependencies = [ "atoi_simd", "bytemuck", @@ -4057,21 +4168,24 @@ dependencies = [ [[package]] name = "polars-utils" -version = "0.51.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b267021b0e5422d7fbc70fd79e51b9f9a8466c585779373a18b0199e973f29" +checksum = "c97cabf53eb8fbf6050cde3fef8f596c51cc25fd7d55fbde108d815ee6674abf" dependencies = [ + "argminmax", "bincode", "bytemuck", "bytes", "compact_str", "either", "flate2", - "foldhash 0.1.5", - "hashbrown 0.15.5", + "foldhash 0.2.0", + "half", + "hashbrown 0.16.1", "indexmap 2.13.0", "libc", "memmap2", + "num-derive", "num-traits", "polars-error", "rand 0.9.2", @@ -4088,6 +4202,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + [[package]] name = "potential_utf" version = "0.1.4" @@ -4119,7 +4239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -4150,7 +4270,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -4162,6 +4282,38 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "prost-types" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +dependencies = [ + "prost", +] + [[package]] name = "psm" version = "0.1.30" @@ -4364,7 +4516,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[package]] @@ -4404,16 +4556,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" dependencies = [ "quote", - "syn 2.0.114", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", + "syn 2.0.116", ] [[package]] @@ -4422,7 +4565,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[package]] @@ -4431,7 +4574,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[package]] @@ -4451,7 +4594,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -4663,7 +4806,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4676,7 +4819,7 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.10.0", + "bitflags", "errno", "libc", "linux-raw-sys 0.11.0", @@ -4717,10 +4860,10 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ - "openssl-probe 0.2.1", + "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", + "security-framework", ] [[package]] @@ -4880,24 +5023,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" dependencies = [ - "bitflags 2.10.0", + "bitflags", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -4906,9 +5036,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" dependencies = [ "core-foundation-sys", "libc", @@ -4937,7 +5067,7 @@ dependencies = [ "sentry-panic", "sentry-tracing", "tokio", - "ureq", + "ureq 2.12.1", "webpki-roots 0.26.11", ] @@ -5071,7 +5201,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5107,7 +5237,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5161,7 +5291,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5187,7 +5317,7 @@ checksum = "6f50427f258fb77356e4cd4aa0e87e2bd2c66dbcee41dc405282cae2bfc26c83" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5229,9 +5359,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.18" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +checksum = "3b57709da74f9ff9f4a27dce9526eec25ca8407c45a7887243b031a58935fb8e" dependencies = [ "libc", "signal-hook-registry", @@ -5265,12 +5395,11 @@ checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simd-json" -version = "0.15.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c962f626b54771990066e5435ec8331d1462576cd2d1e62f24076ae014f92112" +checksum = "4255126f310d2ba20048db6321c81ab376f6a6735608bf11f0785c41f01f64e3" dependencies = [ "ahash 0.8.12", - "getrandom 0.3.4", "halfbrown", "once_cell", "ref-cast", @@ -5298,16 +5427,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" -[[package]] -name = "skiplist" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354fd282d3177c2951004953e2fdc4cb342fa159bbee8b829852b6a081c8ea1" -dependencies = [ - "rand 0.9.2", - "thiserror 2.0.18", -] - [[package]] name = "slab" version = "0.4.12" @@ -5373,11 +5492,24 @@ dependencies = [ [[package]] name = "sqlparser" -version = "0.53.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a528114c392209b3264855ad491fcce534b94a38771b0a0b97a79379275ce8" +checksum = "505aa16b045c4c1375bf5f125cce3813d0176325bfe9ffc4a903f423de7774ff" dependencies = [ "log", + "recursive", + "sqlparser_derive", +] + +[[package]] +name = "sqlparser_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028e551d5e270b31b9f3ea271778d9d827148d4287a5d96167b6bb9787f5cc38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", ] [[package]] @@ -5441,7 +5573,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5452,7 +5584,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5480,7 +5612,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5492,7 +5624,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5514,9 +5646,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" dependencies = [ "proc-macro2", "quote", @@ -5540,7 +5672,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5549,7 +5681,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.10.0", + "bitflags", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -5596,18 +5728,20 @@ dependencies = [ [[package]] name = "testcontainers" -version = "0.23.3" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a4f01f39bb10fc2a5ab23eb0d888b1e2bb168c157f61a1b98e6c501c639c74" +checksum = "a81ec0158db5fbb9831e09d1813fe5ea9023a2b5e6e8e0a5fe67e2a820733629" dependencies = [ + "astral-tokio-tar", "async-trait", "bollard", - "bollard-stubs", "bytes", "docker_credential", "either", "etcetera", + "ferroid", "futures", + "itertools", "log", "memchr", "parse-display", @@ -5618,16 +5752,15 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-stream", - "tokio-tar", "tokio-util", "url", ] [[package]] name = "testcontainers-modules" -version = "0.11.6" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43ed4e8f58424c3a2c6c56dbea6643c3c23e8666a34df13c54f0a184e6c707" +checksum = "5e75e78ff453128a2c7da9a5d5a3325ea34ea214d4bf51eab3417de23a4e5147" dependencies = [ "testcontainers", ] @@ -5658,7 +5791,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5669,7 +5802,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5771,7 +5904,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -5815,21 +5948,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-tar" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" -dependencies = [ - "filetime", - "futures-core", - "libc", - "redox_syscall 0.3.5", - "tokio", - "tokio-stream", - "xattr", -] - [[package]] name = "tokio-test" version = "0.4.5" @@ -5850,7 +5968,6 @@ dependencies = [ "bytes", "futures-core", "futures-sink", - "futures-util", "pin-project-lite", "tokio", ] @@ -5878,13 +5995,53 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.7+spec-1.1.0" +version = "1.0.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1" +checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc" dependencies = [ "winnow", ] +[[package]] +name = "tonic" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f32a6f80051a4111560201420c7885d0082ba9efe2ab61875c587bb6b18b9a0" +dependencies = [ + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "socket2 0.6.2", + "sync_wrapper", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f86539c0089bfd09b1f8c0ab0239d80392af74c21bc9e0f15e1b4aca4c1647f" +dependencies = [ + "bytes", + "prost", + "tonic", +] + [[package]] name = "tower" version = "0.5.3" @@ -5893,9 +6050,12 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", + "indexmap 2.13.0", "pin-project-lite", + "slab", "sync_wrapper", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -5907,7 +6067,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.10.0", + "bitflags", "bytes", "futures-util", "http 1.4.0", @@ -5952,7 +6112,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -6017,9 +6177,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" @@ -6085,6 +6245,33 @@ dependencies = [ "webpki-roots 0.26.11", ] +[[package]] +name = "ureq" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc" +dependencies = [ + "base64 0.22.1", + "log", + "percent-encoding", + "rustls 0.23.36", + "rustls-pki-types", + "ureq-proto", + "utf-8", +] + +[[package]] +name = "ureq-proto" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.8" @@ -6104,6 +6291,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -6112,11 +6305,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.1", "js-sys", "serde_core", "wasm-bindgen", @@ -6149,7 +6342,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -6160,9 +6353,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-trait" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0508fce11ad19e0aab49ce20b6bec7f8f82902ded31df1c9fc61b90f0eb396b8" +checksum = "8e80f0c733af0720a501b3905d22e2f97662d8eacfe082a75ed7ffb5ab08cb59" dependencies = [ "float-cmp", "halfbrown", @@ -6283,7 +6476,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "wasm-bindgen-shared", ] @@ -6337,7 +6530,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.10.0", + "bitflags", "hashbrown 0.15.5", "indexmap 2.13.0", "semver", @@ -6420,7 +6613,7 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.2.1", "windows-result", "windows-strings", ] @@ -6433,7 +6626,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -6444,9 +6637,15 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" @@ -6459,7 +6658,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link", + "windows-link 0.2.1", "windows-result", "windows-strings", ] @@ -6470,7 +6669,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -6479,16 +6678,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-link 0.2.1", ] [[package]] @@ -6524,22 +6714,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-link 0.2.1", ] [[package]] @@ -6564,7 +6739,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -6575,12 +6750,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -6593,12 +6762,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -6611,12 +6774,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -6641,12 +6798,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -6659,12 +6810,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -6677,12 +6822,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -6695,12 +6834,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -6752,7 +6885,7 @@ dependencies = [ "heck", "indexmap 2.13.0", "prettyplease", - "syn 2.0.114", + "syn 2.0.116", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -6768,7 +6901,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -6780,7 +6913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.10.0", + "bitflags", "indexmap 2.13.0", "log", "serde", @@ -6866,7 +6999,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "synstructure", ] @@ -6887,7 +7020,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -6907,7 +7040,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "synstructure", ] @@ -6947,7 +7080,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -6972,9 +7105,9 @@ checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" [[package]] name = "zmij" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zopfli" diff --git a/applications/datamanager/Cargo.toml b/applications/datamanager/Cargo.toml index 30c980c8..89a9a9dd 100644 --- a/applications/datamanager/Cargo.toml +++ b/applications/datamanager/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" [dependencies] axum = "0.8.4" chrono = { version = "0.4.41", features = ["serde"] } -polars = { version = "0.51.0", features = [ +polars = { version = "0.53.0", features = [ "json", "lazy", "parquet", @@ -48,5 +48,5 @@ http-body-util = "0.1" reqwest = { version = "0.12", features = ["json"] } mockito = "1.7" serial_test = "3.3" -testcontainers = "0.23" -testcontainers-modules = { version = "0.11", features = ["localstack"] } +testcontainers = "0.26" +testcontainers-modules = { version = "0.14", features = ["localstack"] } diff --git a/applications/equitypricemodel/src/equitypricemodel/tide_data.py b/applications/equitypricemodel/src/equitypricemodel/tide_data.py index 1432754f..c5545d24 100644 --- a/applications/equitypricemodel/src/equitypricemodel/tide_data.py +++ b/applications/equitypricemodel/src/equitypricemodel/tide_data.py @@ -1,7 +1,7 @@ import json import os from datetime import date, datetime, timedelta -from typing import cast +from typing import Literal, cast import numpy as np import pandera.polars as pa @@ -11,6 +11,8 @@ logger = structlog.get_logger() +DataType = Literal["train", "validate", "predict"] + class Scaler: def __init__(self) -> None: @@ -325,40 +327,25 @@ def get_dimensions(self) -> dict[str, int]: "static_continuous_features": 0, # not using static_continuous_features for now # noqa: E501 } - def get_batches( # noqa: C901 - self, - data_type: str = "train", # "train", "validate", or "predict" - validation_split: float = 0.8, - input_length: int = 35, - output_length: int = 7, - batch_size: int = 32, - ) -> list[dict[str, Tensor]]: - if data_type not in {"train", "validate", "predict"}: - message = f"Invalid data type: {data_type}. Must be 'train', 'validate', or 'predict'." # noqa: E501 - raise ValueError(message) - + def _select_batch_data( + self, data_type: DataType, validation_split: float, sequence_length: int + ) -> pl.DataFrame: + """Select the appropriate batch data based on data type.""" if data_type == "train": - self.batch_data, _ = self._get_training_and_validation_data( - validation_split - ) - + batch_data, _ = self._get_training_and_validation_data(validation_split) elif data_type == "validate": - _, self.batch_data = self._get_training_and_validation_data( - validation_split - ) - - elif data_type == "predict": - self.batch_data = self._get_prediction_data(input_length + output_length) - - minimum_date: date = self.batch_data.select( - self.batch_data["date"].min() - ).item() - maximum_date: date = self.batch_data.select( - self.batch_data["date"].max() - ).item() - + _, batch_data = self._get_training_and_validation_data(validation_split) + else: # predict + batch_data = self._get_prediction_data(sequence_length) + return batch_data + + def _validate_date_range( + self, batch_data: pl.DataFrame, required_days: int + ) -> None: + """Validate that the data has enough days for the required sequence length.""" + minimum_date: date = batch_data.select(batch_data["date"].min()).item() + maximum_date: date = batch_data.select(batch_data["date"].max()).item() total_days = (maximum_date - minimum_date).days + 1 - required_days = input_length + output_length if total_days < required_days: message = ( @@ -366,15 +353,75 @@ def get_batches( # noqa: C901 ) raise ValueError(message) - # collect all samples first - samples = [] + def _collect_samples_from_ticker( + self, + ticker_df: pl.DataFrame, + input_length: int, + output_length: int, + data_type: DataType, + ) -> list[dict]: + """Collect samples from a single ticker's data.""" has_targets = data_type in {"train", "validate"} + categorical_array = ( + ticker_df[self.categorical_columns].to_numpy().astype(np.int32) + ) + continuous_array = ( + ticker_df[self.continuous_columns].to_numpy().astype(np.float32) + ) + static_array = ( + ticker_df[self.static_categorical_columns] + .head(1) + .to_numpy() + .astype(np.int32) + ) + target_array = ( + ticker_df[["daily_return"]].to_numpy().astype(np.float32) + if has_targets + else None + ) - # Partition by ticker once upfront (much faster than filtering per ticker) - logger.info("partitioning_data_by_ticker") - ticker_groups = self.batch_data.sort("time_idx").partition_by( - "ticker", as_dict=True + num_rows = len(ticker_df) + num_windows = num_rows - input_length - output_length + 1 + + if num_windows <= 0: + return [] + + window_indices = ( + [num_windows - 1] if data_type == "predict" else range(num_windows) ) + + samples = [] + for i in window_indices: + sample = { + "encoder_categorical": categorical_array[i : i + input_length].copy(), + "encoder_continuous": continuous_array[i : i + input_length].copy(), + "decoder_categorical": categorical_array[ + i + input_length : i + input_length + output_length + ].copy(), + "static_categorical": static_array.copy(), + } + + if has_targets and target_array is not None: + sample["targets"] = target_array[ + i + input_length : i + input_length + output_length + ].copy() + + samples.append(sample) + + return samples + + def _collect_all_samples( + self, + batch_data: pl.DataFrame, + input_length: int, + output_length: int, + data_type: DataType, + ) -> list[dict]: + """Collect samples from all tickers.""" + samples = [] + + logger.info("partitioning_data_by_ticker") + ticker_groups = batch_data.sort("time_idx").partition_by("ticker", as_dict=True) total_tickers = len(ticker_groups) logger.info("batch_creation_started", total_tickers=total_tickers) @@ -384,59 +431,21 @@ def get_batches( # noqa: C901 "batch_progress", ticker_idx=idx, total_tickers=total_tickers ) - # Convert to numpy once per ticker (avoid repeated DataFrame operations) - # Use float32 for GPU compatibility (Metal doesn't support float64) - cat_array = ticker_df[self.categorical_columns].to_numpy().astype(np.int32) - cont_array = ( - ticker_df[self.continuous_columns].to_numpy().astype(np.float32) - ) - static_array = ( - ticker_df[self.static_categorical_columns] - .head(1) - .to_numpy() - .astype(np.int32) + ticker_samples = self._collect_samples_from_ticker( + ticker_df, input_length, output_length, data_type ) - target_array = ( - ticker_df[["daily_return"]].to_numpy().astype(np.float32) - if has_targets - else None - ) - - num_rows = len(ticker_df) - num_windows = num_rows - input_length - output_length + 1 - - if num_windows <= 0: - continue - - # For prediction, only use the last window (most recent data) - # For training/validation, use all windows - window_indices = ( - [num_windows - 1] if data_type == "predict" else range(num_windows) - ) - - # Use numpy slicing (much faster than DataFrame slicing) - for i in window_indices: - sample = { - "encoder_categorical": cat_array[i : i + input_length].copy(), - "encoder_continuous": cont_array[i : i + input_length].copy(), - "decoder_categorical": cat_array[ - i + input_length : i + input_length + output_length - ].copy(), - "static_categorical": static_array.copy(), - } - - if has_targets and target_array is not None: - sample["targets"] = target_array[ - i + input_length : i + input_length + output_length - ].copy() - - samples.append(sample) + samples.extend(ticker_samples) logger.info("sample_collection_complete", total_samples=len(samples)) + return samples - # now batch the samples + def _create_batches( + self, samples: list[dict], batch_size: int, data_type: DataType + ) -> list[dict[str, Tensor]]: + """Create batches from collected samples.""" logger.info("batching_samples", batch_size=batch_size) batches = [] + for i in range(0, len(samples), batch_size): batch_samples = samples[i : i + batch_size] @@ -465,6 +474,33 @@ def get_batches( # noqa: C901 logger.info("batch_creation_complete", total_batches=len(batches)) return batches + def get_batches( + self, + data_type: DataType = "train", + validation_split: float = 0.8, + input_length: int = 35, + output_length: int = 7, + batch_size: int = 32, + ) -> list[dict[str, Tensor]]: + if data_type not in {"train", "validate", "predict"}: + message = ( + f"Invalid data type: {data_type}. " + "Must be 'train', 'validate', or 'predict'." + ) + raise ValueError(message) + + self.batch_data = self._select_batch_data( + data_type, validation_split, input_length + output_length + ) + + self._validate_date_range(self.batch_data, input_length + output_length) + + samples = self._collect_all_samples( + self.batch_data, input_length, output_length, data_type + ) + + return self._create_batches(samples, batch_size, data_type) + def save(self, directory_path: str) -> None: os.makedirs(directory_path, exist_ok=True) # noqa: PTH103 diff --git a/applications/portfoliomanager/src/portfoliomanager/exceptions.py b/applications/portfoliomanager/src/portfoliomanager/exceptions.py index fa3068e6..2eec2406 100644 --- a/applications/portfoliomanager/src/portfoliomanager/exceptions.py +++ b/applications/portfoliomanager/src/portfoliomanager/exceptions.py @@ -8,3 +8,7 @@ class InsufficientBuyingPowerError(Exception): class AssetNotShortableError(Exception): """Raised when attempting to short an asset that cannot be shorted.""" + + +class PortfolioDataError(Exception): + """Raised when portfolio data preparation fails.""" diff --git a/applications/portfoliomanager/src/portfoliomanager/server.py b/applications/portfoliomanager/src/portfoliomanager/server.py index 9ac378fd..42dca025 100644 --- a/applications/portfoliomanager/src/portfoliomanager/server.py +++ b/applications/portfoliomanager/src/portfoliomanager/server.py @@ -10,7 +10,7 @@ from fastapi import FastAPI, Response, status from sentry_sdk.integrations.logging import LoggingIntegration -from .alpaca_client import AlpacaClient +from .alpaca_client import AlpacaAccount, AlpacaClient sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), @@ -44,6 +44,7 @@ AssetNotShortableError, InsufficientBuyingPowerError, InsufficientPredictionsError, + PortfolioDataError, ) from .portfolio_schema import portfolio_schema # noqa: E402 from .risk_management import ( # noqa: E402 @@ -92,11 +93,220 @@ def health_check() -> Response: return Response(status_code=status.HTTP_200_OK) -@application.post("/portfolio") -async def create_portfolio() -> Response: # noqa: PLR0911, PLR0912, PLR0915, C901 - current_timestamp = datetime.now(tz=UTC) - logger.info("Starting portfolio rebalance", timestamp=current_timestamp.isoformat()) +def _close_single_position(close_position: dict) -> dict: + """Close a single position and return the result.""" + try: + was_closed = alpaca_client.close_position( + ticker=close_position["ticker"], + ) + if was_closed: + logger.info("Closed position", ticker=close_position["ticker"]) + return { + "ticker": close_position["ticker"], + "action": "close", + "status": "success", + } + logger.info( + "Position already closed or did not exist", + ticker=close_position["ticker"], + ) + return { + "ticker": close_position["ticker"], + "action": "close", + "status": "skipped", + "reason": "position_not_found", + } + except Exception as e: + logger.exception( + "Failed to close position", + ticker=close_position["ticker"], + error=str(e), + ) + return { + "ticker": close_position["ticker"], + "action": "close", + "status": "failed", + "error": str(e), + } + + +def _close_all_positions(close_positions: list[dict]) -> list[dict]: + """Close all positions and return results.""" + return [_close_single_position(position) for position in close_positions] + + +def _open_single_position( + open_position: dict, remaining_buying_power: float +) -> tuple[dict, float, str | None]: + """ + Open a single position and return the result, updated buying power, and skip reason. + + Returns: + tuple: (result_dict, new_buying_power, skip_reason) + skip_reason is "insufficient_buying_power", "not_shortable", or None + """ + ticker = open_position["ticker"] + side = open_position["side"] + dollar_amount = open_position["dollar_amount"] + + if dollar_amount > remaining_buying_power: + logger.warning( + "Skipping position due to insufficient buying power", + ticker=ticker, + side=side, + dollar_amount=dollar_amount, + remaining_buying_power=remaining_buying_power, + ) + return ( + { + "ticker": ticker, + "action": "open", + "side": side, + "dollar_amount": dollar_amount, + "status": "skipped", + "reason": "insufficient_buying_power", + }, + remaining_buying_power, + "insufficient_buying_power", + ) + + try: + alpaca_client.open_position( + ticker=ticker, + side=side, + dollar_amount=dollar_amount, + ) + logger.info( + "Opened position", + ticker=ticker, + side=side, + dollar_amount=dollar_amount, + ) + try: + account = alpaca_client.get_account() + remaining_buying_power = account.buying_power + except Exception: + logger.exception( + "Failed to refresh buying power from account, using estimate", + ticker=ticker, + deducting=dollar_amount, + ) + remaining_buying_power -= dollar_amount + + return ( # noqa: TRY300 + { + "ticker": ticker, + "action": "open", + "side": side, + "dollar_amount": dollar_amount, + "status": "success", + }, + remaining_buying_power, + None, + ) + except InsufficientBuyingPowerError as e: + logger.warning( + "Insufficient buying power for position", + ticker=ticker, + side=side, + dollar_amount=dollar_amount, + error=str(e), + ) + return ( + { + "ticker": ticker, + "action": "open", + "side": side, + "dollar_amount": dollar_amount, + "status": "skipped", + "reason": "insufficient_buying_power", + }, + remaining_buying_power, + "insufficient_buying_power", + ) + except AssetNotShortableError as e: + logger.warning( + "Asset cannot be sold short", + ticker=ticker, + side=side, + error=str(e), + ) + return ( + { + "ticker": ticker, + "action": "open", + "side": side, + "dollar_amount": dollar_amount, + "status": "skipped", + "reason": "not_shortable", + }, + remaining_buying_power, + "not_shortable", + ) + except Exception as e: + logger.exception( + "Failed to open position", + ticker=ticker, + error=str(e), + ) + return ( + { + "ticker": ticker, + "action": "open", + "side": side, + "dollar_amount": dollar_amount, + "status": "failed", + "error": str(e), + }, + remaining_buying_power, + None, + ) + + +def _open_all_positions( + open_positions: list[dict], initial_buying_power: float +) -> tuple[list[dict], int, int]: + """ + Open all positions and return results with skip counts. + + Returns: + tuple: (results, skipped_insufficient_buying_power, skipped_not_shortable) + """ + open_results = [] + remaining_buying_power = initial_buying_power + skipped_insufficient_buying_power = 0 + skipped_not_shortable = 0 + + for open_position in open_positions: + result, remaining_buying_power, skip_reason = _open_single_position( + open_position, remaining_buying_power + ) + open_results.append(result) + + if skip_reason == "insufficient_buying_power": + skipped_insufficient_buying_power += 1 + elif skip_reason == "not_shortable": + skipped_not_shortable += 1 + + if skipped_insufficient_buying_power > 0 or skipped_not_shortable > 0: + logger.info( + "Some positions were skipped", + skipped_insufficient_buying_power=skipped_insufficient_buying_power, + skipped_not_shortable=skipped_not_shortable, + ) + + return open_results, skipped_insufficient_buying_power, skipped_not_shortable + +async def _prepare_portfolio_data( + current_timestamp: datetime, +) -> tuple[AlpacaAccount, pl.DataFrame, list[str], pl.DataFrame]: + """ + Prepare all data needed for portfolio rebalancing. + + Returns a tuple of (account, predictions, tickers, portfolio). + Raises PortfolioDataError if preparation fails. + """ try: account = alpaca_client.get_account() logger.info( @@ -106,14 +316,16 @@ async def create_portfolio() -> Response: # noqa: PLR0911, PLR0912, PLR0915, C9 ) except Exception as e: logger.exception("Failed to retrieve account", error=str(e)) - return Response(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) + message = "Failed to retrieve account" + raise PortfolioDataError(message) from e try: current_predictions = await get_current_predictions() logger.info("Retrieved predictions", count=len(current_predictions)) except Exception as e: logger.exception("Failed to retrieve predictions", error=str(e)) - return Response(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) + message = "Failed to retrieve predictions" + raise PortfolioDataError(message) from e try: prior_portfolio_tickers = get_prior_portfolio_tickers() @@ -122,7 +334,8 @@ async def create_portfolio() -> Response: # noqa: PLR0911, PLR0912, PLR0915, C9 ) except Exception as e: logger.exception("Failed to retrieve prior portfolio tickers", error=str(e)) - return Response(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) + message = "Failed to retrieve prior portfolio tickers" + raise PortfolioDataError(message) from e try: optimal_portfolio = get_optimal_portfolio( @@ -140,12 +353,33 @@ async def create_portfolio() -> Response: # noqa: PLR0911, PLR0912, PLR0915, C9 predictions_count=len(current_predictions), prior_portfolio_tickers_count=len(prior_portfolio_tickers), ) + raise + except Exception as e: + logger.exception("Failed to create optimal portfolio", error=str(e)) + message = "Failed to create optimal portfolio" + raise PortfolioDataError(message) from e + + return account, current_predictions, prior_portfolio_tickers, optimal_portfolio + + +@application.post("/portfolio") +async def create_portfolio() -> Response: + current_timestamp = datetime.now(tz=UTC) + logger.info("Starting portfolio rebalance", timestamp=current_timestamp.isoformat()) + + try: + ( + account, + _, + prior_portfolio_tickers, + optimal_portfolio, + ) = await _prepare_portfolio_data(current_timestamp) + except InsufficientPredictionsError: return Response( status_code=status.HTTP_204_NO_CONTENT, headers={"X-Portfolio-Status": "insufficient-predictions"}, ) - except Exception as e: - logger.exception("Failed to create optimal portfolio", error=str(e)) + except PortfolioDataError: return Response(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) try: @@ -165,172 +399,17 @@ async def create_portfolio() -> Response: # noqa: PLR0911, PLR0912, PLR0915, C9 ) return Response(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) - close_results = [] - for close_position in close_positions: - try: - was_closed = alpaca_client.close_position( - ticker=close_position["ticker"], - ) - if was_closed: - logger.info("Closed position", ticker=close_position["ticker"]) - close_results.append( - { - "ticker": close_position["ticker"], - "action": "close", - "status": "success", - } - ) - else: - logger.info( - "Position already closed or did not exist", - ticker=close_position["ticker"], - ) - close_results.append( - { - "ticker": close_position["ticker"], - "action": "close", - "status": "skipped", - "reason": "position_not_found", - } - ) - except Exception as e: - logger.exception( - "Failed to close position", - ticker=close_position["ticker"], - error=str(e), - ) - close_results.append( - { - "ticker": close_position["ticker"], - "action": "close", - "status": "failed", - "error": str(e), - } - ) - - open_results = [] - remaining_buying_power = account.buying_power - skipped_insufficient_buying_power = 0 - skipped_not_shortable = 0 - - for open_position in open_positions: - ticker = open_position["ticker"] - side = open_position["side"] - dollar_amount = open_position["dollar_amount"] - - if dollar_amount > remaining_buying_power: - logger.warning( - "Skipping position due to insufficient buying power", - ticker=ticker, - side=side, - dollar_amount=dollar_amount, - remaining_buying_power=remaining_buying_power, - ) - skipped_insufficient_buying_power += 1 - open_results.append( - { - "ticker": ticker, - "action": "open", - "side": side, - "dollar_amount": dollar_amount, - "status": "skipped", - "reason": "insufficient_buying_power", - } - ) - continue - - try: - alpaca_client.open_position( - ticker=ticker, - side=side, - dollar_amount=dollar_amount, - ) - logger.info( - "Opened position", - ticker=ticker, - side=side, - dollar_amount=dollar_amount, - ) - # Refresh remaining buying power from the account after a successful order - try: - account = alpaca_client.get_account() - remaining_buying_power = account.buying_power - except Exception: - logger.exception( - "Failed to refresh buying power from account, using estimate", - ticker=ticker, - deducting=dollar_amount, - ) - remaining_buying_power -= dollar_amount - open_results.append( - { - "ticker": ticker, - "action": "open", - "side": side, - "dollar_amount": dollar_amount, - "status": "success", - } - ) - except InsufficientBuyingPowerError as e: - logger.warning( - "Insufficient buying power for position", - ticker=ticker, - side=side, - dollar_amount=dollar_amount, - error=str(e), - ) - skipped_insufficient_buying_power += 1 - open_results.append( - { - "ticker": ticker, - "action": "open", - "side": side, - "dollar_amount": dollar_amount, - "status": "skipped", - "reason": "insufficient_buying_power", - } - ) - except AssetNotShortableError as e: - logger.warning( - "Asset cannot be sold short", - ticker=ticker, - side=side, - error=str(e), - ) - skipped_not_shortable += 1 - open_results.append( - { - "ticker": ticker, - "action": "open", - "side": side, - "dollar_amount": dollar_amount, - "status": "skipped", - "reason": "not_shortable", - } - ) - except Exception as e: - logger.exception( - "Failed to open position", - ticker=ticker, - error=str(e), - ) - open_results.append( - { - "ticker": ticker, - "action": "open", - "side": side, - "dollar_amount": dollar_amount, - "status": "failed", - "error": str(e), - } - ) + close_results = _close_all_positions(close_positions) - if skipped_insufficient_buying_power > 0 or skipped_not_shortable > 0: - logger.info( - "Some positions were skipped", - skipped_insufficient_buying_power=skipped_insufficient_buying_power, - skipped_not_shortable=skipped_not_shortable, + try: + account = alpaca_client.get_account() + except Exception as e: + logger.exception( + "Failed to refresh account after closing positions", error=str(e) ) + return Response(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) + + open_results, _, _ = _open_all_positions(open_positions, account.buying_power) all_results = close_results + open_results failed_trades = [r for r in all_results if r["status"] == "failed"] diff --git a/infrastructure/Pulumi.production.yaml b/infrastructure/Pulumi.production.yaml index b63e995e..6bea456e 100644 --- a/infrastructure/Pulumi.production.yaml +++ b/infrastructure/Pulumi.production.yaml @@ -1,3 +1,5 @@ +# yamllint disable rule:line-length +--- config: aws:region: us-east-1 fund:budgetAlertEmailAddresses: diff --git a/infrastructure/Pulumi.yaml b/infrastructure/Pulumi.yaml index b25136ab..6fb69499 100644 --- a/infrastructure/Pulumi.yaml +++ b/infrastructure/Pulumi.yaml @@ -1,3 +1,4 @@ +--- name: fund runtime: name: python diff --git a/infrastructure/docker-compose.yaml b/infrastructure/docker-compose.yaml index a223b926..5f9c66ae 100644 --- a/infrastructure/docker-compose.yaml +++ b/infrastructure/docker-compose.yaml @@ -1,3 +1,4 @@ +--- version: "3.9" services: datamanager: diff --git a/maskfile.md b/maskfile.md index 9a708939..71680aba 100644 --- a/maskfile.md +++ b/maskfile.md @@ -568,6 +568,20 @@ uv run coverage run --parallel-mode -m pytest \ echo "Python tests completed successfully" ``` +#### complexity + +> Run Python code complexity analysis + +```bash +set -euo pipefail + +echo "Running Python complexity analysis" + +xenon --max-absolute C --max-modules C --max-average A . + +echo "Python complexity analysis completed successfully" +``` + #### all > Full Python development checks @@ -624,6 +638,38 @@ mask development markdown lint echo "Markdown development checks completed successfully" ``` +### yaml + +> YAML development workflow commands + +#### lint + +> Run YAML lint checks + +```bash +set -euo pipefail + +echo "Running YAML lint checks" + +yamllint . + +echo "YAML linting completed successfully" +``` + +#### all + +> Full YAML development checks + +```bash +set -euo pipefail + +echo "Running YAML development checks" + +mask development yaml lint + +echo "YAML development checks completed successfully" +``` + ## data > Data management commands diff --git a/pyproject.toml b/pyproject.toml index f3df451b..626cb6f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "fund" version = "20250602.4" -description = "Open source quantitative hedge fund 🍊" +description = "The open source capital management company" requires-python = "==3.12.10" dependencies = [ "internal", diff --git a/uv.lock b/uv.lock index a186b997..8b89d57a 100644 --- a/uv.lock +++ b/uv.lock @@ -421,41 +421,41 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.4" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/19/f748958276519adf6a0c1e79e7b8860b4830dda55ccdf29f2719b5fc499c/cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59", size = 749301, upload-time = "2026-01-28T00:24:37.379Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485", size = 7173686, upload-time = "2026-01-28T00:23:07.515Z" }, - { url = "https://files.pythonhosted.org/packages/87/91/874b8910903159043b5c6a123b7e79c4559ddd1896e38967567942635778/cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc", size = 4275871, upload-time = "2026-01-28T00:23:09.439Z" }, - { url = "https://files.pythonhosted.org/packages/c0/35/690e809be77896111f5b195ede56e4b4ed0435b428c2f2b6d35046fbb5e8/cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0", size = 4423124, upload-time = "2026-01-28T00:23:11.529Z" }, - { url = "https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa", size = 4277090, upload-time = "2026-01-28T00:23:13.123Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d8/4bb7aec442a9049827aa34cee1aa83803e528fa55da9a9d45d01d1bb933e/cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81", size = 4947652, upload-time = "2026-01-28T00:23:14.554Z" }, - { url = "https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255", size = 4455157, upload-time = "2026-01-28T00:23:16.443Z" }, - { url = "https://files.pythonhosted.org/packages/0a/05/19d849cf4096448779d2dcc9bb27d097457dac36f7273ffa875a93b5884c/cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e", size = 3981078, upload-time = "2026-01-28T00:23:17.838Z" }, - { url = "https://files.pythonhosted.org/packages/e6/89/f7bac81d66ba7cde867a743ea5b37537b32b5c633c473002b26a226f703f/cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c", size = 4276213, upload-time = "2026-01-28T00:23:19.257Z" }, - { url = "https://files.pythonhosted.org/packages/da/9f/7133e41f24edd827020ad21b068736e792bc68eecf66d93c924ad4719fb3/cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32", size = 4912190, upload-time = "2026-01-28T00:23:21.244Z" }, - { url = "https://files.pythonhosted.org/packages/a6/f7/6d43cbaddf6f65b24816e4af187d211f0bc536a29961f69faedc48501d8e/cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616", size = 4454641, upload-time = "2026-01-28T00:23:22.866Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4f/ebd0473ad656a0ac912a16bd07db0f5d85184924e14fc88feecae2492834/cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0", size = 4405159, upload-time = "2026-01-28T00:23:25.278Z" }, - { url = "https://files.pythonhosted.org/packages/d1/f7/7923886f32dc47e27adeff8246e976d77258fd2aa3efdd1754e4e323bf49/cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0", size = 4666059, upload-time = "2026-01-28T00:23:26.766Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a7/0fca0fd3591dffc297278a61813d7f661a14243dd60f499a7a5b48acb52a/cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5", size = 3026378, upload-time = "2026-01-28T00:23:28.317Z" }, - { url = "https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b", size = 3478614, upload-time = "2026-01-28T00:23:30.275Z" }, - { url = "https://files.pythonhosted.org/packages/56/f7/f648fdbb61d0d45902d3f374217451385edc7e7768d1b03ff1d0e5ffc17b/cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab", size = 7169583, upload-time = "2026-01-28T00:23:56.558Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cc/8f3224cbb2a928de7298d6ed4790f5ebc48114e02bdc9559196bfb12435d/cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef", size = 4275419, upload-time = "2026-01-28T00:23:58.364Z" }, - { url = "https://files.pythonhosted.org/packages/17/43/4a18faa7a872d00e4264855134ba82d23546c850a70ff209e04ee200e76f/cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d", size = 4419058, upload-time = "2026-01-28T00:23:59.867Z" }, - { url = "https://files.pythonhosted.org/packages/ee/64/6651969409821d791ba12346a124f55e1b76f66a819254ae840a965d4b9c/cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973", size = 4278151, upload-time = "2026-01-28T00:24:01.731Z" }, - { url = "https://files.pythonhosted.org/packages/20/0b/a7fce65ee08c3c02f7a8310cc090a732344066b990ac63a9dfd0a655d321/cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4", size = 4939441, upload-time = "2026-01-28T00:24:03.175Z" }, - { url = "https://files.pythonhosted.org/packages/db/a7/20c5701e2cd3e1dfd7a19d2290c522a5f435dd30957d431dcb531d0f1413/cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af", size = 4451617, upload-time = "2026-01-28T00:24:05.403Z" }, - { url = "https://files.pythonhosted.org/packages/00/dc/3e16030ea9aa47b63af6524c354933b4fb0e352257c792c4deeb0edae367/cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263", size = 3977774, upload-time = "2026-01-28T00:24:06.851Z" }, - { url = "https://files.pythonhosted.org/packages/42/c8/ad93f14118252717b465880368721c963975ac4b941b7ef88f3c56bf2897/cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095", size = 4277008, upload-time = "2026-01-28T00:24:08.926Z" }, - { url = "https://files.pythonhosted.org/packages/00/cf/89c99698151c00a4631fbfcfcf459d308213ac29e321b0ff44ceeeac82f1/cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b", size = 4903339, upload-time = "2026-01-28T00:24:12.009Z" }, - { url = "https://files.pythonhosted.org/packages/03/c3/c90a2cb358de4ac9309b26acf49b2a100957e1ff5cc1e98e6c4996576710/cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019", size = 4451216, upload-time = "2026-01-28T00:24:13.975Z" }, - { url = "https://files.pythonhosted.org/packages/96/2c/8d7f4171388a10208671e181ca43cdc0e596d8259ebacbbcfbd16de593da/cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4", size = 4404299, upload-time = "2026-01-28T00:24:16.169Z" }, - { url = "https://files.pythonhosted.org/packages/e9/23/cbb2036e450980f65c6e0a173b73a56ff3bccd8998965dea5cc9ddd424a5/cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b", size = 4664837, upload-time = "2026-01-28T00:24:17.629Z" }, - { url = "https://files.pythonhosted.org/packages/0a/21/f7433d18fe6d5845329cbdc597e30caf983229c7a245bcf54afecc555938/cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc", size = 3009779, upload-time = "2026-01-28T00:24:20.198Z" }, - { url = "https://files.pythonhosted.org/packages/3a/6a/bd2e7caa2facffedf172a45c1a02e551e6d7d4828658c9a245516a598d94/cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976", size = 3466633, upload-time = "2026-01-28T00:24:21.851Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, ] [[package]] @@ -1920,18 +1920,18 @@ wheels = [ [[package]] name = "pillow" -version = "12.1.0" +version = "12.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, - { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, ] [[package]] @@ -2070,16 +2070,16 @@ wheels = [ [[package]] name = "protobuf" -version = "5.29.5" +version = "5.29.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/29/d09e70352e4e88c9c7a198d5645d7277811448d76c23b00345670f7c8a38/protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84", size = 425226, upload-time = "2025-05-28T23:51:59.82Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/57/394a763c103e0edf87f0938dafcd918d53b4c011dfc5c8ae80f3b0452dbb/protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723", size = 425623, upload-time = "2026-02-04T22:54:40.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/11/6e40e9fc5bba02988a214c07cf324595789ca7820160bfd1f8be96e48539/protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079", size = 422963, upload-time = "2025-05-28T23:51:41.204Z" }, - { url = "https://files.pythonhosted.org/packages/81/7f/73cefb093e1a2a7c3ffd839e6f9fcafb7a427d300c7f8aef9c64405d8ac6/protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc", size = 434818, upload-time = "2025-05-28T23:51:44.297Z" }, - { url = "https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671", size = 418091, upload-time = "2025-05-28T23:51:45.907Z" }, - { url = "https://files.pythonhosted.org/packages/6c/04/98f6f8cf5b07ab1294c13f34b4e69b3722bb609c5b701d6c169828f9f8aa/protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015", size = 319824, upload-time = "2025-05-28T23:51:47.545Z" }, - { url = "https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61", size = 319942, upload-time = "2025-05-28T23:51:49.11Z" }, - { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823, upload-time = "2025-05-28T23:51:58.157Z" }, + { url = "https://files.pythonhosted.org/packages/d4/88/9ee58ff7863c479d6f8346686d4636dd4c415b0cbeed7a6a7d0617639c2a/protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1", size = 423357, upload-time = "2026-02-04T22:54:25.805Z" }, + { url = "https://files.pythonhosted.org/packages/1c/66/2dc736a4d576847134fb6d80bd995c569b13cdc7b815d669050bf0ce2d2c/protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda", size = 435175, upload-time = "2026-02-04T22:54:28.592Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/49b05966fd208ae3f44dcd33837b6243b4915c57561d730a43f881f24dea/protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269", size = 418619, upload-time = "2026-02-04T22:54:30.266Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d7/48cbf6b0c3c39761e47a99cb483405f0fde2be22cf00d71ef316ce52b458/protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6", size = 320284, upload-time = "2026-02-04T22:54:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dd/cadd6ec43069247d91f6345fa7a0d2858bef6af366dbd7ba8f05d2c77d3b/protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9", size = 320478, upload-time = "2026-02-04T22:54:32.909Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cb/e3065b447186cb70aa65acc70c86baf482d82bf75625bf5a2c4f6919c6a3/protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86", size = 173126, upload-time = "2026-02-04T22:54:39.462Z" }, ] [[package]] @@ -2100,7 +2100,7 @@ wheels = [ [[package]] name = "pulumi" -version = "3.218.0" +version = "3.220.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "debugpy" }, @@ -2112,7 +2112,7 @@ dependencies = [ { name = "semver" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/ed/54f724e2ed465c7caaa2e32552a8d3ac65f719c7e7d66097e79d7cbfb4b4/pulumi-3.218.0-py3-none-any.whl", hash = "sha256:eaf14bffed85995a2754760b1da36999ed43b1062edbab11541d90fc6743a86c", size = 388429, upload-time = "2026-01-29T16:07:27.411Z" }, + { url = "https://files.pythonhosted.org/packages/a0/21/80a96ebd2d3802031d49e897f0f659b74aba6aec107b10332041c3c858d6/pulumi-3.220.0-py3-none-any.whl", hash = "sha256:962bd3ffc3b3546bad085f3c49a7f096dc8dd6c8426e220d87a7746be1314e0f", size = 390326, upload-time = "2026-02-10T17:12:29.301Z" }, ] [[package]]