diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000..b677da2e --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,12 @@ +# Configuration for increased stack size to handle vega_lite_4 stack requirements +# See: https://github.com/procyon-rs/vega_lite_4.rs#stack-size + +[target.x86_64-pc-windows-msvc] +rustflags = [ + "-C", "link-args=/STACK:32000000", +] + +[target.i686-pc-windows-msvc] +rustflags = [ + "-C", "link-args=/STACK:32000000", +] diff --git a/Cargo.lock b/Cargo.lock index 60efe486..9e9cbf53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,13 +4,22 @@ version = 4 [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -22,15 +31,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.56" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -44,9 +53,9 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c98233c6673d8601ab23e77eb38f999c51100d46c5703b17288c57fddf3a1ffe" dependencies = [ - "bstr", + "bstr 0.2.17", "doc-comment", - "predicates 2.1.1", + "predicates 2.1.5", "predicates-core", "predicates-tree", "wait-timeout", @@ -58,22 +67,28 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi 0.3.9", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.13.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "behrens-fisher" @@ -96,6 +111,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + [[package]] name = "blake3" version = "0.3.8" @@ -113,9 +134,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -128,33 +149,53 @@ checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "lazy_static", "memchr", - "regex-automata", + "regex-automata 0.1.10", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata 0.4.13", "serde", ] [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.2.1" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bytesize" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3c8f83209414aacf0eeae3cf730b18d6981697fba62f200fcfb92b9f082acba" +checksum = "f5c434ae3cf0089ca203e9019ebe529c47ff45cefe8af7c85ecb734ef541822f" [[package]] name = "cc" -version = "1.0.73" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +dependencies = [ + "find-msvc-tools", + "shlex", +] [[package]] name = "cfg-if" @@ -164,22 +205,21 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.20" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6127248204b9aba09a362f6c930ef6a78f2c1b2215f8a7b398c06e1083f17af0" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ + "iana-time-zone", "js-sys", - "num-integer", "num-traits", - "time", "wasm-bindgen", - "winapi 0.3.9", + "windows-link", ] [[package]] @@ -191,9 +231,9 @@ dependencies = [ "ansi_term", "atty", "bitflags 1.3.2", - "strsim", + "strsim 0.8.0", "textwrap", - "unicode-width", + "unicode-width 0.1.14", "vec_map", ] @@ -205,9 +245,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[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", @@ -215,9 +255,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core_affinity" @@ -233,63 +273,43 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if 1.0.0", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.8" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if 1.0.0", "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", @@ -305,28 +325,156 @@ dependencies = [ "subtle", ] +[[package]] +name = "cssparser" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e901edd733a1472f944a45116df3f846f54d37e67e68640ac8bb69689aca2aa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.109", +] + [[package]] name = "csv" -version = "1.1.6" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ - "bstr", "csv-core", - "itoa 0.4.8", + "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.109", +] + +[[package]] +name = "dbus" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.109", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.109", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", +] + [[package]] name = "difference" version = "2.0.0" @@ -350,9 +498,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -378,25 +526,57 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", +] + [[package]] name = "doc-comment" -version = "0.3.3" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "ego-tree" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8" [[package]] name = "either" -version = "1.6.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", ] [[package]] @@ -419,12 +599,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" dependencies = [ "atty", - "humantime 2.1.0", + "humantime 2.3.0", "log", "regex", "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "errno" version = "0.2.8" @@ -436,6 +622,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "errno-dragonfly" version = "0.1.2" @@ -448,25 +644,28 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.7.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" -dependencies = [ - "instant", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "libc", - "redox_syscall", - "winapi 0.3.9", + "libredox", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "float-cmp" version = "0.8.0" @@ -499,52 +698,61 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "matches", "percent-encoding", ] +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + [[package]] name = "futures-channel" -version = "0.3.24" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.24" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-io" -version = "0.3.24" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-sink" -version = "0.3.24" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.24" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.24" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", @@ -555,43 +763,73 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", ] +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width 0.2.2", +] + [[package]] name = "getrandom" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if 1.0.4", + "libc", + "r-efi", + "wasip2", ] [[package]] name = "h2" -version = "0.3.17" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -599,7 +837,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -608,9 +846,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "heck" @@ -630,6 +874,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hostname" version = "0.3.1" @@ -641,22 +891,33 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "html5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" +dependencies = [ + "log", + "markup5ever", + "match_token", +] + [[package]] name = "http" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.1", + "itoa", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -665,15 +926,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[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" @@ -686,9 +947,9 @@ dependencies = [ [[package]] name = "humantime" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hwloc" @@ -697,7 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2934f84993b8b4bcae9b6a4e5f0aca638462dda9c7b4f26a570241494f21e0f4" dependencies = [ "bitflags 0.7.0", - "errno", + "errno 0.2.8", "kernel32-sys", "libc", "num", @@ -707,9 +968,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.20" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -720,9 +981,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.1", + "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -743,88 +1004,205 @@ dependencies = [ ] [[package]] -name = "idna" -version = "0.2.3" +name = "iana-time-zone" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "indexmap" -version = "1.8.1" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "autocfg", - "hashbrown", + "cc", ] [[package]] -name = "instant" -version = "0.1.12" +name = "icu_collections" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ - "cfg-if 1.0.0", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "ipnet" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" - -[[package]] -name = "itertools" -version = "0.10.3" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ - "either", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "itoa" -version = "0.4.8" +name = "icu_normalizer" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] [[package]] -name = "itoa" -version = "1.0.1" +name = "icu_normalizer_data" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] -name = "ittapi" -version = "0.3.1" +name = "icu_properties" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "663fe0550070071ff59e981864a9cd3ee1c869ed0a088140d9ac4dc05ea6b1a1" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "anyhow", - "ittapi-sys", - "log", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", ] [[package]] -name = "ittapi-sys" -version = "0.3.1" +name = "icu_properties_data" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e21911b7183f38c71d75ab478a527f314e28db51027037ece2e5511ed9410703" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "ittapi" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a5c0b993601cad796222ea076565c5d9f337d35592f8622c753724f06d7271" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7b5e473765060536a660eed127f758cf1a810c73e49063264959c60d1727d9" dependencies = [ "cc", ] [[package]] name = "js-sys" -version = "0.3.59" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -840,39 +1218,95 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "leb128" -version = "0.2.5" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.123" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libdbus-sys" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb691a747a7ab48abc15c5b42066eaafde10dc427e3b6ee2a1cf43db04c763bd" +checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" +dependencies = [ + "cc", + "pkg-config", +] [[package]] name = "libloading" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "winapi 0.3.9", ] +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" -version = "0.4.16" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" dependencies = [ - "cfg-if 1.0.0", + "log", + "tendril", + "web_atoms", ] [[package]] @@ -882,51 +1316,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "memchr" -version = "2.4.1" +name = "match_token" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", +] [[package]] -name = "memoffset" -version = "0.6.5" +name = "matrixmultiply" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", + "rawpointer", ] +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minijinja" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f264d75233323f4b7d2f03aefe8a990690cdebfbfe26ea86bcbaec5e9ac990" +dependencies = [ + "serde", +] [[package]] name = "mio" -version = "0.8.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.36.1", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -938,47 +1385,92 @@ dependencies = [ "tempfile", ] +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", + "serde", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "normalize-line-endings" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "normpath" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "ntapi" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc51db7b362b205941f71232e56c625156eb9a929f8cf74a428fd5bc094a4afc" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ "winapi 0.3.9", ] [[package]] name = "num" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" +checksum = "c9bdb1fb680e609c2e0930c1866cafdd0be7e7c7a1ecf92aec71ed8d99d3e133" dependencies = [ "num-integer", "num-iter", "num-traits", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -987,37 +1479,49 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi", + "hermit-abi 0.5.2", "libc", ] [[package]] name = "once_cell" -version = "1.13.1" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "opener" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" +checksum = "d0812e5e4df08da354c851a3376fead46db31c2214f849d3de356d774d057681" +dependencies = [ + "bstr 1.12.1", + "dbus", + "normpath", + "windows-sys 0.59.0", +] [[package]] name = "openssl" -version = "0.10.50" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", + "bitflags 2.10.0", + "cfg-if 1.0.4", "foreign-types", "libc", "once_cell", @@ -1027,26 +1531,26 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.109", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.85" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -1056,26 +1560,50 @@ dependencies = [ [[package]] name = "os_info" -version = "3.4.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eca3ecae1481e12c3d9379ec541b238a16f0b75c9a409942daa8ec20dbfdb62" +checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" dependencies = [ "log", + "plist", "serde", - "winapi 0.3.9", + "windows-sys 0.52.0", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if 1.0.4", + "libc", + "redox_syscall", + "smallvec", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf-event" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5396562cd2eaa828445d6d34258ae21ee1eb9d40fe626ca7f51c8dccb4af9d66" +checksum = "b4d6393d9238342159080d79b78cb59c67399a8e7ecfa5d410bd614169e4e823" dependencies = [ "libc", "perf-event-open-sys", @@ -1083,18 +1611,70 @@ dependencies = [ [[package]] name = "perf-event-open-sys" -version = "1.0.1" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9bedf5da2c234fdf2391ede2b90fabf585355f33100689bc364a3ea558561a" +checksum = "7c44fb1c7651a45a3652c4afc6e754e40b3d6e6556f1487e2b230bfc4f33c2a8" dependencies = [ "libc", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1104,15 +1684,61 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.12.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "precision" @@ -1125,6 +1751,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "predicates" version = "1.0.8" @@ -1140,9 +1772,9 @@ dependencies = [ [[package]] name = "predicates" -version = "2.1.1" +version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" dependencies = [ "difflib", "itertools", @@ -1151,15 +1783,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.3" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.5" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -1184,7 +1816,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1201,11 +1833,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1215,28 +1847,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] -name = "quote" -version = "1.0.18" +name = "quick-xml" +version = "0.38.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" dependencies = [ - "proc-macro2", + "memchr", ] [[package]] -name = "rand" -version = "0.7.3" +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", "rand_pcg", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -1244,7 +1900,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1256,13 +1912,19 @@ dependencies = [ "getrandom 0.1.16", ] +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1271,61 +1933,64 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rayon" -version = "1.5.2" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.2" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.6", - "redox_syscall", + "getrandom 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.5.5" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", + "regex-automata 0.4.13", "regex-syntax", ] @@ -1336,27 +2001,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] -name = "regex-syntax" -version = "0.6.25" +name = "regex-automata" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "regex-syntax" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.11.11" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -1368,15 +2035,18 @@ dependencies = [ "hyper-tls", "ipnet", "js-sys", - "lazy_static", "log", "mime", "native-tls", + "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", "tower-service", @@ -1387,35 +2057,77 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.10.0", + "errno 0.3.14", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.61.2", ] [[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 = "scraper" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f3a24d916e78954af99281a455168d4a9515d65eca99a18da1b813689c4ad9" +dependencies = [ + "cssparser", + "ego-tree", + "getopts", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] [[package]] name = "security-framework" -version = "2.6.1" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -1424,43 +2136,80 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "selectors" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5685b6ae43bfcf7d2e7dfcfb5d8e8f61b46442c902531e41a32a9a8bf0ee0fb6" +dependencies = [ + "bitflags 2.10.0", + "cssparser", + "derive_more", + "fxhash", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" -version = "1.0.136" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.109", ] [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "itoa 1.0.1", + "itoa", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1470,20 +2219,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.1", + "itoa", "ryu", "serde", ] +[[package]] +name = "servo_arc" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "204ea332803bd95a0b60388590d59cf6468ec9becf626e2451f1d26a1d972de4" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "sha2" -version = "0.10.2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "cpufeatures", - "digest 0.10.3", + "digest 0.10.7", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "showata" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8135a34390f8405409411deda807f6add34d1a053d4daa5e492bb21103097d63" +dependencies = [ + "anyhow", + "base64 0.22.1", + "opener", ] [[package]] @@ -1492,7 +2267,9 @@ version = "0.1.0" dependencies = [ "anyhow", "behrens-fisher", + "serde", "sightglass-data", + "thiserror", ] [[package]] @@ -1512,7 +2289,7 @@ dependencies = [ "serde_json", "tar", "thiserror", - "wasmparser", + "wasmparser 0.86.0", "wasmprinter", ] @@ -1526,10 +2303,13 @@ dependencies = [ "env_logger 0.8.4", "libloading", "log", + "minijinja", "predicates 1.0.8", "pretty_env_logger", - "rand", + "rand 0.7.3", "regex", + "scraper", + "serde", "serde_json", "sightglass-analysis", "sightglass-build", @@ -1540,6 +2320,7 @@ dependencies = [ "structopt", "tempfile", "thiserror", + "vega_lite_4", ] [[package]] @@ -1604,23 +2385,42 @@ dependencies = [ "sightglass-fingerprint", ] +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" -version = "0.4.7" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "autocfg", + "libc", + "windows-sys 0.52.0", ] [[package]] name = "socket2" -version = "0.4.4" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "winapi 0.3.9", + "windows-sys 0.60.2", ] [[package]] @@ -1632,12 +2432,49 @@ dependencies = [ "libc", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "structopt" version = "0.3.26" @@ -1659,33 +2496,61 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "syn" -version = "1.0.91" +version = "2.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", ] [[package]] name = "sysinfo" -version = "0.28.2" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e847e2de7a137c8c2cede5095872dbb00f4f9bf34d061347e36b43322acd56" +checksum = "b4c2f3ca6693feb29a89724516f016488e9aafc7f37264f898593ee4b942f31b" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "core-foundation-sys", "libc", "ntapi", @@ -1694,11 +2559,32 @@ dependencies = [ "winapi 0.3.9", ] +[[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 = "tar" -version = "0.4.38" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -1707,32 +2593,42 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.3.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if 1.0.0", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "termtree" -version = "0.2.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "textwrap" @@ -1740,76 +2636,89 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width", + "unicode-width 0.1.14", ] [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.109", ] [[package]] name = "time" -version = "0.1.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ - "libc", - "winapi 0.3.9", + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ - "tinyvec_macros", + "num-conv", + "time-core", ] [[package]] -name = "tinyvec_macros" -version = "0.1.0" +name = "tinystr" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] [[package]] name = "tokio" -version = "1.24.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9f76183f91ecfb55e1d7d5602bd1d979e38a3a522fe900241cf195624d67ae" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "autocfg", "bytes", "libc", - "memchr", "mio", - "num_cpus", "pin-project-lite", - "socket2", - "windows-sys 0.42.0", + "socket2 0.6.1", + "windows-sys 0.61.2", ] [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -1817,101 +2726,102 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.3" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.36" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if 1.0.0", "pin-project-lite", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.29" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.15.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] -name = "unicode-bidi" -version = "0.3.8" +name = "unicode-ident" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" - -[[package]] -name = "unicode-normalization" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" -dependencies = [ - "tinyvec", -] +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] -name = "unicode-xid" +name = "unicode-width" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "url" -version = "2.2.2" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", + "serde", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "vcpkg" version = "0.2.15" @@ -1924,28 +2834,42 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +[[package]] +name = "vega_lite_4" +version = "0.8.1" +source = "git+https://github.com/procyon-rs/vega_lite_4.rs#50137a458956c0a124ae779307596b9e79881e0d" +dependencies = [ + "anyhow", + "csv", + "derive_builder", + "derive_more", + "ndarray", + "serde", + "serde_json", + "showata", +] + [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] [[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", ] @@ -1957,15 +2881,18 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasix" @@ -1973,51 +2900,40 @@ version = "0.12.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" dependencies = [ - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] name = "wasm-bindgen" -version = "0.2.82" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" -dependencies = [ - "bumpalo", - "log", + "cfg-if 1.0.4", "once_cell", - "proc-macro2", - "quote", - "syn", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.32" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if 1.0.4", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.82" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2025,22 +2941,35 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.82" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn", - "wasm-bindgen-backend", + "syn 2.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.82" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.240.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" +checksum = "06d642d8c5ecc083aafe9ceb32809276a304547a3a6eeecceb5d8152598bc71f" +dependencies = [ + "leb128fmt", + "wasmparser 0.240.0", +] [[package]] name = "wasmparser" @@ -2048,49 +2977,85 @@ version = "0.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bcbfe95447da2aa7ff171857fc8427513eb57c75a729bb190e974dc695e8f5c" dependencies = [ - "indexmap", + "indexmap 1.9.3", +] + +[[package]] +name = "wasmparser" +version = "0.121.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" +dependencies = [ + "bitflags 2.10.0", + "indexmap 2.12.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" +dependencies = [ + "bitflags 2.10.0", + "indexmap 2.12.0", + "semver", ] [[package]] name = "wasmprinter" -version = "0.2.36" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4cca415278da771add7c9ab7f3391f04b8d98719d2cf28a185d38d5206697e" +checksum = "60e73986a6b7fdfedb7c5bf9e7eb71135486507c8fbc4c0c42cffcb6532988b7" dependencies = [ "anyhow", - "wasmparser", + "wasmparser 0.121.2", ] [[package]] name = "wast" -version = "40.0.0" +version = "240.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb4f48a8b083dbc50e291e430afb8f524092bb00428957bcc63f49f856c64ac" +checksum = "b0efe1c93db4ac562b9733e3dca19ed7fc878dba29aef22245acf84f13da4a19" dependencies = [ - "leb128", + "bumpalo", + "leb128fmt", "memchr", - "unicode-width", + "unicode-width 0.2.2", + "wasm-encoder", ] [[package]] name = "wat" -version = "1.0.42" +version = "1.240.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0401b6395ce0db91629a75b29597ccb66ea29950af9fc859f1bb3a736609c76e" +checksum = "4ec9b6eab7ecd4d639d78515e9ea491c9bacf494aa5eda10823bd35992cf8c1e" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.59" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "web_atoms" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + [[package]] name = "winapi" version = "0.2.8" @@ -2121,11 +3086,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "winapi 0.3.9", + "windows-sys 0.61.2", ] [[package]] @@ -2134,120 +3099,421 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.52.6", ] [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "windows-targets 0.53.5", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[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 0.3.9", + "cfg-if 1.0.4", + "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + [[package]] name = "xattr" -version = "0.2.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.109", ] diff --git a/README.md b/README.md index 668b516d..72043dd7 100644 --- a/README.md +++ b/README.md @@ -214,12 +214,35 @@ If you don't want the results to be summarized and displayed in a human-readable format, you can get raw JSON or CSV via the `--raw` flag: ``` -$ cargo run -- benchmark --raw --output-format csv -- benchmark.wasm +$ cargo run -- benchmark --raw --output-format json -- benchmark.wasm ``` Then you can use your own R/Python/spreadsheets/etc. to analyze and visualize the benchmark results. +### HTML Report Generation + +For raw results collected in the JSON format, sightglass includes a built-in `report` +subcommand that generates comprehensive HTML reports with statistical analysis and +interactive visualizations. This approach provides rigorous statistical significance +testing following the Bytecode Alliance RFC standards. + +```bash +# Generate HTML report comparing multiple measurement files +$ cargo run -- report --output-file report.html baseline.json experiment1.json experiment2.json + +# Specify which engine serves as the baseline for comparisons +$ cargo run -- report --baseline-engine wasmtime-baseline --output-file report.html baseline.json experiment.json +``` + +The generated HTML report includes: +- Statistical significance testing with confidence intervals +- Interactive charts showing performance distributions +- Effect size analysis with practical significance assessment +- Filtering and sorting capabilities for large result sets + +See `cargo run -- report --help` for all available options. + ### Adding a New Benchmark Add a Dockerfile under `benchmarks/` building a Wasm file that diff --git a/crates/analysis/Cargo.toml b/crates/analysis/Cargo.toml index 3c03b8f0..a34a2b4d 100644 --- a/crates/analysis/Cargo.toml +++ b/crates/analysis/Cargo.toml @@ -7,4 +7,6 @@ edition = "2021" [dependencies] anyhow = "1.0.40" behrens-fisher = "0.1.0" +serde = { version = "1.0", features = ["derive"] } sightglass-data = { path = "../data" } +thiserror = "1.0" diff --git a/crates/analysis/src/effect_size.rs b/crates/analysis/src/effect_size.rs index dfb4f7e5..bcec895b 100644 --- a/crates/analysis/src/effect_size.rs +++ b/crates/analysis/src/effect_size.rs @@ -21,8 +21,7 @@ pub fn calculate<'a>( (0.0..=1.0).contains(&significance_level), "The significance_level must be between 0.0 and 1.0. \ Typical values are 0.05 and 0.01 (i.e. 95% and 99% confidence). \ - Found {}.", - significance_level, + Found {significance_level}." ); let keys = KeyBuilder::all() diff --git a/crates/analysis/src/lib.rs b/crates/analysis/src/lib.rs index 5d69d323..3f52226f 100644 --- a/crates/analysis/src/lib.rs +++ b/crates/analysis/src/lib.rs @@ -1,3 +1,4 @@ pub mod effect_size; pub mod keys; +pub mod report_stats; pub mod summarize; diff --git a/crates/analysis/src/report_stats.rs b/crates/analysis/src/report_stats.rs new file mode 100644 index 00000000..7f509280 --- /dev/null +++ b/crates/analysis/src/report_stats.rs @@ -0,0 +1,342 @@ +use crate::summarize::{coefficient_of_variation, mean, percentile_from_sorted, std_deviation}; +use sightglass_data::{extract_benchmark_name, Measurement, Phase}; +use std::collections::HashMap; +use thiserror::Error; + +/// Errors that can occur during benchmark analysis +#[derive(Debug, Error)] +pub enum AnalysisError { + #[error("No measurements available for analysis")] + InsufficientData, + #[error("Insufficient sample size: need at least {required} samples, got {actual}")] + InsufficientSampleSize { required: usize, actual: usize }, + #[error("No measurements found for event '{event}' in phase '{phase:?}'")] + NoMatchingMeasurements { phase: Phase, event: String }, + #[error("Invalid significance level: {level} (must be between 0 and 1)")] + InvalidSignificanceLevel { level: f64 }, + #[error("Statistical analysis failed: {0}")] + StatisticalError(String), +} + +/// Configuration for benchmark report generation +#[derive(Debug, Clone)] +pub struct ReportConfig { + pub primary_event: String, + pub target_phase: Phase, + pub significance_level: f64, + pub baseline_engine: String, +} + +impl ReportConfig { + pub fn new(baseline_engine: impl Into) -> Self { + Self { + primary_event: "cycles".to_string(), + target_phase: Phase::Execution, + significance_level: 0.05, + baseline_engine: baseline_engine.into(), + } + } + + pub fn with_event(mut self, event: impl Into) -> Self { + self.primary_event = event.into(); + self + } + + pub fn with_phase(mut self, phase: Phase) -> Self { + self.target_phase = phase; + self + } + + pub fn with_significance_level(mut self, level: f64) -> Self { + self.significance_level = level; + self + } + + pub fn with_baseline_engine(mut self, engine: impl Into) -> Self { + self.baseline_engine = engine.into(); + self + } +} + +/// Statistics relative to a baseline measurement +#[derive(Debug, Clone, serde::Serialize)] +pub struct RelativeStats { + pub p25_delta_pct: f64, + pub mean_delta_pct: f64, + pub is_significant: bool, + pub effect_size_mean_diff: f64, + pub speedup_ratio: f64, + pub confidence_interval_half_width: Option, + pub speedup_confidence_interval: Option, +} + +/// Statistics calculated for a benchmark grouped by prefix. +#[derive(Debug, Clone, serde::Serialize)] +pub struct BenchmarkStats { + // Core statistics (always present) + pub cv: f64, + pub std: f64, + pub mean: f64, + pub median: f64, // p50 - consolidated into median + pub p25: f64, + pub p75: f64, + pub min: f64, + pub max: f64, + pub significance_level: f64, + + // Relative statistics (only when comparing to baseline) + pub relative_stats: Option, +} + +/// Data structure representing aggregated statistics for a benchmark. +#[derive(Debug)] +pub struct BenchmarkData { + pub name: String, + pub stats_by_engine: HashMap, + pub baseline_stats: BenchmarkStats, +} + +/// Calculate statistics for all benchmarks grouped by engine. +pub fn calculate_benchmark_stats<'a>( + measurements: &[Measurement<'a>], + config: &ReportConfig, +) -> Result>, AnalysisError> { + // Early validation + if measurements.is_empty() { + return Err(AnalysisError::InsufficientData); + } + + let mut results: HashMap> = HashMap::new(); + + // Group measurements by benchmark and engine + let mut grouped: HashMap>> = HashMap::new(); + + for measurement in measurements { + // Only process measurements matching the configured phase and event + if measurement.phase != config.target_phase || measurement.event != config.primary_event { + continue; + } + + let benchmark = extract_benchmark_name(&measurement.wasm); + let engine_name = measurement.engine.to_string(); + + grouped + .entry(benchmark) + .or_default() + .entry(engine_name) + .or_default() + .push(measurement.count); + } + + // Check if we found any matching measurements + if grouped.is_empty() { + return Err(AnalysisError::NoMatchingMeasurements { + phase: config.target_phase, + event: config.primary_event.clone(), + }); + } + + // Calculate statistics for each group + for (benchmark, benchmark_measurements_by_engine) in grouped { + let mut benchmark_results = HashMap::new(); + + // Use the baseline engine from config + let baseline_engine = config.baseline_engine.as_str(); + + // Ensure baseline engine exists in measurements + let baseline_measurements = benchmark_measurements_by_engine + .get(baseline_engine) + .ok_or_else(|| { + AnalysisError::StatisticalError(format!( + "Baseline engine '{baseline_engine}' not found in measurements for benchmark '{benchmark}'" + )) + })?; + + let baseline_measurements = Some(baseline_measurements.as_slice()); + let significance_level = config.significance_level; + + for (engine, counts) in benchmark_measurements_by_engine.iter() { + let stats = if engine == baseline_engine { + calculate_stats_for_measurements(counts, None, significance_level)? + } else { + calculate_stats_for_measurements(counts, baseline_measurements, significance_level)? + }; + benchmark_results.insert(engine.clone(), stats); + } + + results.insert(benchmark, benchmark_results); + } + + Ok(results) +} + +/// Calculate statistics for a group of measurements. +fn calculate_stats_for_measurements( + measurements: &[u64], + baseline_measurements: Option<&[u64]>, + significance_level: f64, +) -> Result { + // Validate minimum sample size for measurements + if measurements.len() < 3 { + return Err(AnalysisError::InsufficientSampleSize { + required: 3, + actual: measurements.len(), + }); + } + + // Validate baseline sample size if provided + if let Some(baseline) = baseline_measurements { + if baseline.len() < 3 { + return Err(AnalysisError::InsufficientSampleSize { + required: 3, + actual: baseline.len(), + }); + } + } + + // Validate significance level + if !(0.0..=1.0).contains(&significance_level) { + return Err(AnalysisError::InvalidSignificanceLevel { + level: significance_level, + }); + } + + let mean = mean(measurements); + let std = std_deviation(measurements); + let mut sorted_measurements = measurements.to_vec(); + sorted_measurements.sort(); + let p25 = percentile_from_sorted(&sorted_measurements, 25.0); + let median = percentile_from_sorted(&sorted_measurements, 50.0); + let p75 = percentile_from_sorted(&sorted_measurements, 75.0); + let min = sorted_measurements[0] as f64; + let max = sorted_measurements[sorted_measurements.len() - 1] as f64; + let cv = coefficient_of_variation(measurements); + + // Calculate relative statistics if we have baseline data + let relative_stats = if let Some(baseline_measurements) = baseline_measurements { + let baseline_mean = crate::summarize::mean(baseline_measurements); + let mut baseline_sorted = baseline_measurements.to_vec(); + baseline_sorted.sort(); + let baseline_p25 = percentile_from_sorted(&baseline_sorted, 25.0); + let p25_delta_pct = (p25 - baseline_p25) / (p25 + baseline_p25) * 100.0; + let mean_delta_pct = (mean - baseline_mean) / (mean + baseline_mean) * 100.0; + + // Always calculate basic relative metrics + let effect_size_mean_diff = mean - baseline_mean; + let speedup_ratio = if baseline_mean > 0.0 { + mean / baseline_mean + } else { + 1.0 + }; + + // Use behrens-fisher for statistical significance + let current_stats: behrens_fisher::Stats = measurements.iter().map(|&c| c as f64).collect(); + let baseline_stats: behrens_fisher::Stats = + baseline_measurements.iter().map(|&c| c as f64).collect(); + + if let Ok(ci) = behrens_fisher::confidence_interval( + 1.0 - significance_level, + current_stats, + baseline_stats, + ) { + let is_significant = effect_size_mean_diff.abs() > ci.abs(); + let speedup_confidence_interval = if baseline_mean > 0.0 { + ci / baseline_mean + } else { + 0.0 + }; + + Some(RelativeStats { + p25_delta_pct, + mean_delta_pct, + is_significant, + effect_size_mean_diff, + speedup_ratio, + confidence_interval_half_width: Some(ci), + speedup_confidence_interval: Some(speedup_confidence_interval), + }) + } else { + Some(RelativeStats { + p25_delta_pct, + mean_delta_pct, + is_significant: false, + effect_size_mean_diff, + speedup_ratio, + confidence_interval_half_width: None, + speedup_confidence_interval: None, + }) + } + } else { + None + }; + + Ok(BenchmarkStats { + cv, + std, + mean, + median, + p25, + p75, + min, + max, + significance_level, + relative_stats, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_calculate_stats_for_measurements() { + let measurements = vec![1, 2, 3, 4, 5]; + let stats = calculate_stats_for_measurements(&measurements, None, 0.05) + .expect("Should calculate stats successfully"); + + assert_eq!(stats.mean, 3.0); + assert_eq!(stats.min, 1.0); + assert_eq!(stats.max, 5.0); + assert_eq!(stats.median, 3.0); // changed from p50 to median + assert!(stats.cv > 0.0); + assert!(stats.relative_stats.is_none()); // No baseline provided + } + + #[test] + fn test_calculate_stats_with_baseline() { + let measurements = vec![5, 6, 7, 8, 9]; + let baseline = vec![1, 2, 3, 4, 5]; + let stats = calculate_stats_for_measurements(&measurements, Some(&baseline), 0.05) + .expect("Should calculate stats successfully"); + + assert_eq!(stats.mean, 7.0); + assert!(stats.relative_stats.is_some()); + + let rel = stats.relative_stats.unwrap(); + assert!(rel.mean_delta_pct > 0.0); // Should be positive (measurements higher than baseline) + assert!(rel.speedup_ratio > 1.0); // Should be > 1 since measurements are higher than baseline + assert!(rel.effect_size_mean_diff > 0.0); // Should be positive mean difference + } + + #[test] + fn test_insufficient_sample_size() { + let measurements = vec![1, 2]; + let result = calculate_stats_for_measurements(&measurements, None, 0.05); + assert!(matches!( + result, + Err(AnalysisError::InsufficientSampleSize { + required: 3, + actual: 2 + }) + )); + } + + #[test] + fn test_invalid_significance_level() { + let measurements = vec![1, 2, 3, 4, 5]; + let result = calculate_stats_for_measurements(&measurements, None, 1.5); + assert!( + matches!(result, Err(AnalysisError::InvalidSignificanceLevel { level }) if level == 1.5) + ); + } +} diff --git a/crates/analysis/src/summarize.rs b/crates/analysis/src/summarize.rs index df5f0bd9..79229868 100644 --- a/crates/analysis/src/summarize.rs +++ b/crates/analysis/src/summarize.rs @@ -37,7 +37,7 @@ pub fn calculate<'a>(measurements: &[Measurement<'a>]) -> Vec> { } /// Calculate the arithmetic mean of a slice of numbers. -fn mean(numbers: &[u64]) -> f64 { +pub fn mean(numbers: &[u64]) -> f64 { numbers.iter().sum::() as f64 / numbers.len() as f64 } @@ -51,6 +51,51 @@ fn mean_deviation(numbers: &[u64]) -> f64 { / numbers.len() as f64 } +/// Calculate the standard deviation of a slice of numbers. +pub fn std_deviation(numbers: &[u64]) -> f64 { + if numbers.is_empty() { + return 0.0; + } + let mean = mean(numbers); + let variance = numbers + .iter() + .map(|&c| { + let diff = c as f64 - mean; + diff * diff + }) + .sum::() + / numbers.len() as f64; + variance.sqrt() +} + +/// Calculate a specific percentile from already-sorted data. +pub fn percentile_from_sorted(sorted_numbers: &[u64], p: f64) -> f64 { + if sorted_numbers.is_empty() { + return 0.0; + } + + let index = (p / 100.0) * (sorted_numbers.len() - 1) as f64; + let lower = index.floor() as usize; + let upper = index.ceil() as usize; + + if lower == upper { + sorted_numbers[lower] as f64 + } else { + let weight = index - lower as f64; + (sorted_numbers[lower] as f64) * (1.0 - weight) + (sorted_numbers[upper] as f64) * weight + } +} + +/// Calculate the coefficient of variation (CV) as a percentage. +pub fn coefficient_of_variation(numbers: &[u64]) -> f64 { + let mean_val = mean(numbers); + if mean_val == 0.0 { + 0.0 + } else { + (std_deviation(numbers) / mean_val) * 100.0 + } +} + /// Returns the median value of a group. fn median(numbers: &mut [u64]) -> u64 { numbers.sort(); @@ -193,4 +238,28 @@ mod tests { assert_eq!(calculate(&measurements).len(), 3); } + + #[test] + fn test_std_deviation() { + let numbers = vec![2, 4, 4, 4, 5, 5, 7, 9]; + let std_dev = std_deviation(&numbers); + assert!((std_dev - 2.0).abs() < 0.1); + } + + #[test] + fn test_percentile_from_sorted() { + let mut numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + numbers.sort(); + assert_eq!(percentile_from_sorted(&numbers, 50.0), 5.5); + assert_eq!(percentile_from_sorted(&numbers, 25.0), 3.25); + assert_eq!(percentile_from_sorted(&numbers, 75.0), 7.75); + } + + #[test] + fn test_coefficient_of_variation() { + let numbers = vec![2, 4, 4, 4, 5, 5, 7, 9]; + let cv = coefficient_of_variation(&numbers); + assert!(cv > 0.0); + assert!(cv < 100.0); // Should be a reasonable CV percentage + } } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 6de932e4..2ee14d73 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -9,6 +9,7 @@ anyhow = "1.0" libloading = "0.7" log = "0.4" pretty_env_logger = "0.4" +serde = "1" serde_json = "1.0.64" sightglass-analysis = { path = "../analysis" } sightglass-build = { path = "../build" } @@ -21,9 +22,12 @@ thiserror = "1.0" rand = { version = "0.7.3", features = ["small_rng"] } csv = "1.1.6" regex = "1.5.4" +vega_lite_4 = { git = "https://github.com/procyon-rs/vega_lite_4.rs" } +minijinja = "2.10" [dev-dependencies] assert_cmd = "1.0.4" env_logger = "0.8.3" predicates = "1.0.8" tempfile = "3.2.0" +scraper = "0.24" diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index d1ed84e1..a0db4721 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -2,6 +2,7 @@ mod benchmark; mod clean; mod effect_size; mod fingerprint; +mod report; mod suite; mod summarize; mod upload; @@ -13,6 +14,7 @@ use clean::CleanCommand; use effect_size::EffectSizeCommand; use fingerprint::FingerprintCommand; use log::trace; +use report::ReportCommand; use structopt::{clap::AppSettings, StructOpt}; use summarize::SummarizeCommand; use upload::UploadCommand; @@ -40,6 +42,7 @@ enum SightglassCommand { Clean(CleanCommand), EffectSize(EffectSizeCommand), Fingerprint(FingerprintCommand), + Report(ReportCommand), Summarize(SummarizeCommand), UploadElastic(UploadCommand), Validate(ValidateCommand), @@ -53,6 +56,7 @@ impl SightglassCommand { SightglassCommand::Clean(clean) => clean.execute(), SightglassCommand::EffectSize(effect_size) => effect_size.execute(), SightglassCommand::Fingerprint(fingerprint) => fingerprint.execute(), + SightglassCommand::Report(report) => report.execute(), SightglassCommand::Summarize(summarize) => summarize.execute(), SightglassCommand::UploadElastic(upload) => upload.execute(), SightglassCommand::Validate(validate) => validate.execute(), diff --git a/crates/cli/src/report.jinja b/crates/cli/src/report.jinja new file mode 100644 index 00000000..159cbd9f --- /dev/null +++ b/crates/cli/src/report.jinja @@ -0,0 +1,436 @@ + + + + + + Sightglass Benchmark Results + + + + + + {% for benchmark in stats.benchmarks %} + + {% endfor %} + + + +

Sightglass Benchmark Results

+
+ Results use {{ confidence_pct|floatfmt }}% confidence intervals (α = {{ significance_level }}). + CV is Coefficient of Variation (measurement consistency). +
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ + + + + + + + {% for engine in stats.benchmarks[0].stats_by_engine %} + {% if engine != stats.baseline_engine %} + + {% endif %} + {% endfor %} + + + + {% for benchmark in stats.benchmarks %} + {% set bstats = benchmark.baseline_stats %} + {% set has_significant = namespace(value=false) %} + {% set best_confidence = namespace(value=1.0) %} + {% for engine, pstats in benchmark.stats_by_engine|items %} + {% if pstats.relative_stats and pstats.relative_stats.is_significant %} + {% set has_significant.value = true %} + {% if pstats.significance_level < best_confidence.value %} + {% set best_confidence.value = pstats.significance_level %} + {% endif %} + {% endif %} + {% endfor %} + + + {# CV% column #} + {% set bstats = benchmark.stats_by_engine[stats.baseline_engine] %} + {% set cv_class = "inconsistent" if bstats.cv > 5 else "" %} + + {# Baseline column without CV #} + + {# Then show other engines #} + {% for engine, pstats in benchmark.stats_by_engine|items %} + {% if pstats.relative_stats %} + {% set rel = pstats.relative_stats %} + {% set class = "slower" if rel.is_significant and rel.speedup_ratio > 1 else "faster" if rel.is_significant and rel.speedup_ratio < 1 else "" %} + {% if rel.is_significant %} + {% if rel.speedup_ratio < 1 %} + {% set pct_faster = ((1 - rel.speedup_ratio) * 100)|floatfmt %} + + {% else %} + {% set pct_slower = ((rel.speedup_ratio - 1) * 100)|floatfmt %} + + {% endif %} + {% else %} + + {% endif %} + {% endif %} + {% endfor %} + + {% endfor %} + +
BenchmarkCV%📊 {{ stats.baseline_engine }}{{ stats.benchmarks[0].short_names[engine] }}
{{ benchmark.name }}{{ bstats.cv|floatfmt }}%{{ bstats.p25|cyclefmt }} cycles (p25){{ pct_faster }}% faster{{ pct_slower }}% slowerNo significant difference
+
+ +
+ {% for benchmark in stats.benchmarks %} + {% set bstats = benchmark.baseline_stats %} + {% set has_significant = namespace(value=false) %} + {% for engine, pstats in benchmark.stats_by_engine|items %} + {% if pstats.relative_stats and pstats.relative_stats.is_significant %} + {% set has_significant.value = true %} + {% endif %} + {% endfor %} +
+

{{ benchmark.name }}

+ + + + + + + + + + + + + + + + + + + {% for engine, pstats in benchmark.stats_by_engine|items %} + {% if pstats.relative_stats and engine != stats.baseline_engine %} + {% set rel = pstats.relative_stats %} + + + + + + + + {% endif %} + {% endfor %} + +
EngineCycles (p25)PerformanceConfidence IntervalCV%
📊 {{ stats.baseline_engine }}{{ bstats.p25|cyclefmt }} cycles (p25){{ bstats.cv|floatfmt }}%
{{ benchmark.short_names[engine] }}{{ pstats.p25|cyclefmt }} cycles + {% if rel.is_significant %} + {% set class = "slower" if rel.speedup_ratio > 1 else "faster" %} + {% if rel.speedup_ratio < 1 %} + {% set pct_faster = ((1 - rel.speedup_ratio) * 100)|floatfmt %} + {{ pct_faster }}% faster + {% else %} + {% set pct_slower = ((rel.speedup_ratio - 1) * 100)|floatfmt %} + {{ pct_slower }}% slower + {% endif %} + {% else %} + No significant difference + {% endif %} + + {% if rel.confidence_interval_half_width %} + ±{{ rel.confidence_interval_half_width|cyclefmt }} cycles + {% else %} + — + {% endif %} + {{ pstats.cv|floatfmt }}%
+
+
+ {% endfor %} +
+ + + +
+

Statistical Methods

+

+ Uses effect size analysis with confidence intervals based on Student's t-test. + Statistical significance indicates the difference is likely real (not measurement noise). + Tests with CV > 5% may have unreliable measurements. +

+

+ Baseline Engine (📊): The baseline engine is the reference point for all comparisons. + Performance differences are calculated relative to the baseline. The baseline engine appears with a chart icon (📊) and is highlighted with a light blue background in detailed tables. +

+

+ P25 Metric: Cycle counts show the 25th percentile (p25) rather than mean or median. + This metric is more robust to outliers, as noise in benchmarking typically appears as spikes on the higher end (system interrupts, background processes, etc.). + P25 represents a "good run" that is consistently achievable—25% of runs are this fast or faster. +

+

+ Color Coding: + Green indicates significantly faster performance, + red indicates significantly slower, and + gray indicates high measurement noise (CV > 5%). + No highlighting means no statistically significant difference from baseline. +

+

+ References: + Benchmark Suite RFC | + Sightglass Documentation +

+
+ + diff --git a/crates/cli/src/report.rs b/crates/cli/src/report.rs new file mode 100644 index 00000000..620a92d0 --- /dev/null +++ b/crates/cli/src/report.rs @@ -0,0 +1,405 @@ +use std::{ + cell::Cell, + collections::HashMap, + fs::File, + hash::{Hash, Hasher}, + io::{BufReader, Write}, + path::{Path, PathBuf}, +}; + +use serde::Serialize; +use sightglass_analysis::report_stats::{calculate_benchmark_stats, BenchmarkStats, ReportConfig}; +use sightglass_data::{extract_benchmark_name, Engine, Format, Measurement, Phase}; +use structopt::StructOpt; +use vega_lite_4::{ + AxisBuilder, ColorClassBuilder, EdEncodingBuilder, LegendBuilder, Mark, NormalizedSpecBuilder, + XClassBuilder, YClassBuilder, +}; + +const TEMPLATE: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/report.jinja")); + +/// Generate an HTML report for a given set of raw inputs +#[derive(Debug, StructOpt)] +#[structopt(name = "report")] +pub struct ReportCommand { + /// The format of the input data. Either 'json' or 'csv'; if not provided + /// then we will attempt to infer it from provided filenames, falling back to json. + #[structopt(short = "i", long = "input-format")] + input_format: Option, + + /// Output HTML file path + #[structopt(short = "o", long = "output-file", default_value = "report.html")] + output_path: PathBuf, + + /// Name of the baseline to use; if not provided, the first engine encountered + /// in the ordered input files will be used. + #[structopt(short = "b", long = "baseline-engine")] + baseline_engine: Option, + + /// Significance level for statistical tests (default: 0.05 for 95% confidence) + #[structopt(long = "significance-level", default_value = "0.05")] + significance_level: f64, + + /// Primary event to analyze (default: cycles) + #[structopt(long = "event", default_value = "cycles")] + primary_event: String, + + /// Target phase to analyze (default: execution) + #[structopt(long = "phase", default_value = "execution")] + target_phase: Phase, + + /// Path to the file(s) that will be read from, or none to indicate stdin (default). + #[structopt(min_values = 1)] + input_files: Vec, +} + +#[derive(Debug, Serialize)] +struct Chart { + json: String, + id: u64, +} + +#[derive(Debug, Serialize)] +struct BenchmarkData { + name: String, + chart: Chart, + stats_by_engine: HashMap, + baseline_stats: BenchmarkStats, + short_names: HashMap, +} + +#[derive(Debug, Serialize)] +struct SightglassStats { + baseline_engine: String, + benchmarks: Vec, +} + +fn get_available_events(measurements: &[Measurement]) -> String { + let mut events: Vec<&str> = measurements + .iter() + .map(|m| m.event.as_ref()) + .collect::>() + .into_iter() + .collect(); + events.sort(); + events.join(", ") +} + +fn get_available_phases(measurements: &[Measurement]) -> String { + let mut phases: Vec = measurements + .iter() + .map(|m| format!("{:?}", m.phase)) + .collect::>() + .into_iter() + .collect(); + phases.sort(); + phases.join(", ") +} + +fn determine_baseline_engine( + measurements: &[Measurement], + requested_baseline: Option<&String>, +) -> String { + if let Some(baseline) = requested_baseline { + return baseline.clone(); + } + + // Get first available engine from measurements + measurements + .iter() + .map(|m| m.engine.to_string()) + .next() + .unwrap_or_else(|| "baseline".to_string()) +} + +fn parse_input( + format: Option, + path: impl AsRef, +) -> anyhow::Result>> { + let format = format + .or_else(|| match path.as_ref().extension()?.to_str()? { + "json" => Some(Format::Json), + "csv" => Some(Format::Csv { + headers: Cell::new(true), + }), + _ => None, + }) + .unwrap_or(Format::Json); + + let file = File::open(&path)?; + let reader = BufReader::new(file); + let measurements: Vec = format.read(reader)?; + + Ok(measurements) +} + +impl ReportCommand { + fn plot_benchmark( + &self, + bstats: &BenchmarkStats, + benchmark: &str, + measurements: &[&Measurement], + ) -> anyhow::Result { + use vega_lite_4::{self as vl, VegaliteBuilder}; + + // Create a simple data structure for vega-lite + #[derive(Debug, serde::Serialize)] + struct ChartDataPoint { + count: u64, + engine: String, + p25_delta_pct: f64, + } + + let chart_data: Vec = measurements + .iter() + .map(|m| ChartDataPoint { + count: m.count, + engine: m.engine.to_string(), + p25_delta_pct: (100.0 * (m.count as f64 - bstats.p25) + / ((m.count as f64 + bstats.p25) / 2.0)), + }) + .collect(); + let cycles_chart = NormalizedSpecBuilder::default() + .data(&chart_data) + .mark(Mark::Boxplot) + .encoding( + EdEncodingBuilder::default() + .x(XClassBuilder::default() + .field("count") + .position_def_type(vl::Type::Quantitative) + .axis(AxisBuilder::default().title("cycles").build()?) + .build()?) + .y(YClassBuilder::default() + .field("engine") + .position_def_type(vl::Type::Nominal) + .axis(AxisBuilder::default().labels(false).build()?) + .build()?) + .color( + ColorClassBuilder::default() + .field("engine") + .legend( + LegendBuilder::default() + .title("Engine") + .orient(vega_lite_4::LegendOrient::Bottom) + .label_limit(600.0) + .direction(vega_lite_4::Orientation::Vertical) + .columns(1.0) + .build()?, + ) + .build()?, + ) + .build()?, + ) + .build()?; + let pct_chart = NormalizedSpecBuilder::default() + .data(&chart_data) + .mark(Mark::Boxplot) + .encoding( + EdEncodingBuilder::default() + .x(XClassBuilder::default() + .field("p25_delta_pct") + .position_def_type(vl::Type::Quantitative) + .axis( + AxisBuilder::default() + .title("delta p25 as percentage") + .build()?, + ) + .build()?) + .y(YClassBuilder::default() + .field("engine") + .position_def_type(vl::Type::Nominal) + .axis(AxisBuilder::default().labels(false).build()?) + .build()?) + .color( + ColorClassBuilder::default() + .field("engine") + .legend( + LegendBuilder::default() + .title("Engine") + .orient(vega_lite_4::LegendOrient::Bottom) + .label_limit(600.0) + .direction(vega_lite_4::Orientation::Vertical) + .columns(1.0) + .build()?, + ) + .build()?, + ) + .build()?, + ) + .build()?; + + let chart = VegaliteBuilder::default() + .title(benchmark) + .hconcat(vec![cycles_chart, pct_chart]) + .build()?; + + Ok(chart.to_string()?) + } + + fn compute_stats(&self, measurements: &[Measurement]) -> anyhow::Result { + // Determine baseline engine from CLI args or first available + let baseline_engine = + determine_baseline_engine(measurements, self.baseline_engine.as_ref()); + + // Create ReportConfig from CLI arguments (still using original names for logic) + let config = ReportConfig::new(baseline_engine) + .with_event(&self.primary_event) + .with_phase(self.target_phase) + .with_significance_level(self.significance_level); + + // Use the new calculate_benchmark_stats function with ReportConfig + let benchmark_stats = calculate_benchmark_stats(measurements, &config)?; + + // Check if we found any matching data + if benchmark_stats.is_empty() { + anyhow::bail!( + "No measurements found matching the specified criteria:\n\ + - Event: {}\n\ + - Phase: {:?}\n\ + \n\ + Available events: {}\n\ + Available phases: {}", + config.primary_event, + config.target_phase, + get_available_events(measurements), + get_available_phases(measurements) + ); + } + + let mut benchmarks_data: Vec = Vec::new(); + + // Keep original baseline name for display + let baseline_engine_for_display = config.baseline_engine.clone(); + + // Convert the calculated benchmark stats to our display format + for (benchmark_name, stats_by_engine) in benchmark_stats { + // Use baseline engine from config + let baseline_engine = config.baseline_engine.as_str(); + + let baseline_stats = stats_by_engine + .get(baseline_engine) + .cloned() + .unwrap_or_else(|| stats_by_engine.values().next().unwrap().clone()); + + // Get measurements for this benchmark that match our config filters + let benchmark_measurements: Vec<&Measurement> = measurements + .iter() + .filter(|m| { + extract_benchmark_name(&m.wasm) == benchmark_name + && m.phase == config.target_phase + && m.event == config.primary_event + }) + .collect(); + + let chart_json = + self.plot_benchmark(&baseline_stats, &benchmark_name, &benchmark_measurements)?; + let id = { + let mut h = std::hash::DefaultHasher::new(); + benchmark_name.hash(&mut h); + h.finish() + }; + + // Compute short names for this benchmark's engines + // Get unique engines from the measurements for this benchmark + let benchmark_engines: Vec<&Engine> = benchmark_measurements + .iter() + .map(|m| &m.engine) + .collect::>() + .into_iter() + .collect(); + + // Find the baseline engine + let baseline_engine_obj = benchmark_engines + .iter() + .find(|e| e.to_string() == baseline_engine) + .or_else(|| benchmark_engines.first()) + .unwrap(); + + // Compute shortened names relative to baseline + let short_names: HashMap = benchmark_engines + .iter() + .map(|engine| { + let full = engine.to_string(); + if *engine == *baseline_engine_obj { + (full.clone(), full) + } else { + let (_, short) = baseline_engine_obj.relative_labels(engine); + // Add ellipsis if prefix was removed (short will be a suffix of full) + let short_with_ellipsis = if short != full && full.ends_with(&short) { + format!("…{}", short) + } else { + short + }; + (full, short_with_ellipsis) + } + }) + .collect(); + + benchmarks_data.push(BenchmarkData { + name: benchmark_name, + chart: Chart { + json: chart_json, + id, + }, + stats_by_engine, + baseline_stats, + short_names, + }); + } + + // Sort benchmarks by name for consistent ordering + benchmarks_data.sort_by(|a, b| a.name.cmp(&b.name)); + + Ok(SightglassStats { + baseline_engine: baseline_engine_for_display, + benchmarks: benchmarks_data, + }) + } + + pub fn execute(&self) -> anyhow::Result<()> { + let mut all_measurements = Vec::new(); + + for input_file in &self.input_files { + let measurements = parse_input(self.input_format.clone(), input_file)?; + all_measurements.extend(measurements); + } + + let stats = self.compute_stats(&all_measurements)?; + self.generate_html(stats)?; + + Ok(()) + } + + fn generate_html(&self, stats: SightglassStats) -> anyhow::Result<()> { + let mut env = minijinja::Environment::new(); + env.add_template("report", TEMPLATE)?; + env.add_filter("floatfmt", |v: f64| format!("{v:0.2}")); + env.add_filter("intfmt", |v: f64| format!("{v:.0}")); + env.add_filter("cyclefmt", |v: f64| { + let v = v.abs(); + if v >= 1_000_000_000.0 { + format!("{:.1}B", v / 1_000_000_000.0) + } else if v >= 1_000_000.0 { + format!("{:.1}M", v / 1_000_000.0) + } else if v >= 1_000.0 { + format!("{:.1}K", v / 1_000.0) + } else { + format!("{:.0}", v) + } + }); + + let template = env.get_template("report")?; + + let confidence_pct = (1.0 - self.significance_level) * 100.0; + let ctx = minijinja::context!( + stats => stats, + significance_level => self.significance_level, + confidence_pct => confidence_pct, + ); + + let mut f = std::fs::File::create(&self.output_path)?; + f.write_all(template.render(ctx)?.as_bytes())?; + + Ok(()) + } +} diff --git a/crates/cli/tests/all/main.rs b/crates/cli/tests/all/main.rs index c621a4b0..0f8eaea5 100644 --- a/crates/cli/tests/all/main.rs +++ b/crates/cli/tests/all/main.rs @@ -1,6 +1,7 @@ mod benchmark; mod fingerprint; mod help; +mod report; mod upload; mod util; diff --git a/crates/cli/tests/all/report.rs b/crates/cli/tests/all/report.rs new file mode 100644 index 00000000..b76c42b8 --- /dev/null +++ b/crates/cli/tests/all/report.rs @@ -0,0 +1,227 @@ +use super::util::sightglass_cli; +use assert_cmd::prelude::*; +use predicates::prelude::*; +use scraper::{Html, Selector}; +use std::fs; +use tempfile::TempDir; + +fn test_results_json() -> &'static str { + concat!(env!("CARGO_MANIFEST_DIR"), "/tests/results.json") +} + +fn multi_engine_v38_json() -> &'static str { + concat!(env!("CARGO_MANIFEST_DIR"), "/tests/multi_engine_v38.json") +} + +fn multi_engine_v38_epoch_json() -> &'static str { + concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/multi_engine_v38_epoch.json" + ) +} + +fn count_css_elements(html_content: &str, selector: &str) -> usize { + let document = Html::parse_document(html_content); + let css_selector = Selector::parse(selector).unwrap(); + document.select(&css_selector).count() +} + +#[test] +fn report_generates_valid_html() { + // Test the happy path: report generation with multi-engine data + let temp_dir = TempDir::new().unwrap(); + let output_path = temp_dir.path().join("report.html"); + + sightglass_cli() + .arg("report") + .arg("--output-file") + .arg(&output_path) + .arg(multi_engine_v38_json()) + .arg(multi_engine_v38_epoch_json()) + .assert() + .success(); + + let html_content = fs::read_to_string(&output_path).unwrap(); + + // Verify essential report elements exist + assert!(html_content.contains(" 0, + "Should have tables" + ); + + // Verify charts exist + assert!( + html_content.contains("\"title\":\"bz2\""), + "Should have benchmark charts" + ); + + // Verify statistical indicators + assert!( + html_content.contains("CV") && html_content.contains("%"), + "Should show coefficient of variation" + ); +} + +#[test] +fn report_command_line_options() { + let temp_dir = TempDir::new().unwrap(); + let output_path = temp_dir.path().join("report.html"); + + // Test various command-line options work + sightglass_cli() + .arg("report") + .arg("--help") + .assert() + .success() + .stdout(predicate::str::contains("Generate an HTML report")); + + // Test custom baseline + sightglass_cli() + .arg("report") + .arg("--baseline-engine") + .arg("engines/wasmtime/wasmtime-v38/libengine.dylib (-W epoch-interruption=y)") + .arg("--output-file") + .arg(&output_path) + .arg(multi_engine_v38_json()) + .arg(multi_engine_v38_epoch_json()) + .assert() + .success(); + + let html = fs::read_to_string(&output_path).unwrap(); + assert!( + html.contains("(-W epoch-interruption=y)"), + "Should use custom baseline" + ); + + // Test custom significance level + let output_path2 = temp_dir.path().join("report2.html"); + sightglass_cli() + .arg("report") + .arg("--significance-level") + .arg("0.01") + .arg("--output-file") + .arg(&output_path2) + .arg(test_results_json()) + .assert() + .success(); + + let html2 = fs::read_to_string(&output_path2).unwrap(); + assert!( + html2.contains("99") && html2.contains("%"), + "Should show 99% confidence" + ); + + // Test custom event and phase + let output_path3 = temp_dir.path().join("report3.html"); + sightglass_cli() + .arg("report") + .arg("--event") + .arg("nanoseconds") + .arg("--phase") + .arg("compilation") + .arg("--output-file") + .arg(&output_path3) + .arg(test_results_json()) + .assert() + .success(); +} + +#[test] +fn report_error_cases() { + let temp_dir = TempDir::new().unwrap(); + let output_path = temp_dir.path().join("report.html"); + + // Missing input files + sightglass_cli() + .arg("report") + .arg("--output-file") + .arg(&output_path) + .assert() + .failure(); + + // Nonexistent input file + sightglass_cli() + .arg("report") + .arg("--output-file") + .arg(&output_path) + .arg("nonexistent.json") + .assert() + .failure(); + + // Invalid significance level + sightglass_cli() + .arg("report") + .arg("--significance-level") + .arg("1.5") + .arg("--output-file") + .arg(&output_path) + .arg(test_results_json()) + .assert() + .failure() + .stderr(predicate::str::contains("Invalid significance level")); + + // Invalid event + sightglass_cli() + .arg("report") + .arg("--event") + .arg("nonexistent_event") + .arg("--output-file") + .arg(&output_path) + .arg(test_results_json()) + .assert() + .failure() + .stderr(predicate::str::contains("No measurements found")); +} + +#[test] +fn report_statistical_correctness() { + // Verify that changing significance level affects results + let temp_dir = TempDir::new().unwrap(); + let input_files = &[multi_engine_v38_json(), multi_engine_v38_epoch_json()]; + + // Strict significance + let strict_output = temp_dir.path().join("strict.html"); + sightglass_cli() + .arg("report") + .arg("--significance-level") + .arg("0.01") + .arg("--output-file") + .arg(&strict_output) + .arg(input_files[0]) + .arg(input_files[1]) + .assert() + .success(); + + // Lenient significance + let lenient_output = temp_dir.path().join("lenient.html"); + sightglass_cli() + .arg("report") + .arg("--significance-level") + .arg("0.10") + .arg("--output-file") + .arg(&lenient_output) + .arg(input_files[0]) + .arg(input_files[1]) + .assert() + .success(); + + let strict_html = fs::read_to_string(&strict_output).unwrap(); + let lenient_html = fs::read_to_string(&lenient_output).unwrap(); + + // Lenient should find same or more significant results + let strict_significant = + count_css_elements(&strict_html, ".slower") + count_css_elements(&strict_html, ".faster"); + let lenient_significant = + count_css_elements(&lenient_html, ".slower") + count_css_elements(&lenient_html, ".faster"); + + assert!( + lenient_significant >= strict_significant, + "Lenient significance should find more results" + ); +} diff --git a/crates/cli/tests/all/upload.rs b/crates/cli/tests/all/upload.rs index d9f3459f..0307ee27 100644 --- a/crates/cli/tests/all/upload.rs +++ b/crates/cli/tests/all/upload.rs @@ -1,32 +1,30 @@ //! Test `sightglass-cli upload`. -use super::util::{benchmark, sightglass_cli, test_engine}; -use assert_cmd::prelude::*; -use predicates::prelude::*; - // Because the `results.json` contains `*.so` suffixes for the engine, this test // can only run where the fingerprinted engine will have a matching suffix, // i.e., Linux. #[cfg(target_os = "linux")] #[test] fn upload_dryrun() { - let assert = sightglass_cli() - .arg("upload-elastic") - .arg("--dry-run") - .arg("--input-file") - .arg("tests/results.json") - .arg("--batch-size") - .arg("200") - .env("RUST_LOG", "debug") - .assert(); + let assert = assert_cmd::assert::OutputAssertExt::assert( + crate::util::sightglass_cli() + .arg("upload-elastic") + .arg("--dry-run") + .arg("--input-file") + .arg("tests/results.json") + .arg("--batch-size") + .arg("200") + .env("RUST_LOG", "debug"), + ); // Gather up the logged output from stderr. let stderr = std::str::from_utf8(&assert.get_output().stderr).unwrap(); eprintln!("=== stderr ===\n{stderr}\n==========="); // Gather the fingerprints of the system under test. - let engine = sightglass_fingerprint::Engine::fingerprint(test_engine()).unwrap(); - let benchmark = sightglass_fingerprint::Benchmark::fingerprint(benchmark("noop")).unwrap(); + let engine = sightglass_fingerprint::Engine::fingerprint(crate::util::test_engine()).unwrap(); + let benchmark = + sightglass_fingerprint::Benchmark::fingerprint(crate::util::benchmark("noop")).unwrap(); let machine = sightglass_fingerprint::Machine::fingerprint().unwrap(); // Check that we upload measurement records for each of the measurements in the file. @@ -36,7 +34,9 @@ fn upload_dryrun() { assert_eq!(num_uploaded_batches, 3); // Also, heck that we create records for the engine/machine/benchmark. - use predicate::str::*; + use predicates::prelude::*; + use predicates::str::*; + assert .stderr( contains(format!( diff --git a/crates/cli/tests/multi_engine_v38.json b/crates/cli/tests/multi_engine_v38.json new file mode 100644 index 00000000..7f817d40 --- /dev/null +++ b/crates/cli/tests/multi_engine_v38.json @@ -0,0 +1 @@ +[{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":0,"phase":"Compilation","event":"cycles","count":35822471},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":0,"phase":"Instantiation","event":"cycles","count":606060},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":0,"phase":"Execution","event":"cycles","count":1890340},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":1,"phase":"Compilation","event":"cycles","count":17803831},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":1,"phase":"Instantiation","event":"cycles","count":31810},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":1,"phase":"Execution","event":"cycles","count":1707068},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":2,"phase":"Compilation","event":"cycles","count":20452027},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":2,"phase":"Instantiation","event":"cycles","count":28476},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":2,"phase":"Execution","event":"cycles","count":1574522},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":3,"phase":"Compilation","event":"cycles","count":32152593},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":3,"phase":"Instantiation","event":"cycles","count":48785},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":3,"phase":"Execution","event":"cycles","count":1701817},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":4,"phase":"Compilation","event":"cycles","count":26092654},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":4,"phase":"Instantiation","event":"cycles","count":31059},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94516,"iteration":4,"phase":"Execution","event":"cycles","count":1534379},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":0,"phase":"Compilation","event":"cycles","count":403747433},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":0,"phase":"Instantiation","event":"cycles","count":90845},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":0,"phase":"Execution","event":"cycles","count":312508417},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":1,"phase":"Compilation","event":"cycles","count":370263109},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":1,"phase":"Instantiation","event":"cycles","count":102862},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":1,"phase":"Execution","event":"cycles","count":304825029},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":2,"phase":"Compilation","event":"cycles","count":395734995},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":2,"phase":"Instantiation","event":"cycles","count":75344},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":2,"phase":"Execution","event":"cycles","count":304457627},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":3,"phase":"Compilation","event":"cycles","count":365748632},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":3,"phase":"Instantiation","event":"cycles","count":55076},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":3,"phase":"Execution","event":"cycles","count":302171350},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":4,"phase":"Compilation","event":"cycles","count":367848471},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":4,"phase":"Instantiation","event":"cycles","count":73368},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94522,"iteration":4,"phase":"Execution","event":"cycles","count":299110158},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":0,"phase":"Compilation","event":"cycles","count":13371658},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":0,"phase":"Instantiation","event":"cycles","count":46993},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":0,"phase":"Execution","event":"cycles","count":19657695},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":1,"phase":"Compilation","event":"cycles","count":12209490},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":1,"phase":"Instantiation","event":"cycles","count":29226},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":1,"phase":"Execution","event":"cycles","count":19559060},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":2,"phase":"Compilation","event":"cycles","count":12747831},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":2,"phase":"Instantiation","event":"cycles","count":26601},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":2,"phase":"Execution","event":"cycles","count":19588410},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":3,"phase":"Compilation","event":"cycles","count":12394929},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":3,"phase":"Instantiation","event":"cycles","count":24209},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":3,"phase":"Execution","event":"cycles","count":19627386},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":4,"phase":"Compilation","event":"cycles","count":13363700},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":4,"phase":"Instantiation","event":"cycles","count":26560},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94550,"iteration":4,"phase":"Execution","event":"cycles","count":19568602},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":0,"phase":"Compilation","event":"cycles","count":378178078},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":0,"phase":"Instantiation","event":"cycles","count":90761},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":0,"phase":"Execution","event":"cycles","count":302183934},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":1,"phase":"Compilation","event":"cycles","count":364089041},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":1,"phase":"Instantiation","event":"cycles","count":67577},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":1,"phase":"Execution","event":"cycles","count":303291609},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":2,"phase":"Compilation","event":"cycles","count":358463698},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":2,"phase":"Instantiation","event":"cycles","count":85719},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":2,"phase":"Execution","event":"cycles","count":300372588},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":3,"phase":"Compilation","event":"cycles","count":362689208},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":3,"phase":"Instantiation","event":"cycles","count":60910},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":3,"phase":"Execution","event":"cycles","count":302941356},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":4,"phase":"Compilation","event":"cycles","count":356450396},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":4,"phase":"Instantiation","event":"cycles","count":66827},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94551,"iteration":4,"phase":"Execution","event":"cycles","count":303692628},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":0,"phase":"Compilation","event":"cycles","count":17800831},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":0,"phase":"Instantiation","event":"cycles","count":52744},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":0,"phase":"Execution","event":"cycles","count":1586623},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":1,"phase":"Compilation","event":"cycles","count":17154296},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":1,"phase":"Instantiation","event":"cycles","count":30601},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":1,"phase":"Execution","event":"cycles","count":1518588},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":2,"phase":"Compilation","event":"cycles","count":16712466},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":2,"phase":"Instantiation","event":"cycles","count":28143},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":2,"phase":"Execution","event":"cycles","count":1538587},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":3,"phase":"Compilation","event":"cycles","count":16394522},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":3,"phase":"Instantiation","event":"cycles","count":30309},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":3,"phase":"Execution","event":"cycles","count":1539587},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":4,"phase":"Compilation","event":"cycles","count":16650455},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":4,"phase":"Instantiation","event":"cycles","count":34767},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94582,"iteration":4,"phase":"Execution","event":"cycles","count":1576414},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":0,"phase":"Compilation","event":"cycles","count":13392009},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":0,"phase":"Instantiation","event":"cycles","count":55035},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":0,"phase":"Execution","event":"cycles","count":19731456},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":1,"phase":"Compilation","event":"cycles","count":12443755},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":1,"phase":"Instantiation","event":"cycles","count":24850},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":1,"phase":"Execution","event":"cycles","count":19703856},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":2,"phase":"Compilation","event":"cycles","count":12552850},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":2,"phase":"Instantiation","event":"cycles","count":24292},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":2,"phase":"Execution","event":"cycles","count":19678129},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":3,"phase":"Compilation","event":"cycles","count":13629607},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":3,"phase":"Instantiation","event":"cycles","count":26225},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":3,"phase":"Execution","event":"cycles","count":19433239},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":4,"phase":"Compilation","event":"cycles","count":13404175},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":4,"phase":"Instantiation","event":"cycles","count":25185},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94583,"iteration":4,"phase":"Execution","event":"cycles","count":19712606}] \ No newline at end of file diff --git a/crates/cli/tests/multi_engine_v38_epoch.json b/crates/cli/tests/multi_engine_v38_epoch.json new file mode 100644 index 00000000..2634c681 --- /dev/null +++ b/crates/cli/tests/multi_engine_v38_epoch.json @@ -0,0 +1 @@ +[{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":0,"phase":"Compilation","event":"cycles","count":24806541,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":0,"phase":"Instantiation","event":"cycles","count":62493,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":0,"phase":"Execution","event":"cycles","count":2574411,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":1,"phase":"Compilation","event":"cycles","count":30807921,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":1,"phase":"Instantiation","event":"cycles","count":35600,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":1,"phase":"Execution","event":"cycles","count":2173057,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":2,"phase":"Compilation","event":"cycles","count":20975678,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":2,"phase":"Instantiation","event":"cycles","count":34893,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":2,"phase":"Execution","event":"cycles","count":1948816,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":3,"phase":"Compilation","event":"cycles","count":19656570,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":3,"phase":"Instantiation","event":"cycles","count":39352,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":3,"phase":"Execution","event":"cycles","count":1809995,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":4,"phase":"Compilation","event":"cycles","count":19207432,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":4,"phase":"Instantiation","event":"cycles","count":30435,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94624,"iteration":4,"phase":"Execution","event":"cycles","count":1749835,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":0,"phase":"Compilation","event":"cycles","count":421597967,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":0,"phase":"Instantiation","event":"cycles","count":75053,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":0,"phase":"Execution","event":"cycles","count":319695106,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":1,"phase":"Compilation","event":"cycles","count":448184903,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":1,"phase":"Instantiation","event":"cycles","count":69260,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":1,"phase":"Execution","event":"cycles","count":320053567,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":2,"phase":"Compilation","event":"cycles","count":430772073,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":2,"phase":"Instantiation","event":"cycles","count":131904,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":2,"phase":"Execution","event":"cycles","count":333660431,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":3,"phase":"Compilation","event":"cycles","count":406736990,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":3,"phase":"Instantiation","event":"cycles","count":92761,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":3,"phase":"Execution","event":"cycles","count":320584533,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":4,"phase":"Compilation","event":"cycles","count":465124675,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":4,"phase":"Instantiation","event":"cycles","count":109238,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94625,"iteration":4,"phase":"Execution","event":"cycles","count":335472196,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":0,"phase":"Compilation","event":"cycles","count":19990264,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":0,"phase":"Instantiation","event":"cycles","count":54369,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":0,"phase":"Execution","event":"cycles","count":23220294,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":1,"phase":"Compilation","event":"cycles","count":17820598,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":1,"phase":"Instantiation","event":"cycles","count":25500,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":1,"phase":"Execution","event":"cycles","count":23494327,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":2,"phase":"Compilation","event":"cycles","count":17468805,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":2,"phase":"Instantiation","event":"cycles","count":25643,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":2,"phase":"Execution","event":"cycles","count":23304204,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":3,"phase":"Compilation","event":"cycles","count":17577250,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":3,"phase":"Instantiation","event":"cycles","count":33476,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":3,"phase":"Execution","event":"cycles","count":23242645,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":4,"phase":"Compilation","event":"cycles","count":17385252,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":4,"phase":"Instantiation","event":"cycles","count":26642,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94655,"iteration":4,"phase":"Execution","event":"cycles","count":23300912,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":0,"phase":"Compilation","event":"cycles","count":422668374,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":0,"phase":"Instantiation","event":"cycles","count":84369,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":0,"phase":"Execution","event":"cycles","count":328790845,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":1,"phase":"Compilation","event":"cycles","count":417414600,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":1,"phase":"Instantiation","event":"cycles","count":86619,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":1,"phase":"Execution","event":"cycles","count":323674369,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":2,"phase":"Compilation","event":"cycles","count":419997802,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":2,"phase":"Instantiation","event":"cycles","count":64951,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":2,"phase":"Execution","event":"cycles","count":321732992,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":3,"phase":"Compilation","event":"cycles","count":431816897,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":3,"phase":"Instantiation","event":"cycles","count":65910,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":3,"phase":"Execution","event":"cycles","count":324543235,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":4,"phase":"Compilation","event":"cycles","count":409533440,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":4,"phase":"Instantiation","event":"cycles","count":61201,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/spidermonkey/benchmark.wasm","process":94656,"iteration":4,"phase":"Execution","event":"cycles","count":335560664,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":0,"phase":"Compilation","event":"cycles","count":23013713,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":0,"phase":"Instantiation","event":"cycles","count":59702,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":0,"phase":"Execution","event":"cycles","count":1977060,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":1,"phase":"Compilation","event":"cycles","count":21349829,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":1,"phase":"Instantiation","event":"cycles","count":28935,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":1,"phase":"Execution","event":"cycles","count":1860948,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":2,"phase":"Compilation","event":"cycles","count":20445069,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":2,"phase":"Instantiation","event":"cycles","count":31268,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":2,"phase":"Execution","event":"cycles","count":1766852,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":3,"phase":"Compilation","event":"cycles","count":19637403,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":3,"phase":"Instantiation","event":"cycles","count":28602,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":3,"phase":"Execution","event":"cycles","count":1955500,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":4,"phase":"Compilation","event":"cycles","count":19825342,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":4,"phase":"Instantiation","event":"cycles","count":27958,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/pulldown-cmark/benchmark.wasm","process":94689,"iteration":4,"phase":"Execution","event":"cycles","count":1745086,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":0,"phase":"Compilation","event":"cycles","count":18963457,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":0,"phase":"Instantiation","event":"cycles","count":49202,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":0,"phase":"Execution","event":"cycles","count":23575130,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":1,"phase":"Compilation","event":"cycles","count":17917152,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":1,"phase":"Instantiation","event":"cycles","count":27310,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":1,"phase":"Execution","event":"cycles","count":23594254,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":2,"phase":"Compilation","event":"cycles","count":18934648,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":2,"phase":"Instantiation","event":"cycles","count":26976,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":2,"phase":"Execution","event":"cycles","count":23506494,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":3,"phase":"Compilation","event":"cycles","count":18437284,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":3,"phase":"Instantiation","event":"cycles","count":25059,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":3,"phase":"Execution","event":"cycles","count":23782420,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":4,"phase":"Compilation","event":"cycles","count":18091381,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":4,"phase":"Instantiation","event":"cycles","count":25101,"engine_flags":"-W epoch-interruption=y"},{"arch":"aarch64","engine":"engines/wasmtime/wasmtime-v38/libengine.dylib","wasm":"benchmarks/bz2/benchmark.wasm","process":94700,"iteration":4,"phase":"Execution","event":"cycles","count":23400982,"engine_flags":"-W epoch-interruption=y"}] \ No newline at end of file diff --git a/crates/data/src/lib.rs b/crates/data/src/lib.rs index 896ec1b1..f38f6281 100755 --- a/crates/data/src/lib.rs +++ b/crates/data/src/lib.rs @@ -68,7 +68,7 @@ impl<'a> Engine<'a> { // name/flags and remove any common prefix. let self_str = format!("{self}"); let other_str = format!("{other}"); - let idx_end_of_shared = self_str + let mut idx_end_of_shared = self_str .char_indices() .zip(other_str.char_indices()) .find_map(|((i, a), (j, b))| { @@ -81,6 +81,13 @@ impl<'a> Engine<'a> { }) .unwrap_or(0); + // Trim back to last path separator to keep meaningful context + if idx_end_of_shared > 0 { + if let Some(last_slash) = self_str[..idx_end_of_shared].rfind('/') { + idx_end_of_shared = last_slash + 1; + } + } + ( self_str[idx_end_of_shared..].into(), other_str[idx_end_of_shared..].into(), @@ -486,6 +493,44 @@ impl<'a, 'de> Deserialize<'de> for EffectSize<'a> { } } +/// Extract benchmark name from wasm file path. +/// +/// This function handles various path formats commonly used in Sightglass: +/// - `./benchmarks/foo/benchmark.wasm` -> `foo` +/// - `benchmarks/bar/benchmark.wasm` -> `bar` +/// - `benchmarks/foo/bar.wasm` -> `foo/bar` +/// - `simple.wasm` -> `simple` +/// +/// # Examples +/// +/// ``` +/// use sightglass_data::extract_benchmark_name; +/// +/// assert_eq!(extract_benchmark_name("./benchmarks/foo/benchmark.wasm"), "foo"); +/// assert_eq!(extract_benchmark_name("benchmarks/bar/benchmark.wasm"), "bar"); +/// assert_eq!(extract_benchmark_name("benchmarks/foo/bar.wasm"), "foo/bar"); +/// assert_eq!(extract_benchmark_name("simple.wasm"), "simple"); +/// ``` +pub fn extract_benchmark_name(wasm_path: &str) -> String { + let mut path = wasm_path; + + // Remove prefix variations + if let Some(stripped) = path.strip_prefix("./benchmarks/") { + path = stripped; + } else if let Some(stripped) = path.strip_prefix("benchmarks/") { + path = stripped; + } + + // Remove suffix variations + if let Some(stripped) = path.strip_suffix("/benchmark.wasm") { + path = stripped; + } else if let Some(stripped) = path.strip_suffix(".wasm") { + path = stripped; + } + + path.to_string() +} + #[cfg(test)] mod tests { use super::*; @@ -543,4 +588,190 @@ mod tests { } Ok(()) } + + #[test] + fn test_extract_benchmark_name() { + // Standard benchmark.wasm format with ./benchmarks/ prefix + assert_eq!( + extract_benchmark_name("./benchmarks/foo/benchmark.wasm"), + "foo" + ); + + // Standard benchmark.wasm format without ./ prefix + assert_eq!( + extract_benchmark_name("benchmarks/bar/benchmark.wasm"), + "bar" + ); + + // Direct .wasm file in benchmarks directory + assert_eq!(extract_benchmark_name("benchmarks/simple.wasm"), "simple"); + assert_eq!(extract_benchmark_name("./benchmarks/simple.wasm"), "simple"); + + // Nested paths with .wasm extension + assert_eq!(extract_benchmark_name("benchmarks/foo/bar.wasm"), "foo/bar"); + assert_eq!( + extract_benchmark_name("./benchmarks/nested/path/test.wasm"), + "nested/path/test" + ); + + // Simple .wasm files without benchmarks prefix + assert_eq!(extract_benchmark_name("simple.wasm"), "simple"); + assert_eq!(extract_benchmark_name("test.wasm"), "test"); + + // Edge cases - no extensions or prefixes + assert_eq!(extract_benchmark_name("somefile"), "somefile"); + assert_eq!(extract_benchmark_name("path/to/file"), "path/to/file"); + } + + #[test] + fn test_relative_labels_same_name_different_flags() { + let engine1 = Engine { + name: "wasmtime".into(), + flags: Some("-Wfoo=bar".into()), + }; + let engine2 = Engine { + name: "wasmtime".into(), + flags: Some("-Wbaz=qux".into()), + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // When names match, should return just the flags + assert_eq!(label1, "-Wfoo=bar"); + assert_eq!(label2, "-Wbaz=qux"); + } + + #[test] + fn test_relative_labels_same_name_no_flags() { + let engine1 = Engine { + name: "wasmtime".into(), + flags: None, + }; + let engine2 = Engine { + name: "wasmtime".into(), + flags: Some("-Wfoo=bar".into()), + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + assert_eq!(label1, "(no flags)"); + assert_eq!(label2, "-Wfoo=bar"); + } + + #[test] + fn test_relative_labels_different_names_simple() { + let engine1 = Engine { + name: "wasmtime".into(), + flags: None, + }; + let engine2 = Engine { + name: "lucet".into(), + flags: None, + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // No common prefix, should return full names + assert_eq!(label1, "wasmtime"); + assert_eq!(label2, "lucet"); + } + + #[test] + fn test_relative_labels_with_common_prefix() { + let engine1 = Engine { + name: "engines/wasmtime/v1.0/libengine.so".into(), + flags: None, + }; + let engine2 = Engine { + name: "engines/wasmtime/v2.0/libengine.so".into(), + flags: None, + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // Should trim to last path separator before the difference + assert_eq!(label1, "v1.0/libengine.so"); + assert_eq!(label2, "v2.0/libengine.so"); + } + + #[test] + fn test_relative_labels_with_path_and_flags() { + let engine1 = Engine { + name: "engines/wasmtime/v1.0/libengine.so".into(), + flags: Some("-Wepoch=y".into()), + }; + let engine2 = Engine { + name: "engines/wasmtime/v2.0/libengine.so".into(), + flags: Some("-Wepoch=y".into()), + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // Should include flags in the shortened label + assert_eq!(label1, "v1.0/libengine.so (-Wepoch=y)"); + assert_eq!(label2, "v2.0/libengine.so (-Wepoch=y)"); + } + + #[test] + fn test_relative_labels_long_common_prefix() { + let engine1 = Engine { + name: "/home/user/projects/engines/wasmtime/wasmtime-v38/libengine.dylib".into(), + flags: None, + }; + let engine2 = Engine { + name: "/home/user/projects/engines/wasmtime/wasmtime-v39/libengine.dylib".into(), + flags: None, + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // Should cut at the path separator before the version difference + assert_eq!(label1, "wasmtime-v38/libengine.dylib"); + assert_eq!(label2, "wasmtime-v39/libengine.dylib"); + } + + #[test] + fn test_relative_labels_no_path_separator_in_common_prefix() { + let engine1 = Engine { + name: "wasmtime-v1".into(), + flags: None, + }; + let engine2 = Engine { + name: "wasmtime-v2".into(), + flags: None, + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // No path separator, trims at the first difference (after 'wasmtime-v') + assert_eq!(label1, "1"); + assert_eq!(label2, "2"); + } + + #[test] + fn test_relative_labels_identical_engines() { + let engine1 = Engine { + name: "wasmtime".into(), + flags: Some("-Wfoo=bar".into()), + }; + let engine2 = Engine { + name: "wasmtime".into(), + flags: Some("-Wfoo=bar".into()), + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // Identical engines should return the flags + assert_eq!(label1, "-Wfoo=bar"); + assert_eq!(label2, "-Wfoo=bar"); + } + + #[test] + fn test_relative_labels_one_is_prefix_of_other() { + let engine1 = Engine { + name: "engines/wasmtime".into(), + flags: None, + }; + let engine2 = Engine { + name: "engines/wasmtime/v2.0".into(), + flags: None, + }; + + let (label1, label2) = engine1.relative_labels(&engine2); + // When one is a prefix, there's no difference to detect, so returns full names + assert_eq!(label1, "engines/wasmtime"); + assert_eq!(label2, "engines/wasmtime/v2.0"); + } } diff --git a/crates/fingerprint/src/hash.rs b/crates/fingerprint/src/hash.rs index e0ccb377..e12040d7 100644 --- a/crates/fingerprint/src/hash.rs +++ b/crates/fingerprint/src/hash.rs @@ -8,7 +8,7 @@ pub fn file>(path: P) -> String { let mut hasher = Sha256::new(); let _ = io::copy(&mut file, &mut hasher).expect("to be able to hash the benchmark bytes"); let hash = hasher.finalize(); - hexify(hash.as_slice()) + hexify(&hash) } /// Calculate the SHA256 hash of a string. @@ -16,7 +16,7 @@ pub(crate) fn string(data: &str) -> String { let mut hasher = Sha256::new(); hasher.update(data); let hash = hasher.finalize(); - hexify(hash.as_slice()) + hexify(&hash) } /// Create a hexadecimal string from a sequence of bytes. diff --git a/crates/upload/src/database.rs b/crates/upload/src/database.rs index 21fb28e3..ad065d08 100644 --- a/crates/upload/src/database.rs +++ b/crates/upload/src/database.rs @@ -40,7 +40,7 @@ impl Database { { let url = format!("{}/{}/_doc/{}", self.url, index, id); if self.dry_run { - bail!("could not retrieve object with ID: {}", id); + bail!("could not retrieve object with ID: {id}"); } else { let client = Client::new(); let response = client.get(url).send()?; @@ -122,7 +122,7 @@ impl Database { let id = content.get("_id").unwrap().as_str().unwrap().to_string(); Ok(id) } else { - bail!("Failed to create record: {:?}", content) + bail!("Failed to create record: {content:?}") } } } @@ -165,7 +165,7 @@ impl Database { if success { Ok(()) } else { - bail!("Failed to batch-create records: {:?}", content) + bail!("Failed to batch-create records: {content:?}") } } }