diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fdeb8f0..8fe7c69 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,8 +30,10 @@ jobs: profile: default toolchain: stable override: true - - name: build and lint with clippy - run: cargo clippy + - name: Build and lint for S3 + run: cargo clippy --features s3 + - name: Build and lint for Azure + run: cargo clippy --features azure test: runs-on: ubuntu-latest @@ -39,12 +41,14 @@ jobs: - uses: actions/checkout@v2 - name: Install minimum stable with clippy and rustfmt uses: actions-rs/toolchain@v1 - with: + with: profile: default toolchain: stable override: true - name: Teststack setup run: docker-compose up setup - - name: Run tests - run: cargo test + - name: Run s3 feature tests + run: cargo test --features s3 + - name: Run azure feature tests + run: cargo test --features azure diff --git a/Cargo.lock b/Cargo.lock index 59d58ea..e6c316c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -42,22 +42,23 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if 1.0.0", "const-random", - "getrandom 0.2.9", + "getrandom 0.2.11", "once_cell", "version_check", + "zerocopy 0.7.29", ] [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -77,6 +78,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[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" @@ -88,58 +95,57 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "apache-avro" @@ -148,7 +154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cf4144857f9e4d7dd6cc4ba4c78efd2a46bad682b029bd0d91e76a021af1b2a" dependencies = [ "byteorder", - "digest 0.10.6", + "digest 0.10.7", "lazy_static", "libflate", "log", @@ -162,15 +168,15 @@ dependencies = [ "strum_macros 0.24.3", "thiserror", "typed-builder", - "uuid 1.3.2", - "zerocopy", + "uuid 1.6.1", + "zerocopy 0.6.5", ] [[package]] name = "arrow" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c107a57b5913d852da9d5a40e280e4695f2258b5b87733c13b770c63a7117287" +checksum = "7fab9e93ba8ce88a37d5a30dce4b9913b75413dc1ac56cb5d72e5a840543f829" dependencies = [ "ahash", "arrow-arith", @@ -190,9 +196,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace6aa3d5617c5d03041a05e01c6819428a8ddf49dd0b055df9b40fef9d96094" +checksum = "bc1d4e368e87ad9ee64f28b9577a3834ce10fe2703a26b28417d485bbbdff956" dependencies = [ "arrow-array", "arrow-buffer", @@ -200,14 +206,14 @@ dependencies = [ "arrow-schema", "chrono", "half", - "num 0.4.0", + "num 0.4.1", ] [[package]] name = "arrow-array" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "104a04520692cc674e6afd7682f213ca41f9b13ff1873f63a5a2857a590b87b3" +checksum = "d02efa7253ede102d45a4e802a129e83bcc3f49884cab795b1ac223918e4318d" dependencies = [ "ahash", "arrow-buffer", @@ -215,25 +221,26 @@ dependencies = [ "arrow-schema", "chrono", "half", - "hashbrown 0.13.2", - "num 0.4.0", + "hashbrown", + "num 0.4.1", ] [[package]] name = "arrow-buffer" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c875bcb9530ec403998fb0b2dc6d180a7c64563ca4bc22b90eafb84b113143" +checksum = "fda119225204141138cb0541c692fbfef0e875ba01bfdeaed09e9d354f9d6195" dependencies = [ + "bytes", "half", - "num 0.4.0", + "num 0.4.1", ] [[package]] name = "arrow-cast" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d6e18281636c8fc0b93be59834da6bf9a72bb70fd0c98ddfdaf124da466c28" +checksum = "1d825d51b9968868d50bc5af92388754056796dbc62a4e25307d588a1fc84dee" dependencies = [ "arrow-array", "arrow-buffer", @@ -241,15 +248,16 @@ dependencies = [ "arrow-schema", "arrow-select", "chrono", + "half", "lexical-core", - "num 0.4.0", + "num 0.4.1", ] [[package]] name = "arrow-csv" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3197dab0963a236ff8e7c82e2272535745955ac1321eb740c29f2f88b353f54e" +checksum = "43ef855dc6b126dc197f43e061d4de46b9d4c033aa51c2587657f7508242cef1" dependencies = [ "arrow-array", "arrow-buffer", @@ -266,21 +274,21 @@ dependencies = [ [[package]] name = "arrow-data" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb68113d6ecdbe8bba48b2c4042c151bf9e1c61244e45072a50250a6fc59bafe" +checksum = "475a4c3699c8b4095ca61cecf15da6f67841847a5f5aac983ccb9a377d02f73a" dependencies = [ "arrow-buffer", "arrow-schema", "half", - "num 0.4.0", + "num 0.4.1", ] [[package]] name = "arrow-ipc" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab4bbf2dd3078facb5ce0a9641316a64f42bfd8cf357e6775c8a5e6708e3a8d" +checksum = "1248005c8ac549f869b7a840859d942bf62471479c1a2d82659d453eebcd166a" dependencies = [ "arrow-array", "arrow-buffer", @@ -292,9 +300,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c5b650d23746a494665d914a7fa3d21d939153cff9d53bdebe39bffa88f263" +checksum = "f03d7e3b04dd688ccec354fe449aed56b831679f03e44ee2c1cfc4045067b69c" dependencies = [ "arrow-array", "arrow-buffer", @@ -305,16 +313,16 @@ dependencies = [ "half", "indexmap", "lexical-core", - "num 0.4.0", + "num 0.4.1", "serde", "serde_json", ] [[package]] name = "arrow-ord" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c6fce28e5011e30acc7466b5efcb8ed0197c396240bd2b10e167f275a3c208" +checksum = "03b87aa408ea6a6300e49eb2eba0c032c88ed9dc19e0a9948489c55efdca71f4" dependencies = [ "arrow-array", "arrow-buffer", @@ -322,14 +330,14 @@ dependencies = [ "arrow-schema", "arrow-select", "half", - "num 0.4.0", + "num 0.4.1", ] [[package]] name = "arrow-row" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f20a421f19799d8b93eb8edde5217e910fa1e2d6ceb3c529f000e57b6db144c0" +checksum = "114a348ab581e7c9b6908fcab23cb39ff9f060eb19e72b13f8fb8eaa37f65d22" dependencies = [ "ahash", "arrow-array", @@ -337,48 +345,53 @@ dependencies = [ "arrow-data", "arrow-schema", "half", - "hashbrown 0.13.2", + "hashbrown", ] [[package]] name = "arrow-schema" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85923d8d6662cc66ac6602c7d1876872e671002d60993dfdf492a6badeae92" +checksum = "5d1d179c117b158853e0101bfbed5615e86fe97ee356b4af901f1c5001e1ce4b" +dependencies = [ + "serde", +] [[package]] name = "arrow-select" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ab6613ce65b61d85a3410241744e84e48fbab0fe06e1251b4429d21b3470fd" +checksum = "d5c71e003202e67e9db139e5278c79f5520bb79922261dfe140e4637ee8b6108" dependencies = [ + "ahash", "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", - "num 0.4.0", + "num 0.4.1", ] [[package]] name = "arrow-string" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3008641239e884aefba66d8b8532da6af40d14296349fcc85935de4ba67b89e" +checksum = "c4cebbb282d6b9244895f4a9a912e55e57bce112554c7fa91fcec5459cb421ab" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "arrow-select", + "num 0.4.1", "regex", - "regex-syntax 0.6.29", + "regex-syntax 0.7.5", ] [[package]] name = "async-channel" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", "event-listener", @@ -387,20 +400,20 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "atomic_refcell" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79d6dc922a2792b006573f60b2648076355daeae5ce9cb59507e5908c9625d31" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" [[package]] name = "autocfg" @@ -408,292 +421,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "aws-config" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3d1e2a1f1ab3ac6c4b884e37413eaa03eb9d901e4fc68ee8f5c1d49721680e" -dependencies = [ - "aws-credential-types", - "aws-http", - "aws-sdk-sso", - "aws-sdk-sts", - "aws-smithy-async", - "aws-smithy-client", - "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-json", - "aws-smithy-types", - "aws-types", - "bytes", - "hex", - "http", - "hyper", - "ring", - "time 0.3.21", - "tokio", - "tower", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-credential-types" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0696a0523a39a19087747e4dafda0362dc867531e3d72a3f195564c84e5e08" -dependencies = [ - "aws-smithy-async", - "aws-smithy-types", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-endpoint" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80a4f935ab6a1919fbfd6102a80c4fccd9ff5f47f94ba154074afe1051903261" -dependencies = [ - "aws-smithy-http", - "aws-smithy-types", - "aws-types", - "http", - "regex", - "tracing", -] - -[[package]] -name = "aws-http" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82976ca4e426ee9ca3ffcf919d9b2c8d14d0cd80d43cc02173737a8f07f28d4d" -dependencies = [ - "aws-credential-types", - "aws-smithy-http", - "aws-smithy-types", - "aws-types", - "bytes", - "http", - "http-body", - "lazy_static", - "percent-encoding", - "pin-project-lite", - "tracing", -] - -[[package]] -name = "aws-sdk-sso" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0119bacf0c42f587506769390983223ba834e605f049babe514b2bd646dbb2" -dependencies = [ - "aws-credential-types", - "aws-endpoint", - "aws-http", - "aws-sig-auth", - "aws-smithy-async", - "aws-smithy-client", - "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-json", - "aws-smithy-types", - "aws-types", - "bytes", - "http", - "regex", - "tokio-stream", - "tower", -] - -[[package]] -name = "aws-sdk-sts" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "270b6a33969ebfcb193512fbd5e8ee5306888ad6c6d5d775cdbfb2d50d94de26" -dependencies = [ - "aws-credential-types", - "aws-endpoint", - "aws-http", - "aws-sig-auth", - "aws-smithy-async", - "aws-smithy-client", - "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-json", - "aws-smithy-query", - "aws-smithy-types", - "aws-smithy-xml", - "aws-types", - "bytes", - "http", - "regex", - "tower", - "tracing", -] - -[[package]] -name = "aws-sig-auth" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660a02a98ab1af83bd8d714afbab2d502ba9b18c49e7e4cddd6bf8837ff778cb" -dependencies = [ - "aws-credential-types", - "aws-sigv4", - "aws-smithy-http", - "aws-types", - "http", - "tracing", -] - -[[package]] -name = "aws-sigv4" -version = "0.54.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86529e7b64d902efea8fff52c1b2529368d04f90305cf632729e3713f6b57dc0" -dependencies = [ - "aws-smithy-http", - "form_urlencoded", - "hex", - "hmac 0.12.1", - "http", - "once_cell", - "percent-encoding", - "regex", - "sha2 0.10.6", - "time 0.3.21", - "tracing", -] - -[[package]] -name = "aws-smithy-async" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63c712a28a4f2f2139759235c08bf98aca99d4fdf1b13c78c5f95613df0a5db9" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", - "tokio-stream", -] - -[[package]] -name = "aws-smithy-client" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "104ca17f56cde00a10207169697dfe9c6810db339d52fb352707e64875b30a44" -dependencies = [ - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-types", - "bytes", - "fastrand", - "http", - "http-body", - "hyper", - "hyper-rustls 0.23.2", - "lazy_static", - "pin-project-lite", - "tokio", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-http" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "873f316f1833add0d3aa54ed1b0cd252ddd88c792a0cf839886400099971e844" -dependencies = [ - "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", - "http", - "http-body", - "hyper", - "once_cell", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] - -[[package]] -name = "aws-smithy-http-tower" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38231d3f5dac9ac7976f44e12803add1385119ffca9e5f050d8e980733d164" -dependencies = [ - "aws-smithy-http", - "aws-smithy-types", - "bytes", - "http", - "http-body", - "pin-project-lite", - "tower", - "tracing", -] - -[[package]] -name = "aws-smithy-json" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd83ff2b79e9f729746fcc8ad798676b68fe6ea72986571569a5306a277a182" -dependencies = [ - "aws-smithy-types", -] - -[[package]] -name = "aws-smithy-query" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f0445dafe9d2cd50b44339ae3c3ed46549aad8ac696c52ad660b3e7ae8682b" -dependencies = [ - "aws-smithy-types", - "urlencoding", -] - -[[package]] -name = "aws-smithy-types" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8161232eda10290f5136610a1eb9de56aceaccd70c963a26a260af20ac24794f" -dependencies = [ - "base64-simd", - "itoa", - "num-integer", - "ryu", - "time 0.3.21", -] - -[[package]] -name = "aws-smithy-xml" -version = "0.54.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343ffe9a9bb3f542675f4df0e0d5933513d6ad038ca3907ad1767ba690a99684" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "aws-types" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f15b34253b68cde08e39b0627cc6101bcca64351229484b4743392c035d057" -dependencies = [ - "aws-credential-types", - "aws-smithy-async", - "aws-smithy-client", - "aws-smithy-http", - "aws-smithy-types", - "http", - "rustc_version 0.4.0", - "tracing", -] - [[package]] name = "azure_core" version = "0.10.0" @@ -705,20 +432,20 @@ dependencies = [ "bytes", "dyn-clone", "futures", - "getrandom 0.2.9", + "getrandom 0.2.11", "http-types", "log", "paste", "pin-project", "rand 0.8.5", "reqwest", - "rustc_version 0.4.0", + "rustc_version", "serde", "serde-xml-rs", "serde_json", - "time 0.3.21", + "time 0.3.30", "url", - "uuid 1.3.2", + "uuid 1.6.1", ] [[package]] @@ -740,10 +467,10 @@ dependencies = [ "serde-xml-rs", "serde_derive", "serde_json", - "sha2 0.10.6", - "time 0.3.21", + "sha2 0.10.8", + "time 0.3.30", "url", - "uuid 1.3.2", + "uuid 1.6.1", ] [[package]] @@ -764,32 +491,26 @@ dependencies = [ "serde-xml-rs", "serde_derive", "serde_json", - "time 0.3.21", + "time 0.3.30", "url", - "uuid 1.3.2", + "uuid 1.6.1", ] [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", - "miniz_oxide 0.6.2", + "miniz_oxide", "object", "rustc-demangle", ] -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - [[package]] name = "base64" version = "0.13.1" @@ -798,25 +519,21 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] -name = "base64-simd" -version = "0.8.0" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block-buffer" @@ -838,9 +555,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.3.4" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -849,9 +566,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -859,39 +576,30 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.2" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "bytes-utils" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" -dependencies = [ - "bytes", - "either", -] +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -908,47 +616,45 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", - "num-integer", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", - "winapi", + "windows-targets 0.48.5", ] [[package]] name = "clap" -version = "4.3.0" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93aae7a4192245f70fe75dd9157fc7b4a5bf53e88d30bd4396f7d8f9284d5acc" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.3.0" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", - "bitflags", "clap_lex", "strsim", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "cloudabi" @@ -956,7 +662,7 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -967,46 +673,38 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ - "crossbeam-utils 0.8.15", + "crossbeam-utils 0.8.16", ] [[package]] name = "const-random" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" +checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" dependencies = [ "const-random-macro", - "proc-macro-hack", ] [[package]] name = "const-random-macro" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.9", + "getrandom 0.2.11", "once_cell", - "proc-macro-hack", "tiny-keccak", ] -[[package]] -name = "const_fn" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" - [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -1014,15 +712,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1059,9 +757,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if 1.0.0", ] @@ -1082,16 +780,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "crypto-mac" version = "0.11.1" @@ -1104,9 +792,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b015497079b9a9d69c02ad25de6c0a6edef051ea6360a327d0bd05802ef64ad" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", "itoa", @@ -1116,9 +804,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] @@ -1134,15 +822,15 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if 1.0.0", - "hashbrown 0.12.3", - "lock_api 0.4.9", + "hashbrown", + "lock_api 0.4.11", "once_cell", - "parking_lot_core 0.9.7", + "parking_lot_core 0.9.9", ] [[package]] @@ -1157,14 +845,18 @@ dependencies = [ [[package]] name = "deltalake" -version = "0.11.0" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73bb429a72cd494c1cf3212418dfff9975c4617b408cc25a3a1fc387574c370" +checksum = "cb694b21358cfa35ec1ccf9443269d6e21a9afba5e942dceb50019748271e811" dependencies = [ "arrow", "arrow-array", + "arrow-buffer", "arrow-cast", + "arrow-ord", + "arrow-row", "arrow-schema", + "arrow-select", "async-trait", "bytes", "cfg-if 1.0.0", @@ -1172,21 +864,22 @@ dependencies = [ "dynamodb_lock", "errno", "futures", - "glibc_version", "itertools", "lazy_static", "libc", "log", "num-bigint", "num-traits", + "num_cpus", "object_store", "once_cell", "parking_lot 0.12.1", "parquet", "percent-encoding", + "rand 0.8.5", "regex", - "rusoto_core 0.47.0", - "rusoto_credential 0.47.0", + "rusoto_core", + "rusoto_credential", "rusoto_dynamodb", "rusoto_sts", "serde", @@ -1194,14 +887,24 @@ dependencies = [ "thiserror", "tokio", "url", - "uuid 1.3.2", + "uuid 1.6.1", +] + +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", + "serde", ] [[package]] name = "deunicode" -version = "0.4.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" +checksum = "6a1abaf4d861455be59f64fd2b55606cb151fce304ede7165f410243ce96bde6" [[package]] name = "digest" @@ -1214,9 +917,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "crypto-common", @@ -1260,12 +963,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - [[package]] name = "doc-comment" version = "0.3.3" @@ -1274,46 +971,46 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dyn-clone" -version = "1.0.11" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "dynamodb_lock" -version = "0.4.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff628406c318f098017c78e203b5b6466e0610fc48be865ebb9ae0eb229b4c8" +checksum = "9c4242838952a07117a4444cdf59fdcb47f181525f2dd6ae4ca6281954d09c77" dependencies = [ "async-trait", "log", "maplit", - "rusoto_core 0.47.0", + "rusoto_core", "rusoto_dynamodb", "thiserror", "tokio", - "uuid 1.3.2", + "uuid 1.6.1", ] [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" dependencies = [ "humantime", "is-terminal", @@ -1323,24 +1020,19 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.1" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1358,24 +1050,30 @@ dependencies = [ "instant", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "flatbuffers" -version = "23.1.21" +version = "23.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f5399c2c9c50ae9418e522842ad362f61ee48b346ac106807bd355a8a7c619" +checksum = "4dac53e22462d78c16d64a1cd22371b54cc3fe94aa15e7886a2fa6e5d1ab8640" dependencies = [ - "bitflags", - "rustc_version 0.4.0", + "bitflags 1.3.2", + "rustc_version", ] [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] @@ -1401,18 +1099,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1425,9 +1123,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1435,15 +1133,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1452,9 +1150,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -1462,7 +1160,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", @@ -1473,32 +1171,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1535,9 +1233,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1548,24 +1246,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.2" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" - -[[package]] -name = "glibc_version" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803ff7635f1ab4e2c064b68a0c60da917d3d18dc8d086130f689d62ce4f1c33e" -dependencies = [ - "regex", -] +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1576,31 +1265,26 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.8", + "tokio-util 0.7.10", "tracing", ] [[package]] name = "half" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" dependencies = [ + "cfg-if 1.0.0", "crunchy", "num-traits", ] [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -1619,18 +1303,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -1638,23 +1313,13 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac 0.10.1", - "digest 0.9.0", -] - [[package]] name = "hmac" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.1", + "crypto-mac", "digest 0.9.0", ] @@ -1664,7 +1329,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -1680,9 +1345,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1728,9 +1393,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -1740,9 +1405,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1755,7 +1420,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1773,25 +1438,24 @@ dependencies = [ "hyper", "log", "rustls 0.19.1", - "rustls-native-certs 0.5.0", + "rustls-native-certs", "tokio", "tokio-rustls 0.22.0", - "webpki 0.21.4", + "webpki", ] [[package]] name = "hyper-rustls" -version = "0.23.2" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ + "futures-util", "http", "hyper", - "log", - "rustls 0.20.8", - "rustls-native-certs 0.6.2", + "rustls 0.21.9", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls 0.24.1", ] [[package]] @@ -1809,16 +1473,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.56" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1832,9 +1496,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1842,12 +1506,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "autocfg", - "hashbrown 0.12.3", + "equivalent", + "hashbrown", ] [[package]] @@ -1871,49 +1535,37 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", + "hermit-abi", "rustix", "windows-sys 0.48.0", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jmespatch" @@ -1929,18 +1581,18 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1988,8 +1640,8 @@ dependencies = [ "log", "maplit", "rdkafka", - "rusoto_core 0.46.0", - "rusoto_credential 0.46.0", + "rusoto_core", + "rusoto_credential", "rusoto_s3", "schema_registry_converter", "sentry", @@ -2000,7 +1652,7 @@ dependencies = [ "strum_macros 0.20.1", "tempfile", "thiserror", - "time 0.3.21", + "time 0.3.30", "tokio", "tokio-stream", "tokio-util 0.6.10", @@ -2081,9 +1733,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.144" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libflate" @@ -2107,15 +1759,26 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.6" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall 0.4.1", +] [[package]] name = "libz-sys" -version = "1.1.9" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" dependencies = [ "cc", "libc", @@ -2125,9 +1788,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" @@ -2140,9 +1803,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2150,12 +1813,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lz4" @@ -2214,9 +1874,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "mime" @@ -2224,15 +1884,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -2244,23 +1895,22 @@ dependencies = [ [[package]] name = "minreq" -version = "2.8.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6c6973f78ef55d0e5fc04fdb8f9ad67c87c9e86bca0ff77b6a3102b0eb36b7" +checksum = "cb3371dfc7b772c540da1380123674a8e20583aca99907087d990ca58cf44203" dependencies = [ "log", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2305,12 +1955,12 @@ dependencies = [ [[package]] name = "num" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ "num-bigint", - "num-complex 0.4.3", + "num-complex 0.4.4", "num-integer", "num-iter", "num-rational 0.4.1", @@ -2319,9 +1969,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -2340,9 +1990,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -2393,9 +2043,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -2403,11 +2053,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] @@ -2443,34 +2093,33 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] [[package]] name = "object_store" -version = "0.5.6" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9cd6ca25e796a49fa242876d1c4de36a24a6da5258e9f0bc062dbf5e81c53b" +checksum = "f930c88a43b1c3f6e776dfe495b4afab89882dbc81530c632db2ed65451ebcb4" dependencies = [ "async-trait", - "aws-config", - "aws-credential-types", - "aws-types", - "base64 0.21.0", + "base64 0.21.5", "bytes", "chrono", "futures", + "humantime", + "hyper", "itertools", "parking_lot 0.12.1", "percent-encoding", "quick-xml", "rand 0.8.5", "reqwest", - "ring", + "ring 0.16.20", "serde", "serde_json", "snafu", @@ -2482,9 +2131,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2494,11 +2143,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ - "bitflags", + "bitflags 2.4.1", "cfg-if 1.0.0", "foreign-types", "libc", @@ -2515,7 +2164,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -2526,18 +2175,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.25.3+1.1.1t" +version = "300.1.6+3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924757a6a226bf60da5f7dd0311a34d2b52283dd82ddeb103208ddc66362f80c" +checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -2548,24 +2197,18 @@ dependencies = [ [[package]] name = "ordered-float" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" dependencies = [ "num-traits", ] -[[package]] -name = "outref" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" - [[package]] name = "parking" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" @@ -2583,8 +2226,8 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "lock_api 0.4.9", - "parking_lot_core 0.9.7", + "lock_api 0.4.11", + "parking_lot_core 0.9.9", ] [[package]] @@ -2603,22 +2246,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.4.1", "smallvec", - "windows-sys 0.45.0", + "windows-targets 0.48.5", ] [[package]] name = "parquet" -version = "38.0.0" +version = "47.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbd51311f8d9ff3d2697b1522b18a588782e097d313a1a278b0faf2ccf2d3f6" +checksum = "0463cc3b256d5f50408c49a4be3a16674f4c8ceef60941709620a062b1f6bf4d" dependencies = [ "ahash", "arrow-array", @@ -2628,15 +2271,15 @@ dependencies = [ "arrow-ipc", "arrow-schema", "arrow-select", - "base64 0.21.0", + "base64 0.21.5", "brotli", "bytes", "chrono", "flate2", "futures", - "hashbrown 0.13.2", + "hashbrown", "lz4", - "num 0.4.0", + "num 0.4.1", "num-bigint", "object_store", "paste", @@ -2651,15 +2294,15 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" @@ -2701,29 +2344,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -2737,6 +2380,12 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2753,26 +2402,20 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "psl" -version = "2.1.4" +version = "2.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1be0afcd844b15cfce18bf8cccf2dfa887a00a6454a9ea135f122b948cee91" +checksum = "cdc9f7a25d234ba11af714be527b60c8bc7ce1310011ef8dc032bd5ab1a7eadd" dependencies = [ "psl-types", ] @@ -2791,9 +2434,9 @@ checksum = "658fa1faf7a4cc5f057c9ee5ef560f717ad9d8dc66d975267f709624d6e1ab88" [[package]] name = "quick-xml" -version = "0.28.2" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" dependencies = [ "memchr", "serde", @@ -2801,9 +2444,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.27" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -2868,7 +2511,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.9", + "getrandom 0.2.11", ] [[package]] @@ -2908,9 +2551,9 @@ dependencies = [ [[package]] name = "rdkafka-sys" -version = "4.4.0+1.9.2" +version = "4.7.0+2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ac9d87c3aba1748e3112318459f2ac8bff80bfff7359e338e0463549590249" +checksum = "55e0d2f9ba6253f6ec72385e453294f8618e9e15c2c6aba2a5c01ccf9622d615" dependencies = [ "libc", "libz-sys", @@ -2927,63 +2570,66 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] -name = "redox_syscall" -version = "0.3.5" +name = "redox_users" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "bitflags", + "getrandom 0.2.11", + "libredox", + "thiserror", ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ - "getrandom 0.2.9", - "redox_syscall 0.2.16", - "thiserror", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.8.2", ] [[package]] -name = "regex" -version = "1.8.1" +name = "regex-automata" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-syntax 0.8.2", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.17" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -2992,7 +2638,7 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls 0.23.2", + "hyper-rustls 0.24.2", "hyper-tls", "ipnet", "js-sys", @@ -3002,15 +2648,16 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.20.8", + "rustls 0.21.9", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls 0.23.4", - "tokio-util 0.7.8", + "tokio-rustls 0.24.1", + "tokio-util 0.7.10", "tower-service", "url", "wasm-bindgen", @@ -3030,42 +2677,31 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] [[package]] -name = "rle-decode-fast" -version = "1.0.3" +name = "ring" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom 0.2.11", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] [[package]] -name = "rusoto_core" -version = "0.46.0" +name = "rle-decode-fast" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02aff20978970d47630f08de5f0d04799497818d16cafee5aec90c4b4d0806cf" -dependencies = [ - "async-trait", - "base64 0.13.1", - "bytes", - "crc32fast", - "futures", - "http", - "hyper", - "hyper-tls", - "lazy_static", - "log", - "rusoto_credential 0.46.0", - "rusoto_signature 0.46.0", - "rustc_version 0.2.3", - "serde", - "serde_json", - "tokio", - "xml-rs", -] +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" [[package]] name = "rusoto_core" @@ -3083,33 +2719,15 @@ dependencies = [ "hyper-rustls 0.22.1", "lazy_static", "log", - "rusoto_credential 0.47.0", - "rusoto_signature 0.47.0", - "rustc_version 0.4.0", + "rusoto_credential", + "rusoto_signature", + "rustc_version", "serde", "serde_json", "tokio", "xml-rs", ] -[[package]] -name = "rusoto_credential" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e91e4c25ea8bfa6247684ff635299015845113baaa93ba8169b9e565701b58e" -dependencies = [ - "async-trait", - "chrono", - "dirs-next", - "futures", - "hyper", - "serde", - "serde_json", - "shlex 0.1.1", - "tokio", - "zeroize", -] - [[package]] name = "rusoto_credential" version = "0.47.0" @@ -3123,7 +2741,7 @@ dependencies = [ "hyper", "serde", "serde_json", - "shlex 1.1.0", + "shlex", "tokio", "zeroize", ] @@ -3137,47 +2755,22 @@ dependencies = [ "async-trait", "bytes", "futures", - "rusoto_core 0.47.0", + "rusoto_core", "serde", "serde_json", ] [[package]] name = "rusoto_s3" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc3f56f14ccf91f880b9a9c2d0556d8523e8c155041c54db155b384a1dd1119" +checksum = "048c2fe811a823ad5a9acc976e8bf4f1d910df719dcf44b15c3e96c5b7a51027" dependencies = [ "async-trait", "bytes", - "futures", - "rusoto_core 0.46.0", - "xml-rs", -] - -[[package]] -name = "rusoto_signature" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486e6b1673ab3e0ba1ded284fb444845fe1b7f41d13989a54dd60f62a7b2baa" -dependencies = [ - "base64 0.13.1", - "bytes", - "futures", - "hex", - "hmac 0.10.1", - "http", - "hyper", - "log", - "md5", - "percent-encoding", - "pin-project-lite", - "rusoto_credential 0.46.0", - "rustc_version 0.2.3", - "serde", - "sha2 0.9.9", - "time 0.2.27", - "tokio", + "futures", + "rusoto_core", + "xml-rs", ] [[package]] @@ -3199,8 +2792,8 @@ dependencies = [ "md-5", "percent-encoding", "pin-project-lite", - "rusoto_credential 0.47.0", - "rustc_version 0.4.0", + "rusoto_credential", + "rustc_version", "serde", "sha2 0.9.9", "tokio", @@ -3216,7 +2809,7 @@ dependencies = [ "bytes", "chrono", "futures", - "rusoto_core 0.47.0", + "rusoto_core", "serde_urlencoded", "xml-rs", ] @@ -3227,36 +2820,26 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.17", + "semver", ] [[package]] name = "rustix" -version = "0.37.19" +version = "0.38.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "bfeae074e687625746172d639330f1de242a178bf3189b51e35a7a21573513ac" dependencies = [ - "bitflags", + "bitflags 2.4.1", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3267,21 +2850,21 @@ checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ "base64 0.13.1", "log", - "ring", + "ring 0.16.20", "sct 0.6.1", - "webpki 0.21.4", + "webpki", ] [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring", - "sct 0.7.0", - "webpki 0.22.0", + "ring 0.17.7", + "rustls-webpki", + "sct 0.7.1", ] [[package]] @@ -3297,37 +2880,35 @@ dependencies = [ ] [[package]] -name = "rustls-native-certs" -version = "0.6.2" +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", + "base64 0.21.5", ] [[package]] -name = "rustls-pemfile" -version = "1.0.2" +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "base64 0.21.0", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -3340,11 +2921,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] @@ -3367,9 +2948,9 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -3377,27 +2958,27 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] name = "security-framework" -version = "2.9.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2855b3715770894e67cbfa3df957790aa0c9edc3bf06efa1a84d77fa0839d1" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -3406,9 +2987,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -3416,24 +2997,9 @@ dependencies = [ [[package]] name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" - -[[package]] -name = "semver-parser" -version = "0.7.0" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "sentry" @@ -3472,7 +3038,7 @@ dependencies = [ "lazy_static", "libc", "regex", - "rustc_version 0.4.0", + "rustc_version", "sentry-core", "uname", ] @@ -3518,15 +3084,15 @@ dependencies = [ [[package]] name = "seq-macro" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b44e8fc93a14e66336d230954dda83d18b4605ccace8fe09bc7514a71ad0bc" +checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -3545,20 +3111,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -3610,24 +3176,9 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", -] - -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", + "syn 2.0.39", ] -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sha2" version = "0.9.9" @@ -3643,26 +3194,20 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] name = "shlex" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" - -[[package]] -name = "shlex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] name = "signal-hook-registry" @@ -3675,39 +3220,40 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "slug" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" +checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" dependencies = [ "deunicode", + "wasm-bindgen", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "snafu" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0656e7e3ffb70f6c39b3c2a86332bb74aa3c679da781642590f3c1118c5045" +checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" dependencies = [ "doc-comment", "snafu-derive", @@ -3715,9 +3261,9 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475b3bbe5245c26f2d8a6f62d67c1f30eb9fffeccee721c45d162c3ebbdf81b2" +checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" dependencies = [ "heck 0.4.1", "proc-macro2", @@ -3727,20 +3273,30 @@ dependencies = [ [[package]] name = "snap" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "spin" version = "0.5.2" @@ -3748,13 +3304,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "standback" -version = "0.2.17" +name = "spin" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "static_assertions" @@ -3762,55 +3315,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn 1.0.109", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn 1.0.109", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "strsim" version = "0.10.0" @@ -3873,55 +3377,76 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" -version = "3.5.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if 1.0.0", - "fastrand", - "redox_syscall 0.3.5", + "fastrand 2.0.1", + "redox_syscall 0.4.1", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -3948,71 +3473,35 @@ dependencies = [ [[package]] name = "time" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros 0.1.1", - "version_check", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.21" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", "itoa", "libc", "num_threads", + "powerfmt", "serde", "time-core", - "time-macros 0.2.9", + "time-macros", ] [[package]] name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.9" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn 1.0.109", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -4039,11 +3528,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.1" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -4051,20 +3540,20 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -4085,18 +3574,17 @@ checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ "rustls 0.19.1", "tokio", - "webpki 0.21.4", + "webpki", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.20.8", + "rustls 0.21.9", "tokio", - "webpki 0.22.0", ] [[package]] @@ -4126,9 +3614,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -4140,43 +3628,21 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "toml_datetime", "winnow", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -4185,12 +3651,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4198,29 +3662,29 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twox-hash" @@ -4245,9 +3709,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uname" @@ -4260,15 +3724,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -4291,6 +3755,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "uritemplate-next" version = "0.2.0" @@ -4302,9 +3772,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -4312,12 +3782,6 @@ dependencies = [ "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" - [[package]] name = "utf8parse" version = "0.2.1" @@ -4340,17 +3804,17 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.9", + "getrandom 0.2.11", "serde", ] [[package]] name = "uuid" -version = "1.3.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ - "getrandom 0.2.9", + "getrandom 0.2.11", "serde", ] @@ -4388,23 +3852,17 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -4412,11 +3870,10 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -4440,9 +3897,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -4450,24 +3907,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.35" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4477,9 +3934,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4487,28 +3944,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.85" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-streams" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" dependencies = [ "futures-util", "js-sys", @@ -4519,9 +3976,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.62" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -4533,28 +3990,15 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki 0.22.0", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "winapi" @@ -4574,9 +4018,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -4588,232 +4032,232 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "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", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.4.6" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if 1.0.0", + "windows-sys 0.48.0", ] [[package]] name = "xml-rs" -version = "0.8.10" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc95a04ea24f543cd9be5aab44f963fa35589c99e18415c38fb2b17e133bf8d2" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" [[package]] -name = "xmlparser" -version = "0.13.5" +name = "zerocopy" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" +checksum = "96f8f25c15a0edc9b07eb66e7e6e97d124c0505435c382fde1ab7ceb188aa956" +dependencies = [ + "byteorder", + "zerocopy-derive 0.6.5", +] [[package]] name = "zerocopy" -version = "0.6.1" +version = "0.7.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" +checksum = "5d075cf85bbb114e933343e087b92f2146bac0d55b534cbb8188becf0039948e" dependencies = [ - "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.29", ] [[package]] name = "zerocopy-derive" -version = "0.3.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" +checksum = "855e0f6af9cd72b87d8a6c586f3cb583f5cdcc62c2c80869d8cd7e96fdf7ee20" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86cd5ca076997b97ef09d3ad65efe811fa68c9e874cb636ccb211223a813b0c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", ] [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] name = "zstd" -version = "0.12.3+zstd.1.5.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.5+zstd.1.5.4" +version = "6.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" dependencies = [ "libc", "zstd-sys", @@ -4821,11 +4265,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index d6851f7..5c0f5ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ async-trait = "0.1" apache-avro = "^0.14" base64 = "0.13" bytes = "1" -chrono = "0" +chrono = "0.4.31" clap = { version = "4", features = ["color"] } dipstick = "0.9" env_logger = "0" @@ -20,9 +20,6 @@ lazy_static = "1" log = "0" maplit = "1" rdkafka = { version = "0.28", features = ["ssl-vendored"] } -rusoto_core = { version = "0.46" } -rusoto_credential = { version = "0.46" } -rusoto_s3 = { version = "0.46" } schema_registry_converter = { version = "3.1.0", features = ["easy", "json", "avro"] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -33,26 +30,46 @@ tokio = { version = "1", features = ["full"] } tokio-stream = { version = "0", features = ["fs"] } tokio-util = "0.6.3" uuid = { version = "0.8", features = ["serde", "v4"] } +url = "2.3" + +deltalake = { version = "0.16.5", features = ["arrow", "json", "parquet"], optional = true } -deltalake = { version = "0.11.0", features = ["s3", "azure"] } -dynamodb_lock = "0.4.3" +# s3 feature enabled +dynamodb_lock = { version = "0.6.0", optional = true } +rusoto_core = { version = "0.47", default-features = false, features = ["rustls"], optional = true } +rusoto_credential = { version = "0.47", optional = true } +rusoto_s3 = { version = "0.47", default-features = false, features = ["rustls"], optional = true } # sentry sentry = { version = "0.23.0", optional = true } -url = "2.3" + +# azure feature enabled, mostly used for tests +azure_core = { version = "0.10.0", optional = true } +azure_storage = { version = "0.10.0", optional = true } +azure_storage_blobs = { version = "0.10.0", optional = true } [features] +default = [] sentry-ext = ["sentry"] dynamic-linking = [ "rdkafka/dynamic-linking" ] +azure = [ + "deltalake/azure", + "azure_core", + "azure_storage", + "azure_storage_blobs" +] +s3 = [ + "deltalake/s3", + "dynamodb_lock", + "rusoto_core", + "rusoto_credential", + "rusoto_s3", +] [dev-dependencies] -deltalake = { version = "0.11.0", features = ["s3", "azure", "json"] } utime = "0.3" serial_test = "*" tempfile = "3" -azure_core = "0.10.0" -azure_storage = "0.10.0" -azure_storage_blobs = "0.10.0" time = "0.3.20" [profile.release] diff --git a/README.adoc b/README.adoc index 4d78a79..463f8ff 100644 --- a/README.adoc +++ b/README.adoc @@ -4,9 +4,12 @@ The kafka-delta-ingest project aims to build a highly efficient daemon for streaming data through link:https://kafka.apache.org[Apache Kafka] into link:https://delta.io[Delta Lake]. -This project is currently highly experimental and evolving in tandem with the +This project is currently in production in a number of organizations and is +still actively evolving in tandem with the link:https://github.com/delta-io/delta-rs[delta-rs] bindings. +To contribute please look at the link:https://github.com/delta-io/kafka-delta-ingest/blob/main/doc/HACKING.adoc[hacking document]. + == Features * Multiple worker processes per stream @@ -66,37 +69,6 @@ Make sure to provide the additional option: when invoking the cli command as well. -==== Example Data - -A tarball containing 100K line-delimited JSON messages is included in `tests/json/web_requests-100K.json.tar.gz`. Running `./bin/extract-example-json.sh` will unpack this to the expected location. - -===== Pretty-printed example from the file - -```json -{ - "meta": { - "producer": { - "timestamp": "2021-03-24T15:06:17.321710+00:00" - } - }, - "method": "DELETE", - "session_id": "7c28bcf9-be26-4d0b-931a-3374ab4bb458", - "status": 204, - "url": "http://www.youku.com", - "uuid": "831c6afa-375c-4988-b248-096f9ed101f8" -} -``` - -After extracting the example data, you'll need to play this onto the web_requests topic of the local Kafka container. - -NOTE: URLs sampled for the test data are sourced from Wikipedia's list of most popular websites - https://en.wikipedia.org/wiki/List_of_most_popular_websites. - -===== Inspect example output - -* List data files - `ls tests/data/web_requests/date=2021-03-24` -* List delta log files - `ls tests/data/web_requests/_delta_log` -* Show some parquet data (using link:https://pypi.org/project/parquet-tools/[parquet-tools]) -** `parquet-tools show tests/data/web_requests/date=2021-03-24/` === Using Azure Event Hubs @@ -279,9 +251,6 @@ Use the Azure Portal to browse the file system: * Data files: `web_requests/date=2021-03-24` * Delta log files: `web_requests/_delta_log` -== Developing - -Make sure the docker-compose setup has been ran, and execute `cargo test` to run unit and integration tests. == Get Involved diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..d74f281 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +#[cfg(not(any(feature = "s3", feature = "azure")))] +compile_error!( + "Either the \"s3\" or the \"azure\" feature must be enabled to compile kafka-delta-ingest" +); +fn main() {} diff --git a/doc/HACKING.adoc b/doc/HACKING.adoc new file mode 100644 index 0000000..0c61db7 --- /dev/null +++ b/doc/HACKING.adoc @@ -0,0 +1,74 @@ +ifdef::env-github[] +:tip-caption: :bulb: +:note-caption: :information_source: +:important-caption: :heavy_exclamation_mark: +:caution-caption: :fire: +:warning-caption: :warning: +endif::[] +:toc: macro + += Hacking on kafka-delta-ingest + +kafka-delta-ingest is designed to work well with AWS and Azure, which can add +some complexity to the development environment. This document outlines how to +work with kafka-delta-ingest locally for new and existing Rust developers. + +toc::[] + +== Developing + +Make sure the docker-compose setup has been ran, and execute `cargo test` to run unit and integration tests. + +== Environment Variables + +|=== +| Name | Default | Notes + +| `KAFKA_BROKERS` +| `0.0.0.0:9092` +| A kafka broker string which can be used during integration testing + + +| `AWS_ENDPOINT_URL` +| `http://0.0.0.0:4056` +| AWS endpoint URL for something that can provide stub S3 and DynamoDB operations (e.g. Localstack) + +| `AWS_S3_BUCKET` +| `tests` +| Bucket to use for test data at the given endpoint + +|=== + + +== Example Data + +A tarball containing 100K line-delimited JSON messages is included in `tests/json/web_requests-100K.json.tar.gz`. Running `./bin/extract-example-json.sh` will unpack this to the expected location. + + +.Pretty-printed example from the file +[source,json] +---- +{ + "meta": { + "producer": { + "timestamp": "2021-03-24T15:06:17.321710+00:00" + } + }, + "method": "DELETE", + "session_id": "7c28bcf9-be26-4d0b-931a-3374ab4bb458", + "status": 204, + "url": "http://www.youku.com", + "uuid": "831c6afa-375c-4988-b248-096f9ed101f8" +} +---- + +After extracting the example data, you'll need to play this onto the web_requests topic of the local Kafka container. + +NOTE: URLs sampled for the test data are sourced from Wikipedia's list of most popular websites - https://en.wikipedia.org/wiki/List_of_most_popular_websites. + +=== Inspect example output + +* List data files - `ls tests/data/web_requests/date=2021-03-24` +* List delta log files - `ls tests/data/web_requests/_delta_log` +* Show some parquet data (using link:https://pypi.org/project/parquet-tools/[parquet-tools]) +** `parquet-tools show tests/data/web_requests/date=2021-03-24/` diff --git a/src/coercions.rs b/src/coercions.rs index 6334d44..020faf7 100644 --- a/src/coercions.rs +++ b/src/coercions.rs @@ -136,9 +136,14 @@ fn string_to_timestamp(string: &str) -> Option { e ) } - parsed - .ok() - .map(|dt: DateTime| Value::Number((dt.timestamp_nanos() / 1000).into())) + parsed.ok().map(|dt: DateTime| { + Value::Number( + (dt.timestamp_nanos_opt() + .expect("Failed to turn timestamp nanoseconds") + / 1000) + .into(), + ) + }) } #[cfg(test)] diff --git a/src/cursor.rs b/src/cursor.rs index 2b1ab40..2858e9d 100644 --- a/src/cursor.rs +++ b/src/cursor.rs @@ -116,37 +116,13 @@ pub(crate) struct InMemoryWriteableCursor { } impl InMemoryWriteableCursor { - /* - /// Consume this instance and return the underlying buffer as long as there are no other - /// references to this instance. - pub fn into_inner(self) -> Option> { - Arc::try_unwrap(self.buffer) - .ok() - .and_then(|mutex| mutex.into_inner().ok()) - .map(|cursor| cursor.into_inner()) - }*/ - /// Returns a clone of the underlying buffer pub fn data(&self) -> Vec { let inner = self.buffer.lock().unwrap(); inner.get_ref().to_vec() } - - /// Returns a length of the underlying buffer - pub fn len(&self) -> usize { - let inner = self.buffer.lock().unwrap(); - inner.get_ref().len() - } - - /* - /// Returns true if the underlying buffer contains no elements - pub fn is_empty(&self) -> bool { - let inner = self.buffer.lock().unwrap(); - inner.get_ref().is_empty() - }*/ } -#[allow(deprecated)] impl Write for InMemoryWriteableCursor { fn write(&mut self, buf: &[u8]) -> std::io::Result { let mut inner = self.buffer.lock().unwrap(); @@ -159,7 +135,6 @@ impl Write for InMemoryWriteableCursor { } } -#[allow(deprecated)] impl Seek for InMemoryWriteableCursor { fn seek(&mut self, pos: SeekFrom) -> std::io::Result { let mut inner = self.buffer.lock().unwrap(); diff --git a/src/dead_letters.rs b/src/dead_letters.rs index 9443dbf..8e0a4df 100644 --- a/src/dead_letters.rs +++ b/src/dead_letters.rs @@ -4,8 +4,10 @@ use chrono::prelude::*; use core::fmt::Debug; use deltalake::parquet::errors::ParquetError; use deltalake::{DeltaTable, DeltaTableError}; +#[cfg(feature = "s3")] use dynamodb_lock::dynamo_lock_options; use log::{error, info, warn}; +#[cfg(feature = "s3")] use maplit::hashmap; use rdkafka::message::BorrowedMessage; use serde::{Deserialize, Serialize}; @@ -13,8 +15,8 @@ use serde_json::Value; use std::collections::HashMap; use crate::{transforms::TransformError, writer::*}; -use deltalake::checkpoints::CheckpointError; +#[cfg(feature = "s3")] mod env_vars { pub(crate) const DEAD_LETTER_DYNAMO_LOCK_PARTITION_KEY_VALUE: &str = "DEAD_LETTER_DYNAMO_LOCK_PARTITION_KEY_VALUE"; @@ -44,7 +46,10 @@ impl DeadLetter { base64_bytes: Some(base64::encode(bytes)), json_string: None, error: Some(err), - timestamp: timestamp.timestamp_nanos() / 1000, + timestamp: timestamp + .timestamp_nanos_opt() + .expect("Failed to convert timezone to nanoseconds") + / 1000, } } @@ -56,7 +61,10 @@ impl DeadLetter { base64_bytes: None, json_string: Some(value.to_string()), error: Some(err.to_string()), - timestamp: timestamp.timestamp_nanos() / 1000, + timestamp: timestamp + .timestamp_nanos_opt() + .expect("Failed to convert timezone to nanoseconds") + / 1000, } } @@ -69,7 +77,10 @@ impl DeadLetter { base64_bytes: None, json_string: Some(value.to_string()), error: Some(err.to_string()), - timestamp: timestamp.timestamp_nanos() / 1000, + timestamp: timestamp + .timestamp_nanos_opt() + .expect("Failed to convert timezone to nanoseconds") + / 1000, } } @@ -108,14 +119,6 @@ pub enum DeadLetterQueueError { source: TransformError, }, - /// Error occurred when writing a delta log checkpoint. - #[error("CheckpointErrorError error: {source}")] - CheckpointErrorError { - /// The wrapped [`CheckpointError`] - #[from] - source: CheckpointError, - }, - /// DeltaTable returned an error. #[error("DeltaTable interaction failed: {source}")] DeltaTable { @@ -148,7 +151,7 @@ pub(crate) struct DeadLetterQueueOptions { /// The [LoggingDeadLetterQueue] is intended for local development only /// and is not provided by the [dlq_from_opts] factory method. #[async_trait] -pub(crate) trait DeadLetterQueue: Send + Sync { +pub(crate) trait DeadLetterQueue: Send { /// Writes one [DeadLetter] to the [DeadLetterQueue]. async fn write_dead_letter( &mut self, @@ -246,10 +249,14 @@ impl DeltaSinkDeadLetterQueue { ) -> Result { match &options.delta_table_uri { Some(table_uri) => { + #[cfg(feature = "s3")] let opts = hashmap! { dynamo_lock_options::DYNAMO_LOCK_PARTITION_KEY_VALUE.to_string() => std::env::var(env_vars::DEAD_LETTER_DYNAMO_LOCK_PARTITION_KEY_VALUE) .unwrap_or_else(|_| "kafka_delta_ingest-dead_letters".to_string()), }; + #[cfg(feature = "azure")] + let opts = HashMap::default(); + let table = crate::delta_helpers::load_table(table_uri, opts.clone()).await?; let delta_writer = DataWriter::for_table(&table, opts)?; diff --git a/src/delta_helpers.rs b/src/delta_helpers.rs index 9862fcd..b7c7437 100644 --- a/src/delta_helpers.rs +++ b/src/delta_helpers.rs @@ -1,7 +1,6 @@ use crate::{DataTypeOffset, DataTypePartition}; -use deltalake::action::{Action, Add, Txn}; -use deltalake::checkpoints::CheckpointError; -use deltalake::{DeltaDataTypeVersion, DeltaTable, DeltaTableError}; +use deltalake::protocol::{Action, Add, Txn}; +use deltalake::{DeltaTable, DeltaTableError}; use std::collections::HashMap; pub(crate) async fn load_table( @@ -42,8 +41,8 @@ pub(crate) fn create_txn_action(txn_app_id: String, offset: DataTypeOffset) -> A pub(crate) async fn try_create_checkpoint( table: &mut DeltaTable, - version: DeltaDataTypeVersion, -) -> Result<(), CheckpointError> { + version: i64, +) -> Result<(), DeltaTableError> { if version % 10 == 0 { let table_version = table.version(); // if there's new version right after current commit, then we need to reset @@ -73,7 +72,7 @@ pub(crate) fn txn_app_id_for_partition(app_id: &str, partition: DataTypePartitio } /// Returns the last transaction version for the given transaction id recorded in the delta table. -pub(crate) fn last_txn_version(table: &DeltaTable, txn_id: &str) -> Option { +pub(crate) fn last_txn_version(table: &DeltaTable, txn_id: &str) -> Option { table .get_app_transaction_version() .get(txn_id) diff --git a/src/lib.rs b/src/lib.rs index cbe277f..b165125 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,7 +17,9 @@ extern crate strum_macros; extern crate serde_json; use coercions::CoercionTree; -use deltalake::{DeltaDataTypeVersion, DeltaTable, DeltaTableError}; +use deltalake::protocol::DeltaOperation; +use deltalake::protocol::OutputMode; +use deltalake::{DeltaTable, DeltaTableError}; use futures::stream::StreamExt; use log::{debug, error, info, warn}; use rdkafka::{ @@ -58,7 +60,6 @@ use crate::{ writer::{DataWriter, DataWriterError}, }; use delta_helpers::*; -use deltalake::checkpoints::CheckpointError; use rdkafka::message::BorrowedMessage; use std::ops::Add; @@ -100,14 +101,6 @@ pub enum IngestError { source: Box, }, - /// Error occurred when writing a delta log checkpoint. - #[error("CheckpointErrorError error: {source}")] - CheckpointErrorError { - /// The wrapped [`CheckpointError`] - #[from] - source: CheckpointError, - }, - /// Error from [`WriteOffsetsError`] #[error("WriteOffsets error: {source}")] WriteOffsets { @@ -201,9 +194,9 @@ pub enum IngestError { #[error("Committed delta version {actual_version} does not match the version specified in the commit attempt {expected_version}")] UnexpectedVersionMismatch { /// The version specified in the commit attempt - expected_version: DeltaDataTypeVersion, + expected_version: i64, /// The version returned after the commit - actual_version: DeltaDataTypeVersion, + actual_version: i64, }, /// Error returned if unable to construct a deserializer #[error("Unable to construct a message deserializer, source: {source}")] @@ -214,7 +207,7 @@ pub enum IngestError { } /// Formats for message parsing -#[derive(Clone)] +#[derive(Clone, Debug)] pub enum MessageFormat { /// Parses messages as json and uses the inferred schema DefaultJson, @@ -227,7 +220,7 @@ pub enum MessageFormat { } /// Source for schema -#[derive(Clone)] +#[derive(Clone, Debug)] pub enum SchemaSource { /// Use default behavior None, @@ -239,6 +232,7 @@ pub enum SchemaSource { File(PathBuf), } +#[derive(Clone, Debug)] /// The enum to represent 'auto.offset.reset' options. pub enum AutoOffsetReset { /// The "earliest" option. Messages will be ingested from the beginning of a partition on reset. @@ -253,6 +247,7 @@ impl AutoOffsetReset { } /// Options for configuring the behavior of the run loop executed by the [`start_ingest`] function. +#[derive(Clone, Debug)] pub struct IngestOptions { /// The Kafka broker string to connect to. pub kafka_brokers: String, @@ -303,7 +298,7 @@ pub struct IngestOptions { impl Default for IngestOptions { fn default() -> Self { IngestOptions { - kafka_brokers: "localhost:9092".to_string(), + kafka_brokers: std::env::var("KAFKA_BROKERS").unwrap_or("localhost:9092".into()), consumer_group_id: "kafka_delta_ingest".to_string(), app_id: "kafka_delta_ingest".to_string(), seek_offsets: None, @@ -387,6 +382,7 @@ pub async fn start_ingest( // The run loop loop { + debug!("running the runloop"); // Consume the next message from the stream. // Timeout if the next message is not received before the next flush interval. let duration = ingest_processor.consume_timeout_duration(); @@ -422,6 +418,7 @@ pub async fn start_ingest( // Startup can take significant time, // so re-initialize the latency timer after consuming the first message. if consumed == 0 { + debug!("Latency timer reset "); ingest_processor.latency_timer = Instant::now(); } @@ -447,7 +444,7 @@ pub async fn start_ingest( } } Err(_) => { - log::debug!("Latency timer expired."); + log::error!("Latency timer expired."); // Set the latency timer expired flag to indicate that // that the latency timer should be reset after flush checks. latency_timer_expired = true; @@ -511,6 +508,7 @@ pub async fn start_ingest( // Reset it to now so we don't run flush checks again // until the next appropriate interval. if latency_timer_expired { + debug!("latency timer expired, resetting"); ingest_processor.latency_timer = Instant::now(); } @@ -983,8 +981,8 @@ impl IngestProcessor { match deltalake::operations::transaction::commit( (self.table.object_store().storage_backend()).as_ref(), &actions, - deltalake::action::DeltaOperation::StreamingUpdate { - output_mode: deltalake::action::OutputMode::Append, + DeltaOperation::StreamingUpdate { + output_mode: OutputMode::Append, query_id: self.opts.app_id.clone(), epoch_id, }, @@ -1112,10 +1110,13 @@ impl IngestProcessor { /// Returns a boolean indicating whether a record batch should be written based on current state. fn should_complete_record_batch(&self) -> bool { let elapsed_millis = self.latency_timer.elapsed().as_millis(); + debug!("latency_timer {:?}", self.latency_timer); + debug!("elapsed_millis: {:?}", elapsed_millis); + debug!("Value buffers has {} items", self.value_buffers.len()); let should = self.value_buffers.len() > 0 - && (self.value_buffers.len() == self.opts.max_messages_per_batch - || elapsed_millis >= (self.opts.allowed_latency * 1000) as u128); + && (self.value_buffers.len() == self.opts.max_messages_per_batch) + || (elapsed_millis >= (self.opts.allowed_latency * 1000) as u128); debug!( "Should complete record batch - latency test: {} >= {}", diff --git a/src/main.rs b/src/main.rs index 0ee6b89..b9fdcb8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -534,18 +534,18 @@ mod test { let values = ["-e", "--ends_at_latest_offsets"]; for value in values { let subcommand = get_subcommand_matches_raw(vec![value]); - assert_eq!(true, subcommand.contains_id("end")); - assert_eq!(true, subcommand.get_flag("end")); + assert!(subcommand.contains_id("end")); + assert!(subcommand.get_flag("end")); } let subcommand = get_subcommand_matches_raw(vec![]); - assert_eq!(true, subcommand.contains_id("end")); - assert_eq!(false, subcommand.get_flag("end")); + assert!(subcommand.contains_id("end")); + assert!(!subcommand.get_flag("end")); } fn get_subcommand_matches(args: Vec<&str>) -> Result { let arg_matches = get_subcommand_matches_raw(args); - return convert_matches_to_message_format(&arg_matches); + convert_matches_to_message_format(&arg_matches) } fn get_subcommand_matches_raw(args: Vec<&str>) -> ArgMatches { diff --git a/src/offsets.rs b/src/offsets.rs index 7bf5413..e5b4239 100644 --- a/src/offsets.rs +++ b/src/offsets.rs @@ -1,7 +1,9 @@ use crate::delta_helpers::*; use crate::{DataTypeOffset, DataTypePartition}; -use deltalake::action::Action; -use deltalake::{DeltaDataTypeTimestamp, DeltaTable, DeltaTableError}; +use deltalake::protocol::Action; +use deltalake::protocol::DeltaOperation; +use deltalake::protocol::OutputMode; +use deltalake::{DeltaTable, DeltaTableError}; use log::{error, info}; /// Errors returned by `write_offsets_to_delta` function. @@ -107,7 +109,7 @@ async fn commit_partition_offsets( .iter() .map(|(txn_id, offset)| create_txn_action(txn_id.to_string(), *offset)) .collect(); - let epoch_id: DeltaDataTypeTimestamp = std::time::SystemTime::now() + let epoch_id = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .expect("Time went backwards") .as_millis() as i64; @@ -116,8 +118,8 @@ async fn commit_partition_offsets( match deltalake::operations::transaction::commit( (table.object_store().storage_backend()).as_ref(), &actions, - deltalake::action::DeltaOperation::StreamingUpdate { - output_mode: deltalake::action::OutputMode::Complete, + DeltaOperation::StreamingUpdate { + output_mode: OutputMode::Complete, query_id: app_id, epoch_id, }, diff --git a/src/transforms.rs b/src/transforms.rs index e9da554..b4803b6 100644 --- a/src/transforms.rs +++ b/src/transforms.rs @@ -495,12 +495,7 @@ mod tests { let new_value_path = ValuePath::from_str("name.first"); let new_value = Value::String("John".to_string()); - set_value( - &mut val.as_object_mut().unwrap(), - &new_value_path, - 0, - new_value, - ); + set_value(val.as_object_mut().unwrap(), &new_value_path, 0, new_value); assert_eq!( json!({ @@ -539,7 +534,7 @@ mod tests { let transformer = Transformer::from_transforms(&transforms).unwrap(); - let _ = transformer + transformer .transform(&mut test_value, Some(&test_message)) .unwrap(); @@ -610,7 +605,7 @@ mod tests { let transformer = Transformer::from_transforms(&transforms).unwrap(); - let _ = transformer + transformer .transform(&mut test_value, Some(&test_message)) .unwrap(); @@ -677,9 +672,9 @@ mod tests { "kafka.timestamp_type".to_string(), ); - let transformer = Transformer::from_transforms(&&transforms).unwrap(); + let transformer = Transformer::from_transforms(&transforms).unwrap(); - let _ = transformer + transformer .transform(&mut test_value, Some(&test_message)) .unwrap(); diff --git a/src/writer.rs b/src/writer.rs index edc884b..a2ad0bf 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -12,21 +12,22 @@ use deltalake::arrow::{ json::reader::ReaderBuilder, record_batch::*, }; - use deltalake::parquet::format::FileMetaData; use deltalake::parquet::{ arrow::ArrowWriter, basic::{Compression, LogicalType}, errors::ParquetError, file::{metadata::RowGroupMetaData, properties::WriterProperties, statistics::Statistics}, + format::TimeUnit, schema::types::{ColumnDescriptor, SchemaDescriptor}, }; +use deltalake::protocol::DeltaOperation; +use deltalake::protocol::SaveMode; use deltalake::{ - action::{Action, Add, ColumnCountStat, ColumnValueStat, Stats}, + protocol::{Action, Add, ColumnCountStat, ColumnValueStat, Stats}, storage::DeltaObjectStore, - time_utils::timestamp_to_delta_stats_string, - DeltaDataTypeLong, DeltaDataTypeVersion, DeltaResult, DeltaTable, DeltaTableError, - DeltaTableMetaData, ObjectStoreError, Schema, + table::DeltaTableMetaData, + DeltaResult, DeltaTable, DeltaTableError, ObjectStoreError, Schema, }; use log::{error, info, warn}; use serde_json::{Number, Value}; @@ -429,7 +430,18 @@ impl DataWriter { /// Returns the current byte length of the in memory buffer. /// This may be used by the caller to decide when to finalize the file write. pub fn buffer_len(&self) -> usize { - self.arrow_writers.values().map(|w| w.cursor.len()).sum() + self.arrow_writers + .values() + .map(|w| { + let l: i64 = w + .arrow_writer + .flushed_row_groups() + .iter() + .map(|rg| rg.total_byte_size()) + .sum(); + l as usize + }) + .sum() } /// Writes the existing parquet bytes to storage and resets internal state to handle another file. @@ -570,15 +582,15 @@ impl DataWriter { &mut self, table: &mut DeltaTable, values: Vec, - ) -> Result> { + ) -> Result> { self.write(values).await?; let mut adds = self.write_parquet_files(&table.table_uri()).await?; let actions = adds.drain(..).map(Action::add).collect(); let version = deltalake::operations::transaction::commit( (table.object_store().storage_backend()).as_ref(), &actions, - deltalake::action::DeltaOperation::Write { - mode: deltalake::action::SaveMode::Append, + DeltaOperation::Write { + mode: SaveMode::Append, partition_by: Some(self.partition_columns.clone()), predicate: None, }, @@ -800,7 +812,7 @@ fn apply_null_counts_for_column( match col_struct { ColumnCountStat::Value(n) => { - let null_count = column.null_count() as DeltaDataTypeLong; + let null_count = column.null_count() as i64; let n = null_count + *n; null_counts.insert(key, ColumnCountStat::Value(n)); } @@ -1087,6 +1099,7 @@ fn create_add( stats: Some(stats_string), stats_parsed: None, tags: None, + ..Default::default() }) } @@ -1148,6 +1161,19 @@ fn stringified_partition_value( Ok(Some(s)) } +/// Vendored from delta-rs since it's no longer a public API +fn timestamp_to_delta_stats_string(n: i64, time_unit: &TimeUnit) -> Option { + use deltalake::arrow::temporal_conversions; + + let dt = match time_unit { + TimeUnit::MILLIS(_) => temporal_conversions::timestamp_ms_to_datetime(n), + TimeUnit::MICROS(_) => temporal_conversions::timestamp_us_to_datetime(n), + TimeUnit::NANOS(_) => temporal_conversions::timestamp_ns_to_datetime(n), + }?; + + Some(format!("{}", dt.format("%Y-%m-%dT%H:%M:%S%.3fZ"))) +} + #[cfg(test)] mod tests { use super::*; @@ -1198,7 +1224,7 @@ mod tests { assert_eq!("2021-06-22", timestamp.as_str().unwrap()); } ("some_int", ColumnValueStat::Value(v)) => assert_eq!(302, v.as_i64().unwrap()), - ("some_bool", ColumnValueStat::Value(v)) => assert_eq!(false, v.as_bool().unwrap()), + ("some_bool", ColumnValueStat::Value(v)) => assert!(!v.as_bool().unwrap()), ("some_string", ColumnValueStat::Value(v)) => { assert_eq!("GET", v.as_str().unwrap()) } @@ -1226,7 +1252,7 @@ mod tests { assert_eq!("2021-06-22", timestamp.as_str().unwrap()); } ("some_int", ColumnValueStat::Value(v)) => assert_eq!(400, v.as_i64().unwrap()), - ("some_bool", ColumnValueStat::Value(v)) => assert_eq!(true, v.as_bool().unwrap()), + ("some_bool", ColumnValueStat::Value(v)) => assert!(v.as_bool().unwrap()), ("some_string", ColumnValueStat::Value(v)) => { assert_eq!("PUT", v.as_str().unwrap()) } @@ -1267,8 +1293,8 @@ mod tests { fn create_temp_table(table_path: &Path) { let log_path = table_path.join("_delta_log"); - let _ = std::fs::create_dir(log_path.as_path()).unwrap(); - let _ = std::fs::write( + std::fs::create_dir(log_path.as_path()).unwrap(); + std::fs::write( log_path.join("00000000000000000000.json"), V0_COMMIT.as_str(), ) diff --git a/tests/buffer_flush_tests.rs b/tests/buffer_flush_tests.rs index 9ad9254..88049d2 100644 --- a/tests/buffer_flush_tests.rs +++ b/tests/buffer_flush_tests.rs @@ -1,7 +1,6 @@ #[allow(dead_code)] mod helpers; -use deltalake; use log::info; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -29,6 +28,7 @@ async fn test_flush_when_latency_expires() { max_messages_per_batch: 5000, // large value - avoid flushing on file size min_bytes_per_file: 1000000, + kafka_brokers: helpers::test_broker(), ..Default::default() }), ) @@ -76,6 +76,7 @@ async fn test_dont_write_an_empty_buffer() { app_id: "dont_write_an_empty_buffer".to_string(), // buffer for 5 seconds before flush allowed_latency: 5, + kafka_brokers: helpers::test_broker(), ..Default::default() }), ) @@ -124,6 +125,7 @@ async fn test_flush_on_size_without_latency_expiration() { max_messages_per_batch: 10, // tiny buffer size for write flush min_bytes_per_file: 20, + kafka_brokers: helpers::test_broker(), ..Default::default() }), ) diff --git a/tests/dead_letter_tests.rs b/tests/dead_letter_tests.rs index d05ca07..0b9082a 100644 --- a/tests/dead_letter_tests.rs +++ b/tests/dead_letter_tests.rs @@ -1,7 +1,7 @@ use kafka_delta_ingest::IngestOptions; use log::info; use serde::{Deserialize, Serialize}; -use serde_json; + use serde_json::json; use serde_json::Value; use uuid::Uuid; diff --git a/tests/delta_partitions_tests.rs b/tests/delta_partitions_tests.rs index cb3b8bf..de08236 100644 --- a/tests/delta_partitions_tests.rs +++ b/tests/delta_partitions_tests.rs @@ -1,7 +1,7 @@ #[allow(dead_code)] mod helpers; -use deltalake::action::{Action, Add}; +use deltalake::protocol::{Action, Add, DeltaOperation, SaveMode}; use kafka_delta_ingest::writer::*; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; @@ -73,21 +73,21 @@ async fn test_delta_partitions() { { Some("red") => { assert!(add.path.starts_with("color=red")); - assert_eq!(&get_stats_value(&add, "numRecords"), "4"); - assert_eq!(msg(get_stats_value(&add, "minValues")).id, 1); - assert_eq!(msg(get_stats_value(&add, "maxValues")).id, 6); + assert_eq!(&get_stats_value(add, "numRecords"), "4"); + assert_eq!(msg(get_stats_value(add, "minValues")).id, 1); + assert_eq!(msg(get_stats_value(add, "maxValues")).id, 6); } Some("blue") => { assert!(add.path.starts_with("color=blue")); - assert_eq!(&get_stats_value(&add, "numRecords"), "4"); - assert_eq!(msg(get_stats_value(&add, "minValues")).id, 3); - assert_eq!(msg(get_stats_value(&add, "maxValues")).id, 8); + assert_eq!(&get_stats_value(add, "numRecords"), "4"); + assert_eq!(msg(get_stats_value(add, "minValues")).id, 3); + assert_eq!(msg(get_stats_value(add, "maxValues")).id, 8); } None => { assert!(add.path.starts_with("color=__HIVE_DEFAULT_PARTITION__")); - assert_eq!(&get_stats_value(&add, "numRecords"), "1"); - assert_eq!(msg(get_stats_value(&add, "minValues")).id, 9); - assert_eq!(msg(get_stats_value(&add, "maxValues")).id, 9); + assert_eq!(&get_stats_value(add, "numRecords"), "1"); + assert_eq!(msg(get_stats_value(add, "minValues")).id, 9); + assert_eq!(msg(get_stats_value(add, "maxValues")).id, 9); } other => { panic!("{:?}", other); @@ -95,9 +95,21 @@ async fn test_delta_partitions() { } } - let mut tx = table.create_transaction(None); - tx.add_actions(result.iter().cloned().map(Action::add).collect()); - let version = tx.commit(None, None).await.unwrap(); + let operation = DeltaOperation::Write { + mode: SaveMode::Append, + partition_by: None, + predicate: None, + }; + + let version = deltalake::operations::transaction::commit( + &*table.object_store(), + &result.iter().cloned().map(Action::add).collect(), + operation, + &table.state, + None, + ) + .await + .expect("Failed to create transaction"); deltalake::checkpoints::create_checkpoint(&table) .await diff --git a/tests/deserialization_tests.rs b/tests/deserialization_tests.rs index 48efe2b..b1cead2 100644 --- a/tests/deserialization_tests.rs +++ b/tests/deserialization_tests.rs @@ -299,7 +299,7 @@ struct TestMsg { } fn default_settings() -> SrSettings { - SrSettings::new(String::from(String::from(SCHEMA_REGISTRY_ADDRESS))) + SrSettings::new(String::from(SCHEMA_REGISTRY_ADDRESS)) } async fn avro_encode(item: impl Serialize, topic: String) -> Result, SRCError> { diff --git a/tests/emails_azure_blob_tests.rs b/tests/emails_azure_blob_tests.rs index 1679598..4f5aab2 100644 --- a/tests/emails_azure_blob_tests.rs +++ b/tests/emails_azure_blob_tests.rs @@ -1,34 +1,21 @@ +#![cfg(feature = "azure")] #[allow(dead_code)] mod helpers; use std::collections::HashMap; use std::env; -use std::sync::Arc; use std::thread; use std::time::Duration; - -use azure_storage::{prelude::BlobSasPermissions, shared_access_signature::SasProtocol}; use time::OffsetDateTime; -use tokio::runtime::Runtime; -use chrono::prelude::*; -use serde_json::json; use serial_test::serial; -use tokio_util::sync::CancellationToken; use uuid::Uuid; -use kafka_delta_ingest::{start_ingest, IngestOptions}; -use tokio::task::JoinHandle; +use kafka_delta_ingest::IngestOptions; -const TEST_S3_BUCKET: &str = "tests"; -const TEST_APP_ID: &str = "emails_test"; -const TEST_BROKER: &str = "0.0.0.0:9092"; -const TEST_CONSUMER_GROUP_ID: &str = "kafka_delta_ingest_emails"; -const TEST_PARTITIONS: i32 = 4; -const TEST_TOTAL_MESSAGES: i32 = 200; +use helpers::*; -const WORKER_1: &str = "WORKER-1"; -const WORKER_2: &str = "WORKER-2"; +use azure_storage::{prelude::BlobSasPermissions, shared_access_signature::SasProtocol}; #[tokio::test(flavor = "multi_thread")] #[serial] @@ -42,18 +29,14 @@ async fn when_rebalance_happens_azure() { run_emails_s3_tests(true).await; } -struct TestScope { - pub topic: String, - pub table: String, - pub workers_token: Arc, - pub runtime: HashMap<&'static str, Runtime>, -} - async fn run_emails_s3_tests(initiate_rebalance: bool) { helpers::init_logger(); - let scope = TestScope::new().await; + let topic = format!("emails_azure-{}", Uuid::new_v4()); + let table = prepare_table(&topic).await; + let options = create_options(); + let scope = TestScope::new(&topic, &table, options).await; - let w1 = scope.create_and_start(WORKER_1).await; + let w1 = scope.create_and_start(helpers::WORKER_1).await; // in order to initiate rebalance we first send messages, // ensure that worker 1 consumes some of them and then create worker 2, @@ -61,9 +44,9 @@ async fn run_emails_s3_tests(initiate_rebalance: bool) { let w2 = if initiate_rebalance { scope.send_messages(TEST_TOTAL_MESSAGES).await; thread::sleep(Duration::from_secs(1)); - scope.create_and_start(WORKER_2).await + scope.create_and_start(helpers::WORKER_2).await } else { - let w = scope.create_and_start(WORKER_2).await; + let w = scope.create_and_start(helpers::WORKER_2).await; thread::sleep(Duration::from_secs(4)); scope.send_messages(TEST_TOTAL_MESSAGES).await; w @@ -71,12 +54,12 @@ async fn run_emails_s3_tests(initiate_rebalance: bool) { // this will end up with more app_ids than actual, // since we're not sure which partitions will get each worker - let partitions = create_partitions_app_ids(TEST_PARTITIONS); + let partitions = create_partitions_app_ids(helpers::TEST_PARTITIONS); // wait until the destination table will get every expected message, we check this summing up // the each offset of each partition to get the TOTAL_MESSAGES value scope - .wait_on_total_offset(partitions, TEST_TOTAL_MESSAGES) + .wait_on_total_offset(partitions, helpers::TEST_TOTAL_MESSAGES) .await; println!("Waiting on workers futures to exit..."); @@ -91,144 +74,9 @@ async fn run_emails_s3_tests(initiate_rebalance: bool) { scope.shutdown(); } -impl TestScope { - async fn new() -> Self { - let topic = format!("emails-{}", Uuid::new_v4()); - let table = prepare_table(&topic).await; - let workers_token = Arc::new(CancellationToken::new()); - let mut runtime = HashMap::new(); - runtime.insert(WORKER_1, helpers::create_runtime(WORKER_1)); - runtime.insert(WORKER_2, helpers::create_runtime(WORKER_2)); - - println!("Topic: {}", &topic); - println!("Table: {}", &table); - helpers::create_topic(topic.as_str(), TEST_PARTITIONS).await; - - Self { - topic, - table, - workers_token, - runtime, - } - } - - fn shutdown(self) { - for (_, rt) in self.runtime { - rt.shutdown_background() - } - } - - async fn create_and_start(&self, name: &str) -> JoinHandle<()> { - let rt = self.runtime.get(name).unwrap(); - let topic = self.topic.clone(); - let table = self.table.clone(); - let options = self.create_options(); - let token = self.workers_token.clone(); - rt.spawn(async move { - let res = start_ingest(topic, table, options, token.clone()).await; - res.unwrap_or_else(|e| println!("AN ERROR OCCURED: {}", e)); - println!("Ingest process exited"); - - token.cancel(); - }) - } - - fn create_options(&self) -> IngestOptions { - env::set_var("AZURE_STORAGE_USE_EMULATOR", "true"); - env::set_var("AZURE_ACCOUNT_NAME", "devstoreaccount1"); - env::set_var("AZURE_ACCESS_KEY", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="); - env::set_var("AZURE_STORAGE_CONTAINER_NAME", "tests"); - env::set_var("AZURE_STORAGE_ALLOW_HTTP", "1"); - env::set_var("AZURITE_BLOB_STORAGE_URL", "http://127.0.0.1:10000"); - env::set_var( - "AZURE_STORAGE_CONNECTION_STRING", - "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://localhost:10000/devstoreaccount1;QueueEndpoint=http://localhost:10001/devstoreaccount1;"); - - let mut additional_kafka_settings = HashMap::new(); - additional_kafka_settings.insert("auto.offset.reset".to_string(), "earliest".to_string()); - let additional_kafka_settings = Some(additional_kafka_settings); - - let allowed_latency = 2; - let max_messages_per_batch = 10; - let min_bytes_per_file = 370; - - let mut transforms = HashMap::new(); - transforms.insert("date".to_string(), "substr(timestamp,`0`,`10`)".to_string()); - transforms.insert("_kafka_offset".to_string(), "kafka.offset".to_string()); - - IngestOptions { - transforms, - kafka_brokers: TEST_BROKER.to_string(), - consumer_group_id: TEST_CONSUMER_GROUP_ID.to_string(), - app_id: TEST_APP_ID.to_string(), - additional_kafka_settings, - allowed_latency, - max_messages_per_batch, - min_bytes_per_file, - write_checkpoints: true, - ..Default::default() - } - } - - async fn send_messages(&self, amount: i32) { - let producer = helpers::create_producer(); - let now: DateTime = Utc::now(); - - println!("Sending {} messages to {}", amount, &self.topic); - for n in 0..amount { - let json = &json!({ - "id": n.to_string(), - "sender": format!("sender-{}@example.com", n), - "recipient": format!("recipient-{}@example.com", n), - "timestamp": (now + chrono::Duration::seconds(1)).to_rfc3339_opts(SecondsFormat::Secs, true), - }); - helpers::send_json(&producer, &self.topic, &json).await; - } - println!("All messages are sent"); - } - - async fn wait_on_total_offset(&self, apps: Vec, offset: i32) { - let mut table = deltalake::open_table(&self.table).await.unwrap(); - let expected_total = offset - TEST_PARTITIONS; - loop { - table.update().await.unwrap(); - let mut total = 0; - for key in apps.iter() { - total += table - .get_app_transaction_version() - .get(key) - .map(|x| *x) - .unwrap_or(0); - } - - if total >= expected_total as i64 { - self.workers_token.cancel(); - println!("All messages are in delta"); - return; - } - - println!("Expecting offsets in delta {}/{}...", total, expected_total); - tokio::time::sleep(Duration::from_secs(1)).await; - } - } - - async fn validate_data(&self) { - let table = deltalake::open_table(&self.table).await.unwrap(); - let result = helpers::read_files_from_store(&table).await; - let r: Vec = (0..TEST_TOTAL_MESSAGES).collect(); - println!("Got messages {}/{}", result.len(), TEST_TOTAL_MESSAGES); - - if result.len() != TEST_TOTAL_MESSAGES as usize { - helpers::inspect_table(&self.table).await; - } - - assert_eq!(result, r); - } -} - async fn prepare_table(topic: &str) -> String { - let container_client = - azure_storage_blobs::prelude::ClientBuilder::emulator().container_client(TEST_S3_BUCKET); + let container_client = azure_storage_blobs::prelude::ClientBuilder::emulator() + .container_client(helpers::test_s3_bucket()); let source_blob = container_client.blob_client(format!("emails/_delta_log/00000000000000000000.json")); let sas_url = { @@ -253,13 +101,53 @@ async fn prepare_table(topic: &str) -> String { .await .unwrap(); - format!("az://{}/{}", TEST_S3_BUCKET, topic) + format!("az://{}/{}", helpers::test_s3_bucket(), topic) } fn create_partitions_app_ids(num_p: i32) -> Vec { let mut vector = Vec::new(); for n in 0..num_p { - vector.push(format!("{}-{}", TEST_APP_ID, n)); + vector.push(format!("{}-{}", helpers::TEST_APP_ID, n)); } vector } + +fn create_options() -> IngestOptions { + env::set_var("AZURE_STORAGE_USE_EMULATOR", "true"); + env::set_var("AZURE_ACCOUNT_NAME", "devstoreaccount1"); + env::set_var( + "AZURE_ACCESS_KEY", + "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==", + ); + env::set_var("AZURE_STORAGE_CONTAINER_NAME", "tests"); + env::set_var("AZURE_STORAGE_ALLOW_HTTP", "1"); + env::set_var("AZURITE_BLOB_STORAGE_URL", "http://127.0.0.1:10000"); + env::set_var( + "AZURE_STORAGE_CONNECTION_STRING", + "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://localhost:10000/devstoreaccount1;QueueEndpoint=http://localhost:10001/devstoreaccount1;"); + + let mut additional_kafka_settings = HashMap::new(); + additional_kafka_settings.insert("auto.offset.reset".to_string(), "earliest".to_string()); + let additional_kafka_settings = Some(additional_kafka_settings); + + let allowed_latency = 2; + let max_messages_per_batch = 10; + let min_bytes_per_file = 370; + + let mut transforms = HashMap::new(); + transforms.insert("date".to_string(), "substr(timestamp,`0`,`10`)".to_string()); + transforms.insert("_kafka_offset".to_string(), "kafka.offset".to_string()); + + IngestOptions { + transforms, + kafka_brokers: helpers::test_broker(), + consumer_group_id: TEST_CONSUMER_GROUP_ID.to_string(), + app_id: TEST_APP_ID.to_string(), + additional_kafka_settings, + allowed_latency, + max_messages_per_batch, + min_bytes_per_file, + write_checkpoints: true, + ..Default::default() + } +} diff --git a/tests/emails_s3_tests.rs b/tests/emails_s3_tests.rs index 853d05b..1c22191 100644 --- a/tests/emails_s3_tests.rs +++ b/tests/emails_s3_tests.rs @@ -1,35 +1,22 @@ +#![cfg(feature = "s3")] + #[allow(dead_code)] mod helpers; use std::collections::HashMap; use std::env; -use std::sync::Arc; +use std::io::Read; use std::thread; use std::time::Duration; -use tokio::runtime::Runtime; - -use chrono::prelude::*; -use serde_json::json; use serial_test::serial; -use tokio_util::sync::CancellationToken; use uuid::Uuid; -use kafka_delta_ingest::{start_ingest, IngestOptions}; +use kafka_delta_ingest::IngestOptions; use rusoto_core::Region; -use rusoto_s3::{CopyObjectRequest, S3}; -use tokio::task::JoinHandle; - -const TEST_S3_ENDPOINT: &str = "http://localhost:4566"; -const TEST_S3_BUCKET: &str = "tests"; -const TEST_APP_ID: &str = "emails_test"; -const TEST_BROKER: &str = "0.0.0.0:9092"; -const TEST_CONSUMER_GROUP_ID: &str = "kafka_delta_ingest_emails"; -const TEST_PARTITIONS: i32 = 4; -const TEST_TOTAL_MESSAGES: i32 = 200; +use rusoto_s3::{CopyObjectRequest, PutObjectRequest, S3}; -const WORKER_1: &str = "WORKER-1"; -const WORKER_2: &str = "WORKER-2"; +use helpers::*; #[tokio::test(flavor = "multi_thread")] #[serial] @@ -43,16 +30,12 @@ async fn when_rebalance_happens() { run_emails_s3_tests(true).await; } -struct TestScope { - pub topic: String, - pub table: String, - pub workers_token: Arc, - pub runtime: HashMap<&'static str, Runtime>, -} - async fn run_emails_s3_tests(initiate_rebalance: bool) { helpers::init_logger(); - let scope = TestScope::new().await; + let topic = format!("emails_s3-{}", Uuid::new_v4()); + let table = prepare_table(&topic).await; + let options = create_options(helpers::WORKER_1); + let scope = TestScope::new(&topic, &table, options).await; let w1 = scope.create_and_start(WORKER_1).await; @@ -92,164 +75,90 @@ async fn run_emails_s3_tests(initiate_rebalance: bool) { scope.shutdown(); } -impl TestScope { - async fn new() -> Self { - let topic = format!("emails-{}", Uuid::new_v4()); - let table = prepare_table(&topic).await; - let workers_token = Arc::new(CancellationToken::new()); - let mut runtime = HashMap::new(); - runtime.insert(WORKER_1, helpers::create_runtime(WORKER_1)); - runtime.insert(WORKER_2, helpers::create_runtime(WORKER_2)); - - println!("Topic: {}", &topic); - println!("Table: {}", &table); - helpers::create_topic(topic.as_str(), TEST_PARTITIONS).await; - - Self { - topic, - table, - workers_token, - runtime, - } - } - - fn shutdown(self) { - for (_, rt) in self.runtime { - rt.shutdown_background() - } - } - - async fn create_and_start(&self, name: &str) -> JoinHandle<()> { - let rt = self.runtime.get(name).unwrap(); - let topic = self.topic.clone(); - let table = self.table.clone(); - let options = self.create_options(name); - let token = self.workers_token.clone(); - rt.spawn(async move { - let res = start_ingest(topic, table, options, token.clone()).await; - res.unwrap_or_else(|e| println!("AN ERROR OCCURED: {}", e)); - println!("Ingest process exited"); - - token.cancel(); - }) - } - - fn create_options(&self, name: &str) -> IngestOptions { - env::set_var("AWS_S3_LOCKING_PROVIDER", "dynamodb"); - env::set_var("AWS_REGION", "us-east-2"); - env::set_var("AWS_STORAGE_ALLOW_HTTP", "true"); - env::set_var("DYNAMO_LOCK_TABLE_NAME", "locks"); - env::set_var("DYNAMO_LOCK_OWNER_NAME", name); - env::set_var("DYNAMO_LOCK_PARTITION_KEY_VALUE", "emails_s3_tests"); - env::set_var("DYNAMO_LOCK_REFRESH_PERIOD_MILLIS", "100"); - env::set_var("DYNAMO_LOCK_ADDITIONAL_TIME_TO_WAIT_MILLIS", "100"); - env::set_var("DYNAMO_LOCK_LEASE_DURATION", "2"); - - let mut additional_kafka_settings = HashMap::new(); - additional_kafka_settings.insert("auto.offset.reset".to_string(), "earliest".to_string()); - let additional_kafka_settings = Some(additional_kafka_settings); - - let allowed_latency = 2; - let max_messages_per_batch = 10; - let min_bytes_per_file = 370; - - let mut transforms = HashMap::new(); - transforms.insert("date".to_string(), "substr(timestamp,`0`,`10`)".to_string()); - transforms.insert("_kafka_offset".to_string(), "kafka.offset".to_string()); - - IngestOptions { - transforms, - kafka_brokers: TEST_BROKER.to_string(), - consumer_group_id: TEST_CONSUMER_GROUP_ID.to_string(), - app_id: TEST_APP_ID.to_string(), - additional_kafka_settings, - allowed_latency, - max_messages_per_batch, - min_bytes_per_file, - write_checkpoints: true, - ..Default::default() - } - } - - async fn send_messages(&self, amount: i32) { - let producer = helpers::create_producer(); - let now: DateTime = Utc::now(); - - println!("Sending {} messages to {}", amount, &self.topic); - for n in 0..amount { - let json = &json!({ - "id": n.to_string(), - "sender": format!("sender-{}@example.com", n), - "recipient": format!("recipient-{}@example.com", n), - "timestamp": (now + chrono::Duration::seconds(1)).to_rfc3339_opts(SecondsFormat::Secs, true), - }); - helpers::send_json(&producer, &self.topic, &json).await; - } - println!("All messages are sent"); - } - - async fn wait_on_total_offset(&self, apps: Vec, offset: i32) { - let mut table = deltalake::open_table(&self.table).await.unwrap(); - let expected_total = offset - TEST_PARTITIONS; - loop { - table.update().await.unwrap(); - let mut total = 0; - for key in apps.iter() { - total += table - .get_app_transaction_version() - .get(key) - .map(|x| *x) - .unwrap_or(0); - } - - if total >= expected_total as i64 { - self.workers_token.cancel(); - println!("All messages are in delta"); - return; - } - - println!("Expecting offsets in delta {}/{}...", total, expected_total); - tokio::time::sleep(Duration::from_secs(1)).await; - } - } - - async fn validate_data(&self) { - let table = deltalake::open_table(&self.table).await.unwrap(); - let result = helpers::read_files_from_store(&table).await; - let r: Vec = (0..TEST_TOTAL_MESSAGES).collect(); - println!("Got messages {}/{}", result.len(), TEST_TOTAL_MESSAGES); - - if result.len() != TEST_TOTAL_MESSAGES as usize { - helpers::inspect_table(&self.table).await; - } - - assert_eq!(result, r); +fn create_options(name: &str) -> IngestOptions { + env::set_var("AWS_ENDPOINT_URL", helpers::test_aws_endpoint()); + env::set_var("AWS_S3_LOCKING_PROVIDER", "dynamodb"); + env::set_var("AWS_REGION", "us-east-2"); + env::set_var("AWS_STORAGE_ALLOW_HTTP", "true"); + env::set_var("DYNAMO_LOCK_TABLE_NAME", "locks"); + env::set_var("DYNAMO_LOCK_OWNER_NAME", name); + env::set_var("DYNAMO_LOCK_PARTITION_KEY_VALUE", "emails_s3_tests"); + env::set_var("DYNAMO_LOCK_REFRESH_PERIOD_MILLIS", "100"); + env::set_var("DYNAMO_LOCK_ADDITIONAL_TIME_TO_WAIT_MILLIS", "100"); + env::set_var("DYNAMO_LOCK_LEASE_DURATION", "2"); + + let mut additional_kafka_settings = HashMap::new(); + additional_kafka_settings.insert("auto.offset.reset".to_string(), "earliest".to_string()); + let additional_kafka_settings = Some(additional_kafka_settings); + + let allowed_latency = 2; + let max_messages_per_batch = 10; + let min_bytes_per_file = 370; + + let mut transforms = HashMap::new(); + transforms.insert("date".to_string(), "substr(timestamp,`0`,`10`)".to_string()); + transforms.insert("_kafka_offset".to_string(), "kafka.offset".to_string()); + + IngestOptions { + transforms, + kafka_brokers: helpers::test_broker(), + consumer_group_id: helpers::TEST_CONSUMER_GROUP_ID.to_string(), + app_id: helpers::TEST_APP_ID.to_string(), + additional_kafka_settings, + allowed_latency, + max_messages_per_batch, + min_bytes_per_file, + write_checkpoints: true, + ..Default::default() } } async fn prepare_table(topic: &str) -> String { - env::set_var("AWS_ENDPOINT_URL", helpers::LOCALSTACK_ENDPOINT); - env::set_var("AWS_ACCESS_KEY_ID", "test"); - env::set_var("AWS_SECRET_ACCESS_KEY", "test"); + match env::var("AWS_ACCESS_KEY_ID") { + Err(_) => env::set_var("AWS_ACCESS_KEY_ID", "test"), + Ok(_) => {} + } + match env::var("AWS_SECRET_ACCESS_KEY") { + Err(_) => env::set_var("AWS_SECRET_ACCESS_KEY", "test"), + Ok(_) => {} + } let s3 = rusoto_s3::S3Client::new(Region::Custom { name: "custom".to_string(), - endpoint: TEST_S3_ENDPOINT.to_string(), + endpoint: helpers::test_aws_endpoint(), }); + /* + * Copy the local fixture to create a simple delta table in storage. + */ + let mut buf = vec![]; + let _original_log = + std::fs::File::open("tests/data/emails/_delta_log/00000000000000000000.json") + .unwrap() + .read_to_end(&mut buf); + + s3.put_object(PutObjectRequest { + bucket: helpers::test_s3_bucket(), + body: Some(buf.into()), + key: "emails/_delta_log/00000000000000000000.json".into(), + ..Default::default() + }) + .await + .unwrap(); + s3.copy_object(CopyObjectRequest { - bucket: TEST_S3_BUCKET.to_string(), + bucket: helpers::test_s3_bucket(), key: format!("{}/_delta_log/00000000000000000000.json", topic), copy_source: format!( "/{}/emails/_delta_log/00000000000000000000.json", - TEST_S3_BUCKET + helpers::test_s3_bucket(), ), ..Default::default() }) .await .unwrap(); - format!("s3://{}/{}", TEST_S3_BUCKET, topic) + format!("s3://{}/{}", helpers::test_s3_bucket(), topic) } fn create_partitions_app_ids(num_p: i32) -> Vec { diff --git a/tests/end_at_last_offsets_test.rs b/tests/end_at_last_offsets_test.rs index f9573de..ec73e3c 100644 --- a/tests/end_at_last_offsets_test.rs +++ b/tests/end_at_last_offsets_test.rs @@ -63,7 +63,7 @@ async fn end_at_initial_offsets() { }, ); - helpers::wait_until_version_created(&table, 1); + helpers::wait_until_version_created(table, 1); { // check that there's 3 records in table diff --git a/tests/feed_s3_tests.rs b/tests/feed_s3_tests.rs index 477be89..e1c7e4b 100644 --- a/tests/feed_s3_tests.rs +++ b/tests/feed_s3_tests.rs @@ -91,7 +91,7 @@ async fn feed_load_test() { .collect(); ids.sort(); - let id_count = ids.iter().count(); + let id_count = ids.len(); let expected = (0..TOTAL_MESSAGES_RECEIVED).count(); if id_count != expected { @@ -138,8 +138,8 @@ fn spawn_worker( .collect(); helpers::create_kdi_with( - &topic, - &table, + topic, + table, Some(format!("WORKER-{}", id)), IngestOptions { app_id: "feed".to_string(), diff --git a/tests/helpers/mod.rs b/tests/helpers/mod.rs index 2d682d2..335bc42 100644 --- a/tests/helpers/mod.rs +++ b/tests/helpers/mod.rs @@ -1,12 +1,21 @@ +use std::collections::HashMap; +use std::env; +use std::fs::{File, OpenOptions}; +use std::io::prelude::*; +use std::io::{BufReader, Cursor}; +use std::path::Path as FilePath; +use std::sync::Arc; +use std::time::Duration; + use bytes::Buf; -use chrono::Local; -use deltalake::action::{Action, Add, MetaData, Protocol, Remove, Txn}; +use chrono::prelude::*; use deltalake::parquet::{ file::reader::{FileReader, SerializedFileReader}, record::RowAccessor, }; +use deltalake::protocol::{Action, Add, MetaData, Protocol, Remove, Txn}; use deltalake::storage::DeltaObjectStore; -use deltalake::{DeltaDataTypeVersion, DeltaTable, Path}; +use deltalake::{DeltaTable, Path}; use kafka_delta_ingest::writer::load_object_store_from_uri; use kafka_delta_ingest::{start_ingest, IngestOptions}; use rdkafka::admin::{AdminClient, AdminOptions, NewTopic, TopicReplication}; @@ -16,23 +25,29 @@ use rdkafka::util::{DefaultRuntime, Timeout}; use rdkafka::ClientConfig; use serde::de::DeserializeOwned; use serde_json::{json, Value}; -use std::env; -use std::fs::{File, OpenOptions}; -use std::io::prelude::*; -use std::io::{BufReader, Cursor}; -use std::path::Path as FilePath; -use std::sync::Arc; use tokio::runtime::Runtime; use tokio::task::JoinHandle; use tokio_util::sync::CancellationToken; use uuid::Uuid; -pub const TEST_BROKER: &str = "0.0.0.0:9092"; -pub const LOCALSTACK_ENDPOINT: &str = "http://0.0.0.0:4566"; +/* + * Return the KAFKA_BROKERS set in the environment or default ot the local machine's port 9092 + */ +pub fn test_broker() -> String { + env::var("KAFKA_BROKERS").unwrap_or("0.0.0.0:9092".into()) +} + +pub fn test_aws_endpoint() -> String { + env::var("AWS_ENDPOINT_URL").unwrap_or("http://0.0.0.0:4566".into()) +} + +pub fn test_s3_bucket() -> String { + env::var("AWS_S3_BUCKET").unwrap_or("tests".into()) +} pub async fn create_topic(topic: &str, num_partitions: i32) { let admin_client: AdminClient<_> = ClientConfig::new() - .set("bootstrap.servers", TEST_BROKER) + .set("bootstrap.servers", test_broker()) .create() .unwrap(); @@ -46,7 +61,7 @@ pub async fn create_topic(topic: &str, num_partitions: i32) { pub async fn delete_topic(topic: &str) { let admin_client: AdminClient<_> = ClientConfig::new() - .set("bootstrap.servers", TEST_BROKER) + .set("bootstrap.servers", test_broker()) .create() .unwrap(); @@ -58,7 +73,7 @@ pub async fn delete_topic(topic: &str) { pub fn create_producer() -> FutureProducer { ClientConfig::new() - .set("bootstrap.servers", TEST_BROKER) + .set("bootstrap.servers", test_broker()) .create() .unwrap() } @@ -88,7 +103,7 @@ pub async fn send_kv_json( } pub async fn send_bytes(producer: &FutureProducer, topic: &str, bytes: &Vec) { - let record: FutureRecord> = FutureRecord::to(topic).payload(&bytes); + let record: FutureRecord> = FutureRecord::to(topic).payload(bytes); let _ = producer.send(record, Timeout::Never).await; } @@ -118,10 +133,12 @@ pub async fn read_files_from_store(table: &DeltaTable) -> Vec { let reader = SerializedFileReader::new(File::open(&tmp).unwrap()).unwrap(); - let mut row_iter = reader.get_row_iter(None).unwrap(); + let row_iter = reader.get_row_iter(None).unwrap(); - while let Some(record) = row_iter.next() { - list.push(record.get_string(0).unwrap().parse::().unwrap()); + for record in row_iter { + if let Ok(record) = record { + list.push(record.get_string(0).unwrap().parse::().unwrap()); + } } } @@ -136,14 +153,14 @@ fn parse_type(schema: &Value) -> Value { Value::String(_) => schema.clone(), Value::Object(_) => json!({ "type": "struct", - "fields": parse_fields(&schema), + "fields": parse_fields(schema), }), Value::Array(v) if v.len() == 1 => json!({ "type": "array", "elementType": parse_type(v.first().unwrap()), "containsNull": true, }), - _ => panic!("Unsupported type {}", schema.to_string()), + _ => panic!("Unsupported type {}", schema), } } @@ -198,6 +215,7 @@ pub async fn create_and_run_kdi( Runtime, ) { init_logger(); + println!("OPTS!: {:?}", opts); let topic = format!("{}-{}", app_id, Uuid::new_v4()); let table = create_local_table(schema, delta_partitions, &topic); create_topic(&topic, kafka_num_partitions).await; @@ -251,7 +269,9 @@ pub fn create_kdi_with( let app_id = options.app_id.to_string(); let worker_name = worker_name.unwrap_or(app_id.clone()); + env::set_var("AWS_ENDPOINT_URL", test_aws_endpoint()); env::set_var("AWS_S3_LOCKING_PROVIDER", "dynamodb"); + env::set_var("AWS_REGION", "us-east-2"); env::set_var("DYNAMO_LOCK_TABLE_NAME", "locks"); env::set_var("DYNAMO_LOCK_OWNER_NAME", Uuid::new_v4().to_string()); env::set_var("DYNAMO_LOCK_PARTITION_KEY_VALUE", app_id.clone()); @@ -296,6 +316,10 @@ pub fn create_runtime(name: &str) -> Runtime { } pub fn init_logger() { + // Any time the test_aws_endpoint() is being used the ability to hit HTTP hosts + // needs to be enabled + env::set_var("AWS_ALLOW_HTTP", "true"); + let _ = env_logger::Builder::new() .format(|buf, record| { let thread_name = std::thread::current() @@ -328,6 +352,7 @@ pub fn wait_until_file_created(path: &FilePath) { let now = Local::now(); let poll_time = now - start_time; + std::thread::sleep(Duration::from_secs(1)); if poll_time > chrono::Duration::seconds(180) { panic!("File was not created before timeout"); @@ -368,7 +393,7 @@ pub async fn read_table_content_as(table_uri: &str) -> Vec< pub async fn read_table_content_at_version_as( table_uri: &str, - version: DeltaDataTypeVersion, + version: i64, ) -> Vec { read_table_content_at_version_as_jsons(table_uri, version) .await @@ -383,10 +408,7 @@ pub async fn read_table_content_as_jsons(table_uri: &str) -> Vec { json_listify_table_content(table, store).await } -pub async fn read_table_content_at_version_as_jsons( - table_uri: &str, - version: DeltaDataTypeVersion, -) -> Vec { +pub async fn read_table_content_at_version_as_jsons(table_uri: &str, version: i64) -> Vec { let table = deltalake::open_table_with_version(table_uri, version) .await .unwrap(); @@ -399,20 +421,16 @@ async fn json_listify_table_content(table: DeltaTable, store: DeltaObjectStore) let tmp = format!(".test-{}.tmp", Uuid::new_v4()); let mut list = Vec::new(); for file in table.get_files() { - let get_result = store - .storage_backend() - .get(&Path::from(file)) - .await - .unwrap(); + let get_result = store.storage_backend().get(&file).await.unwrap(); let bytes = get_result.bytes().await.unwrap(); let mut file = File::create(&tmp).unwrap(); file.write_all(bytes.chunk()).unwrap(); drop(file); let reader = SerializedFileReader::new(File::open(&tmp).unwrap()).unwrap(); - let mut row_iter = reader.get_row_iter(None).unwrap(); + let row_iter = reader.get_row_iter(None).unwrap(); - while let Some(record) = row_iter.next() { - list.push(record.to_json_value()); + for record in row_iter { + list.push(record.unwrap().to_json_value()); } } @@ -467,7 +485,7 @@ pub async fn inspect_table(path: &str) { .unwrap(); let reader = SerializedFileReader::new(parquet_bytes).unwrap(); for record in reader.get_row_iter(None).unwrap() { - println!(" - {}", record.to_json_value()) + println!(" - {}", record.unwrap().to_json_value()) } } _ => println!("Unknown action {:?}", action), @@ -491,7 +509,7 @@ pub async fn inspect_table(path: &str) { let reader = SerializedFileReader::new(bytes).unwrap(); let mut i = 0; for record in reader.get_row_iter(None).unwrap() { - let json = record.to_json_value(); + let json = record.unwrap().to_json_value(); if let Some(m) = parse_json_field::(&json, "metaData") { println!(" {}. metaData: {}", i, m.id); } @@ -530,3 +548,116 @@ fn parse_json_field(value: &Value, key: &str) -> Option .and_then(|v| v.get(key)) .and_then(|v| serde_json::from_value::(v.clone()).ok()) } + +pub const TEST_APP_ID: &str = "emails_test"; +pub const TEST_CONSUMER_GROUP_ID: &str = "kafka_delta_ingest_emails"; +pub const TEST_PARTITIONS: i32 = 4; +pub const TEST_TOTAL_MESSAGES: i32 = 200; + +pub const WORKER_1: &str = "WORKER-1"; +pub const WORKER_2: &str = "WORKER-2"; + +pub struct TestScope { + pub topic: String, + pub table: String, + pub workers_token: Arc, + pub runtime: HashMap<&'static str, Runtime>, + options: IngestOptions, +} + +impl TestScope { + pub async fn new(topic: &str, table: &str, options: IngestOptions) -> Self { + let workers_token = Arc::new(CancellationToken::new()); + let mut runtime = HashMap::new(); + runtime.insert(WORKER_1, create_runtime(WORKER_1)); + runtime.insert(WORKER_2, create_runtime(WORKER_2)); + + println!("Topic: {}", &topic); + println!("Table: {}", &table); + create_topic(topic, TEST_PARTITIONS).await; + + Self { + topic: topic.into(), + table: table.into(), + workers_token, + runtime, + options, + } + } + + pub fn shutdown(self) { + for (_, rt) in self.runtime { + rt.shutdown_background() + } + } + + pub async fn create_and_start(&self, name: &str) -> JoinHandle<()> { + let rt = self.runtime.get(name).unwrap(); + let topic = self.topic.clone(); + let table = self.table.clone(); + let token = self.workers_token.clone(); + let options = self.options.clone(); + rt.spawn(async move { + let res = start_ingest(topic, table, options, token.clone()).await; + res.unwrap_or_else(|e| println!("AN ERROR OCCURED: {}", e)); + println!("Ingest process exited"); + + token.cancel(); + }) + } + + pub async fn send_messages(&self, amount: i32) { + let producer = create_producer(); + let now: DateTime = Utc::now(); + + println!("Sending {} messages to {}", amount, &self.topic); + for n in 0..amount { + let json = &json!({ + "id": n.to_string(), + "sender": format!("sender-{}@example.com", n), + "recipient": format!("recipient-{}@example.com", n), + "timestamp": (now + chrono::Duration::seconds(1)).to_rfc3339_opts(SecondsFormat::Secs, true), + }); + send_json(&producer, &self.topic, json).await; + } + println!("All messages are sent"); + } + + pub async fn wait_on_total_offset(&self, apps: Vec, offset: i32) { + let mut table = deltalake::open_table(&self.table).await.unwrap(); + let expected_total = offset - TEST_PARTITIONS; + loop { + table.update().await.unwrap(); + let mut total = 0; + for key in apps.iter() { + total += table + .get_app_transaction_version() + .get(key) + .copied() + .unwrap_or(0); + } + + if total >= expected_total as i64 { + self.workers_token.cancel(); + println!("All messages are in delta"); + return; + } + + println!("Expecting offsets in delta {}/{}...", total, expected_total); + tokio::time::sleep(Duration::from_secs(1)).await; + } + } + + pub async fn validate_data(&self) { + let table = deltalake::open_table(&self.table).await.unwrap(); + let result = read_files_from_store(&table).await; + let r: Vec = (0..TEST_TOTAL_MESSAGES).collect(); + println!("Got messages {}/{}", result.len(), TEST_TOTAL_MESSAGES); + + if result.len() != TEST_TOTAL_MESSAGES as usize { + inspect_table(&self.table).await; + } + + assert_eq!(result, r); + } +} diff --git a/tests/schema_update_tests.rs b/tests/schema_update_tests.rs index bf2e6a9..6403e39 100644 --- a/tests/schema_update_tests.rs +++ b/tests/schema_update_tests.rs @@ -96,7 +96,7 @@ async fn schema_update_test() { // convert msg v1 to v2 let expected = vec![ MsgV2 { - id: msg_v1.id.clone(), + id: msg_v1.id, color: None, date: msg_v1.date.clone(), },