diff --git a/Cargo.lock b/Cargo.lock index 01d64aa49..7d10c1d90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,20 +24,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if", - "cipher 0.3.0", + "cipher", "cpufeatures", "opaque-debug", ] [[package]] -name = "aes" -version = "0.8.3" +name = "ahash" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "cfg-if", - "cipher 0.4.4", - "cpufeatures", + "getrandom", + "once_cell", + "version_check", ] [[package]] @@ -55,6 +55,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -72,9 +87,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -120,9 +135,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "assert_matches" @@ -147,7 +162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 5.0.0", + "event-listener 5.1.0", "event-listener-strategy 0.5.0", "futures-core", "pin-project-lite", @@ -159,6 +174,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ + "brotli", "bzip2", "flate2", "futures-core", @@ -166,8 +182,8 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "zstd 0.13.0", - "zstd-safe 7.0.0", + "zstd", + "zstd-safe", ] [[package]] @@ -228,7 +244,7 @@ dependencies = [ "futures-io", "futures-lite 2.2.0", "parking", - "polling 3.4.0", + "polling 3.5.0", "rustix 0.38.31", "slab", "tracing", @@ -286,18 +302,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", -] - -[[package]] -name = "async-scoped" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb5d44cd33a5095cf47aa2a90455ea3f9141f45e24d092425fef2bf4fd9c98e" -dependencies = [ - "futures", - "pin-project", - "tokio", + "syn 2.0.51", ] [[package]] @@ -318,6 +323,28 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.51", +] + [[package]] name = "async-task" version = "4.7.0" @@ -332,19 +359,19 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "async_http_range_reader" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809a79b508f86b02136fc5aab935ef777d03e5d377dda04e6736a081add9287c" +checksum = "cf8eeab30c68da4dc2c51f3afc4327ab06fe0f3f028ca423f7ca398c7ed8c5e7" dependencies = [ "bisection", "futures", "http-content-range", - "itertools", + "itertools 0.12.1", "memmap2 0.9.4", "reqwest", "reqwest-middleware", @@ -358,8 +385,7 @@ dependencies = [ [[package]] name = "async_zip" version = "0.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527207465fb6dcafbf661b0d4a51d0d2306c9d0c2975423079a6caa807930daf" +source = "git+https://github.com/charliermarsh/rs-async-zip?rev=d76801da0943de985254fc6255c0e476b57c5836#d76801da0943de985254fc6255c0e476b57c5836" dependencies = [ "async-compression", "crc32fast", @@ -382,6 +408,51 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -408,15 +479,15 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.7" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] -name = "base64ct" -version = "1.6.0" +name = "base64" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bincode" @@ -482,7 +553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" dependencies = [ "block-padding", - "cipher 0.3.0", + "cipher", ] [[package]] @@ -507,11 +578,64 @@ dependencies = [ "tracing", ] +[[package]] +name = "brotli" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] name = "byteorder" @@ -573,6 +697,16 @@ dependencies = [ "walkdir", ] +[[package]] +name = "cache-key" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "hex", + "seahash", + "url", +] + [[package]] name = "cache_control" version = "0.2.0" @@ -580,87 +714,100 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee" [[package]] -name = "cc" -version = "1.0.83" +name = "cachedir" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "4703f3937077db8fa35bee3c8789343c1aec2585f0146f09d658d4ccc0e8d873" dependencies = [ - "jobserver", - "libc", + "tempfile", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "camino" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] [[package]] -name = "chrono" -version = "0.4.33" +name = "cargo-util" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" +checksum = "74862c3c6e53a1c1f8f0178f9d38ab41e49746cd3a7cafc239b3d0248fd4e342" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.0", + "anyhow", + "core-foundation", + "filetime", + "hex", + "ignore", + "jobserver", + "libc", + "miow", + "same-file", + "sha2", + "shell-escape", + "tempfile", + "tracing", + "walkdir", + "windows-sys 0.52.0", ] [[package]] -name = "ciborium" -version = "0.2.2" +name = "cc" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", + "libc", ] [[package]] -name = "ciborium-io" -version = "0.2.2" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "ciborium-ll" -version = "0.2.2" +name = "charset" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +checksum = "18e9079d1a12a2cc2bffb5db039c43661836ead4082120d5844f02555aca2d46" dependencies = [ - "ciborium-io", - "half", + "base64 0.13.1", + "encoding_rs", ] [[package]] -name = "cipher" -version = "0.3.0" +name = "chrono" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ - "generic-array", + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.3", ] [[package]] name = "cipher" -version = "0.4.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" dependencies = [ - "crypto-common", - "inout", + "generic-array", ] [[package]] name = "clap" -version = "4.5.0" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", @@ -668,9 +815,9 @@ dependencies = [ [[package]] name = "clap-verbosity-flag" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57f73ca21b17a0352944b9bb61803b6007bd911b6cccfef7153f7f0600ac495" +checksum = "bb9b20c0dd58e4c2e991c8d203bbeb76c11304d1011659686b5b644bc29aa478" dependencies = [ "clap", "log", @@ -678,9 +825,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.0" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", @@ -690,9 +837,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.0" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299353be8209bd133b049bf1c63582d184a8b39fd9c04f15fe65f50f88bdfe6c" +checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c" dependencies = [ "clap", ] @@ -706,7 +853,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -750,10 +897,41 @@ dependencies = [ ] [[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "console-api" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" +dependencies = [ + "futures-core", + "prost", + "prost-types", + "tonic", + "tracing-core", +] + +[[package]] +name = "console-subscriber" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" +dependencies = [ + "console-api", + "crossbeam-channel", + "crossbeam-utils", + "futures-task", + "hdrhistogram", + "humantime", + "prost-types", + "serde", + "serde_json", + "thread_local", + "tokio", + "tokio-stream", + "tonic", + "tracing", + "tracing-core", + "tracing-subscriber", +] [[package]] name = "core-foundation" @@ -782,13 +960,22 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -814,12 +1001,6 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-common" version = "0.1.6" @@ -853,9 +1034,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.5" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ "darling_core", "darling_macro", @@ -863,27 +1044,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.5" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "darling_macro" -version = "0.20.5" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -966,6 +1147,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs" version = "5.0.1" @@ -987,6 +1177,51 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "distribution-filename" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-tags", + "rkyv", + "serde", + "thiserror", + "url", + "uv-normalize", +] + +[[package]] +name = "distribution-types" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "cache-key", + "data-encoding", + "distribution-filename", + "fs-err", + "itertools 0.12.1", + "once_cell", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-tags", + "pypi-types", + "rkyv", + "rustc-hash", + "serde", + "serde_json", + "sha2", + "thiserror", + "tracing", + "url", + "urlencoding", + "uv-auth", + "uv-fs", + "uv-git", + "uv-normalize", +] + [[package]] name = "drop_bomb" version = "0.1.5" @@ -1001,9 +1236,9 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elsa" @@ -1038,14 +1273,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "enumflags2" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" dependencies = [ "enumflags2_derive", "serde", @@ -1053,13 +1288,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -1070,9 +1305,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7" +checksum = "388979d208a049ffdfb22fa33b9c81942215b940910bccfe258caeb25d125cb3" dependencies = [ "serde", ] @@ -1117,9 +1352,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" +checksum = "b7ad6fd685ce13acd6d9541a30f6db6567a7a24c9ffd4ba2955d29e3f22c8b27" dependencies = [ "concurrent-queue", "parking", @@ -1142,7 +1377,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" dependencies = [ - "event-listener 5.0.0", + "event-listener 5.1.0", "pin-project-lite", ] @@ -1226,24 +1461,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ "autocfg", + "tokio", ] [[package]] -name = "fs4" -version = "0.7.0" +name = "fs2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f9df8a11882c4e3335eb2d18a0137c505d9ca927470b0cac9c6f0ae07d28f7" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ - "rustix 0.38.31", - "windows-sys 0.48.0", + "libc", + "winapi", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "fslock" version = "0.2.1" @@ -1344,7 +1574,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -1361,9 +1591,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -1421,12 +1651,73 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "git2" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b3ba52851e73b46a4c3df1d89343741112003f0f6f13beb0dfac9e457c3fdcd" +dependencies = [ + "bitflags 2.4.2", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", +] + [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.5", + "regex-syntax 0.8.2", +] + +[[package]] +name = "goblin" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb07a4ffed2093b118a525b1d8f5204ae274faed5604537caf7135d0f18d9887" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "gourgeist" +version = "0.0.4" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anstream", + "cachedir", + "camino", + "directories", + "fs-err", + "platform-host", + "serde", + "serde_json", + "tempfile", + "thiserror", + "tracing", + "uv-cache", + "uv-fs", + "uv-interpreter", + "which", +] + [[package]] name = "h2" version = "0.3.24" @@ -1439,28 +1730,21 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.2", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "half" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" -dependencies = [ - "cfg-if", - "crunchy", -] - [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -1468,6 +1752,19 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "base64 0.21.7", + "byteorder", + "flate2", + "nom", + "num-traits", +] + [[package]] name = "heck" version = "0.4.1" @@ -1476,9 +1773,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3" +checksum = "379dada1584ad501b383485dd706b8afb7a70fcbc7f4da7d780638a5a6124a60" [[package]] name = "hex" @@ -1507,6 +1804,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "html-escape" version = "0.2.13" @@ -1580,7 +1886,6 @@ checksum = "7aec9f678bca3f4a15194b980f20ed9bfe0dd38e8d298c65c559a93dfbd6380a" dependencies = [ "http", "http-serde", - "reqwest", "serde", "time", ] @@ -1651,7 +1956,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1672,6 +1977,18 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -1725,22 +2042,19 @@ dependencies = [ ] [[package]] -name = "include_dir" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.3" +name = "ignore" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" dependencies = [ - "proc-macro2", - "quote", + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.5", + "same-file", + "walkdir", + "winapi-util", ] [[package]] @@ -1756,9 +2070,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1767,9 +2081,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", "instant", @@ -1779,19 +2093,16 @@ dependencies = [ ] [[package]] -name = "inout" -version = "0.1.3" +name = "indoc" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] +checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" [[package]] name = "insta" -version = "1.34.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d64600be34b2fcfc267740a243fa7744441bb4947a619ac4e5bb6507f35fbfc" +checksum = "7c985c1bef99cf13c58fade470483d81a2bfe846ebde60ed28cc2dddec2df9e2" dependencies = [ "console", "lazy_static", @@ -1801,6 +2112,40 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "install-wheel-rs" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "configparser", + "csv", + "data-encoding", + "distribution-filename", + "fs-err", + "mailparse", + "once_cell", + "pathdiff", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-host", + "platform-info", + "plist", + "pypi-types", + "reflink-copy", + "regex", + "rustc-hash", + "serde", + "serde_json", + "sha2", + "tempfile", + "thiserror", + "tracing", + "url", + "uv-fs", + "uv-normalize", + "walkdir", + "zip", +] + [[package]] name = "instant" version = "0.1.12" @@ -1845,6 +2190,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -1890,6 +2244,16 @@ dependencies = [ "treediff", ] +[[package]] +name = "junction" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca39ef0d69b18e6a2fd14c2f0a1d593200f4a4ed949b240b5917ab51fac754cb" +dependencies = [ + "scopeguard", + "winapi", +] + [[package]] name = "keyring" version = "2.3.2" @@ -1924,7 +2288,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -1939,6 +2303,20 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libgit2-sys" +version = "0.16.2+1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] + [[package]] name = "libloading" version = "0.8.1" @@ -1966,6 +2344,32 @@ dependencies = [ "redox_syscall 0.4.1", ] +[[package]] +name = "libssh2-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "line-wrap" version = "0.1.1" @@ -2019,6 +2423,17 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "mailparse" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d096594926cab442e054e047eb8c1402f7d5b2272573b97ba68aa40629f9757" +dependencies = [ + "charset", + "data-encoding", + "quoted_printable", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2028,6 +2443,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "md-5" version = "0.10.6" @@ -2094,13 +2515,13 @@ dependencies = [ [[package]] name = "miette" -version = "7.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98a72adfa0c7ae88ba0abcbd00047a476616c66b831d628b8ac7f1e9de0cfd67" +checksum = "baed61d13cc3723ee6dbed730a82bfacedc60a85d81da2d77e9c3e8ebc0b504a" dependencies = [ "backtrace", "backtrace-ext", - "miette-derive 7.0.0", + "miette-derive 7.1.0", "owo-colors", "supports-color", "supports-hyperlinks", @@ -2119,18 +2540,18 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "miette-derive" -version = "7.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279def6bf114a34b3cf887489eb440d4dfcf709ab3ce9955e4a6f957ce5cce77" +checksum = "f301c3f54f98abc6c212ee722f5e5c62e472a334415840669e356f04850051ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -2184,12 +2605,30 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "miow" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "359f76430b20a79f9e20e115b3428614e654f04fab314482fc0fda0ebd3c6044" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "monch" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b52c1b33ff98142aecea13138bd399b68aa7ab5d9546c300988c345004001eea" +[[package]] +name = "nanoid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +dependencies = [ + "rand", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -2372,6 +2811,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "once-map" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "dashmap", + "tokio", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -2386,9 +2834,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ "bitflags 2.4.2", "cfg-if", @@ -2407,7 +2855,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -2416,14 +2864,24 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.2.3+3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -2472,11 +2930,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b645dcde5f119c2c454a92d0dfa271a2a3b205da92e4292a68ead4bdbfde1f33" dependencies = [ "heck", - "itertools", + "itertools 0.12.1", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -2546,15 +3004,10 @@ dependencies = [ ] [[package]] -name = "password-hash" -version = "0.4.2" +name = "paste" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core", - "subtle", -] +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "path-dedot" @@ -2572,72 +3025,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "peg" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "400bcab7d219c38abf8bd7cc2054eb9bbbd4312d66f6a5557d572a203f646f61" -dependencies = [ - "peg-macros", - "peg-runtime", -] - -[[package]] -name = "peg-macros" -version = "0.8.2" +name = "pep440_rs" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e61cce859b76d19090f62da50a9fe92bab7c2a5f09e183763559a2ac392c90" +checksum = "15efd4d885c29126cc93e12af3087896e2518bd5ca0fb328c19c4ef9cecfa8be" dependencies = [ - "peg-runtime", - "proc-macro2", - "quote", + "once_cell", + "serde", + "unicode-width", + "unscanny", ] -[[package]] -name = "peg-runtime" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36bae92c60fa2398ce4678b98b2c4b5a7c61099961ca1fa305aec04a9ad28922" - [[package]] name = "pep440_rs" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c29f9c43de378b4e4e0cd7dbcce0e5cfb80443de8c05620368b2948bc936a1" +version = "0.5.0" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" dependencies = [ "once_cell", - "regex", + "pubgrub", + "rkyv", "serde", "unicode-width", + "unscanny", ] [[package]] name = "pep508_rs" -version = "0.3.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910c513bea0f4f833122321c0f20e8c704e01de98692f6989c2ec21f43d88b1e" +checksum = "1455babf8edd3eedcdfcb39700e455a4bb189e71b4f1fa0eacc9b244cc5a55e6" dependencies = [ - "anyhow", + "derivative", "once_cell", - "pep440_rs", + "pep440_rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex", "serde", "thiserror", - "toml", - "tracing", "unicode-width", "url", + "urlencoding", +] + +[[package]] +name = "pep508_rs" +version = "0.4.2" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "derivative", + "once_cell", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "regex", + "rkyv", + "serde", + "thiserror", + "unicode-width", + "url", + "uv-fs", + "uv-normalize", ] [[package]] @@ -2653,7 +3097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.2", + "indexmap 2.2.3", ] [[package]] @@ -2686,7 +3130,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", "unicase", ] @@ -2717,7 +3161,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -2750,38 +3194,44 @@ dependencies = [ "assert_matches", "async-once-cell", "async-recursion", - "async-scoped", + "cfg-if", "chrono", "clap", "clap-verbosity-flag", "clap_complete", "console", + "console-subscriber", "deno_task_shell", "dialoguer", "dirs", + "distribution-filename", + "distribution-types", "dunce", "flate2", "futures", "http-cache-reqwest", "human_bytes", "humantime", - "indexmap 2.2.2", + "indexmap 2.2.3", "indicatif", "insta", + "install-wheel-rs", "is_executable", - "itertools", + "itertools 0.12.1", "lazy_static", "libc", - "miette 7.0.0", + "miette 7.1.0", "minijinja", "nix 0.27.1", "once_cell", - "pep440_rs", - "pep508_rs", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-host", + "platform-tags", + "pypi-types", "rattler", "rattler_conda_types", - "rattler_digest 0.18.0", - "rattler_installs_packages", + "rattler_digest", "rattler_lock", "rattler_networking", "rattler_repodata_gateway", @@ -2816,14 +3266,66 @@ dependencies = [ "tracing", "tracing-subscriber", "url", + "uv-cache", + "uv-client", + "uv-dispatch", + "uv-distribution", + "uv-installer", + "uv-interpreter", + "uv-normalize", + "uv-resolver", + "uv-traits", "zip", ] [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "platform-host" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "fs-err", + "goblin", + "once_cell", + "platform-info", + "plist", + "regex", + "serde", + "target-lexicon", + "thiserror", + "tracing", +] + +[[package]] +name = "platform-info" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d6259c4860e53bf665016f1b2f46a8859cadfa717581dc9d597ae4069de6300f" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "platform-tags" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "platform-host", + "rustc-hash", + "thiserror", +] [[package]] name = "plist" @@ -2831,8 +3333,8 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ - "base64", - "indexmap 2.2.2", + "base64 0.21.7", + "indexmap 2.2.3", "line-wrap", "quick-xml", "serde", @@ -2857,9 +3359,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" dependencies = [ "cfg-if", "concurrent-queue", @@ -2887,6 +3389,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "priority-queue" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bda9164fe05bc9225752d54aae413343c36f684380005398a6a8fde95fe785" +dependencies = [ + "autocfg", + "indexmap 1.9.3", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -2914,11 +3426,75 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", "version_check", "yansi", ] +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.51", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pubgrub" +version = "0.2.1" +source = "git+https://github.com/zanieb/pubgrub?rev=aab132a3d4d444dd8dd41d8c4e605abd69dacfe1#aab132a3d4d444dd8dd41d8c4e605abd69dacfe1" +dependencies = [ + "indexmap 2.2.3", + "log", + "priority-queue", + "rustc-hash", + "thiserror", +] + [[package]] name = "purl" version = "0.1.2" @@ -2934,15 +3510,34 @@ dependencies = [ "unicase", ] +[[package]] +name = "pypi-types" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "chrono", + "mailparse", + "once_cell", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "regex", + "rkyv", + "serde", + "thiserror", + "tracing", + "url", + "uv-normalize", +] + [[package]] name = "pyproject-toml" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95c3dd745f99aa3c554b7bb00859f7d18c2f1d6afd749ccc86d60b61e702abd9" +checksum = "3b80f889b6d413c3f8963a2c7db03f95dd6e1d85e1074137cb2013ea2faa8898" dependencies = [ - "indexmap 2.2.2", - "pep440_rs", - "pep508_rs", + "indexmap 2.2.3", + "pep440_rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pep508_rs 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "toml", ] @@ -2965,6 +3560,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quoted_printable" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79ec282e887b434b68c18fe5c121d38e72a5cf35119b59e54ec5b992ea9c8eb0" + [[package]] name = "radium" version = "0.7.0" @@ -3004,8 +3605,7 @@ dependencies = [ [[package]] name = "rattler" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66646eab0e70a01b8cf372e10e57a5022f8d111b18870078d2e186f6938f0c5c" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "anyhow", "async-compression", @@ -3018,15 +3618,15 @@ dependencies = [ "futures", "fxhash", "hex", - "indexmap 2.2.2", - "itertools", + "indexmap 2.2.3", + "itertools 0.12.1", "memchr", "memmap2 0.9.4", "nom", "once_cell", "pin-project-lite", "rattler_conda_types", - "rattler_digest 0.18.0", + "rattler_digest", "rattler_networking", "rattler_package_streaming", "reflink-copy", @@ -3050,19 +3650,18 @@ dependencies = [ [[package]] name = "rattler_conda_types" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "085a4ebf784b325311890f7c1dfb9dc017cecb44049cfafef73e02e925e24e22" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "chrono", "fxhash", "glob", "hex", - "indexmap 2.2.2", - "itertools", + "indexmap 2.2.3", + "itertools 0.12.1", "lazy-regex", "nom", "purl", - "rattler_digest 0.18.0", + "rattler_digest", "rattler_macros", "regex", "serde", @@ -3077,26 +3676,10 @@ dependencies = [ "url", ] -[[package]] -name = "rattler_digest" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26606e577c9c5b214023c8a31a12753cffd2b09a6768d1d556b99ae9d730bc23" -dependencies = [ - "blake2", - "digest", - "hex", - "md-5", - "serde", - "serde_with", - "sha2", -] - [[package]] name = "rattler_digest" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e8b55bd7e3c9efa337b59a26964584975c345bf484eca9fb849b65c2674cee" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "blake2", "digest", @@ -3108,81 +3691,20 @@ dependencies = [ "tokio", ] -[[package]] -name = "rattler_installs_packages" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "347eefdb6574abe870dc428c1d6b22e4a0481de88e094b14dca4427e20e9ce16" -dependencies = [ - "async-once-cell", - "async-recursion", - "async-trait", - "async_http_range_reader", - "async_zip", - "bytes", - "cacache", - "ciborium", - "configparser", - "csv", - "data-encoding", - "dunce", - "elsa", - "flate2", - "fs-err", - "fs4", - "fs_extra", - "futures", - "html-escape", - "http", - "http-cache-semantics", - "include_dir", - "indexmap 2.2.2", - "itertools", - "miette 7.0.0", - "mime", - "once_cell", - "parking_lot 0.12.1", - "pathdiff", - "peg", - "pep440_rs", - "pep508_rs", - "pin-project-lite", - "pyproject-toml", - "rattler_digest 0.17.0", - "regex", - "reqwest", - "reqwest-middleware", - "resolvo", - "serde", - "serde_json", - "serde_with", - "smallvec", - "tar", - "tempfile", - "thiserror", - "tl", - "tokio", - "tokio-util", - "tracing", - "url", - "zip", -] - [[package]] name = "rattler_lock" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e0c6694a1e2ce7f9c3b08920ee717890fc7814ca36bcfefc7ec6fff9daac97" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "chrono", "fxhash", - "indexmap 2.2.2", - "itertools", - "pep440_rs", - "pep508_rs", + "indexmap 2.2.3", + "itertools 0.12.1", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", "purl", "rattler_conda_types", - "rattler_digest 0.18.0", + "rattler_digest", "serde", "serde-json-python-formatter", "serde_json", @@ -3190,31 +3712,30 @@ dependencies = [ "serde_yaml", "thiserror", "url", + "uv-normalize", ] [[package]] name = "rattler_macros" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a96e90500af30b653b0c4e08fa572a6d4dfc821c5e213b510a195987b8ed133" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "rattler_networking" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc36da705ddde163d228bb140eecf521b390716b83db943a43f6606b31954b1" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "anyhow", "async-trait", - "base64", + "base64 0.21.7", "dirs", "fslock", "getrandom", - "itertools", + "itertools 0.12.1", "keyring", "lazy_static", "libc", @@ -3234,16 +3755,15 @@ dependencies = [ [[package]] name = "rattler_package_streaming" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27f4784ab14191fb9ae0218979f2ccee0f8cb1ca5c82440c7f38e0fd83808d6" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "bzip2", "chrono", "futures-util", - "itertools", + "itertools 0.12.1", "num_cpus", "rattler_conda_types", - "rattler_digest 0.18.0", + "rattler_digest", "rattler_networking", "reqwest", "reqwest-middleware", @@ -3255,14 +3775,13 @@ dependencies = [ "tokio-util", "url", "zip", - "zstd 0.13.0", + "zstd", ] [[package]] name = "rattler_repodata_gateway" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dbcfb255c1dc4e053c2fcac724d2ce404ec40056dea0a50c9f6d949c0a47a80" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "anyhow", "async-compression", @@ -3273,7 +3792,7 @@ dependencies = [ "hex", "humansize", "humantime", - "itertools", + "itertools 0.12.1", "json-patch", "libc", "md-5", @@ -3281,7 +3800,7 @@ dependencies = [ "ouroboros", "pin-project-lite", "rattler_conda_types", - "rattler_digest 0.18.0", + "rattler_digest", "rattler_networking", "reqwest", "reqwest-middleware", @@ -3301,12 +3820,11 @@ dependencies = [ [[package]] name = "rattler_shell" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abda3f6112eae2afef9e6b3bc88582c884c1c04765a4b9d7bcf2acb706eaded3" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "enum_dispatch", - "indexmap 2.2.2", - "itertools", + "indexmap 2.2.3", + "itertools 0.12.1", "rattler_conda_types", "serde_json", "shlex", @@ -3319,16 +3837,15 @@ dependencies = [ [[package]] name = "rattler_solve" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7f6035ffc8b6361917d50df6db53cb1002b2042eb6c2bd509dbb5697bbcca1" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "anyhow", "chrono", "futures", "hex", - "itertools", + "itertools 0.12.1", "rattler_conda_types", - "rattler_digest 0.18.0", + "rattler_digest", "resolvo", "serde", "tempfile", @@ -3340,8 +3857,7 @@ dependencies = [ [[package]] name = "rattler_virtual_packages" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d1748ab835be1aab75c6a055889cded915b0e70b6787bd46e0abf9a8ba65a5" +source = "git+https://github.com/baszalmstra/rattler?rev=e18356d674913385eb2c4ebb5a3407a329907409#e18356d674913385eb2c4ebb5a3407a329907409" dependencies = [ "cfg-if", "libloading", @@ -3384,6 +3900,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -3465,6 +3990,35 @@ version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "requirements-txt" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "fs-err", + "once_cell", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "regex", + "serde", + "thiserror", + "tracing", + "unscanny", + "url", + "uv-fs", + "uv-normalize", + "uv-warnings", +] + [[package]] name = "reqwest" version = "0.11.24" @@ -3472,7 +4026,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ "async-compression", - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -3560,11 +4114,10 @@ checksum = "2016584c3fd9df0fd859a7dcbc7fafdc7fdd2d87b53a576e8e63e62fad140e33" dependencies = [ "bitvec", "elsa", - "event-listener 5.0.0", + "event-listener 5.1.0", "futures", - "itertools", + "itertools 0.12.1", "petgraph", - "tokio", "tracing", ] @@ -3581,16 +4134,68 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rmp" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +dependencies = [ + "byteorder", + "rmp", + "serde", ] [[package]] @@ -3618,7 +4223,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.48", + "syn 2.0.51", "unicode-ident", ] @@ -3628,6 +4233,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -3694,7 +4305,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] @@ -3715,9 +4326,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "safemem" @@ -3750,7 +4361,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "sct" +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.51", +] + +[[package]] +name = "sct" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" @@ -3759,13 +4390,19 @@ dependencies = [ "untrusted", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "secret-service" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5da1a5ad4d28c03536f82f77d9f36603f5e37d8869ac98f0a750d5b5686d8d95" dependencies = [ - "aes 0.7.5", + "aes", "block-modes", "futures-util", "generic-array", @@ -3814,15 +4451,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -3848,22 +4485,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -3877,7 +4514,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -3907,11 +4544,11 @@ version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_derive", "serde_json", @@ -3928,16 +4565,16 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "serde_yaml" -version = "0.9.31" +version = "0.9.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" +checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -3966,7 +4603,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -4011,6 +4648,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-escape" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" + [[package]] name = "shell-words" version = "1.1.0" @@ -4042,6 +4685,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "similar" version = "2.4.0" @@ -4101,19 +4750,19 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "spdx" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bde1398b09b9f93fc2fc9b9da86e362693e999d3a54a8ac47a99a5a73f638b" +checksum = "29ef1a0fa1e39ac22972c8db23ff89aea700ab96aa87114e1fb55937a631a0c9" dependencies = [ "smallvec", ] @@ -4130,7 +4779,7 @@ version = "9.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082" dependencies = [ - "base64", + "base64 0.21.7", "digest", "hex", "miette 5.10.0", @@ -4178,7 +4827,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -4227,9 +4876,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" dependencies = [ "proc-macro2", "quote", @@ -4304,6 +4953,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "task-local-extensions" version = "0.1.4" @@ -4337,9 +4992,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", "unicode-linebreak", @@ -4348,29 +5003,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -4441,11 +5096,22 @@ dependencies = [ "num_cpus", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.6", "tokio-macros", + "tracing", "windows-sys 0.48.0", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.2.0" @@ -4454,7 +5120,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -4489,6 +5155,21 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "tokio-tar" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" +dependencies = [ + "filetime", + "futures-core", + "libc", + "redox_syscall 0.3.5", + "tokio", + "tokio-stream", + "xattr", +] + [[package]] name = "tokio-util" version = "0.7.10" @@ -4513,7 +5194,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.4", + "toml_edit 0.22.6", ] [[package]] @@ -4531,9 +5212,9 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4542,26 +5223,79 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.4" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ffdf896f8daaabf9b66ba8e77ea1ed5ed0f72821b398aba62352e95062951" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.2", ] +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -4574,7 +5308,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4588,7 +5321,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", ] [[package]] @@ -4691,9 +5424,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -4710,6 +5443,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +[[package]] +name = "unscanny" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9df2af067a7953e9c3831320f35c1cc0600c30d44d9f7a12b01db1cd88d6b47" + [[package]] name = "untrusted" version = "0.9.0" @@ -4728,6 +5467,12 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8-width" version = "0.1.7" @@ -4750,6 +5495,394 @@ dependencies = [ "rand", ] +[[package]] +name = "uv-auth" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "tracing", + "url", +] + +[[package]] +name = "uv-build" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "distribution-types", + "fs-err", + "gourgeist", + "indoc", + "itertools 0.12.1", + "once_cell", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-host", + "pypi-types", + "pyproject-toml", + "regex", + "rustc-hash", + "serde", + "serde_json", + "tempfile", + "thiserror", + "tokio", + "toml", + "tracing", + "uv-extract", + "uv-fs", + "uv-interpreter", + "uv-traits", +] + +[[package]] +name = "uv-cache" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "cache-key", + "cachedir", + "directories", + "distribution-types", + "fs-err", + "nanoid", + "pypi-types", + "serde", + "tempfile", + "tracing", + "url", + "uv-fs", + "uv-normalize", + "walkdir", +] + +[[package]] +name = "uv-client" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "async-trait", + "async_http_range_reader", + "async_zip", + "cache-key", + "chrono", + "distribution-filename", + "distribution-types", + "fs-err", + "futures", + "html-escape", + "http", + "install-wheel-rs", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-tags", + "pypi-types", + "reqwest", + "reqwest-middleware", + "reqwest-retry", + "rkyv", + "rmp-serde", + "rustc-hash", + "serde", + "serde_json", + "sha2", + "task-local-extensions", + "tempfile", + "thiserror", + "tl", + "tokio", + "tokio-util", + "tracing", + "url", + "urlencoding", + "uv-auth", + "uv-cache", + "uv-fs", + "uv-normalize", + "uv-warnings", +] + +[[package]] +name = "uv-dispatch" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "distribution-types", + "fs-err", + "futures", + "gourgeist", + "itertools 0.12.1", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-host", + "platform-tags", + "pypi-types", + "rustc-hash", + "tempfile", + "tokio", + "tracing", + "uv-build", + "uv-cache", + "uv-client", + "uv-distribution", + "uv-installer", + "uv-interpreter", + "uv-resolver", + "uv-traits", +] + +[[package]] +name = "uv-distribution" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "cache-key", + "distribution-filename", + "distribution-types", + "fs-err", + "futures", + "install-wheel-rs", + "nanoid", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-tags", + "pypi-types", + "reqwest", + "rmp-serde", + "rustc-hash", + "serde", + "tempfile", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "url", + "uv-cache", + "uv-client", + "uv-extract", + "uv-fs", + "uv-git", + "uv-normalize", + "uv-traits", + "zip", +] + +[[package]] +name = "uv-extract" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "async-compression", + "async_zip", + "flate2", + "fs-err", + "futures", + "rayon", + "rustc-hash", + "thiserror", + "tokio", + "tokio-tar", + "tokio-util", + "tracing", + "zip", +] + +[[package]] +name = "uv-fs" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "dunce", + "fs-err", + "fs2", + "junction", + "tempfile", + "tracing", + "urlencoding", + "uv-warnings", +] + +[[package]] +name = "uv-git" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "base64 0.21.7", + "cache-key", + "cargo-util", + "fs-err", + "git2", + "glob", + "hex", + "hmac", + "home", + "once_cell", + "rand", + "reqwest", + "serde", + "sha1", + "tokio", + "tracing", + "url", + "uv-fs", +] + +[[package]] +name = "uv-installer" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "distribution-filename", + "distribution-types", + "fs-err", + "futures", + "install-wheel-rs", + "once-map", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-tags", + "pypi-types", + "pyproject-toml", + "rayon", + "requirements-txt", + "rustc-hash", + "serde", + "tempfile", + "thiserror", + "tokio", + "toml", + "tracing", + "url", + "uv-cache", + "uv-client", + "uv-distribution", + "uv-extract", + "uv-fs", + "uv-git", + "uv-interpreter", + "uv-normalize", + "uv-traits", +] + +[[package]] +name = "uv-interpreter" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "cache-key", + "configparser", + "fs-err", + "install-wheel-rs", + "once_cell", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "platform-host", + "platform-tags", + "regex", + "rmp-serde", + "same-file", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "uv-cache", + "uv-fs", + "which", +] + +[[package]] +name = "uv-normalize" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "rkyv", + "serde", +] + +[[package]] +name = "uv-resolver" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anstream", + "anyhow", + "cache-key", + "chrono", + "dashmap", + "derivative", + "distribution-filename", + "distribution-types", + "either", + "fs-err", + "futures", + "indexmap 2.2.3", + "install-wheel-rs", + "itertools 0.12.1", + "once-map", + "once_cell", + "owo-colors", + "pep440_rs 0.5.0 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "petgraph", + "platform-host", + "platform-tags", + "pubgrub", + "pypi-types", + "reqwest", + "rkyv", + "rustc-hash", + "serde_json", + "sha2", + "tempfile", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "uv-cache", + "uv-client", + "uv-distribution", + "uv-git", + "uv-interpreter", + "uv-normalize", + "uv-traits", + "uv-warnings", + "zip", +] + +[[package]] +name = "uv-traits" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anyhow", + "distribution-types", + "once-map", + "pep508_rs 0.4.2 (git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building)", + "serde", + "serde_json", + "tokio", + "uv-cache", + "uv-interpreter", + "uv-normalize", +] + +[[package]] +name = "uv-warnings" +version = "0.0.1" +source = "git+https://github.com/tdejager/uv?branch=feat/env-variables-for-sdist-building#2b6411c4fc87a6619f26f65918a7b075685eae17" +dependencies = [ + "anstream", + "once_cell", + "owo-colors", + "rustc-hash", +] + [[package]] name = "valuable" version = "0.1.0" @@ -4820,7 +5953,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", "wasm-bindgen-shared", ] @@ -4854,7 +5987,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.51", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4909,6 +6042,19 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "which" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fa5e0c10bf77f44aac573e498d1a82d5fbd5e91f6fc0a99e7be4b38e85e101c" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.31", + "windows-sys 0.52.0", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4947,7 +6093,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -4956,7 +6102,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -4974,7 +6120,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -4994,17 +6140,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", ] [[package]] @@ -5015,9 +6161,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" [[package]] name = "windows_aarch64_msvc" @@ -5027,9 +6173,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" [[package]] name = "windows_i686_gnu" @@ -5039,9 +6185,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" [[package]] name = "windows_i686_msvc" @@ -5051,9 +6197,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" [[package]] name = "windows_x86_64_gnu" @@ -5063,9 +6209,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" [[package]] name = "windows_x86_64_gnullvm" @@ -5075,9 +6221,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" [[package]] name = "windows_x86_64_msvc" @@ -5087,15 +6233,24 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + +[[package]] +name = "winnow" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] [[package]] name = "winnow" -version = "0.5.39" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5389a154b01683d28c77f8f68f49dea75f0a4da32557a58f68ee51ebba472d29" +checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" dependencies = [ "memchr", ] @@ -5142,9 +6297,9 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "yaml-rust" @@ -5163,9 +6318,9 @@ checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" [[package]] name = "zbus" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c45d06ae3b0f9ba1fb2671268b975557d8f5a84bb5ec6e43964f87e763d8bca8" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ "async-broadcast", "async-executor", @@ -5204,9 +6359,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a1ba45ed0ad344b85a2bb5a1fe9830aed23d67812ea39a586e7d0136439c7d" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5239,27 +6394,11 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ - "aes 0.8.3", "byteorder", - "bzip2", - "constant_time_eq", "crc32fast", "crossbeam-utils", "flate2", - "hmac", - "pbkdf2", - "sha1", "time", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", ] [[package]] @@ -5268,17 +6407,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" dependencies = [ - "zstd-safe 7.0.0", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", + "zstd-safe", ] [[package]] @@ -5302,9 +6431,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", @@ -5316,9 +6445,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index a99b40383..4a1de4d01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,23 +11,45 @@ readme = "README.md" [features] default = ["native-tls"] -native-tls = ["reqwest/native-tls", "rattler_repodata_gateway/native-tls", "rattler/native-tls", "rip/native-tls"] -rustls-tls = ["reqwest/rustls-tls", "reqwest/rustls-tls-native-roots", "rattler_repodata_gateway/rustls-tls", "rattler/rustls-tls", "rip/rustls-tls"] +tokio-console-subscriber = ["tokio/tracing", "dep:console-subscriber"] +native-tls = [ + "reqwest/native-tls", + "rattler_repodata_gateway/native-tls", + "rattler/native-tls", +] +rustls-tls = [ + "reqwest/rustls-tls", + "reqwest/rustls-tls-native-roots", + "rattler_repodata_gateway/rustls-tls", + "rattler/rustls-tls", +] slow_integration_tests = [] [dependencies] assert_matches = "1.5.0" async-once-cell = "0.5.3" async-recursion = "1.0.5" -async-scoped = { version = "0.8.0", features = ["use-tokio"] } +cfg-if = "1.0.0" chrono = "0.4.33" -clap = { version = "4.5.0", default-features = false, features = ["derive", "usage", "wrap_help", "std", "color", "error-context", "env"] } +clap = { version = "4.5.0", default-features = false, features = [ + "derive", + "usage", + "wrap_help", + "std", + "color", + "error-context", + "env", +] } clap-verbosity-flag = "2.1.2" clap_complete = "4.5.0" console = { version = "0.15.8", features = ["windows-console-colors"] } + +console-subscriber = { version = "0.2.0", optional = true } deno_task_shell = "0.14.4" dialoguer = "0.11.0" dirs = "5.0.1" +distribution-filename = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +distribution-types = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } dunce = "1.0.4" flate2 = "1.0.28" futures = "0.3.30" @@ -37,28 +59,44 @@ humantime = "2.1.0" indexmap = { version = "2.2.2", features = ["serde"] } indicatif = "0.17.7" insta = { version = "1.34.0", features = ["yaml"] } +install-wheel-rs = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } is_executable = "1.0.1" itertools = "0.12.1" lazy_static = "1.4.0" -miette = { version = "7.0.0", features = ["fancy", "supports-color", "supports-hyperlinks", "supports-unicode", "terminal_size", "textwrap"] } +miette = { version = "7.0.0", features = [ + "fancy", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", +] } minijinja = { version = "1.0.12", features = ["builtins"] } once_cell = "1.19.0" -pep440_rs = "0.4.0" -pep508_rs = { version = "0.3.0", features = ["modern"] } +pep440_rs = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +pep508_rs = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +platform-host = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +platform-tags = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +pypi-types = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } rattler = { version = "0.18.0", default-features = false } rattler_conda_types = { version = "0.18.0", default-features = false } rattler_digest = { version = "0.18.0", default-features = false } rattler_lock = { version = "0.18.0", default-features = false } rattler_networking = { version = "0.18.0", default-features = false } -rattler_repodata_gateway = { version = "0.18.0", default-features = false, features = ["sparse"] } -rattler_shell = { version = "0.18.0", default-features = false, features = ["sysinfo"] } -rattler_solve = { version = "0.18.0", default-features = false, features = ["resolvo"] } +rattler_repodata_gateway = { version = "0.18.0", default-features = false, features = [ + "sparse", +] } +rattler_shell = { version = "0.18.0", default-features = false, features = [ + "sysinfo", +] } +rattler_solve = { version = "0.18.0", default-features = false, features = [ + "resolvo", +] } rattler_virtual_packages = { version = "0.18.0", default-features = false } regex = "1.10.3" reqwest = { version = "0.11.24", default-features = false } reqwest-middleware = "0.2.4" reqwest-retry = "0.3.0" -rip = { package = "rattler_installs_packages", version = "0.8.1", default-features = false } self-replace = "1.3.7" serde = "1.0.196" serde-untagged = "0.1.5" @@ -72,17 +110,39 @@ strsim = "0.10.0" tabwriter = { version = "1.4.0", features = ["ansi_formatting"] } tar = "0.4.40" tempfile = "3.10.0" -thiserror = "1.0.56" -tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread", "signal"] } +thiserror = "1.0.57" +tokio = { version = "1.36.0", features = [ + "macros", + "rt-multi-thread", + "signal", +] } tokio-util = "0.7.10" toml_edit = { version = "0.21.1", features = ["serde"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } url = "2.5.0" -zip = { version = "0.6.6", default-features = false, features = ["deflate", "time"] } +uv-cache = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-client = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-dispatch = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-distribution = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-installer = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-interpreter = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-normalize = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-resolver = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +uv-traits = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } + +zip = { version = "0.6.6", default-features = false, features = [ + "deflate", + "time", +] } [target.'cfg(unix)'.dependencies] -nix = { version = "0.27.1", default-features = false, features = ["fs", "signal", "term", "poll"] } +nix = { version = "0.27.1", default-features = false, features = [ + "fs", + "signal", + "term", + "poll", +] } libc = { version = "0.2.153", default-features = false } signal-hook = "0.3.17" @@ -95,19 +155,20 @@ tokio = { version = "1.36.0", features = ["rt"] } toml = "0.8.10" [patch.crates-io] -#rattler = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_conda_types = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_digest = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_lock = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_networking = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_repodata_gateway = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_shell = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_solve = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rattler_virtual_packages = { git = "https://github.com/mamba-org/rattler", branch = "main" } -#rip = { package = "rattler_installs_packages", git = "https://github.com/prefix-dev/rattler_installs_packages", branch = "main"} -#resolvo = { git = "https://github.com/mamba-org/resolvo.git", branch = "main" } -#deno_task_shell = { path = "../deno_task_shell" } +# For pyproject-toml +# pep440_rs = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +# pep508_rs = { git = "https://github.com/astral-sh/uv", tag = "0.1.8" } +rattler = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_conda_types = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_digest = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_lock = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_networking = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_repodata_gateway = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_shell = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_solve = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +rattler_virtual_packages = { git = "https://github.com/baszalmstra/rattler", rev = "e18356d674913385eb2c4ebb5a3407a329907409" } +#deno_task_shell = { path = "../deno_task_shell" } #rattler = { path = "../rattler/crates/rattler" } #rattler_conda_types = { path = "../rattler/crates/rattler_conda_types" } #rattler_digest = { path = "../rattler/crates/rattler_digest" } @@ -118,3 +179,23 @@ toml = "0.8.10" #rattler_virtual_packages = { path = "../rattler/crates/rattler_virtual_packages" } #rattler_lock = { path = "../rattler/crates/rattler_lock" } #rip = { package = "rattler_installs_packages", path = "../rip" } + +# When using a local version of uv, the following lines should be used instead of the above +[patch.'https://github.com/astral-sh/uv'] +pep440_rs = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +pep508_rs = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-cache = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-client = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-dispatch = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-distribution = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-installer = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-interpreter = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-normalize = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-resolver = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +uv-traits = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +distribution-filename = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +distribution-types = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +install-wheel-rs = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +platform-host = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +platform-tags = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } +pypi-types = { git = "https://github.com/tdejager/uv", branch = "feat/env-variables-for-sdist-building" } diff --git a/examples/pypi/pixi.lock b/examples/pypi/pixi.lock index 6ab2353ea..819382bd0 100644 --- a/examples/pypi/pixi.lock +++ b/examples/pypi/pixi.lock @@ -5,7 +5,6 @@ environments: - url: https://conda.anaconda.org/conda-forge/ packages: linux-64: - - pypi: git+https://github.com/schlatterbeck/pySmithPlot.git - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda @@ -44,93 +43,90 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl#sha256=c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 - - pypi: https://files.pythonhosted.org/packages/09/63/25e76075081ea98ec48f23929cefee58be0b42212e38074a9ec5c19e838c/tensorflow-2.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a80cabe6ab5f44280c05533e5b4a08e5b128f0d68d112564cffa3b96638e28aa - - pypi: https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl#sha256=7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d - - pypi: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e - - pypi: https://files.pythonhosted.org/packages/1e/e9/61d7338e503d63d2ce733373fa86256614f579b173cf3d0571d4f46cb561/h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52 - - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl#sha256=e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 - - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 - - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl#sha256=906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a - - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl#sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d - - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl#sha256=c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 - - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl#sha256=01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 - - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz#sha256=bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl#sha256=32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb - - pypi: https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 - - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl#sha256=d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd - - pypi: https://files.pythonhosted.org/packages/44/66/10773d9ea847ba0ae5c36478333d92c6dae3396205bf18091910f63f3ee9/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1bd4d946b5fa23220daa473a80e511a5fb27493d7e49d17dff0bb43bb0a31f32 - - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl#sha256=2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74 - - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl#sha256=051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 - - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl#sha256=90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 - - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl#sha256=95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb - - pypi: https://files.pythonhosted.org/packages/52/79/47b50804b18e3aef1bef6d7f317cecb7cf07c28665868a7543c5c1dc335b/plot-antenna-1.7.tar.gz#sha256=ab58a77acab213a1b50a0c40cc848d1c2c470af26a126c2e210135392b638580 - - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl#sha256=0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 - - pypi: https://files.pythonhosted.org/packages/5b/7e/9fd11ba8e86a8add8f2ff4e11c7111f65ec6fd1b547222160bb969e2bf5e/pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88 - - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz#sha256=a376cfae20b16fcfbef24bf3c047a8a294c35032bb051fa98842c12bbab6f0ff - - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz#sha256=1027406badbecdd30fe56e800a5a76ad7d7271a3aec0b7acf780ee26a00f2d40 - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz#sha256=c4d5ddc7e1c6e4d0d4e3588f804489d2142066cc80ed4b5e4dc7cc5f9d8de322 - - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl#sha256=c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1 - - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl#sha256=2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 - - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f - - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl#sha256=3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58 - - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl#sha256=7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb - - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl#sha256=8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca - - pypi: https://files.pythonhosted.org/packages/7f/1b/e0439eec0db6520968c751bc7e12480bb80bb8d939190e0e55ed762f3c7a/wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8 - - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl#sha256=eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc - - pypi: https://files.pythonhosted.org/packages/87/91/d57c2d22e4801edeb7f3e7939214c0ea8a28c6e16f85208c2df2145e0213/ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=e85ba8e24cf48d456e564688e981cf379d4c8e644db0a2f719b78de281bac2ca - - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl#sha256=b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 - - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl#sha256=3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e - - pypi: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 - - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl#sha256=b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c - - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 - - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl#sha256=7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 - - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d - - pypi: https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl#sha256=861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 - - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl#sha256=526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 - - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl#sha256=b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed - - pypi: https://files.pythonhosted.org/packages/a5/23/3c59ba2bb48f2ab2f11c3597f50458f63ed46dcc4cedd3308f6e4ec7271f/pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e - - pypi: https://files.pythonhosted.org/packages/ab/79/fb333705e94ed4e2b41ac099528dabf5f25bc1232568f42df0c31c3621e5/pysdl2_dll-2.30.0-py2.py3-none-manylinux2014_x86_64.whl#sha256=d5ecdbe6152a345091478b44785141f33079fb14d3538b5917ae06cb7166515e - - pypi: https://files.pythonhosted.org/packages/ac/cb/f42c5b07b14e9bccc5515f8584e613aed25c4a3ab064627b3b1369264d46/fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942 - - pypi: https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl#sha256=af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd - - pypi: https://files.pythonhosted.org/packages/b8/50/7425532d3e3ea4107a095617c16484b88f507fd77f172ce90bab366d32c6/pyboy-1.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl#sha256=4e60e8faf92836c91123529dcbb1daf5d686d16d8bc23009d4d69db722bdeae6 - - pypi: https://files.pythonhosted.org/packages/b8/c7/44201b27a9be0af7f997881904ce878a09a7fe95fc2e273d2f92b7b5b373/grpcio-1.60.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7 - - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 - - pypi: https://files.pythonhosted.org/packages/bb/0a/203797141ec9727344c7649f6d5f6cf71b89a6c28f8f55d4f18de7a1d352/setuptools-69.1.0-py3-none-any.whl#sha256=c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6 - - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl#sha256=2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 - - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl#sha256=c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl#sha256=177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 - - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl#sha256=d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d - - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl#sha256=4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58 - - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl#sha256=820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57 - - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl#sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 - - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl#sha256=9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63 - - pypi: https://files.pythonhosted.org/packages/e2/83/29a63bbc72839cc6b24b5a0e3d004d4ed4e8439f26460ad9a34e39251904/contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686 - - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 - - pypi: https://files.pythonhosted.org/packages/eb/59/1f5c8eb7bba8a8b1bb5c87f097d16410c93a48a6655be3773db5d2783deb/black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59 - extras: - - jupyter - - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl#sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 - - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl#sha256=a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 - - pypi: https://files.pythonhosted.org/packages/ef/1d/bf1d78126c3d106100232d3a18b7f3732e7dc3b71ee38ab735e4064b19cc/matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65 - - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl#sha256=d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 - - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl#sha256=f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 - - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl#sha256=ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl#sha256=6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316 - - pypi: https://files.pythonhosted.org/packages/fb/e7/07dc8b6541affd4de15f0e8fc855f238cb93d04c4f8490757226d12cdb5a/ipython-8.21.0-py3-none-any.whl#sha256=1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5 - - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl#sha256=3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 - - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl#sha256=d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd - - pypi: https://files.pythonhosted.org/packages/ff/ce/1b4dc8b5ecdc9a99202b093729192b69301c33064d0e312fb8d9e384dbe0/google_auth-2.28.0-py2.py3-none-any.whl#sha256=7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53 + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/09/63/25e76075081ea98ec48f23929cefee58be0b42212e38074a9ec5c19e838c/tensorflow-2.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/11/3e/956d40991c152010d71b38b1a9763edc8fe5944d360e1c256fae60cb9165/ipython-8.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/e8/b6a5affd7c071b2006dad64e10d82aa63673830d2189214d91501a56003d/plot-antenna-1.8.tar.gz + - pypi: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1e/e9/61d7338e503d63d2ce733373fa86256614f579b173cf3d0571d4f46cb561/h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/66/10773d9ea847ba0ae5c36478333d92c6dae3396205bf18091910f63f3ee9/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz + - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz + - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/61/79618621c56244d4778811f98737af8be4af1c0b034261c270cdfbda0762/grpcio-1.62.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/1b/e0439eec0db6520968c751bc7e12480bb80bb8d939190e0e55ed762f3c7a/wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/91/d57c2d22e4801edeb7f3e7939214c0ea8a28c6e16f85208c2df2145e0213/ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a5/23/3c59ba2bb48f2ab2f11c3597f50458f63ed46dcc4cedd3308f6e4ec7271f/pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ab/79/fb333705e94ed4e2b41ac099528dabf5f25bc1232568f42df0c31c3621e5/pysdl2_dll-2.30.0-py2.py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ac/cb/f42c5b07b14e9bccc5515f8584e613aed25c4a3ab064627b3b1369264d46/fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/1d/f152a5f6d243b6acbb2a710ed19aa47154d678359bed995abdd9daf0cff0/google_auth-2.28.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/50/7425532d3e3ea4107a095617c16484b88f507fd77f172ce90bab366d32c6/pyboy-1.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6e9549a855b5818e66a917e852ec608e77550c8dc08b/setuptools-69.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d4/47/1ccf9f62d2674d3ca3e95452c5f9dd114234d1535dec77c96528bf6a31fc/pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e2/83/29a63bbc72839cc6b24b5a0e3d004d4ed4e8439f26460ad9a34e39251904/contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/59/1f5c8eb7bba8a8b1bb5c87f097d16410c93a48a6655be3773db5d2783deb/black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/1d/bf1d78126c3d106100232d3a18b7f3732e7dc3b71ee38ab735e4064b19cc/matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl osx-64: - - pypi: git+https://github.com/schlatterbeck/pySmithPlot.git - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda @@ -162,93 +158,90 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl#sha256=c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 - - pypi: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl#sha256=629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f - - pypi: https://files.pythonhosted.org/packages/15/da/43bee505963da0c730ee50e951c604bfdb90d4cccc9c0044c946b10e68a7/ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl#sha256=e70047ec2c83eaee01afdfdabee2c5b0c133804d90d0f7db4dd903360fcc537c - - pypi: https://files.pythonhosted.org/packages/1a/26/837f5e58e90f53eab27acf30fc878a933d8ca8e35e1f2f82f9b39385f830/fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl#sha256=edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e - - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl#sha256=e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 - - pypi: https://files.pythonhosted.org/packages/22/50/1e211cbb5e1f52e55eeae1605789c9d24403962d37581cf0deb3e6b33377/tensorflow-2.14.0-cp311-cp311-macosx_10_15_x86_64.whl#sha256=00c42e7d8280c660b10cf5d0b3164fdc5e38fd0bf16b3f9963b7cd0e546346d8 - - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 - - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl#sha256=906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a - - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl#sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d - - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl#sha256=c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 - - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl#sha256=01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 - - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz#sha256=bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl#sha256=32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb - - pypi: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl#sha256=573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 - - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl#sha256=d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd - - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl#sha256=2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74 - - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl#sha256=051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 - - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl#sha256=90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 - - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl#sha256=95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb - - pypi: https://files.pythonhosted.org/packages/52/79/47b50804b18e3aef1bef6d7f317cecb7cf07c28665868a7543c5c1dc335b/plot-antenna-1.7.tar.gz#sha256=ab58a77acab213a1b50a0c40cc848d1c2c470af26a126c2e210135392b638580 - - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl#sha256=0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 - - pypi: https://files.pythonhosted.org/packages/57/0f/85fbc988095c614ebec2ea471dac5fc777bd9083e235cbcc45cea4275c06/pyboy-1.6.6-cp311-cp311-macosx_10_9_universal2.whl#sha256=14c56a005c8272b4e9e956ab6e6f3c8855a2fab5732d2367dd84c08460367c2c - - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz#sha256=a376cfae20b16fcfbef24bf3c047a8a294c35032bb051fa98842c12bbab6f0ff - - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz#sha256=1027406badbecdd30fe56e800a5a76ad7d7271a3aec0b7acf780ee26a00f2d40 - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz#sha256=c4d5ddc7e1c6e4d0d4e3588f804489d2142066cc80ed4b5e4dc7cc5f9d8de322 - - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl#sha256=c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1 - - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl#sha256=2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 - - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f - - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl#sha256=3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58 - - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl#sha256=7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb - - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl#sha256=8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca - - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl#sha256=eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc - - pypi: https://files.pythonhosted.org/packages/89/1d/23bafc80495b2a902b27d242e9226ea0b74624f108c60f0533329c051f78/pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl#sha256=35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5 - - pypi: https://files.pythonhosted.org/packages/8d/07/7e245ce1d7daec77cb1ca3b8caf094afb04c4c552a904787a1d684a2b606/matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl#sha256=5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900 - - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl#sha256=b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 - - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl#sha256=3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e - - pypi: https://files.pythonhosted.org/packages/93/d0/5911ad3cecb896588202e3e90bd97c0c7381718a6ccb2eaeebb70d7fe2ce/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_x86_64.whl#sha256=e873d823c206b92680575a62466e02717ce81ece7e433c818fb660154eda083f - - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl#sha256=b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c - - pypi: https://files.pythonhosted.org/packages/9b/54/1dafec3c84df1d29119037330f7289db84a679cb2d5283af4ef24d89f532/contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl#sha256=dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727 - - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 - - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl#sha256=7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 - - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d - - pypi: https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl#sha256=861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 - - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl#sha256=526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 - - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl#sha256=b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed - - pypi: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl#sha256=8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 - - pypi: https://files.pythonhosted.org/packages/ac/6b/11c0e4f5dec878a5eca77aa3b24215c49d2eda8d2cfd654a3f03a9f9d33a/pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl#sha256=a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5 - - pypi: https://files.pythonhosted.org/packages/ad/e3/1009781ce3c0d92634fa2fb3dc4bb0237fe7aaf70f2ab53160f3e82e7d63/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_10_14_x86_64.whl#sha256=72c3ca4b8c0d8dbdd970699d05a100107cf200317ad8e6a8373e2c37225cd552 - - pypi: https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl#sha256=af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd - - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 - - pypi: https://files.pythonhosted.org/packages/bb/0a/203797141ec9727344c7649f6d5f6cf71b89a6c28f8f55d4f18de7a1d352/setuptools-69.1.0-py3-none-any.whl#sha256=c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6 - - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl#sha256=2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 - - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl#sha256=c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f - - pypi: https://files.pythonhosted.org/packages/c3/99/570fedd40048daeb04d4738ed4f1d0e77259fb631387f7f188aac3d85c31/h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl#sha256=2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl#sha256=177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 - - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl#sha256=d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d - - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl#sha256=4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58 - - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl#sha256=820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57 - - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl#sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 - - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl#sha256=9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63 - - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 - - pypi: https://files.pythonhosted.org/packages/e7/f9/8c078b4973604cd968b23eb3dff52028b5c48f2a02c4f1f975f4d5e344d1/wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl#sha256=ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55 - - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl#sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 - - pypi: https://files.pythonhosted.org/packages/ec/d5/c3ddb54b39ce43d21428407eb26cf9a21fd43de5e26d9733b1f173d57475/grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl#sha256=4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87 - - pypi: https://files.pythonhosted.org/packages/ed/2c/d9b1a77101e6e5f294f6553d76c39322122bfea2a438aeea4eb6d4b22749/black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl#sha256=8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba - extras: - - jupyter - - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl#sha256=a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 - - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl#sha256=d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 - - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl#sha256=f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 - - pypi: https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl#sha256=f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c - - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl#sha256=ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl#sha256=6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316 - - pypi: https://files.pythonhosted.org/packages/fb/e7/07dc8b6541affd4de15f0e8fc855f238cb93d04c4f8490757226d12cdb5a/ipython-8.21.0-py3-none-any.whl#sha256=1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5 - - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl#sha256=3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 - - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl#sha256=d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd - - pypi: https://files.pythonhosted.org/packages/ff/ce/1b4dc8b5ecdc9a99202b093729192b69301c33064d0e312fb8d9e384dbe0/google_auth-2.28.0-py2.py3-none-any.whl#sha256=7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53 + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/3e/956d40991c152010d71b38b1a9763edc8fe5944d360e1c256fae60cb9165/ipython-8.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/15/da/43bee505963da0c730ee50e951c604bfdb90d4cccc9c0044c946b10e68a7/ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/16/e8/b6a5affd7c071b2006dad64e10d82aa63673830d2189214d91501a56003d/plot-antenna-1.8.tar.gz + - pypi: https://files.pythonhosted.org/packages/1f/73/9464c338482c5ebb865585276f27997d66dc459ce3a2df6fc0e0df222019/fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/50/1e211cbb5e1f52e55eeae1605789c9d24403962d37581cf0deb3e6b33377/tensorflow-2.14.0-cp311-cp311-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/0f/85fbc988095c614ebec2ea471dac5fc777bd9083e235cbcc45cea4275c06/pyboy-1.6.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz + - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz + - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/89/1d/23bafc80495b2a902b27d242e9226ea0b74624f108c60f0533329c051f78/pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8d/07/7e245ce1d7daec77cb1ca3b8caf094afb04c4c552a904787a1d684a2b606/matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/d0/5911ad3cecb896588202e3e90bd97c0c7381718a6ccb2eaeebb70d7fe2ce/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/54/1dafec3c84df1d29119037330f7289db84a679cb2d5283af4ef24d89f532/contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ad/e3/1009781ce3c0d92634fa2fb3dc4bb0237fe7aaf70f2ab53160f3e82e7d63/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_10_14_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/1d/f152a5f6d243b6acbb2a710ed19aa47154d678359bed995abdd9daf0cff0/google_auth-2.28.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6e9549a855b5818e66a917e852ec608e77550c8dc08b/setuptools-69.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/99/570fedd40048daeb04d4738ed4f1d0e77259fb631387f7f188aac3d85c31/h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/8a/4e997c40be25c54b4c46140175052c996a9ca99ae7f563dce29112e5dbcf/grpcio-1.62.0-cp311-cp311-macosx_10_10_universal2.whl + - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/f9/8c078b4973604cd968b23eb3dff52028b5c48f2a02c4f1f975f4d5e344d1/wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/2c/d9b1a77101e6e5f294f6553d76c39322122bfea2a438aeea4eb6d4b22749/black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/8b/617792ad1feef330e87d7459584a1f91aa8aea373d8b168ac5d24fddd808/pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl osx-arm64: - - pypi: git+https://github.com/schlatterbeck/pySmithPlot.git - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda @@ -280,94 +273,91 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl#sha256=c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 - - pypi: https://files.pythonhosted.org/packages/0e/a4/9c9e1786c3ade85d59a54cf0f9f371624e807e91183dc273144e692fc061/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_universal2.whl#sha256=2748f8960bd98c5c53c9c1a94fdefed84a3458094f8014556d5f8026cc8341a4 - - pypi: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl#sha256=629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f - - pypi: https://files.pythonhosted.org/packages/15/da/43bee505963da0c730ee50e951c604bfdb90d4cccc9c0044c946b10e68a7/ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl#sha256=e70047ec2c83eaee01afdfdabee2c5b0c133804d90d0f7db4dd903360fcc537c - - pypi: https://files.pythonhosted.org/packages/1a/26/837f5e58e90f53eab27acf30fc878a933d8ca8e35e1f2f82f9b39385f830/fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl#sha256=edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e - - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl#sha256=e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 - - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 - - pypi: https://files.pythonhosted.org/packages/24/db/6ec78a4f10673a641cdb11694c2de2f64aa00e838551248cb11b8b057440/matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl#sha256=d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e - - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl#sha256=906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a - - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl#sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d - - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl#sha256=c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 - - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl#sha256=01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 - - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz#sha256=bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl#sha256=32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb - - pypi: https://files.pythonhosted.org/packages/3e/56/1b7ef816e448464a93da70296db237129910b4452d6b4582d5e23fb07880/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_12_0_arm64.whl#sha256=848e8e89a0f49258c7782189c938d8d1162d989da1a80c79f95c7af3ef6006c8 - - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl#sha256=d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd - - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl#sha256=2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74 - - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl#sha256=051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 - - pypi: https://files.pythonhosted.org/packages/46/ce/a84284ab66a278825109b03765d7411be3ff18250da44faa9fb5ea9a16a0/pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67 - - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl#sha256=90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 - - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl#sha256=95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb - - pypi: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl#sha256=fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 - - pypi: https://files.pythonhosted.org/packages/52/79/47b50804b18e3aef1bef6d7f317cecb7cf07c28665868a7543c5c1dc335b/plot-antenna-1.7.tar.gz#sha256=ab58a77acab213a1b50a0c40cc848d1c2c470af26a126c2e210135392b638580 - - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl#sha256=0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 - - pypi: https://files.pythonhosted.org/packages/57/0f/85fbc988095c614ebec2ea471dac5fc777bd9083e235cbcc45cea4275c06/pyboy-1.6.6-cp311-cp311-macosx_10_9_universal2.whl#sha256=14c56a005c8272b4e9e956ab6e6f3c8855a2fab5732d2367dd84c08460367c2c - - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz#sha256=a376cfae20b16fcfbef24bf3c047a8a294c35032bb051fa98842c12bbab6f0ff - - pypi: https://files.pythonhosted.org/packages/5b/ac/26fa1057f62beaa2af4c55c6ac733b114a403b746cfe0ce3dc6e4aec921a/contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd - - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz#sha256=1027406badbecdd30fe56e800a5a76ad7d7271a3aec0b7acf780ee26a00f2d40 - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz#sha256=c4d5ddc7e1c6e4d0d4e3588f804489d2142066cc80ed4b5e4dc7cc5f9d8de322 - - pypi: https://files.pythonhosted.org/packages/6e/79/aec8185eefe20e8f49e5adeb0c2e20e016d5916d10872c17705ddac41be2/wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl#sha256=2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9 - - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl#sha256=c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1 - - pypi: https://files.pythonhosted.org/packages/6f/4e/63e6b79132e854a67df3d37a5c8560e45c79e2504fa57e032c1d61abb090/pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b - - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl#sha256=2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 - - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f - - pypi: https://files.pythonhosted.org/packages/72/e2/d981a3ff05ba9abe3cfa33e70c986facb0614fd57c4f802ef435f4dd1697/black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl#sha256=602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b - extras: - - jupyter - - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl#sha256=3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58 - - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl#sha256=7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb - - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl#sha256=8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca - - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl#sha256=eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc - - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl#sha256=b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 - - pypi: https://files.pythonhosted.org/packages/8d/70/2b0b99507287f66e71a6b2e66c5ad2ec2461ef2c534668eef96c3b48eb6d/h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd - - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl#sha256=3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e - - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl#sha256=b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c - - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 - - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl#sha256=7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 - - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d - - pypi: https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl#sha256=861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 - - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl#sha256=526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 - - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl#sha256=b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed - - pypi: https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl#sha256=af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd - - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 - - pypi: https://files.pythonhosted.org/packages/bb/0a/203797141ec9727344c7649f6d5f6cf71b89a6c28f8f55d4f18de7a1d352/setuptools-69.1.0-py3-none-any.whl#sha256=c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6 - - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl#sha256=2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 - - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl#sha256=c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl#sha256=177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 - - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl#sha256=d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d - - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl#sha256=4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58 - - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl#sha256=820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57 - - pypi: https://files.pythonhosted.org/packages/d3/4b/ae9037ea22ba94eb2cf267e991384c3444f3e6142fa49923352b4ab73e14/tensorflow_macos-2.14.0-cp311-cp311-macosx_12_0_arm64.whl#sha256=064e98b67d7a89e72c37c90254c0a322a0b8d0ce9b68f23286816210e3ef6685 - - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl#sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 - - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl#sha256=9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63 - - pypi: https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl#sha256=549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e - - pypi: https://files.pythonhosted.org/packages/de/ea/90267db2c02fb61f4d03b9645c7446d3cbca6d5c08522e889535c88edfcd/tensorflow-2.14.0-cp311-cp311-macosx_12_0_arm64.whl#sha256=c92f5526c2029d31a036be06eb229c71f1c1821472876d34d0184d19908e318c - - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 - - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl#sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 - - pypi: https://files.pythonhosted.org/packages/ec/d5/c3ddb54b39ce43d21428407eb26cf9a21fd43de5e26d9733b1f173d57475/grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl#sha256=4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87 - - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl#sha256=a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 - - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl#sha256=d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 - - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl#sha256=f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 - - pypi: https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl#sha256=f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c - - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl#sha256=ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl#sha256=6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316 - - pypi: https://files.pythonhosted.org/packages/fb/e7/07dc8b6541affd4de15f0e8fc855f238cb93d04c4f8490757226d12cdb5a/ipython-8.21.0-py3-none-any.whl#sha256=1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5 - - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl#sha256=3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 - - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl#sha256=d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd - - pypi: https://files.pythonhosted.org/packages/ff/ce/1b4dc8b5ecdc9a99202b093729192b69301c33064d0e312fb8d9e384dbe0/google_auth-2.28.0-py2.py3-none-any.whl#sha256=7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53 + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/a4/9c9e1786c3ade85d59a54cf0f9f371624e807e91183dc273144e692fc061/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_universal2.whl + - pypi: https://files.pythonhosted.org/packages/11/3e/956d40991c152010d71b38b1a9763edc8fe5944d360e1c256fae60cb9165/ipython-8.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/15/da/43bee505963da0c730ee50e951c604bfdb90d4cccc9c0044c946b10e68a7/ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/16/e8/b6a5affd7c071b2006dad64e10d82aa63673830d2189214d91501a56003d/plot-antenna-1.8.tar.gz + - pypi: https://files.pythonhosted.org/packages/1a/26/837f5e58e90f53eab27acf30fc878a933d8ca8e35e1f2f82f9b39385f830/fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/db/6ec78a4f10673a641cdb11694c2de2f64aa00e838551248cb11b8b057440/matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/56/1b7ef816e448464a93da70296db237129910b4452d6b4582d5e23fb07880/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/ce/a84284ab66a278825109b03765d7411be3ff18250da44faa9fb5ea9a16a0/pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/0f/85fbc988095c614ebec2ea471dac5fc777bd9083e235cbcc45cea4275c06/pyboy-1.6.6-cp311-cp311-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz + - pypi: https://files.pythonhosted.org/packages/5b/ac/26fa1057f62beaa2af4c55c6ac733b114a403b746cfe0ce3dc6e4aec921a/contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz + - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/6e/79/aec8185eefe20e8f49e5adeb0c2e20e016d5916d10872c17705ddac41be2/wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/e2/d981a3ff05ba9abe3cfa33e70c986facb0614fd57c4f802ef435f4dd1697/black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/70/2b0b99507287f66e71a6b2e66c5ad2ec2461ef2c534668eef96c3b48eb6d/h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a5/78/1d859bfb619c067e3353ed079248ae9532c105c4e018fa9a776d04b34572/pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/1d/f152a5f6d243b6acbb2a710ed19aa47154d678359bed995abdd9daf0cff0/google_auth-2.28.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6e9549a855b5818e66a917e852ec608e77550c8dc08b/setuptools-69.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d3/4b/ae9037ea22ba94eb2cf267e991384c3444f3e6142fa49923352b4ab73e14/tensorflow_macos-2.14.0-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d3/8a/4e997c40be25c54b4c46140175052c996a9ca99ae7f563dce29112e5dbcf/grpcio-1.62.0-cp311-cp311-macosx_10_10_universal2.whl + - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/de/ea/90267db2c02fb61f4d03b9645c7446d3cbca6d5c08522e889535c88edfcd/tensorflow-2.14.0-cp311-cp311-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl win-64: - - pypi: git+https://github.com/schlatterbeck/pySmithPlot.git - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda @@ -399,91 +389,89 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl#sha256=c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 - - pypi: https://files.pythonhosted.org/packages/08/89/c727fde1a3d12586e0b8c01abf53754707d76beaa9987640e70807d4545f/ml_dtypes-0.2.0-cp311-cp311-win_amd64.whl#sha256=832a019a1b6db5c4422032ca9940a990fa104eee420f643713241b3a518977fa - - pypi: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl#sha256=6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 - - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl#sha256=e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 - - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl#sha256=906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a - - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl#sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d - - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl#sha256=c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 - - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl#sha256=01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 - - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz#sha256=bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - - pypi: https://files.pythonhosted.org/packages/37/bf/a80abc6fcdb00f0d4d3d74184b172adbf2197f6b002913fa0fb6af4dc6db/black-23.12.1-cp311-cp311-win_amd64.whl#sha256=0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50 - extras: - - jupyter - - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl#sha256=32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb - - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl#sha256=d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd - - pypi: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl#sha256=1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56 - - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl#sha256=2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74 - - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl#sha256=051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 - - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl#sha256=90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 - - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl#sha256=95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb - - pypi: https://files.pythonhosted.org/packages/52/79/47b50804b18e3aef1bef6d7f317cecb7cf07c28665868a7543c5c1dc335b/plot-antenna-1.7.tar.gz#sha256=ab58a77acab213a1b50a0c40cc848d1c2c470af26a126c2e210135392b638580 - - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl#sha256=0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 - - pypi: https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl#sha256=663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 - - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz#sha256=a376cfae20b16fcfbef24bf3c047a8a294c35032bb051fa98842c12bbab6f0ff - - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz#sha256=1027406badbecdd30fe56e800a5a76ad7d7271a3aec0b7acf780ee26a00f2d40 - - pypi: https://files.pythonhosted.org/packages/66/e7/1c223e5e749fe568a0c8e24def8e0004da1fbc48e3f4cabb449ee655deaa/pyboy-1.6.6-cp311-cp311-win_amd64.whl#sha256=bc10363e3b83330c1bb19fc9a16590a6308f94f37df12b0db93ff1c164c1a43c - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz#sha256=c4d5ddc7e1c6e4d0d4e3588f804489d2142066cc80ed4b5e4dc7cc5f9d8de322 - - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl#sha256=c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1 - - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl#sha256=2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 - - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f - - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl#sha256=3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58 - - pypi: https://files.pythonhosted.org/packages/77/62/8e11962934e024a093758992bc82711e3e30efd5ea355cbfdc6e1ab5de76/pandas-2.2.0-cp311-cp311-win_amd64.whl#sha256=fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9 - - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl#sha256=7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb - - pypi: https://files.pythonhosted.org/packages/7b/3e/a22e7a0ec6be5454dc540063ac5d0843eb72a4641a0892b54b16b1438c0a/grpcio-1.60.1-cp311-cp311-win_amd64.whl#sha256=49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c - - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl#sha256=8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca - - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl#sha256=eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc - - pypi: https://files.pythonhosted.org/packages/80/6f/57d36f6507e432d7fc1956b2e9e8530c5c2d2bfcd8821bcbfae271cd6688/tensorflow-2.14.0-cp311-cp311-win_amd64.whl#sha256=0587ece626c4f7c4fcb2132525ea6c77ad2f2f5659a9b0f4451b1000be1b5e16 - - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl#sha256=b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 - - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl#sha256=3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e - - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl#sha256=b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c - - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 - - pypi: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl#sha256=40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407 - - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d - - pypi: https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl#sha256=861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 - - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl#sha256=526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 - - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl#sha256=b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed - - pypi: https://files.pythonhosted.org/packages/ac/4e/9566a313927be582ca99455a9523a097c7888fc819695bdc08415432b202/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-win_amd64.whl#sha256=4bb37d23f21c434687b11059cb7ffd094d52a7813368915ba1b7057e3c16e414 - - pypi: https://files.pythonhosted.org/packages/ad/6e/1bed3b7c904cc178cb8ee8dbaf72934964452b3de95b7a63412591edb93c/protobuf-4.25.3-cp310-abi3-win_amd64.whl#sha256=209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 - - pypi: https://files.pythonhosted.org/packages/ad/6e/1bfe367855dd87467564f7bf9fa14f3b17889988e79598bc37bf18f5ffb6/tensorflow_intel-2.14.0-cp311-cp311-win_amd64.whl#sha256=51f96c729d61ff8e2e340df5b3b4db81a938258f1c9282ab09277896d0c408ae - - pypi: https://files.pythonhosted.org/packages/b6/35/ed21094eb4d8acf31ccc7666a4d8701c1ce38f8d1fa3c7036f24416f6337/h5py-3.10.0-cp311-cp311-win_amd64.whl#sha256=92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684 - - pypi: https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl#sha256=2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 - - pypi: https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl#sha256=af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd - - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 - - pypi: https://files.pythonhosted.org/packages/ba/7e/14113996bc6ee68eb987773b4139c87afd3ceff60e27e37648aa5eb2798a/wrapt-1.14.1-cp311-cp311-win_amd64.whl#sha256=26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224 - - pypi: https://files.pythonhosted.org/packages/bb/0a/203797141ec9727344c7649f6d5f6cf71b89a6c28f8f55d4f18de7a1d352/setuptools-69.1.0-py3-none-any.whl#sha256=c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6 - - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl#sha256=2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 - - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl#sha256=c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/c5/b4/bab7181a7682f782e1fd2a2a52af913222ce71928068833c1709ce85019d/pysdl2_dll-2.30.0-py2.py3-none-win_amd64.whl#sha256=79a5aff8389a8b03f602b32e22c9051c96ab6cb6fb83ce29ddcb0ea3a08cb321 - - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl#sha256=177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d - - pypi: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl#sha256=99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de - - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 - - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl#sha256=d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d - - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl#sha256=4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58 - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl#sha256=820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57 - - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl#sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 - - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl#sha256=9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63 - - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 - - pypi: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl#sha256=fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6 - - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl#sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 - - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl#sha256=a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 - - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl#sha256=d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 - - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl#sha256=f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 - - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl#sha256=ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl#sha256=6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316 - - pypi: https://files.pythonhosted.org/packages/fb/e7/07dc8b6541affd4de15f0e8fc855f238cb93d04c4f8490757226d12cdb5a/ipython-8.21.0-py3-none-any.whl#sha256=1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5 - - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl#sha256=3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 - - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl#sha256=d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd - - pypi: https://files.pythonhosted.org/packages/ff/ce/1b4dc8b5ecdc9a99202b093729192b69301c33064d0e312fb8d9e384dbe0/google_auth-2.28.0-py2.py3-none-any.whl#sha256=7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53 + - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/2b/f1a3b06576a33f3a5b7b2f53cafaf3c2f11a1886c1ae7056ae17e82e4573/grpcio-1.62.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/89/c727fde1a3d12586e0b8c01abf53754707d76beaa9987640e70807d4545f/ml_dtypes-0.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/11/3e/956d40991c152010d71b38b1a9763edc8fe5944d360e1c256fae60cb9165/ipython-8.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/e8/b6a5affd7c071b2006dad64e10d82aa63673830d2189214d91501a56003d/plot-antenna-1.8.tar.gz + - pypi: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/bf/a80abc6fcdb00f0d4d3d74184b172adbf2197f6b002913fa0fb6af4dc6db/black-23.12.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz + - pypi: https://files.pythonhosted.org/packages/61/11/1812ef6cbd7433ad240f72161ce5f84c4c450cede4db080365d371d29117/pandas-2.2.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz + - pypi: https://files.pythonhosted.org/packages/66/e7/1c223e5e749fe568a0c8e24def8e0004da1fbc48e3f4cabb449ee655deaa/pyboy-1.6.6-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/6f/57d36f6507e432d7fc1956b2e9e8530c5c2d2bfcd8821bcbfae271cd6688/tensorflow-2.14.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/4e/9566a313927be582ca99455a9523a097c7888fc819695bdc08415432b202/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ad/6e/1bed3b7c904cc178cb8ee8dbaf72934964452b3de95b7a63412591edb93c/protobuf-4.25.3-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ad/6e/1bfe367855dd87467564f7bf9fa14f3b17889988e79598bc37bf18f5ffb6/tensorflow_intel-2.14.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b6/35/ed21094eb4d8acf31ccc7666a4d8701c1ce38f8d1fa3c7036f24416f6337/h5py-3.10.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b7/1d/f152a5f6d243b6acbb2a710ed19aa47154d678359bed995abdd9daf0cff0/google_auth-2.28.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/7e/14113996bc6ee68eb987773b4139c87afd3ceff60e27e37648aa5eb2798a/wrapt-1.14.1-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6e9549a855b5818e66a917e852ec608e77550c8dc08b/setuptools-69.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/b4/bab7181a7682f782e1fd2a2a52af913222ce71928068833c1709ce85019d/pysdl2_dll-2.30.0-py2.py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl packages: - kind: conda name: _libgcc_mutex @@ -517,13 +505,13 @@ packages: - kind: pypi name: absl-py version: 2.1.0 - url: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl#sha256=526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 + url: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl sha256: 526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 requires_python: '>=3.7' - kind: pypi name: asttokens version: 2.4.1 - url: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl#sha256=051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 + url: https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl sha256: 051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 requires_dist: - six >=1.12.0 @@ -536,7 +524,7 @@ packages: - kind: pypi name: astunparse version: 1.6.3 - url: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl#sha256=c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 + url: https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl sha256: c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 requires_dist: - wheel <1.0, >=0.23.0 @@ -544,7 +532,7 @@ packages: - kind: pypi name: black version: 23.12.1 - url: https://files.pythonhosted.org/packages/72/e2/d981a3ff05ba9abe3cfa33e70c986facb0614fd57c4f802ef435f4dd1697/black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl#sha256=602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b + url: https://files.pythonhosted.org/packages/72/e2/d981a3ff05ba9abe3cfa33e70c986facb0614fd57c4f802ef435f4dd1697/black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl sha256: 602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b requires_dist: - click >=8.0.0 @@ -564,7 +552,7 @@ packages: - kind: pypi name: black version: 23.12.1 - url: https://files.pythonhosted.org/packages/eb/59/1f5c8eb7bba8a8b1bb5c87f097d16410c93a48a6655be3773db5d2783deb/black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59 + url: https://files.pythonhosted.org/packages/eb/59/1f5c8eb7bba8a8b1bb5c87f097d16410c93a48a6655be3773db5d2783deb/black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59 requires_dist: - click >=8.0.0 @@ -584,8 +572,8 @@ packages: - kind: pypi name: black version: 23.12.1 - url: https://files.pythonhosted.org/packages/37/bf/a80abc6fcdb00f0d4d3d74184b172adbf2197f6b002913fa0fb6af4dc6db/black-23.12.1-cp311-cp311-win_amd64.whl#sha256=0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50 - sha256: 0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50 + url: https://files.pythonhosted.org/packages/ed/2c/d9b1a77101e6e5f294f6553d76c39322122bfea2a438aeea4eb6d4b22749/black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba requires_dist: - click >=8.0.0 - mypy-extensions >=0.4.3 @@ -604,8 +592,8 @@ packages: - kind: pypi name: black version: 23.12.1 - url: https://files.pythonhosted.org/packages/ed/2c/d9b1a77101e6e5f294f6553d76c39322122bfea2a438aeea4eb6d4b22749/black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl#sha256=8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba - sha256: 8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba + url: https://files.pythonhosted.org/packages/37/bf/a80abc6fcdb00f0d4d3d74184b172adbf2197f6b002913fa0fb6af4dc6db/black-23.12.1-cp311-cp311-win_amd64.whl + sha256: 0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50 requires_dist: - click >=8.0.0 - mypy-extensions >=0.4.3 @@ -624,7 +612,7 @@ packages: - kind: pypi name: blinker version: 1.7.0 - url: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 + url: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl sha256: c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 requires_python: '>=3.8' - kind: conda @@ -731,44 +719,44 @@ packages: timestamp: 1706844034242 - kind: pypi name: cachetools - version: 5.3.2 - url: https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl#sha256=861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 - sha256: 861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1 + version: 5.3.3 + url: https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl + sha256: 0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945 requires_python: '>=3.7' - kind: pypi name: certifi version: 2024.2.2 - url: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl#sha256=dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 + url: https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl sha256: dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1 requires_python: '>=3.6' - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl#sha256=549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e + url: https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl sha256: 549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 + url: https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl#sha256=663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 - sha256: 663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 + url: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl#sha256=573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 - sha256: 573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 + url: https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl + sha256: 663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 requires_python: '>=3.7.0' - kind: pypi name: click version: 8.1.7 - url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 + url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 requires_dist: - colorama ; platform_system == 'Windows' @@ -777,13 +765,13 @@ packages: - kind: pypi name: colorama version: 0.4.6 - url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: pypi name: contourpy version: 1.2.0 - url: https://files.pythonhosted.org/packages/5b/ac/26fa1057f62beaa2af4c55c6ac733b114a403b746cfe0ce3dc6e4aec921a/contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd + url: https://files.pythonhosted.org/packages/5b/ac/26fa1057f62beaa2af4c55c6ac733b114a403b746cfe0ce3dc6e4aec921a/contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl sha256: 5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd requires_dist: - numpy <2.0, >=1.20 @@ -795,10 +783,10 @@ packages: - contourpy[bokeh,docs] ; extra == 'mypy' - docutils-stubs ; extra == 'mypy' - mypy ==1.6.1 ; extra == 'mypy' - - types-Pillow ; extra == 'mypy' + - types-pillow ; extra == 'mypy' - contourpy[test-no-images] ; extra == 'test' - matplotlib ; extra == 'test' - - Pillow ; extra == 'test' + - pillow ; extra == 'test' - pytest ; extra == 'test-no-images' - pytest-cov ; extra == 'test-no-images' - pytest-xdist ; extra == 'test-no-images' @@ -807,7 +795,7 @@ packages: - kind: pypi name: contourpy version: 1.2.0 - url: https://files.pythonhosted.org/packages/e2/83/29a63bbc72839cc6b24b5a0e3d004d4ed4e8439f26460ad9a34e39251904/contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686 + url: https://files.pythonhosted.org/packages/e2/83/29a63bbc72839cc6b24b5a0e3d004d4ed4e8439f26460ad9a34e39251904/contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686 requires_dist: - numpy <2.0, >=1.20 @@ -819,10 +807,10 @@ packages: - contourpy[bokeh,docs] ; extra == 'mypy' - docutils-stubs ; extra == 'mypy' - mypy ==1.6.1 ; extra == 'mypy' - - types-Pillow ; extra == 'mypy' + - types-pillow ; extra == 'mypy' - contourpy[test-no-images] ; extra == 'test' - matplotlib ; extra == 'test' - - Pillow ; extra == 'test' + - pillow ; extra == 'test' - pytest ; extra == 'test-no-images' - pytest-cov ; extra == 'test-no-images' - pytest-xdist ; extra == 'test-no-images' @@ -831,8 +819,8 @@ packages: - kind: pypi name: contourpy version: 1.2.0 - url: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl#sha256=99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de - sha256: 99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de + url: https://files.pythonhosted.org/packages/9b/54/1dafec3c84df1d29119037330f7289db84a679cb2d5283af4ef24d89f532/contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727 requires_dist: - numpy <2.0, >=1.20 - furo ; extra == 'docs' @@ -843,10 +831,10 @@ packages: - contourpy[bokeh,docs] ; extra == 'mypy' - docutils-stubs ; extra == 'mypy' - mypy ==1.6.1 ; extra == 'mypy' - - types-Pillow ; extra == 'mypy' + - types-pillow ; extra == 'mypy' - contourpy[test-no-images] ; extra == 'test' - matplotlib ; extra == 'test' - - Pillow ; extra == 'test' + - pillow ; extra == 'test' - pytest ; extra == 'test-no-images' - pytest-cov ; extra == 'test-no-images' - pytest-xdist ; extra == 'test-no-images' @@ -855,8 +843,8 @@ packages: - kind: pypi name: contourpy version: 1.2.0 - url: https://files.pythonhosted.org/packages/9b/54/1dafec3c84df1d29119037330f7289db84a679cb2d5283af4ef24d89f532/contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl#sha256=dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727 - sha256: dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727 + url: https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl + sha256: 99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de requires_dist: - numpy <2.0, >=1.20 - furo ; extra == 'docs' @@ -867,10 +855,10 @@ packages: - contourpy[bokeh,docs] ; extra == 'mypy' - docutils-stubs ; extra == 'mypy' - mypy ==1.6.1 ; extra == 'mypy' - - types-Pillow ; extra == 'mypy' + - types-pillow ; extra == 'mypy' - contourpy[test-no-images] ; extra == 'test' - matplotlib ; extra == 'test' - - Pillow ; extra == 'test' + - pillow ; extra == 'test' - pytest ; extra == 'test-no-images' - pytest-cov ; extra == 'test-no-images' - pytest-xdist ; extra == 'test-no-images' @@ -879,7 +867,7 @@ packages: - kind: pypi name: cycler version: 0.12.1 - url: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 + url: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl sha256: 85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 requires_dist: - ipython ; extra == 'docs' @@ -893,19 +881,19 @@ packages: - kind: pypi name: decorator version: 5.1.1 - url: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl#sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 + url: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl sha256: b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 requires_python: '>=3.5' - kind: pypi name: env-test-package version: 0.0.3 - url: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz#sha256=c4d5ddc7e1c6e4d0d4e3588f804489d2142066cc80ed4b5e4dc7cc5f9d8de322 + url: https://files.pythonhosted.org/packages/6a/e8/cf2872a1a625b1c08d5f908110876ac1098610e59bab728244a7cd7820dc/env_test_package-0.0.3.tar.gz sha256: c4d5ddc7e1c6e4d0d4e3588f804489d2142066cc80ed4b5e4dc7cc5f9d8de322 requires_python: '>=3.8' - kind: pypi name: executing version: 2.0.1 - url: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl#sha256=eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc + url: https://files.pythonhosted.org/packages/80/03/6ea8b1b2a5ab40a7a60dc464d3daa7aa546e0a74d74a9f8ff551ea7905db/executing-2.0.1-py2.py3-none-any.whl sha256: eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc requires_dist: - asttokens >=2.1.0 ; extra == 'tests' @@ -919,11 +907,11 @@ packages: - kind: pypi name: flask version: 3.0.2 - url: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl#sha256=3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e + url: https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl sha256: 3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e requires_dist: - - Werkzeug >=3.0.0 - - Jinja2 >=3.1.2 + - werkzeug >=3.0.0 + - jinja2 >=3.1.2 - itsdangerous >=2.1.2 - click >=8.1.3 - blinker >=1.6.2 @@ -934,12 +922,12 @@ packages: - kind: pypi name: flatbuffers version: 23.5.26 - url: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl#sha256=c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1 + url: https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl sha256: c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1 - kind: pypi name: fonttools version: 4.49.0 - url: https://files.pythonhosted.org/packages/1a/26/837f5e58e90f53eab27acf30fc878a933d8ca8e35e1f2f82f9b39385f830/fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl#sha256=edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e + url: https://files.pythonhosted.org/packages/1a/26/837f5e58e90f53eab27acf30fc878a933d8ca8e35e1f2f82f9b39385f830/fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl sha256: edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e requires_dist: - fs <3, >=2.2.0 ; extra == 'all' @@ -976,7 +964,7 @@ packages: - kind: pypi name: fonttools version: 4.49.0 - url: https://files.pythonhosted.org/packages/ac/cb/f42c5b07b14e9bccc5515f8584e613aed25c4a3ab064627b3b1369264d46/fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942 + url: https://files.pythonhosted.org/packages/ac/cb/f42c5b07b14e9bccc5515f8584e613aed25c4a3ab064627b3b1369264d46/fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942 requires_dist: - fs <3, >=2.2.0 ; extra == 'all' @@ -1013,7 +1001,44 @@ packages: - kind: pypi name: fonttools version: 4.49.0 - url: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl#sha256=fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6 + url: https://files.pythonhosted.org/packages/1f/73/9464c338482c5ebb865585276f27997d66dc459ce3a2df6fc0e0df222019/fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814 + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- kind: pypi + name: fonttools + version: 4.49.0 + url: https://files.pythonhosted.org/packages/ea/69/89f4bb69e28bb293b95abb0a66d49a841580451a584adb1aba59f39b6dff/fonttools-4.49.0-cp311-cp311-win_amd64.whl sha256: fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6 requires_dist: - fs <3, >=2.2.0 ; extra == 'all' @@ -1050,14 +1075,14 @@ packages: - kind: pypi name: gast version: 0.5.4 - url: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl#sha256=6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316 + url: https://files.pythonhosted.org/packages/fa/39/5aae571e5a5f4de9c3445dae08a530498e5c53b0e74410eeeb0991c79047/gast-0.5.4-py3-none-any.whl sha256: 6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' - kind: pypi name: google-auth - version: 2.28.0 - url: https://files.pythonhosted.org/packages/ff/ce/1b4dc8b5ecdc9a99202b093729192b69301c33064d0e312fb8d9e384dbe0/google_auth-2.28.0-py2.py3-none-any.whl#sha256=7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53 - sha256: 7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53 + version: 2.28.1 + url: https://files.pythonhosted.org/packages/b7/1d/f152a5f6d243b6acbb2a710ed19aa47154d678359bed995abdd9daf0cff0/google_auth-2.28.1-py2.py3-none-any.whl + sha256: 25141e2d7a14bfcba945f5e9827f98092716e99482562f15306e5b026e21aa72 requires_dist: - cachetools <6.0, >=2.0.0 - pyasn1-modules >=0.2.1 @@ -1074,7 +1099,7 @@ packages: - kind: pypi name: google-auth-oauthlib version: 1.0.0 - url: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl#sha256=95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb + url: https://files.pythonhosted.org/packages/4a/07/8d9a8186e6768b55dfffeb57c719bc03770cf8a970a074616ae6f9e26a57/google_auth_oauthlib-1.0.0-py2.py3-none-any.whl sha256: 95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb requires_dist: - google-auth >=2.15.0 @@ -1084,38 +1109,38 @@ packages: - kind: pypi name: google-pasta version: 0.2.0 - url: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl#sha256=b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed + url: https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl sha256: b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed requires_dist: - six - kind: pypi name: grpcio - version: 1.60.1 - url: https://files.pythonhosted.org/packages/ec/d5/c3ddb54b39ce43d21428407eb26cf9a21fd43de5e26d9733b1f173d57475/grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl#sha256=4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87 - sha256: 4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87 + version: 1.62.0 + url: https://files.pythonhosted.org/packages/d3/8a/4e997c40be25c54b4c46140175052c996a9ca99ae7f563dce29112e5dbcf/grpcio-1.62.0-cp311-cp311-macosx_10_10_universal2.whl + sha256: 36df33080cd7897623feff57831eb83c98b84640b016ce443305977fac7566fb requires_dist: - - grpcio-tools >=1.60.1 ; extra == 'protobuf' + - grpcio-tools >=1.62.0 ; extra == 'protobuf' requires_python: '>=3.7' - kind: pypi name: grpcio - version: 1.60.1 - url: https://files.pythonhosted.org/packages/b8/c7/44201b27a9be0af7f997881904ce878a09a7fe95fc2e273d2f92b7b5b373/grpcio-1.60.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7 - sha256: cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7 + version: 1.62.0 + url: https://files.pythonhosted.org/packages/7e/61/79618621c56244d4778811f98737af8be4af1c0b034261c270cdfbda0762/grpcio-1.62.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 7f9d6c3223914abb51ac564dc9c3782d23ca445d2864321b9059d62d47144021 requires_dist: - - grpcio-tools >=1.60.1 ; extra == 'protobuf' + - grpcio-tools >=1.62.0 ; extra == 'protobuf' requires_python: '>=3.7' - kind: pypi name: grpcio - version: 1.60.1 - url: https://files.pythonhosted.org/packages/7b/3e/a22e7a0ec6be5454dc540063ac5d0843eb72a4641a0892b54b16b1438c0a/grpcio-1.60.1-cp311-cp311-win_amd64.whl#sha256=49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c - sha256: 49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c + version: 1.62.0 + url: https://files.pythonhosted.org/packages/02/2b/f1a3b06576a33f3a5b7b2f53cafaf3c2f11a1886c1ae7056ae17e82e4573/grpcio-1.62.0-cp311-cp311-win_amd64.whl + sha256: eef1d16ac26c5325e7d39f5452ea98d6988c700c427c52cbc7ce3201e6d93334 requires_dist: - - grpcio-tools >=1.60.1 ; extra == 'protobuf' + - grpcio-tools >=1.62.0 ; extra == 'protobuf' requires_python: '>=3.7' - kind: pypi name: h5py version: 3.10.0 - url: https://files.pythonhosted.org/packages/8d/70/2b0b99507287f66e71a6b2e66c5ad2ec2461ef2c534668eef96c3b48eb6d/h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd + url: https://files.pythonhosted.org/packages/8d/70/2b0b99507287f66e71a6b2e66c5ad2ec2461ef2c534668eef96c3b48eb6d/h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl sha256: 667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd requires_dist: - numpy >=1.17.3 @@ -1123,7 +1148,7 @@ packages: - kind: pypi name: h5py version: 3.10.0 - url: https://files.pythonhosted.org/packages/1e/e9/61d7338e503d63d2ce733373fa86256614f579b173cf3d0571d4f46cb561/h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52 + url: https://files.pythonhosted.org/packages/1e/e9/61d7338e503d63d2ce733373fa86256614f579b173cf3d0571d4f46cb561/h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52 requires_dist: - numpy >=1.17.3 @@ -1131,16 +1156,16 @@ packages: - kind: pypi name: h5py version: 3.10.0 - url: https://files.pythonhosted.org/packages/b6/35/ed21094eb4d8acf31ccc7666a4d8701c1ce38f8d1fa3c7036f24416f6337/h5py-3.10.0-cp311-cp311-win_amd64.whl#sha256=92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684 - sha256: 92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684 + url: https://files.pythonhosted.org/packages/c3/99/570fedd40048daeb04d4738ed4f1d0e77259fb631387f7f188aac3d85c31/h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc requires_dist: - numpy >=1.17.3 requires_python: '>=3.8' - kind: pypi name: h5py version: 3.10.0 - url: https://files.pythonhosted.org/packages/c3/99/570fedd40048daeb04d4738ed4f1d0e77259fb631387f7f188aac3d85c31/h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl#sha256=2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc - sha256: 2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc + url: https://files.pythonhosted.org/packages/b6/35/ed21094eb4d8acf31ccc7666a4d8701c1ce38f8d1fa3c7036f24416f6337/h5py-3.10.0-cp311-cp311-win_amd64.whl + sha256: 92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684 requires_dist: - numpy >=1.17.3 requires_python: '>=3.8' @@ -1186,7 +1211,7 @@ packages: - kind: pypi name: idna version: '3.6' - url: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl#sha256=c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f + url: https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl sha256: c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f requires_python: '>=3.5' - kind: conda @@ -1204,9 +1229,9 @@ packages: timestamp: 1706182537883 - kind: pypi name: ipython - version: 8.21.0 - url: https://files.pythonhosted.org/packages/fb/e7/07dc8b6541affd4de15f0e8fc855f238cb93d04c4f8490757226d12cdb5a/ipython-8.21.0-py3-none-any.whl#sha256=1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5 - sha256: 1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5 + version: 8.22.1 + url: https://files.pythonhosted.org/packages/11/3e/956d40991c152010d71b38b1a9763edc8fe5944d360e1c256fae60cb9165/ipython-8.22.1-py3-none-any.whl + sha256: 869335e8cded62ffb6fac8928e5287a05433d6462e3ebaac25f4216474dd6bc4 requires_dist: - decorator - jedi >=0.16 @@ -1214,50 +1239,25 @@ packages: - prompt-toolkit <3.1.0, >=3.0.41 - pygments >=2.4.0 - stack-data - - traitlets >=5 + - traitlets >=5.13.0 - typing-extensions ; python_version < '3.10' - exceptiongroup ; python_version < '3.11' - - pexpect >4.3 ; sys_platform != 'win32' + - pexpect >4.3 ; sys_platform != 'win32' and sys_platform != 'emscripten' - colorama ; sys_platform == 'win32' - - black ; extra == 'all' - - ipykernel ; extra == 'all' - - setuptools >=18.5 ; extra == 'all' - - sphinx >=1.3 ; extra == 'all' - - sphinx-rtd-theme ; extra == 'all' - - docrepr ; extra == 'all' - - matplotlib ; extra == 'all' - - stack-data ; extra == 'all' - - typing-extensions ; extra == 'all' - - exceptiongroup ; extra == 'all' - - pytest <8 ; extra == 'all' - - pytest-asyncio <0.22 ; extra == 'all' - - testpath ; extra == 'all' - - pickleshare ; extra == 'all' - - nbconvert ; extra == 'all' - - nbformat ; extra == 'all' - - ipywidgets ; extra == 'all' - - notebook ; extra == 'all' - - ipyparallel ; extra == 'all' - - qtconsole ; extra == 'all' - - curio ; extra == 'all' - - matplotlib !=3.2.0 ; extra == 'all' - - numpy >=1.23 ; extra == 'all' - - pandas ; extra == 'all' - - trio ; extra == 'all' + - ipython[black,doc,kernel,nbconvert,nbformat,notebook,parallel,qtconsole,terminal] ; extra == 'all' + - ipython[test,test-extra] ; extra == 'all' - black ; extra == 'black' - ipykernel ; extra == 'doc' - setuptools >=18.5 ; extra == 'doc' - sphinx >=1.3 ; extra == 'doc' - sphinx-rtd-theme ; extra == 'doc' + - sphinxcontrib-jquery ; extra == 'doc' - docrepr ; extra == 'doc' - matplotlib ; extra == 'doc' - stack-data ; extra == 'doc' - typing-extensions ; extra == 'doc' - exceptiongroup ; extra == 'doc' - - pytest <8 ; extra == 'doc' - - pytest-asyncio <0.22 ; extra == 'doc' - - testpath ; extra == 'doc' - - pickleshare ; extra == 'doc' + - ipython[test] ; extra == 'doc' - ipykernel ; extra == 'kernel' - nbconvert ; extra == 'nbconvert' - nbformat ; extra == 'nbformat' @@ -1269,10 +1269,7 @@ packages: - pytest-asyncio <0.22 ; extra == 'test' - testpath ; extra == 'test' - pickleshare ; extra == 'test' - - pytest <8 ; extra == 'test_extra' - - pytest-asyncio <0.22 ; extra == 'test_extra' - - testpath ; extra == 'test_extra' - - pickleshare ; extra == 'test_extra' + - ipython[test] ; extra == 'test_extra' - curio ; extra == 'test_extra' - matplotlib !=3.2.0 ; extra == 'test_extra' - nbformat ; extra == 'test_extra' @@ -1283,19 +1280,19 @@ packages: - kind: pypi name: itsdangerous version: 2.1.2 - url: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 + url: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl sha256: 2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 requires_python: '>=3.7' - kind: pypi name: jedi version: 0.19.1 - url: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl#sha256=e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 + url: https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl sha256: e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 requires_dist: - parso <0.9.0, >=0.8.3 - - Jinja2 ==2.11.3 ; extra == 'docs' - - MarkupSafe ==1.1.1 ; extra == 'docs' - - Pygments ==2.8.1 ; extra == 'docs' + - jinja2 ==2.11.3 ; extra == 'docs' + - markupsafe ==1.1.1 ; extra == 'docs' + - pygments ==2.8.1 ; extra == 'docs' - alabaster ==0.7.12 ; extra == 'docs' - babel ==2.9.1 ; extra == 'docs' - chardet ==4.0.0 ; extra == 'docs' @@ -1321,7 +1318,7 @@ packages: - flake8 ==5.0.4 ; extra == 'qa' - mypy ==0.971 ; extra == 'qa' - types-setuptools ==67.2.0.1 ; extra == 'qa' - - Django ; extra == 'testing' + - django ; extra == 'testing' - attrs ; extra == 'testing' - colorama ; extra == 'testing' - docopt ; extra == 'testing' @@ -1330,22 +1327,22 @@ packages: - kind: pypi name: jinja2 version: 3.1.3 - url: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa + url: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl sha256: 7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa requires_dist: - - MarkupSafe >=2.0 - - Babel >=2.7 ; extra == 'i18n' + - markupsafe >=2.0 + - babel >=2.7 ; extra == 'i18n' requires_python: '>=3.7' - kind: pypi name: keras version: 2.14.0 - url: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl#sha256=d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd + url: https://files.pythonhosted.org/packages/fe/58/34d4d8f1aa11120c2d36d7ad27d0526164b1a8ae45990a2fede31d0e59bf/keras-2.14.0-py3-none-any.whl sha256: d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd requires_python: '>=3.9' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl#sha256=fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 + url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl sha256: fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 requires_dist: - typing-extensions ; python_version < '3.8' @@ -1353,7 +1350,7 @@ packages: - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e + url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e requires_dist: - typing-extensions ; python_version < '3.8' @@ -1361,16 +1358,16 @@ packages: - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl#sha256=6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 - sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 + url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl#sha256=8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 - sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 + url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' @@ -2495,7 +2492,7 @@ packages: - kind: pypi name: markdown version: 3.5.2 - url: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl#sha256=d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd + url: https://files.pythonhosted.org/packages/42/f4/f0031854de10a0bc7821ef9fca0b92ca0d7aa6fbfbf504c5473ba825e49c/Markdown-3.5.2-py3-none-any.whl sha256: d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd requires_dist: - importlib-metadata >=4.4 ; python_version < '3.10' @@ -2512,25 +2509,31 @@ packages: - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl#sha256=629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f + url: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl sha256: 629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 + url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl#sha256=2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 + url: https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 + requires_python: '>=3.7' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl sha256: 2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 requires_python: '>=3.7' - kind: pypi name: matplotlib version: 3.8.3 - url: https://files.pythonhosted.org/packages/24/db/6ec78a4f10673a641cdb11694c2de2f64aa00e838551248cb11b8b057440/matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl#sha256=d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e + url: https://files.pythonhosted.org/packages/24/db/6ec78a4f10673a641cdb11694c2de2f64aa00e838551248cb11b8b057440/matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl sha256: d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e requires_dist: - contourpy >=1.0.1 @@ -2547,7 +2550,7 @@ packages: - kind: pypi name: matplotlib version: 3.8.3 - url: https://files.pythonhosted.org/packages/ef/1d/bf1d78126c3d106100232d3a18b7f3732e7dc3b71ee38ab735e4064b19cc/matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65 + url: https://files.pythonhosted.org/packages/ef/1d/bf1d78126c3d106100232d3a18b7f3732e7dc3b71ee38ab735e4064b19cc/matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65 requires_dist: - contourpy >=1.0.1 @@ -2564,8 +2567,8 @@ packages: - kind: pypi name: matplotlib version: 3.8.3 - url: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl#sha256=40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407 - sha256: 40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407 + url: https://files.pythonhosted.org/packages/8d/07/7e245ce1d7daec77cb1ca3b8caf094afb04c4c552a904787a1d684a2b606/matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900 requires_dist: - contourpy >=1.0.1 - cycler >=0.10 @@ -2581,8 +2584,8 @@ packages: - kind: pypi name: matplotlib version: 3.8.3 - url: https://files.pythonhosted.org/packages/8d/07/7e245ce1d7daec77cb1ca3b8caf094afb04c4c552a904787a1d684a2b606/matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl#sha256=5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900 - sha256: 5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900 + url: https://files.pythonhosted.org/packages/a1/27/8a807464b0cf47fdf3ba8cbb542d4f3a551da0254d7588667857f8a8a88a/matplotlib-3.8.3-cp311-cp311-win_amd64.whl + sha256: 40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407 requires_dist: - contourpy >=1.0.1 - cycler >=0.10 @@ -2598,7 +2601,7 @@ packages: - kind: pypi name: matplotlib-inline version: 0.1.6 - url: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl#sha256=f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 + url: https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl sha256: f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 requires_dist: - traitlets @@ -2622,7 +2625,7 @@ packages: - kind: pypi name: ml-dtypes version: 0.2.0 - url: https://files.pythonhosted.org/packages/15/da/43bee505963da0c730ee50e951c604bfdb90d4cccc9c0044c946b10e68a7/ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl#sha256=e70047ec2c83eaee01afdfdabee2c5b0c133804d90d0f7db4dd903360fcc537c + url: https://files.pythonhosted.org/packages/15/da/43bee505963da0c730ee50e951c604bfdb90d4cccc9c0044c946b10e68a7/ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl sha256: e70047ec2c83eaee01afdfdabee2c5b0c133804d90d0f7db4dd903360fcc537c requires_dist: - numpy >1.20 @@ -2637,7 +2640,7 @@ packages: - kind: pypi name: ml-dtypes version: 0.2.0 - url: https://files.pythonhosted.org/packages/87/91/d57c2d22e4801edeb7f3e7939214c0ea8a28c6e16f85208c2df2145e0213/ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=e85ba8e24cf48d456e564688e981cf379d4c8e644db0a2f719b78de281bac2ca + url: https://files.pythonhosted.org/packages/87/91/d57c2d22e4801edeb7f3e7939214c0ea8a28c6e16f85208c2df2145e0213/ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: e85ba8e24cf48d456e564688e981cf379d4c8e644db0a2f719b78de281bac2ca requires_dist: - numpy >1.20 @@ -2652,7 +2655,7 @@ packages: - kind: pypi name: ml-dtypes version: 0.2.0 - url: https://files.pythonhosted.org/packages/08/89/c727fde1a3d12586e0b8c01abf53754707d76beaa9987640e70807d4545f/ml_dtypes-0.2.0-cp311-cp311-win_amd64.whl#sha256=832a019a1b6db5c4422032ca9940a990fa104eee420f643713241b3a518977fa + url: https://files.pythonhosted.org/packages/08/89/c727fde1a3d12586e0b8c01abf53754707d76beaa9987640e70807d4545f/ml_dtypes-0.2.0-cp311-cp311-win_amd64.whl sha256: 832a019a1b6db5c4422032ca9940a990fa104eee420f643713241b3a518977fa requires_dist: - numpy >1.20 @@ -2667,7 +2670,7 @@ packages: - kind: pypi name: mypy-extensions version: 1.0.0 - url: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl#sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d + url: https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl sha256: 4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d requires_python: '>=3.5' - kind: conda @@ -2811,7 +2814,7 @@ packages: - kind: pypi name: oauthlib version: 3.2.2 - url: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl#sha256=8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca + url: https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl sha256: 8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca requires_dist: - cryptography >=3.0.0 ; extra == 'rsa' @@ -2890,7 +2893,7 @@ packages: - kind: pypi name: opt-einsum version: 3.3.0 - url: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl#sha256=2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 + url: https://files.pythonhosted.org/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl sha256: 2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 requires_dist: - numpy >=1.7 @@ -2905,14 +2908,14 @@ packages: - kind: pypi name: packaging version: '23.2' - url: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl#sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 + url: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl sha256: 8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 requires_python: '>=3.7' - kind: pypi name: pandas - version: 2.2.0 - url: https://files.pythonhosted.org/packages/6f/4e/63e6b79132e854a67df3d37a5c8560e45c79e2504fa57e032c1d61abb090/pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b - sha256: 8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b + version: 2.2.1 + url: https://files.pythonhosted.org/packages/a5/78/1d859bfb619c067e3353ed079248ae9532c105c4e018fa9a776d04b34572/pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a requires_dist: - numpy <2, >=1.22.4 ; python_version < '3.11' - numpy <2, >=1.23.2 ; python_version == '3.11' @@ -2923,6 +2926,7 @@ packages: - hypothesis >=6.46.1 ; extra == 'test' - pytest >=7.3.2 ; extra == 'test' - pytest-xdist >=2.2.0 ; extra == 'test' + - pyarrow >=10.0.1 ; extra == 'pyarrow' - bottleneck >=1.3.6 ; extra == 'performance' - numba >=0.56.4 ; extra == 'performance' - numexpr >=2.8.4 ; extra == 'performance' @@ -2942,12 +2946,12 @@ packages: - pyarrow >=10.0.1 ; extra == 'feather' - tables >=3.8.0 ; extra == 'hdf5' - pyreadstat >=1.2.0 ; extra == 'spss' - - SQLAlchemy >=2.0.0 ; extra == 'postgresql' + - sqlalchemy >=2.0.0 ; extra == 'postgresql' - psycopg2 >=2.9.6 ; extra == 'postgresql' - adbc-driver-postgresql >=0.8.0 ; extra == 'postgresql' - - SQLAlchemy >=2.0.0 ; extra == 'mysql' + - sqlalchemy >=2.0.0 ; extra == 'mysql' - pymysql >=1.0.2 ; extra == 'mysql' - - SQLAlchemy >=2.0.0 ; extra == 'sql-other' + - sqlalchemy >=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql >=0.8.0 ; extra == 'sql-other' - adbc-driver-sqlite >=0.8.0 ; extra == 'sql-other' - beautifulsoup4 >=4.11.2 ; extra == 'html' @@ -2957,7 +2961,7 @@ packages: - matplotlib >=3.6.3 ; extra == 'plot' - jinja2 >=3.1.2 ; extra == 'output-formatting' - tabulate >=0.9.0 ; extra == 'output-formatting' - - PyQt5 >=5.15.9 ; extra == 'clipboard' + - pyqt5 >=5.15.9 ; extra == 'clipboard' - qtpy >=2.3.0 ; extra == 'clipboard' - zstandard >=0.19.0 ; extra == 'compression' - dataframe-api-compat >=0.1.7 ; extra == 'consortium-standard' @@ -2982,7 +2986,7 @@ packages: - psycopg2 >=2.9.6 ; extra == 'all' - pyarrow >=10.0.1 ; extra == 'all' - pymysql >=1.0.2 ; extra == 'all' - - PyQt5 >=5.15.9 ; extra == 'all' + - pyqt5 >=5.15.9 ; extra == 'all' - pyreadstat >=1.2.0 ; extra == 'all' - pytest >=7.3.2 ; extra == 'all' - pytest-xdist >=2.2.0 ; extra == 'all' @@ -2991,7 +2995,7 @@ packages: - qtpy >=2.3.0 ; extra == 'all' - scipy >=1.10.0 ; extra == 'all' - s3fs >=2022.11.0 ; extra == 'all' - - SQLAlchemy >=2.0.0 ; extra == 'all' + - sqlalchemy >=2.0.0 ; extra == 'all' - tables >=3.8.0 ; extra == 'all' - tabulate >=0.9.0 ; extra == 'all' - xarray >=2022.12.0 ; extra == 'all' @@ -3001,9 +3005,9 @@ packages: requires_python: '>=3.9' - kind: pypi name: pandas - version: 2.2.0 - url: https://files.pythonhosted.org/packages/5b/7e/9fd11ba8e86a8add8f2ff4e11c7111f65ec6fd1b547222160bb969e2bf5e/pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88 - sha256: 85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88 + version: 2.2.1 + url: https://files.pythonhosted.org/packages/d4/47/1ccf9f62d2674d3ca3e95452c5f9dd114234d1535dec77c96528bf6a31fc/pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403 requires_dist: - numpy <2, >=1.22.4 ; python_version < '3.11' - numpy <2, >=1.23.2 ; python_version == '3.11' @@ -3014,6 +3018,7 @@ packages: - hypothesis >=6.46.1 ; extra == 'test' - pytest >=7.3.2 ; extra == 'test' - pytest-xdist >=2.2.0 ; extra == 'test' + - pyarrow >=10.0.1 ; extra == 'pyarrow' - bottleneck >=1.3.6 ; extra == 'performance' - numba >=0.56.4 ; extra == 'performance' - numexpr >=2.8.4 ; extra == 'performance' @@ -3033,12 +3038,12 @@ packages: - pyarrow >=10.0.1 ; extra == 'feather' - tables >=3.8.0 ; extra == 'hdf5' - pyreadstat >=1.2.0 ; extra == 'spss' - - SQLAlchemy >=2.0.0 ; extra == 'postgresql' + - sqlalchemy >=2.0.0 ; extra == 'postgresql' - psycopg2 >=2.9.6 ; extra == 'postgresql' - adbc-driver-postgresql >=0.8.0 ; extra == 'postgresql' - - SQLAlchemy >=2.0.0 ; extra == 'mysql' + - sqlalchemy >=2.0.0 ; extra == 'mysql' - pymysql >=1.0.2 ; extra == 'mysql' - - SQLAlchemy >=2.0.0 ; extra == 'sql-other' + - sqlalchemy >=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql >=0.8.0 ; extra == 'sql-other' - adbc-driver-sqlite >=0.8.0 ; extra == 'sql-other' - beautifulsoup4 >=4.11.2 ; extra == 'html' @@ -3048,7 +3053,7 @@ packages: - matplotlib >=3.6.3 ; extra == 'plot' - jinja2 >=3.1.2 ; extra == 'output-formatting' - tabulate >=0.9.0 ; extra == 'output-formatting' - - PyQt5 >=5.15.9 ; extra == 'clipboard' + - pyqt5 >=5.15.9 ; extra == 'clipboard' - qtpy >=2.3.0 ; extra == 'clipboard' - zstandard >=0.19.0 ; extra == 'compression' - dataframe-api-compat >=0.1.7 ; extra == 'consortium-standard' @@ -3073,7 +3078,7 @@ packages: - psycopg2 >=2.9.6 ; extra == 'all' - pyarrow >=10.0.1 ; extra == 'all' - pymysql >=1.0.2 ; extra == 'all' - - PyQt5 >=5.15.9 ; extra == 'all' + - pyqt5 >=5.15.9 ; extra == 'all' - pyreadstat >=1.2.0 ; extra == 'all' - pytest >=7.3.2 ; extra == 'all' - pytest-xdist >=2.2.0 ; extra == 'all' @@ -3082,7 +3087,7 @@ packages: - qtpy >=2.3.0 ; extra == 'all' - scipy >=1.10.0 ; extra == 'all' - s3fs >=2022.11.0 ; extra == 'all' - - SQLAlchemy >=2.0.0 ; extra == 'all' + - sqlalchemy >=2.0.0 ; extra == 'all' - tables >=3.8.0 ; extra == 'all' - tabulate >=0.9.0 ; extra == 'all' - xarray >=2022.12.0 ; extra == 'all' @@ -3092,9 +3097,9 @@ packages: requires_python: '>=3.9' - kind: pypi name: pandas - version: 2.2.0 - url: https://files.pythonhosted.org/packages/77/62/8e11962934e024a093758992bc82711e3e30efd5ea355cbfdc6e1ab5de76/pandas-2.2.0-cp311-cp311-win_amd64.whl#sha256=fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9 - sha256: fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9 + version: 2.2.1 + url: https://files.pythonhosted.org/packages/f1/8b/617792ad1feef330e87d7459584a1f91aa8aea373d8b168ac5d24fddd808/pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b requires_dist: - numpy <2, >=1.22.4 ; python_version < '3.11' - numpy <2, >=1.23.2 ; python_version == '3.11' @@ -3105,6 +3110,7 @@ packages: - hypothesis >=6.46.1 ; extra == 'test' - pytest >=7.3.2 ; extra == 'test' - pytest-xdist >=2.2.0 ; extra == 'test' + - pyarrow >=10.0.1 ; extra == 'pyarrow' - bottleneck >=1.3.6 ; extra == 'performance' - numba >=0.56.4 ; extra == 'performance' - numexpr >=2.8.4 ; extra == 'performance' @@ -3124,12 +3130,12 @@ packages: - pyarrow >=10.0.1 ; extra == 'feather' - tables >=3.8.0 ; extra == 'hdf5' - pyreadstat >=1.2.0 ; extra == 'spss' - - SQLAlchemy >=2.0.0 ; extra == 'postgresql' + - sqlalchemy >=2.0.0 ; extra == 'postgresql' - psycopg2 >=2.9.6 ; extra == 'postgresql' - adbc-driver-postgresql >=0.8.0 ; extra == 'postgresql' - - SQLAlchemy >=2.0.0 ; extra == 'mysql' + - sqlalchemy >=2.0.0 ; extra == 'mysql' - pymysql >=1.0.2 ; extra == 'mysql' - - SQLAlchemy >=2.0.0 ; extra == 'sql-other' + - sqlalchemy >=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql >=0.8.0 ; extra == 'sql-other' - adbc-driver-sqlite >=0.8.0 ; extra == 'sql-other' - beautifulsoup4 >=4.11.2 ; extra == 'html' @@ -3139,7 +3145,7 @@ packages: - matplotlib >=3.6.3 ; extra == 'plot' - jinja2 >=3.1.2 ; extra == 'output-formatting' - tabulate >=0.9.0 ; extra == 'output-formatting' - - PyQt5 >=5.15.9 ; extra == 'clipboard' + - pyqt5 >=5.15.9 ; extra == 'clipboard' - qtpy >=2.3.0 ; extra == 'clipboard' - zstandard >=0.19.0 ; extra == 'compression' - dataframe-api-compat >=0.1.7 ; extra == 'consortium-standard' @@ -3164,7 +3170,7 @@ packages: - psycopg2 >=2.9.6 ; extra == 'all' - pyarrow >=10.0.1 ; extra == 'all' - pymysql >=1.0.2 ; extra == 'all' - - PyQt5 >=5.15.9 ; extra == 'all' + - pyqt5 >=5.15.9 ; extra == 'all' - pyreadstat >=1.2.0 ; extra == 'all' - pytest >=7.3.2 ; extra == 'all' - pytest-xdist >=2.2.0 ; extra == 'all' @@ -3173,7 +3179,7 @@ packages: - qtpy >=2.3.0 ; extra == 'all' - scipy >=1.10.0 ; extra == 'all' - s3fs >=2022.11.0 ; extra == 'all' - - SQLAlchemy >=2.0.0 ; extra == 'all' + - sqlalchemy >=2.0.0 ; extra == 'all' - tables >=3.8.0 ; extra == 'all' - tabulate >=0.9.0 ; extra == 'all' - xarray >=2022.12.0 ; extra == 'all' @@ -3183,9 +3189,9 @@ packages: requires_python: '>=3.9' - kind: pypi name: pandas - version: 2.2.0 - url: https://files.pythonhosted.org/packages/ac/6b/11c0e4f5dec878a5eca77aa3b24215c49d2eda8d2cfd654a3f03a9f9d33a/pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl#sha256=a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5 - sha256: a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5 + version: 2.2.1 + url: https://files.pythonhosted.org/packages/61/11/1812ef6cbd7433ad240f72161ce5f84c4c450cede4db080365d371d29117/pandas-2.2.1-cp311-cp311-win_amd64.whl + sha256: 06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e requires_dist: - numpy <2, >=1.22.4 ; python_version < '3.11' - numpy <2, >=1.23.2 ; python_version == '3.11' @@ -3196,6 +3202,7 @@ packages: - hypothesis >=6.46.1 ; extra == 'test' - pytest >=7.3.2 ; extra == 'test' - pytest-xdist >=2.2.0 ; extra == 'test' + - pyarrow >=10.0.1 ; extra == 'pyarrow' - bottleneck >=1.3.6 ; extra == 'performance' - numba >=0.56.4 ; extra == 'performance' - numexpr >=2.8.4 ; extra == 'performance' @@ -3215,12 +3222,12 @@ packages: - pyarrow >=10.0.1 ; extra == 'feather' - tables >=3.8.0 ; extra == 'hdf5' - pyreadstat >=1.2.0 ; extra == 'spss' - - SQLAlchemy >=2.0.0 ; extra == 'postgresql' + - sqlalchemy >=2.0.0 ; extra == 'postgresql' - psycopg2 >=2.9.6 ; extra == 'postgresql' - adbc-driver-postgresql >=0.8.0 ; extra == 'postgresql' - - SQLAlchemy >=2.0.0 ; extra == 'mysql' + - sqlalchemy >=2.0.0 ; extra == 'mysql' - pymysql >=1.0.2 ; extra == 'mysql' - - SQLAlchemy >=2.0.0 ; extra == 'sql-other' + - sqlalchemy >=2.0.0 ; extra == 'sql-other' - adbc-driver-postgresql >=0.8.0 ; extra == 'sql-other' - adbc-driver-sqlite >=0.8.0 ; extra == 'sql-other' - beautifulsoup4 >=4.11.2 ; extra == 'html' @@ -3230,7 +3237,7 @@ packages: - matplotlib >=3.6.3 ; extra == 'plot' - jinja2 >=3.1.2 ; extra == 'output-formatting' - tabulate >=0.9.0 ; extra == 'output-formatting' - - PyQt5 >=5.15.9 ; extra == 'clipboard' + - pyqt5 >=5.15.9 ; extra == 'clipboard' - qtpy >=2.3.0 ; extra == 'clipboard' - zstandard >=0.19.0 ; extra == 'compression' - dataframe-api-compat >=0.1.7 ; extra == 'consortium-standard' @@ -3255,7 +3262,7 @@ packages: - psycopg2 >=2.9.6 ; extra == 'all' - pyarrow >=10.0.1 ; extra == 'all' - pymysql >=1.0.2 ; extra == 'all' - - PyQt5 >=5.15.9 ; extra == 'all' + - pyqt5 >=5.15.9 ; extra == 'all' - pyreadstat >=1.2.0 ; extra == 'all' - pytest >=7.3.2 ; extra == 'all' - pytest-xdist >=2.2.0 ; extra == 'all' @@ -3264,7 +3271,7 @@ packages: - qtpy >=2.3.0 ; extra == 'all' - scipy >=1.10.0 ; extra == 'all' - s3fs >=2022.11.0 ; extra == 'all' - - SQLAlchemy >=2.0.0 ; extra == 'all' + - sqlalchemy >=2.0.0 ; extra == 'all' - tables >=3.8.0 ; extra == 'all' - tabulate >=0.9.0 ; extra == 'all' - xarray >=2022.12.0 ; extra == 'all' @@ -3275,7 +3282,7 @@ packages: - kind: pypi name: parso version: 0.8.3 - url: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl#sha256=c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 + url: https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl sha256: c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 requires_dist: - flake8 ==3.8.3 ; extra == 'qa' @@ -3286,20 +3293,20 @@ packages: - kind: pypi name: pathspec version: 0.12.1 - url: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + url: https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl sha256: a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 requires_python: '>=3.8' - kind: pypi name: pexpect version: 4.9.0 - url: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl#sha256=7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 + url: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 requires_dist: - ptyprocess >=0.5 - kind: pypi name: pillow version: 10.2.0 - url: https://files.pythonhosted.org/packages/46/ce/a84284ab66a278825109b03765d7411be3ff18250da44faa9fb5ea9a16a0/pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67 + url: https://files.pythonhosted.org/packages/46/ce/a84284ab66a278825109b03765d7411be3ff18250da44faa9fb5ea9a16a0/pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl sha256: 9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67 requires_dist: - furo ; extra == 'docs' @@ -3327,7 +3334,7 @@ packages: - kind: pypi name: pillow version: 10.2.0 - url: https://files.pythonhosted.org/packages/a5/23/3c59ba2bb48f2ab2f11c3597f50458f63ed46dcc4cedd3308f6e4ec7271f/pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e + url: https://files.pythonhosted.org/packages/a5/23/3c59ba2bb48f2ab2f11c3597f50458f63ed46dcc4cedd3308f6e4ec7271f/pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e requires_dist: - furo ; extra == 'docs' @@ -3355,8 +3362,8 @@ packages: - kind: pypi name: pillow version: 10.2.0 - url: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl#sha256=1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56 - sha256: 1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56 + url: https://files.pythonhosted.org/packages/89/1d/23bafc80495b2a902b27d242e9226ea0b74624f108c60f0533329c051f78/pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -3383,8 +3390,8 @@ packages: - kind: pypi name: pillow version: 10.2.0 - url: https://files.pythonhosted.org/packages/89/1d/23bafc80495b2a902b27d242e9226ea0b74624f108c60f0533329c051f78/pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl#sha256=35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5 - sha256: 35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5 + url: https://files.pythonhosted.org/packages/43/56/f92715a873187b5eff72a4a0d2ac6258e18e9bfb0e136aafde65c49a841a/pillow-10.2.0-cp311-cp311-win_amd64.whl + sha256: 1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -3411,7 +3418,7 @@ packages: - kind: pypi name: platformdirs version: 4.2.0 - url: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl#sha256=0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 + url: https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl sha256: 0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 requires_dist: - furo >=2023.9.10 ; extra == 'docs' @@ -3426,22 +3433,21 @@ packages: requires_python: '>=3.8' - kind: pypi name: plot-antenna - version: '1.7' - url: https://files.pythonhosted.org/packages/52/79/47b50804b18e3aef1bef6d7f317cecb7cf07c28665868a7543c5c1dc335b/plot-antenna-1.7.tar.gz#sha256=ab58a77acab213a1b50a0c40cc848d1c2c470af26a126c2e210135392b638580 - sha256: ab58a77acab213a1b50a0c40cc848d1c2c470af26a126c2e210135392b638580 + version: '1.8' + url: https://files.pythonhosted.org/packages/16/e8/b6a5affd7c071b2006dad64e10d82aa63673830d2189214d91501a56003d/plot-antenna-1.8.tar.gz + sha256: f12c4cb90dea3fa0e41e904e4595959d727d933aa3292fbc89d1f9b15249bf48 requires_dist: - matplotlib - numpy - pandas - plotly - - pysmithplot @ git+https://github.com/schlatterbeck/pySmithPlot.git - pytest ; extra == 'test' - kaleido ; extra == 'test' requires_python: '>=3.7' - kind: pypi name: plotly version: 5.19.0 - url: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl#sha256=906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a + url: https://files.pythonhosted.org/packages/27/ae/c9fb759b36bc55ccc382b647d1afc23c2a860be8e835f96249996d0aa4df/plotly-5.19.0-py3-none-any.whl sha256: 906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a requires_dist: - tenacity >=6.2.0 @@ -3450,7 +3456,7 @@ packages: - kind: pypi name: prompt-toolkit version: 3.0.43 - url: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl#sha256=a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 + url: https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl sha256: a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6 requires_dist: - wcwidth @@ -3458,19 +3464,19 @@ packages: - kind: pypi name: protobuf version: 4.25.3 - url: https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl#sha256=f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c + url: https://files.pythonhosted.org/packages/f3/bf/26deba06a4c910a85f78245cac7698f67cedd7efe00d04f6b3e1b3506a59/protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl sha256: f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c requires_python: '>=3.8' - kind: pypi name: protobuf version: 4.25.3 - url: https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl#sha256=7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d + url: https://files.pythonhosted.org/packages/15/db/7f731524fe0e56c6b2eb57d05b55d3badd80ef7d1f1ed59db191b2fdd8ab/protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl sha256: 7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d requires_python: '>=3.8' - kind: pypi name: protobuf version: 4.25.3 - url: https://files.pythonhosted.org/packages/ad/6e/1bed3b7c904cc178cb8ee8dbaf72934964452b3de95b7a63412591edb93c/protobuf-4.25.3-cp310-abi3-win_amd64.whl#sha256=209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 + url: https://files.pythonhosted.org/packages/ad/6e/1bed3b7c904cc178cb8ee8dbaf72934964452b3de95b7a63412591edb93c/protobuf-4.25.3-cp310-abi3-win_amd64.whl sha256: 209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8 requires_python: '>=3.8' - kind: conda @@ -3490,25 +3496,25 @@ packages: - kind: pypi name: ptyprocess version: 0.7.0 - url: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 + url: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl sha256: 4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 - kind: pypi name: pure-eval version: 0.2.2 - url: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl#sha256=01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 + url: https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl sha256: 01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 requires_dist: - pytest ; extra == 'tests' - kind: pypi name: pyasn1 version: 0.5.1 - url: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl#sha256=4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58 + url: https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl sha256: 4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7' - kind: pypi name: pyasn1-modules version: 0.3.0 - url: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl#sha256=d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d + url: https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl sha256: d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d requires_dist: - pyasn1 <0.6.0, >=0.4.6 @@ -3516,7 +3522,7 @@ packages: - kind: pypi name: pyboy version: 1.6.6 - url: https://files.pythonhosted.org/packages/57/0f/85fbc988095c614ebec2ea471dac5fc777bd9083e235cbcc45cea4275c06/pyboy-1.6.6-cp311-cp311-macosx_10_9_universal2.whl#sha256=14c56a005c8272b4e9e956ab6e6f3c8855a2fab5732d2367dd84c08460367c2c + url: https://files.pythonhosted.org/packages/57/0f/85fbc988095c614ebec2ea471dac5fc777bd9083e235cbcc45cea4275c06/pyboy-1.6.6-cp311-cp311-macosx_10_9_universal2.whl sha256: 14c56a005c8272b4e9e956ab6e6f3c8855a2fab5732d2367dd84c08460367c2c requires_dist: - numpy @@ -3530,7 +3536,7 @@ packages: - kind: pypi name: pyboy version: 1.6.6 - url: https://files.pythonhosted.org/packages/b8/50/7425532d3e3ea4107a095617c16484b88f507fd77f172ce90bab366d32c6/pyboy-1.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl#sha256=4e60e8faf92836c91123529dcbb1daf5d686d16d8bc23009d4d69db722bdeae6 + url: https://files.pythonhosted.org/packages/b8/50/7425532d3e3ea4107a095617c16484b88f507fd77f172ce90bab366d32c6/pyboy-1.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl sha256: 4e60e8faf92836c91123529dcbb1daf5d686d16d8bc23009d4d69db722bdeae6 requires_dist: - numpy @@ -3544,7 +3550,7 @@ packages: - kind: pypi name: pyboy version: 1.6.6 - url: https://files.pythonhosted.org/packages/66/e7/1c223e5e749fe568a0c8e24def8e0004da1fbc48e3f4cabb449ee655deaa/pyboy-1.6.6-cp311-cp311-win_amd64.whl#sha256=bc10363e3b83330c1bb19fc9a16590a6308f94f37df12b0db93ff1c164c1a43c + url: https://files.pythonhosted.org/packages/66/e7/1c223e5e749fe568a0c8e24def8e0004da1fbc48e3f4cabb449ee655deaa/pyboy-1.6.6-cp311-cp311-win_amd64.whl sha256: bc10363e3b83330c1bb19fc9a16590a6308f94f37df12b0db93ff1c164c1a43c requires_dist: - numpy @@ -3558,12 +3564,12 @@ packages: - kind: pypi name: pycosat version: 0.6.6 - url: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz#sha256=a376cfae20b16fcfbef24bf3c047a8a294c35032bb051fa98842c12bbab6f0ff + url: https://files.pythonhosted.org/packages/5b/81/cf8ebf77fc4f06f680ad3ee43d0d01826f6d6054828f1cf3b42d944b82a1/pycosat-0.6.6.tar.gz sha256: a376cfae20b16fcfbef24bf3c047a8a294c35032bb051fa98842c12bbab6f0ff - kind: pypi name: pygments version: 2.17.2 - url: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl#sha256=b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c + url: https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl sha256: b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c requires_dist: - importlib-metadata ; python_version < '3.8' and extra == 'plugins' @@ -3572,12 +3578,12 @@ packages: - kind: pypi name: pyliblzfse version: 0.4.1 - url: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz#sha256=bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d + url: https://files.pythonhosted.org/packages/2c/ba/a4bc465d36f6aafbff89da1bf67bcc6a97475b1d2300a74a778dcb293cef/pyliblzfse-0.4.1.tar.gz sha256: bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d - kind: pypi name: pyparsing version: 3.1.1 - url: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl#sha256=32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb + url: https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl sha256: 32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb requires_dist: - railroad-diagrams ; extra == 'diagrams' @@ -3586,37 +3592,28 @@ packages: - kind: pypi name: pysdl2 version: 0.9.16 - url: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz#sha256=1027406badbecdd30fe56e800a5a76ad7d7271a3aec0b7acf780ee26a00f2d40 + url: https://files.pythonhosted.org/packages/63/ae/f40e4c4738fb39ce140950ed7d9bc21358826416d91a5426a190c612f789/PySDL2-0.9.16.tar.gz sha256: 1027406badbecdd30fe56e800a5a76ad7d7271a3aec0b7acf780ee26a00f2d40 - kind: pypi name: pysdl2-dll version: 2.30.0 - url: https://files.pythonhosted.org/packages/0e/a4/9c9e1786c3ade85d59a54cf0f9f371624e807e91183dc273144e692fc061/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_universal2.whl#sha256=2748f8960bd98c5c53c9c1a94fdefed84a3458094f8014556d5f8026cc8341a4 + url: https://files.pythonhosted.org/packages/0e/a4/9c9e1786c3ade85d59a54cf0f9f371624e807e91183dc273144e692fc061/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_universal2.whl sha256: 2748f8960bd98c5c53c9c1a94fdefed84a3458094f8014556d5f8026cc8341a4 - kind: pypi name: pysdl2-dll version: 2.30.0 - url: https://files.pythonhosted.org/packages/ab/79/fb333705e94ed4e2b41ac099528dabf5f25bc1232568f42df0c31c3621e5/pysdl2_dll-2.30.0-py2.py3-none-manylinux2014_x86_64.whl#sha256=d5ecdbe6152a345091478b44785141f33079fb14d3538b5917ae06cb7166515e + url: https://files.pythonhosted.org/packages/ab/79/fb333705e94ed4e2b41ac099528dabf5f25bc1232568f42df0c31c3621e5/pysdl2_dll-2.30.0-py2.py3-none-manylinux2014_x86_64.whl sha256: d5ecdbe6152a345091478b44785141f33079fb14d3538b5917ae06cb7166515e - kind: pypi name: pysdl2-dll version: 2.30.0 - url: https://files.pythonhosted.org/packages/c5/b4/bab7181a7682f782e1fd2a2a52af913222ce71928068833c1709ce85019d/pysdl2_dll-2.30.0-py2.py3-none-win_amd64.whl#sha256=79a5aff8389a8b03f602b32e22c9051c96ab6cb6fb83ce29ddcb0ea3a08cb321 - sha256: 79a5aff8389a8b03f602b32e22c9051c96ab6cb6fb83ce29ddcb0ea3a08cb321 + url: https://files.pythonhosted.org/packages/93/d0/5911ad3cecb896588202e3e90bd97c0c7381718a6ccb2eaeebb70d7fe2ce/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_x86_64.whl + sha256: e873d823c206b92680575a62466e02717ce81ece7e433c818fb660154eda083f - kind: pypi name: pysdl2-dll version: 2.30.0 - url: https://files.pythonhosted.org/packages/93/d0/5911ad3cecb896588202e3e90bd97c0c7381718a6ccb2eaeebb70d7fe2ce/pysdl2_dll-2.30.0-py2.py3-none-macosx_10_11_x86_64.whl#sha256=e873d823c206b92680575a62466e02717ce81ece7e433c818fb660154eda083f - sha256: e873d823c206b92680575a62466e02717ce81ece7e433c818fb660154eda083f -- kind: pypi - name: pysmithplot - version: 0.2.0 - url: git+https://github.com/schlatterbeck/pySmithPlot.git - sha256: 0da5fe6b19902c9f296544e2bfaab9d1e0d142d3bf576771d53d10f54830c12b - requires_dist: - - matplotlib >=1.2.0 - - numpy - - scipy + url: https://files.pythonhosted.org/packages/c5/b4/bab7181a7682f782e1fd2a2a52af913222ce71928068833c1709ce85019d/pysdl2_dll-2.30.0-py2.py3-none-win_amd64.whl + sha256: 79a5aff8389a8b03f602b32e22c9051c96ab6cb6fb83ce29ddcb0ea3a08cb321 - kind: conda name: python version: 3.11.8 @@ -3723,14 +3720,6 @@ packages: license: Python-2.0 size: 14623079 timestamp: 1708116925163 -- kind: pypi - name: python-dateutil - version: 2.8.2 - url: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl#sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - sha256: 961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - requires_dist: - - six >=1.5 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,>=2.7' - kind: conda name: python_abi version: '3.11' @@ -3791,10 +3780,18 @@ packages: license_family: BSD size: 6755 timestamp: 1695147711935 +- kind: pypi + name: python-dateutil + version: 2.8.2 + url: https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl + sha256: 961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + requires_dist: + - six >=1.5 + requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,>=2.7' - kind: pypi name: pytz version: '2024.1' - url: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl#sha256=328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 + url: https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl sha256: 328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 - kind: conda name: readline @@ -3845,20 +3842,20 @@ packages: - kind: pypi name: requests version: 2.31.0 - url: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl#sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f + url: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl sha256: 58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f requires_dist: - charset-normalizer <4, >=2 - idna <4, >=2.5 - urllib3 <3, >=1.21.1 - certifi >=2017.4.17 - - PySocks !=1.5.7, >=1.5.6 ; extra == 'socks' + - pysocks !=1.5.7, >=1.5.6 ; extra == 'socks' - chardet <6, >=3.0.2 ; extra == 'use_chardet_on_py3' requires_python: '>=3.7' - kind: pypi name: requests-oauthlib version: 1.3.1 - url: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl#sha256=2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 + url: https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl sha256: 2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 requires_dist: - oauthlib >=3.0.0 @@ -3868,7 +3865,7 @@ packages: - kind: pypi name: rsa version: '4.9' - url: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl#sha256=90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 + url: https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl sha256: 90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 requires_dist: - pyasn1 >=0.1.3 @@ -3981,17 +3978,17 @@ packages: timestamp: 1700814198750 - kind: pypi name: setuptools - version: 69.1.0 - url: https://files.pythonhosted.org/packages/bb/0a/203797141ec9727344c7649f6d5f6cf71b89a6c28f8f55d4f18de7a1d352/setuptools-69.1.0-py3-none-any.whl#sha256=c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6 - sha256: c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6 + version: 69.1.1 + url: https://files.pythonhosted.org/packages/c0/7a/3da654f49c95d0cc6e9549a855b5818e66a917e852ec608e77550c8dc08b/setuptools-69.1.1-py3-none-any.whl + sha256: 02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56 requires_dist: - sphinx >=3.5 ; extra == 'docs' - sphinx <7.2.5 ; extra == 'docs' - - jaraco.packaging >=9.3 ; extra == 'docs' - - rst.linker >=1.9 ; extra == 'docs' + - jaraco-packaging >=9.3 ; extra == 'docs' + - rst-linker >=1.9 ; extra == 'docs' - furo ; extra == 'docs' - sphinx-lint ; extra == 'docs' - - jaraco.tidelift >=1.4 ; extra == 'docs' + - jaraco-tidelift >=1.4 ; extra == 'docs' - pygments-github-lexers ==0.0.5 ; extra == 'docs' - sphinx-favicon ; extra == 'docs' - sphinx-inline-tabs ; extra == 'docs' @@ -4005,9 +4002,10 @@ packages: - virtualenv >=13.0.0 ; extra == 'testing' - wheel ; extra == 'testing' - pip >=19.1 ; extra == 'testing' - - jaraco.envs >=2.2 ; extra == 'testing' + - packaging >=23.2 ; extra == 'testing' + - jaraco-envs >=2.2 ; extra == 'testing' - pytest-xdist ; extra == 'testing' - - jaraco.path >=3.2.0 ; extra == 'testing' + - jaraco-path >=3.2.0 ; extra == 'testing' - build[virtualenv] ; extra == 'testing' - filelock >=3.4.0 ; extra == 'testing' - ini2toml[lite] >=0.9 ; extra == 'testing' @@ -4020,27 +4018,27 @@ packages: - virtualenv >=13.0.0 ; extra == 'testing-integration' - tomli ; extra == 'testing-integration' - wheel ; extra == 'testing-integration' - - jaraco.path >=3.2.0 ; extra == 'testing-integration' - - jaraco.envs >=2.2 ; extra == 'testing-integration' + - jaraco-path >=3.2.0 ; extra == 'testing-integration' + - jaraco-envs >=2.2 ; extra == 'testing-integration' - build[virtualenv] >=1.0.3 ; extra == 'testing-integration' - filelock >=3.4.0 ; extra == 'testing-integration' - - packaging >=23.1 ; extra == 'testing-integration' + - packaging >=23.2 ; extra == 'testing-integration' - pytest-cov ; platform_python_implementation != 'PyPy' and extra == 'testing' - pytest-mypy >=0.9.1 ; platform_python_implementation != 'PyPy' and extra == 'testing' - - jaraco.develop >=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'testing' + - jaraco-develop >=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'testing' - pytest-ruff >=0.2.1 ; sys_platform != 'cygwin' and extra == 'testing' - pytest-perf ; sys_platform != 'cygwin' and extra == 'testing' requires_python: '>=3.8' - kind: pypi name: six version: 1.16.0 - url: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl#sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + url: https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl sha256: 8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: stack-data version: 0.6.3 - url: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl#sha256=d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + url: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl sha256: d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 requires_dist: - executing >=1.2.0 @@ -4072,7 +4070,7 @@ packages: - kind: pypi name: tenacity version: 8.2.3 - url: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl#sha256=ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c + url: https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl sha256: ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c requires_dist: - reno ; extra == 'doc' @@ -4082,7 +4080,7 @@ packages: - kind: pypi name: tensorboard version: 2.14.1 - url: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl#sha256=3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58 + url: https://files.pythonhosted.org/packages/73/a2/66ed644f6ed1562e0285fcd959af17670ea313c8f331c46f79ee77187eb9/tensorboard-2.14.1-py3-none-any.whl sha256: 3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58 requires_dist: - absl-py >=0.4 @@ -4101,13 +4099,19 @@ packages: - kind: pypi name: tensorboard-data-server version: 0.7.2 - url: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl#sha256=7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb + url: https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl sha256: 7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb requires_python: '>=3.7' +- kind: pypi + name: tensorboard-data-server + version: 0.7.2 + url: https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl + sha256: 9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60 + requires_python: '>=3.7' - kind: pypi name: tensorflow version: 2.14.0 - url: https://files.pythonhosted.org/packages/de/ea/90267db2c02fb61f4d03b9645c7446d3cbca6d5c08522e889535c88edfcd/tensorflow-2.14.0-cp311-cp311-macosx_12_0_arm64.whl#sha256=c92f5526c2029d31a036be06eb229c71f1c1821472876d34d0184d19908e318c + url: https://files.pythonhosted.org/packages/de/ea/90267db2c02fb61f4d03b9645c7446d3cbca6d5c08522e889535c88edfcd/tensorflow-2.14.0-cp311-cp311-macosx_12_0_arm64.whl sha256: c92f5526c2029d31a036be06eb229c71f1c1821472876d34d0184d19908e318c requires_dist: - tensorflow-macos ==2.14.0 ; platform_system == 'Darwin' and platform_machine == 'arm64' @@ -4128,7 +4132,7 @@ packages: - kind: pypi name: tensorflow version: 2.14.0 - url: https://files.pythonhosted.org/packages/09/63/25e76075081ea98ec48f23929cefee58be0b42212e38074a9ec5c19e838c/tensorflow-2.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a80cabe6ab5f44280c05533e5b4a08e5b128f0d68d112564cffa3b96638e28aa + url: https://files.pythonhosted.org/packages/09/63/25e76075081ea98ec48f23929cefee58be0b42212e38074a9ec5c19e838c/tensorflow-2.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: a80cabe6ab5f44280c05533e5b4a08e5b128f0d68d112564cffa3b96638e28aa requires_dist: - absl-py >=1.0.0 @@ -4170,28 +4174,7 @@ packages: - kind: pypi name: tensorflow version: 2.14.0 - url: https://files.pythonhosted.org/packages/80/6f/57d36f6507e432d7fc1956b2e9e8530c5c2d2bfcd8821bcbfae271cd6688/tensorflow-2.14.0-cp311-cp311-win_amd64.whl#sha256=0587ece626c4f7c4fcb2132525ea6c77ad2f2f5659a9b0f4451b1000be1b5e16 - sha256: 0587ece626c4f7c4fcb2132525ea6c77ad2f2f5659a9b0f4451b1000be1b5e16 - requires_dist: - - tensorflow-macos ==2.14.0 ; platform_system == 'Darwin' and platform_machine == 'arm64' - - tensorflow-cpu-aws ==2.14.0 ; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64') - - tensorflow-intel ==2.14.0 ; platform_system == 'Windows' - - nvidia-cublas-cu11 ==11.11.3.6 ; extra == 'and-cuda' - - nvidia-cuda-cupti-cu11 ==11.8.87 ; extra == 'and-cuda' - - nvidia-cuda-nvcc-cu11 ==11.8.89 ; extra == 'and-cuda' - - nvidia-cuda-runtime-cu11 ==11.8.89 ; extra == 'and-cuda' - - nvidia-cudnn-cu11 ==8.7.0.84 ; extra == 'and-cuda' - - nvidia-cufft-cu11 ==10.9.0.58 ; extra == 'and-cuda' - - nvidia-curand-cu11 ==10.3.0.86 ; extra == 'and-cuda' - - nvidia-cusolver-cu11 ==11.4.1.48 ; extra == 'and-cuda' - - nvidia-cusparse-cu11 ==11.7.5.86 ; extra == 'and-cuda' - - nvidia-nccl-cu11 ==2.16.5 ; extra == 'and-cuda' - - tensorrt ==8.5.3.1 ; extra == 'and-cuda' - requires_python: '>=3.9' -- kind: pypi - name: tensorflow - version: 2.14.0 - url: https://files.pythonhosted.org/packages/22/50/1e211cbb5e1f52e55eeae1605789c9d24403962d37581cf0deb3e6b33377/tensorflow-2.14.0-cp311-cp311-macosx_10_15_x86_64.whl#sha256=00c42e7d8280c660b10cf5d0b3164fdc5e38fd0bf16b3f9963b7cd0e546346d8 + url: https://files.pythonhosted.org/packages/22/50/1e211cbb5e1f52e55eeae1605789c9d24403962d37581cf0deb3e6b33377/tensorflow-2.14.0-cp311-cp311-macosx_10_15_x86_64.whl sha256: 00c42e7d8280c660b10cf5d0b3164fdc5e38fd0bf16b3f9963b7cd0e546346d8 requires_dist: - absl-py >=1.0.0 @@ -4228,16 +4211,37 @@ packages: - nvidia-cuda-nvcc-cu11 ==11.8.89 ; extra == 'and-cuda' - tensorrt ==8.5.3.1 ; extra == 'and-cuda' requires_python: '>=3.9' +- kind: pypi + name: tensorflow + version: 2.14.0 + url: https://files.pythonhosted.org/packages/80/6f/57d36f6507e432d7fc1956b2e9e8530c5c2d2bfcd8821bcbfae271cd6688/tensorflow-2.14.0-cp311-cp311-win_amd64.whl + sha256: 0587ece626c4f7c4fcb2132525ea6c77ad2f2f5659a9b0f4451b1000be1b5e16 + requires_dist: + - tensorflow-macos ==2.14.0 ; platform_system == 'Darwin' and platform_machine == 'arm64' + - tensorflow-cpu-aws ==2.14.0 ; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64') + - tensorflow-intel ==2.14.0 ; platform_system == 'Windows' + - nvidia-cublas-cu11 ==11.11.3.6 ; extra == 'and-cuda' + - nvidia-cuda-cupti-cu11 ==11.8.87 ; extra == 'and-cuda' + - nvidia-cuda-nvcc-cu11 ==11.8.89 ; extra == 'and-cuda' + - nvidia-cuda-runtime-cu11 ==11.8.89 ; extra == 'and-cuda' + - nvidia-cudnn-cu11 ==8.7.0.84 ; extra == 'and-cuda' + - nvidia-cufft-cu11 ==10.9.0.58 ; extra == 'and-cuda' + - nvidia-curand-cu11 ==10.3.0.86 ; extra == 'and-cuda' + - nvidia-cusolver-cu11 ==11.4.1.48 ; extra == 'and-cuda' + - nvidia-cusparse-cu11 ==11.7.5.86 ; extra == 'and-cuda' + - nvidia-nccl-cu11 ==2.16.5 ; extra == 'and-cuda' + - tensorrt ==8.5.3.1 ; extra == 'and-cuda' + requires_python: '>=3.9' - kind: pypi name: tensorflow-estimator version: 2.14.0 - url: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl#sha256=820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57 + url: https://files.pythonhosted.org/packages/d1/da/4f264c196325bb6e37a6285caec5b12a03def489b57cc1fdac02bb6272cd/tensorflow_estimator-2.14.0-py2.py3-none-any.whl sha256: 820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57 requires_python: '>=3.7' - kind: pypi name: tensorflow-intel version: 2.14.0 - url: https://files.pythonhosted.org/packages/ad/6e/1bfe367855dd87467564f7bf9fa14f3b17889988e79598bc37bf18f5ffb6/tensorflow_intel-2.14.0-cp311-cp311-win_amd64.whl#sha256=51f96c729d61ff8e2e340df5b3b4db81a938258f1c9282ab09277896d0c408ae + url: https://files.pythonhosted.org/packages/ad/6e/1bfe367855dd87467564f7bf9fa14f3b17889988e79598bc37bf18f5ffb6/tensorflow_intel-2.14.0-cp311-cp311-win_amd64.whl sha256: 51f96c729d61ff8e2e340df5b3b4db81a938258f1c9282ab09277896d0c408ae requires_dist: - absl-py >=1.0.0 @@ -4277,7 +4281,7 @@ packages: - kind: pypi name: tensorflow-io-gcs-filesystem version: 0.31.0 - url: https://files.pythonhosted.org/packages/ac/4e/9566a313927be582ca99455a9523a097c7888fc819695bdc08415432b202/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-win_amd64.whl#sha256=4bb37d23f21c434687b11059cb7ffd094d52a7813368915ba1b7057e3c16e414 + url: https://files.pythonhosted.org/packages/ac/4e/9566a313927be582ca99455a9523a097c7888fc819695bdc08415432b202/tensorflow_io_gcs_filesystem-0.31.0-cp311-cp311-win_amd64.whl sha256: 4bb37d23f21c434687b11059cb7ffd094d52a7813368915ba1b7057e3c16e414 requires_dist: - tensorflow <2.12.0, >=2.11.0 ; extra == 'tensorflow' @@ -4289,7 +4293,7 @@ packages: - kind: pypi name: tensorflow-io-gcs-filesystem version: 0.36.0 - url: https://files.pythonhosted.org/packages/3e/56/1b7ef816e448464a93da70296db237129910b4452d6b4582d5e23fb07880/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_12_0_arm64.whl#sha256=848e8e89a0f49258c7782189c938d8d1162d989da1a80c79f95c7af3ef6006c8 + url: https://files.pythonhosted.org/packages/3e/56/1b7ef816e448464a93da70296db237129910b4452d6b4582d5e23fb07880/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_12_0_arm64.whl sha256: 848e8e89a0f49258c7782189c938d8d1162d989da1a80c79f95c7af3ef6006c8 requires_dist: - tensorflow <2.16.0, >=2.15.0 ; extra == 'tensorflow' @@ -4301,7 +4305,7 @@ packages: - kind: pypi name: tensorflow-io-gcs-filesystem version: 0.36.0 - url: https://files.pythonhosted.org/packages/44/66/10773d9ea847ba0ae5c36478333d92c6dae3396205bf18091910f63f3ee9/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1bd4d946b5fa23220daa473a80e511a5fb27493d7e49d17dff0bb43bb0a31f32 + url: https://files.pythonhosted.org/packages/44/66/10773d9ea847ba0ae5c36478333d92c6dae3396205bf18091910f63f3ee9/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 1bd4d946b5fa23220daa473a80e511a5fb27493d7e49d17dff0bb43bb0a31f32 requires_dist: - tensorflow <2.16.0, >=2.15.0 ; extra == 'tensorflow' @@ -4313,7 +4317,7 @@ packages: - kind: pypi name: tensorflow-io-gcs-filesystem version: 0.36.0 - url: https://files.pythonhosted.org/packages/ad/e3/1009781ce3c0d92634fa2fb3dc4bb0237fe7aaf70f2ab53160f3e82e7d63/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_10_14_x86_64.whl#sha256=72c3ca4b8c0d8dbdd970699d05a100107cf200317ad8e6a8373e2c37225cd552 + url: https://files.pythonhosted.org/packages/ad/e3/1009781ce3c0d92634fa2fb3dc4bb0237fe7aaf70f2ab53160f3e82e7d63/tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_10_14_x86_64.whl sha256: 72c3ca4b8c0d8dbdd970699d05a100107cf200317ad8e6a8373e2c37225cd552 requires_dist: - tensorflow <2.16.0, >=2.15.0 ; extra == 'tensorflow' @@ -4325,7 +4329,7 @@ packages: - kind: pypi name: tensorflow-macos version: 2.14.0 - url: https://files.pythonhosted.org/packages/d3/4b/ae9037ea22ba94eb2cf267e991384c3444f3e6142fa49923352b4ab73e14/tensorflow_macos-2.14.0-cp311-cp311-macosx_12_0_arm64.whl#sha256=064e98b67d7a89e72c37c90254c0a322a0b8d0ce9b68f23286816210e3ef6685 + url: https://files.pythonhosted.org/packages/d3/4b/ae9037ea22ba94eb2cf267e991384c3444f3e6142fa49923352b4ab73e14/tensorflow_macos-2.14.0-cp311-cp311-macosx_12_0_arm64.whl sha256: 064e98b67d7a89e72c37c90254c0a322a0b8d0ce9b68f23286816210e3ef6685 requires_dist: - absl-py >=1.0.0 @@ -4365,7 +4369,7 @@ packages: - kind: pypi name: termcolor version: 2.4.0 - url: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl#sha256=9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63 + url: https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl sha256: 9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63 requires_dist: - pytest ; extra == 'tests' @@ -4437,13 +4441,13 @@ packages: - kind: pypi name: tokenize-rt version: 5.2.0 - url: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl#sha256=b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 + url: https://files.pythonhosted.org/packages/8d/35/78f03aa48cfebd13646707f64477bc7eacf1081edcdcd1b4d57cb1b5d0a8/tokenize_rt-5.2.0-py2.py3-none-any.whl sha256: b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 requires_python: '>=3.8' - kind: pypi name: traitlets version: 5.14.1 - url: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl#sha256=2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74 + url: https://files.pythonhosted.org/packages/45/34/5dc77fdc7bb4bd198317eea5679edf9cc0a186438b5b19dbb9062fb0f4d5/traitlets-5.14.1-py3-none-any.whl sha256: 2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74 requires_dist: - myst-parser ; extra == 'docs' @@ -4458,9 +4462,9 @@ packages: requires_python: '>=3.8' - kind: pypi name: typing-extensions - version: 4.9.0 - url: https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl#sha256=af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd - sha256: af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd + version: 4.10.0 + url: https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl + sha256: 69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 requires_python: '>=3.8' - kind: conda name: tzdata @@ -4491,7 +4495,7 @@ packages: - kind: pypi name: urllib3 version: 2.2.1 - url: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl#sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d + url: https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl sha256: 450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d requires_dist: - brotli >=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' @@ -4552,23 +4556,23 @@ packages: - kind: pypi name: wcwidth version: 0.2.13 - url: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl#sha256=3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 + url: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl sha256: 3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 requires_dist: - - backports.functools-lru-cache >=1.2.1 ; python_version < '3.2' + - backports-functools-lru-cache >=1.2.1 ; python_version < '3.2' - kind: pypi name: werkzeug version: 3.0.1 - url: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 + url: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl sha256: 90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 requires_dist: - - MarkupSafe >=2.1.1 + - markupsafe >=2.1.1 - watchdog >=2.3 ; extra == 'watchdog' requires_python: '>=3.8' - kind: pypi name: wheel version: 0.42.0 - url: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl#sha256=177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d + url: https://files.pythonhosted.org/packages/c7/c3/55076fc728723ef927521abaa1955213d094933dc36d4a2008d5101e1af5/wheel-0.42.0-py3-none-any.whl sha256: 177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d requires_dist: - pytest >=6.0.0 ; extra == 'test' @@ -4577,26 +4581,26 @@ packages: - kind: pypi name: wrapt version: 1.14.1 - url: https://files.pythonhosted.org/packages/6e/79/aec8185eefe20e8f49e5adeb0c2e20e016d5916d10872c17705ddac41be2/wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl#sha256=2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9 + url: https://files.pythonhosted.org/packages/6e/79/aec8185eefe20e8f49e5adeb0c2e20e016d5916d10872c17705ddac41be2/wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl sha256: 2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7' - kind: pypi name: wrapt version: 1.14.1 - url: https://files.pythonhosted.org/packages/7f/1b/e0439eec0db6520968c751bc7e12480bb80bb8d939190e0e55ed762f3c7a/wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8 + url: https://files.pythonhosted.org/packages/7f/1b/e0439eec0db6520968c751bc7e12480bb80bb8d939190e0e55ed762f3c7a/wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7' - kind: pypi name: wrapt version: 1.14.1 - url: https://files.pythonhosted.org/packages/ba/7e/14113996bc6ee68eb987773b4139c87afd3ceff60e27e37648aa5eb2798a/wrapt-1.14.1-cp311-cp311-win_amd64.whl#sha256=26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224 - sha256: 26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224 + url: https://files.pythonhosted.org/packages/e7/f9/8c078b4973604cd968b23eb3dff52028b5c48f2a02c4f1f975f4d5e344d1/wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7' - kind: pypi name: wrapt version: 1.14.1 - url: https://files.pythonhosted.org/packages/e7/f9/8c078b4973604cd968b23eb3dff52028b5c48f2a02c4f1f975f4d5e344d1/wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl#sha256=ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55 - sha256: ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55 + url: https://files.pythonhosted.org/packages/ba/7e/14113996bc6ee68eb987773b4139c87afd3ceff60e27e37648aa5eb2798a/wrapt-1.14.1-cp311-cp311-win_amd64.whl + sha256: 26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224 requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7' - kind: conda name: xz diff --git a/examples/pypi/pixi.toml b/examples/pypi/pixi.toml index 4011ed307..b2aa842c8 100644 --- a/examples/pypi/pixi.toml +++ b/examples/pypi/pixi.toml @@ -19,7 +19,7 @@ test = "python pycosat_example.py" [dependencies] python = "~=3.11.0" -numpy = "*" +numpy = "1.26.*" libclang = "~=16.0.6" scipy = "~=1.11.4" @@ -27,12 +27,13 @@ scipy = "~=1.11.4" pyboy = "==1.6.6" tensorflow = "==2.14.0" flask = "*" -black = {version = "~=23.10", extras = ["jupyter"]} +black = { version = "~=23.10", extras = ["jupyter"] } # sdists: pyliblzfse = "*" pycosat = "*" -plot-antenna = "==1.7" +# TODO(tim): fix env-passing in uv env_test_package = "==0.0.3" +plot-antenna = "==1.8" [system-requirements] # Tensorflow on macOS arm64 requires macOS 12.0 or higher diff --git a/src/cli/add.rs b/src/cli/add.rs index f3de26df6..c1dedc21a 100644 --- a/src/cli/add.rs +++ b/src/cli/add.rs @@ -8,6 +8,7 @@ use clap::Parser; use itertools::{Either, Itertools}; use crate::project::grouped_environment::GroupedEnvironment; +use crate::project::manifest::python::PyPiPackageName; use indexmap::IndexMap; use miette::{IntoDiagnostic, WrapErr}; use rattler_conda_types::{ @@ -168,11 +169,11 @@ pub async fn execute(args: Args) -> miette::Result<()> { let specs = pep508_requirements .into_iter() .map(|req| { - let name = rip::types::PackageName::from_str(req.name.as_str())?; + let name = PyPiPackageName::from_normalized(req.name.clone()); let requirement = PyPiRequirement::from(req); Ok((name, requirement)) }) - .collect::, rip::types::ParsePackageNameError>>() + .collect::, uv_normalize::InvalidNameError>>() .into_diagnostic()?; add_pypi_specs_to_project( @@ -218,7 +219,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { pub async fn add_pypi_specs_to_project( project: &mut Project, - specs: Vec<(rip::types::PackageName, PyPiRequirement)>, + specs: Vec<(PyPiPackageName, PyPiRequirement)>, specs_platforms: &Vec, no_update_lockfile: bool, no_install: bool, diff --git a/src/cli/info.rs b/src/cli/info.rs index 47db9010c..1254c0b08 100644 --- a/src/cli/info.rs +++ b/src/cli/info.rs @@ -315,7 +315,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { pypi_dependencies: env .pypi_dependencies(Some(Platform::current())) .into_iter() - .map(|(name, _p)| name.as_str().to_string()) + .map(|(name, _p)| name.as_source().to_string()) .collect(), platforms: env.platforms().into_iter().collect(), channels: env diff --git a/src/cli/init.rs b/src/cli/init.rs index 66e4de722..ca5ace745 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -1,4 +1,5 @@ use crate::environment::{get_up_to_date_prefix, LockFileUsage}; +use crate::project::manifest::python::PyPiPackageName; use crate::project::manifest::PyPiRequirement; use crate::utils::conda_environment_file::{CondaEnvDep, CondaEnvFile}; use crate::{config::get_default_author, consts}; @@ -10,7 +11,6 @@ use miette::IntoDiagnostic; use minijinja::{context, Environment}; use rattler_conda_types::{Channel, ChannelConfig, MatchSpec, Platform}; use regex::Regex; -use rip::types::PackageName; use std::io::{Error, ErrorKind, Write}; use std::path::Path; use std::str::FromStr; @@ -272,7 +272,7 @@ fn get_dir(path: PathBuf) -> Result { } } -type PipReq = (PackageName, PyPiRequirement); +type PipReq = (PyPiPackageName, PyPiRequirement); type ParsedDependencies = (Vec, Vec, Vec>); fn conda_env_to_manifest( @@ -324,7 +324,7 @@ fn parse_dependencies(deps: Vec) -> miette::Result miette::Result<()> { ); // Setup the tracing subscriber - tracing_subscriber::fmt() + let fmt_layer = tracing_subscriber::fmt::layer() .with_ansi(use_colors) - .with_env_filter(env_filter) .with_writer(IndicatifWriter::new(progress::global_multi_progress())) - .without_time() - .finish() - .try_init() - .into_diagnostic()?; + .without_time(); + + cfg_if::cfg_if! { + if #[cfg(feature = "console-subscriber")] + { + let console_layer = console_subscriber::spawn(); + tracing_subscriber::registry() + .with(console_layer) + .with(env_filter) + .with(fmt_layer) + .init(); + } else { + tracing_subscriber::registry() + .with(env_filter) + .with(fmt_layer) + .init(); + } + } // Execute the command execute_command(args.command).await diff --git a/src/cli/remove.rs b/src/cli/remove.rs index 34a30fd4f..3ac84ce4c 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -7,6 +7,7 @@ use miette::miette; use rattler_conda_types::Platform; use crate::environment::{get_up_to_date_prefix, LockFileUsage}; +use crate::project::manifest::python::PyPiPackageName; use crate::project::manifest::FeatureName; use crate::{consts, project::SpecType, Project}; @@ -88,14 +89,14 @@ pub async fn execute(args: Args) -> miette::Result<()> { } let mut sucessful_output: Vec = Vec::with_capacity(deps.len()); if args.pypi { - let all_pkg_name = convert_pkg_name::(&deps)?; + let all_pkg_name = convert_pkg_name::(&deps)?; for dep in all_pkg_name.iter() { let (name, req) = project .manifest .remove_pypi_dependency(dep, args.platform, &feature_name)?; sucessful_output.push(format_ok_message( - name.as_str(), + name.as_source(), &req.to_string(), &table_name, )); diff --git a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.cockpit.yml.snap b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.cockpit.yml.snap index 62a22729f..4be35401d 100644 --- a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.cockpit.yml.snap +++ b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.cockpit.yml.snap @@ -1,6 +1,6 @@ --- source: src/cli/init.rs -expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_channels(env_info.channels), env_info.name)" +expression: "(parse_dependencies(env_info.dependencies().clone()).unwrap(),\n parse_channels(env_info.channels().clone()), env_info.name())" --- ( ( @@ -848,9 +848,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha ], [ ( - PackageName { + PyPiPackageName { source: "memory-profiler", - normalized: "memory-profiler", + normalized: PackageName( + "memory-profiler", + ), }, PyPiRequirement { version: None, @@ -859,9 +861,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "pre-commit", - normalized: "pre-commit", + normalized: PackageName( + "pre-commit", + ), }, PyPiRequirement { version: None, @@ -870,9 +874,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "graphviz", - normalized: "graphviz", + normalized: PackageName( + "graphviz", + ), }, PyPiRequirement { version: None, @@ -881,9 +887,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "sphinx-notfound-page", - normalized: "sphinx-notfound-page", + normalized: PackageName( + "sphinx-notfound-page", + ), }, PyPiRequirement { version: None, @@ -892,9 +900,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { - source: "DeepOBS", - normalized: "deepobs", + PyPiPackageName { + source: "deepobs", + normalized: PackageName( + "deepobs", + ), }, PyPiRequirement { version: None, diff --git a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.crnnft.yml.snap b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.crnnft.yml.snap index 6df4fa076..fbb313b6a 100644 --- a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.crnnft.yml.snap +++ b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.crnnft.yml.snap @@ -1,6 +1,6 @@ --- source: src/cli/init.rs -expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_channels(env_info.channels), env_info.name)" +expression: "(parse_dependencies(env_info.dependencies().clone()).unwrap(),\n parse_channels(env_info.channels().clone()), env_info.name())" --- ( ( @@ -133,9 +133,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha ], [ ( - PackageName { - source: "tensorflow_gpu", - normalized: "tensorflow-gpu", + PyPiPackageName { + source: "tensorflow-gpu", + normalized: PackageName( + "tensorflow-gpu", + ), }, PyPiRequirement { version: Some( @@ -143,18 +145,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: Equal, - version: Version { - epoch: 0, - release: [ - 1, - 15, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "1.15.0", }, ], ), @@ -164,9 +155,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "numpy", - normalized: "numpy", + normalized: PackageName( + "numpy", + ), }, PyPiRequirement { version: None, @@ -175,9 +168,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { - source: "opencv_python", - normalized: "opencv-python", + PyPiPackageName { + source: "opencv-python", + normalized: PackageName( + "opencv-python", + ), }, PyPiRequirement { version: None, @@ -186,9 +181,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "matplotlib", - normalized: "matplotlib", + normalized: PackageName( + "matplotlib", + ), }, PyPiRequirement { version: None, @@ -197,9 +194,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "easydict", - normalized: "easydict", + normalized: PackageName( + "easydict", + ), }, PyPiRequirement { version: None, diff --git a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.let-plot.yml.snap b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.let-plot.yml.snap index 548a1c656..a60d858b6 100644 --- a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.let-plot.yml.snap +++ b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.let-plot.yml.snap @@ -1,6 +1,6 @@ --- source: src/cli/init.rs -expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_channels(env_info.channels), env_info.name)" +expression: "(parse_dependencies(env_info.dependencies().clone()).unwrap(),\n parse_channels(env_info.channels().clone()), env_info.name())" --- ( ( @@ -221,9 +221,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha ], [ ( - PackageName { + PyPiPackageName { source: "pypng", - normalized: "pypng", + normalized: PackageName( + "pypng", + ), }, PyPiRequirement { version: None, @@ -232,9 +234,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "palettable", - normalized: "palettable", + normalized: PackageName( + "palettable", + ), }, PyPiRequirement { version: None, diff --git a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.test_env.yml.snap b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.test_env.yml.snap index 3acbfb536..1a5b5f9c7 100644 --- a/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.test_env.yml.snap +++ b/src/cli/snapshots/pixi__cli__init__tests__test_import_from_env_yaml.test_env.yml.snap @@ -1,6 +1,6 @@ --- source: src/cli/init.rs -expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_channels(env_info.channels), env_info.name)" +expression: "(parse_dependencies(env_info.dependencies().clone()).unwrap(),\n parse_channels(env_info.channels().clone()), env_info.name())" --- ( ( @@ -102,9 +102,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha ], [ ( - PackageName { + PyPiPackageName { source: "package1", - normalized: "package1", + normalized: PackageName( + "package1", + ), }, PyPiRequirement { version: Some( @@ -112,18 +114,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: Equal, - version: Version { - epoch: 0, - release: [ - 1, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "1.0.0", }, ], ), @@ -133,9 +124,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package2", - normalized: "package2", + normalized: PackageName( + "package2", + ), }, PyPiRequirement { version: Some( @@ -143,17 +136,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: Equal, - version: Version { - epoch: 0, - release: [ - 2, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "2.0", }, ], ), @@ -163,9 +146,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package3", - normalized: "package3", + normalized: PackageName( + "package3", + ), }, PyPiRequirement { version: Some( @@ -173,16 +158,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: Equal, - version: Version { - epoch: 0, - release: [ - 3, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "3", }, ], ), @@ -192,9 +168,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package4", - normalized: "package4", + normalized: PackageName( + "package4", + ), }, PyPiRequirement { version: Some( @@ -202,18 +180,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: LessThanEqual, - version: Version { - epoch: 0, - release: [ - 4, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "4.0.0", }, ], ), @@ -223,9 +190,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package5", - normalized: "package5", + normalized: PackageName( + "package5", + ), }, PyPiRequirement { version: Some( @@ -233,18 +202,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: GreaterThanEqual, - version: Version { - epoch: 0, - release: [ - 5, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "5.0.0", }, ], ), @@ -254,9 +212,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package6", - normalized: "package6", + normalized: PackageName( + "package6", + ), }, PyPiRequirement { version: Some( @@ -264,18 +224,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: GreaterThan, - version: Version { - epoch: 0, - release: [ - 6, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "6.0.0", }, ], ), @@ -285,9 +234,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package7", - normalized: "package7", + normalized: PackageName( + "package7", + ), }, PyPiRequirement { version: Some( @@ -295,18 +246,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: LessThan, - version: Version { - epoch: 0, - release: [ - 7, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "7.0.0", }, ], ), @@ -316,9 +256,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package8", - normalized: "package8", + normalized: PackageName( + "package8", + ), }, PyPiRequirement { version: Some( @@ -326,18 +268,7 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: NotEqual, - version: Version { - epoch: 0, - release: [ - 8, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "8.0.0", }, ], ), @@ -347,9 +278,11 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package9", - normalized: "package9", + normalized: PackageName( + "package9", + ), }, PyPiRequirement { version: None, @@ -358,40 +291,52 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha }, ), ( - PackageName { + PyPiPackageName { source: "package10", - normalized: "package10", + normalized: PackageName( + "package10", + ), }, PyPiRequirement { version: None, extras: Some( [ - "extra", + ExtraName( + "extra", + ), ], ), index: None, }, ), ( - PackageName { + PyPiPackageName { source: "package11", - normalized: "package11", + normalized: PackageName( + "package11", + ), }, PyPiRequirement { version: None, extras: Some( [ - "extra1", - "extra2", + ExtraName( + "extra1", + ), + ExtraName( + "extra2", + ), ], ), index: None, }, ), ( - PackageName { + PyPiPackageName { source: "package12", - normalized: "package12", + normalized: PackageName( + "package12", + ), }, PyPiRequirement { version: Some( @@ -399,35 +344,30 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: Equal, - version: Version { - epoch: 0, - release: [ - 12, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "12.0.0", }, ], ), ), extras: Some( [ - "extra1", - "extra2", + ExtraName( + "extra1", + ), + ExtraName( + "extra2", + ), ], ), index: None, }, ), ( - PackageName { + PyPiPackageName { source: "package13", - normalized: "package13", + normalized: PackageName( + "package13", + ), }, PyPiRequirement { version: Some( @@ -435,35 +375,30 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: GreaterThanEqual, - version: Version { - epoch: 0, - release: [ - 13, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "13.0.0", }, ], ), ), extras: Some( [ - "extra1", - "extra2", + ExtraName( + "extra1", + ), + ExtraName( + "extra2", + ), ], ), index: None, }, ), ( - PackageName { + PyPiPackageName { source: "package14", - normalized: "package14", + normalized: PackageName( + "package14", + ), }, PyPiRequirement { version: Some( @@ -471,26 +406,19 @@ expression: "(parse_dependencies(env_info.dependencies).unwrap(),\n parse_cha [ VersionSpecifier { operator: LessThanEqual, - version: Version { - epoch: 0, - release: [ - 14, - 0, - 0, - ], - pre: None, - post: None, - dev: None, - local: None, - }, + version: "14.0.0", }, ], ), ), extras: Some( [ - "extra1", - "extra2", + ExtraName( + "extra1", + ), + ExtraName( + "extra2", + ), ], ), index: None, diff --git a/src/environment.rs b/src/environment.rs index addeb7b51..7e3df4763 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -1,3 +1,4 @@ +use crate::lock_file::UvResolutionContext; use crate::project::grouped_environment::GroupedEnvironmentName; use crate::{ consts, install, install_pypi, @@ -22,7 +23,6 @@ use rattler_conda_types::{Channel, Platform, PrefixRecord, RepoDataRecord}; use rattler_lock::{PypiPackageData, PypiPackageEnvironmentData}; use rattler_repodata_gateway::sparse::SparseRepoData; use reqwest_middleware::ClientWithMiddleware; -use rip::{index::PackageDb, resolve::solve_options::SDistResolution}; use std::{collections::HashMap, io::ErrorKind, path::Path, sync::Arc}; /// Verify the location of the prefix folder is not changed so the applied prefix path is still valid. @@ -174,35 +174,31 @@ pub async fn get_up_to_date_prefix( pub async fn update_prefix_pypi( environment_name: &EnvironmentName, prefix: &Prefix, - platform: Platform, - package_db: Arc, + _platform: Platform, conda_records: &[RepoDataRecord], pypi_records: &[(PypiPackageData, PypiPackageEnvironmentData)], status: &PythonStatus, system_requirements: &SystemRequirements, - sdist_resolution: SDistResolution, - env_variables: HashMap, + uv_context: UvResolutionContext, + environment_variables: &HashMap, ) -> miette::Result<()> { // Remove python packages from a previous python distribution if the python version changed. - install_pypi::remove_old_python_distributions(prefix, platform, status)?; // Install and/or remove python packages progress::await_in_progress( format!( - "updating pypi package in '{}'", + "updating pypi packages in '{}'", environment_name.fancy_display() ), |_| { install_pypi::update_python_distributions( - package_db, prefix, conda_records, pypi_records, - platform, status, system_requirements, - sdist_resolution, - env_variables, + uv_context, + environment_variables, ) }, ) diff --git a/src/install_pypi.rs b/src/install_pypi.rs index 29e031834..6d25f6eb5 100644 --- a/src/install_pypi.rs +++ b/src/install_pypi.rs @@ -1,594 +1,447 @@ use crate::environment::PythonStatus; use crate::prefix::Prefix; -use crate::progress; -use crate::progress::ProgressBarMessageFormatter; -use futures::{stream, Stream, StreamExt, TryFutureExt, TryStreamExt}; -use indexmap::IndexSet; -use indicatif::ProgressBar; -use itertools::Itertools; + +use crate::uv_reporter::{UvReporter, UvReporterOptions}; + +use distribution_filename::DistFilename; + use miette::{IntoDiagnostic, WrapErr}; -use rip::resolve::solve_options::{ResolveOptions, SDistResolution}; +use uv_cache::Cache; +use uv_resolver::InMemoryIndex; use crate::consts::PROJECT_MANIFEST; +use crate::lock_file::UvResolutionContext; use crate::project::manifest::SystemRequirements; -use crate::pypi_marker_env::determine_marker_environment; -use crate::pypi_tags::{is_python_record, project_platform_tags}; -use pep508_rs::MarkerEnvironment; + +use crate::pypi_tags::{get_pypi_tags, is_python_record}; +use distribution_types::{CachedDist, Dist, IndexUrl, InstalledDist, Name}; +use install_wheel_rs::linker::LinkMode; + use rattler_conda_types::{Platform, RepoDataRecord}; use rattler_lock::{PypiPackageData, PypiPackageEnvironmentData}; -use rip::artifacts::wheel::{InstallPaths, UnpackWheelOptions}; -use rip::artifacts::Wheel; -use rip::index::PackageDb; -use rip::python_env::{ - find_distributions_in_venv, uninstall_distribution, Distribution, PythonLocation, WheelTag, - WheelTags, -}; -use rip::types::{ - ArtifactHashes, ArtifactInfo, ArtifactName, Extra, HasArtifactName, NormalizedPackageName, -}; -use rip::wheel_builder::WheelBuilder; -use std::collections::{HashMap, HashSet}; -use std::ops::Deref; -use std::path::Path; -use std::str::FromStr; -use std::sync::Arc; + +use std::collections::HashMap; use std::time::Duration; -use tokio::task::JoinError; -/// The installer name for pypi packages installed by pixi. -pub(crate) const PIXI_PYPI_INSTALLER: &str = env!("CARGO_PKG_NAME"); +use uv_client::{FlatIndex, FlatIndexClient}; +use uv_dispatch::BuildDispatch; +use uv_distribution::RegistryWheelIndex; +use uv_installer::{Downloader, SitePackages}; +use uv_interpreter::{Interpreter, Virtualenv}; +use uv_normalize::PackageName; -type CombinedPypiPackageData = (PypiPackageData, PypiPackageEnvironmentData); +use uv_traits::{ConfigSettings, NoBinary, NoBuild, SetupPyStrategy}; -/// Installs and/or remove python distributions. -// TODO: refactor arguments in struct -#[allow(clippy::too_many_arguments)] -pub async fn update_python_distributions( - package_db: Arc, - prefix: &Prefix, - conda_package: &[RepoDataRecord], - python_packages: &[CombinedPypiPackageData], - platform: Platform, - status: &PythonStatus, - system_requirements: &SystemRequirements, - sdist_resolution: SDistResolution, - env_variables: HashMap, -) -> miette::Result<()> { - let Some(python_info) = status.current_info() else { - // No python interpreter in the environment, so there is nothing to do here. - return Ok(()); - }; +type CombinedPypiPackageData = (PypiPackageData, PypiPackageEnvironmentData); - let python_location = prefix.root().join(&python_info.path); +pub(super) fn elapsed(duration: Duration) -> String { + let secs = duration.as_secs(); - // Determine where packages would have been installed - let python_version = ( - python_info.short_version.0 as u32, - python_info.short_version.1 as u32, - 0, - ); - let install_paths = InstallPaths::for_venv(python_version, platform.is_windows()); - - // Determine the current python distributions in those locations - let current_python_packages = find_distributions_in_venv(prefix.root(), &install_paths) - .into_diagnostic() - .context( - "failed to locate python packages that have not been installed as conda packages", - )?; - - // Determine the python packages that are part of the lock-file - let python_packages = python_packages.iter().collect_vec(); - - // Determine the python packages to remove before we start installing anything new. If the - // python version changed between installations we will have to remove any previous distribution - // regardless. - let (python_distributions_to_remove, python_distributions_to_install) = - determine_python_distributions_to_remove_and_install( - prefix.root(), - current_python_packages, - python_packages, - ); + if secs >= 60 { + format!("{}m {:02}s", secs / 60, secs % 60) + } else if secs > 0 { + format!("{}.{:02}s", secs, duration.subsec_nanos() / 10_000_000) + } else { + format!("{}ms", duration.subsec_millis()) + } +} - // Determine the python interpreter that is installed as part of the conda packages. - let python_record = conda_package - .iter() - .find(|r| is_python_record(r)) - .ok_or_else(|| miette::miette!("could not resolve pypi dependencies because no python interpreter is added to the dependencies of the project.\nMake sure to add a python interpreter to the [dependencies] section of the {PROJECT_MANIFEST}, or run:\n\n\tpixi add python"))?; +/// Derived from uv [`uv_installer::Plan`] +struct PixiInstallPlan { + /// The distributions that are not already installed in the current environment, but are + /// available in the local cache. + pub local: Vec, - // Determine the environment markers - let marker_environment = Arc::new(determine_marker_environment( - platform, - python_record.as_ref(), - )?); + /// The distributions that are not already installed in the current environment, and are + /// not available in the local cache. + /// this is where we differ from UV because we want already have the URL we want to download + pub remote: Vec, - // Determine the compatible tags - let compatible_tags = Arc::new(project_platform_tags( - platform, - system_requirements, - python_record.as_ref(), - )); - - // Define the resolve options for local wheel building - let resolve_options = Arc::new(ResolveOptions { - sdist_resolution, - python_location: PythonLocation::Custom(python_location), - ..Default::default() - }); + /// Any distributions that are already installed in the current environment, but will be + /// re-installed (including upgraded) to satisfy the requirements. + pub reinstalls: Vec, - // Start downloading the python packages that we want in the background. - let (package_stream, package_stream_pb) = stream_python_artifacts( - package_db, - marker_environment, - compatible_tags, - resolve_options, - python_distributions_to_install.clone(), - env_variables, - ); + /// Any distributions that are already installed in the current environment, and are + /// _not_ necessary to satisfy the requirements. + pub extraneous: Vec, +} - // Remove python packages that need to be removed - if !python_distributions_to_remove.is_empty() { - let site_package_path = install_paths.site_packages(); +/// Converts our locked data to a file +fn locked_data_to_file(pkg: &PypiPackageData, filename: &str) -> distribution_types::File { + // Convert our url to a FileLocation + let url = if pkg.url.scheme() == "file" { + distribution_types::FileLocation::Path( + pkg.url.to_file_path().expect("cannot convert to file path"), + ) + } else { + distribution_types::FileLocation::AbsoluteUrl(pkg.url.to_string()) + }; - for python_distribution in python_distributions_to_remove { - uninstall_pixi_installed_distribution(prefix, site_package_path, &python_distribution)?; + // Convert PackageHashes to uv hashes + let hashes = if let Some(ref hash) = pkg.hash { + match hash { + rattler_lock::PackageHashes::Md5(md5) => pypi_types::Hashes { + md5: Some(format!("{:x}", md5)), + sha256: None, + }, + rattler_lock::PackageHashes::Sha256(sha256) => pypi_types::Hashes { + md5: None, + sha256: Some(format!("{:x}", sha256)), + }, + rattler_lock::PackageHashes::Md5Sha256(md5, sha256) => pypi_types::Hashes { + md5: Some(format!("{:x}", md5)), + sha256: Some(format!("{:x}", sha256)), + }, } - } + } else { + pypi_types::Hashes { + md5: None, + sha256: None, + } + }; - // Install the individual python packages that we want - let package_install_pb = install_python_distributions( - prefix, - install_paths, - &prefix.root().join(python_info.path()), - package_stream, - ) - .await?; - - // Clear any pending progress bar - for pb in package_install_pb - .into_iter() - .chain(package_stream_pb.into_iter()) - { - pb.finish_and_clear(); + distribution_types::File { + filename: filename.to_string(), + dist_info_metadata: None, + hashes, + requires_python: pkg.requires_python.clone(), + upload_time_utc_ms: None, + yanked: None, + size: None, + url, } +} - Ok(()) +fn convert_to_dist(pkg: &PypiPackageData) -> Dist { + // Extract last component from url + let filename_raw = pkg.url.path_segments().unwrap().last().unwrap(); + let filename = DistFilename::try_from_normalized_filename(filename_raw) + .unwrap_or_else(|| panic!("{} - could not convert to dist filename", pkg.name.as_ref())); + + // Bit of a hack to create the file type + let file = locked_data_to_file(pkg, filename_raw); + + Dist::from_registry(filename, file, IndexUrl::Pypi) } -/// Concurrently installs python wheels as they become available. -async fn install_python_distributions( - prefix: &Prefix, - install_paths: InstallPaths, - python_executable_path: &Path, - package_stream: impl Stream, HashSet, Wheel)>> + Sized, -) -> miette::Result> { - // Determine the number of packages that we are going to install - let len = { - let (lower_bound, upper_bound) = package_stream.size_hint(); - upper_bound.unwrap_or(lower_bound) - }; - if len == 0 { - return Ok(None); - } +/// Figure out what we can link from the cache locally +/// and what we need to download from the registry. +/// Also determine what we need to remove. +/// Ignores re-installs for now. +fn whats_the_plan<'a>( + required: &'a [CombinedPypiPackageData], + installed: &SitePackages<'_>, + registry_index: &'a mut RegistryWheelIndex<'a>, + uv_cache: &Cache, +) -> miette::Result { + // Create a HashSet of PackageName and Version + let mut required_map: std::collections::HashMap<&PackageName, &PypiPackageData> = + required.iter().map(|(pkg, _)| (&pkg.name, pkg)).collect(); + + // Filter out conda packages + // Ignore packages without an installer + let installed = installed.iter().filter(|dist| { + dist.installer() + .unwrap_or_default() + .is_some_and(|installer| installer != "conda") + }); - // Create a progress bar to show the progress of the installation - let pb = progress::global_multi_progress().add(ProgressBar::new(len as u64)); - pb.set_style(progress::default_progress_style()); - pb.set_prefix("unpacking wheels"); - pb.enable_steady_tick(Duration::from_millis(100)); - - // Create a message formatter to show the current operation - let message_formatter = ProgressBarMessageFormatter::new(pb.clone()); - - // Concurrently unpack the wheels as they become available in the stream. - let install_pb = pb.clone(); - package_stream - .try_for_each_concurrent(Some(20), move |(hash, extras, wheel)| { - let install_paths = install_paths.clone(); - let root = prefix.root().to_path_buf(); - let message_formatter = message_formatter.clone(); - let pb = install_pb.clone(); - let python_executable_path = python_executable_path.to_owned(); - async move { - let pb_task = message_formatter.start(wheel.name().to_string()).await; - let unpack_result = tokio::task::spawn_blocking(move || { - wheel - .unpack( - &root, - &install_paths, - &python_executable_path, - &UnpackWheelOptions { - installer: Some(PIXI_PYPI_INSTALLER.into()), - extras: Some(extras), - ..Default::default() - }, - ) - .into_diagnostic() - .and_then(|unpacked_wheel| { - if let Some(hash) = hash { - std::fs::write(unpacked_wheel.dist_info.join("HASH"), hash) - .into_diagnostic() - } else { - Ok(()) - } - }) - }) - .map_err(JoinError::try_into_panic) - .await; - - pb_task.finish().await; - pb.inc(1); - - match unpack_result { - Ok(unpack_result) => unpack_result, - Err(Ok(panic)) => std::panic::resume_unwind(panic), - Err(Err(e)) => Err(miette::miette!("{e}")), - } - } - }) - .await?; + let mut extraneous = vec![]; + let mut local = vec![]; + let mut remote = vec![]; + let mut reinstalls = vec![]; + + // TODO: Do something with editable packages + // TODO: Check WheelTag correctness for installed packages + // TODO: Add source dependency support + + // Walk over all installed packages and check if they are required + for dist in installed { + if let Some(pkg) = required_map.remove(&dist.name()) { + // Check if the installed version is the same as the required version + let same_version = match dist { + InstalledDist::Registry(reg) => reg.version == pkg.version, + InstalledDist::Url(direct_url) => direct_url.url == pkg.url, + }; - // Update the progress bar - pb.set_style(progress::finished_progress_style()); - pb.finish(); + // Don't do anything if the version is the same + if same_version { + continue; + } - Ok(Some(pb)) -} + // Otherwise, we need to check if we get it remote or local + reinstalls.push(dist.clone()); -/// Creates a stream which downloads the specified python packages. The stream will download the -/// packages in parallel and yield them as soon as they become available. -fn stream_python_artifacts( - package_db: Arc, - marker_environment: Arc, - compatible_tags: Arc, - resolve_options: Arc, - packages_to_download: Vec<&CombinedPypiPackageData>, - env_variables: HashMap, -) -> ( - impl Stream, HashSet, Wheel)>> + '_, - Option, -) { - if packages_to_download.is_empty() { - return (stream::empty().left_stream(), None); - } + // Check if we need to revalidate + // In that case + if uv_cache.must_revalidate(&pkg.name) { + remote.push(convert_to_dist(pkg)); + continue; + } - // Construct a progress bar to provide some indication on what is currently downloading. - // TODO: It would be much nicer if we can provide more information with regards to the progress. - // For instance if we could also show at what speed the downloads are progressing or the total - // size of the downloads that would really help the user I think. - let pb = - progress::global_multi_progress().add(ProgressBar::new(packages_to_download.len() as u64)); - pb.set_style(progress::default_progress_style()); - pb.set_prefix("acquiring wheels"); - pb.enable_steady_tick(Duration::from_millis(100)); - - // Construct a message formatter - let message_formatter = ProgressBarMessageFormatter::new(pb.clone()); - - let stream_pb = pb.clone(); - let total_packages = packages_to_download.len(); - - let download_stream = stream::iter(packages_to_download) - .map(move |(pkg_data, pkg_env_data)| { - let pb = stream_pb.clone(); - let message_formatter = message_formatter.clone(); - let marker_environment = marker_environment.clone(); - let compatible_tags = compatible_tags.clone(); - let resolve_options = resolve_options.clone(); - let package_db = package_db.clone(); - let env_variables = env_variables.clone(); - - async move { - // Determine the filename from the - let filename = pkg_data - .url - .path_segments() - .and_then(|s| s.last()) - .expect("url is missing a path"); - let name = NormalizedPackageName::from_str(&pkg_data.name) - .into_diagnostic() - .with_context(|| { - format!("'{}' is not a valid python package name", &pkg_data.name) - })?; - - let artifact_name = ArtifactName::from_filename(filename, Some(pkg_data.url.clone()), &name) - .expect("failed to convert filename to artifact name"); - - let (artifact_name, is_direct_url) = if let ArtifactName::STree(mut stree) = artifact_name{ - // populate resolved version of direct dependency - stree.version = pkg_data.version.clone(); - (ArtifactName::STree(stree), true) - } else { - (artifact_name, false) - }; - - // Log out intent to install this python package. - tracing::info!("downloading python package {filename}"); - let pb_task = message_formatter.start(filename.to_string()).await; - - // Reconstruct the ArtifactInfo from the data in the lockfile. - let artifact_info = ArtifactInfo { - filename: artifact_name, - url: pkg_data.url.clone(), - hashes: pkg_data.hash.as_ref().map(|hash| ArtifactHashes { - sha256: hash.sha256().cloned(), - }), - requires_python: pkg_data.requires_python.clone(), - dist_info_metadata: Default::default(), - yanked: Default::default(), - is_direct_url, - }; - - let (wheel, _) = tokio::spawn({ - let marker_environment = marker_environment.clone(); - let compatible_tags = compatible_tags.clone(); - let resolve_options = resolve_options.clone(); - let package_db = package_db.clone(); - async move { - let wheel_builder = WheelBuilder::new( - package_db.clone(), - marker_environment, - Some(compatible_tags), - resolve_options.deref().clone(), - env_variables, - ) - .into_diagnostic() - .context("error in construction of WheelBuilder for `pypi-dependencies` installation")?; - - // TODO: Maybe we should have a cache of wheels separate from the package_db. Since a - // wheel can just be identified by its hash or url. - package_db.get_wheel(&artifact_info, Some(&wheel_builder)).await - } - }) - .await.unwrap_or_else(|e| match e.try_into_panic() { - Ok(panic) => std::panic::resume_unwind(panic), - Err(_) => Err(miette::miette!("operation was cancelled")) - })?; - - // Update the progress bar - pb_task.finish().await; - pb.inc(1); - if pb.position() == total_packages as u64 { - pb.set_style(progress::finished_progress_style()); - pb.finish(); - } - - let hash = pkg_data - .hash - .as_ref() - .and_then(|h| h.sha256()) - .map(|sha256| format!("sha256-{:x}", sha256)); - - Ok(( - hash, - pkg_env_data - .extras - .iter() - .filter_map(|e| Extra::from_str(e).ok()) - .collect(), - wheel, - )) + // Do we have in the cache? + let wheel = registry_index + .get(&pkg.name) + .find(|(version, _)| **version == pkg.version); + if let Some((_, cached)) = wheel { + local.push(CachedDist::Registry(cached.clone())); + } else { + remote.push(convert_to_dist(pkg)); } - }) - .buffer_unordered(20) - .right_stream(); - (download_stream, Some(pb)) -} + // TODO(tim): we need to have special handling for DirectUrl dists + } else { + // We can uninstall + extraneous.push(dist.clone()); + } + } -/// If there was a previous version of python installed, remove any distribution installed in that -/// environment. -pub fn remove_old_python_distributions( - prefix: &Prefix, - platform: Platform, - python_changed: &PythonStatus, -) -> miette::Result<()> { - // If the python version didn't change, there is nothing to do here. - let python_version = match python_changed { - PythonStatus::Removed { old } | PythonStatus::Changed { old, .. } => old, - PythonStatus::Added { .. } | PythonStatus::DoesNotExist | PythonStatus::Unchanged(_) => { - return Ok(()) + // Now we need to check if we have any packages left in the required_map + for pkg in required_map.values() { + // Check if we need to revalidate + // In that case + if uv_cache.must_revalidate(&pkg.name) { + remote.push(convert_to_dist(pkg)); + continue; } - }; - // Get the interpreter version from the info - let python_version = ( - python_version.short_version.0 as u32, - python_version.short_version.1 as u32, - 0, - ); - let install_paths = InstallPaths::for_venv(python_version, platform.is_windows()); - - // Locate the packages that are installed in the previous environment - let current_python_packages = find_distributions_in_venv(prefix.root(), &install_paths) - .into_diagnostic() - .with_context(|| format!("failed to determine the python packages installed for a previous version of python ({}.{})", python_version.0, python_version.1))? - .into_iter().filter(|d| d.installer.as_deref() != Some("conda") && d.installer.is_some()).collect_vec(); - - let pb = progress::global_multi_progress() - .add(ProgressBar::new(current_python_packages.len() as u64)); - pb.set_style(progress::default_progress_style()); - pb.set_message("removing old python packages"); - pb.enable_steady_tick(Duration::from_millis(100)); - - // Remove the python packages - let site_package_path = install_paths.site_packages(); - for python_package in current_python_packages { - pb.set_message(format!( - "{} {}", - &python_package.name, &python_package.version - )); - - uninstall_pixi_installed_distribution(prefix, site_package_path, &python_package)?; - - pb.inc(1); + // Do we have in the cache? + let wheel = registry_index + .get(&pkg.name) + .find(|(version, _)| **version == pkg.version); + if let Some((_, cached)) = wheel { + local.push(CachedDist::Registry(cached.clone())); + } else { + remote.push(convert_to_dist(pkg)); + } } - Ok(()) + Ok(PixiInstallPlan { + local, + remote, + reinstalls, + extraneous, + }) } -/// Uninstalls a python distribution that was previously installed by pixi. -fn uninstall_pixi_installed_distribution( +/// Installs and/or remove python distributions. +// TODO: refactor arguments in struct +#[allow(clippy::too_many_arguments)] +pub async fn update_python_distributions( prefix: &Prefix, - site_package_path: &Path, - python_package: &Distribution, + conda_package: &[RepoDataRecord], + python_packages: &[CombinedPypiPackageData], + status: &PythonStatus, + system_requirements: &SystemRequirements, + uv_context: UvResolutionContext, + environment_variables: &HashMap, ) -> miette::Result<()> { - tracing::info!( - "uninstalling python package {}-{}", - &python_package.name, - &python_package.version - ); - let relative_dist_info = python_package - .dist_info - .strip_prefix(site_package_path) - .expect("the dist-info path must be a sub-path of the site-packages path"); + let start = std::time::Instant::now(); + let Some(python_info) = status.current_info() else { + // No python interpreter in the environment, so there is nothing to do here. + return Ok(()); + }; - // HACK: Also remove the HASH file that pixi writes. Ignore the error if its there. We - // should probably actually add this file to the RECORD. - let _ = std::fs::remove_file(prefix.root().join(&python_package.dist_info).join("HASH")); + let python_location = prefix.root().join(&python_info.path); - uninstall_distribution(&prefix.root().join(site_package_path), relative_dist_info) - .into_diagnostic() - .with_context(|| format!("could not uninstall python package {}-{}. Manually remove the `.pixi/env` folder and try again.", &python_package.name, &python_package.version))?; + // Determine where packages would have been installed + let _python_version = (python_info.short_version.1 as u32, 0); - Ok(()) -} + let python_record = conda_package + .iter() + .find(|r| is_python_record(r)) + .ok_or_else(|| miette::miette!("could not resolve pypi dependencies because no python interpreter is added to the dependencies of the project.\nMake sure to add a python interpreter to the [dependencies] section of the {PROJECT_MANIFEST}, or run:\n\n\tpixi add python"))?; -/// Determine which python packages we can leave untouched and which python packages should be -/// removed. -fn determine_python_distributions_to_remove_and_install<'p>( - prefix: &Path, - mut current_python_packages: Vec, - desired_python_packages: Vec<&'p CombinedPypiPackageData>, -) -> (Vec, Vec<&'p CombinedPypiPackageData>) { - // Determine the artifact tags associated with the locked dependencies. - let mut desired_python_packages = extract_locked_tags(desired_python_packages); - - // Any package that is currently installed that is not part of the locked dependencies should be - // removed. So we keep it in the `current_python_packages` list. - // Any package that is in the currently installed list that is NOT found in the lockfile is - // retained in the list to mark it for removal. - current_python_packages.retain(|current_python_packages| { - if current_python_packages.installer.is_none() { - // If this package has no installer, we can't make a reliable decision on whether to - // keep it or not. So we do not uninstall it. - return false; - } + let platform = platform_host::Platform::current().expect("unsupported platform"); + let interpreter = + Interpreter::query(&python_location, platform, &uv_context.cache).into_diagnostic()?; - if let Some(found_desired_packages_idx) = - desired_python_packages - .iter() - .position(|(pkg, artifact_name)| { - does_installed_match_locked_package( - prefix, - current_python_packages, - (pkg, artifact_name.as_ref()), - ) - }) - { - // Remove from the desired list of packages to install & from the packages to uninstall. - desired_python_packages.remove(found_desired_packages_idx); - false - } else { - // Only if this package was previously installed by us do we remove it. - current_python_packages.installer.as_deref() == Some(PIXI_PYPI_INSTALLER) - } - }); + tracing::debug!("[Install] Using Python Interpreter: {:?}", interpreter); - ( - current_python_packages, - desired_python_packages - .into_iter() - .map(|(pkg, _)| pkg) - .collect(), - ) -} + // Create a custom venv + let venv = Virtualenv::from_interpreter(interpreter, prefix.root()); -/// Determine the wheel tags for the locked dependencies. These are extracted by looking at the url -/// of the locked dependency. The filename of the URL is converted to a wheel name and the tags are -/// extract from that. -/// -/// If the locked dependency is not a wheel distribution `None` is returned for the tags. If the -/// the wheel name could not be parsed `None` is returned for the tags and a warning is emitted. -fn extract_locked_tags( - desired_python_packages: Vec<&CombinedPypiPackageData>, -) -> Vec<(&CombinedPypiPackageData, Option>)> { - desired_python_packages - .into_iter() - .map(|pkg@(pkg_data, _pkg_env_data)| { - // Extract the filename from the url and the name from the package name. - let Some(filename) = pkg_data.url.path_segments().and_then(|s| s.last()) else { - tracing::warn!( - "failed to determine the artifact name of the python package {}-{} from url {}: the url has no filename.", - &pkg_data.name, pkg_data.version, &pkg_data.url); - return (pkg, None); - }; - let Ok(name) = NormalizedPackageName::from_str(&pkg_data.name) else { - tracing::warn!( - "failed to determine the artifact name of the python package {}-{} from url {}: {} is not a valid package name.", - &pkg_data.name, pkg_data.version, &pkg_data.url, &pkg_data.name); - return (pkg, None); - }; + // Determine the current environment markers. + let tags = get_pypi_tags( + Platform::current(), + system_requirements, + &python_record.package_record, + )?; + + // Resolve the flat indexes from `--find-links`. + let flat_index = { + let client = FlatIndexClient::new(&uv_context.registry_client, &uv_context.cache); + let entries = client + .fetch(uv_context.index_locations.flat_index()) + .await + .into_diagnostic()?; + FlatIndex::from_entries(entries, &tags) + }; - // Determine the artifact type from the name and filename - match ArtifactName::from_filename(filename, Some(pkg_data.url.clone()), &name) { - Ok(ArtifactName::Wheel(name)) => (pkg, Some(IndexSet::from_iter(name.all_tags_iter()))), - Ok(_) => (pkg, None), - Err(err) => { - tracing::warn!( - "failed to determine the artifact name of the python package {}-{}. Could not determine the name from the url {}: {err}", - &pkg_data.name, pkg_data.version, &pkg_data.url); - (pkg, None) - } - } - }) - .collect() -} + // Track in-flight downloads, builds, etc., across resolutions. + let no_build = NoBuild::None; + let no_binary = NoBinary::None; + + let in_memory_index = InMemoryIndex::default(); + let config_settings = ConfigSettings::default(); + + // Prep the build context. + let build_dispatch = BuildDispatch::new( + &uv_context.registry_client, + &uv_context.cache, + venv.interpreter(), + &uv_context.index_locations, + &flat_index, + &in_memory_index, + &uv_context.in_flight, + SetupPyStrategy::default(), + &config_settings, + &no_build, + &no_binary, + ) + .with_sdist_build_env_vars(environment_variables.iter()); + + let _lock = venv.lock().into_diagnostic()?; + // TODO: need to resolve editables? + + let installed = SitePackages::from_executable(&venv).expect("could not create site-packages"); + let mut registry_index = + RegistryWheelIndex::new(&uv_context.cache, &tags, &uv_context.index_locations); + // Partition into those that should be linked from the cache (`local`), those that need to be + // downloaded (`remote`), and those that should be removed (`extraneous`). + let PixiInstallPlan { + local, + remote, + reinstalls, + extraneous, + } = whats_the_plan( + python_packages, + &installed, + &mut registry_index, + &uv_context.cache, + )?; + tracing::debug!( + "Resolved install plan: local={}, remote={}, reinstalls={}, extraneous={}", + local.len(), + remote.len(), + reinstalls.len(), + extraneous.len() + ); -/// Returns true if the installed python package matches the locked python package. If that is the -/// case we can assume that the locked python package is already installed. -fn does_installed_match_locked_package( - prefix_root: &Path, - installed_python_package: &Distribution, - locked_python_package: (&CombinedPypiPackageData, Option<&IndexSet>), -) -> bool { - let ((pkg_data, _), artifact_tags) = locked_python_package; - - // Match on name and version - if pkg_data.name != installed_python_package.name.as_str() - || pkg_data.version != installed_python_package.version - { - return false; + // Nothing to do. + if remote.is_empty() && local.is_empty() && reinstalls.is_empty() && extraneous.is_empty() { + let s = if python_packages.len() == 1 { "" } else { "s" }; + tracing::debug!( + "{}", + format!( + "Audited {} in {}", + format!( + "{num_requirements} package{s}", + num_requirements = python_packages.len() + ), + elapsed(start.elapsed()) + ) + ); + return Ok(()); } - // If this distribution is installed with pixi we can assume that there is a URL file that - // contains the original URL. - if installed_python_package.installer.as_deref() == Some(PIXI_PYPI_INSTALLER) { - let expected_hash = pkg_data - .hash - .as_ref() - .and_then(|hash| hash.sha256()) - .map(|sha256| format!("sha256-{:x}", sha256)); - if let Some(expected_hash) = expected_hash { - let hash_path = prefix_root - .join(&installed_python_package.dist_info) - .join("HASH"); - if let Ok(actual_hash) = std::fs::read_to_string(hash_path) { - return actual_hash == expected_hash; - } + // Download, build, and unzip any missing distributions. + let wheels = if remote.is_empty() { + Vec::new() + } else { + let start = std::time::Instant::now(); + + let options = UvReporterOptions::new() + .with_length(remote.len() as u64) + .with_capacity(remote.len() + 30) + .with_starting_tasks(remote.iter().map(|d| format!("{}", d.name()))) + .with_top_level_message("Downloading"); + + let downloader = Downloader::new( + &uv_context.cache, + &tags, + &uv_context.registry_client, + &build_dispatch, + ) + .with_reporter(UvReporter::new(options)); + + let wheels = downloader + .download(remote.clone(), &uv_context.in_flight) + .await + .into_diagnostic() + .context("Failed to download distributions")?; + + let s = if wheels.len() == 1 { "" } else { "s" }; + tracing::info!( + "{}", + format!( + "Downloaded {} in {}", + format!("{} package{}", wheels.len(), s), + elapsed(start.elapsed()) + ) + ); + + wheels + }; + + // Remove any unnecessary packages. + if !extraneous.is_empty() || !reinstalls.is_empty() { + let start = std::time::Instant::now(); + + for dist_info in extraneous.iter().chain(reinstalls.iter()) { + let summary = uv_installer::uninstall(dist_info) + .await + .expect("uinstall did not work"); + tracing::debug!( + "Uninstalled {} ({} file{}, {} director{})", + dist_info.name(), + summary.file_count, + if summary.file_count == 1 { "" } else { "s" }, + summary.dir_count, + if summary.dir_count == 1 { "y" } else { "ies" }, + ); } + + let s = if extraneous.len() + reinstalls.len() == 1 { + "" + } else { + "s" + }; + tracing::debug!( + "{}", + format!( + "Uninstalled {} in {}", + format!("{} package{}", extraneous.len() + reinstalls.len(), s), + elapsed(start.elapsed()) + ) + ); } - // Try to match the tags of both packages. This turns out to be pretty unreliable because - // there are many WHEELS that do not report the tags of their filename correctly in the - // WHEEL file. - match (artifact_tags, &installed_python_package.tags) { - (None, _) | (_, None) => { - // One, or both, of the artifacts are not a wheel distribution so we cannot - // currently compare them. In that case we always just reinstall. - // TODO: Maybe log some info here? - // TODO: Add support for more distribution types. - false - } - (Some(locked_tags), Some(installed_tags)) => locked_tags == installed_tags, + // Install the resolved distributions. + let wheels = wheels.into_iter().chain(local).collect::>(); + let options = UvReporterOptions::new() + .with_length(wheels.len() as u64) + .with_capacity(wheels.len() + 30) + .with_starting_tasks(wheels.iter().map(|d| format!("{}", d.name()))) + .with_top_level_message("Installing distributions"); + if !wheels.is_empty() { + let start = std::time::Instant::now(); + uv_installer::Installer::new(&venv) + .with_link_mode(LinkMode::default()) + .with_reporter(UvReporter::new(options)) + .install(&wheels) + .unwrap(); + + let s = if wheels.len() == 1 { "" } else { "s" }; + tracing::info!( + "{}", + format!( + "Installed {} in {}", + format!("{} package{}", wheels.len(), s), + elapsed(start.elapsed()) + ) + ); } + + Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index 87292025e..6457f44c1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,6 +19,9 @@ pub mod utils; mod pypi_marker_env; mod pypi_tags; +mod uv_reporter; + +mod pypi_name_mapping; pub use activation::get_activation_env; pub use lock_file::load_lock_file; diff --git a/src/lock_file/mod.rs b/src/lock_file/mod.rs index 9ff1fae09..ec716d0dd 100644 --- a/src/lock_file/mod.rs +++ b/src/lock_file/mod.rs @@ -2,8 +2,6 @@ mod outdated; mod package_identifier; -pub(crate) mod pypi; -mod pypi_name_mapping; mod records_by_name; mod resolve; mod satisfiability; @@ -17,7 +15,7 @@ use rattler_lock::{LockFile, PypiPackageData, PypiPackageEnvironmentData}; pub use outdated::OutdatedEnvironments; pub use package_identifier::PypiPackageIdentifier; pub use records_by_name::{PypiRecordsByName, RepoDataRecordsByName}; -pub use resolve::{resolve_conda, resolve_pypi}; +pub use resolve::{resolve_conda, resolve_pypi, UvResolutionContext}; pub use satisfiability::{ verify_environment_satisfiability, verify_platform_satisfiability, PlatformUnsat, }; diff --git a/src/lock_file/package_identifier.rs b/src/lock_file/package_identifier.rs index 48862889a..f4cf71088 100644 --- a/src/lock_file/package_identifier.rs +++ b/src/lock_file/package_identifier.rs @@ -1,19 +1,18 @@ -use super::pypi_name_mapping; +use crate::project::manifest::python::PyPiPackageName; +use crate::pypi_name_mapping; use pep508_rs::{Requirement, VersionOrUrl}; use rattler_conda_types::{PackageUrl, RepoDataRecord}; use rattler_lock::CondaPackage; -use rip::resolve::PinnedPackage; -use rip::types::{Extra, NormalizedPackageName, ParsePackageNameError}; use std::{collections::HashSet, str::FromStr}; use thiserror::Error; - +use uv_normalize::{ExtraName, InvalidNameError, PackageName}; /// Defines information about a Pypi package extracted from either a python package or from a /// conda package. #[derive(Debug)] pub struct PypiPackageIdentifier { - pub name: NormalizedPackageName, + pub name: PyPiPackageName, pub version: pep440_rs::Version, - pub extras: HashSet, + pub extras: HashSet, } impl PypiPackageIdentifier { @@ -25,33 +24,14 @@ impl PypiPackageIdentifier { Ok(result) } - /// Constructs a new instance from a [`LockedDependency`]. - pub fn from_locked_package( - package: &rattler_lock::Package, - ) -> Result, ConversionError> { - match package { - rattler_lock::Package::Conda(pkg) => Self::from_locked_conda_dependency(pkg), - rattler_lock::Package::Pypi(pkg) => Ok(vec![Self::from_locked_pypi_dependency(pkg)?]), - } - } - /// Constructs a new instance from a locked Pypi dependency. pub fn from_locked_pypi_dependency( package: &rattler_lock::PypiPackage, ) -> Result { - let name = NormalizedPackageName::from_str(&package.data().package.name) - .map_err(|e| ConversionError::PackageName(package.data().package.name.clone(), e))?; - let version = package.data().package.version.clone(); - let extras = package - .extras() - .iter() - .map(|e| Extra::from_str(e).map_err(|_| ConversionError::Extra(e.clone()))) - .collect::>()?; - Ok(Self { - name, - version, - extras, + name: PyPiPackageName::from_normalized(package.data().package.name.clone()), + version: package.data().package.version.clone(), + extras: package.extras().iter().cloned().collect(), }) } @@ -77,11 +57,11 @@ impl PypiPackageIdentifier { if !has_pypi_purl && pypi_name_mapping::is_conda_forge_url(package.url()) { // Convert the conda package names to pypi package names. If the conversion fails we // just assume that its not a valid python package. - let name = NormalizedPackageName::from_str(record.name.as_normalized()).ok(); + let name = PackageName::from_str(record.name.as_normalized()).ok(); let version = pep440_rs::Version::from_str(&record.version.as_str()).ok(); if let (Some(name), Some(version)) = (name, version) { result.push(PypiPackageIdentifier { - name, + name: PyPiPackageName::from_normalized(name), version, // TODO: We can't really tell which python extras are enabled in a conda package. extras: Default::default(), @@ -113,12 +93,12 @@ impl PypiPackageIdentifier { if !has_pypi_purl && pypi_name_mapping::is_conda_forge_record(record) { // Convert the conda package names to pypi package names. If the conversion fails we // just assume that its not a valid python package. - let name = NormalizedPackageName::from_str(record.package_record.name.as_source()).ok(); + let name = PackageName::from_str(record.package_record.name.as_source()).ok(); let version = pep440_rs::Version::from_str(&record.package_record.version.as_str()).ok(); if let (Some(name), Some(version)) = (name, version) { result.push(PypiPackageIdentifier { - name, + name: PyPiPackageName::from_normalized(name), version, // TODO: We can't really tell which python extras are enabled in a conda package. extras: Default::default(), @@ -129,15 +109,15 @@ impl PypiPackageIdentifier { Ok(()) } - /// Given a list of conda package records, extract the python packages that will be installed - /// when these conda packages are installed. - pub fn from_records(records: &[RepoDataRecord]) -> Result, ConversionError> { - let mut result = Vec::new(); - for record in records { - Self::from_record_into(record, &mut result)?; - } - Ok(result) - } + // /// Given a list of conda package records, extract the python packages that will be installed + // /// when these conda packages are installed. + // pub fn from_records(records: &[RepoDataRecord]) -> Result, ConversionError> { + // let mut result = Vec::new(); + // for record in records { + // Self::from_record_into(record, &mut result)?; + // } + // Ok(result) + // } /// Tries to construct an instance from a generic PURL. /// @@ -162,7 +142,7 @@ impl PypiPackageIdentifier { ) -> Result { assert_eq!(package_url.package_type(), "pypi"); let name = package_url.name(); - let name = NormalizedPackageName::from_str(name) + let name = PackageName::from_str(name) .map_err(|e| ConversionError::PackageName(name.to_string(), e))?; let version_str = package_url.version().unwrap_or(fallback_version); let version = pep440_rs::Version::from_str(version_str) @@ -172,21 +152,15 @@ impl PypiPackageIdentifier { let extras = HashSet::new(); Ok(Self { - name, + name: PyPiPackageName::from_normalized(name), version, extras, }) } pub fn satisfies(&self, requirement: &Requirement) -> bool { - // Parse the name of the requirement. If the name cannot be parsed to a normalized package - // the names will also not match. - let Ok(req_name) = NormalizedPackageName::from_str(&requirement.name) else { - return false; - }; - // Verify the name of the package - if self.name != req_name { + if self.name.as_normalized() != &requirement.name { return false; } @@ -203,12 +177,13 @@ impl PypiPackageIdentifier { } } - // Check if the required extras exist - for extra in requirement.extras.iter().flat_map(|e| e.iter()) { - if !self.extras.contains(extra.as_str()) { - return false; - } - } + // TODO: uv doesn't properly support this yet. + // // Check if the required extras exist + // for extra in requirement.extras.iter() { + // if !self.extras.contains(extra) { + // return false; + // } + // } true } @@ -217,24 +192,10 @@ impl PypiPackageIdentifier { #[derive(Error, Debug)] pub enum ConversionError { #[error("'{0}' is not a valid python package name")] - PackageName(String, #[source] ParsePackageNameError), + PackageName(String, #[source] InvalidNameError), #[error("'{0}' is not a valid python version")] Version(String), - - #[error("'{0}' is not a valid python extra")] - Extra(String), -} - -impl From for PinnedPackage { - fn from(value: PypiPackageIdentifier) -> Self { - PinnedPackage { - name: value.name, - version: value.version, - extras: value.extras, - // We are not aware of artifacts for conda python packages. - artifacts: vec![], - url: None, - } - } + // #[error("'{0}' is not a valid python extra")] + // Extra(String), } diff --git a/src/lock_file/records_by_name.rs b/src/lock_file/records_by_name.rs index 30194068e..cd6aa09e8 100644 --- a/src/lock_file/records_by_name.rs +++ b/src/lock_file/records_by_name.rs @@ -4,7 +4,6 @@ use std::borrow::Borrow; use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use std::hash::Hash; -use std::str::FromStr; /// A struct that holds both a ``Vec` of `RepoDataRecord` and a mapping from name to index. #[derive(Clone, Debug, Default)] @@ -109,14 +108,14 @@ impl RepoDataRecordsByName { #[derive(Clone, Debug, Default)] pub struct PypiRecordsByName { pub records: Vec, - by_name: HashMap, + by_name: HashMap, } impl PypiRecordsByName { /// Returns the record with the given name or `None` if no such record exists. pub fn by_name(&self, key: &Q) -> Option<&PypiRecord> where - rip::types::PackageName: Borrow, + uv_normalize::PackageName: Borrow, Q: Hash + Eq, { self.by_name.get(key).map(|idx| &self.records[*idx]) @@ -135,10 +134,7 @@ impl PypiRecordsByName { let mut by_name = HashMap::with_capacity(min_size); let mut records = Vec::with_capacity(min_size); for record in iter { - let Ok(package_name) = rip::types::PackageName::from_str(&record.0.name) else { - continue; - }; - match by_name.entry(package_name) { + match by_name.entry(record.0.name.clone()) { Entry::Vacant(entry) => { let idx = records.len(); records.push(record); @@ -161,8 +157,8 @@ impl PypiRecordsByName { /// names and recursively their dependencies. pub fn subset( &self, - package_names: impl IntoIterator, - conda_package_identifiers: &HashMap, + package_names: impl IntoIterator, + conda_package_identifiers: &HashMap, ) -> Self { let mut queue = package_names.into_iter().collect::>(); let mut queued_names = queue.iter().cloned().collect::>(); @@ -180,12 +176,8 @@ impl PypiRecordsByName { // Find all the dependencies of the package and add them to the queue for dependency in found_package.0.requires_dist.iter() { - let Ok(dependency_name) = rip::types::PackageName::from_str(&dependency.name) - else { - continue; - }; - if queued_names.insert(dependency_name.clone()) { - queue.push(dependency_name); + if queued_names.insert(dependency.name.clone()) { + queue.push(dependency.name.clone()); } } diff --git a/src/lock_file/resolve.rs b/src/lock_file/resolve.rs index bcef533b6..e039da434 100644 --- a/src/lock_file/resolve.rs +++ b/src/lock_file/resolve.rs @@ -2,83 +2,487 @@ //! //! See [`resolve_pypi`] and [`resolve_conda`] for more information. +use crate::config::get_cache_dir; +use crate::consts::PROJECT_MANIFEST; +use crate::uv_reporter::{UvReporter, UvReporterOptions}; +use std::collections::{BTreeMap, HashMap}; +use std::future::{ready, Future}; +use std::iter::once; + +use crate::lock_file::{package_identifier, PypiPackageIdentifier}; +use crate::pypi_marker_env::determine_marker_environment; +use crate::pypi_tags::{get_pypi_tags, is_python_record}; use crate::{ - lock_file::{pypi, LockedCondaPackages, LockedPypiPackages, PypiRecord}, + lock_file::{LockedCondaPackages, LockedPypiPackages, PypiRecord}, project::manifest::{PyPiRequirement, SystemRequirements}, + Project, +}; + +use distribution_types::FileLocation; +use distribution_types::{ + BuiltDist, DirectUrlSourceDist, Dist, IndexLocations, Name, PrioritizedDist, Resolution, + SourceDist, }; +use futures::FutureExt; use indexmap::IndexMap; use indicatif::ProgressBar; -use miette::IntoDiagnostic; -use rattler_conda_types::{GenericVirtualPackage, MatchSpec, Platform, RepoDataRecord}; +use itertools::{Either, Itertools}; +use miette::{Context, IntoDiagnostic}; +use pep440_rs::{Operator, Version, VersionPattern, VersionSpecifier}; +use pep508_rs::{Requirement, VerbatimUrl}; +use platform_host::Platform; +use pypi_types::Metadata21; +use rattler_conda_types::{GenericVirtualPackage, MatchSpec, RepoDataRecord}; +use rattler_digest::{parse_digest_from_hex, Md5, Sha256}; use rattler_lock::{PackageHashes, PypiPackageData, PypiPackageEnvironmentData}; use rattler_solve::{resolvo, SolverImpl}; -use rip::{index::PackageDb, resolve::solve_options::SDistResolution}; -use std::{collections::HashMap, path::Path, sync::Arc}; +use std::path::Path; +use std::str::FromStr; +use std::sync::Arc; +use url::Url; +use uv_cache::Cache; +use uv_client::{Connectivity, FlatIndex, FlatIndexClient, RegistryClient, RegistryClientBuilder}; +use uv_dispatch::BuildDispatch; +use uv_distribution::{DistributionDatabase, Reporter}; +use uv_interpreter::Interpreter; +use uv_normalize::PackageName; +use uv_resolver::{ + DefaultResolverProvider, DistFinder, InMemoryIndex, Manifest, Options, PythonRequirement, + Resolver, ResolverProvider, VersionMap, VersionsResponse, +}; +use uv_traits::{BuildContext, ConfigSettings, InFlight, NoBinary, NoBuild, SetupPyStrategy}; + +/// Objects that are needed for resolutions which can be shared between different resolutions. +#[derive(Clone)] +pub struct UvResolutionContext { + pub cache: Cache, + pub registry_client: Arc, + pub in_flight: Arc, + pub index_locations: Arc, +} + +impl UvResolutionContext { + pub fn from_project(project: &Project) -> miette::Result { + let cache = Cache::from_path( + get_cache_dir() + .expect("missing caching directory") + .join("uv-cache"), + ) + .into_diagnostic() + .context("failed to create uv cache")?; + let registry_client = Arc::new( + RegistryClientBuilder::new(cache.clone()) + .client(project.client().clone()) + .connectivity(Connectivity::Online) + .build(), + ); + let in_flight = Arc::new(InFlight::default()); + let index_locations = Arc::new(project.pypi_index_locations()); + Ok(Self { + cache, + registry_client, + in_flight, + index_locations, + }) + } +} /// This function takes as input a set of dependencies and system requirements and returns a set of /// locked packages. + +fn parse_hashes_from_hex(sha256: &Option, md5: &Option) -> Option { + match (sha256, md5) { + (Some(sha256), None) => Some(PackageHashes::Sha256( + parse_digest_from_hex::(sha256).expect("invalid sha256"), + )), + (None, Some(md5)) => Some(PackageHashes::Md5( + parse_digest_from_hex::(md5).expect("invalid md5"), + )), + (Some(sha256), Some(md5)) => Some(PackageHashes::Md5Sha256( + parse_digest_from_hex::(md5).expect("invalid md5"), + parse_digest_from_hex::(sha256).expect("invalid sha256"), + )), + (None, None) => None, + } +} + +struct CondaResolverProvider<'a, Context: BuildContext + Send + Sync> { + fallback: DefaultResolverProvider<'a, Context>, + conda_python_identifiers: &'a HashMap, +} + +impl<'a, Context: BuildContext + Send + Sync> ResolverProvider + for CondaResolverProvider<'a, Context> +{ + fn get_package_versions<'io>( + &'io self, + package_name: &'io PackageName, + ) -> impl Future + Send + 'io { + if let Some((repodata_record, identifier)) = self.conda_python_identifiers.get(package_name) + { + // If we encounter a package that was installed by conda we simply return a single + // available version in the form of a source distribution with the URL of the + // conda package. + // + // Obviously this is not a valid source distribution but it easies debugging. + let dist = Dist::Source(SourceDist::DirectUrl(DirectUrlSourceDist { + name: identifier.name.as_normalized().clone(), + url: VerbatimUrl::unknown(repodata_record.url.clone()), + })); + + let prioritized_dist = + PrioritizedDist::from_source(dist, None, Default::default(), None); + + return ready(Ok(VersionsResponse::Found(VersionMap::from( + BTreeMap::from_iter([(identifier.version.clone(), prioritized_dist)]), + )))) + .right_future(); + } + + // Otherwise use the default implementation + self.fallback + .get_package_versions(package_name) + .left_future() + } + + fn get_or_build_wheel_metadata<'io>( + &'io self, + dist: &'io Dist, + ) -> impl Future + Send + 'io { + if let Dist::Source(SourceDist::DirectUrl(DirectUrlSourceDist { url, name })) = dist { + if let Some((_, iden)) = self.conda_python_identifiers.get(name) { + // If this is a Source dist and the package is actually installed by conda we + // create fake metadata with no dependencies. We assume that all conda installed + // packages are properly installed including its dependencies. + return ready(Ok(( + Metadata21 { + metadata_version: "1.0".to_string(), + name: name.clone(), + version: iden.version.clone(), + requires_dist: vec![], + requires_python: None, + // TODO: This field is not actually properly used. + provides_extras: iden.extras.iter().cloned().collect(), + }, + Some(url.to_url()), + ))) + .left_future(); + } + } + + // Otherwise just call the default implementation + self.fallback + .get_or_build_wheel_metadata(dist) + .right_future() + } + + fn index_locations(&self) -> &IndexLocations { + self.fallback.index_locations() + } + + fn with_reporter(self, reporter: impl Reporter + 'static) -> Self { + Self { + fallback: self.fallback.with_reporter(reporter), + ..self + } + } +} + +fn single_version_requirement(name: PackageName, version: Version) -> Requirement { + Requirement { + name, + version_or_url: Some(pep508_rs::VersionOrUrl::VersionSpecifier( + [ + VersionSpecifier::new(Operator::Equal, VersionPattern::verbatim(version)) + .expect("this should always work"), + ] + .into_iter() + .collect(), + )), + extras: Vec::default(), + marker: None, + } +} + #[allow(clippy::too_many_arguments)] pub async fn resolve_pypi( - package_db: Arc, - dependencies: IndexMap>, + context: UvResolutionContext, + dependencies: IndexMap>, system_requirements: SystemRequirements, locked_conda_records: &[RepoDataRecord], - _locked_pypi_records: &[PypiRecord], - platform: Platform, + locked_pypi_records: &[PypiRecord], + platform: rattler_conda_types::Platform, pb: &ProgressBar, - python_location: Option<&Path>, - sdist_resolution: SDistResolution, - env_variables: HashMap, + python_location: &Path, + env_variables: &HashMap, ) -> miette::Result { // Solve python packages pb.set_message("resolving pypi dependencies"); - let python_artifacts = pypi::resolve_dependencies( - package_db.clone(), - dependencies, - system_requirements, - platform, - locked_conda_records, - python_location, - sdist_resolution, - env_variables, - ) - .await?; - - // Clear message - pb.set_message(""); - - // Add pip packages - let mut locked_packages = LockedPypiPackages::with_capacity(python_artifacts.len()); - for python_artifact in python_artifacts { - let (artifact, metadata) = package_db - // No need for a WheelBuilder here since any builds should have been done during the - // [`python::resolve_dependencies`] call. - .get_metadata(&python_artifact.artifacts, None) + + // Determine which pypi packages are already installed as conda package. + // Determine the python packages that are installed by the conda packages + let conda_python_packages = locked_conda_records + .iter() + .flat_map(|record| { + package_identifier::PypiPackageIdentifier::from_record(record).map_or_else( + |err| Either::Right(once(Err(err))), + |identifiers| { + Either::Left(identifiers.into_iter().map(|i| Ok((record.clone(), i)))) + }, + ) + }) + .map_ok(|(record, p)| (p.name.as_normalized().clone(), (record.clone(), p))) + .collect::, _>>() + .into_diagnostic() + .context("failed to extract python packages from conda metadata")?; + + if !conda_python_packages.is_empty() { + tracing::info!( + "the following python packages are assumed to be installed by conda: {conda_python_packages}", + conda_python_packages = + conda_python_packages + .values() + .format_with(", ", |(_, p), f| f(&format_args!( + "{name} {version}", + name = &p.name.as_source(), + version = &p.version + ))) + ); + } else { + tracing::info!("there are no python packages installed by conda"); + } + + // Get the Pypi requirements + let requirements = dependencies + .iter() + .flat_map(|(name, req)| req.iter().map(move |req| (name, req))) + .map(|(name, req)| req.as_pep508(name)) + .collect::>(); + + // Determine the python interpreter that is installed as part of the conda packages. + let python_record = locked_conda_records + .iter() + .find(|r| is_python_record(r)) + .ok_or_else(|| miette::miette!("could not resolve pypi dependencies because no python interpreter is added to the dependencies of the project.\nMake sure to add a python interpreter to the [dependencies] section of the {PROJECT_MANIFEST}, or run:\n\n\tpixi add python"))?; + + // Construct the marker environment for the target platform + let marker_environment = determine_marker_environment(platform, python_record.as_ref())?; + + // Determine the tags for this particular solve. + let tags = get_pypi_tags(platform, &system_requirements, python_record.as_ref())?; + + // Construct a fake interpreter from the conda environment. + // TODO: Should we look into using the actual interpreter here? + let platform = Platform::current().expect("unsupported platform"); + let interpreter = + Interpreter::query(python_location, platform, &context.cache).into_diagnostic()?; + + tracing::debug!("[Resolve] Using Python Interpreter: {:?}", interpreter); + + // Resolve the flat indexes from `--find-links`. + let flat_index = { + let client = FlatIndexClient::new(&context.registry_client, &context.cache); + let entries = client + .fetch(context.index_locations.flat_index()) .await - .expect("failed to get metadata for a package for which we have already fetched metadata during solving.") - .expect("no metadata for a package for which we have already fetched metadata during solving."); - - let pkg_data = PypiPackageData { - name: python_artifact.name.to_string(), - version: python_artifact.version, - requires_dist: metadata.requires_dist, - requires_python: metadata.requires_python, - url: artifact.url.clone(), - hash: artifact - .hashes - .as_ref() - .and_then(|hash| PackageHashes::from_hashes(None, hash.sha256)), - }; + .into_diagnostic()?; + FlatIndex::from_entries(entries, &tags) + }; + + let in_memory_index = InMemoryIndex::default(); + let config_settings = ConfigSettings::default(); + + // Create a shared in-memory index. + let options = Options::default(); + let build_dispatch = BuildDispatch::new( + &context.registry_client, + &context.cache, + &interpreter, + &context.index_locations, + &flat_index, + &in_memory_index, + &context.in_flight, + SetupPyStrategy::default(), + &config_settings, + &NoBuild::None, + &NoBinary::None, + ) + .with_options(options) + .with_sdist_build_env_vars(env_variables.iter()); + + let constraints = conda_python_packages + .values() + .map(|(repo, p)| Requirement { + name: p.name.as_normalized().clone(), + extras: vec![], + version_or_url: Some(pep508_rs::VersionOrUrl::Url(VerbatimUrl::unknown( + repo.url.clone(), + ))), + marker: None, + }) + .collect(); + + let preferences = locked_pypi_records + .iter() + .map(|p| single_version_requirement(p.0.name.clone(), p.0.version.clone())) + .collect(); + + let manifest = Manifest::new( + requirements, + // Vec::new(), + constraints, + Vec::new(), + preferences, + None, + Vec::new(), + ); + + let fallback_provider = DefaultResolverProvider::new( + &context.registry_client, + DistributionDatabase::new( + &context.cache, + &tags, + &context.registry_client, + &build_dispatch, + ), + &flat_index, + &tags, + PythonRequirement::new(&interpreter, &marker_environment), + options.exclude_newer, + build_dispatch.no_binary(), + ); + let provider = CondaResolverProvider { + fallback: fallback_provider, + conda_python_identifiers: &conda_python_packages, + }; + + let resolution = Resolver::new_custom_io( + manifest, + options, + &marker_environment, + PythonRequirement::new(&interpreter, &marker_environment), + &in_memory_index, + provider, + ) + .into_diagnostic() + .context("failed to resolve pypi dependencies")? + .with_reporter(UvReporter::new( + UvReporterOptions::new().with_existing(pb.clone()), + )) + .resolve() + .await + .into_diagnostic() + .context("failed to resolve pypi dependencies")?; + + let resolution = Resolution::from(resolution); + + let database = DistributionDatabase::new( + &context.cache, + &tags, + &context.registry_client, + &build_dispatch, + ); + + let resolution = DistFinder::new( + &tags, + &context.registry_client, + &interpreter, + &flat_index, + build_dispatch.no_binary(), + ) + .resolve(&resolution.requirements()) + .await + .into_diagnostic() + .context("failed to find matching pypi distributions for the resolution")?; + + let mut locked_packages = LockedPypiPackages::with_capacity(resolution.len()); + for dist in resolution.into_distributions() { + // If this refers to a conda package we can skip it + if conda_python_packages.contains_key(dist.name()) { + continue; + } + + let pypi_package_data = match dist { + Dist::Built(dist) => { + let (url, hash) = match &dist { + BuiltDist::Registry(dist) => { + let url = match &dist.file.url { + FileLocation::AbsoluteUrl(url) => { + Url::from_str(url).expect("invalid absolute url") + } + FileLocation::Path(path) => { + Url::from_file_path(path).expect("invalid path") + } + _ => todo!("unsupported URL"), + }; + + let hash = + parse_hashes_from_hex(&dist.file.hashes.sha256, &dist.file.hashes.md5); + + (url, hash) + } + BuiltDist::DirectUrl(dist) => (dist.url.to_url(), None), + BuiltDist::Path(dist) => (dist.url.to_url(), None), + }; + + let metadata = context + .registry_client + .wheel_metadata(&dist) + .await + .expect("failed to get wheel metadata"); + PypiPackageData { + name: metadata.name, + version: metadata.version, + requires_dist: metadata.requires_dist, + requires_python: metadata.requires_python, + url, + hash, + } + } + Dist::Source(source) => { + let hash = source + .file() + .and_then(|file| parse_hashes_from_hex(&file.hashes.sha256, &file.hashes.md5)); + + let (metadata, url) = database + .get_or_build_wheel_metadata(&Dist::Source(source.clone())) + .await + .into_diagnostic()?; + + // Use the precise url if we got it back + // otherwise try to construct it from the source + let url = if let Some(url) = url { + url + } else { + match source { + SourceDist::Registry(reg) => match ®.file.url { + FileLocation::AbsoluteUrl(url) => { + Url::from_str(url).expect("invalid absolute url") + } + FileLocation::Path(path) => { + Url::from_file_path(path).expect("invalid path") + } + _ => todo!("unsupported URL"), + }, + SourceDist::DirectUrl(direct) => direct.url.to_url(), + SourceDist::Git(git) => git.url.to_url(), + SourceDist::Path(path) => path.url.to_url(), + } + }; - let pkg_env = PypiPackageEnvironmentData { - extras: python_artifact - .extras - .into_iter() - .map(|e| e.as_str().to_string()) - .collect(), + PypiPackageData { + name: metadata.name, + version: metadata.version, + requires_dist: metadata.requires_dist, + requires_python: metadata.requires_python, + url, + hash, + } + } }; - locked_packages.push((pkg_data, pkg_env)); + // TODO: Store extras in the lock-file + locked_packages.push((pypi_package_data, PypiPackageEnvironmentData::default())); } Ok(locked_packages) diff --git a/src/lock_file/satisfiability.rs b/src/lock_file/satisfiability.rs index 3068c66a6..eab830e68 100644 --- a/src/lock_file/satisfiability.rs +++ b/src/lock_file/satisfiability.rs @@ -9,12 +9,12 @@ use pep440_rs::VersionSpecifiers; use pep508_rs::Requirement; use rattler_conda_types::{MatchSpec, ParseMatchSpecError, Platform}; use rattler_lock::{CondaPackage, Package, PypiPackage}; -use rip::types::NormalizedPackageName; use std::{ collections::{HashMap, HashSet}, str::FromStr, }; use thiserror::Error; +use uv_normalize::PackageName; #[derive(Debug, Error, Diagnostic)] pub enum EnvironmentUnsat { @@ -39,8 +39,8 @@ pub enum PlatformUnsat { #[error("there are more conda packages in the lock-file than are used by the environment")] TooManyCondaPackages, - #[error("there are more pypi packages in the lock-file than are used by the environment")] - TooManyPypiPackages, + #[error("there are more pypi packages in the lock-file than are used by the environment: {}", .0.iter().format(", "))] + TooManyPypiPackages(Vec), #[error("there are PyPi dependencies but a python interpreter is missing from the lock-file")] MissingPythonInterpreter, @@ -51,7 +51,7 @@ pub enum PlatformUnsat { FailedToDetermineMarkerEnvironment(#[source] Box), #[error("{0} requires python version {1} but the python interpreter in the lock-file has version {2}")] - PythonVersionMismatch(String, VersionSpecifiers, Box), + PythonVersionMismatch(PackageName, VersionSpecifiers, Box), } /// Verifies that all the requirements of the specified `environment` can be satisfied with the @@ -249,14 +249,19 @@ pub fn verify_pypi_platform_satisfiability( .iter() .flat_map(|(name, reqs)| { reqs.iter() - .map(move |req| (req.as_pep508(name), "")) + .map(move |req| (req.as_pep508(name.as_normalized()), "")) }) .collect_vec(); // If there are no pypi packages specified in the requirement, we can skip verifying them. if requirements.is_empty() { return if !locked_pypi_environment.is_empty() { - Err(PlatformUnsat::TooManyPypiPackages) + Err(PlatformUnsat::TooManyPypiPackages( + locked_pypi_environment + .iter() + .map(|p| p.data().package.name.clone()) + .collect(), + )) } else { Ok(()) }; @@ -270,7 +275,7 @@ pub fn verify_pypi_platform_satisfiability( let mut name_to_package_identifiers = HashMap::new(); for (idx, (identifier, _)) in package_identifiers.iter().enumerate() { name_to_package_identifiers - .entry(identifier.name.clone()) + .entry(identifier.name.as_normalized()) .or_insert_with(Vec::new) .push(idx); } @@ -298,18 +303,9 @@ pub fn verify_pypi_platform_satisfiability( // Iterate over all the requirements and find a packages that match the requirements. while let Some((requirement, source)) = requirements.pop() { - // Convert the name to a normalized string. If the name is not valid, we also won't be able - // to satisfy the requirement. - let Ok(name) = NormalizedPackageName::from_str(requirement.name.as_str()) else { - return Err(PlatformUnsat::UnsatisfiableRequirement( - requirement, - source.to_string(), - )); - }; - // Look-up the identifier that matches the requirement let matched_package = name_to_package_identifiers - .get(&name) + .get(&requirement.name) .into_iter() .flat_map(|idxs| idxs.iter().map(|idx| &package_identifiers[*idx])) .find(|(identifier, _pypi_package_idx)| identifier.satisfies(&requirement)); @@ -350,10 +346,7 @@ pub fn verify_pypi_platform_satisfiability( // Loop over all requirements of the package and add them to the queue. for dependency in pkg_data.requires_dist.iter() { // Skip this requirement if it does not apply. - if !dependency.evaluate_markers( - &marker_environment, - requirement.extras.clone().unwrap_or_default(), - ) { + if !dependency.evaluate_markers(&marker_environment, &requirement.extras) { continue; } @@ -364,13 +357,17 @@ pub fn verify_pypi_platform_satisfiability( // Add the requirement to the queue. requirements_visited.insert(dependency.clone()); - requirements.push((dependency.clone(), &pkg_data.name)); + requirements.push((dependency.clone(), pkg_data.name.as_ref())); } } // Make sure we don't have more packages than we need. if packages_visited.len() != locked_pypi_environment.len() { - return Err(PlatformUnsat::TooManyPypiPackages); + let extraneous_packages = HashSet::from_iter(0..locked_pypi_environment.len()) + .difference(&packages_visited) + .map(|idx| locked_pypi_environment[*idx].data().package.name.clone()) + .collect_vec(); + return Err(PlatformUnsat::TooManyPypiPackages(extraneous_packages)); } Ok(()) diff --git a/src/lock_file/update.rs b/src/lock_file/update.rs index 116568e82..4f43955f7 100644 --- a/src/lock_file/update.rs +++ b/src/lock_file/update.rs @@ -1,3 +1,4 @@ +use crate::lock_file::UvResolutionContext; use crate::project::grouped_environment::GroupedEnvironmentName; use crate::{ config, consts, @@ -12,6 +13,7 @@ use crate::{ prefix::Prefix, progress::global_multi_progress, project::{grouped_environment::GroupedEnvironment, Environment}, + pypi_name_mapping, repodata::fetch_sparse_repodata_targets, utils::BarrierCell, EnvironmentName, Project, @@ -25,7 +27,6 @@ use rattler::package_cache::PackageCache; use rattler_conda_types::{Channel, MatchSpec, PackageName, Platform, RepoDataRecord}; use rattler_lock::{LockFile, PypiPackageData, PypiPackageEnvironmentData}; use rattler_repodata_gateway::sparse::SparseRepoData; -use rip::resolve::solve_options::SDistResolution; use std::{ borrow::Cow, collections::{HashMap, HashSet}, @@ -70,6 +71,8 @@ pub struct UpdateLockFileOptions { /// A struct that holds the lock-file and any potential derived data that was computed when calling /// `ensure_up_to_date_lock_file`. pub struct LockFileDerivedData<'p> { + pub project: &'p Project, + /// The lock-file pub lock_file: LockFile, @@ -84,6 +87,9 @@ pub struct LockFileDerivedData<'p> { /// A list of prefixes that have been updated while resolving all dependencies. pub updated_pypi_prefixes: HashMap, Prefix>, + + /// The cached uv context + pub uv_context: Option, } impl<'p> LockFileDerivedData<'p> { @@ -95,13 +101,22 @@ impl<'p> LockFileDerivedData<'p> { // Get the prefix with the conda packages installed. let platform = Platform::current(); - let package_db = environment.project().pypi_package_db()?; let (prefix, python_status) = self.conda_prefix(environment).await?; let repodata_records = self .repodata_records(environment, platform) .unwrap_or_default(); let pypi_records = self.pypi_records(environment, platform).unwrap_or_default(); + let uv_context = match &self.uv_context { + None => { + let context = UvResolutionContext::from_project(self.project)?; + self.uv_context = Some(context.clone()); + context + } + Some(context) => context.clone(), + }; + + // TODO(tim): get support for this somehow with uv let env_variables = environment.project().get_env_variables(environment).await?; // Update the prefix with Pypi records @@ -109,13 +124,12 @@ impl<'p> LockFileDerivedData<'p> { environment.name(), &prefix, platform, - package_db, &repodata_records, &pypi_records, &python_status, &environment.system_requirements(), - SDistResolution::default(), - env_variables.clone(), + uv_context, + env_variables, ) .await?; @@ -407,11 +421,13 @@ pub async fn ensure_up_to_date_lock_file( tracing::info!("skipping check if lock-file is up-to-date"); return Ok(LockFileDerivedData { + project, lock_file, package_cache, repo_data: options.existing_repo_data, updated_conda_prefixes: Default::default(), updated_pypi_prefixes: Default::default(), + uv_context: None, }); } @@ -422,11 +438,13 @@ pub async fn ensure_up_to_date_lock_file( // If no-environment is outdated we can return early. return Ok(LockFileDerivedData { + project, lock_file, package_cache, repo_data: options.existing_repo_data, updated_conda_prefixes: Default::default(), updated_pypi_prefixes: Default::default(), + uv_context: None, }); } @@ -717,6 +735,7 @@ pub async fn ensure_up_to_date_lock_file( } // Spawn tasks to update the pypi packages. + let mut uv_context = None; for (environment, platform) in outdated .pypi .into_iter() @@ -754,16 +773,25 @@ pub async fn ensure_up_to_date_lock_file( .get_conda_prefix(&group) .expect("prefix should be available now or in the future"); + // Get the uv context + let uv_context = match &uv_context { + None => { + let context = UvResolutionContext::from_project(project)?; + uv_context = Some(context.clone()); + context + } + Some(context) => context.clone(), + }; // Get environment variables from the activation let env_variables = project.get_env_variables(&environment).await?; // Spawn a task to solve the pypi environment let pypi_solve_future = spawn_solve_pypi_task( + uv_context, group.clone(), platform, repodata_future, prefix_future, - SDistResolution::default(), env_variables, ); @@ -1008,12 +1036,14 @@ pub async fn ensure_up_to_date_lock_file( top_level_progress.finish_and_clear(); Ok(LockFileDerivedData { + project, lock_file, package_cache, updated_conda_prefixes: context.take_instantiated_conda_prefixes(), updated_pypi_prefixes: HashMap::default(), repo_data: Arc::into_inner(context.repo_data) .expect("repo data should not be shared anymore"), + uv_context, }) } @@ -1119,7 +1149,7 @@ async fn spawn_solve_conda_environment_task( // Add purl's for the conda packages that are also available as pypi packages if we need them. if has_pypi_dependencies { - lock_file::pypi::amend_pypi_purls(&mut records).await?; + pypi_name_mapping::amend_pypi_purls(&mut records).await?; } // Turn the records into a map by name @@ -1211,13 +1241,16 @@ async fn spawn_extract_pypi_environment_task( .iter() .filter_map(|record| PypiPackageIdentifier::from_record(record).ok()) .flatten() - .map(|identifier| (identifier.name.clone().into(), identifier)) + .map(|identifier| (identifier.name.as_normalized().clone(), identifier)) .collect::>(); Arc::new( - solve_group_records - .await - .subset(dependencies.into_keys(), &conda_package_identifiers), + solve_group_records.await.subset( + dependencies + .into_keys() + .map(|name| name.as_normalized().clone()), + &conda_package_identifiers, + ), ) } }; @@ -1231,11 +1264,11 @@ async fn spawn_extract_pypi_environment_task( /// A task that solves the pypi dependencies for a given environment. async fn spawn_solve_pypi_task( + resolution_context: UvResolutionContext, environment: GroupedEnvironment<'_>, platform: Platform, repodata_records: impl Future>, prefix: impl Future, - sdist_resolution: SDistResolution, env_variables: &HashMap, ) -> miette::Result { // Get the Pypi dependencies for this environment @@ -1252,61 +1285,67 @@ async fn spawn_solve_pypi_task( // Get the system requirements for this environment let system_requirements = environment.system_requirements(); - // Get the package database - let package_db = environment.project().pypi_package_db()?; - // Wait until the conda records and prefix are available. let (repodata_records, (prefix, python_status)) = tokio::join!(repodata_records, prefix); let environment_name = environment.name().clone(); + // let (pypi_packages, duration) = tokio::spawn( + let (pypi_packages, duration) = async move { + let pb = SolveProgressBar::new( + global_multi_progress().add(ProgressBar::hidden()), + platform, + environment_name.clone(), + ); + pb.start(); - let envs = env_variables.clone(); + let python_path = python_status + .location() + .map(|path| prefix.root().join(path)) + .ok_or_else(|| miette::miette!("missing python interpreter from environment"))?; - let (pypi_packages, duration) = tokio::spawn( - async move { - let pb = SolveProgressBar::new( - global_multi_progress().add(ProgressBar::hidden()), - platform, - environment_name, - ); - pb.start(); + let start = Instant::now(); - let start = Instant::now(); - - let records = lock_file::resolve_pypi( - package_db, - dependencies, - system_requirements, - &repodata_records.records, - &[], - platform, - &pb.pb, - python_status - .location() - .map(|path| prefix.root().join(path)) - .as_deref(), - sdist_resolution, - envs, + let records = lock_file::resolve_pypi( + resolution_context, + dependencies + .into_iter() + .map(|(name, requirement)| (name.as_normalized().clone(), requirement)) + .collect(), + system_requirements, + &repodata_records.records, + &[], + platform, + &pb.pb, + &python_path, + env_variables, + ) + .await + .with_context(|| { + format!( + "failed to solve the pypi requirements of '{}' '{}'", + environment_name.fancy_display(), + consts::PLATFORM_STYLE.apply_to(platform) ) - .await?; + })?; - let end = Instant::now(); + let end = Instant::now(); - pb.finish(); + pb.finish(); - Ok((PypiRecordsByName::from_iter(records), end - start)) - } - .instrument(tracing::info_span!( - "resolve_pypi", - group = %environment.name().as_str(), - platform = %platform - )), - ) - .await - .unwrap_or_else(|e| match e.try_into_panic() { - Ok(panic) => std::panic::resume_unwind(panic), - Err(_err) => Err(miette::miette!("the operation was cancelled")), - })?; + Ok::<(_, _), miette::Report>((PypiRecordsByName::from_iter(records), end - start)) + } + .instrument(tracing::info_span!( + "resolve_pypi", + group = %environment.name().as_str(), + platform = %platform + )) + .await?; + // ) + // .await + // .unwrap_or_else(|e| match e.try_into_panic() { + // Ok(panic) => std::panic::resume_unwind(panic), + // Err(_err) => Err(miette::miette!("the operation was cancelled")), + // })?; Ok(TaskResult::PypiGroupSolved( environment.name().clone(), diff --git a/src/progress.rs b/src/progress.rs index 485b00e00..8b8e1dbc2 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -138,15 +138,30 @@ impl ScopedTask { } self.pb.clone() } + /// Finishes the execution of the task. + pub fn finish_sync(mut self) -> ProgressBar { + // Send the finished operation. If this fails the receiving end was most likely already + // closed and we can just ignore the error. + if let Some(sender) = self.sender.take() { + let _ = sender.try_send(Operation::Finished(std::mem::take(&mut self.name))); + } + self.pb.clone() + } } impl ProgressBarMessageFormatter { /// Construct a new instance that will update the given progress bar. pub fn new(progress_bar: ProgressBar) -> Self { + Self::new_with_capacity(progress_bar, 50) + } + + /// Construct a new instance that will update the given progress bar. + /// Allows the user to specify a custom capacity for the internal channel. + pub fn new_with_capacity(progress_bar: ProgressBar, capacity: usize) -> Self { let pb = progress_bar.clone(); - let (tx, mut rx) = channel::(20); + let (tx, mut rx) = channel::(capacity); tokio::spawn(async move { - let mut pending = VecDeque::with_capacity(20); + let mut pending = VecDeque::with_capacity(capacity); while let Some(msg) = rx.recv().await { match msg { Operation::Started(op) => pending.push_back(op), @@ -163,7 +178,11 @@ impl ProgressBarMessageFormatter { } else if pending.len() == 1 { progress_bar.set_message(pending[0].clone()); } else { - progress_bar.set_message(format!("{} (+{})", pending[0], pending.len() - 1)); + progress_bar.set_message(format!( + "{} (+{})", + pending.back().unwrap(), + pending.len() - 1 + )); } } }); @@ -190,6 +209,20 @@ impl ProgressBarMessageFormatter { } } + /// Adds the start of another task to the progress bar and returns an object that is used to + /// mark the lifetime of the task. If the object is dropped the task is considered finished. + #[must_use] + pub fn start_sync(&self, op: String) -> ScopedTask { + self.sender + .try_send(Operation::Started(op.clone())) + .expect("could not send operation, channel full or closed"); + ScopedTask { + name: op, + sender: Some(self.sender.clone()), + pb: self.pb.clone(), + } + } + /// Wraps an future into a task which starts when the task starts and ends when the future /// returns. pub async fn wrap>(&self, name: impl Into, fut: F) -> T { diff --git a/src/project/environment.rs b/src/project/environment.rs index b92959e1b..e9506fb81 100644 --- a/src/project/environment.rs +++ b/src/project/environment.rs @@ -4,6 +4,7 @@ use super::{ manifest::{self, EnvironmentName, Feature, FeatureName, SystemRequirements}, PyPiRequirement, SolveGroup, SpecType, }; +use crate::project::manifest::python::PyPiPackageName; use crate::task::TaskName; use crate::{task::Task, Project}; use indexmap::{IndexMap, IndexSet}; @@ -287,7 +288,7 @@ impl<'p> Environment<'p> { pub fn pypi_dependencies( &self, platform: Option, - ) -> IndexMap> { + ) -> IndexMap> { self.features(true) .filter_map(|f| f.pypi_dependencies(platform)) .fold(IndexMap::default(), |mut acc, deps| { diff --git a/src/project/grouped_environment.rs b/src/project/grouped_environment.rs index 60e69325b..849158ef7 100644 --- a/src/project/grouped_environment.rs +++ b/src/project/grouped_environment.rs @@ -1,3 +1,4 @@ +use crate::project::manifest::python::PyPiPackageName; use crate::project::manifest::Feature; use crate::{ consts, @@ -109,7 +110,7 @@ impl<'p> GroupedEnvironment<'p> { pub fn pypi_dependencies( &self, platform: Option, - ) -> IndexMap> { + ) -> IndexMap> { match self { GroupedEnvironment::Group(group) => group.pypi_dependencies(platform), GroupedEnvironment::Environment(env) => env.pypi_dependencies(platform), diff --git a/src/project/manifest/feature.rs b/src/project/manifest/feature.rs index 319f8b5e2..f95cf0dfa 100644 --- a/src/project/manifest/feature.rs +++ b/src/project/manifest/feature.rs @@ -1,6 +1,7 @@ use super::{Activation, PyPiRequirement, SystemRequirements, Target, TargetSelector}; use crate::consts; use crate::project::manifest::channel::{PrioritizedChannel, TomlPrioritizedChannelStrOrMap}; +use crate::project::manifest::python::PyPiPackageName; use crate::project::manifest::target::Targets; use crate::project::manifest::{deserialize_opt_package_map, deserialize_package_map}; use crate::project::SpecType; @@ -176,7 +177,7 @@ impl Feature { pub fn pypi_dependencies( &self, platform: Option, - ) -> Option>> { + ) -> Option>> { self.targets .resolve(platform) // Get the targets in reverse order, from least specific to most specific. @@ -244,7 +245,7 @@ impl<'de> Deserialize<'de> for Feature { build_dependencies: Option>, #[serde(default)] - pypi_dependencies: Option>, + pypi_dependencies: Option>, /// Additional information to activate an environment. #[serde(default)] diff --git a/src/project/manifest/mod.rs b/src/project/manifest/mod.rs index 15eed8a17..2425482bc 100644 --- a/src/project/manifest/mod.rs +++ b/src/project/manifest/mod.rs @@ -4,13 +4,14 @@ mod environment; mod error; mod feature; mod metadata; -mod python; +pub(crate) mod python; mod system_requirements; mod target; mod validation; use crate::project::manifest::channel::PrioritizedChannel; use crate::project::manifest::environment::TomlEnvironmentMapOrSeq; +use crate::project::manifest::python::PyPiPackageName; use crate::task::TaskName; use crate::{consts, project::SpecType, task::Task, utils::spanned::PixiSpanned}; pub use activation::Activation; @@ -354,7 +355,7 @@ impl Manifest { // Check for duplicates. if let Some(table_spec) = dependency_table.get(name.as_normalized()) { - if table_spec.as_value().and_then(|v| v.as_str()) == Some(&spec.to_string()) { + if table_spec.as_value().and_then(|v| v.as_str()) == Some(spec.to_string().as_str()) { return Err(miette::miette!( "{} is already added.", console::style(name.as_normalized()).bold(), @@ -382,7 +383,7 @@ impl Manifest { pub fn add_pypi_dependency( &mut self, - name: &rip::types::PackageName, + name: &PyPiPackageName, requirement: &PyPiRequirement, platform: Option, ) -> miette::Result<()> { @@ -395,17 +396,17 @@ impl Manifest { )?; // Check for duplicates. - if let Some(table_spec) = dependency_table.get(name.as_str()) { + if let Some(table_spec) = dependency_table.get(name.as_source()) { if table_spec.to_string().trim() == requirement.to_string() { return Err(miette::miette!( "{} is already added.", - console::style(name.as_source_str()).bold(), + console::style(name.as_source()).bold(), )); } } // Add the pypi dependency to the table - dependency_table.insert(name.as_str(), (*requirement).clone().into()); + dependency_table.insert(name.as_source(), (*requirement).clone().into()); // Add the dependency to the manifest as well self.default_feature_mut() @@ -453,24 +454,24 @@ impl Manifest { /// Removes a pypi dependency from `pixi.toml`. pub fn remove_pypi_dependency( &mut self, - dep: &rip::types::PackageName, + dep: &PyPiPackageName, platform: Option, feature_name: &FeatureName, - ) -> miette::Result<(rip::types::PackageName, PyPiRequirement)> { + ) -> miette::Result<(PyPiPackageName, PyPiRequirement)> { get_or_insert_toml_table( &mut self.document, platform, feature_name, consts::PYPI_DEPENDENCIES, )? - .remove(dep.as_source_str()) + .remove(dep.as_source()) .ok_or_else(|| { let table_name = get_nested_toml_table_name(feature_name, platform, consts::PYPI_DEPENDENCIES); miette::miette!( "Couldn't find {} in [{}]", - console::style(dep.as_source_str()).bold(), + console::style(dep.as_source()).bold(), console::style(table_name).bold(), ) })?; @@ -1028,7 +1029,7 @@ impl<'de> Deserialize<'de> for ProjectManifest { build_dependencies: Option>, #[serde(default)] - pypi_dependencies: Option>, + pypi_dependencies: Option>, /// Additional information to activate an environment. #[serde(default)] @@ -1487,7 +1488,7 @@ mod tests { .clone() .into_iter() .flat_map(|d| d.into_iter()) - .map(|(name, spec)| format!("{} = {}", name.as_source_str(), Item::from(spec))) + .map(|(name, spec)| format!("{} = {}", name.as_source(), Item::from(spec))) .join("\n")); } @@ -1551,7 +1552,7 @@ mod tests { ) { let mut manifest = Manifest::from_str(Path::new(""), file_contents).unwrap(); - let package_name = rip::types::PackageName::from_str(name).unwrap(); + let package_name = PyPiPackageName::from_str(name).unwrap(); // Initially the dependency should exist assert!(manifest @@ -2238,10 +2239,7 @@ platforms = ["linux-64", "win-64"] .pypi_dependencies .as_ref() .unwrap() - .get( - &rip::types::PackageName::from_str("torch") - .expect("torch should be a valid name") - ) + .get(&PyPiPackageName::from_str("torch").expect("torch should be a valid name")) .expect("pypi requirement should be available") .version .clone() diff --git a/src/project/manifest/python.rs b/src/project/manifest/python.rs index 33051949c..33e60d122 100644 --- a/src/project/manifest/python.rs +++ b/src/project/manifest/python.rs @@ -1,13 +1,63 @@ use pep440_rs::VersionSpecifiers; + use serde::{de, de::Error, Deserialize, Deserializer}; use std::{fmt, fmt::Formatter, str::FromStr}; use thiserror::Error; use toml_edit::Item; +use uv_normalize::{ExtraName, InvalidNameError, PackageName}; + +#[derive(Debug, Clone, Eq, PartialEq, Hash)] +pub struct PyPiPackageName { + source: String, + normalized: PackageName, +} +impl<'de> Deserialize<'de> for PyPiPackageName { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + serde_untagged::UntaggedEnumVisitor::new() + .string(|str| PyPiPackageName::from_str(str).map_err(Error::custom)) + .expecting("a string") + .deserialize(deserializer) + } +} + +impl PyPiPackageName { + pub fn from_str(name: &str) -> Result { + Ok(Self { + source: name.to_string(), + normalized: uv_normalize::PackageName::from_str(name)?, + }) + } + pub fn from_normalized(normalized: PackageName) -> Self { + Self { + source: normalized.as_ref().to_string(), + normalized, + } + } + + pub fn as_normalized(&self) -> &PackageName { + &self.normalized + } + + pub fn as_source(&self) -> &str { + &self.source + } +} + +impl FromStr for PyPiPackageName { + type Err = InvalidNameError; + + fn from_str(name: &str) -> Result { + Self::from_str(name) + } +} #[derive(Debug, Clone, Eq, PartialEq)] pub struct PyPiRequirement { pub(crate) version: Option, - pub(crate) extras: Option>, + pub(crate) extras: Option>, pub(crate) index: Option, } @@ -15,7 +65,7 @@ pub struct PyPiRequirement { #[derive(Debug, Clone, Error)] pub enum ParsePyPiRequirementError { #[error("invalid pep440 version specifier")] - Pep440Error(#[from] pep440_rs::Pep440Error), + Pep440Error(#[from] pep440_rs::VersionSpecifiersParseError), #[error("empty string is not allowed, did you mean '*'?")] EmptyStringNotAllowed, @@ -54,7 +104,9 @@ impl From for Item { // Add extras as an array. table.insert( "extras", - toml_edit::Value::Array(toml_edit::Array::from_iter(val.extras.unwrap())), + toml_edit::Value::Array(toml_edit::Array::from_iter( + val.extras.unwrap().iter().map(|e| e.to_string()), + )), ); Item::Value(toml_edit::Value::InlineTable(table)) } else { @@ -110,9 +162,14 @@ impl From for PyPiRequirement { } else { None }; + let extras = if !req.extras.is_empty() { + Some(req.extras) + } else { + None + }; PyPiRequirement { version, - extras: req.extras, + extras, index: None, } } @@ -120,10 +177,10 @@ impl From for PyPiRequirement { impl PyPiRequirement { /// Returns the requirements as [`pep508_rs::Requirement`]s. - pub fn as_pep508(&self, name: &rip::types::PackageName) -> pep508_rs::Requirement { + pub fn as_pep508(&self, name: &uv_normalize::PackageName) -> pep508_rs::Requirement { pep508_rs::Requirement { - name: name.as_str().to_string(), - extras: self.extras.clone(), + name: name.clone(), + extras: self.extras.clone().unwrap_or_default(), version_or_url: self .version .clone() @@ -159,9 +216,18 @@ impl<'de> Deserialize<'de> for PyPiRequirement { ); } }; + let mut extras = Vec::new(); + if let Some(raw_extras) = raw_requirement.extras { + extras = raw_extras + .into_iter() + .map(|e| ExtraName::from_str(&e)) + .collect::, _>>() + .map_err(Error::custom)?; + } + Ok(PyPiRequirement { + extras: Some(extras), version, - extras: raw_requirement.extras, index: raw_requirement.index, }) }) @@ -184,15 +250,19 @@ mod tests { pypi.to_string(), "{ version = \"==1.0.0\", extras = [\"testing\"] }" ); + + let req = pep508_rs::Requirement::from_str("numpy").unwrap(); + let pypi = PyPiRequirement::from(req); + assert_eq!(pypi.to_string(), "\"*\""); } #[test] fn test_only_version() { - let requirement: IndexMap = + let requirement: IndexMap = toml_edit::de::from_str(r#"foo = ">=3.12""#).unwrap(); assert_eq!( requirement.first().unwrap().0, - &rip::types::PackageName::from_str("foo").unwrap() + &uv_normalize::PackageName::from_str("foo").unwrap() ); assert_eq!( requirement.first().unwrap().1, @@ -202,7 +272,7 @@ mod tests { index: None, } ); - let requirement: IndexMap = + let requirement: IndexMap = toml_edit::de::from_str(r#"foo = "==3.12.0""#).unwrap(); assert_eq!( requirement.first().unwrap().1, @@ -213,7 +283,7 @@ mod tests { } ); - let requirement: IndexMap = + let requirement: IndexMap = toml_edit::de::from_str(r#"foo = "~=2.1.3""#).unwrap(); assert_eq!( requirement.first().unwrap().1, @@ -224,7 +294,7 @@ mod tests { } ); - let requirement: IndexMap = + let requirement: IndexMap = toml_edit::de::from_str(r#"foo = "*""#).unwrap(); assert_eq!( requirement.first().unwrap().1, @@ -238,7 +308,7 @@ mod tests { #[test] fn test_extended() { - let requirement: IndexMap = + let requirement: IndexMap = toml_edit::de::from_str( r#" foo = { version=">=3.12", extras = ["bar"], index = "artifact-registry" } @@ -248,31 +318,34 @@ mod tests { assert_eq!( requirement.first().unwrap().0, - &rip::types::PackageName::from_str("foo").unwrap() + &uv_normalize::PackageName::from_str("foo").unwrap() ); assert_eq!( requirement.first().unwrap().1, &PyPiRequirement { version: Some(pep440_rs::VersionSpecifiers::from_str(">=3.12").unwrap()), - extras: Some(vec!("bar".to_string())), + extras: Some(vec![ExtraName::from_str("bar").unwrap()]), index: Some("artifact-registry".to_string()), } ); - let requirement: IndexMap = + let requirement: IndexMap = toml_edit::de::from_str( r#"bar = { version=">=3.12,<3.13.0", extras = ["bar", "foo"] }"#, ) .unwrap(); assert_eq!( requirement.first().unwrap().0, - &rip::types::PackageName::from_str("bar").unwrap() + &uv_normalize::PackageName::from_str("bar").unwrap() ); assert_eq!( requirement.first().unwrap().1, &PyPiRequirement { version: Some(pep440_rs::VersionSpecifiers::from_str(">=3.12,<3.13.0").unwrap()), - extras: Some(vec!("bar".to_string(), "foo".to_string())), + extras: Some(vec![ + ExtraName::from_str("bar").unwrap(), + ExtraName::from_str("foo").unwrap() + ]), index: None, } ); @@ -293,7 +366,10 @@ mod tests { pypi_requirement, PyPiRequirement { version: VersionSpecifiers::from_str("==1.2.3").ok(), - extras: Some(vec!["feature1".to_owned(), "feature2".to_owned()]), + extras: Some(vec![ + ExtraName::from_str("feature1").unwrap(), + ExtraName::from_str("feature2").unwrap() + ]), index: None, } ); @@ -330,4 +406,7 @@ mod tests { } ); } + + #[test] + fn test_pypi_package_name() {} } diff --git a/src/project/manifest/target.rs b/src/project/manifest/target.rs index f7cafb6db..8d62b5e43 100644 --- a/src/project/manifest/target.rs +++ b/src/project/manifest/target.rs @@ -1,4 +1,5 @@ use crate::project::manifest::activation::Activation; +use crate::project::manifest::python::PyPiPackageName; use crate::task::TaskName; use crate::utils::spanned::PixiSpanned; use crate::{ @@ -23,7 +24,7 @@ pub struct Target { pub dependencies: HashMap>, /// Specific python dependencies - pub pypi_dependencies: Option>, + pub pypi_dependencies: Option>, /// Additional information to activate an environment. pub activation: Option, @@ -209,7 +210,7 @@ impl<'de> Deserialize<'de> for Target { build_dependencies: Option>, #[serde(default)] - pypi_dependencies: Option>, + pypi_dependencies: Option>, /// Additional information to activate an environment. #[serde(default)] diff --git a/src/project/mod.rs b/src/project/mod.rs index 25d9b47a3..b33227161 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -7,16 +7,16 @@ mod solve_group; pub mod virtual_packages; use async_once_cell::OnceCell as AsyncCell; +use distribution_types::IndexLocations; use indexmap::{Equivalent, IndexMap, IndexSet}; use miette::{IntoDiagnostic, NamedSource, WrapErr}; -use once_cell::sync::OnceCell; use rattler_conda_types::{Channel, GenericVirtualPackage, Platform, Version}; use rattler_networking::AuthenticationMiddleware; +use reqwest::Client; use reqwest_middleware::ClientWithMiddleware; -use rip::index::PackageSources; -use rip::{index::PackageDb, normalize_index_url}; use std::hash::Hash; + use std::{ collections::{HashMap, HashSet}, env, @@ -31,15 +31,15 @@ use crate::activation::{get_environment_variables, run_activation}; use crate::project::grouped_environment::GroupedEnvironment; use crate::task::TaskName; use crate::{ - config, consts::{self, PROJECT_MANIFEST}, task::Task, }; +use manifest::{EnvironmentName, Manifest, PyPiRequirement, SystemRequirements}; + +use crate::project::manifest::python::PyPiPackageName; pub use dependencies::Dependencies; pub use environment::Environment; -use manifest::{EnvironmentName, Manifest, PyPiRequirement, SystemRequirements}; pub use solve_group::SolveGroup; -use url::Url; use self::manifest::Environments; @@ -94,8 +94,6 @@ impl SpecType { pub struct Project { /// Root folder of the project root: PathBuf, - /// The PyPI package db for this project - package_db: OnceCell>, /// Reqwest client shared for this project client: reqwest::Client, /// Authenticated reqwest client shared for this project @@ -127,7 +125,6 @@ impl Project { Self { root: manifest.path.parent().unwrap_or(Path::new("")).to_owned(), - package_db: Default::default(), client, authenticated_client, manifest, @@ -194,13 +191,21 @@ impl Project { let env_vars = Project::init_env_vars(&manifest.parsed.environments); + let timeout = 5 * 60; + let client = Client::builder() + .pool_max_idle_per_host(20) + .timeout(std::time::Duration::from_secs(timeout)) + .build() + .expect("failed to create reqwest Client"); + + let authenticated_client = reqwest_middleware::ClientBuilder::new(client.clone()) + .with_arc(Arc::new(AuthenticationMiddleware::default())) + .build(); + Ok(Self { root: root.to_owned(), - package_db: Default::default(), - client: Default::default(), - authenticated_client: reqwest_middleware::ClientBuilder::new(reqwest::Client::new()) - .with_arc(Arc::new(AuthenticationMiddleware::default())) - .build(), + client, + authenticated_client, manifest, env_vars, }) @@ -388,7 +393,7 @@ impl Project { pub fn pypi_dependencies( &self, platform: Option, - ) -> IndexMap> { + ) -> IndexMap> { self.default_environment().pypi_dependencies(platform) } @@ -405,26 +410,27 @@ impl Project { self.manifest.has_pypi_dependencies() } - /// Returns the Python index URLs to use for this project. - pub fn pypi_index_url(&self) -> Url { - normalize_index_url(Url::parse("https://pypi.org/simple/").unwrap()) - } - - /// Returns the package database used for caching python metadata, wheels and more. See the - /// documentation of [`rip::index::PackageDb`] for more information. - pub fn pypi_package_db(&self) -> miette::Result> { - Ok(self - .package_db - .get_or_try_init(|| { - PackageDb::new( - PackageSources::from(self.pypi_index_url()), - self.authenticated_client().clone(), - &config::get_cache_dir()?.join("pypi/"), - ) - .map(Arc::new) - })? - .clone()) - } + /// Returns the Python index locations to use for this project. + pub fn pypi_index_locations(&self) -> IndexLocations { + // TODO: Currently we just default to Pypi always. + IndexLocations::default() + } + + // /// Returns the package database used for caching python metadata, wheels and more. See the + // /// documentation of [`rip::index::PackageDb`] for more information. + // pub fn pypi_package_db(&self) -> miette::Result> { + // Ok(self + // .package_db + // .get_or_try_init(|| { + // PackageDb::new( + // PackageSources::from(self.pypi_index_url()), + // self.authenticated_client().clone(), + // &config::get_cache_dir()?.join("pypi/"), + // ) + // .map(Arc::new) + // })? + // .clone()) + // } /// Returns the reqwest client used for http networking pub fn client(&self) -> &reqwest::Client { diff --git a/src/project/solve_group.rs b/src/project/solve_group.rs index ecdee8a8c..a8c32afaa 100644 --- a/src/project/solve_group.rs +++ b/src/project/solve_group.rs @@ -1,4 +1,5 @@ use super::{manifest, Dependencies, Environment, Project}; +use crate::project::manifest::python::PyPiPackageName; use crate::project::manifest::{PyPiRequirement, SystemRequirements}; use crate::{FeatureName, SpecType}; use indexmap::{IndexMap, IndexSet}; @@ -115,7 +116,7 @@ impl<'p> SolveGroup<'p> { pub fn pypi_dependencies( &self, platform: Option, - ) -> IndexMap> { + ) -> IndexMap> { self.features(true) .filter_map(|f| f.pypi_dependencies(platform)) .fold(IndexMap::default(), |mut acc, deps| { @@ -256,7 +257,7 @@ mod tests { ["a", "b", "c"] .into_iter() .map(PackageName::new_unchecked) - .collect() + .collect::>() ); } } diff --git a/src/lock_file/pypi_name_mapping.rs b/src/pypi_name_mapping.rs similarity index 90% rename from src/lock_file/pypi_name_mapping.rs rename to src/pypi_name_mapping.rs index eecfb8834..fae39c164 100644 --- a/src/lock_file/pypi_name_mapping.rs +++ b/src/pypi_name_mapping.rs @@ -52,11 +52,20 @@ pub async fn conda_pypi_name_mapping() -> miette::Result<&'static HashMap miette::Result<()> { + let conda_forge_mapping = conda_pypi_name_mapping().await?; + for record in conda_packages.iter_mut() { + amend_pypi_purls_for_record(record, conda_forge_mapping)?; + } + Ok(()) +} + /// Updates the specified repodata record to include an optional PyPI package name if it is missing. /// /// This function guesses the PyPI package name from the conda package name if the record refers to /// a conda-forge package. -pub fn amend_pypi_purls( +fn amend_pypi_purls_for_record( record: &mut RepoDataRecord, conda_forge_mapping: &'static HashMap, ) -> miette::Result<()> { diff --git a/src/pypi_tags.rs b/src/pypi_tags.rs index 5f0f609ea..f8dc7bbd5 100644 --- a/src/pypi_tags.rs +++ b/src/pypi_tags.rs @@ -1,9 +1,9 @@ use crate::project::manifest::{LibCSystemRequirement, SystemRequirements}; use crate::project::virtual_packages::{default_glibc_version, default_mac_os_version}; -use itertools::Itertools; -use rattler_conda_types::{PackageRecord, Platform, Version}; -use rip::python_env::{WheelTag, WheelTags}; -use std::str::FromStr; +use miette::{Context, IntoDiagnostic}; +use platform_host::Os; +use platform_tags::Tags; +use rattler_conda_types::{Arch, PackageRecord, Platform}; /// Returns true if the specified record refers to a version/variant of python. pub fn is_python_record(record: impl AsRef) -> bool { @@ -16,329 +16,132 @@ pub fn package_name_is_python(record: &rattler_conda_types::PackageName) -> bool record.as_normalized() == "python" } -/// Returns the compatible tags for the project on the given platform with the given python package. -pub fn project_platform_tags( +pub fn get_pypi_tags( platform: Platform, system_requirements: &SystemRequirements, python_record: &PackageRecord, -) -> WheelTags { - let platforms = project_platforms(platform, system_requirements); - - let mut tags = Vec::new(); - - if python_record.name.as_normalized() == "python" { - tags.append(&mut cpython_tags(&python_record.version, &platforms)); - } else { - todo!("no support for generic tags yet"); - } - - tags.append(&mut compatible_tags(&python_record.version, &platforms).collect()); - - WheelTags::from_iter(tags) -} +) -> miette::Result { + let platform = if platform.is_linux() { + let arch = match platform.arch() { + None => unreachable!("every platform we support has an arch"), + Some(Arch::X86) => platform_host::Arch::X86, + Some(Arch::X86_64) => platform_host::Arch::X86_64, + Some(Arch::Aarch64) => platform_host::Arch::Aarch64, + Some(Arch::ArmV7l) => platform_host::Arch::Armv7L, + Some(Arch::Ppc64le) => platform_host::Arch::Powerpc64Le, + Some(Arch::Ppc64) => platform_host::Arch::Powerpc64, + Some(Arch::S390X) => platform_host::Arch::S390X, + Some(unsupported_arch) => { + miette::bail!("unsupported arch for pypi packages '{unsupported_arch}'") + } + }; -fn project_platforms(platform: Platform, system_requirements: &SystemRequirements) -> Vec { - if platform.is_windows() { - match platform { - Platform::Win32 => vec![String::from("win32")], - Platform::Win64 => vec![String::from("win_amd64")], - Platform::WinArm64 => vec![String::from("win_arm64")], - _ => unreachable!("not windows"), - } - } else if platform.is_linux() { - let max_glibc_version = match system_requirements + // Find the glibc version + match system_requirements .libc .as_ref() .map(LibCSystemRequirement::family_and_version) { - Some((family, version)) if family.eq_ignore_ascii_case("glibc") => version.clone(), - Some(_) => { - // Another libc family is being target. - return Vec::new(); + None => { + let (major, minor) = default_glibc_version() + .as_major_minor() + .expect("expected default glibc version to be a major.minor version"); + platform_host::Platform::new( + Os::Manylinux { + major: major as _, + minor: minor as _, + }, + arch, + ) } - None => default_glibc_version(), - }; - linux_platform_tags(platform, &max_glibc_version) - } else { - let mac_version = system_requirements - .macos - .as_ref() - .map_or_else(|| default_mac_os_version(platform), |v| v.clone()); - mac_platform_tags(platform, &mac_version) - } -} - -pub fn mac_platform_tags(platform: Platform, mac_version: &Version) -> Vec { - let v10_0 = Version::from_str("10.0").unwrap(); - let v11_0 = Version::from_str("11.0").unwrap(); - let (major, minor) = mac_version.as_major_minor().expect("invalid mac version"); - - let mut result = Vec::new(); - - // Prior to macOS 11, each yearly release of macOS bumped the "minor" version number. The - // major version was always 10. - if mac_version >= &v10_0 && mac_version < &v11_0 { - let binary_formats = mac_binary_formats(mac_version, platform); - for (minor, binary_format) in (0..=minor).rev().cartesian_product(binary_formats.iter()) { - result.push(format!("macosx_{major}_{minor}_{binary_format}")); - } - } - - // Starting with macOS 11, each yearly release bumps the major version number. The minor - // versions are no the midyear updates. - if mac_version >= &v11_0 { - let binary_formats = mac_binary_formats(mac_version, platform); - for (major, binary_format) in (11..=major).rev().cartesian_product(binary_formats.iter()) { - result.push(format!("macosx_{major}_{minor}_{binary_format}", minor = 0)); - } - } - - // macOS 11 on x86_64 is compatible with binaries from previous releases. - // Arm64 support was introduced in 11.0, so no Arm binaries from previous releases exist. - // - // However, the "universal2" binary format can have a macOS version earlier than 11.0 when the - // x86_64 part of the binary supports that version of macOS. - if mac_version >= &v11_0 { - for minor in (4..=16).rev() { - let binary_formats = if platform == Platform::Osx64 { - let compatible_version = Version::from_str(&format!("10.{}", minor)).unwrap(); - mac_binary_formats(&compatible_version, platform) - } else { - vec![String::from("universal2")] - }; - for binary_format in binary_formats { - result.push(format!( - "macosx_{major}_{minor}_{binary_format}", - major = 10, - minor = minor, - binary_format = binary_format - )); + Some(("glibc", version)) => { + let Some((major, minor)) = version.as_major_minor() else { + miette::bail!( + "expected glibc version to be a major.minor version, but got '{version}'" + ) + }; + platform_host::Platform::new( + Os::Manylinux { + major: major as _, + minor: minor as _, + }, + arch, + ) + } + Some((family, _)) => { + miette::bail!("unsupported libc family for pypi packages '{family}'"); } } - } - - result -} - -/// Returns a list of compatible binary formats for the specified mac version and platform. -fn mac_binary_formats(mac_version: &Version, platform: Platform) -> Vec { - let mut result = match platform { - Platform::Osx64 => vec![String::from("x86_64")], - Platform::OsxArm64 => vec![String::from("arm64")], - _ => unreachable!("unsupported mac platform: {platform}"), - }; - let v10_4 = Version::from_str("10.4").unwrap(); - - if platform == Platform::Osx64 && mac_version >= &v10_4 { - result.extend([ - String::from("intel"), - String::from("fat64"), - String::from("fat32"), - ]); - } - - if matches!(platform, Platform::Osx64 | Platform::OsxArm64) { - result.push(String::from("universal2")); - } + } else if platform.is_windows() { + let arch = match platform.arch() { + None => unreachable!("every platform we support has an arch"), + Some(Arch::X86) => platform_host::Arch::X86, + Some(Arch::X86_64) => platform_host::Arch::X86_64, + Some(Arch::Aarch64) => platform_host::Arch::Aarch64, + Some(unsupported_arch) => { + miette::bail!("unsupported arch for pypi packages '{unsupported_arch}'") + } + }; - if matches!(platform, Platform::Osx64) { - result.push(String::from("universal")); - } + platform_host::Platform::new(Os::Windows, arch) + } else if platform.is_osx() { + let osx_version = system_requirements + .macos + .clone() + .unwrap_or_else(|| default_mac_os_version(platform)); + let Some((major, minor)) = osx_version.as_major_minor() else { + miette::bail!( + "expected macos version to be a major.minor version, but got '{osx_version}'" + ) + }; - result -} + let arch = match platform.arch() { + None => unreachable!("every platform we support has an arch"), + Some(Arch::X86) => platform_host::Arch::X86, + Some(Arch::X86_64) => platform_host::Arch::X86_64, + Some(Arch::Aarch64) => platform_host::Arch::Aarch64, + Some(unsupported_arch) => { + miette::bail!("unsupported arch for pypi packages '{unsupported_arch}'") + } + }; -/// Returns the platform tags for linux based OS -pub fn linux_platform_tags(platform: Platform, max_glibc_version: &Version) -> Vec { - let arch = match platform { - Platform::Linux32 => "_i686", - Platform::Linux64 => "_x86_64", - Platform::LinuxAarch64 => "_aarch64", - Platform::LinuxArmV7l => "_armv7l", - Platform::LinuxPpc64le => "_ppc64le", - Platform::LinuxPpc64 => "_ppc64", - Platform::LinuxS390X => "_s390x", - Platform::LinuxRiscv32 => return Vec::new(), - Platform::LinuxRiscv64 => return Vec::new(), - Platform::LinuxArmV6l => return Vec::new(), - _ => unreachable!("not linux"), + platform_host::Platform::new( + Os::Macos { + major: major as _, + minor: minor as _, + }, + arch, + ) + } else { + miette::bail!("unsupported platform for pypi packages {platform}") }; - manylinux_versions(max_glibc_version) - .into_iter() - .map(|p| format!("{p}{arch}")) - .collect() -} -// Generate all manylinux tags based on the major minor version of glibc. -fn manylinux_versions(glibc_version: &Version) -> Vec { - let Some((major, minor)) = glibc_version.as_major_minor() else { - return Vec::new(); + // Build the wheel tags based on the interpreter, the target platform, and the python version. + let Some(python_version) = python_record.version.as_major_minor() else { + miette::bail!( + "expected python version to be a major.minor version, but got '{}'", + &python_record.version + ); }; - - let mut result = Vec::new(); - for minor in (0..=minor).rev() { - result.push(format!("manylinux_{major}_{minor}")); - match (major, minor) { - (2, 5) => result.push(String::from("manylinux1")), - (2, 12) => result.push(String::from("manylinux2010")), - (2, 17) => result.push(String::from("manylinux2014")), - _ => {} + let implementation_name = match python_record.name.as_normalized() { + "python" => "cpython", + "pypy" => "pypy", + _ => { + miette::bail!( + "unsupported python implementation '{}'", + python_record.name.as_source() + ); } - } - - result -} - -/// Returns all the tags a specific cpython implementation supports. -pub fn cpython_tags(python_version: &Version, platforms: PIter) -> Vec -where - P: Into, - PIter: IntoIterator, - PIter::IntoIter: Clone, -{ - let Some((major, minor)) = python_version.as_major_minor() else { - return Vec::new(); }; - - let interpreter = format!("cp{major}{minor}"); - let core_abi = format!("cp{}{}", major, minor); - - let mut result = Vec::new(); - let platforms = platforms.into_iter().map(Into::into); - - // Add the core tags - result.extend(platforms.clone().map(|platform| WheelTag { - interpreter: interpreter.clone(), - abi: core_abi.clone(), - platform, - })); - - // Add the "abi3" tags - if python_abi3_applies(major, minor) { - result.extend(platforms.clone().map(|platform| WheelTag { - interpreter: interpreter.clone(), - abi: String::from("abi3"), - platform, - })); - } - - // Add the "none" abi tags - result.extend(platforms.clone().map(|platform| WheelTag { - interpreter: interpreter.clone(), - abi: String::from("none"), - platform, - })); - - // Add other abi3 compatible cpython versions - if python_abi3_applies(major, minor) { - for minor in (2..minor).rev() { - let interpreter = format!("cp{major}{minor}"); - result.extend(platforms.clone().map(|platform| WheelTag { - interpreter: interpreter.clone(), - abi: String::from("abi3"), - platform, - })); - } - } - - result -} - -/// Returns true if the specified Python version supports abi3. PEP 384 was first implemented in -/// Python 3.2. -fn python_abi3_applies(major: u64, minor: u64) -> bool { - major >= 3 && minor >= 2 -} - -/// Returns an iterator that yields all the different versions of the python interpreter. -pub fn py_interpreter_range(python_version: &Version) -> impl Iterator { - let python_version = python_version.as_major_minor(); - - let core_version = python_version - .into_iter() - .map(|(major, minor)| format!("py{major}{minor}")); - let major_version = python_version - .into_iter() - .map(|(major, _)| format!("py{major}")); - let minor_versions = python_version.into_iter().flat_map(|(major, minor)| { - (0..minor) - .rev() - .map(move |minor| format!("py{major}{minor}")) - }); - core_version.chain(major_version).chain(minor_versions) -} - -/// Returns compatible tag for any interpreter. -pub fn compatible_tags<'a, P, PIter>( - python_version: &'a Version, - platforms: PIter, -) -> impl Iterator + 'a -where - P: Into, - PIter: IntoIterator, - PIter::IntoIter: Clone + 'a, -{ - py_interpreter_range(python_version) - .cartesian_product(platforms) - .map(|(interpreter, platform)| WheelTag { - interpreter, - abi: String::from("none"), - platform: platform.into(), - }) - .chain( - py_interpreter_range(python_version).map(|interpreter| WheelTag { - interpreter, - abi: String::from("none"), - platform: String::from("any"), - }), - ) -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_cpython_tags() { - let tags: Vec<_> = cpython_tags(&Version::from_str("3.11.2").unwrap(), vec!["win_amd64"]) - .into_iter() - .map(|t| t.to_string()) - .collect(); - insta::assert_debug_snapshot!(tags); - } - - #[test] - fn test_py_interpreter_range() { - let tags: Vec<_> = py_interpreter_range(&Version::from_str("3.11.2").unwrap()).collect(); - insta::assert_debug_snapshot!(tags); - } - - #[test] - fn test_compatible_tags() { - let tags: Vec<_> = - compatible_tags(&Version::from_str("3.11.2").unwrap(), vec!["win_amd64"]) - .map(|t| t.to_string()) - .collect(); - insta::assert_debug_snapshot!(tags); - } - - #[test] - fn test_linux_platform_tags() { - let tags: Vec<_> = - linux_platform_tags(Platform::Linux64, &Version::from_str("2.17").unwrap()) - .into_iter() - .map(|t| t.to_string()) - .collect(); - insta::assert_debug_snapshot!(tags); - } - - #[test] - fn test_mac_platform_tags() { - let tags: Vec<_> = - mac_platform_tags(Platform::OsxArm64, &Version::from_str("14.0").unwrap()) - .into_iter() - .map(|t| t.to_string()) - .collect(); - insta::assert_debug_snapshot!(tags); - } + let tags = Tags::from_env( + &platform, + (python_version.0 as u8, python_version.1 as u8), + implementation_name, + // TODO: This might not be entirely correct.. + (python_version.0 as u8, python_version.1 as u8), + ) + .into_diagnostic() + .context("failed to determine the python wheel tags for the target platform")?; + + Ok(tags) } diff --git a/src/uv_reporter.rs b/src/uv_reporter.rs new file mode 100644 index 000000000..b33e25dc3 --- /dev/null +++ b/src/uv_reporter.rs @@ -0,0 +1,236 @@ +use crate::progress::{self, ProgressBarMessageFormatter, ScopedTask}; +use distribution_types::{CachedDist, Name, VersionOrUrl}; +use indicatif::ProgressBar; +use itertools::Itertools; +use std::{collections::HashMap, sync::Arc, time::Duration}; +use uv_normalize::PackageName; + +fn create_progress(length: u64, message: &'static str) -> ProgressBar { + // Construct a progress bar to provide some indication on what is currently downloading. + // For instance if we could also show at what speed the downloads are progressing or the total + // size of the downloads that would really help the user I think. + let pb = progress::global_multi_progress().add(ProgressBar::new(length)); + pb.set_style(progress::default_progress_style()); + pb.set_prefix(message); + pb.enable_steady_tick(Duration::from_millis(100)); + pb +} + +pub struct UvReporterOptions { + length: Option, + top_level_message: &'static str, + progress_bar: Option, + starting_tasks: Vec, + capacity: Option, +} + +impl UvReporterOptions { + pub fn new() -> Self { + Self { + length: None, + top_level_message: "", + progress_bar: None, + starting_tasks: Vec::new(), + capacity: None, + } + } + + pub fn with_length(mut self, length: u64) -> Self { + self.length = Some(length); + self + } + + pub fn with_top_level_message(mut self, message: &'static str) -> Self { + self.top_level_message = message; + self + } + + pub fn with_existing(mut self, progress_bar: ProgressBar) -> Self { + self.progress_bar = Some(progress_bar); + self + } + + pub fn with_capacity(mut self, capacity: usize) -> Self { + self.capacity = Some(capacity); + self + } + + pub fn with_starting_tasks(mut self, tasks: impl Iterator) -> Self { + self.starting_tasks = tasks.collect_vec(); + self + } +} + +/// Reports on download progress. +pub struct UvReporter { + pb: ProgressBar, + fmt: ProgressBarMessageFormatter, + scoped_tasks: Arc>>>, + name_to_id: HashMap, +} + +impl UvReporter { + /// Create a new instance that will report on the progress the given uv reporter + /// This uses a set size and message + pub fn new(options: UvReporterOptions) -> Self { + // Use a new progress bar if none was provided. + let pb = if let Some(pb) = options.progress_bar { + pb + } else { + create_progress( + options.length.unwrap_or_default(), + options.top_level_message, + ) + }; + + // Create the formatter + let fmt = ProgressBarMessageFormatter::new_with_capacity( + pb.clone(), + options.capacity.unwrap_or(20), + ); + + let mut name_to_id = std::collections::HashMap::new(); + let mut starting_tasks = vec![]; + // Add the starting tasks + for task in options.starting_tasks { + let scoped_task = fmt.start_sync(task.clone()); + starting_tasks.push(Some(scoped_task)); + name_to_id.insert(task, starting_tasks.len() - 1); + } + + Self { + pb, + fmt, + scoped_tasks: Arc::new(std::sync::Mutex::new(starting_tasks)), + name_to_id, + } + } + + fn lock(&self) -> std::sync::MutexGuard>> { + self.scoped_tasks.lock().expect("progress lock poison") + } + + pub fn start_sync(&self, message: String) -> usize { + let task = self.fmt.start_sync(message); + let mut lock = self.lock(); + lock.push(Some(task)); + lock.len() - 1 + } + + pub fn finish(&self, id: usize) { + let mut lock = self.lock(); + let len = lock.len(); + let task = lock + .get_mut(id) + .unwrap_or_else(|| panic!("progress bar error idx ({id}) > {len}")) + .take(); + if let Some(task) = task { + task.finish_sync(); + } + } + + pub fn finish_all(&self) { + self.pb.finish_and_clear() + } + + pub fn increment_progress(&self) { + self.pb.inc(1); + } +} + +impl uv_installer::DownloadReporter for UvReporter { + fn on_progress(&self, dist: &CachedDist) { + if let Some(id) = self.name_to_id.get(&format!("{}", dist.name())) { + self.finish(*id); + } + self.increment_progress(); + } + + fn on_complete(&self) { + self.finish_all(); + } + + fn on_build_start(&self, dist: &distribution_types::SourceDist) -> usize { + self.start_sync(format!( + "building {}=={}", + dist.name().as_ref(), + dist.version() + .map(|s| s.to_string()) + .unwrap_or_else(|| "unknown".to_string()) + )) + } + + fn on_build_complete(&self, _dist: &distribution_types::SourceDist, id: usize) { + self.finish(id); + } + + fn on_editable_build_start(&self, dist: &distribution_types::LocalEditable) -> usize { + let path = dist.path.file_name(); + if let Some(path) = path { + self.start_sync(format!( + "building editable source {}", + path.to_string_lossy() + )) + } else { + self.start_sync("building editable source".to_string()) + } + } + + fn on_editable_build_complete(&self, _dist: &distribution_types::LocalEditable, id: usize) { + self.finish(id); + } + + fn on_checkout_start(&self, url: &url::Url, _rev: &str) -> usize { + self.start_sync(format!("cloning {}", url)) + } + + fn on_checkout_complete(&self, _url: &url::Url, _rev: &str, index: usize) { + self.finish(index); + } +} + +impl uv_installer::InstallReporter for UvReporter { + fn on_install_progress(&self, wheel: &CachedDist) { + if let Some(id) = self.name_to_id.get(&format!("{}", wheel.name())) { + self.finish(*id); + } + self.increment_progress(); + } + + fn on_install_complete(&self) { + self.finish_all() + } +} + +impl uv_resolver::ResolverReporter for UvReporter { + fn on_progress(&self, name: &PackageName, version: VersionOrUrl) { + self.pb + .set_message(format!("resolving {}{}", name, version)); + } + + fn on_build_start(&self, dist: &distribution_types::SourceDist) -> usize { + self.start_sync(format!( + "building {}=={}", + dist.name().as_ref(), + dist.version() + .map(|s| s.to_string()) + .unwrap_or_else(|| "unknown".to_string()) + )) + } + + fn on_build_complete(&self, _dist: &distribution_types::SourceDist, id: usize) { + self.finish(id); + } + + fn on_checkout_start(&self, url: &url::Url, _rev: &str) -> usize { + self.start_sync(format!("cloning {}", url)) + } + + fn on_checkout_complete(&self, _url: &url::Url, _rev: &str, index: usize) { + self.finish(index); + } + + fn on_complete(&self) { + self.finish_all() + } +} diff --git a/tests/common/mod.rs b/tests/common/mod.rs index ee7e34129..b6bea5f4d 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -105,7 +105,7 @@ impl LockFileExt for LockFile { .into_iter() .flatten() .filter_map(Package::into_pypi) - .any(|pkg| pkg.data().package.name == name); + .any(|pkg| pkg.data().package.name.as_ref() == name); package_found }