diff --git a/.version b/.version index ce73bf7c0..6b856e54b 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -25.08b1 +25.08b5 diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c22bc764a..2571fc27b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -234,6 +234,11 @@ Emmanuel Ferdman Sunong2008 Marvin Kopf Kevin Nakamura +Bradley Szoke +jcznk +Thomas Rixen +Siyuan Mattuwu Yan +Lee Doughty ******************** diff --git a/Cargo.lock b/Cargo.lock index 86787124a..3e7cf36b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -130,7 +130,8 @@ dependencies = [ "prost", "prost-reflect", "pulldown-cmark 0.13.0", - "rand 0.9.1", + "rand 0.9.2", + "rayon", "regex", "reqwest 0.12.20", "rusqlite", @@ -143,7 +144,7 @@ dependencies = [ "serde_tuple", "sha1", "snafu", - "strum 0.27.1", + "strum 0.27.2", "syn 2.0.103", "tempfile", "tokio", @@ -219,7 +220,7 @@ dependencies = [ "prost-types", "serde", "snafu", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] @@ -705,7 +706,7 @@ dependencies = [ "log", "num-traits", "portable-atomic-util", - "rand 0.9.1", + "rand 0.9.2", "rmp-serde", "serde", "serde_json", @@ -731,7 +732,7 @@ dependencies = [ "hashbrown 0.15.4", "log", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "serde", "spin 0.10.0", "text_placeholder", @@ -761,12 +762,12 @@ dependencies = [ "csv", "derive-new 0.7.0", "dirs 6.0.0", - "rand 0.9.1", + "rand 0.9.2", "rmp-serde", "sanitize-filename 0.6.0", "serde", "serde_json", - "strum 0.27.1", + "strum 0.27.2", "tempfile", "thiserror 2.0.12", ] @@ -816,7 +817,7 @@ dependencies = [ "num-traits", "paste", "portable-atomic-util", - "rand 0.9.1", + "rand 0.9.2", "seq-macro", "spin 0.10.0", ] @@ -864,7 +865,7 @@ dependencies = [ "half", "hashbrown 0.15.4", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", "serde", "serde_bytes", @@ -958,7 +959,7 @@ dependencies = [ "memmap2", "num-traits", "num_cpus", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", "rayon", "safetensors", @@ -1402,7 +1403,7 @@ dependencies = [ "log", "num-traits", "portable-atomic", - "rand 0.9.1", + "rand 0.9.2", "sanitize-filename 0.5.0", "serde", "serde_json", @@ -2213,20 +2214,20 @@ dependencies = [ [[package]] name = "fsrs" -version = "4.1.1" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f3a8c3df2c324ebab71461178fe8c1fe2d7373cf603f312b652befd026f06d" +checksum = "04954cc67c3c11ee342a2ee1f5222bf76d73f7772df08d37dc9a6cdd73c467eb" dependencies = [ "burn", "itertools 0.14.0", "log", "ndarray", "priority-queue", - "rand 0.9.1", + "rand 0.9.2", "rayon", "serde", "snafu", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] @@ -2803,7 +2804,7 @@ dependencies = [ "cfg-if", "crunchy", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", "serde", ] @@ -3657,7 +3658,7 @@ dependencies = [ "linkcheck", "regex", "reqwest 0.12.20", - "strum 0.27.1", + "strum 0.27.2", "tokio", ] @@ -3958,6 +3959,7 @@ dependencies = [ "anki_process", "anyhow", "camino", + "serde_json", "walkdir", "which", ] @@ -5095,7 +5097,7 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash 2.1.1", "rustls", @@ -5149,9 +5151,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -5202,7 +5204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.1", + "rand 0.9.2", ] [[package]] @@ -5973,9 +5975,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slotmap" @@ -6112,9 +6114,9 @@ dependencies = [ [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros 0.27.1", ] diff --git a/Cargo.toml b/Cargo.toml index db5753893..27d14ce8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,9 +33,8 @@ git = "https://github.com/ankitects/linkcheck.git" rev = "184b2ca50ed39ca43da13f0b830a463861adb9ca" [workspace.dependencies.fsrs] -version = "4.1.1" +version = "5.1.0" # git = "https://github.com/open-spaced-repetition/fsrs-rs.git" -# rev = "a7f7efc10f0a26b14ee348cc7402155685f2a24f" # path = "../open-spaced-repetition/fsrs-rs" [workspace.dependencies] @@ -110,6 +109,7 @@ prost-types = "0.13" pulldown-cmark = "0.13.0" pyo3 = { version = "0.25.1", features = ["extension-module", "abi3", "abi3-py39"] } rand = "0.9.1" +rayon = "1.10.0" regex = "1.11.1" reqwest = { version = "0.12.20", default-features = false, features = ["json", "socks", "stream", "multipart"] } rusqlite = { version = "0.36.0", features = ["trace", "functions", "collation", "bundled"] } @@ -141,7 +141,7 @@ walkdir = "2.5.0" which = "8.0.0" widestring = "1.1.0" winapi = { version = "0.3", features = ["wincon", "winreg"] } -windows = { version = "0.61.3", features = ["Media_SpeechSynthesis", "Media_Core", "Foundation_Collections", "Storage_Streams", "Win32_System_Console", "Win32_System_Registry", "Win32_Foundation", "Win32_UI_Shell"] } +windows = { version = "0.61.3", features = ["Media_SpeechSynthesis", "Media_Core", "Foundation_Collections", "Storage_Streams", "Win32_System_Console", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_Foundation", "Win32_UI_Shell", "Wdk_System_SystemServices"] } wiremock = "0.6.3" xz2 = "0.1.7" zip = { version = "4.1.0", default-features = false, features = ["deflate", "time"] } diff --git a/build/configure/src/rust.rs b/build/configure/src/rust.rs index 758752fa6..906ecd37e 100644 --- a/build/configure/src/rust.rs +++ b/build/configure/src/rust.rs @@ -169,7 +169,7 @@ fn build_rsbridge(build: &mut Build) -> Result<()> { pub fn check_rust(build: &mut Build) -> Result<()> { let inputs = inputs![ - glob!("{rslib/**,pylib/rsbridge/**,ftl/**,build/**,qt/launcher/**}"), + glob!("{rslib/**,pylib/rsbridge/**,ftl/**,build/**,qt/launcher/**,tools/minilints/**}"), "Cargo.lock", "Cargo.toml", "rust-toolchain.toml", diff --git a/build/runner/src/pyenv.rs b/build/runner/src/pyenv.rs index d64c8fb3f..efd58fd91 100644 --- a/build/runner/src/pyenv.rs +++ b/build/runner/src/pyenv.rs @@ -32,10 +32,19 @@ pub fn setup_pyenv(args: PyenvArgs) { } } + let mut command = Command::new(args.uv_bin); + + // remove UV_* environment variables to avoid interference + for (key, _) in std::env::vars() { + if key.starts_with("UV_") || key == "VIRTUAL_ENV" { + command.env_remove(key); + } + } + run_command( - Command::new(args.uv_bin) + command .env("UV_PROJECT_ENVIRONMENT", args.pyenv_folder.clone()) - .args(["sync", "--locked"]) + .args(["sync", "--locked", "--no-config"]) .args(args.extra_args), ); diff --git a/cargo/licenses.json b/cargo/licenses.json index f2695ac76..4eeaeed51 100644 --- a/cargo/licenses.json +++ b/cargo/licenses.json @@ -1,5744 +1,5106 @@ [ { - "name": "addr2line", - "version": "0.24.2", "authors": null, - "repository": "https://github.com/gimli-rs/addr2line", + "description": "A cross-platform symbolication library written in Rust, using `gimli`", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A cross-platform symbolication library written in Rust, using `gimli`" + "name": "addr2line", + "repository": "https://github.com/gimli-rs/addr2line" }, { - "name": "adler2", - "version": "2.0.1", "authors": "Jonas Schievink |oyvindln ", - "repository": "https://github.com/oyvindln/adler2", + "description": "A simple clean-room implementation of the Adler-32 checksum", "license": "0BSD OR Apache-2.0 OR MIT", "license_file": null, - "description": "A simple clean-room implementation of the Adler-32 checksum" + "name": "adler2", + "repository": "https://github.com/oyvindln/adler2" }, { - "name": "ahash", - "version": "0.8.12", "authors": "Tom Kaitchuck ", - "repository": "https://github.com/tkaitchuck/ahash", + "description": "A non-cryptographic hash function using AES-NI for high performance", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A non-cryptographic hash function using AES-NI for high performance" + "name": "ahash", + "repository": "https://github.com/tkaitchuck/ahash" }, { - "name": "aho-corasick", - "version": "1.1.3", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/aho-corasick", + "description": "Fast multiple substring searching.", "license": "MIT OR Unlicense", "license_file": null, - "description": "Fast multiple substring searching." + "name": "aho-corasick", + "repository": "https://github.com/BurntSushi/aho-corasick" }, { - "name": "allocator-api2", - "version": "0.2.21", "authors": "Zakarum ", - "repository": "https://github.com/zakarumych/allocator-api2", + "description": "Mirror of Rust's allocator API", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Mirror of Rust's allocator API" + "name": "allocator-api2", + "repository": "https://github.com/zakarumych/allocator-api2" }, { - "name": "ammonia", - "version": "4.1.0", "authors": "Michael Howell ", - "repository": "https://github.com/rust-ammonia/ammonia", + "description": "HTML Sanitization", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "HTML Sanitization" + "name": "ammonia", + "repository": "https://github.com/rust-ammonia/ammonia" }, { - "name": "android-tzdata", - "version": "0.1.1", "authors": "RumovZ", - "repository": "https://github.com/RumovZ/android-tzdata", + "description": "Parser for the Android-specific tzdata file", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Parser for the Android-specific tzdata file" + "name": "android-tzdata", + "repository": "https://github.com/RumovZ/android-tzdata" }, { - "name": "android_system_properties", - "version": "0.1.5", "authors": "Nicolas Silva ", - "repository": "https://github.com/nical/android_system_properties", + "description": "Minimal Android system properties wrapper", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Minimal Android system properties wrapper" + "name": "android_system_properties", + "repository": "https://github.com/nical/android_system_properties" }, { + "authors": "Ankitects Pty Ltd and contributors ", + "description": "Anki's Rust library code", + "license": "AGPL-3.0-or-later", + "license_file": null, "name": "anki", - "version": "0.0.0", - "authors": "Ankitects Pty Ltd and contributors ", - "repository": null, - "license": "AGPL-3.0-or-later", - "license_file": null, - "description": "Anki's Rust library code" + "repository": null }, { + "authors": "Ankitects Pty Ltd and contributors ", + "description": "Anki's Rust library i18n code", + "license": "AGPL-3.0-or-later", + "license_file": null, "name": "anki_i18n", - "version": "0.0.0", - "authors": "Ankitects Pty Ltd and contributors ", - "repository": null, - "license": "AGPL-3.0-or-later", - "license_file": null, - "description": "Anki's Rust library i18n code" + "repository": null }, { + "authors": "Ankitects Pty Ltd and contributors ", + "description": "Utils for better I/O error reporting", + "license": "AGPL-3.0-or-later", + "license_file": null, "name": "anki_io", - "version": "0.0.0", - "authors": "Ankitects Pty Ltd and contributors ", - "repository": null, - "license": "AGPL-3.0-or-later", - "license_file": null, - "description": "Utils for better I/O error reporting" + "repository": null }, { + "authors": "Ankitects Pty Ltd and contributors ", + "description": "Anki's Rust library protobuf code", + "license": "AGPL-3.0-or-later", + "license_file": null, "name": "anki_proto", - "version": "0.0.0", - "authors": "Ankitects Pty Ltd and contributors ", - "repository": null, - "license": "AGPL-3.0-or-later", - "license_file": null, - "description": "Anki's Rust library protobuf code" + "repository": null }, { + "authors": "Ankitects Pty Ltd and contributors ", + "description": "Helpers for interface code generation", + "license": "AGPL-3.0-or-later", + "license_file": null, "name": "anki_proto_gen", - "version": "0.0.0", - "authors": "Ankitects Pty Ltd and contributors ", - "repository": null, - "license": "AGPL-3.0-or-later", - "license_file": null, - "description": "Helpers for interface code generation" + "repository": null }, { - "name": "anyhow", - "version": "1.0.98", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/anyhow", + "description": "Flexible concrete Error type built on std::error::Error", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Flexible concrete Error type built on std::error::Error" + "name": "anyhow", + "repository": "https://github.com/dtolnay/anyhow" }, { - "name": "arbitrary", - "version": "1.4.1", "authors": "The Rust-Fuzz Project Developers|Nick Fitzgerald |Manish Goregaokar |Simonas Kazlauskas |Brian L. Troutwine |Corey Farwell ", - "repository": "https://github.com/rust-fuzz/arbitrary/", + "description": "The trait for generating structured data from unstructured data", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "The trait for generating structured data from unstructured data" + "name": "arbitrary", + "repository": "https://github.com/rust-fuzz/arbitrary/" }, { - "name": "arrayref", - "version": "0.3.9", "authors": "David Roundy ", - "repository": "https://github.com/droundy/arrayref", + "description": "Macros to take array references of slices", "license": "BSD-2-Clause", "license_file": null, - "description": "Macros to take array references of slices" + "name": "arrayref", + "repository": "https://github.com/droundy/arrayref" }, { - "name": "arrayvec", - "version": "0.7.6", "authors": "bluss", - "repository": "https://github.com/bluss/arrayvec", + "description": "A vector with fixed capacity, backed by an array (it can be stored on the stack too). Implements fixed capacity ArrayVec and ArrayString.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A vector with fixed capacity, backed by an array (it can be stored on the stack too). Implements fixed capacity ArrayVec and ArrayString." + "name": "arrayvec", + "repository": "https://github.com/bluss/arrayvec" }, { - "name": "ash", - "version": "0.38.0+1.3.281", "authors": "Maik Klein |Benjamin Saunders |Marijn Suijten ", - "repository": "https://github.com/ash-rs/ash", + "description": "Vulkan bindings for Rust", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Vulkan bindings for Rust" + "name": "ash", + "repository": "https://github.com/ash-rs/ash" }, { - "name": "assert-json-diff", - "version": "2.0.2", "authors": "David Pedersen ", - "repository": "https://github.com/davidpdrsn/assert-json-diff.git", + "description": "Easily compare two JSON values and get great output", "license": "MIT", "license_file": null, - "description": "Easily compare two JSON values and get great output" + "name": "assert-json-diff", + "repository": "https://github.com/davidpdrsn/assert-json-diff.git" }, { - "name": "async-channel", - "version": "2.3.1", "authors": "Stjepan Glavina ", - "repository": "https://github.com/smol-rs/async-channel", + "description": "Async multi-producer multi-consumer channel", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Async multi-producer multi-consumer channel" + "name": "async-channel", + "repository": "https://github.com/smol-rs/async-channel" }, { - "name": "async-compression", - "version": "0.4.24", "authors": "Wim Looman |Allen Bui ", - "repository": "https://github.com/Nullus157/async-compression", + "description": "Adaptors between compression crates and Rust's modern asynchronous IO types.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Adaptors between compression crates and Rust's modern asynchronous IO types." + "name": "async-compression", + "repository": "https://github.com/Nullus157/async-compression" }, { + "authors": "Carl Lerche ", + "description": "Asynchronous streams using async & await notation", + "license": "MIT", + "license_file": null, "name": "async-stream", - "version": "0.3.6", - "authors": "Carl Lerche ", - "repository": "https://github.com/tokio-rs/async-stream", - "license": "MIT", - "license_file": null, - "description": "Asynchronous streams using async & await notation" + "repository": "https://github.com/tokio-rs/async-stream" }, { + "authors": "Carl Lerche ", + "description": "proc macros for async-stream crate", + "license": "MIT", + "license_file": null, "name": "async-stream-impl", - "version": "0.3.6", - "authors": "Carl Lerche ", - "repository": "https://github.com/tokio-rs/async-stream", - "license": "MIT", - "license_file": null, - "description": "proc macros for async-stream crate" + "repository": "https://github.com/tokio-rs/async-stream" }, { - "name": "async-trait", - "version": "0.1.88", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/async-trait", + "description": "Type erasure for async trait methods", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Type erasure for async trait methods" + "name": "async-trait", + "repository": "https://github.com/dtolnay/async-trait" }, { - "name": "atomic-waker", - "version": "1.1.2", "authors": "Stjepan Glavina |Contributors to futures-rs", - "repository": "https://github.com/smol-rs/atomic-waker", + "description": "A synchronization primitive for task wakeup", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A synchronization primitive for task wakeup" + "name": "atomic-waker", + "repository": "https://github.com/smol-rs/atomic-waker" }, { - "name": "atomic_float", - "version": "1.1.0", "authors": "Thom Chiovoloni ", - "repository": "https://github.com/thomcc/atomic_float", + "description": "Floating point types which can be safely shared between threads", "license": "Apache-2.0 OR MIT OR Unlicense", "license_file": null, - "description": "Floating point types which can be safely shared between threads" + "name": "atomic_float", + "repository": "https://github.com/thomcc/atomic_float" }, { - "name": "autocfg", - "version": "1.4.0", "authors": "Josh Stone ", - "repository": "https://github.com/cuviper/autocfg", + "description": "Automatic cfg for Rust compiler features", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Automatic cfg for Rust compiler features" + "name": "autocfg", + "repository": "https://github.com/cuviper/autocfg" }, { + "authors": null, + "description": "Web framework that focuses on ergonomics and modularity", + "license": "MIT", + "license_file": null, "name": "axum", - "version": "0.8.4", - "authors": null, - "repository": "https://github.com/tokio-rs/axum", - "license": "MIT", - "license_file": null, - "description": "Web framework that focuses on ergonomics and modularity" + "repository": "https://github.com/tokio-rs/axum" }, { + "authors": null, + "description": "Client IP address extractors for Axum", + "license": "MIT", + "license_file": null, "name": "axum-client-ip", - "version": "1.1.3", - "authors": null, - "repository": "https://github.com/imbolc/axum-client-ip", - "license": "MIT", - "license_file": null, - "description": "Client IP address extractors for Axum" + "repository": "https://github.com/imbolc/axum-client-ip" }, { + "authors": null, + "description": "Core types and traits for axum", + "license": "MIT", + "license_file": null, "name": "axum-core", - "version": "0.5.2", - "authors": null, - "repository": "https://github.com/tokio-rs/axum", - "license": "MIT", - "license_file": null, - "description": "Core types and traits for axum" + "repository": "https://github.com/tokio-rs/axum" }, { + "authors": null, + "description": "Extra utilities for axum", + "license": "MIT", + "license_file": null, "name": "axum-extra", - "version": "0.10.1", - "authors": null, - "repository": "https://github.com/tokio-rs/axum", - "license": "MIT", - "license_file": null, - "description": "Extra utilities for axum" + "repository": "https://github.com/tokio-rs/axum" }, { + "authors": null, + "description": "Macros for axum", + "license": "MIT", + "license_file": null, "name": "axum-macros", - "version": "0.5.0", - "authors": null, - "repository": "https://github.com/tokio-rs/axum", - "license": "MIT", - "license_file": null, - "description": "Macros for axum" + "repository": "https://github.com/tokio-rs/axum" }, { + "authors": "The Rust Project Developers", + "description": "A library to acquire a stack trace (backtrace) at runtime in a Rust program.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "backtrace", - "version": "0.3.75", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/backtrace-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A library to acquire a stack trace (backtrace) at runtime in a Rust program." + "repository": "https://github.com/rust-lang/backtrace-rs" }, { - "name": "base64", - "version": "0.22.1", "authors": "Marshall Pierce ", - "repository": "https://github.com/marshallpierce/rust-base64", + "description": "encodes and decodes base64 as bytes or utf8", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "encodes and decodes base64 as bytes or utf8" + "name": "base64", + "repository": "https://github.com/marshallpierce/rust-base64" }, { - "name": "base64ct", - "version": "1.8.0", "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/formats", + "description": "Pure Rust implementation of Base64 (RFC 4648) which avoids any usages of data-dependent branches/LUTs and thereby provides portable \"best effort\" constant-time operation and embedded-friendly no_std support", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Pure Rust implementation of Base64 (RFC 4648) which avoids any usages of data-dependent branches/LUTs and thereby provides portable \"best effort\" constant-time operation and embedded-friendly no_std support" + "name": "base64ct", + "repository": "https://github.com/RustCrypto/formats" }, { - "name": "bincode", - "version": "2.0.1", "authors": "Ty Overby |Zoey Riordan |Victor Koenders ", - "repository": "https://github.com/bincode-org/bincode", + "description": "A binary serialization / deserialization strategy for transforming structs into bytes and vice versa!", "license": "MIT", "license_file": null, - "description": "A binary serialization / deserialization strategy for transforming structs into bytes and vice versa!" + "name": "bincode", + "repository": "https://github.com/bincode-org/bincode" }, { + "authors": "Alexis Beingessner ", + "description": "A set of bits", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "bit-set", - "version": "0.8.0", - "authors": "Alexis Beingessner ", - "repository": "https://github.com/contain-rs/bit-set", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A set of bits" + "repository": "https://github.com/contain-rs/bit-set" }, { + "authors": "Alexis Beingessner ", + "description": "A vector of bits", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "bit-vec", - "version": "0.8.0", - "authors": "Alexis Beingessner ", - "repository": "https://github.com/contain-rs/bit-vec", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A vector of bits" + "repository": "https://github.com/contain-rs/bit-vec" }, { - "name": "bitflags", - "version": "1.3.2", "authors": "The Rust Project Developers", - "repository": "https://github.com/bitflags/bitflags", + "description": "A macro to generate structures which behave like bitflags.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A macro to generate structures which behave like bitflags." - }, - { "name": "bitflags", - "version": "2.9.1", - "authors": "The Rust Project Developers", - "repository": "https://github.com/bitflags/bitflags", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A macro to generate structures which behave like bitflags." + "repository": "https://github.com/bitflags/bitflags" + }, + { + "authors": "The Rust Project Developers", + "description": "A macro to generate structures which behave like bitflags.", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "bitflags", + "repository": "https://github.com/bitflags/bitflags" }, { - "name": "blake3", - "version": "1.8.2", "authors": "Jack O'Connor |Samuel Neves", - "repository": "https://github.com/BLAKE3-team/BLAKE3", + "description": "the BLAKE3 hash function", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR CC0-1.0", "license_file": null, - "description": "the BLAKE3 hash function" + "name": "blake3", + "repository": "https://github.com/BLAKE3-team/BLAKE3" }, { - "name": "block", - "version": "0.1.6", "authors": "Steven Sheldon", - "repository": "http://github.com/SSheldon/rust-block", + "description": "Rust interface for Apple's C language extension of blocks.", "license": "MIT", "license_file": null, - "description": "Rust interface for Apple's C language extension of blocks." + "name": "block", + "repository": "http://github.com/SSheldon/rust-block" }, { - "name": "block-buffer", - "version": "0.10.4", "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/utils", + "description": "Buffer type for block processing of data", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Buffer type for block processing of data" + "name": "block-buffer", + "repository": "https://github.com/RustCrypto/utils" }, { - "name": "bumpalo", - "version": "3.18.1", "authors": "Nick Fitzgerald ", - "repository": "https://github.com/fitzgen/bumpalo", + "description": "A fast bump allocation arena for Rust.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A fast bump allocation arena for Rust." + "name": "bumpalo", + "repository": "https://github.com/fitzgen/bumpalo" }, { + "authors": "nathanielsimard ", + "description": "Flexible and Comprehensive Deep Learning Framework in Rust", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Flexible and Comprehensive Deep Learning Framework in Rust" + "repository": "https://github.com/tracel-ai/burn" }, { + "authors": "nathanielsimard ", + "description": "Automatic differentiation backend for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-autodiff", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-autodiff", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Automatic differentiation backend for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-autodiff" }, { - "name": "burn-candle", - "version": "0.17.1", "authors": "louisfd ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-candle", + "description": "Candle backend for the Burn framework", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Candle backend for the Burn framework" + "name": "burn-candle", + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-candle" }, { - "name": "burn-common", - "version": "0.17.1", "authors": "Dilshod Tadjibaev (@antimora)", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-common", + "description": "Common crate for the Burn framework", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Common crate for the Burn framework" + "name": "burn-common", + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-common" }, { + "authors": "nathanielsimard ", + "description": "Flexible and Comprehensive Deep Learning Framework in Rust", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-core", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-core", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Flexible and Comprehensive Deep Learning Framework in Rust" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-core" }, { + "authors": "nathanielsimard ", + "description": "Generic backend that can be compiled just-in-time to any shader language target", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-cubecl", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-cubecl", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Generic backend that can be compiled just-in-time to any shader language target" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-cubecl" }, { + "authors": "nathanielsimard ", + "description": "CUDA backend for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-cuda", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-cuda", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "CUDA backend for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-cuda" }, { + "authors": "nathanielsimard ", + "description": "Library with simple dataset APIs for creating ML data pipelines", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-dataset", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-dataset", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Library with simple dataset APIs for creating ML data pipelines" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-dataset" }, { + "authors": "nathanielsimard ", + "description": "Derive crate for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-derive", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-derive", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Derive crate for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-derive" }, { + "authors": "laggui |nathanielsimard ", + "description": "Intermediate representation for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-ir", - "version": "0.17.1", - "authors": "laggui |nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-ir", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Intermediate representation for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-ir" }, { + "authors": "nathanielsimard ", + "description": "Ndarray backend for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-ndarray", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-ndarray", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Ndarray backend for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-ndarray" }, { + "authors": "nathanielsimard ", + "description": "ROCm HIP backend for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-rocm", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-rocm", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "ROCm HIP backend for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-rocm" }, { - "name": "burn-router", - "version": "0.17.1", "authors": "laggui |nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-router", + "description": "Multi-backend router decorator for the Burn framework", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Multi-backend router decorator for the Burn framework" + "name": "burn-router", + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-router" }, { + "authors": "nathanielsimard ", + "description": "Tensor library with user-friendly APIs and automatic differentiation support", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-tensor", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-tensor", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Tensor library with user-friendly APIs and automatic differentiation support" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-tensor" }, { + "authors": "nathanielsimard ", + "description": "Training crate for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-train", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-train", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Training crate for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-train" }, { + "authors": "nathanielsimard ", + "description": "WGPU backend for the Burn framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "burn-wgpu", - "version": "0.17.1", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "WGPU backend for the Burn framework" + "repository": "https://github.com/tracel-ai/burn/tree/main/crates/burn-wgpu" }, { + "authors": "Lokathor ", + "description": "A crate for mucking around with piles of bytes.", + "license": "Apache-2.0 OR MIT OR Zlib", + "license_file": null, "name": "bytemuck", - "version": "1.23.1", - "authors": "Lokathor ", - "repository": "https://github.com/Lokathor/bytemuck", - "license": "Apache-2.0 OR MIT OR Zlib", - "license_file": null, - "description": "A crate for mucking around with piles of bytes." + "repository": "https://github.com/Lokathor/bytemuck" }, { + "authors": "Lokathor ", + "description": "derive proc-macros for `bytemuck`", + "license": "Apache-2.0 OR MIT OR Zlib", + "license_file": null, "name": "bytemuck_derive", - "version": "1.9.3", - "authors": "Lokathor ", - "repository": "https://github.com/Lokathor/bytemuck", - "license": "Apache-2.0 OR MIT OR Zlib", - "license_file": null, - "description": "derive proc-macros for `bytemuck`" + "repository": "https://github.com/Lokathor/bytemuck" }, { - "name": "byteorder", - "version": "1.5.0", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/byteorder", + "description": "Library for reading/writing numbers in big-endian and little-endian.", "license": "MIT OR Unlicense", "license_file": null, - "description": "Library for reading/writing numbers in big-endian and little-endian." + "name": "byteorder", + "repository": "https://github.com/BurntSushi/byteorder" }, { - "name": "bytes", - "version": "1.10.1", "authors": "Carl Lerche |Sean McArthur ", - "repository": "https://github.com/tokio-rs/bytes", + "description": "Types and traits for working with bytes", "license": "MIT", "license_file": null, - "description": "Types and traits for working with bytes" + "name": "bytes", + "repository": "https://github.com/tokio-rs/bytes" }, { - "name": "bytesize", - "version": "1.3.3", "authors": "Hyunsik Choi ", - "repository": "https://github.com/bytesize-rs/bytesize/", + "description": "an utility for human-readable bytes representations", "license": "Apache-2.0", "license_file": null, - "description": "an utility for human-readable bytes representations" + "name": "bytesize", + "repository": "https://github.com/bytesize-rs/bytesize/" }, { - "name": "camino", - "version": "1.1.10", "authors": "Without Boats |Ashley Williams |Steve Klabnik |Rain ", - "repository": "https://github.com/camino-rs/camino", + "description": "UTF-8 paths", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "UTF-8 paths" + "name": "camino", + "repository": "https://github.com/camino-rs/camino" }, { + "authors": null, + "description": "Minimalist ML framework.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "candle-core", - "version": "0.8.4", - "authors": null, - "repository": "https://github.com/huggingface/candle", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Minimalist ML framework." + "repository": "https://github.com/huggingface/candle" }, { + "authors": "Alex Crichton ", + "description": "A build-time dependency for Cargo build scripts to assist in invoking the native C compiler to compile native C code into a static archive to be linked into Rust code.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cc", - "version": "1.2.27", - "authors": "Alex Crichton ", - "repository": "https://github.com/rust-lang/cc-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A build-time dependency for Cargo build scripts to assist in invoking the native C compiler to compile native C code into a static archive to be linked into Rust code." + "repository": "https://github.com/rust-lang/cc-rs" }, { + "authors": "Alex Crichton ", + "description": "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cfg-if", - "version": "1.0.1", - "authors": "Alex Crichton ", - "repository": "https://github.com/rust-lang/cfg-if", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted." + "repository": "https://github.com/rust-lang/cfg-if" }, { - "name": "cfg_aliases", - "version": "0.2.1", "authors": "Zicklag ", - "repository": "https://github.com/katharostech/cfg_aliases", + "description": "A tiny utility to help save you a lot of effort with long winded `#[cfg()]` checks.", "license": "MIT", "license_file": null, - "description": "A tiny utility to help save you a lot of effort with long winded `#[cfg()]` checks." + "name": "cfg_aliases", + "repository": "https://github.com/katharostech/cfg_aliases" }, { - "name": "chrono", - "version": "0.4.41", "authors": null, - "repository": "https://github.com/chronotope/chrono", + "description": "Date and time library for Rust", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Date and time library for Rust" + "name": "chrono", + "repository": "https://github.com/chronotope/chrono" }, { - "name": "client-ip", - "version": "0.1.1", "authors": null, - "repository": "https://github.com/imbolc/client-ip", + "description": "HTTP client IP address extractors", "license": "MIT", "license_file": null, - "description": "HTTP client IP address extractors" + "name": "client-ip", + "repository": "https://github.com/imbolc/client-ip" }, { - "name": "coarsetime", - "version": "0.1.36", "authors": "Frank Denis ", - "repository": "https://github.com/jedisct1/rust-coarsetime", + "description": "Time and duration crate optimized for speed", "license": "ISC", "license_file": null, - "description": "Time and duration crate optimized for speed" + "name": "coarsetime", + "repository": "https://github.com/jedisct1/rust-coarsetime" }, { - "name": "codespan-reporting", - "version": "0.12.0", "authors": "Brendan Zabarauskas ", - "repository": "https://github.com/brendanzab/codespan", + "description": "Beautiful diagnostic reporting for text-based programming languages", "license": "Apache-2.0", "license_file": null, - "description": "Beautiful diagnostic reporting for text-based programming languages" + "name": "codespan-reporting", + "repository": "https://github.com/brendanzab/codespan" }, { - "name": "colored", - "version": "3.0.0", "authors": "Thomas Wickham ", - "repository": "https://github.com/mackwic/colored", + "description": "The most simple way to add colors in your terminal", "license": "MPL-2.0", "license_file": null, - "description": "The most simple way to add colors in your terminal" + "name": "colored", + "repository": "https://github.com/mackwic/colored" }, { - "name": "concurrent-queue", - "version": "2.5.0", "authors": "Stjepan Glavina |Taiki Endo |John Nunley ", - "repository": "https://github.com/smol-rs/concurrent-queue", + "description": "Concurrent multi-producer multi-consumer queue", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Concurrent multi-producer multi-consumer queue" + "name": "concurrent-queue", + "repository": "https://github.com/smol-rs/concurrent-queue" }, { - "name": "constant_time_eq", - "version": "0.3.1", "authors": "Cesar Eduardo Barros ", - "repository": "https://github.com/cesarb/constant_time_eq", + "description": "Compares two equal-sized byte strings in constant time.", "license": "Apache-2.0 OR CC0-1.0 OR MIT-0", "license_file": null, - "description": "Compares two equal-sized byte strings in constant time." + "name": "constant_time_eq", + "repository": "https://github.com/cesarb/constant_time_eq" }, { - "name": "convert_case", - "version": "0.8.0", "authors": "rutrum ", - "repository": "https://github.com/rutrum/convert-case", + "description": "Convert strings into any case", "license": "MIT", "license_file": null, - "description": "Convert strings into any case" + "name": "convert_case", + "repository": "https://github.com/rutrum/convert-case" }, { - "name": "core-foundation", - "version": "0.9.4", "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/core-foundation-rs", + "description": "Bindings to Core Foundation for macOS", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Bindings to Core Foundation for macOS" + "name": "core-foundation", + "repository": "https://github.com/servo/core-foundation-rs" }, { - "name": "core-foundation", - "version": "0.10.1", "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/core-foundation-rs", + "description": "Bindings to Core Foundation for macOS", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Bindings to Core Foundation for macOS" + "name": "core-foundation", + "repository": "https://github.com/servo/core-foundation-rs" }, { + "authors": "The Servo Project Developers", + "description": "Bindings to Core Foundation for macOS", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "core-foundation-sys", - "version": "0.8.7", - "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/core-foundation-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Bindings to Core Foundation for macOS" + "repository": "https://github.com/servo/core-foundation-rs" }, { + "authors": "The Servo Project Developers", + "description": "Bindings for some fundamental Core Graphics types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "core-graphics-types", - "version": "0.1.3", - "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/core-foundation-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Bindings for some fundamental Core Graphics types" + "repository": "https://github.com/servo/core-foundation-rs" }, { + "authors": "RustCrypto Developers", + "description": "Lightweight runtime CPU feature detection for aarch64, loongarch64, and x86/x86_64 targets, with no_std support and support for mobile targets including Android and iOS", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cpufeatures", - "version": "0.2.17", - "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/utils", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Lightweight runtime CPU feature detection for aarch64, loongarch64, and x86/x86_64 targets, with no_std support and support for mobile targets including Android and iOS" + "repository": "https://github.com/RustCrypto/utils" }, { - "name": "crc32fast", - "version": "1.4.2", "authors": "Sam Rijs |Alex Crichton ", - "repository": "https://github.com/srijs/rust-crc32fast", + "description": "Fast, SIMD-accelerated CRC32 (IEEE) checksum computation", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Fast, SIMD-accelerated CRC32 (IEEE) checksum computation" + "name": "crc32fast", + "repository": "https://github.com/srijs/rust-crc32fast" }, { + "authors": null, + "description": "Multi-producer multi-consumer channels for message passing", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "crossbeam-channel", - "version": "0.5.15", - "authors": null, - "repository": "https://github.com/crossbeam-rs/crossbeam", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Multi-producer multi-consumer channels for message passing" + "repository": "https://github.com/crossbeam-rs/crossbeam" }, { + "authors": null, + "description": "Concurrent work-stealing deque", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "crossbeam-deque", - "version": "0.8.6", - "authors": null, - "repository": "https://github.com/crossbeam-rs/crossbeam", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Concurrent work-stealing deque" + "repository": "https://github.com/crossbeam-rs/crossbeam" }, { + "authors": null, + "description": "Epoch-based garbage collection", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "crossbeam-epoch", - "version": "0.9.18", - "authors": null, - "repository": "https://github.com/crossbeam-rs/crossbeam", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Epoch-based garbage collection" + "repository": "https://github.com/crossbeam-rs/crossbeam" }, { + "authors": null, + "description": "Utilities for concurrent programming", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "crossbeam-utils", - "version": "0.8.21", - "authors": null, - "repository": "https://github.com/crossbeam-rs/crossbeam", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Utilities for concurrent programming" + "repository": "https://github.com/crossbeam-rs/crossbeam" }, { - "name": "crunchy", - "version": "0.2.3", "authors": "Eira Fransham ", - "repository": "https://github.com/eira-fransham/crunchy", + "description": "Crunchy unroller: deterministically unroll constant loops", "license": "MIT", "license_file": null, - "description": "Crunchy unroller: deterministically unroll constant loops" + "name": "crunchy", + "repository": "https://github.com/eira-fransham/crunchy" }, { + "authors": "RustCrypto Developers", + "description": "Common cryptographic traits", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "crypto-common", - "version": "0.1.6", - "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/traits", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Common cryptographic traits" + "repository": "https://github.com/RustCrypto/traits" }, { + "authors": "Simon Sapin ", + "description": "Rust implementation of CSS Syntax Level 3", + "license": "MPL-2.0", + "license_file": null, "name": "cssparser", - "version": "0.35.0", - "authors": "Simon Sapin ", - "repository": "https://github.com/servo/rust-cssparser", - "license": "MPL-2.0", - "license_file": null, - "description": "Rust implementation of CSS Syntax Level 3" + "repository": "https://github.com/servo/rust-cssparser" }, { + "authors": "Simon Sapin ", + "description": "Procedural macros for cssparser", + "license": "MPL-2.0", + "license_file": null, "name": "cssparser-macros", - "version": "0.6.1", - "authors": "Simon Sapin ", - "repository": "https://github.com/servo/rust-cssparser", - "license": "MPL-2.0", - "license_file": null, - "description": "Procedural macros for cssparser" + "repository": "https://github.com/servo/rust-cssparser" }, { + "authors": "Andrew Gallant ", + "description": "Fast CSV parsing with support for serde.", + "license": "MIT OR Unlicense", + "license_file": null, "name": "csv", - "version": "1.3.1", - "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/rust-csv", - "license": "MIT OR Unlicense", - "license_file": null, - "description": "Fast CSV parsing with support for serde." + "repository": "https://github.com/BurntSushi/rust-csv" }, { + "authors": "Andrew Gallant ", + "description": "Bare bones CSV parsing with no_std support.", + "license": "MIT OR Unlicense", + "license_file": null, "name": "csv-core", - "version": "0.1.12", - "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/rust-csv", - "license": "MIT OR Unlicense", - "license_file": null, - "description": "Bare bones CSV parsing with no_std support." + "repository": "https://github.com/BurntSushi/rust-csv" }, { + "authors": "nathanielsimard ", + "description": "Multi-platform high-performance compute language extension for Rust.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cubecl", - "version": "0.5.0", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/cubecl", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Multi-platform high-performance compute language extension for Rust." + "repository": "https://github.com/tracel-ai/cubecl" }, { - "name": "cubecl-common", - "version": "0.5.0", "authors": "Dilshod Tadjibaev (@antimora)|Nathaniel Simard (@nathanielsimard)", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-common", + "description": "Common crate for CubeCL", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Common crate for CubeCL" + "name": "cubecl-common", + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-common" }, { + "authors": "nathanielsimard |louisfd ", + "description": "CubeCL core create", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cubecl-core", - "version": "0.5.0", - "authors": "nathanielsimard |louisfd ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-core", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "CubeCL core create" + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-core" }, { + "authors": "nathanielsimard ", + "description": "CPP transpiler for CubeCL", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cubecl-cpp", - "version": "0.5.0", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-cpp", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "CPP transpiler for CubeCL" + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-cpp" }, { + "authors": "nathanielsimard ", + "description": "CUDA runtime for CubeCL", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cubecl-cuda", - "version": "0.5.0", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-cuda", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "CUDA runtime for CubeCL" + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-cuda" }, { + "authors": "nathanielsimard ", + "description": "AMD ROCm HIP runtime for CubeCL", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cubecl-hip", - "version": "0.5.0", - "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-hip", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "AMD ROCm HIP runtime for CubeCL" + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-hip" }, { - "name": "cubecl-hip-sys", - "version": "6.4.4348200", "authors": "Tracel Technologies Inc.", - "repository": "https://github.com/tracel-ai/cubecl-hip/tree/main/crates/cubecl-hip-sys", + "description": "Rust bindings for AMD ROCm HIP runtime libraries used by CubeCL.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Rust bindings for AMD ROCm HIP runtime libraries used by CubeCL." + "name": "cubecl-hip-sys", + "repository": "https://github.com/tracel-ai/cubecl-hip/tree/main/crates/cubecl-hip-sys" }, { + "authors": "nathanielsimard |louisfd |louisfd |louisfd ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-linalg", + "description": "CubeCL Linear Algebra Library.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "CubeCL Linear Algebra Library." + "name": "cubecl-linalg", + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-linalg" }, { + "authors": "nathanielsimard |louisfd |louisfd |louisfd |louisfd |louisfd |maxtremblay ", + "description": "CubeCL Reduce Algorithms.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "cubecl-reduce", - "version": "0.5.0", - "authors": "nathanielsimard |louisfd |maxtremblay ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-reduce", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "CubeCL Reduce Algorithms." + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-reduce" }, { - "name": "cubecl-runtime", - "version": "0.5.0", "authors": "louisfd |Nathaniel Simard", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-runtime", + "description": "Crate that helps creating high performance async runtimes for CubeCL.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Crate that helps creating high performance async runtimes for CubeCL." + "name": "cubecl-runtime", + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-runtime" }, { - "name": "cubecl-std", - "version": "0.5.0", "authors": "nathanielsimard |louisfd |maxtremblay ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-std", + "description": "CubeCL Standard Library.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "CubeCL Standard Library." + "name": "cubecl-std", + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-std" }, { - "name": "cubecl-wgpu", - "version": "0.5.0", "authors": "nathanielsimard ", - "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-wgpu", + "description": "WGPU runtime for the CubeCL", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "WGPU runtime for the CubeCL" + "name": "cubecl-wgpu", + "repository": "https://github.com/tracel-ai/cubecl/tree/main/crates/cubecl-wgpu" }, { - "name": "cudarc", - "version": "0.13.9", "authors": null, - "repository": "https://github.com/coreylowman/cudarc", + "description": "Safe wrappers around CUDA apis", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Safe wrappers around CUDA apis" + "name": "cudarc", + "repository": "https://github.com/coreylowman/cudarc" }, { + "authors": "Ted Driggs ", + "description": "A proc-macro library for reading attributes into structs when implementing custom derives.", + "license": "MIT", + "license_file": null, "name": "darling", - "version": "0.20.11", - "authors": "Ted Driggs ", - "repository": "https://github.com/TedDriggs/darling", - "license": "MIT", - "license_file": null, - "description": "A proc-macro library for reading attributes into structs when implementing custom derives." + "repository": "https://github.com/TedDriggs/darling" }, { + "authors": "Ted Driggs ", + "description": "Helper crate for proc-macro library for reading attributes into structs when implementing custom derives. Use https://crates.io/crates/darling in your code.", + "license": "MIT", + "license_file": null, "name": "darling_core", - "version": "0.20.11", - "authors": "Ted Driggs ", - "repository": "https://github.com/TedDriggs/darling", - "license": "MIT", - "license_file": null, - "description": "Helper crate for proc-macro library for reading attributes into structs when implementing custom derives. Use https://crates.io/crates/darling in your code." + "repository": "https://github.com/TedDriggs/darling" }, { + "authors": "Ted Driggs ", + "description": "Internal support for a proc-macro library for reading attributes into structs when implementing custom derives. Use https://crates.io/crates/darling in your code.", + "license": "MIT", + "license_file": null, "name": "darling_macro", - "version": "0.20.11", - "authors": "Ted Driggs ", - "repository": "https://github.com/TedDriggs/darling", - "license": "MIT", - "license_file": null, - "description": "Internal support for a proc-macro library for reading attributes into structs when implementing custom derives. Use https://crates.io/crates/darling in your code." + "repository": "https://github.com/TedDriggs/darling" }, { - "name": "data-encoding", - "version": "2.9.0", "authors": "Julien Cretin ", - "repository": "https://github.com/ia0/data-encoding", + "description": "Efficient and customizable data-encoding functions like base64, base32, and hex", "license": "MIT", "license_file": null, - "description": "Efficient and customizable data-encoding functions like base64, base32, and hex" + "name": "data-encoding", + "repository": "https://github.com/ia0/data-encoding" }, { + "authors": "Michael P. Jung ", + "description": "Dead simple async pool", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "deadpool", - "version": "0.10.0", - "authors": "Michael P. Jung ", - "repository": "https://github.com/bikeshedder/deadpool", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Dead simple async pool" + "repository": "https://github.com/bikeshedder/deadpool" }, { + "authors": "Michael P. Jung ", + "description": "Dead simple async pool utitities for sync managers", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "deadpool-runtime", - "version": "0.1.4", - "authors": "Michael P. Jung ", - "repository": "https://github.com/bikeshedder/deadpool", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Dead simple async pool utitities for sync managers" + "repository": "https://github.com/bikeshedder/deadpool" }, { - "name": "deranged", - "version": "0.4.0", "authors": "Jacob Pratt ", - "repository": "https://github.com/jhpratt/deranged", + "description": "Ranged integers", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Ranged integers" + "name": "deranged", + "repository": "https://github.com/jhpratt/deranged" }, { - "name": "derive-new", - "version": "0.6.0", "authors": "Nick Cameron ", - "repository": "https://github.com/nrc/derive-new", + "description": "`#[derive(new)]` implements simple constructor functions for structs and enums.", "license": "MIT", "license_file": null, - "description": "`#[derive(new)]` implements simple constructor functions for structs and enums." + "name": "derive-new", + "repository": "https://github.com/nrc/derive-new" }, { - "name": "derive-new", - "version": "0.7.0", "authors": "Nick Cameron ", - "repository": "https://github.com/nrc/derive-new", + "description": "`#[derive(new)]` implements simple constructor functions for structs and enums.", "license": "MIT", "license_file": null, - "description": "`#[derive(new)]` implements simple constructor functions for structs and enums." + "name": "derive-new", + "repository": "https://github.com/nrc/derive-new" }, { - "name": "derive_arbitrary", - "version": "1.4.1", "authors": "The Rust-Fuzz Project Developers|Nick Fitzgerald |Manish Goregaokar |Andre Bogus |Corey Farwell ", - "repository": "https://github.com/rust-fuzz/arbitrary", + "description": "Derives arbitrary traits", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Derives arbitrary traits" + "name": "derive_arbitrary", + "repository": "https://github.com/rust-fuzz/arbitrary" }, { + "authors": "Jelte Fennema ", + "description": "Adds #[derive(x)] macros for more traits", + "license": "MIT", + "license_file": null, "name": "derive_more", - "version": "1.0.0", - "authors": "Jelte Fennema ", - "repository": "https://github.com/JelteF/derive_more", - "license": "MIT", - "license_file": null, - "description": "Adds #[derive(x)] macros for more traits" + "repository": "https://github.com/JelteF/derive_more" }, { + "authors": "Jelte Fennema ", + "description": "Internal implementation of `derive_more` crate", + "license": "MIT", + "license_file": null, "name": "derive_more-impl", - "version": "1.0.0", - "authors": "Jelte Fennema ", - "repository": "https://github.com/JelteF/derive_more", - "license": "MIT", - "license_file": null, - "description": "Internal implementation of `derive_more` crate" + "repository": "https://github.com/JelteF/derive_more" }, { - "name": "difflib", - "version": "0.4.0", "authors": "Dima Kudosh ", - "repository": "https://github.com/DimaKudosh/difflib", + "description": "Port of Python's difflib library to Rust.", "license": "MIT", "license_file": null, - "description": "Port of Python's difflib library to Rust." + "name": "difflib", + "repository": "https://github.com/DimaKudosh/difflib" }, { - "name": "digest", - "version": "0.10.7", "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/traits", + "description": "Traits for cryptographic hash functions and message authentication codes", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Traits for cryptographic hash functions and message authentication codes" + "name": "digest", + "repository": "https://github.com/RustCrypto/traits" }, { + "authors": "Simon Ochsenreither ", + "description": "A tiny low-level library that provides platform-specific standard locations of directories for config, cache and other data on Linux, Windows, macOS and Redox by leveraging the mechanisms defined by the XDG base/user directory specifications on Linux, the Known Folder API on Windows, and the Standard Directory guidelines on macOS.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "dirs", - "version": "5.0.1", - "authors": "Simon Ochsenreither ", - "repository": "https://github.com/soc/dirs-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A tiny low-level library that provides platform-specific standard locations of directories for config, cache and other data on Linux, Windows, macOS and Redox by leveraging the mechanisms defined by the XDG base/user directory specifications on Linux, the Known Folder API on Windows, and the Standard Directory guidelines on macOS." + "repository": "https://github.com/soc/dirs-rs" }, { + "authors": "Simon Ochsenreither ", + "description": "A tiny low-level library that provides platform-specific standard locations of directories for config, cache and other data on Linux, Windows, macOS and Redox by leveraging the mechanisms defined by the XDG base/user directory specifications on Linux, the Known Folder API on Windows, and the Standard Directory guidelines on macOS.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "dirs", - "version": "6.0.0", - "authors": "Simon Ochsenreither ", - "repository": "https://github.com/soc/dirs-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A tiny low-level library that provides platform-specific standard locations of directories for config, cache and other data on Linux, Windows, macOS and Redox by leveraging the mechanisms defined by the XDG base/user directory specifications on Linux, the Known Folder API on Windows, and the Standard Directory guidelines on macOS." + "repository": "https://github.com/soc/dirs-rs" }, { + "authors": "Simon Ochsenreither ", + "description": "System-level helper functions for the dirs and directories crates.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "dirs-sys", - "version": "0.4.1", - "authors": "Simon Ochsenreither ", - "repository": "https://github.com/dirs-dev/dirs-sys-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "System-level helper functions for the dirs and directories crates." + "repository": "https://github.com/dirs-dev/dirs-sys-rs" }, { + "authors": "Simon Ochsenreither ", + "description": "System-level helper functions for the dirs and directories crates.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "dirs-sys", - "version": "0.5.0", - "authors": "Simon Ochsenreither ", - "repository": "https://github.com/dirs-dev/dirs-sys-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "System-level helper functions for the dirs and directories crates." + "repository": "https://github.com/dirs-dev/dirs-sys-rs" }, { - "name": "displaydoc", - "version": "0.2.5", "authors": "Jane Lusby ", - "repository": "https://github.com/yaahc/displaydoc", + "description": "A derive macro for implementing the display Trait via a doc comment and string interpolation", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A derive macro for implementing the display Trait via a doc comment and string interpolation" + "name": "displaydoc", + "repository": "https://github.com/yaahc/displaydoc" }, { - "name": "document-features", - "version": "0.2.11", "authors": "Slint Developers ", - "repository": "https://github.com/slint-ui/document-features", + "description": "Extract documentation for the feature flags from comments in Cargo.toml", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Extract documentation for the feature flags from comments in Cargo.toml" + "name": "document-features", + "repository": "https://github.com/slint-ui/document-features" }, { - "name": "dtoa", - "version": "1.0.10", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/dtoa", + "description": "Fast floating point primitive to string conversion", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Fast floating point primitive to string conversion" + "name": "dtoa", + "repository": "https://github.com/dtolnay/dtoa" }, { - "name": "dtoa-short", - "version": "0.3.5", "authors": "Xidorn Quan ", - "repository": "https://github.com/upsuper/dtoa-short", + "description": "Serialize float number and truncate to certain precision", "license": "MPL-2.0", "license_file": null, - "description": "Serialize float number and truncate to certain precision" + "name": "dtoa-short", + "repository": "https://github.com/upsuper/dtoa-short" }, { - "name": "dyn-stack", - "version": "0.10.0", "authors": "sarah <>", - "repository": "https://github.com/kitegi/dynstack/", + "description": "Dynamic stack wrapper for unsized allocations", "license": "MIT", "license_file": null, - "description": "Dynamic stack wrapper for unsized allocations" + "name": "dyn-stack", + "repository": "https://github.com/kitegi/dynstack/" }, { - "name": "dyn-stack", - "version": "0.13.0", "authors": "sarah <>", - "repository": "https://github.com/kitegi/dynstack/", + "description": "Dynamic stack wrapper for unsized allocations", "license": "MIT", "license_file": null, - "description": "Dynamic stack wrapper for unsized allocations" + "name": "dyn-stack", + "repository": "https://github.com/kitegi/dynstack/" }, { - "name": "either", - "version": "1.15.0", "authors": "bluss", - "repository": "https://github.com/rayon-rs/either", + "description": "The enum `Either` with variants `Left` and `Right` is a general purpose sum type with two cases.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "The enum `Either` with variants `Left` and `Right` is a general purpose sum type with two cases." + "name": "either", + "repository": "https://github.com/rayon-rs/either" }, { - "name": "embassy-futures", - "version": "0.1.1", "authors": null, - "repository": "https://github.com/embassy-rs/embassy", + "description": "no-std, no-alloc utilities for working with futures", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "no-std, no-alloc utilities for working with futures" + "name": "embassy-futures", + "repository": "https://github.com/embassy-rs/embassy" }, { - "name": "encoding_rs", - "version": "0.8.35", "authors": "Henri Sivonen ", - "repository": "https://github.com/hsivonen/encoding_rs", + "description": "A Gecko-oriented implementation of the Encoding Standard", "license": "(Apache-2.0 OR MIT) AND BSD-3-Clause", "license_file": null, - "description": "A Gecko-oriented implementation of the Encoding Standard" + "name": "encoding_rs", + "repository": "https://github.com/hsivonen/encoding_rs" }, { - "name": "enum-as-inner", - "version": "0.6.1", "authors": "Benjamin Fry ", - "repository": "https://github.com/bluejekyll/enum-as-inner", + "description": "A proc-macro for deriving inner field accessor functions on enums.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A proc-macro for deriving inner field accessor functions on enums." + "name": "enum-as-inner", + "repository": "https://github.com/bluejekyll/enum-as-inner" }, { - "name": "envy", - "version": "0.4.2", "authors": "softprops ", - "repository": "https://github.com/softprops/envy", + "description": "deserialize env vars into typesafe structs", "license": "MIT", "license_file": null, - "description": "deserialize env vars into typesafe structs" + "name": "envy", + "repository": "https://github.com/softprops/envy" }, { - "name": "equivalent", - "version": "1.0.2", "authors": null, - "repository": "https://github.com/indexmap-rs/equivalent", + "description": "Traits for key comparison in maps.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Traits for key comparison in maps." + "name": "equivalent", + "repository": "https://github.com/indexmap-rs/equivalent" }, { - "name": "errno", - "version": "0.3.12", "authors": "Chris Wong |Dan Gohman ", - "repository": "https://github.com/lambda-fairy/rust-errno", + "description": "Cross-platform interface to the `errno` variable.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Cross-platform interface to the `errno` variable." + "name": "errno", + "repository": "https://github.com/lambda-fairy/rust-errno" }, { - "name": "event-listener", - "version": "5.4.0", "authors": "Stjepan Glavina |John Nunley ", - "repository": "https://github.com/smol-rs/event-listener", + "description": "Notify async tasks or threads", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Notify async tasks or threads" + "name": "event-listener", + "repository": "https://github.com/smol-rs/event-listener" }, { - "name": "event-listener-strategy", - "version": "0.5.4", "authors": "John Nunley ", - "repository": "https://github.com/smol-rs/event-listener-strategy", + "description": "Block or poll on event_listener easily", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Block or poll on event_listener easily" + "name": "event-listener-strategy", + "repository": "https://github.com/smol-rs/event-listener-strategy" }, { + "authors": "Steven Fackler ", + "description": "Fallible iterator traits", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "fallible-iterator", - "version": "0.3.0", - "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/rust-fallible-iterator", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Fallible iterator traits" + "repository": "https://github.com/sfackler/rust-fallible-iterator" }, { + "authors": "Steven Fackler ", + "description": "Fallible streaming iteration", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "fallible-streaming-iterator", - "version": "0.1.9", - "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/fallible-streaming-iterator", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Fallible streaming iteration" + "repository": "https://github.com/sfackler/fallible-streaming-iterator" }, { - "name": "fastrand", - "version": "2.3.0", "authors": "Stjepan Glavina ", - "repository": "https://github.com/smol-rs/fastrand", + "description": "A simple and fast random number generator", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A simple and fast random number generator" + "name": "fastrand", + "repository": "https://github.com/smol-rs/fastrand" }, { - "name": "fixedbitset", - "version": "0.5.7", "authors": "bluss", - "repository": "https://github.com/petgraph/fixedbitset", + "description": "FixedBitSet is a simple bitset collection", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "FixedBitSet is a simple bitset collection" + "name": "fixedbitset", + "repository": "https://github.com/petgraph/fixedbitset" }, { - "name": "flate2", - "version": "1.1.2", "authors": "Alex Crichton |Josh Triplett ", - "repository": "https://github.com/rust-lang/flate2-rs", + "description": "DEFLATE compression and decompression exposed as Read/BufRead/Write streams. Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip, and raw deflate streams.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "DEFLATE compression and decompression exposed as Read/BufRead/Write streams. Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip, and raw deflate streams." + "name": "flate2", + "repository": "https://github.com/rust-lang/flate2-rs" }, { - "name": "float-ord", - "version": "0.3.2", "authors": "Michael Howell ", - "repository": "https://github.com/notriddle/rust-float-ord", + "description": "A total ordering for floating-point numbers", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A total ordering for floating-point numbers" + "name": "float-ord", + "repository": "https://github.com/notriddle/rust-float-ord" }, { + "authors": "Caleb Maclennan |Bruce Mitchener |Staś Małolepszy ", + "description": "An umbrella crate exposing the combined features of fluent-rs crates with additional convenience macros for Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "fluent", - "version": "0.17.0", - "authors": "Caleb Maclennan |Bruce Mitchener |Staś Małolepszy ", - "repository": "https://github.com/projectfluent/fluent-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An umbrella crate exposing the combined features of fluent-rs crates with additional convenience macros for Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations." + "repository": "https://github.com/projectfluent/fluent-rs" }, { + "authors": "Caleb Maclennan |Bruce Mitchener |Staś Małolepszy ", + "description": "A low-level implementation of a collection of localization messages for a single locale for Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "fluent-bundle", - "version": "0.16.0", - "authors": "Caleb Maclennan |Bruce Mitchener |Staś Małolepszy ", - "repository": "https://github.com/projectfluent/fluent-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A low-level implementation of a collection of localization messages for a single locale for Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations." + "repository": "https://github.com/projectfluent/fluent-rs" }, { - "name": "fluent-langneg", - "version": "0.13.0", "authors": "Zibi Braniecki ", - "repository": "https://github.com/projectfluent/fluent-langneg-rs", + "description": "A library for language and locale negotiation.", "license": "Apache-2.0", "license_file": null, - "description": "A library for language and locale negotiation." + "name": "fluent-langneg", + "repository": "https://github.com/projectfluent/fluent-langneg-rs" }, { - "name": "fluent-syntax", - "version": "0.12.0", "authors": "Caleb Maclennan |Bruce Mitchener |Staś Małolepszy ", - "repository": "https://github.com/projectfluent/fluent-rs", + "description": "A low-level parser, AST, and serializer API for the syntax used by Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A low-level parser, AST, and serializer API for the syntax used by Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations." + "name": "fluent-syntax", + "repository": "https://github.com/projectfluent/fluent-rs" }, { - "name": "fnv", - "version": "1.0.7", "authors": "Alex Crichton ", - "repository": "https://github.com/servo/rust-fnv", + "description": "Fowler–Noll–Vo hash function", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Fowler–Noll–Vo hash function" + "name": "fnv", + "repository": "https://github.com/servo/rust-fnv" }, { - "name": "foldhash", - "version": "0.1.5", "authors": "Orson Peters ", - "repository": "https://github.com/orlp/foldhash", + "description": "A fast, non-cryptographic, minimally DoS-resistant hashing algorithm.", "license": "Zlib", "license_file": null, - "description": "A fast, non-cryptographic, minimally DoS-resistant hashing algorithm." + "name": "foldhash", + "repository": "https://github.com/orlp/foldhash" }, { - "name": "foreign-types", - "version": "0.3.2", "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/foreign-types", + "description": "A framework for Rust wrappers over C APIs", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A framework for Rust wrappers over C APIs" + "name": "foreign-types", + "repository": "https://github.com/sfackler/foreign-types" }, { - "name": "foreign-types", - "version": "0.5.0", "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/foreign-types", + "description": "A framework for Rust wrappers over C APIs", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A framework for Rust wrappers over C APIs" + "name": "foreign-types", + "repository": "https://github.com/sfackler/foreign-types" }, { + "authors": "Steven Fackler ", + "description": "An internal crate used by foreign-types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "foreign-types-macros", - "version": "0.2.3", - "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/foreign-types", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An internal crate used by foreign-types" + "repository": "https://github.com/sfackler/foreign-types" }, { + "authors": "Steven Fackler ", + "description": "An internal crate used by foreign-types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "foreign-types-shared", - "version": "0.1.1", - "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/foreign-types", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An internal crate used by foreign-types" + "repository": "https://github.com/sfackler/foreign-types" }, { + "authors": "Steven Fackler ", + "description": "An internal crate used by foreign-types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "foreign-types-shared", - "version": "0.3.1", - "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/foreign-types", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An internal crate used by foreign-types" + "repository": "https://github.com/sfackler/foreign-types" }, { - "name": "form_urlencoded", - "version": "1.2.1", "authors": "The rust-url developers", - "repository": "https://github.com/servo/rust-url", + "description": "Parser and serializer for the application/x-www-form-urlencoded syntax, as used by HTML forms.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Parser and serializer for the application/x-www-form-urlencoded syntax, as used by HTML forms." + "name": "form_urlencoded", + "repository": "https://github.com/servo/rust-url" }, { - "name": "fsrs", - "version": "4.1.1", "authors": "Open Spaced Repetition", - "repository": "https://github.com/open-spaced-repetition/fsrs-rs", + "description": "FSRS for Rust, including Optimizer and Scheduler", "license": "BSD-3-Clause", "license_file": null, - "description": "FSRS for Rust, including Optimizer and Scheduler" + "name": "fsrs", + "repository": "https://github.com/open-spaced-repetition/fsrs-rs" }, { - "name": "futf", - "version": "0.1.5", "authors": "Keegan McAllister ", - "repository": "https://github.com/servo/futf", + "description": "Handling fragments of UTF-8", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Handling fragments of UTF-8" + "name": "futf", + "repository": "https://github.com/servo/futf" }, { + "authors": null, + "description": "An implementation of futures and streams featuring zero allocations, composability, and iterator-like interfaces.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An implementation of futures and streams featuring zero allocations, composability, and iterator-like interfaces." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": null, + "description": "Channels for asynchronous communication using futures-rs.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-channel", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Channels for asynchronous communication using futures-rs." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": null, + "description": "The core traits and types in for the `futures` library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-core", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The core traits and types in for the `futures` library." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": null, + "description": "Executors for asynchronous tasks based on the futures-rs library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-executor", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Executors for asynchronous tasks based on the futures-rs library." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": null, + "description": "The `AsyncRead`, `AsyncWrite`, `AsyncSeek`, and `AsyncBufRead` traits for the futures-rs library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-io", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The `AsyncRead`, `AsyncWrite`, `AsyncSeek`, and `AsyncBufRead` traits for the futures-rs library." + "repository": "https://github.com/rust-lang/futures-rs" }, { - "name": "futures-lite", - "version": "2.6.0", "authors": "Stjepan Glavina |Contributors to futures-rs", - "repository": "https://github.com/smol-rs/futures-lite", + "description": "Futures, streams, and async I/O combinators", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Futures, streams, and async I/O combinators" + "name": "futures-lite", + "repository": "https://github.com/smol-rs/futures-lite" }, { + "authors": null, + "description": "The futures-rs procedural macro implementations.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-macro", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The futures-rs procedural macro implementations." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": null, + "description": "The asynchronous `Sink` trait for the futures-rs library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-sink", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The asynchronous `Sink` trait for the futures-rs library." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": null, + "description": "Tools for working with tasks.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-task", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Tools for working with tasks." + "repository": "https://github.com/rust-lang/futures-rs" }, { - "name": "futures-timer", - "version": "3.0.3", "authors": "Alex Crichton ", - "repository": "https://github.com/async-rs/futures-timer", + "description": "Timeouts for futures.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Timeouts for futures." + "name": "futures-timer", + "repository": "https://github.com/async-rs/futures-timer" }, { + "authors": null, + "description": "Common utilities and extension traits for the futures-rs library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "futures-util", - "version": "0.3.31", - "authors": null, - "repository": "https://github.com/rust-lang/futures-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Common utilities and extension traits for the futures-rs library." + "repository": "https://github.com/rust-lang/futures-rs" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-c32", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-c32", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-c64", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-c64", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-common", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-common", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-f16", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-f16", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-f32", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-f32", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-f64", - "version": "0.17.1", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { + "authors": "sarah <>", + "description": "Playground for matrix multiplication algorithms", + "license": "MIT", + "license_file": null, "name": "gemm-f64", - "version": "0.18.2", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/gemm/", - "license": "MIT", - "license_file": null, - "description": "Playground for matrix multiplication algorithms" + "repository": "https://github.com/sarah-ek/gemm/" }, { - "name": "generic-array", - "version": "0.14.7", "authors": "Bartłomiej Kamiński |Aaron Trent ", - "repository": "https://github.com/fizyk20/generic-array.git", + "description": "Generic types implementing functionality of arrays", "license": "MIT", "license_file": null, - "description": "Generic types implementing functionality of arrays" + "name": "generic-array", + "repository": "https://github.com/fizyk20/generic-array.git" }, { - "name": "getopts", - "version": "0.2.23", "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/getopts", + "description": "getopts-like option parsing", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "getopts-like option parsing" + "name": "getopts", + "repository": "https://github.com/rust-lang/getopts" }, { - "name": "getrandom", - "version": "0.2.16", "authors": "The Rand Project Developers", - "repository": "https://github.com/rust-random/getrandom", + "description": "A small cross-platform library for retrieving random data from system source", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A small cross-platform library for retrieving random data from system source" - }, - { "name": "getrandom", - "version": "0.3.3", - "authors": "The Rand Project Developers", - "repository": "https://github.com/rust-random/getrandom", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A small cross-platform library for retrieving random data from system source" + "repository": "https://github.com/rust-random/getrandom" + }, + { + "authors": "The Rand Project Developers", + "description": "A small cross-platform library for retrieving random data from system source", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "getrandom", + "repository": "https://github.com/rust-random/getrandom" }, { - "name": "gimli", - "version": "0.31.1", "authors": null, - "repository": "https://github.com/gimli-rs/gimli", + "description": "A library for reading and writing the DWARF debugging format.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A library for reading and writing the DWARF debugging format." + "name": "gimli", + "repository": "https://github.com/gimli-rs/gimli" }, { - "name": "gl_generator", - "version": "0.14.0", "authors": "Brendan Zabarauskas |Corey Richardson|Arseny Kapoulkine", - "repository": "https://github.com/brendanzab/gl-rs/", + "description": "Code generators for creating bindings to the Khronos OpenGL APIs.", "license": "Apache-2.0", "license_file": null, - "description": "Code generators for creating bindings to the Khronos OpenGL APIs." + "name": "gl_generator", + "repository": "https://github.com/brendanzab/gl-rs/" }, { - "name": "glob", - "version": "0.3.2", "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/glob", + "description": "Support for matching file paths against Unix shell style patterns.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Support for matching file paths against Unix shell style patterns." + "name": "glob", + "repository": "https://github.com/rust-lang/glob" }, { - "name": "glow", - "version": "0.16.0", "authors": "Joshua Groves |Dzmitry Malyshau ", - "repository": "https://github.com/grovesNL/glow", + "description": "GL on Whatever: a set of bindings to run GL (Open GL, OpenGL ES, and WebGL) anywhere, and avoid target-specific code.", "license": "Apache-2.0 OR MIT OR Zlib", "license_file": null, - "description": "GL on Whatever: a set of bindings to run GL (Open GL, OpenGL ES, and WebGL) anywhere, and avoid target-specific code." + "name": "glow", + "repository": "https://github.com/grovesNL/glow" }, { - "name": "glutin_wgl_sys", - "version": "0.6.1", "authors": "Kirill Chibisov ", - "repository": "https://github.com/rust-windowing/glutin", + "description": "The wgl bindings for glutin", "license": "Apache-2.0", "license_file": null, - "description": "The wgl bindings for glutin" + "name": "glutin_wgl_sys", + "repository": "https://github.com/rust-windowing/glutin" }, { + "authors": "Zakarum ", + "description": "Implementation agnostic memory allocator for Vulkan like APIs", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "gpu-alloc", - "version": "0.6.0", - "authors": "Zakarum ", - "repository": "https://github.com/zakarumych/gpu-alloc", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Implementation agnostic memory allocator for Vulkan like APIs" + "repository": "https://github.com/zakarumych/gpu-alloc" }, { + "authors": "Zakarum ", + "description": "Core types of gpu-alloc crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "gpu-alloc-types", - "version": "0.3.0", - "authors": "Zakarum ", - "repository": "https://github.com/zakarumych/gpu-alloc", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Core types of gpu-alloc crate" + "repository": "https://github.com/zakarumych/gpu-alloc" }, { - "name": "gpu-allocator", - "version": "0.27.0", "authors": "Traverse Research ", - "repository": "https://github.com/Traverse-Research/gpu-allocator", + "description": "Memory allocator for GPU memory in Vulkan and DirectX 12", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Memory allocator for GPU memory in Vulkan and DirectX 12" + "name": "gpu-allocator", + "repository": "https://github.com/Traverse-Research/gpu-allocator" }, { + "authors": "Zakarum ", + "description": "Implementation agnostic descriptor allocator for Vulkan like APIs", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "gpu-descriptor", - "version": "0.3.2", - "authors": "Zakarum ", - "repository": "https://github.com/zakarumych/gpu-descriptor", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Implementation agnostic descriptor allocator for Vulkan like APIs" + "repository": "https://github.com/zakarumych/gpu-descriptor" }, { + "authors": "Zakarum ", + "description": "Core types of gpu-descriptor crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "gpu-descriptor-types", - "version": "0.2.0", - "authors": "Zakarum ", - "repository": "https://github.com/zakarumych/gpu-descriptor", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Core types of gpu-descriptor crate" + "repository": "https://github.com/zakarumych/gpu-descriptor" }, { - "name": "h2", - "version": "0.4.10", "authors": "Carl Lerche |Sean McArthur ", - "repository": "https://github.com/hyperium/h2", + "description": "An HTTP/2 client and server", "license": "MIT", "license_file": null, - "description": "An HTTP/2 client and server" + "name": "h2", + "repository": "https://github.com/hyperium/h2" }, { - "name": "half", - "version": "2.6.0", "authors": "Kathryn Long ", - "repository": "https://github.com/VoidStarKat/half-rs", + "description": "Half-precision floating point f16 and bf16 types for Rust implementing the IEEE 754-2008 standard binary16 and bfloat16 types.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Half-precision floating point f16 and bf16 types for Rust implementing the IEEE 754-2008 standard binary16 and bfloat16 types." + "name": "half", + "repository": "https://github.com/VoidStarKat/half-rs" }, { - "name": "hashbrown", - "version": "0.13.2", "authors": "Amanieu d'Antras ", - "repository": "https://github.com/rust-lang/hashbrown", + "description": "A Rust port of Google's SwissTable hash map", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A Rust port of Google's SwissTable hash map" - }, - { "name": "hashbrown", - "version": "0.14.5", - "authors": "Amanieu d'Antras ", - "repository": "https://github.com/rust-lang/hashbrown", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A Rust port of Google's SwissTable hash map" + "repository": "https://github.com/rust-lang/hashbrown" }, { + "authors": "Amanieu d'Antras ", + "description": "A Rust port of Google's SwissTable hash map", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "hashbrown", - "version": "0.15.4", - "authors": "Amanieu d'Antras ", - "repository": "https://github.com/rust-lang/hashbrown", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A Rust port of Google's SwissTable hash map" + "repository": "https://github.com/rust-lang/hashbrown" + }, + { + "authors": "Amanieu d'Antras ", + "description": "A Rust port of Google's SwissTable hash map", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "hashbrown", + "repository": "https://github.com/rust-lang/hashbrown" }, { - "name": "hashlink", - "version": "0.10.0", "authors": "kyren ", - "repository": "https://github.com/kyren/hashlink", + "description": "HashMap-like containers that hold their key-value pairs in a user controllable order", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "HashMap-like containers that hold their key-value pairs in a user controllable order" + "name": "hashlink", + "repository": "https://github.com/kyren/hashlink" }, { + "authors": "Sean McArthur ", + "description": "typed HTTP headers", + "license": "MIT", + "license_file": null, "name": "headers", - "version": "0.4.1", - "authors": "Sean McArthur ", - "repository": "https://github.com/hyperium/headers", - "license": "MIT", - "license_file": null, - "description": "typed HTTP headers" + "repository": "https://github.com/hyperium/headers" }, { + "authors": "Sean McArthur ", + "description": "typed HTTP headers core trait", + "license": "MIT", + "license_file": null, "name": "headers-core", - "version": "0.3.0", - "authors": "Sean McArthur ", - "repository": "https://github.com/hyperium/headers", - "license": "MIT", - "license_file": null, - "description": "typed HTTP headers core trait" + "repository": "https://github.com/hyperium/headers" }, { - "name": "heck", - "version": "0.5.0", "authors": null, - "repository": "https://github.com/withoutboats/heck", + "description": "heck is a case conversion library.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "heck is a case conversion library." + "name": "heck", + "repository": "https://github.com/withoutboats/heck" }, { - "name": "hermit-abi", - "version": "0.5.2", "authors": "Stefan Lankes", - "repository": "https://github.com/hermit-os/hermit-rs", + "description": "Hermit system calls definitions.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Hermit system calls definitions." + "name": "hermit-abi", + "repository": "https://github.com/hermit-os/hermit-rs" }, { - "name": "hex", - "version": "0.4.3", "authors": "KokaKiwi ", - "repository": "https://github.com/KokaKiwi/rust-hex", + "description": "Encoding and decoding data into/from hexadecimal representation.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Encoding and decoding data into/from hexadecimal representation." + "name": "hex", + "repository": "https://github.com/KokaKiwi/rust-hex" }, { - "name": "hexf-parse", - "version": "0.2.1", "authors": "Kang Seonghoon ", - "repository": "https://github.com/lifthrasiir/hexf", + "description": "Parses hexadecimal floats (see also hexf)", "license": "CC0-1.0", "license_file": null, - "description": "Parses hexadecimal floats (see also hexf)" + "name": "hexf-parse", + "repository": "https://github.com/lifthrasiir/hexf" }, { - "name": "hmac", - "version": "0.12.1", "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/MACs", + "description": "Generic implementation of Hash-based Message Authentication Code (HMAC)", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Generic implementation of Hash-based Message Authentication Code (HMAC)" + "name": "hmac", + "repository": "https://github.com/RustCrypto/MACs" }, { - "name": "html5ever", - "version": "0.31.0", "authors": "The html5ever Project Developers", - "repository": "https://github.com/servo/html5ever", + "description": "High-performance browser-grade HTML5 parser", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "High-performance browser-grade HTML5 parser" + "name": "html5ever", + "repository": "https://github.com/servo/html5ever" }, { - "name": "htmlescape", - "version": "0.3.1", "authors": "Viktor Dahl ", - "repository": "https://github.com/veddan/rust-htmlescape", + "description": "A library for HTML entity encoding and decoding", "license": "Apache-2.0 OR MIT OR MPL-2.0", "license_file": null, - "description": "A library for HTML entity encoding and decoding" + "name": "htmlescape", + "repository": "https://github.com/veddan/rust-htmlescape" }, { - "name": "http", - "version": "1.3.1", "authors": "Alex Crichton |Carl Lerche |Sean McArthur ", - "repository": "https://github.com/hyperium/http", + "description": "A set of types for representing HTTP requests and responses.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A set of types for representing HTTP requests and responses." + "name": "http", + "repository": "https://github.com/hyperium/http" }, { + "authors": "Carl Lerche |Lucio Franco |Sean McArthur ", + "description": "Trait representing an asynchronous, streaming, HTTP request or response body.", + "license": "MIT", + "license_file": null, "name": "http-body", - "version": "1.0.1", - "authors": "Carl Lerche |Lucio Franco |Sean McArthur ", - "repository": "https://github.com/hyperium/http-body", - "license": "MIT", - "license_file": null, - "description": "Trait representing an asynchronous, streaming, HTTP request or response body." + "repository": "https://github.com/hyperium/http-body" }, { + "authors": "Carl Lerche |Lucio Franco |Sean McArthur ", + "description": "Combinators and adapters for HTTP request or response bodies.", + "license": "MIT", + "license_file": null, "name": "http-body-util", - "version": "0.1.3", - "authors": "Carl Lerche |Lucio Franco |Sean McArthur ", - "repository": "https://github.com/hyperium/http-body", - "license": "MIT", - "license_file": null, - "description": "Combinators and adapters for HTTP request or response bodies." + "repository": "https://github.com/hyperium/http-body" }, { + "authors": "Sean McArthur ", + "description": "A tiny, safe, speedy, zero-copy HTTP/1.x parser.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "httparse", - "version": "1.10.1", - "authors": "Sean McArthur ", - "repository": "https://github.com/seanmonstar/httparse", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A tiny, safe, speedy, zero-copy HTTP/1.x parser." + "repository": "https://github.com/seanmonstar/httparse" }, { - "name": "httpdate", - "version": "1.0.3", "authors": "Pyfisch ", - "repository": "https://github.com/pyfisch/httpdate", + "description": "HTTP date parsing and formatting", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "HTTP date parsing and formatting" + "name": "httpdate", + "repository": "https://github.com/pyfisch/httpdate" }, { - "name": "hyper", - "version": "1.6.0", "authors": "Sean McArthur ", - "repository": "https://github.com/hyperium/hyper", + "description": "A protective and efficient HTTP library for all.", "license": "MIT", "license_file": null, - "description": "A protective and efficient HTTP library for all." + "name": "hyper", + "repository": "https://github.com/hyperium/hyper" }, { - "name": "hyper-rustls", - "version": "0.27.7", "authors": null, - "repository": "https://github.com/rustls/hyper-rustls", + "description": "Rustls+hyper integration for pure rust HTTPS", "license": "Apache-2.0 OR ISC OR MIT", "license_file": null, - "description": "Rustls+hyper integration for pure rust HTTPS" + "name": "hyper-rustls", + "repository": "https://github.com/rustls/hyper-rustls" }, { + "authors": "Sean McArthur ", + "description": "Default TLS implementation for use with hyper", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "hyper-tls", - "version": "0.6.0", - "authors": "Sean McArthur ", - "repository": "https://github.com/hyperium/hyper-tls", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Default TLS implementation for use with hyper" + "repository": "https://github.com/hyperium/hyper-tls" }, { + "authors": "Sean McArthur ", + "description": "hyper utilities", + "license": "MIT", + "license_file": null, "name": "hyper-util", - "version": "0.1.14", - "authors": "Sean McArthur ", - "repository": "https://github.com/hyperium/hyper-util", - "license": "MIT", - "license_file": null, - "description": "hyper utilities" + "repository": "https://github.com/hyperium/hyper-util" }, { - "name": "iana-time-zone", - "version": "0.1.63", "authors": "Andrew Straw |René Kijewski |Ryan Lopopolo ", - "repository": "https://github.com/strawlab/iana-time-zone", + "description": "get the IANA time zone for the current system", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "get the IANA time zone for the current system" + "name": "iana-time-zone", + "repository": "https://github.com/strawlab/iana-time-zone" }, { - "name": "iana-time-zone-haiku", - "version": "0.1.2", "authors": "René Kijewski ", - "repository": "https://github.com/strawlab/iana-time-zone", + "description": "iana-time-zone support crate for Haiku OS", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "iana-time-zone support crate for Haiku OS" + "name": "iana-time-zone-haiku", + "repository": "https://github.com/strawlab/iana-time-zone" }, { + "authors": "The ICU4X Project Developers", + "description": "Collection of API for use in ICU libraries.", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_collections", - "version": "2.0.0", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Collection of API for use in ICU libraries." + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "API for managing Unicode Language and Locale Identifiers", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_locale_core", - "version": "2.0.0", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "API for managing Unicode Language and Locale Identifiers" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "API for normalizing text into Unicode Normalization Forms", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_normalizer", - "version": "2.0.0", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "API for normalizing text into Unicode Normalization Forms" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "Data for the icu_normalizer crate", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_normalizer_data", - "version": "2.0.0", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Data for the icu_normalizer crate" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "Definitions for Unicode properties", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_properties", - "version": "2.0.1", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Definitions for Unicode properties" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "Data for the icu_properties crate", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_properties_data", - "version": "2.0.1", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Data for the icu_properties crate" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "Trait and struct definitions for the ICU data provider", + "license": "Unicode-3.0", + "license_file": null, "name": "icu_provider", - "version": "2.0.0", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Trait and struct definitions for the ICU data provider" + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "id_tree", - "version": "1.8.0", "authors": "Ian Burns ", - "repository": "https://github.com/iwburns/id-tree", + "description": "A library for creating and modifying Tree structures.", "license": "MIT", "license_file": null, - "description": "A library for creating and modifying Tree structures." + "name": "id_tree", + "repository": "https://github.com/iwburns/id-tree" }, { - "name": "ident_case", - "version": "1.0.1", "authors": "Ted Driggs ", - "repository": "https://github.com/TedDriggs/ident_case", + "description": "Utility for applying case rules to Rust identifiers.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Utility for applying case rules to Rust identifiers." + "name": "ident_case", + "repository": "https://github.com/TedDriggs/ident_case" }, { + "authors": "The rust-url developers", + "description": "IDNA (Internationalizing Domain Names in Applications) and Punycode.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "idna", - "version": "1.0.3", - "authors": "The rust-url developers", - "repository": "https://github.com/servo/rust-url/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "IDNA (Internationalizing Domain Names in Applications) and Punycode." + "repository": "https://github.com/servo/rust-url/" }, { + "authors": "The rust-url developers", + "description": "Back end adapter for idna", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "idna_adapter", - "version": "1.2.1", - "authors": "The rust-url developers", - "repository": "https://github.com/hsivonen/idna_adapter", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Back end adapter for idna" + "repository": "https://github.com/hsivonen/idna_adapter" }, { - "name": "indexmap", - "version": "2.9.0", "authors": null, - "repository": "https://github.com/indexmap-rs/indexmap", + "description": "A hash table with consistent order and fast iteration.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A hash table with consistent order and fast iteration." + "name": "indexmap", + "repository": "https://github.com/indexmap-rs/indexmap" }, { - "name": "inflections", - "version": "1.1.1", "authors": "Caleb Meredith ", - "repository": "https://docs.rs/inflections", + "description": "High performance inflection transformation library for changing properties of words like the case.", "license": "MIT", "license_file": null, - "description": "High performance inflection transformation library for changing properties of words like the case." + "name": "inflections", + "repository": "https://docs.rs/inflections" }, { - "name": "intl-memoizer", - "version": "0.5.3", "authors": "Caleb Maclennan |Bruce Mitchener |Staś Małolepszy ", - "repository": "https://github.com/projectfluent/fluent-rs", + "description": "A memoizer specifically tailored for storing lazy-initialized intl formatters for Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A memoizer specifically tailored for storing lazy-initialized intl formatters for Project Fluent, a localization system designed to unleash the entire expressive power of natural language translations." + "name": "intl-memoizer", + "repository": "https://github.com/projectfluent/fluent-rs" }, { - "name": "intl_pluralrules", - "version": "7.0.2", "authors": "Kekoa Riggin |Zibi Braniecki ", - "repository": "https://github.com/zbraniecki/pluralrules", + "description": "Unicode Plural Rules categorizer for numeric input.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Unicode Plural Rules categorizer for numeric input." + "name": "intl_pluralrules", + "repository": "https://github.com/zbraniecki/pluralrules" }, { - "name": "ipnet", - "version": "2.11.0", "authors": "Kris Price ", - "repository": "https://github.com/krisprice/ipnet", + "description": "Provides types and useful methods for working with IPv4 and IPv6 network addresses, commonly called IP prefixes. The new `IpNet`, `Ipv4Net`, and `Ipv6Net` types build on the existing `IpAddr`, `Ipv4Addr`, and `Ipv6Addr` types already provided in Rust's standard library and align to their design to stay consistent. The module also provides useful traits that extend `Ipv4Addr` and `Ipv6Addr` with methods for `Add`, `Sub`, `BitAnd`, and `BitOr` operations. The module only uses stable feature so it is guaranteed to compile using the stable toolchain.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Provides types and useful methods for working with IPv4 and IPv6 network addresses, commonly called IP prefixes. The new `IpNet`, `Ipv4Net`, and `Ipv6Net` types build on the existing `IpAddr`, `Ipv4Addr`, and `Ipv6Addr` types already provided in Rust's standard library and align to their design to stay consistent. The module also provides useful traits that extend `Ipv4Addr` and `Ipv6Addr` with methods for `Add`, `Sub`, `BitAnd`, and `BitOr` operations. The module only uses stable feature so it is guaranteed to compile using the stable toolchain." + "name": "ipnet", + "repository": "https://github.com/krisprice/ipnet" }, { - "name": "iri-string", - "version": "0.7.8", "authors": "YOSHIOKA Takuma ", - "repository": "https://github.com/lo48576/iri-string", + "description": "IRI as string types", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "IRI as string types" + "name": "iri-string", + "repository": "https://github.com/lo48576/iri-string" }, { - "name": "itertools", - "version": "0.14.0", "authors": "bluss", - "repository": "https://github.com/rust-itertools/itertools", + "description": "Extra iterator adaptors, iterator methods, free functions, and macros.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Extra iterator adaptors, iterator methods, free functions, and macros." + "name": "itertools", + "repository": "https://github.com/rust-itertools/itertools" }, { - "name": "itoa", - "version": "1.0.15", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/itoa", + "description": "Fast integer primitive to string conversion", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Fast integer primitive to string conversion" + "name": "itoa", + "repository": "https://github.com/dtolnay/itoa" }, { - "name": "jni-sys", - "version": "0.3.0", "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/rust-jni-sys", + "description": "Rust definitions corresponding to jni.h", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Rust definitions corresponding to jni.h" + "name": "jni-sys", + "repository": "https://github.com/sfackler/rust-jni-sys" }, { - "name": "jobserver", - "version": "0.1.33", "authors": "Alex Crichton ", - "repository": "https://github.com/rust-lang/jobserver-rs", + "description": "An implementation of the GNU Make jobserver for Rust.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "An implementation of the GNU Make jobserver for Rust." + "name": "jobserver", + "repository": "https://github.com/rust-lang/jobserver-rs" }, { - "name": "js-sys", - "version": "0.3.77", "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys", + "description": "Bindings for all JS global objects and functions in all JS environments like Node.js and browsers, built on `#[wasm_bindgen]` using the `wasm-bindgen` crate.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Bindings for all JS global objects and functions in all JS environments like Node.js and browsers, built on `#[wasm_bindgen]` using the `wasm-bindgen` crate." + "name": "js-sys", + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys" }, { - "name": "khronos-egl", - "version": "6.0.0", "authors": "Timothée Haudebourg |Sean Kerr ", - "repository": "https://github.com/timothee-haudebourg/khronos-egl", + "description": "Rust bindings for EGL", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Rust bindings for EGL" + "name": "khronos-egl", + "repository": "https://github.com/timothee-haudebourg/khronos-egl" }, { - "name": "khronos_api", - "version": "3.1.0", "authors": "Brendan Zabarauskas |Corey Richardson|Arseny Kapoulkine|Pierre Krieger ", - "repository": "https://github.com/brendanzab/gl-rs/", + "description": "The Khronos XML API Registry, exposed as byte string constants.", "license": "Apache-2.0", "license_file": null, - "description": "The Khronos XML API Registry, exposed as byte string constants." + "name": "khronos_api", + "repository": "https://github.com/brendanzab/gl-rs/" }, { - "name": "lazy_static", - "version": "1.5.0", "authors": "Marvin Löbel ", - "repository": "https://github.com/rust-lang-nursery/lazy-static.rs", + "description": "A macro for declaring lazily evaluated statics in Rust.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A macro for declaring lazily evaluated statics in Rust." + "name": "lazy_static", + "repository": "https://github.com/rust-lang-nursery/lazy-static.rs" }, { - "name": "libc", - "version": "0.2.173", "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/libc", + "description": "Raw FFI bindings to platform libraries like libc.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Raw FFI bindings to platform libraries like libc." + "name": "libc", + "repository": "https://github.com/rust-lang/libc" }, { - "name": "libloading", - "version": "0.8.8", "authors": "Simonas Kazlauskas ", - "repository": "https://github.com/nagisa/rust_libloading/", + "description": "Bindings around the platform's dynamic library loading primitives with greatly improved memory safety.", "license": "ISC", "license_file": null, - "description": "Bindings around the platform's dynamic library loading primitives with greatly improved memory safety." + "name": "libloading", + "repository": "https://github.com/nagisa/rust_libloading/" }, { - "name": "libm", - "version": "0.2.15", "authors": "Jorge Aparicio ", - "repository": "https://github.com/rust-lang/compiler-builtins", + "description": "libm in pure Rust", "license": "MIT", "license_file": null, - "description": "libm in pure Rust" + "name": "libm", + "repository": "https://github.com/rust-lang/compiler-builtins" }, { - "name": "libredox", - "version": "0.1.3", "authors": "4lDO2 <4lDO2@protonmail.com>", - "repository": "https://gitlab.redox-os.org/redox-os/libredox.git", + "description": "Redox stable ABI", "license": "MIT", "license_file": null, - "description": "Redox stable ABI" + "name": "libredox", + "repository": "https://gitlab.redox-os.org/redox-os/libredox.git" }, { - "name": "libsqlite3-sys", - "version": "0.34.0", "authors": "The rusqlite developers", - "repository": "https://github.com/rusqlite/rusqlite", + "description": "Native bindings to the libsqlite3 library", "license": "MIT", "license_file": null, - "description": "Native bindings to the libsqlite3 library" + "name": "libsqlite3-sys", + "repository": "https://github.com/rusqlite/rusqlite" }, { - "name": "libz-rs-sys", - "version": "0.5.1", "authors": null, - "repository": "https://github.com/trifectatechfoundation/zlib-rs", + "description": "A memory-safe zlib implementation written in rust", "license": "Zlib", "license_file": null, - "description": "A memory-safe zlib implementation written in rust" + "name": "libz-rs-sys", + "repository": "https://github.com/trifectatechfoundation/zlib-rs" }, { - "name": "linux-raw-sys", - "version": "0.9.4", "authors": "Dan Gohman ", - "repository": "https://github.com/sunfishcode/linux-raw-sys", + "description": "Generated bindings for Linux's userspace API", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT", "license_file": null, - "description": "Generated bindings for Linux's userspace API" + "name": "linux-raw-sys", + "repository": "https://github.com/sunfishcode/linux-raw-sys" }, { - "name": "litemap", - "version": "0.8.0", "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", + "description": "A key-value Map implementation based on a flat, sorted Vec.", "license": "Unicode-3.0", "license_file": null, - "description": "A key-value Map implementation based on a flat, sorted Vec." + "name": "litemap", + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "litrs", - "version": "0.4.1", "authors": "Lukas Kalbertodt ", - "repository": "https://github.com/LukasKalbertodt/litrs/", + "description": "Parse and inspect Rust literals (i.e. tokens in the Rust programming language representing fixed values). Particularly useful for proc macros, but can also be used outside of a proc-macro context.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Parse and inspect Rust literals (i.e. tokens in the Rust programming language representing fixed values). Particularly useful for proc macros, but can also be used outside of a proc-macro context." + "name": "litrs", + "repository": "https://github.com/LukasKalbertodt/litrs/" }, { - "name": "lock_api", - "version": "0.4.13", "authors": "Amanieu d'Antras ", - "repository": "https://github.com/Amanieu/parking_lot", + "description": "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std." + "name": "lock_api", + "repository": "https://github.com/Amanieu/parking_lot" }, { - "name": "log", - "version": "0.4.27", "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/log", + "description": "A lightweight logging facade for Rust", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A lightweight logging facade for Rust" + "name": "log", + "repository": "https://github.com/rust-lang/log" }, { - "name": "lru-slab", - "version": "0.1.2", "authors": "Benjamin Saunders ", - "repository": "https://github.com/Ralith/lru-slab", + "description": "Pre-allocated storage with constant-time LRU tracking", "license": "Apache-2.0 OR MIT OR Zlib", "license_file": null, - "description": "Pre-allocated storage with constant-time LRU tracking" + "name": "lru-slab", + "repository": "https://github.com/Ralith/lru-slab" }, { - "name": "mac", - "version": "0.1.1", "authors": "Jonathan Reem ", - "repository": "https://github.com/reem/rust-mac.git", + "description": "A collection of great and ubiqutitous macros.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A collection of great and ubiqutitous macros." + "name": "mac", + "repository": "https://github.com/reem/rust-mac.git" }, { + "authors": "Genna Wingert", + "description": "Type and target-generic SIMD", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "macerator", - "version": "0.2.8", - "authors": "Genna Wingert", - "repository": "https://github.com/wingertge/macerator", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Type and target-generic SIMD" + "repository": "https://github.com/wingertge/macerator" }, { + "authors": "Genna Wingert", + "description": "proc-macros for macerator", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "macerator-macros", - "version": "0.1.2", - "authors": "Genna Wingert", - "repository": "https://github.com/wingertge/macerator", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "proc-macros for macerator" + "repository": "https://github.com/wingertge/macerator" }, { - "name": "malloc_buf", - "version": "0.0.6", "authors": "Steven Sheldon", - "repository": "https://github.com/SSheldon/malloc_buf", + "description": "Structs for handling malloc'd memory passed to Rust.", "license": "MIT", "license_file": null, - "description": "Structs for handling malloc'd memory passed to Rust." + "name": "malloc_buf", + "repository": "https://github.com/SSheldon/malloc_buf" }, { - "name": "maplit", - "version": "1.0.2", "authors": "bluss", - "repository": "https://github.com/bluss/maplit", + "description": "Collection “literal” macros for HashMap, HashSet, BTreeMap, and BTreeSet.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Collection “literal” macros for HashMap, HashSet, BTreeMap, and BTreeSet." + "name": "maplit", + "repository": "https://github.com/bluss/maplit" }, { - "name": "markup5ever", - "version": "0.16.1", "authors": "The html5ever Project Developers", - "repository": "https://github.com/servo/html5ever", + "description": "Common code for xml5ever and html5ever", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Common code for xml5ever and html5ever" + "name": "markup5ever", + "repository": "https://github.com/servo/html5ever" }, { + "authors": null, + "description": "Procedural macro for html5ever.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "match_token", - "version": "0.1.0", - "authors": null, - "repository": "https://github.com/servo/html5ever", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Procedural macro for html5ever." + "repository": "https://github.com/servo/html5ever" }, { - "name": "matchers", - "version": "0.1.0", "authors": "Eliza Weisman ", - "repository": "https://github.com/hawkw/matchers", + "description": "Regex matching on character and byte streams.", "license": "MIT", "license_file": null, - "description": "Regex matching on character and byte streams." + "name": "matchers", + "repository": "https://github.com/hawkw/matchers" }, { - "name": "matches", - "version": "0.1.10", "authors": null, - "repository": "https://github.com/SimonSapin/rust-std-candidates", + "description": "A macro to evaluate, as a boolean, whether an expression matches a pattern.", "license": "MIT", "license_file": null, - "description": "A macro to evaluate, as a boolean, whether an expression matches a pattern." + "name": "matches", + "repository": "https://github.com/SimonSapin/rust-std-candidates" }, { - "name": "matchit", - "version": "0.8.4", "authors": "Ibraheem Ahmed ", - "repository": "https://github.com/ibraheemdev/matchit", + "description": "A high performance, zero-copy URL router.", "license": "MIT AND BSD-3-Clause", "license_file": null, - "description": "A high performance, zero-copy URL router." + "name": "matchit", + "repository": "https://github.com/ibraheemdev/matchit" }, { - "name": "matrixmultiply", - "version": "0.3.10", "authors": "bluss|R. Janis Goldschmidt", - "repository": "https://github.com/bluss/matrixmultiply/", + "description": "General matrix multiplication for f32 and f64 matrices. Operates on matrices with general layout (they can use arbitrary row and column stride). Detects and uses AVX or SSE2 on x86 platforms transparently for higher performance. Uses a microkernel strategy, so that the implementation is easy to parallelize and optimize. Supports multithreading.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "General matrix multiplication for f32 and f64 matrices. Operates on matrices with general layout (they can use arbitrary row and column stride). Detects and uses AVX or SSE2 on x86 platforms transparently for higher performance. Uses a microkernel strategy, so that the implementation is easy to parallelize and optimize. Supports multithreading." + "name": "matrixmultiply", + "repository": "https://github.com/bluss/matrixmultiply/" }, { - "name": "md5", - "version": "0.7.0", "authors": "Ivan Ukhov |Kamal Ahmad |Konstantin Stepanov |Lukas Kalbertodt |Nathan Musoke |Scott Mabin |Tony Arcieri |Wim de With |Yosef Dinerstein ", - "repository": "https://github.com/stainless-steel/md5", + "description": "The package provides the MD5 hash function.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "The package provides the MD5 hash function." + "name": "md5", + "repository": "https://github.com/stainless-steel/md5" }, { - "name": "memchr", - "version": "2.7.5", "authors": "Andrew Gallant |bluss", - "repository": "https://github.com/BurntSushi/memchr", + "description": "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for 1, 2 or 3 byte search and single substring search.", "license": "MIT OR Unlicense", "license_file": null, - "description": "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for 1, 2 or 3 byte search and single substring search." + "name": "memchr", + "repository": "https://github.com/BurntSushi/memchr" }, { - "name": "memmap2", - "version": "0.9.5", "authors": "Dan Burkert |Yevhenii Reizner ", - "repository": "https://github.com/RazrFalcon/memmap2-rs", + "description": "Cross-platform Rust API for memory-mapped file IO", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Cross-platform Rust API for memory-mapped file IO" + "name": "memmap2", + "repository": "https://github.com/RazrFalcon/memmap2-rs" }, { - "name": "metal", - "version": "0.31.0", "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/metal-rs", + "description": "Rust bindings for Metal", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Rust bindings for Metal" + "name": "metal", + "repository": "https://github.com/gfx-rs/metal-rs" }, { - "name": "mime", - "version": "0.3.17", "authors": "Sean McArthur ", - "repository": "https://github.com/hyperium/mime", + "description": "Strongly Typed Mimes", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Strongly Typed Mimes" + "name": "mime", + "repository": "https://github.com/hyperium/mime" }, { - "name": "mime_guess", - "version": "2.0.5", "authors": "Austin Bonander ", - "repository": "https://github.com/abonander/mime_guess", + "description": "A simple crate for detection of a file's MIME type by its extension.", "license": "MIT", "license_file": null, - "description": "A simple crate for detection of a file's MIME type by its extension." + "name": "mime_guess", + "repository": "https://github.com/abonander/mime_guess" }, { - "name": "minimal-lexical", - "version": "0.2.1", "authors": "Alex Huszagh ", - "repository": "https://github.com/Alexhuszagh/minimal-lexical", + "description": "Fast float parsing conversion routines.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Fast float parsing conversion routines." + "name": "minimal-lexical", + "repository": "https://github.com/Alexhuszagh/minimal-lexical" }, { - "name": "miniz_oxide", - "version": "0.8.9", "authors": "Frommi |oyvindln |Rich Geldreich richgel99@gmail.com", - "repository": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", + "description": "DEFLATE compression and decompression library rewritten in Rust based on miniz", "license": "Apache-2.0 OR MIT OR Zlib", "license_file": null, - "description": "DEFLATE compression and decompression library rewritten in Rust based on miniz" + "name": "miniz_oxide", + "repository": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide" }, { - "name": "mio", - "version": "1.0.4", "authors": "Carl Lerche |Thomas de Zeeuw |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/mio", + "description": "Lightweight non-blocking I/O.", "license": "MIT", "license_file": null, - "description": "Lightweight non-blocking I/O." + "name": "mio", + "repository": "https://github.com/tokio-rs/mio" }, { + "authors": null, + "description": "Macro for convenient module declaration. Each module can be put in a group, and visibility can be applied to the whole group with ease.", + "license": "MIT", + "license_file": null, "name": "moddef", - "version": "0.2.6", - "authors": null, - "repository": "https://github.com/sigurd4/moddef", - "license": "MIT", - "license_file": null, - "description": "Macro for convenient module declaration. Each module can be put in a group, and visibility can be applied to the whole group with ease." + "repository": "https://github.com/sigurd4/moddef" }, { - "name": "multer", - "version": "3.1.0", "authors": "Rousan Ali ", - "repository": "https://github.com/rwf2/multer", + "description": "An async parser for `multipart/form-data` content-type in Rust.", "license": "MIT", "license_file": null, - "description": "An async parser for `multipart/form-data` content-type in Rust." + "name": "multer", + "repository": "https://github.com/rwf2/multer" }, { - "name": "multimap", - "version": "0.10.1", "authors": "Håvar Nøvik ", - "repository": "https://github.com/havarnov/multimap", + "description": "A multimap implementation.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A multimap implementation." + "name": "multimap", + "repository": "https://github.com/havarnov/multimap" }, { - "name": "naga", - "version": "25.0.1", "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu/tree/trunk/naga", + "description": "Shader translator and validator. Part of the wgpu project", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Shader translator and validator. Part of the wgpu project" + "name": "naga", + "repository": "https://github.com/gfx-rs/wgpu/tree/trunk/naga" }, { + "authors": "Steven Fackler ", + "description": "A wrapper over a platform's native TLS implementation", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "native-tls", - "version": "0.2.14", - "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/rust-native-tls", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A wrapper over a platform's native TLS implementation" + "repository": "https://github.com/sfackler/rust-native-tls" }, { - "name": "ndarray", - "version": "0.16.1", "authors": "Ulrik Sverdrup \"bluss\"|Jim Turner", - "repository": "https://github.com/rust-ndarray/ndarray", + "description": "An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting." + "name": "ndarray", + "repository": "https://github.com/rust-ndarray/ndarray" }, { - "name": "ndk-sys", - "version": "0.5.0+25.2.9519653", "authors": "The Rust Windowing contributors", - "repository": "https://github.com/rust-mobile/ndk", + "description": "FFI bindings for the Android NDK", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "FFI bindings for the Android NDK" + "name": "ndk-sys", + "repository": "https://github.com/rust-mobile/ndk" }, { - "name": "new_debug_unreachable", - "version": "1.0.6", "authors": "Matt Brubeck |Jonathan Reem ", - "repository": "https://github.com/mbrubeck/rust-debug-unreachable", + "description": "panic in debug, intrinsics::unreachable() in release (fork of debug_unreachable)", "license": "MIT", "license_file": null, - "description": "panic in debug, intrinsics::unreachable() in release (fork of debug_unreachable)" + "name": "new_debug_unreachable", + "repository": "https://github.com/mbrubeck/rust-debug-unreachable" }, { - "name": "nom", - "version": "7.1.3", "authors": "contact@geoffroycouprie.com", - "repository": "https://github.com/Geal/nom", + "description": "A byte-oriented, zero-copy, parser combinators library", "license": "MIT", "license_file": null, - "description": "A byte-oriented, zero-copy, parser combinators library" - }, - { "name": "nom", - "version": "8.0.0", - "authors": "contact@geoffroycouprie.com", - "repository": "https://github.com/rust-bakery/nom", - "license": "MIT", - "license_file": null, - "description": "A byte-oriented, zero-copy, parser combinators library" + "repository": "https://github.com/Geal/nom" + }, + { + "authors": "contact@geoffroycouprie.com", + "description": "A byte-oriented, zero-copy, parser combinators library", + "license": "MIT", + "license_file": null, + "name": "nom", + "repository": "https://github.com/rust-bakery/nom" }, { - "name": "ntapi", - "version": "0.4.1", "authors": "MSxDOS ", - "repository": "https://github.com/MSxDOS/ntapi", + "description": "FFI bindings for Native API", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "FFI bindings for Native API" + "name": "ntapi", + "repository": "https://github.com/MSxDOS/ntapi" }, { - "name": "nu-ansi-term", - "version": "0.46.0", "authors": "ogham@bsago.me|Ryan Scheel (Havvy) |Josh Triplett |The Nushell Project Developers", - "repository": "https://github.com/nushell/nu-ansi-term", + "description": "Library for ANSI terminal colors and styles (bold, underline)", "license": "MIT", "license_file": null, - "description": "Library for ANSI terminal colors and styles (bold, underline)" + "name": "nu-ansi-term", + "repository": "https://github.com/nushell/nu-ansi-term" }, { + "authors": "The Rust Project Developers", + "description": "A collection of numeric types and traits for Rust, including bigint, complex, rational, range iterators, generic integers, and more!", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num", - "version": "0.4.3", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A collection of numeric types and traits for Rust, including bigint, complex, rational, range iterators, generic integers, and more!" + "repository": "https://github.com/rust-num/num" }, { + "authors": "The Rust Project Developers", + "description": "Big integer implementation for Rust", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num-bigint", - "version": "0.4.6", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num-bigint", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Big integer implementation for Rust" + "repository": "https://github.com/rust-num/num-bigint" }, { + "authors": "The Rust Project Developers", + "description": "Complex numbers implementation for Rust", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num-complex", - "version": "0.4.6", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num-complex", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Complex numbers implementation for Rust" + "repository": "https://github.com/rust-num/num-complex" }, { - "name": "num-conv", - "version": "0.1.0", "authors": "Jacob Pratt ", - "repository": "https://github.com/jhpratt/num-conv", + "description": "`num_conv` is a crate to convert between integer types without using `as` casts. This provides better certainty when refactoring, makes the exact behavior of code more explicit, and allows using turbofish syntax.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "`num_conv` is a crate to convert between integer types without using `as` casts. This provides better certainty when refactoring, makes the exact behavior of code more explicit, and allows using turbofish syntax." + "name": "num-conv", + "repository": "https://github.com/jhpratt/num-conv" }, { - "name": "num-format", - "version": "0.4.4", "authors": "Brian Myers ", - "repository": "https://github.com/bcmyers/num-format", + "description": "A Rust crate for producing string-representations of numbers, formatted according to international standards", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A Rust crate for producing string-representations of numbers, formatted according to international standards" + "name": "num-format", + "repository": "https://github.com/bcmyers/num-format" }, { + "authors": "The Rust Project Developers", + "description": "Integer traits and functions", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num-integer", - "version": "0.1.46", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num-integer", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Integer traits and functions" + "repository": "https://github.com/rust-num/num-integer" }, { + "authors": "The Rust Project Developers", + "description": "External iterators for generic mathematics", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num-iter", - "version": "0.1.45", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num-iter", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "External iterators for generic mathematics" + "repository": "https://github.com/rust-num/num-iter" }, { + "authors": "The Rust Project Developers", + "description": "Rational numbers implementation for Rust", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num-rational", - "version": "0.4.2", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num-rational", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rational numbers implementation for Rust" + "repository": "https://github.com/rust-num/num-rational" }, { + "authors": "The Rust Project Developers", + "description": "Numeric traits for generic mathematics", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "num-traits", - "version": "0.2.19", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-num/num-traits", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Numeric traits for generic mathematics" + "repository": "https://github.com/rust-num/num-traits" }, { - "name": "num_cpus", - "version": "1.17.0", "authors": "Sean McArthur ", - "repository": "https://github.com/seanmonstar/num_cpus", + "description": "Get the number of CPUs on a machine.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Get the number of CPUs on a machine." + "name": "num_cpus", + "repository": "https://github.com/seanmonstar/num_cpus" }, { + "authors": "Daniel Wagner-Hall |Daniel Henry-Mantilla |Vincent Esche ", + "description": "Procedural macros to make inter-operation between primitives and enums easier.", + "license": "Apache-2.0 OR BSD-3-Clause OR MIT", + "license_file": null, "name": "num_enum", - "version": "0.7.3", - "authors": "Daniel Wagner-Hall |Daniel Henry-Mantilla |Vincent Esche ", - "repository": "https://github.com/illicitonion/num_enum", - "license": "Apache-2.0 OR BSD-3-Clause OR MIT", - "license_file": null, - "description": "Procedural macros to make inter-operation between primitives and enums easier." + "repository": "https://github.com/illicitonion/num_enum" }, { + "authors": "Daniel Wagner-Hall |Daniel Henry-Mantilla |Vincent Esche ", + "description": "Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)", + "license": "Apache-2.0 OR BSD-3-Clause OR MIT", + "license_file": null, "name": "num_enum_derive", - "version": "0.7.3", - "authors": "Daniel Wagner-Hall |Daniel Henry-Mantilla |Vincent Esche ", - "repository": "https://github.com/illicitonion/num_enum", - "license": "Apache-2.0 OR BSD-3-Clause OR MIT", - "license_file": null, - "description": "Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)" + "repository": "https://github.com/illicitonion/num_enum" }, { + "authors": "Cldfire", + "description": "A safe and ergonomic Rust wrapper for the NVIDIA Management Library", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "nvml-wrapper", - "version": "0.10.0", - "authors": "Cldfire", - "repository": "https://github.com/Cldfire/nvml-wrapper", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A safe and ergonomic Rust wrapper for the NVIDIA Management Library" + "repository": "https://github.com/Cldfire/nvml-wrapper" }, { + "authors": "Cldfire", + "description": "Generated bindings to the NVIDIA Management Library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "nvml-wrapper-sys", - "version": "0.8.0", - "authors": "Cldfire", - "repository": "https://github.com/Cldfire/nvml-wrapper", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Generated bindings to the NVIDIA Management Library." + "repository": "https://github.com/Cldfire/nvml-wrapper" }, { - "name": "objc", - "version": "0.2.7", "authors": "Steven Sheldon", - "repository": "http://github.com/SSheldon/rust-objc", + "description": "Objective-C Runtime bindings and wrapper for Rust.", "license": "MIT", "license_file": null, - "description": "Objective-C Runtime bindings and wrapper for Rust." + "name": "objc", + "repository": "http://github.com/SSheldon/rust-objc" }, { - "name": "object", - "version": "0.36.7", "authors": null, - "repository": "https://github.com/gimli-rs/object", + "description": "A unified interface for reading and writing object file formats.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A unified interface for reading and writing object file formats." + "name": "object", + "repository": "https://github.com/gimli-rs/object" }, { - "name": "once_cell", - "version": "1.21.3", "authors": "Aleksey Kladov ", - "repository": "https://github.com/matklad/once_cell", + "description": "Single assignment cells and lazy values.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Single assignment cells and lazy values." + "name": "once_cell", + "repository": "https://github.com/matklad/once_cell" }, { - "name": "openssl", - "version": "0.10.73", "authors": "Steven Fackler ", - "repository": "https://github.com/sfackler/rust-openssl", + "description": "OpenSSL bindings", "license": "Apache-2.0", "license_file": null, - "description": "OpenSSL bindings" + "name": "openssl", + "repository": "https://github.com/sfackler/rust-openssl" }, { - "name": "openssl-macros", - "version": "0.1.1", "authors": null, - "repository": null, + "description": "Internal macros used by the openssl crate.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Internal macros used by the openssl crate." + "name": "openssl-macros", + "repository": null }, { - "name": "openssl-probe", - "version": "0.1.6", "authors": "Alex Crichton ", - "repository": "https://github.com/alexcrichton/openssl-probe", + "description": "Tool for helping to find SSL certificate locations on the system for OpenSSL", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Tool for helping to find SSL certificate locations on the system for OpenSSL" + "name": "openssl-probe", + "repository": "https://github.com/alexcrichton/openssl-probe" }, { - "name": "openssl-sys", - "version": "0.9.109", "authors": "Alex Crichton |Steven Fackler ", - "repository": "https://github.com/sfackler/rust-openssl", + "description": "FFI bindings to OpenSSL", "license": "MIT", "license_file": null, - "description": "FFI bindings to OpenSSL" + "name": "openssl-sys", + "repository": "https://github.com/sfackler/rust-openssl" }, { - "name": "option-ext", - "version": "0.2.0", "authors": "Simon Ochsenreither ", - "repository": "https://github.com/soc/option-ext.git", + "description": "Extends `Option` with additional operations", "license": "MPL-2.0", "license_file": null, - "description": "Extends `Option` with additional operations" + "name": "option-ext", + "repository": "https://github.com/soc/option-ext.git" }, { - "name": "ordered-float", - "version": "2.10.1", "authors": "Jonathan Reem |Matt Brubeck ", - "repository": "https://github.com/reem/rust-ordered-float", + "description": "Wrappers for total ordering on floats", "license": "MIT", "license_file": null, - "description": "Wrappers for total ordering on floats" + "name": "ordered-float", + "repository": "https://github.com/reem/rust-ordered-float" }, { - "name": "ordered-float", - "version": "4.6.0", "authors": "Jonathan Reem |Matt Brubeck ", - "repository": "https://github.com/reem/rust-ordered-float", + "description": "Wrappers for total ordering on floats", "license": "MIT", "license_file": null, - "description": "Wrappers for total ordering on floats" + "name": "ordered-float", + "repository": "https://github.com/reem/rust-ordered-float" }, { - "name": "overload", - "version": "0.1.1", "authors": "Daniel Salvadori ", - "repository": "https://github.com/danaugrs/overload", + "description": "Provides a macro to simplify operator overloading.", "license": "MIT", "license_file": null, - "description": "Provides a macro to simplify operator overloading." + "name": "overload", + "repository": "https://github.com/danaugrs/overload" }, { - "name": "parking", - "version": "2.2.1", "authors": "Stjepan Glavina |The Rust Project Developers", - "repository": "https://github.com/smol-rs/parking", + "description": "Thread parking and unparking", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Thread parking and unparking" + "name": "parking", + "repository": "https://github.com/smol-rs/parking" }, { + "authors": "Amanieu d'Antras ", + "description": "More compact and efficient implementations of the standard synchronization primitives.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "parking_lot", - "version": "0.12.4", - "authors": "Amanieu d'Antras ", - "repository": "https://github.com/Amanieu/parking_lot", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "More compact and efficient implementations of the standard synchronization primitives." + "repository": "https://github.com/Amanieu/parking_lot" }, { + "authors": "Amanieu d'Antras ", + "description": "An advanced API for creating custom synchronization primitives.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "parking_lot_core", - "version": "0.9.11", - "authors": "Amanieu d'Antras ", - "repository": "https://github.com/Amanieu/parking_lot", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An advanced API for creating custom synchronization primitives." + "repository": "https://github.com/Amanieu/parking_lot" }, { + "authors": "RustCrypto Developers", + "description": "Traits which describe the functionality of password hashing algorithms, as well as a `no_std`-friendly implementation of the PHC string format (a well-defined subset of the Modular Crypt Format a.k.a. MCF)", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "password-hash", - "version": "0.5.0", - "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/traits/tree/master/password-hash", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Traits which describe the functionality of password hashing algorithms, as well as a `no_std`-friendly implementation of the PHC string format (a well-defined subset of the Modular Crypt Format a.k.a. MCF)" + "repository": "https://github.com/RustCrypto/traits/tree/master/password-hash" }, { - "name": "paste", - "version": "1.0.15", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/paste", + "description": "Macros for all your token pasting needs", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Macros for all your token pasting needs" + "name": "paste", + "repository": "https://github.com/dtolnay/paste" }, { - "name": "pbkdf2", - "version": "0.12.2", "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2", + "description": "Generic implementation of PBKDF2", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Generic implementation of PBKDF2" + "name": "pbkdf2", + "repository": "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2" }, { + "authors": "The rust-url developers", + "description": "Percent encoding and decoding", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "percent-encoding", - "version": "2.3.1", - "authors": "The rust-url developers", - "repository": "https://github.com/servo/rust-url/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Percent encoding and decoding" + "repository": "https://github.com/servo/rust-url/" }, { + "authors": "The rust-url developers", + "description": "Percent encoding and decoding, preserving non-Latin characters.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "percent-encoding-iri", - "version": "2.2.0", - "authors": "The rust-url developers", - "repository": "https://github.com/servo/rust-url/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Percent encoding and decoding, preserving non-Latin characters." + "repository": "https://github.com/servo/rust-url/" }, { - "name": "petgraph", - "version": "0.7.1", "authors": "bluss|mitchmindtree", - "repository": "https://github.com/petgraph/petgraph", + "description": "Graph data structure library. Provides graph types and graph algorithms.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Graph data structure library. Provides graph types and graph algorithms." + "name": "petgraph", + "repository": "https://github.com/petgraph/petgraph" }, { + "authors": "Steven Fackler ", + "description": "Runtime support for perfect hash function data structures", + "license": "MIT", + "license_file": null, "name": "phf", - "version": "0.11.3", - "authors": "Steven Fackler ", - "repository": "https://github.com/rust-phf/rust-phf", - "license": "MIT", - "license_file": null, - "description": "Runtime support for perfect hash function data structures" + "repository": "https://github.com/rust-phf/rust-phf" }, { + "authors": "Steven Fackler ", + "description": "Codegen library for PHF types", + "license": "MIT", + "license_file": null, "name": "phf_codegen", - "version": "0.11.3", - "authors": "Steven Fackler ", - "repository": "https://github.com/rust-phf/rust-phf", - "license": "MIT", - "license_file": null, - "description": "Codegen library for PHF types" + "repository": "https://github.com/rust-phf/rust-phf" }, { + "authors": "Steven Fackler ", + "description": "PHF generation logic", + "license": "MIT", + "license_file": null, "name": "phf_generator", - "version": "0.11.3", - "authors": "Steven Fackler ", - "repository": "https://github.com/rust-phf/rust-phf", - "license": "MIT", - "license_file": null, - "description": "PHF generation logic" + "repository": "https://github.com/rust-phf/rust-phf" }, { + "authors": "Steven Fackler ", + "description": "Macros to generate types in the phf crate", + "license": "MIT", + "license_file": null, "name": "phf_macros", - "version": "0.11.3", - "authors": "Steven Fackler ", - "repository": "https://github.com/rust-phf/rust-phf", - "license": "MIT", - "license_file": null, - "description": "Macros to generate types in the phf crate" + "repository": "https://github.com/rust-phf/rust-phf" }, { + "authors": "Steven Fackler ", + "description": "Support code shared by PHF libraries", + "license": "MIT", + "license_file": null, "name": "phf_shared", - "version": "0.11.3", - "authors": "Steven Fackler ", - "repository": "https://github.com/rust-phf/rust-phf", - "license": "MIT", - "license_file": null, - "description": "Support code shared by PHF libraries" + "repository": "https://github.com/rust-phf/rust-phf" }, { + "authors": null, + "description": "A crate for safe and ergonomic pin-projection.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "pin-project", - "version": "1.1.10", - "authors": null, - "repository": "https://github.com/taiki-e/pin-project", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A crate for safe and ergonomic pin-projection." + "repository": "https://github.com/taiki-e/pin-project" }, { + "authors": null, + "description": "Implementation detail of the `pin-project` crate.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "pin-project-internal", - "version": "1.1.10", - "authors": null, - "repository": "https://github.com/taiki-e/pin-project", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Implementation detail of the `pin-project` crate." + "repository": "https://github.com/taiki-e/pin-project" }, { + "authors": null, + "description": "A lightweight version of pin-project written with declarative macros.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "pin-project-lite", - "version": "0.2.16", - "authors": null, - "repository": "https://github.com/taiki-e/pin-project-lite", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A lightweight version of pin-project written with declarative macros." + "repository": "https://github.com/taiki-e/pin-project-lite" }, { - "name": "pin-utils", - "version": "0.1.0", "authors": "Josef Brandl ", - "repository": "https://github.com/rust-lang-nursery/pin-utils", + "description": "Utilities for pinning", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Utilities for pinning" + "name": "pin-utils", + "repository": "https://github.com/rust-lang-nursery/pin-utils" }, { - "name": "pkg-config", - "version": "0.3.32", "authors": "Alex Crichton ", - "repository": "https://github.com/rust-lang/pkg-config-rs", + "description": "A library to run the pkg-config system tool at build time in order to be used in Cargo build scripts.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A library to run the pkg-config system tool at build time in order to be used in Cargo build scripts." + "name": "pkg-config", + "repository": "https://github.com/rust-lang/pkg-config-rs" }, { + "authors": null, + "description": "Portable atomic types including support for 128-bit atomics, atomic float, etc.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "portable-atomic", - "version": "1.11.1", - "authors": null, - "repository": "https://github.com/taiki-e/portable-atomic", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Portable atomic types including support for 128-bit atomics, atomic float, etc." + "repository": "https://github.com/taiki-e/portable-atomic" }, { + "authors": null, + "description": "Synchronization primitives built with portable-atomic.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "portable-atomic-util", - "version": "0.2.4", - "authors": null, - "repository": "https://github.com/taiki-e/portable-atomic", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Synchronization primitives built with portable-atomic." + "repository": "https://github.com/taiki-e/portable-atomic" }, { - "name": "potential_utf", - "version": "0.1.2", "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", + "description": "Unvalidated string and character types", "license": "Unicode-3.0", "license_file": null, - "description": "Unvalidated string and character types" + "name": "potential_utf", + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "powerfmt", - "version": "0.2.0", "authors": "Jacob Pratt ", - "repository": "https://github.com/jhpratt/powerfmt", + "description": "`powerfmt` is a library that provides utilities for formatting values. This crate makes it significantly easier to support filling to a minimum width with alignment, avoid heap allocation, and avoid repetitive calculations.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "`powerfmt` is a library that provides utilities for formatting values. This crate makes it significantly easier to support filling to a minimum width with alignment, avoid heap allocation, and avoid repetitive calculations." + "name": "powerfmt", + "repository": "https://github.com/jhpratt/powerfmt" }, { - "name": "ppv-lite86", - "version": "0.2.21", "authors": "The CryptoCorrosion Contributors", - "repository": "https://github.com/cryptocorrosion/cryptocorrosion", + "description": "Cross-platform cryptography-oriented low-level SIMD library.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Cross-platform cryptography-oriented low-level SIMD library." + "name": "ppv-lite86", + "repository": "https://github.com/cryptocorrosion/cryptocorrosion" }, { - "name": "precomputed-hash", - "version": "0.1.1", "authors": "Emilio Cobos Álvarez ", - "repository": "https://github.com/emilio/precomputed-hash", + "description": "A library intending to be a base dependency to expose a precomputed hash", "license": "MIT", "license_file": null, - "description": "A library intending to be a base dependency to expose a precomputed hash" + "name": "precomputed-hash", + "repository": "https://github.com/emilio/precomputed-hash" }, { - "name": "presser", - "version": "0.3.1", "authors": "Embark |Gray Olson ", - "repository": "https://github.com/dtolnay/prettyplease", + "description": "A minimal `syn` syntax tree pretty-printer", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A minimal `syn` syntax tree pretty-printer" + "name": "prettyplease", + "repository": "https://github.com/dtolnay/prettyplease" }, { - "name": "priority-queue", - "version": "2.5.0", "authors": "Gianmarco Garrisi ", - "repository": "https://github.com/garro95/priority-queue", + "description": "A Priority Queue implemented as a heap with a function to efficiently change the priority of an item.", "license": "LGPL-3.0-or-later OR MPL-2.0", "license_file": null, - "description": "A Priority Queue implemented as a heap with a function to efficiently change the priority of an item." + "name": "priority-queue", + "repository": "https://github.com/garro95/priority-queue" }, { - "name": "proc-macro-crate", - "version": "3.3.0", "authors": "Bastian Köcher ", - "repository": "https://github.com/bkchr/proc-macro-crate", + "description": "Replacement for crate (macro_rules keyword) in proc-macros", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Replacement for crate (macro_rules keyword) in proc-macros" + "name": "proc-macro-crate", + "repository": "https://github.com/bkchr/proc-macro-crate" }, { + "authors": "David Tolnay ", + "description": "Procedural macros in expression position", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "proc-macro-hack", - "version": "0.5.20+deprecated", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/proc-macro-hack", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Procedural macros in expression position" + "repository": "https://github.com/dtolnay/proc-macro-hack" }, { - "name": "proc-macro2", - "version": "1.0.95", "authors": "David Tolnay |Alex Crichton ", - "repository": "https://github.com/dtolnay/proc-macro2", + "description": "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case." + "name": "proc-macro2", + "repository": "https://github.com/dtolnay/proc-macro2" }, { - "name": "profiling", - "version": "1.0.16", "authors": "Philip Degarmo ", - "repository": "https://github.com/aclysma/profiling", + "description": "This crate provides a very thin abstraction over other profiler crates.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "This crate provides a very thin abstraction over other profiler crates." + "name": "profiling", + "repository": "https://github.com/aclysma/profiling" }, { + "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", + "description": "A Protocol Buffers implementation for the Rust Language.", + "license": "Apache-2.0", + "license_file": null, "name": "prost", - "version": "0.13.5", - "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/prost", - "license": "Apache-2.0", - "license_file": null, - "description": "A Protocol Buffers implementation for the Rust Language." + "repository": "https://github.com/tokio-rs/prost" }, { + "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", + "description": "Generate Prost annotated Rust types from Protocol Buffers files.", + "license": "Apache-2.0", + "license_file": null, "name": "prost-build", - "version": "0.13.5", - "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/prost", - "license": "Apache-2.0", - "license_file": null, - "description": "Generate Prost annotated Rust types from Protocol Buffers files." + "repository": "https://github.com/tokio-rs/prost" }, { + "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", + "description": "Generate encoding and decoding implementations for Prost annotated types.", + "license": "Apache-2.0", + "license_file": null, "name": "prost-derive", - "version": "0.13.5", - "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/prost", - "license": "Apache-2.0", - "license_file": null, - "description": "Generate encoding and decoding implementations for Prost annotated types." + "repository": "https://github.com/tokio-rs/prost" }, { - "name": "prost-reflect", - "version": "0.14.7", "authors": "Andrew Hickman ", - "repository": "https://github.com/andrewhickman/prost-reflect", + "description": "A protobuf library extending prost with reflection support and dynamic messages.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A protobuf library extending prost with reflection support and dynamic messages." + "name": "prost-reflect", + "repository": "https://github.com/andrewhickman/prost-reflect" }, { - "name": "prost-types", - "version": "0.13.5", "authors": "Dan Burkert |Lucio Franco |Casper Meijn |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/prost", + "description": "Prost definitions of Protocol Buffers well known types.", "license": "Apache-2.0", "license_file": null, - "description": "Prost definitions of Protocol Buffers well known types." + "name": "prost-types", + "repository": "https://github.com/tokio-rs/prost" }, { + "authors": "Raph Levien |Marcus Klaas de Vries ", + "description": "A pull parser for CommonMark", + "license": "MIT", + "license_file": null, "name": "pulldown-cmark", - "version": "0.13.0", - "authors": "Raph Levien |Marcus Klaas de Vries ", - "repository": "https://github.com/raphlinus/pulldown-cmark", - "license": "MIT", - "license_file": null, - "description": "A pull parser for CommonMark" + "repository": "https://github.com/raphlinus/pulldown-cmark" }, { + "authors": "Raph Levien |Marcus Klaas de Vries ", + "description": "An escape library for HTML created in the pulldown-cmark project", + "license": "MIT", + "license_file": null, "name": "pulldown-cmark-escape", - "version": "0.11.0", - "authors": "Raph Levien |Marcus Klaas de Vries ", - "repository": "https://github.com/raphlinus/pulldown-cmark", - "license": "MIT", - "license_file": null, - "description": "An escape library for HTML created in the pulldown-cmark project" + "repository": "https://github.com/raphlinus/pulldown-cmark" }, { - "name": "pulp", - "version": "0.18.22", "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/pulp/", + "description": "Safe generic simd", "license": "MIT", "license_file": null, - "description": "Safe generic simd" - }, - { "name": "pulp", - "version": "0.21.5", - "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/pulp/", - "license": "MIT", - "license_file": null, - "description": "Safe generic simd" + "repository": "https://github.com/sarah-ek/pulp/" }, { + "authors": "sarah <>", + "description": "Safe generic simd", + "license": "MIT", + "license_file": null, + "name": "pulp", + "repository": "https://github.com/sarah-ek/pulp/" + }, + { + "authors": null, + "description": "Versatile QUIC transport protocol implementation", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "quinn", - "version": "0.11.8", - "authors": null, - "repository": "https://github.com/quinn-rs/quinn", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Versatile QUIC transport protocol implementation" + "repository": "https://github.com/quinn-rs/quinn" }, { + "authors": null, + "description": "State machine for the QUIC transport protocol", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "quinn-proto", - "version": "0.11.12", - "authors": null, - "repository": "https://github.com/quinn-rs/quinn", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "State machine for the QUIC transport protocol" + "repository": "https://github.com/quinn-rs/quinn" }, { + "authors": null, + "description": "UDP sockets with ECN information for the QUIC transport protocol", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "quinn-udp", - "version": "0.5.12", - "authors": null, - "repository": "https://github.com/quinn-rs/quinn", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "UDP sockets with ECN information for the QUIC transport protocol" + "repository": "https://github.com/quinn-rs/quinn" }, { - "name": "quote", - "version": "1.0.40", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/quote", + "description": "Quasi-quoting macro quote!(...)", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Quasi-quoting macro quote!(...)" + "name": "quote", + "repository": "https://github.com/dtolnay/quote" }, { - "name": "r-efi", - "version": "5.2.0", "authors": null, - "repository": "https://github.com/r-efi/r-efi", + "description": "UEFI Reference Specification Protocol Constants and Definitions", "license": "Apache-2.0 OR LGPL-2.1-or-later OR MIT", "license_file": null, - "description": "UEFI Reference Specification Protocol Constants and Definitions" + "name": "r-efi", + "repository": "https://github.com/r-efi/r-efi" }, { + "authors": "The Rand Project Developers|The Rust Project Developers", + "description": "Random number generators and other randomness functionality.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "rand", - "version": "0.8.5", - "authors": "The Rand Project Developers|The Rust Project Developers", - "repository": "https://github.com/rust-random/rand", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Random number generators and other randomness functionality." + "repository": "https://github.com/rust-random/rand" }, { + "authors": "The Rand Project Developers|The Rust Project Developers", + "description": "Random number generators and other randomness functionality.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "rand", - "version": "0.9.1", - "authors": "The Rand Project Developers|The Rust Project Developers", - "repository": "https://github.com/rust-random/rand", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Random number generators and other randomness functionality." + "repository": "https://github.com/rust-random/rand" }, { - "name": "rand_chacha", - "version": "0.3.1", "authors": "The Rand Project Developers|The Rust Project Developers|The CryptoCorrosion Contributors", - "repository": "https://github.com/rust-random/rand", + "description": "ChaCha random number generator", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "ChaCha random number generator" - }, - { "name": "rand_chacha", - "version": "0.9.0", + "repository": "https://github.com/rust-random/rand" + }, + { "authors": "The Rand Project Developers|The Rust Project Developers|The CryptoCorrosion Contributors", - "repository": "https://github.com/rust-random/rand", + "description": "ChaCha random number generator", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "ChaCha random number generator" + "name": "rand_chacha", + "repository": "https://github.com/rust-random/rand" }, { - "name": "rand_core", - "version": "0.6.4", "authors": "The Rand Project Developers|The Rust Project Developers", - "repository": "https://github.com/rust-random/rand", + "description": "Core random number generator traits and tools for implementation.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Core random number generator traits and tools for implementation." - }, - { "name": "rand_core", - "version": "0.9.3", - "authors": "The Rand Project Developers|The Rust Project Developers", - "repository": "https://github.com/rust-random/rand", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Core random number generator traits and tools for implementation." + "repository": "https://github.com/rust-random/rand" + }, + { + "authors": "The Rand Project Developers|The Rust Project Developers", + "description": "Core random number generator traits and tools for implementation.", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "rand_core", + "repository": "https://github.com/rust-random/rand" }, { - "name": "rand_distr", - "version": "0.5.1", "authors": "The Rand Project Developers", - "repository": "https://github.com/rust-random/rand_distr", + "description": "Sampling from random number distributions", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Sampling from random number distributions" + "name": "rand_distr", + "repository": "https://github.com/rust-random/rand_distr" }, { - "name": "range-alloc", - "version": "0.1.4", "authors": "the gfx-rs Developers", - "repository": "https://github.com/gfx-rs/range-alloc", + "description": "Generic range allocator", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Generic range allocator" + "name": "range-alloc", + "repository": "https://github.com/gfx-rs/range-alloc" }, { - "name": "raw-cpuid", - "version": "10.7.0", "authors": "Gerd Zellweger ", - "repository": "https://github.com/gz/rust-cpuid", + "description": "A library to parse the x86 CPUID instruction, written in rust with no external dependencies. The implementation closely resembles the Intel CPUID manual description. The library does only depend on libcore.", "license": "MIT", "license_file": null, - "description": "A library to parse the x86 CPUID instruction, written in rust with no external dependencies. The implementation closely resembles the Intel CPUID manual description. The library does only depend on libcore." + "name": "raw-cpuid", + "repository": "https://github.com/gz/rust-cpuid" }, { - "name": "raw-cpuid", - "version": "11.5.0", "authors": "Gerd Zellweger ", - "repository": "https://github.com/gz/rust-cpuid", + "description": "A library to parse the x86 CPUID instruction, written in rust with no external dependencies. The implementation closely resembles the Intel CPUID manual description. The library does only depend on libcore.", "license": "MIT", "license_file": null, - "description": "A library to parse the x86 CPUID instruction, written in rust with no external dependencies. The implementation closely resembles the Intel CPUID manual description. The library does only depend on libcore." + "name": "raw-cpuid", + "repository": "https://github.com/gz/rust-cpuid" }, { - "name": "raw-window-handle", - "version": "0.6.2", "authors": "Osspial ", - "repository": "https://github.com/rust-windowing/raw-window-handle", + "description": "Interoperability library for Rust Windowing applications.", "license": "Apache-2.0 OR MIT OR Zlib", "license_file": null, - "description": "Interoperability library for Rust Windowing applications." + "name": "raw-window-handle", + "repository": "https://github.com/rust-windowing/raw-window-handle" }, { - "name": "rawpointer", - "version": "0.2.1", "authors": "bluss", - "repository": "https://github.com/bluss/rawpointer/", + "description": "Extra methods for raw pointers and `NonNull`. For example `.post_inc()` and `.pre_dec()` (c.f. `ptr++` and `--ptr`), `offset` and `add` for `NonNull`, and the function `ptrdistance`.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Extra methods for raw pointers and `NonNull`. For example `.post_inc()` and `.pre_dec()` (c.f. `ptr++` and `--ptr`), `offset` and `add` for `NonNull`, and the function `ptrdistance`." + "name": "rawpointer", + "repository": "https://github.com/bluss/rawpointer/" }, { + "authors": "Niko Matsakis |Josh Stone ", + "description": "Simple work-stealing parallelism for Rust", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "rayon", - "version": "1.10.0", - "authors": "Niko Matsakis |Josh Stone ", - "repository": "https://github.com/rayon-rs/rayon", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Simple work-stealing parallelism for Rust" + "repository": "https://github.com/rayon-rs/rayon" }, { + "authors": "Niko Matsakis |Josh Stone ", + "description": "Core APIs for Rayon", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "rayon-core", - "version": "1.12.1", - "authors": "Niko Matsakis |Josh Stone ", - "repository": "https://github.com/rayon-rs/rayon", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Core APIs for Rayon" + "repository": "https://github.com/rayon-rs/rayon" }, { - "name": "reborrow", - "version": "0.5.5", "authors": "sarah <>", - "repository": "https://github.com/sarah-ek/reborrow/", + "description": "Emulate reborrowing for user types.", "license": "MIT", "license_file": null, - "description": "Emulate reborrowing for user types." + "name": "reborrow", + "repository": "https://github.com/sarah-ek/reborrow/" }, { - "name": "redox_syscall", - "version": "0.5.13", "authors": "Jeremy Soller ", - "repository": "https://gitlab.redox-os.org/redox-os/syscall", + "description": "A Rust library to access raw Redox system calls", "license": "MIT", "license_file": null, - "description": "A Rust library to access raw Redox system calls" + "name": "redox_syscall", + "repository": "https://gitlab.redox-os.org/redox-os/syscall" }, { - "name": "redox_users", - "version": "0.4.6", "authors": "Jose Narvaez |Wesley Hershberger ", - "repository": "https://gitlab.redox-os.org/redox-os/users", + "description": "A Rust library to access Redox users and groups functionality", "license": "MIT", "license_file": null, - "description": "A Rust library to access Redox users and groups functionality" - }, - { "name": "redox_users", - "version": "0.5.0", - "authors": "Jose Narvaez |Wesley Hershberger ", - "repository": "https://gitlab.redox-os.org/redox-os/users", - "license": "MIT", - "license_file": null, - "description": "A Rust library to access Redox users and groups functionality" + "repository": "https://gitlab.redox-os.org/redox-os/users" + }, + { + "authors": "Jose Narvaez |Wesley Hershberger ", + "description": "A Rust library to access Redox users and groups functionality", + "license": "MIT", + "license_file": null, + "name": "redox_users", + "repository": "https://gitlab.redox-os.org/redox-os/users" }, { - "name": "regex", - "version": "1.11.1", "authors": "The Rust Project Developers|Andrew Gallant ", - "repository": "https://github.com/rust-lang/regex", + "description": "An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs." + "name": "regex", + "repository": "https://github.com/rust-lang/regex" }, { - "name": "regex-automata", - "version": "0.1.10", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/regex-automata", + "description": "Automata construction and matching using regular expressions.", "license": "MIT OR Unlicense", "license_file": null, - "description": "Automata construction and matching using regular expressions." - }, - { "name": "regex-automata", - "version": "0.4.9", - "authors": "The Rust Project Developers|Andrew Gallant ", - "repository": "https://github.com/rust-lang/regex/tree/master/regex-automata", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Automata construction and matching using regular expressions." + "repository": "https://github.com/BurntSushi/regex-automata" + }, + { + "authors": "The Rust Project Developers|Andrew Gallant ", + "description": "Automata construction and matching using regular expressions.", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "regex-automata", + "repository": "https://github.com/rust-lang/regex/tree/master/regex-automata" }, { - "name": "regex-syntax", - "version": "0.6.29", "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/regex", + "description": "A regular expression parser.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A regular expression parser." - }, - { "name": "regex-syntax", - "version": "0.8.5", + "repository": "https://github.com/rust-lang/regex" + }, + { "authors": "The Rust Project Developers|Andrew Gallant ", - "repository": "https://github.com/rust-lang/regex/tree/master/regex-syntax", + "description": "A regular expression parser.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A regular expression parser." + "name": "regex-syntax", + "repository": "https://github.com/rust-lang/regex/tree/master/regex-syntax" }, { - "name": "relative-path", - "version": "1.9.3", "authors": "John-John Tedro ", - "repository": "https://github.com/udoprog/relative-path", + "description": "Portable, relative paths for Rust.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Portable, relative paths for Rust." + "name": "relative-path", + "repository": "https://github.com/udoprog/relative-path" }, { - "name": "renderdoc-sys", - "version": "1.1.0", "authors": "Eyal Kalderon ", - "repository": "https://github.com/ebkalderon/renderdoc-rs", + "description": "Low-level bindings to the RenderDoc API", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Low-level bindings to the RenderDoc API" + "name": "renderdoc-sys", + "repository": "https://github.com/ebkalderon/renderdoc-rs" }, { - "name": "reqwest", - "version": "0.12.20", "authors": "Sean McArthur ", - "repository": "https://github.com/seanmonstar/reqwest", + "description": "higher level HTTP client library", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "higher level HTTP client library" + "name": "reqwest", + "repository": "https://github.com/seanmonstar/reqwest" }, { - "name": "ring", - "version": "0.17.14", "authors": null, - "repository": "https://github.com/briansmith/ring", + "description": "An experiment.", "license": "Apache-2.0 AND ISC", "license_file": null, - "description": "An experiment." + "name": "ring", + "repository": "https://github.com/briansmith/ring" }, { + "authors": "Evgeny Safronov ", + "description": "Pure Rust MessagePack serialization implementation", + "license": "MIT", + "license_file": null, "name": "rmp", - "version": "0.8.14", - "authors": "Evgeny Safronov ", - "repository": "https://github.com/3Hren/msgpack-rust", - "license": "MIT", - "license_file": null, - "description": "Pure Rust MessagePack serialization implementation" + "repository": "https://github.com/3Hren/msgpack-rust" }, { + "authors": "Evgeny Safronov ", + "description": "Serde bindings for RMP", + "license": "MIT", + "license_file": null, "name": "rmp-serde", - "version": "1.3.0", - "authors": "Evgeny Safronov ", - "repository": "https://github.com/3Hren/msgpack-rust", - "license": "MIT", - "license_file": null, - "description": "Serde bindings for RMP" + "repository": "https://github.com/3Hren/msgpack-rust" }, { + "authors": "Michele d'Amico ", + "description": "Rust fixture based test framework. It use procedural macro to implement fixtures and table based tests.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "rstest", - "version": "0.25.0", - "authors": "Michele d'Amico ", - "repository": "https://github.com/la10736/rstest", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust fixture based test framework. It use procedural macro to implement fixtures and table based tests." + "repository": "https://github.com/la10736/rstest" }, { + "authors": "Michele d'Amico ", + "description": "Rust fixture based test framework. It use procedural macro to implement fixtures and table based tests.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "rstest_macros", - "version": "0.25.0", - "authors": "Michele d'Amico ", - "repository": "https://github.com/la10736/rstest", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust fixture based test framework. It use procedural macro to implement fixtures and table based tests." + "repository": "https://github.com/la10736/rstest" }, { - "name": "rusqlite", - "version": "0.36.0", "authors": "The rusqlite developers", - "repository": "https://github.com/rusqlite/rusqlite", + "description": "Ergonomic wrapper for SQLite", "license": "MIT", "license_file": null, - "description": "Ergonomic wrapper for SQLite" + "name": "rusqlite", + "repository": "https://github.com/rusqlite/rusqlite" }, { - "name": "rustc-demangle", - "version": "0.1.25", "authors": "Alex Crichton ", - "repository": "https://github.com/rust-lang/rustc-demangle", + "description": "Rust compiler symbol demangling.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Rust compiler symbol demangling." + "name": "rustc-demangle", + "repository": "https://github.com/rust-lang/rustc-demangle" }, { - "name": "rustc-hash", - "version": "1.1.0", "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang-nursery/rustc-hash", + "description": "speed, non-cryptographic hash used in rustc", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "speed, non-cryptographic hash used in rustc" - }, - { "name": "rustc-hash", - "version": "2.1.1", - "authors": "The Rust Project Developers", - "repository": "https://github.com/rust-lang/rustc-hash", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A speedy, non-cryptographic hashing algorithm used by rustc" + "repository": "https://github.com/rust-lang-nursery/rustc-hash" + }, + { + "authors": "The Rust Project Developers", + "description": "A speedy, non-cryptographic hashing algorithm used by rustc", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "rustc-hash", + "repository": "https://github.com/rust-lang/rustc-hash" }, { - "name": "rustc_version", - "version": "0.4.1", "authors": null, - "repository": "https://github.com/djc/rustc-version-rs", + "description": "A library for querying the version of a installed rustc compiler", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A library for querying the version of a installed rustc compiler" + "name": "rustc_version", + "repository": "https://github.com/djc/rustc-version-rs" }, { - "name": "rustix", - "version": "1.0.7", "authors": "Dan Gohman |Jakub Konka ", - "repository": "https://github.com/bytecodealliance/rustix", + "description": "Safe Rust bindings to POSIX/Unix/Linux/Winsock-like syscalls", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT", "license_file": null, - "description": "Safe Rust bindings to POSIX/Unix/Linux/Winsock-like syscalls" + "name": "rustix", + "repository": "https://github.com/bytecodealliance/rustix" }, { + "authors": null, + "description": "Rustls is a modern TLS library written in Rust.", + "license": "Apache-2.0 OR ISC OR MIT", + "license_file": null, "name": "rustls", - "version": "0.23.28", - "authors": null, - "repository": "https://github.com/rustls/rustls", - "license": "Apache-2.0 OR ISC OR MIT", - "license_file": null, - "description": "Rustls is a modern TLS library written in Rust." + "repository": "https://github.com/rustls/rustls" }, { + "authors": null, + "description": "rustls-native-certs allows rustls to use the platform native certificate store", + "license": "Apache-2.0 OR ISC OR MIT", + "license_file": null, "name": "rustls-native-certs", - "version": "0.8.1", - "authors": null, - "repository": "https://github.com/rustls/rustls-native-certs", - "license": "Apache-2.0 OR ISC OR MIT", - "license_file": null, - "description": "rustls-native-certs allows rustls to use the platform native certificate store" + "repository": "https://github.com/rustls/rustls-native-certs" }, { + "authors": null, + "description": "Basic .pem file parser for keys and certificates", + "license": "Apache-2.0 OR ISC OR MIT", + "license_file": null, "name": "rustls-pemfile", - "version": "2.2.0", - "authors": null, - "repository": "https://github.com/rustls/pemfile", - "license": "Apache-2.0 OR ISC OR MIT", - "license_file": null, - "description": "Basic .pem file parser for keys and certificates" + "repository": "https://github.com/rustls/pemfile" }, { - "name": "rustls-pki-types", - "version": "1.12.0", "authors": null, - "repository": "https://github.com/rustls/pki-types", + "description": "Shared types for the rustls PKI ecosystem", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Shared types for the rustls PKI ecosystem" + "name": "rustls-pki-types", + "repository": "https://github.com/rustls/pki-types" }, { - "name": "rustls-webpki", - "version": "0.103.3", "authors": null, - "repository": "https://github.com/rustls/webpki", + "description": "Web PKI X.509 Certificate Verification.", "license": "ISC", "license_file": null, - "description": "Web PKI X.509 Certificate Verification." + "name": "rustls-webpki", + "repository": "https://github.com/rustls/webpki" }, { - "name": "rustversion", - "version": "1.0.21", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/rustversion", + "description": "Conditional compilation according to rustc compiler version", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Conditional compilation according to rustc compiler version" + "name": "rustversion", + "repository": "https://github.com/dtolnay/rustversion" }, { - "name": "ryu", - "version": "1.0.20", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/ryu", + "description": "Fast floating point to string conversion", "license": "Apache-2.0 OR BSL-1.0", "license_file": null, - "description": "Fast floating point to string conversion" + "name": "ryu", + "repository": "https://github.com/dtolnay/ryu" }, { - "name": "safetensors", - "version": "0.4.5", "authors": null, - "repository": "https://github.com/huggingface/safetensors", + "description": "Provides functions to read and write safetensors which aim to be safer than their PyTorch counterpart. The format is 8 bytes which is an unsized int, being the size of a JSON header, the JSON header refers the `dtype` the `shape` and `data_offsets` which are the offsets for the values in the rest of the file.", "license": "Apache-2.0", "license_file": null, - "description": "Provides functions to read and write safetensors which aim to be safer than their PyTorch counterpart. The format is 8 bytes which is an unsized int, being the size of a JSON header, the JSON header refers the `dtype` the `shape` and `data_offsets` which are the offsets for the values in the rest of the file." + "name": "safetensors", + "repository": "https://github.com/huggingface/safetensors" }, { - "name": "same-file", - "version": "1.0.6", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/same-file", + "description": "A simple crate for determining whether two file paths point to the same file.", "license": "MIT OR Unlicense", "license_file": null, - "description": "A simple crate for determining whether two file paths point to the same file." + "name": "same-file", + "repository": "https://github.com/BurntSushi/same-file" }, { - "name": "sanitize-filename", - "version": "0.5.0", "authors": "Jacob Brown ", - "repository": "https://github.com/kardeiz/sanitize-filename", + "description": "A simple filename sanitizer, based on Node's sanitize-filename", "license": "MIT", "license_file": null, - "description": "A simple filename sanitizer, based on Node's sanitize-filename" + "name": "sanitize-filename", + "repository": "https://github.com/kardeiz/sanitize-filename" }, { - "name": "sanitize-filename", - "version": "0.6.0", "authors": "Jacob Brown ", - "repository": "https://github.com/kardeiz/sanitize-filename", + "description": "A simple filename sanitizer, based on Node's sanitize-filename", "license": "MIT", "license_file": null, - "description": "A simple filename sanitizer, based on Node's sanitize-filename" + "name": "sanitize-filename", + "repository": "https://github.com/kardeiz/sanitize-filename" }, { - "name": "schannel", - "version": "0.1.27", "authors": "Steven Fackler |Steffen Butzer ", - "repository": "https://github.com/steffengy/schannel-rs", + "description": "Schannel bindings for rust, allowing SSL/TLS (e.g. https) without openssl", "license": "MIT", "license_file": null, - "description": "Schannel bindings for rust, allowing SSL/TLS (e.g. https) without openssl" + "name": "schannel", + "repository": "https://github.com/steffengy/schannel-rs" }, { - "name": "scopeguard", - "version": "1.2.0", "authors": "bluss", - "repository": "https://github.com/bluss/scopeguard", + "description": "A RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic). Defines the macros `defer!`, `defer_on_unwind!`, `defer_on_success!` as shorthands for guards with one of the implemented strategies.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic). Defines the macros `defer!`, `defer_on_unwind!`, `defer_on_success!` as shorthands for guards with one of the implemented strategies." + "name": "scopeguard", + "repository": "https://github.com/bluss/scopeguard" }, { - "name": "security-framework", - "version": "2.11.1", "authors": "Steven Fackler |Kornel ", - "repository": "https://github.com/kornelski/rust-security-framework", + "description": "Security.framework bindings for macOS and iOS", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Security.framework bindings for macOS and iOS" - }, - { "name": "security-framework", - "version": "3.2.0", - "authors": "Steven Fackler |Kornel ", - "repository": "https://github.com/kornelski/rust-security-framework", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Security.framework bindings for macOS and iOS" + "repository": "https://github.com/kornelski/rust-security-framework" }, { + "authors": "Steven Fackler |Kornel ", + "description": "Security.framework bindings for macOS and iOS", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "security-framework", + "repository": "https://github.com/kornelski/rust-security-framework" + }, + { + "authors": "Steven Fackler |Kornel ", + "description": "Apple `Security.framework` low-level FFI bindings", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "security-framework-sys", - "version": "2.14.0", - "authors": "Steven Fackler |Kornel ", - "repository": "https://github.com/kornelski/rust-security-framework", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Apple `Security.framework` low-level FFI bindings" + "repository": "https://github.com/kornelski/rust-security-framework" }, { - "name": "self_cell", - "version": "1.2.0", "authors": "Lukas Bergdoll ", - "repository": "https://github.com/Voultapher/self_cell", + "description": "Safe-to-use proc-macro-free self-referential structs in stable Rust.", "license": "Apache-2.0", "license_file": null, - "description": "Safe-to-use proc-macro-free self-referential structs in stable Rust." + "name": "self_cell", + "repository": "https://github.com/Voultapher/self_cell" }, { + "authors": "David Tolnay ", + "description": "Parser and evaluator for Cargo's flavor of Semantic Versioning", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "semver", - "version": "1.0.26", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/semver", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Parser and evaluator for Cargo's flavor of Semantic Versioning" + "repository": "https://github.com/dtolnay/semver" }, { + "authors": "David Tolnay ", + "description": "Macro to repeat sequentially indexed copies of a fragment of code.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "seq-macro", - "version": "0.3.6", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/seq-macro", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Macro to repeat sequentially indexed copies of a fragment of code." + "repository": "https://github.com/dtolnay/seq-macro" }, { + "authors": "Erick Tryzelaar |David Tolnay ", + "description": "A generic serialization/deserialization framework", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "serde", - "version": "1.0.219", - "authors": "Erick Tryzelaar |David Tolnay ", - "repository": "https://github.com/serde-rs/serde", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A generic serialization/deserialization framework" + "repository": "https://github.com/serde-rs/serde" }, { - "name": "serde-aux", - "version": "4.7.0", "authors": "Victor Polevoy ", - "repository": "https://github.com/iddm/serde-aux", + "description": "A serde crate's auxiliary library", "license": "MIT", "license_file": null, - "description": "A serde crate's auxiliary library" + "name": "serde-aux", + "repository": "https://github.com/iddm/serde-aux" }, { - "name": "serde-value", - "version": "0.7.0", "authors": "arcnmx", - "repository": "https://github.com/arcnmx/serde-value", + "description": "Serialization value trees", "license": "MIT", "license_file": null, - "description": "Serialization value trees" + "name": "serde-value", + "repository": "https://github.com/arcnmx/serde-value" }, { + "authors": "David Tolnay ", + "description": "Optimized handling of `&[u8]` and `Vec` for Serde", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "serde_bytes", - "version": "0.11.17", - "authors": "David Tolnay ", - "repository": "https://github.com/serde-rs/bytes", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Optimized handling of `&[u8]` and `Vec` for Serde" + "repository": "https://github.com/serde-rs/bytes" }, { + "authors": "Erick Tryzelaar |David Tolnay ", + "description": "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "serde_derive", - "version": "1.0.219", - "authors": "Erick Tryzelaar |David Tolnay ", - "repository": "https://github.com/serde-rs/serde", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" + "repository": "https://github.com/serde-rs/serde" }, { + "authors": "Erick Tryzelaar |David Tolnay ", + "description": "A JSON serialization file format", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "serde_json", - "version": "1.0.140", - "authors": "Erick Tryzelaar |David Tolnay ", - "repository": "https://github.com/serde-rs/json", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A JSON serialization file format" + "repository": "https://github.com/serde-rs/json" }, { + "authors": "David Tolnay ", + "description": "Path to the element that failed to deserialize", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "serde_path_to_error", - "version": "0.1.17", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/path-to-error", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Path to the element that failed to deserialize" + "repository": "https://github.com/dtolnay/path-to-error" }, { + "authors": "David Tolnay ", + "description": "Derive Serialize and Deserialize that delegates to the underlying repr of a C-like enum.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "serde_repr", - "version": "0.1.20", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/serde-repr", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Derive Serialize and Deserialize that delegates to the underlying repr of a C-like enum." + "repository": "https://github.com/dtolnay/serde-repr" }, { - "name": "serde_spanned", - "version": "0.6.9", "authors": null, - "repository": "https://github.com/toml-rs/toml", + "description": "Serde-compatible spanned Value", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Serde-compatible spanned Value" + "name": "serde_spanned", + "repository": "https://github.com/toml-rs/toml" }, { + "authors": "Jacob Brown ", + "description": "De/serialize structs with named fields as array of values", + "license": "MIT", + "license_file": null, "name": "serde_tuple", - "version": "1.1.0", - "authors": "Jacob Brown ", - "repository": "https://github.com/kardeiz/serde_tuple", - "license": "MIT", - "license_file": null, - "description": "De/serialize structs with named fields as array of values" + "repository": "https://github.com/kardeiz/serde_tuple" }, { + "authors": "Jacob Brown ", + "description": "Internal proc-macro crate for serde_tuple", + "license": "MIT", + "license_file": null, "name": "serde_tuple_macros", - "version": "1.0.1", - "authors": "Jacob Brown ", - "repository": "https://github.com/kardeiz/serde_tuple", - "license": "MIT", - "license_file": null, - "description": "Internal proc-macro crate for serde_tuple" + "repository": "https://github.com/kardeiz/serde_tuple" }, { - "name": "serde_urlencoded", - "version": "0.7.1", "authors": "Anthony Ramine ", - "repository": "https://github.com/nox/serde_urlencoded", + "description": "`x-www-form-urlencoded` meets Serde", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "`x-www-form-urlencoded` meets Serde" + "name": "serde_urlencoded", + "repository": "https://github.com/nox/serde_urlencoded" }, { + "authors": "RustCrypto Developers", + "description": "SHA-1 hash function", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "sha1", - "version": "0.10.6", - "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/hashes", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "SHA-1 hash function" + "repository": "https://github.com/RustCrypto/hashes" }, { + "authors": "RustCrypto Developers", + "description": "Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "sha2", - "version": "0.10.9", - "authors": "RustCrypto Developers", - "repository": "https://github.com/RustCrypto/hashes", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512." + "repository": "https://github.com/RustCrypto/hashes" }, { - "name": "sharded-slab", - "version": "0.1.7", "authors": "Eliza Weisman ", - "repository": "https://github.com/hawkw/sharded-slab", + "description": "A lock-free concurrent slab.", "license": "MIT", "license_file": null, - "description": "A lock-free concurrent slab." + "name": "sharded-slab", + "repository": "https://github.com/hawkw/sharded-slab" }, { - "name": "shlex", - "version": "1.3.0", "authors": "comex |Fenhl |Adrian Taylor |Alex Touchet |Daniel Parks |Garrett Berg ", - "repository": "https://github.com/comex/rust-shlex", + "description": "Split a string into shell words, like Python's shlex.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Split a string into shell words, like Python's shlex." + "name": "shlex", + "repository": "https://github.com/comex/rust-shlex" }, { - "name": "signal-hook-registry", - "version": "1.4.5", "authors": "Michal 'vorner' Vaner |Masaki Hara ", - "repository": "https://github.com/vorner/signal-hook", + "description": "Backend crate for signal-hook", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Backend crate for signal-hook" + "name": "signal-hook-registry", + "repository": "https://github.com/vorner/signal-hook" }, { - "name": "simd-adler32", - "version": "0.3.7", "authors": "Marvin Countryman ", - "repository": "https://github.com/mcountryman/simd-adler32", + "description": "A SIMD-accelerated Adler-32 hash algorithm implementation.", "license": "MIT", "license_file": null, - "description": "A SIMD-accelerated Adler-32 hash algorithm implementation." + "name": "simd-adler32", + "repository": "https://github.com/mcountryman/simd-adler32" }, { - "name": "siphasher", - "version": "1.0.1", "authors": "Frank Denis ", - "repository": "https://github.com/jedisct1/rust-siphash", + "description": "SipHash-2-4, SipHash-1-3 and 128-bit variants in pure Rust", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "SipHash-2-4, SipHash-1-3 and 128-bit variants in pure Rust" + "name": "siphasher", + "repository": "https://github.com/jedisct1/rust-siphash" }, { - "name": "slab", - "version": "0.4.10", "authors": "Carl Lerche ", - "repository": "https://github.com/tokio-rs/slab", + "description": "Pre-allocated storage for a uniform data type", "license": "MIT", "license_file": null, - "description": "Pre-allocated storage for a uniform data type" + "name": "slab", + "repository": "https://github.com/tokio-rs/slab" }, { - "name": "slotmap", - "version": "1.0.7", "authors": "Orson Peters ", - "repository": "https://github.com/orlp/slotmap", + "description": "Slotmap data structure", "license": "Zlib", "license_file": null, - "description": "Slotmap data structure" + "name": "slotmap", + "repository": "https://github.com/orlp/slotmap" }, { - "name": "smallvec", - "version": "1.15.1", "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/rust-smallvec", + "description": "'Small vector' optimization: store up to a small number of items on the stack", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "'Small vector' optimization: store up to a small number of items on the stack" + "name": "smallvec", + "repository": "https://github.com/servo/rust-smallvec" }, { + "authors": "Jake Goulding ", + "description": "An ergonomic error handling library", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "snafu", - "version": "0.8.6", - "authors": "Jake Goulding ", - "repository": "https://github.com/shepmaster/snafu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An ergonomic error handling library" + "repository": "https://github.com/shepmaster/snafu" }, { + "authors": "Jake Goulding ", + "description": "An ergonomic error handling library", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "snafu-derive", - "version": "0.8.6", - "authors": "Jake Goulding ", - "repository": "https://github.com/shepmaster/snafu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "An ergonomic error handling library" + "repository": "https://github.com/shepmaster/snafu" }, { - "name": "snowflake", - "version": "1.3.0", "authors": "Steven Allen ", - "repository": "https://github.com/Stebalien/snowflake", + "description": "A module for generating guaranteed process unique IDs.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A module for generating guaranteed process unique IDs." + "name": "snowflake", + "repository": "https://github.com/Stebalien/snowflake" }, { - "name": "socket2", - "version": "0.5.10", "authors": "Alex Crichton |Thomas de Zeeuw ", - "repository": "https://github.com/rust-lang/socket2", + "description": "Utilities for handling networking sockets with a maximal amount of configuration possible intended.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Utilities for handling networking sockets with a maximal amount of configuration possible intended." + "name": "socket2", + "repository": "https://github.com/rust-lang/socket2" }, { - "name": "spin", - "version": "0.9.8", "authors": "Mathijs van de Nes |John Ericson |Joshua Barretto ", - "repository": "https://github.com/mvdnes/spin-rs.git", + "description": "Spin-based synchronization primitives", "license": "MIT", "license_file": null, - "description": "Spin-based synchronization primitives" + "name": "spin", + "repository": "https://github.com/mvdnes/spin-rs.git" }, { - "name": "spin", - "version": "0.10.0", "authors": "Mathijs van de Nes |John Ericson |Joshua Barretto ", - "repository": "https://github.com/mvdnes/spin-rs.git", + "description": "Spin-based synchronization primitives", "license": "MIT", "license_file": null, - "description": "Spin-based synchronization primitives" + "name": "spin", + "repository": "https://github.com/mvdnes/spin-rs.git" }, { - "name": "spirv", - "version": "0.3.0+sdk-1.3.268.0", "authors": "Lei Zhang ", - "repository": "https://github.com/gfx-rs/rspirv", + "description": "Rust definition of SPIR-V structs and enums", "license": "Apache-2.0", "license_file": null, - "description": "Rust definition of SPIR-V structs and enums" + "name": "spirv", + "repository": "https://github.com/gfx-rs/rspirv" }, { - "name": "stable_deref_trait", - "version": "1.2.0", "authors": "Robert Grosse ", - "repository": "https://github.com/storyyeller/stable_deref_trait", + "description": "An unsafe marker trait for types like Box and Rc that dereference to a stable address even when moved, and hence can be used with libraries such as owning_ref and rental.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "An unsafe marker trait for types like Box and Rc that dereference to a stable address even when moved, and hence can be used with libraries such as owning_ref and rental." + "name": "stable_deref_trait", + "repository": "https://github.com/storyyeller/stable_deref_trait" }, { - "name": "static_assertions", - "version": "1.1.0", "authors": "Nikolai Vazquez", - "repository": "https://github.com/nvzqz/static-assertions-rs", + "description": "Compile-time assertions to ensure that invariants are met.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Compile-time assertions to ensure that invariants are met." + "name": "static_assertions", + "repository": "https://github.com/nvzqz/static-assertions-rs" }, { + "authors": "The Servo Project Developers", + "description": "A string interning library for Rust, developed as part of the Servo project.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "string_cache", - "version": "0.8.9", - "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/string-cache", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A string interning library for Rust, developed as part of the Servo project." + "repository": "https://github.com/servo/string-cache" }, { + "authors": "The Servo Project Developers", + "description": "A codegen library for string-cache, developed as part of the Servo project.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "string_cache_codegen", - "version": "0.5.4", - "authors": "The Servo Project Developers", - "repository": "https://github.com/servo/string-cache", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A codegen library for string-cache, developed as part of the Servo project." + "repository": "https://github.com/servo/string-cache" }, { - "name": "strsim", - "version": "0.11.1", "authors": "Danny Guo |maxbachmann ", - "repository": "https://github.com/rapidfuzz/strsim-rs", + "description": "Implementations of string similarity metrics. Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and Sørensen-Dice.", "license": "MIT", "license_file": null, - "description": "Implementations of string similarity metrics. Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and Sørensen-Dice." + "name": "strsim", + "repository": "https://github.com/rapidfuzz/strsim-rs" }, { + "authors": "Peter Glotfelty ", + "description": "Helpful macros for working with enums and strings", + "license": "MIT", + "license_file": null, "name": "strum", - "version": "0.26.3", - "authors": "Peter Glotfelty ", - "repository": "https://github.com/Peternator7/strum", - "license": "MIT", - "license_file": null, - "description": "Helpful macros for working with enums and strings" + "repository": "https://github.com/Peternator7/strum" }, { + "authors": "Peter Glotfelty ", + "description": "Helpful macros for working with enums and strings", + "license": "MIT", + "license_file": null, "name": "strum", - "version": "0.27.1", - "authors": "Peter Glotfelty ", - "repository": "https://github.com/Peternator7/strum", - "license": "MIT", - "license_file": null, - "description": "Helpful macros for working with enums and strings" + "repository": "https://github.com/Peternator7/strum" }, { + "authors": "Peter Glotfelty ", + "description": "Helpful macros for working with enums and strings", + "license": "MIT", + "license_file": null, "name": "strum_macros", - "version": "0.26.4", - "authors": "Peter Glotfelty ", - "repository": "https://github.com/Peternator7/strum", - "license": "MIT", - "license_file": null, - "description": "Helpful macros for working with enums and strings" + "repository": "https://github.com/Peternator7/strum" }, { + "authors": "Peter Glotfelty ", + "description": "Helpful macros for working with enums and strings", + "license": "MIT", + "license_file": null, "name": "strum_macros", - "version": "0.27.1", - "authors": "Peter Glotfelty ", - "repository": "https://github.com/Peternator7/strum", - "license": "MIT", - "license_file": null, - "description": "Helpful macros for working with enums and strings" + "repository": "https://github.com/Peternator7/strum" }, { - "name": "subtle", - "version": "2.6.1", "authors": "Isis Lovecruft |Henry de Valence ", - "repository": "https://github.com/dalek-cryptography/subtle", + "description": "Pure-Rust traits and utilities for constant-time cryptographic implementations.", "license": "BSD-3-Clause", "license_file": null, - "description": "Pure-Rust traits and utilities for constant-time cryptographic implementations." + "name": "subtle", + "repository": "https://github.com/dalek-cryptography/subtle" }, { - "name": "syn", - "version": "1.0.109", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/syn", + "description": "Parser for Rust source code", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Parser for Rust source code" + "name": "syn", + "repository": "https://github.com/dtolnay/syn" }, { - "name": "syn", - "version": "2.0.103", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/syn", + "description": "Parser for Rust source code", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Parser for Rust source code" + "name": "syn", + "repository": "https://github.com/dtolnay/syn" }, { - "name": "sync_wrapper", - "version": "1.0.2", "authors": "Actyx AG ", - "repository": "https://github.com/Actyx/sync_wrapper", + "description": "A tool for enlisting the compiler's help in proving the absence of concurrency", "license": "Apache-2.0", "license_file": null, - "description": "A tool for enlisting the compiler's help in proving the absence of concurrency" + "name": "sync_wrapper", + "repository": "https://github.com/Actyx/sync_wrapper" }, { - "name": "synstructure", - "version": "0.13.2", "authors": "Nika Layzell ", - "repository": "https://github.com/mystor/synstructure", + "description": "Helper methods and macros for custom derives", "license": "MIT", "license_file": null, - "description": "Helper methods and macros for custom derives" + "name": "synstructure", + "repository": "https://github.com/mystor/synstructure" }, { - "name": "sysctl", - "version": "0.5.5", "authors": "Johannes Lundberg |Ivan Temchenko |Fabian Freyer ", - "repository": "https://github.com/johalun/sysctl-rs", + "description": "Simplified interface to libc::sysctl", "license": "MIT", "license_file": null, - "description": "Simplified interface to libc::sysctl" - }, - { "name": "sysctl", - "version": "0.6.0", - "authors": "Johannes Lundberg |Ivan Temchenko |Fabian Freyer ", - "repository": "https://github.com/johalun/sysctl-rs", - "license": "MIT", - "license_file": null, - "description": "Simplified interface to libc::sysctl" + "repository": "https://github.com/johalun/sysctl-rs" + }, + { + "authors": "Johannes Lundberg |Ivan Temchenko |Fabian Freyer ", + "description": "Simplified interface to libc::sysctl", + "license": "MIT", + "license_file": null, + "name": "sysctl", + "repository": "https://github.com/johalun/sysctl-rs" }, { - "name": "sysinfo", - "version": "0.33.1", "authors": "Guillaume Gomez ", - "repository": "https://github.com/GuillaumeGomez/sysinfo", + "description": "Library to get system information such as processes, CPUs, disks, components and networks", "license": "MIT", "license_file": null, - "description": "Library to get system information such as processes, CPUs, disks, components and networks" + "name": "sysinfo", + "repository": "https://github.com/GuillaumeGomez/sysinfo" }, { - "name": "systemstat", - "version": "0.2.4", "authors": "Val Packett ", - "repository": "https://github.com/valpackett/systemstat", + "description": "Get system information/statistics in a cross-platform way", "license": "Unlicense", "license_file": null, - "description": "Get system information/statistics in a cross-platform way" + "name": "systemstat", + "repository": "https://github.com/valpackett/systemstat" }, { - "name": "tempfile", - "version": "3.20.0", "authors": "Steven Allen |The Rust Project Developers|Ashley Mannix |Jason White ", - "repository": "https://github.com/Stebalien/tempfile", + "description": "A library for managing temporary files and directories.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A library for managing temporary files and directories." + "name": "tempfile", + "repository": "https://github.com/Stebalien/tempfile" }, { - "name": "tendril", - "version": "0.4.3", "authors": "Keegan McAllister |Simon Sapin |Chris Morgan ", - "repository": "https://github.com/servo/tendril", + "description": "Compact buffer/string type for zero-copy parsing", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Compact buffer/string type for zero-copy parsing" + "name": "tendril", + "repository": "https://github.com/servo/tendril" }, { - "name": "termcolor", - "version": "1.4.1", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/termcolor", + "description": "A simple cross platform library for writing colored text to a terminal.", "license": "MIT OR Unlicense", "license_file": null, - "description": "A simple cross platform library for writing colored text to a terminal." + "name": "termcolor", + "repository": "https://github.com/BurntSushi/termcolor" }, { - "name": "text_placeholder", - "version": "0.5.1", "authors": "Bernardo Araujo ", - "repository": "https://github.com/bernardoamc/text-placeholder", + "description": "A flexible text template engine", "license": "MIT", "license_file": null, - "description": "A flexible text template engine" + "name": "text_placeholder", + "repository": "https://github.com/bernardoamc/text-placeholder" }, { + "authors": "David Tolnay ", + "description": "derive(Error)", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "thiserror", - "version": "1.0.69", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/thiserror", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "derive(Error)" + "repository": "https://github.com/dtolnay/thiserror" }, { + "authors": "David Tolnay ", + "description": "derive(Error)", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "thiserror", - "version": "2.0.12", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/thiserror", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "derive(Error)" + "repository": "https://github.com/dtolnay/thiserror" }, { + "authors": "David Tolnay ", + "description": "Implementation detail of the `thiserror` crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "thiserror-impl", - "version": "1.0.69", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/thiserror", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Implementation detail of the `thiserror` crate" + "repository": "https://github.com/dtolnay/thiserror" }, { + "authors": "David Tolnay ", + "description": "Implementation detail of the `thiserror` crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "thiserror-impl", - "version": "2.0.12", - "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/thiserror", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Implementation detail of the `thiserror` crate" + "repository": "https://github.com/dtolnay/thiserror" }, { - "name": "thread-tree", - "version": "0.3.3", "authors": "bluss <>", - "repository": "https://github.com/bluss/thread-tree", + "description": "A tree-structured thread pool for splitting jobs hierarchically on worker threads. The tree structure means that there is no contention between workers when delivering jobs.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A tree-structured thread pool for splitting jobs hierarchically on worker threads. The tree structure means that there is no contention between workers when delivering jobs." + "name": "thread-tree", + "repository": "https://github.com/bluss/thread-tree" }, { - "name": "thread_local", - "version": "1.1.9", "authors": "Amanieu d'Antras ", - "repository": "https://github.com/Amanieu/thread_local-rs", + "description": "Per-object thread-local storage", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Per-object thread-local storage" + "name": "thread_local", + "repository": "https://github.com/Amanieu/thread_local-rs" }, { + "authors": "Jacob Pratt |Time contributors", + "description": "Date and time library. Fully interoperable with the standard library. Mostly compatible with #![no_std].", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "time", - "version": "0.3.41", - "authors": "Jacob Pratt |Time contributors", - "repository": "https://github.com/time-rs/time", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Date and time library. Fully interoperable with the standard library. Mostly compatible with #![no_std]." + "repository": "https://github.com/time-rs/time" }, { + "authors": "Jacob Pratt |Time contributors", + "description": "This crate is an implementation detail and should not be relied upon directly.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "time-core", - "version": "0.1.4", - "authors": "Jacob Pratt |Time contributors", - "repository": "https://github.com/time-rs/time", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "This crate is an implementation detail and should not be relied upon directly." + "repository": "https://github.com/time-rs/time" }, { + "authors": "Jacob Pratt |Time contributors", + "description": "Procedural macros for the time crate. This crate is an implementation detail and should not be relied upon directly.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "time-macros", - "version": "0.2.22", - "authors": "Jacob Pratt |Time contributors", - "repository": "https://github.com/time-rs/time", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Procedural macros for the time crate. This crate is an implementation detail and should not be relied upon directly." + "repository": "https://github.com/time-rs/time" }, { - "name": "tinystr", - "version": "0.8.1", "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", + "description": "A small ASCII-only bounded length string representation.", "license": "Unicode-3.0", "license_file": null, - "description": "A small ASCII-only bounded length string representation." + "name": "tinystr", + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "tinyvec", - "version": "1.9.0", "authors": "Lokathor ", - "repository": "https://github.com/Lokathor/tinyvec", + "description": "`tinyvec` provides 100% safe vec-like data structures.", "license": "Apache-2.0 OR MIT OR Zlib", "license_file": null, - "description": "`tinyvec` provides 100% safe vec-like data structures." + "name": "tinyvec", + "repository": "https://github.com/Lokathor/tinyvec" }, { - "name": "tinyvec_macros", - "version": "0.1.1", "authors": "Soveu ", - "repository": "https://github.com/Soveu/tinyvec_macros", + "description": "Some macros for tiny containers", "license": "Apache-2.0 OR MIT OR Zlib", "license_file": null, - "description": "Some macros for tiny containers" + "name": "tinyvec_macros", + "repository": "https://github.com/Soveu/tinyvec_macros" }, { + "authors": "Tokio Contributors ", + "description": "An event-driven, non-blocking I/O platform for writing asynchronous I/O backed applications.", + "license": "MIT", + "license_file": null, "name": "tokio", - "version": "1.45.1", - "authors": "Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tokio", - "license": "MIT", - "license_file": null, - "description": "An event-driven, non-blocking I/O platform for writing asynchronous I/O backed applications." + "repository": "https://github.com/tokio-rs/tokio" }, { + "authors": "Tokio Contributors ", + "description": "Tokio's proc macros.", + "license": "MIT", + "license_file": null, "name": "tokio-macros", - "version": "2.5.0", - "authors": "Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tokio", - "license": "MIT", - "license_file": null, - "description": "Tokio's proc macros." + "repository": "https://github.com/tokio-rs/tokio" }, { + "authors": "Tokio Contributors ", + "description": "An implementation of TLS/SSL streams for Tokio using native-tls giving an implementation of TLS for nonblocking I/O streams.", + "license": "MIT", + "license_file": null, "name": "tokio-native-tls", - "version": "0.3.1", - "authors": "Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tls", - "license": "MIT", - "license_file": null, - "description": "An implementation of TLS/SSL streams for Tokio using native-tls giving an implementation of TLS for nonblocking I/O streams." + "repository": "https://github.com/tokio-rs/tls" }, { + "authors": null, + "description": "Asynchronous TLS/SSL streams for Tokio using Rustls.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "tokio-rustls", - "version": "0.26.2", - "authors": null, - "repository": "https://github.com/rustls/tokio-rustls", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Asynchronous TLS/SSL streams for Tokio using Rustls." + "repository": "https://github.com/rustls/tokio-rustls" }, { + "authors": "Tokio Contributors ", + "description": "Additional utilities for working with Tokio.", + "license": "MIT", + "license_file": null, "name": "tokio-util", - "version": "0.7.15", - "authors": "Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tokio", - "license": "MIT", - "license_file": null, - "description": "Additional utilities for working with Tokio." + "repository": "https://github.com/tokio-rs/tokio" }, { + "authors": null, + "description": "A TOML-compatible datetime type", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "toml_datetime", - "version": "0.6.11", - "authors": null, - "repository": "https://github.com/toml-rs/toml", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A TOML-compatible datetime type" + "repository": "https://github.com/toml-rs/toml" }, { + "authors": null, + "description": "Yet another format-preserving TOML parser.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "toml_edit", - "version": "0.22.27", - "authors": null, - "repository": "https://github.com/toml-rs/toml", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Yet another format-preserving TOML parser." + "repository": "https://github.com/toml-rs/toml" }, { + "authors": null, + "description": "A low-level interface for writing out TOML", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "toml_write", - "version": "0.1.2", - "authors": null, - "repository": "https://github.com/toml-rs/toml", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "A low-level interface for writing out TOML" + "repository": "https://github.com/toml-rs/toml" }, { + "authors": "Tower Maintainers ", + "description": "Tower is a library of modular and reusable components for building robust clients and servers.", + "license": "MIT", + "license_file": null, "name": "tower", - "version": "0.5.2", - "authors": "Tower Maintainers ", - "repository": "https://github.com/tower-rs/tower", - "license": "MIT", - "license_file": null, - "description": "Tower is a library of modular and reusable components for building robust clients and servers." + "repository": "https://github.com/tower-rs/tower" }, { + "authors": "Tower Maintainers ", + "description": "Tower middleware and utilities for HTTP clients and servers", + "license": "MIT", + "license_file": null, "name": "tower-http", - "version": "0.6.6", - "authors": "Tower Maintainers ", - "repository": "https://github.com/tower-rs/tower-http", - "license": "MIT", - "license_file": null, - "description": "Tower middleware and utilities for HTTP clients and servers" + "repository": "https://github.com/tower-rs/tower-http" }, { + "authors": "Tower Maintainers ", + "description": "Decorates a `Service` to allow easy composition between `Service`s.", + "license": "MIT", + "license_file": null, "name": "tower-layer", - "version": "0.3.3", - "authors": "Tower Maintainers ", - "repository": "https://github.com/tower-rs/tower", - "license": "MIT", - "license_file": null, - "description": "Decorates a `Service` to allow easy composition between `Service`s." + "repository": "https://github.com/tower-rs/tower" }, { + "authors": "Tower Maintainers ", + "description": "Trait representing an asynchronous, request / response based, client or server.", + "license": "MIT", + "license_file": null, "name": "tower-service", - "version": "0.3.3", - "authors": "Tower Maintainers ", - "repository": "https://github.com/tower-rs/tower", - "license": "MIT", - "license_file": null, - "description": "Trait representing an asynchronous, request / response based, client or server." + "repository": "https://github.com/tower-rs/tower" }, { - "name": "tracing", - "version": "0.1.41", "authors": "Eliza Weisman |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tracing", + "description": "Application-level tracing for Rust.", "license": "MIT", "license_file": null, - "description": "Application-level tracing for Rust." + "name": "tracing", + "repository": "https://github.com/tokio-rs/tracing" }, { - "name": "tracing-appender", - "version": "0.2.3", "authors": "Zeki Sherif |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tracing", + "description": "Provides utilities for file appenders and making non-blocking writers.", "license": "MIT", "license_file": null, - "description": "Provides utilities for file appenders and making non-blocking writers." + "name": "tracing-appender", + "repository": "https://github.com/tokio-rs/tracing" }, { - "name": "tracing-attributes", - "version": "0.1.29", "authors": "Tokio Contributors |Eliza Weisman |David Barsky ", - "repository": "https://github.com/tokio-rs/tracing", + "description": "Procedural macro attributes for automatically instrumenting functions.", "license": "MIT", "license_file": null, - "description": "Procedural macro attributes for automatically instrumenting functions." + "name": "tracing-attributes", + "repository": "https://github.com/tokio-rs/tracing" }, { + "authors": "Tokio Contributors ", + "description": "Core primitives for application-level tracing.", + "license": "MIT", + "license_file": null, "name": "tracing-core", - "version": "0.1.34", - "authors": "Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tracing", - "license": "MIT", - "license_file": null, - "description": "Core primitives for application-level tracing." + "repository": "https://github.com/tokio-rs/tracing" }, { + "authors": "Tokio Contributors ", + "description": "Provides compatibility between `tracing` and the `log` crate.", + "license": "MIT", + "license_file": null, "name": "tracing-log", - "version": "0.2.0", - "authors": "Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tracing", - "license": "MIT", - "license_file": null, - "description": "Provides compatibility between `tracing` and the `log` crate." + "repository": "https://github.com/tokio-rs/tracing" }, { - "name": "tracing-subscriber", - "version": "0.3.19", "authors": "Eliza Weisman |David Barsky |Tokio Contributors ", - "repository": "https://github.com/tokio-rs/tracing", + "description": "Utilities for implementing and composing `tracing` subscribers.", "license": "MIT", "license_file": null, - "description": "Utilities for implementing and composing `tracing` subscribers." + "name": "tracing-subscriber", + "repository": "https://github.com/tokio-rs/tracing" }, { + "authors": "Sean McArthur ", + "description": "A lightweight atomic lock.", + "license": "MIT", + "license_file": null, "name": "try-lock", - "version": "0.2.5", - "authors": "Sean McArthur ", - "repository": "https://github.com/seanmonstar/try-lock", - "license": "MIT", - "license_file": null, - "description": "A lightweight atomic lock." + "repository": "https://github.com/seanmonstar/try-lock" }, { - "name": "type-map", - "version": "0.5.1", "authors": "Jacob Brown ", - "repository": "https://github.com/kardeiz/type-map", + "description": "Provides a typemap container with FxHashMap", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Provides a typemap container with FxHashMap" + "name": "type-map", + "repository": "https://github.com/kardeiz/type-map" }, { - "name": "typenum", - "version": "1.18.0", "authors": "Paho Lurie-Gregg |Andre Bogus ", - "repository": "https://github.com/paholg/typenum", + "description": "Typenum is a Rust library for type-level numbers evaluated at compile time. It currently supports bits, unsigned integers, and signed integers. It also provides a type-level array of type-level numbers, but its implementation is incomplete.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Typenum is a Rust library for type-level numbers evaluated at compile time. It currently supports bits, unsigned integers, and signed integers. It also provides a type-level array of type-level numbers, but its implementation is incomplete." + "name": "typenum", + "repository": "https://github.com/paholg/typenum" }, { - "name": "ug", - "version": "0.1.0", "authors": null, - "repository": "https://github.com/LaurentMazare/ug", + "description": "Micro compiler for tensor operations.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Micro compiler for tensor operations." + "name": "ug", + "repository": "https://github.com/LaurentMazare/ug" }, { + "authors": "The UNIC Project Developers", + "description": "UNIC — Unicode Character Tools — Character Property taxonomy, contracts and build macros", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-char-property", - "version": "0.9.0", - "authors": "The UNIC Project Developers", - "repository": "https://github.com/open-i18n/rust-unic/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "UNIC — Unicode Character Tools — Character Property taxonomy, contracts and build macros" + "repository": "https://github.com/open-i18n/rust-unic/" }, { + "authors": "The UNIC Project Developers", + "description": "UNIC — Unicode Character Tools — Character Range and Iteration", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-char-range", - "version": "0.9.0", - "authors": "The UNIC Project Developers", - "repository": "https://github.com/open-i18n/rust-unic/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "UNIC — Unicode Character Tools — Character Range and Iteration" + "repository": "https://github.com/open-i18n/rust-unic/" }, { + "authors": "The UNIC Project Developers", + "description": "UNIC — Common Utilities", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-common", - "version": "0.9.0", - "authors": "The UNIC Project Developers", - "repository": "https://github.com/open-i18n/rust-unic/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "UNIC — Common Utilities" + "repository": "https://github.com/open-i18n/rust-unic/" }, { + "authors": "Zibi Braniecki ", + "description": "API for managing Unicode Language Identifiers", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-langid", - "version": "0.9.6", - "authors": "Zibi Braniecki ", - "repository": "https://github.com/zbraniecki/unic-locale", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "API for managing Unicode Language Identifiers" + "repository": "https://github.com/zbraniecki/unic-locale" }, { + "authors": "Zibi Braniecki ", + "description": "API for managing Unicode Language Identifiers", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-langid-impl", - "version": "0.9.6", - "authors": "Zibi Braniecki ", - "repository": "https://github.com/zbraniecki/unic-locale", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "API for managing Unicode Language Identifiers" + "repository": "https://github.com/zbraniecki/unic-locale" }, { + "authors": "Zibi Braniecki ", + "description": "API for managing Unicode Language Identifiers", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-langid-macros", - "version": "0.9.6", - "authors": "Zibi Braniecki ", - "repository": "https://github.com/zbraniecki/unic-locale", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "API for managing Unicode Language Identifiers" + "repository": "https://github.com/zbraniecki/unic-locale" }, { + "authors": "Zibi Braniecki ", + "description": "API for managing Unicode Language Identifiers", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-langid-macros-impl", - "version": "0.9.6", - "authors": "Zibi Braniecki ", - "repository": "https://github.com/zbraniecki/unic-locale", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "API for managing Unicode Language Identifiers" + "repository": "https://github.com/zbraniecki/unic-locale" }, { + "authors": "The UNIC Project Developers", + "description": "UNIC — Unicode Character Database — General Category", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-ucd-category", - "version": "0.9.0", - "authors": "The UNIC Project Developers", - "repository": "https://github.com/open-i18n/rust-unic/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "UNIC — Unicode Character Database — General Category" + "repository": "https://github.com/open-i18n/rust-unic/" }, { + "authors": "The UNIC Project Developers", + "description": "UNIC — Unicode Character Database — Version", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unic-ucd-version", - "version": "0.9.0", - "authors": "The UNIC Project Developers", - "repository": "https://github.com/open-i18n/rust-unic/", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "UNIC — Unicode Character Database — Version" + "repository": "https://github.com/open-i18n/rust-unic/" }, { - "name": "unicase", - "version": "2.6.0", "authors": "Sean McArthur ", - "repository": "https://github.com/seanmonstar/unicase", + "description": "A case-insensitive wrapper around strings.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A case-insensitive wrapper around strings." + "name": "unicase", + "repository": "https://github.com/seanmonstar/unicase" }, { - "name": "unicode-ident", - "version": "1.0.18", "authors": "David Tolnay ", - "repository": "https://github.com/dtolnay/unicode-ident", + "description": "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31", "license": "(MIT OR Apache-2.0) AND Unicode-3.0", "license_file": null, - "description": "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31" + "name": "unicode-ident", + "repository": "https://github.com/dtolnay/unicode-ident" }, { + "authors": "kwantam |Manish Goregaokar ", + "description": "This crate provides functions for normalization of Unicode strings, including Canonical and Compatible Decomposition and Recomposition, as described in Unicode Standard Annex #15.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unicode-normalization", - "version": "0.1.24", - "authors": "kwantam |Manish Goregaokar ", - "repository": "https://github.com/unicode-rs/unicode-normalization", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "This crate provides functions for normalization of Unicode strings, including Canonical and Compatible Decomposition and Recomposition, as described in Unicode Standard Annex #15." + "repository": "https://github.com/unicode-rs/unicode-normalization" }, { + "authors": "kwantam |Manish Goregaokar ", + "description": "This crate provides Grapheme Cluster, Word and Sentence boundaries according to Unicode Standard Annex #29 rules.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unicode-segmentation", - "version": "1.12.0", - "authors": "kwantam |Manish Goregaokar ", - "repository": "https://github.com/unicode-rs/unicode-segmentation", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "This crate provides Grapheme Cluster, Word and Sentence boundaries according to Unicode Standard Annex #29 rules." + "repository": "https://github.com/unicode-rs/unicode-segmentation" }, { + "authors": "kwantam |Manish Goregaokar ", + "description": "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "unicode-width", - "version": "0.2.1", - "authors": "kwantam |Manish Goregaokar ", - "repository": "https://github.com/unicode-rs/unicode-width", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules." + "repository": "https://github.com/unicode-rs/unicode-width" }, { - "name": "unicode-xid", - "version": "0.2.6", "authors": "erick.tryzelaar |kwantam |Manish Goregaokar ", - "repository": "https://github.com/unicode-rs/unicode-xid", + "description": "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31." + "name": "unicode-xid", + "repository": "https://github.com/unicode-rs/unicode-xid" }, { - "name": "untrusted", - "version": "0.9.0", "authors": "Brian Smith ", - "repository": "https://github.com/briansmith/untrusted", + "description": "Safe, fast, zero-panic, zero-crashing, zero-allocation parsing of untrusted inputs in Rust.", "license": "ISC", "license_file": null, - "description": "Safe, fast, zero-panic, zero-crashing, zero-allocation parsing of untrusted inputs in Rust." + "name": "untrusted", + "repository": "https://github.com/briansmith/untrusted" }, { - "name": "unty", - "version": "0.0.4", "authors": "Victor Koenders ", - "repository": "https://github.com/bincode-org/unty", + "description": "Explicitly types your generics", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Explicitly types your generics" + "name": "unty", + "repository": "https://github.com/bincode-org/unty" }, { - "name": "url", - "version": "2.5.4", "authors": "The rust-url developers", - "repository": "https://github.com/servo/rust-url", + "description": "URL library for Rust, based on the WHATWG URL Standard", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "URL library for Rust, based on the WHATWG URL Standard" + "name": "url", + "repository": "https://github.com/servo/rust-url" }, { - "name": "utf-8", - "version": "0.7.6", "authors": "Simon Sapin ", - "repository": "https://github.com/SimonSapin/rust-utf8", + "description": "Incremental, zero-copy UTF-8 decoding with error handling", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Incremental, zero-copy UTF-8 decoding with error handling" + "name": "utf-8", + "repository": "https://github.com/SimonSapin/rust-utf8" }, { - "name": "utf8_iter", - "version": "1.0.4", "authors": "Henri Sivonen ", - "repository": "https://github.com/hsivonen/utf8_iter", + "description": "Iterator by char over potentially-invalid UTF-8 in &[u8]", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Iterator by char over potentially-invalid UTF-8 in &[u8]" + "name": "utf8_iter", + "repository": "https://github.com/hsivonen/utf8_iter" }, { - "name": "uuid", - "version": "1.17.0", "authors": "Ashley Mannix|Dylan DPC|Hunar Roop Kahlon", - "repository": "https://github.com/uuid-rs/uuid", + "description": "A library to generate and parse UUIDs.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A library to generate and parse UUIDs." + "name": "uuid", + "repository": "https://github.com/uuid-rs/uuid" }, { - "name": "valuable", - "version": "0.1.1", "authors": null, - "repository": "https://github.com/tokio-rs/valuable", + "description": "Object-safe value inspection, used to pass un-typed structured data across trait-object boundaries.", "license": "MIT", "license_file": null, - "description": "Object-safe value inspection, used to pass un-typed structured data across trait-object boundaries." + "name": "valuable", + "repository": "https://github.com/tokio-rs/valuable" }, { - "name": "variadics_please", - "version": "1.1.0", "authors": null, - "repository": "https://github.com/bevyengine/variadics_please", + "description": "Implement things as if rust had variadics", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Implement things as if rust had variadics" + "name": "variadics_please", + "repository": "https://github.com/bevyengine/variadics_please" }, { - "name": "vcpkg", - "version": "0.2.15", "authors": "Jim McGrath ", - "repository": "https://github.com/mcgoo/vcpkg-rs", + "description": "A library to find native dependencies in a vcpkg tree at build time in order to be used in Cargo build scripts.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "A library to find native dependencies in a vcpkg tree at build time in order to be used in Cargo build scripts." + "name": "vcpkg", + "repository": "https://github.com/mcgoo/vcpkg-rs" }, { - "name": "version_check", - "version": "0.9.5", "authors": "Sergio Benitez ", - "repository": "https://github.com/SergioBenitez/version_check", + "description": "Tiny crate to check the version of the installed/running rustc.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Tiny crate to check the version of the installed/running rustc." + "name": "version_check", + "repository": "https://github.com/SergioBenitez/version_check" }, { - "name": "walkdir", - "version": "2.5.0", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/walkdir", + "description": "Recursively walk a directory.", "license": "MIT OR Unlicense", "license_file": null, - "description": "Recursively walk a directory." + "name": "walkdir", + "repository": "https://github.com/BurntSushi/walkdir" }, { - "name": "want", - "version": "0.3.1", "authors": "Sean McArthur ", - "repository": "https://github.com/seanmonstar/want", + "description": "Detect when another Future wants a result.", "license": "MIT", "license_file": null, - "description": "Detect when another Future wants a result." + "name": "want", + "repository": "https://github.com/seanmonstar/want" }, { - "name": "wasi", - "version": "0.11.1+wasi-snapshot-preview1", "authors": "The Cranelift Project Developers", - "repository": "https://github.com/bytecodealliance/wasi", + "description": "Experimental WASI API bindings for Rust", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT", "license_file": null, - "description": "Experimental WASI API bindings for Rust" + "name": "wasi", + "repository": "https://github.com/bytecodealliance/wasi" }, { - "name": "wasi", - "version": "0.14.2+wasi-0.2.4", "authors": "The Cranelift Project Developers", - "repository": "https://github.com/bytecodealliance/wasi-rs", + "description": "WASI API bindings for Rust", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT", "license_file": null, - "description": "WASI API bindings for Rust" + "name": "wasi", + "repository": "https://github.com/bytecodealliance/wasi-rs" }, { - "name": "wasix", - "version": "0.12.21", "authors": "The Cranelift Project Developers|john-sharratt", - "repository": "https://github.com/wasix-org/wasix-abi-rust", + "description": "WASIX API bindings for Rust", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT", "license_file": null, - "description": "WASIX API bindings for Rust" + "name": "wasix", + "repository": "https://github.com/wasix-org/wasix-abi-rust" }, { + "authors": "The wasm-bindgen Developers", + "description": "Easy support for interacting between JS and Rust.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wasm-bindgen", - "version": "0.2.100", - "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Easy support for interacting between JS and Rust." + "repository": "https://github.com/rustwasm/wasm-bindgen" }, { + "authors": "The wasm-bindgen Developers", + "description": "Backend code generation of the wasm-bindgen tool", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wasm-bindgen-backend", - "version": "0.2.100", - "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Backend code generation of the wasm-bindgen tool" + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend" }, { + "authors": "The wasm-bindgen Developers", + "description": "Bridging the gap between Rust Futures and JavaScript Promises", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wasm-bindgen-futures", - "version": "0.4.50", - "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/futures", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Bridging the gap between Rust Futures and JavaScript Promises" + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/futures" }, { + "authors": "The wasm-bindgen Developers", + "description": "Definition of the `#[wasm_bindgen]` attribute, an internal dependency", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wasm-bindgen-macro", - "version": "0.2.100", - "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Definition of the `#[wasm_bindgen]` attribute, an internal dependency" + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro" }, { + "authors": "The wasm-bindgen Developers", + "description": "The part of the implementation of the `#[wasm_bindgen]` attribute that is not in the shared backend crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wasm-bindgen-macro-support", - "version": "0.2.100", - "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The part of the implementation of the `#[wasm_bindgen]` attribute that is not in the shared backend crate" + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support" }, { + "authors": "The wasm-bindgen Developers", + "description": "Shared support between wasm-bindgen and wasm-bindgen cli, an internal dependency.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wasm-bindgen-shared", - "version": "0.2.100", - "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Shared support between wasm-bindgen and wasm-bindgen cli, an internal dependency." + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared" }, { - "name": "wasm-streams", - "version": "0.4.2", "authors": "Mattias Buelens ", - "repository": "https://github.com/MattiasBuelens/wasm-streams/", + "description": "Bridging between web streams and Rust streams using WebAssembly", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Bridging between web streams and Rust streams using WebAssembly" + "name": "wasm-streams", + "repository": "https://github.com/MattiasBuelens/wasm-streams/" }, { - "name": "web-sys", - "version": "0.3.77", "authors": "The wasm-bindgen Developers", - "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys", + "description": "Bindings for all Web APIs, a procedurally generated crate from WebIDL", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Bindings for all Web APIs, a procedurally generated crate from WebIDL" + "name": "web-sys", + "repository": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys" }, { + "authors": null, + "description": "Drop-in replacement for std::time for Wasm in browsers", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "web-time", - "version": "1.1.0", - "authors": null, - "repository": "https://github.com/daxpedda/web-time", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Drop-in replacement for std::time for Wasm in browsers" + "repository": "https://github.com/daxpedda/web-time" }, { - "name": "web_atoms", - "version": "0.1.3", "authors": "The html5ever Project Developers", - "repository": "https://github.com/servo/html5ever", + "description": "Atoms for xml5ever and html5ever", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Atoms for xml5ever and html5ever" + "name": "web_atoms", + "repository": "https://github.com/servo/html5ever" }, { - "name": "webpki-roots", - "version": "1.0.0", "authors": null, - "repository": "https://github.com/rustls/webpki-roots", + "description": "Mozilla's CA root certificates for use with webpki", "license": "CDLA-Permissive-2.0", "license_file": null, - "description": "Mozilla's CA root certificates for use with webpki" + "name": "webpki-roots", + "repository": "https://github.com/rustls/webpki-roots" }, { + "authors": "gfx-rs developers", + "description": "Cross-platform, safe, pure-rust graphics API", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu", - "version": "25.0.2", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Cross-platform, safe, pure-rust graphics API" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "gfx-rs developers", + "description": "Core implementation logic of wgpu, the cross-platform, safe, pure-rust graphics API", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu-core", - "version": "25.0.2", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Core implementation logic of wgpu, the cross-platform, safe, pure-rust graphics API" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "gfx-rs developers", + "description": "Feature unification helper crate for Apple platforms", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu-core-deps-apple", - "version": "25.0.0", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Feature unification helper crate for Apple platforms" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "gfx-rs developers", + "description": "Feature unification helper crate for the Emscripten platform", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu-core-deps-emscripten", - "version": "25.0.0", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Feature unification helper crate for the Emscripten platform" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "gfx-rs developers", + "description": "Feature unification helper crate for the Windows/Linux/Android platforms", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu-core-deps-windows-linux-android", - "version": "25.0.0", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Feature unification helper crate for the Windows/Linux/Android platforms" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "gfx-rs developers", + "description": "Hardware abstraction layer for wgpu, the cross-platform, safe, pure-rust graphics API", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu-hal", - "version": "25.0.2", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Hardware abstraction layer for wgpu, the cross-platform, safe, pure-rust graphics API" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "gfx-rs developers", + "description": "Common types and utilities for wgpu, the cross-platform, safe, pure-rust graphics API", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "wgpu-types", - "version": "25.0.0", - "authors": "gfx-rs developers", - "repository": "https://github.com/gfx-rs/wgpu", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Common types and utilities for wgpu, the cross-platform, safe, pure-rust graphics API" + "repository": "https://github.com/gfx-rs/wgpu" }, { + "authors": "Peter Atashian ", + "description": "Raw FFI bindings for all of Windows API.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "winapi", - "version": "0.3.9", - "authors": "Peter Atashian ", - "repository": "https://github.com/retep998/winapi-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Raw FFI bindings for all of Windows API." + "repository": "https://github.com/retep998/winapi-rs" }, { + "authors": "Peter Atashian ", + "description": "Import libraries for the i686-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "winapi-i686-pc-windows-gnu", - "version": "0.4.0", - "authors": "Peter Atashian ", - "repository": "https://github.com/retep998/winapi-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import libraries for the i686-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead." + "repository": "https://github.com/retep998/winapi-rs" }, { - "name": "winapi-util", - "version": "0.1.9", "authors": "Andrew Gallant ", - "repository": "https://github.com/BurntSushi/winapi-util", + "description": "A dumping ground for high level safe wrappers over windows-sys.", "license": "MIT OR Unlicense", "license_file": null, - "description": "A dumping ground for high level safe wrappers over windows-sys." + "name": "winapi-util", + "repository": "https://github.com/BurntSushi/winapi-util" }, { - "name": "winapi-x86_64-pc-windows-gnu", - "version": "0.4.0", "authors": "Peter Atashian ", - "repository": "https://github.com/retep998/winapi-rs", + "description": "Import libraries for the x86_64-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Import libraries for the x86_64-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead." + "name": "winapi-x86_64-pc-windows-gnu", + "repository": "https://github.com/retep998/winapi-rs" }, { - "name": "windows", - "version": "0.56.0", "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", + "description": "Rust for Windows", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Rust for Windows" - }, - { "name": "windows", - "version": "0.58.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows", - "version": "0.61.3", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "windows", + "repository": "https://github.com/microsoft/windows-rs" + }, + { + "authors": null, + "description": "Windows collection types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-collections", - "version": "0.2.0", + "repository": "https://github.com/microsoft/windows-rs" + }, + { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "windows-core", + "repository": "https://github.com/microsoft/windows-rs" + }, + { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "windows-core", + "repository": "https://github.com/microsoft/windows-rs" + }, + { + "authors": "Microsoft", + "description": "Core type support for COM and Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "windows-core", + "repository": "https://github.com/microsoft/windows-rs" + }, + { "authors": null, - "repository": "https://github.com/microsoft/windows-rs", + "description": "Windows async types", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Windows collection types" - }, - { - "name": "windows-core", - "version": "0.56.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" - }, - { - "name": "windows-core", - "version": "0.58.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" - }, - { - "name": "windows-core", - "version": "0.61.2", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Core type support for COM and Windows" - }, - { "name": "windows-future", - "version": "0.2.1", - "authors": null, - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Windows async types" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "The implement macro for the windows crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-implement", - "version": "0.56.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The implement macro for the windows crate" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "The implement macro for the windows crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-implement", - "version": "0.58.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The implement macro for the windows crate" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "The implement macro for the windows crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-implement", - "version": "0.60.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The implement macro for the windows crate" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "The interface macro for the windows crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-interface", - "version": "0.56.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The interface macro for the windows crate" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "The interface macro for the windows crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-interface", - "version": "0.58.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The interface macro for the windows crate" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "The interface macro for the windows crate", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-interface", - "version": "0.59.1", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "The interface macro for the windows crate" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Linking for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-link", - "version": "0.1.3", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Linking for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": null, + "description": "Windows numeric types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-numerics", - "version": "0.2.0", - "authors": null, - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Windows numeric types" + "repository": "https://github.com/microsoft/windows-rs" }, { - "name": "windows-result", - "version": "0.1.2", "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", + "description": "Windows error handling", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Windows error handling" - }, - { "name": "windows-result", - "version": "0.2.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Windows error handling" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Windows error handling", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-result", - "version": "0.3.4", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Windows error handling" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Windows error handling", + "license": "Apache-2.0 OR MIT", + "license_file": null, + "name": "windows-result", + "repository": "https://github.com/microsoft/windows-rs" + }, + { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-strings", - "version": "0.1.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Windows string types", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-strings", - "version": "0.4.2", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Windows string types" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-sys", - "version": "0.48.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-sys", - "version": "0.52.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-sys", - "version": "0.59.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Rust for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-sys", - "version": "0.60.2", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Rust for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import libs for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-targets", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import libs for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import libs for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-targets", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import libs for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import libs for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-targets", - "version": "0.53.2", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import libs for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Windows threading", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows-threading", - "version": "0.1.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Windows threading" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_aarch64_gnullvm", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_aarch64_gnullvm", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_aarch64_gnullvm", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_aarch64_msvc", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_aarch64_msvc", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_aarch64_msvc", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_gnu", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_gnu", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_gnu", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_gnullvm", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_gnullvm", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_msvc", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_msvc", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_i686_msvc", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_gnu", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_gnu", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_gnu", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_gnullvm", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_gnullvm", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_gnullvm", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_msvc", - "version": "0.48.5", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_msvc", - "version": "0.52.6", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { + "authors": "Microsoft", + "description": "Import lib for Windows", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "windows_x86_64_msvc", - "version": "0.53.0", - "authors": "Microsoft", - "repository": "https://github.com/microsoft/windows-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Import lib for Windows" + "repository": "https://github.com/microsoft/windows-rs" }, { - "name": "winnow", - "version": "0.7.11", "authors": null, - "repository": "https://github.com/winnow-rs/winnow", + "description": "A byte-oriented, zero-copy, parser combinators library", "license": "MIT", "license_file": null, - "description": "A byte-oriented, zero-copy, parser combinators library" + "name": "winnow", + "repository": "https://github.com/winnow-rs/winnow" }, { - "name": "wiremock", - "version": "0.6.3", "authors": "Luca Palmieri ", - "repository": "https://github.com/LukeMathWalker/wiremock-rs", + "description": "HTTP mocking to test Rust applications.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "HTTP mocking to test Rust applications." + "name": "wiremock", + "repository": "https://github.com/LukeMathWalker/wiremock-rs" }, { - "name": "wit-bindgen-rt", - "version": "0.39.0", "authors": null, - "repository": "https://github.com/bytecodealliance/wit-bindgen", + "description": "Runtime support for the `wit-bindgen` crate", "license": "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT", "license_file": null, - "description": "Runtime support for the `wit-bindgen` crate" + "name": "wit-bindgen-rt", + "repository": "https://github.com/bytecodealliance/wit-bindgen" }, { - "name": "wrapcenum-derive", - "version": "0.4.1", "authors": "Cldfire", - "repository": "https://github.com/Cldfire/wrapcenum-derive", + "description": "Derive macro for nvml-wrapper, not for general use", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Derive macro for nvml-wrapper, not for general use" + "name": "wrapcenum-derive", + "repository": "https://github.com/Cldfire/wrapcenum-derive" }, { + "authors": "The ICU4X Project Developers", + "description": "A more efficient alternative to fmt::Display", + "license": "Unicode-3.0", + "license_file": null, "name": "writeable", - "version": "0.6.1", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "A more efficient alternative to fmt::Display" + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "xml-rs", - "version": "0.8.26", "authors": "Vladimir Matveev ", - "repository": "https://github.com/kornelski/xml-rs", + "description": "An XML library in pure Rust", "license": "MIT", "license_file": null, - "description": "An XML library in pure Rust" + "name": "xml-rs", + "repository": "https://github.com/kornelski/xml-rs" }, { + "authors": "Manish Goregaokar ", + "description": "Abstraction allowing borrowed data to be carried along with the backing data it borrows from", + "license": "Unicode-3.0", + "license_file": null, "name": "yoke", - "version": "0.7.5", - "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Abstraction allowing borrowed data to be carried along with the backing data it borrows from" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "Manish Goregaokar ", + "description": "Abstraction allowing borrowed data to be carried along with the backing data it borrows from", + "license": "Unicode-3.0", + "license_file": null, "name": "yoke", - "version": "0.8.0", - "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Abstraction allowing borrowed data to be carried along with the backing data it borrows from" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "Manish Goregaokar ", + "description": "Custom derive for the yoke crate", + "license": "Unicode-3.0", + "license_file": null, "name": "yoke-derive", - "version": "0.7.5", - "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Custom derive for the yoke crate" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "Manish Goregaokar ", + "description": "Custom derive for the yoke crate", + "license": "Unicode-3.0", + "license_file": null, "name": "yoke-derive", - "version": "0.8.0", - "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Custom derive for the yoke crate" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "Joshua Liebow-Feeser |Jack Wrenn ", + "description": "Zerocopy makes zero-cost memory manipulation effortless. We write \"unsafe\" so you don't have to.", + "license": "Apache-2.0 OR BSD-2-Clause OR MIT", + "license_file": null, "name": "zerocopy", - "version": "0.8.25", - "authors": "Joshua Liebow-Feeser |Jack Wrenn ", - "repository": "https://github.com/google/zerocopy", - "license": "Apache-2.0 OR BSD-2-Clause OR MIT", - "license_file": null, - "description": "Zerocopy makes zero-cost memory manipulation effortless. We write \"unsafe\" so you don't have to." + "repository": "https://github.com/google/zerocopy" }, { + "authors": "Joshua Liebow-Feeser |Jack Wrenn ", + "description": "Custom derive for traits from the zerocopy crate", + "license": "Apache-2.0 OR BSD-2-Clause OR MIT", + "license_file": null, "name": "zerocopy-derive", - "version": "0.8.25", - "authors": "Joshua Liebow-Feeser |Jack Wrenn ", - "repository": "https://github.com/google/zerocopy", - "license": "Apache-2.0 OR BSD-2-Clause OR MIT", - "license_file": null, - "description": "Custom derive for traits from the zerocopy crate" + "repository": "https://github.com/google/zerocopy" }, { + "authors": "Manish Goregaokar ", + "description": "ZeroFrom trait for constructing", + "license": "Unicode-3.0", + "license_file": null, "name": "zerofrom", - "version": "0.1.6", - "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "ZeroFrom trait for constructing" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "Manish Goregaokar ", + "description": "Custom derive for the zerofrom crate", + "license": "Unicode-3.0", + "license_file": null, "name": "zerofrom-derive", - "version": "0.1.6", - "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Custom derive for the zerofrom crate" + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "zeroize", - "version": "1.8.1", "authors": "The RustCrypto Project Developers", - "repository": "https://github.com/RustCrypto/utils/tree/master/zeroize", + "description": "Securely clear secrets from memory with a simple trait built on stable Rust primitives which guarantee memory is zeroed using an operation will not be 'optimized away' by the compiler. Uses a portable pure Rust implementation that works everywhere, even WASM!", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Securely clear secrets from memory with a simple trait built on stable Rust primitives which guarantee memory is zeroed using an operation will not be 'optimized away' by the compiler. Uses a portable pure Rust implementation that works everywhere, even WASM!" + "name": "zeroize", + "repository": "https://github.com/RustCrypto/utils/tree/master/zeroize" }, { + "authors": "The ICU4X Project Developers", + "description": "A data structure that efficiently maps strings to integers", + "license": "Unicode-3.0", + "license_file": null, "name": "zerotrie", - "version": "0.2.2", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "A data structure that efficiently maps strings to integers" + "repository": "https://github.com/unicode-org/icu4x" }, { + "authors": "The ICU4X Project Developers", + "description": "Zero-copy vector backed by a byte array", + "license": "Unicode-3.0", + "license_file": null, "name": "zerovec", - "version": "0.11.2", - "authors": "The ICU4X Project Developers", - "repository": "https://github.com/unicode-org/icu4x", - "license": "Unicode-3.0", - "license_file": null, - "description": "Zero-copy vector backed by a byte array" + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "zerovec-derive", - "version": "0.11.1", "authors": "Manish Goregaokar ", - "repository": "https://github.com/unicode-org/icu4x", + "description": "Custom derive for the zerovec crate", "license": "Unicode-3.0", "license_file": null, - "description": "Custom derive for the zerovec crate" + "name": "zerovec-derive", + "repository": "https://github.com/unicode-org/icu4x" }, { - "name": "zip", - "version": "1.1.4", "authors": "Mathijs van de Nes |Marli Frost |Ryan Levick |Chris Hennick ", - "repository": "https://github.com/zip-rs/zip2.git", + "description": "Library to support the reading and writing of zip files.", "license": "MIT", "license_file": null, - "description": "Library to support the reading and writing of zip files." + "name": "zip", + "repository": "https://github.com/zip-rs/zip2.git" }, { - "name": "zip", - "version": "4.1.0", "authors": "Mathijs van de Nes |Marli Frost |Ryan Levick |Chris Hennick ", - "repository": "https://github.com/zip-rs/zip2.git", + "description": "Library to support the reading and writing of zip files.", "license": "MIT", "license_file": null, - "description": "Library to support the reading and writing of zip files." + "name": "zip", + "repository": "https://github.com/zip-rs/zip2.git" }, { - "name": "zlib-rs", - "version": "0.5.1", "authors": null, - "repository": "https://github.com/trifectatechfoundation/zlib-rs", + "description": "A memory-safe zlib implementation written in rust", "license": "Zlib", "license_file": null, - "description": "A memory-safe zlib implementation written in rust" + "name": "zlib-rs", + "repository": "https://github.com/trifectatechfoundation/zlib-rs" }, { - "name": "zopfli", - "version": "0.8.2", "authors": null, - "repository": "https://github.com/zopfli-rs/zopfli", + "description": "A Rust implementation of the Zopfli compression algorithm.", "license": "Apache-2.0", "license_file": null, - "description": "A Rust implementation of the Zopfli compression algorithm." + "name": "zopfli", + "repository": "https://github.com/zopfli-rs/zopfli" }, { - "name": "zstd", - "version": "0.13.3", "authors": "Alexandre Bury ", - "repository": "https://github.com/gyscos/zstd-rs", + "description": "Binding for the zstd compression library.", "license": "MIT", "license_file": null, - "description": "Binding for the zstd compression library." + "name": "zstd", + "repository": "https://github.com/gyscos/zstd-rs" }, { + "authors": "Alexandre Bury ", + "description": "Safe low-level bindings for the zstd compression library.", + "license": "Apache-2.0 OR MIT", + "license_file": null, "name": "zstd-safe", - "version": "7.2.4", - "authors": "Alexandre Bury ", - "repository": "https://github.com/gyscos/zstd-rs", - "license": "Apache-2.0 OR MIT", - "license_file": null, - "description": "Safe low-level bindings for the zstd compression library." + "repository": "https://github.com/gyscos/zstd-rs" }, { - "name": "zstd-sys", - "version": "2.0.15+zstd.1.5.7", "authors": "Alexandre Bury ", - "repository": "https://github.com/gyscos/zstd-rs", + "description": "Low-level bindings for the zstd compression library.", "license": "Apache-2.0 OR MIT", "license_file": null, - "description": "Low-level bindings for the zstd compression library." + "name": "zstd-sys", + "repository": "https://github.com/gyscos/zstd-rs" } -] +] \ No newline at end of file diff --git a/ftl/core-repo b/ftl/core-repo index 3d04bcbf7..a599715d3 160000 --- a/ftl/core-repo +++ b/ftl/core-repo @@ -1 +1 @@ -Subproject commit 3d04bcbf7fefca0007bc9db307409d88210995d8 +Subproject commit a599715d3c27ff2eb895c749f3534ab73d83dad1 diff --git a/ftl/core/database-check.ftl b/ftl/core/database-check.ftl index 8a9e4e178..ce2f827cd 100644 --- a/ftl/core/database-check.ftl +++ b/ftl/core/database-check.ftl @@ -5,6 +5,11 @@ database-check-card-properties = [one] Fixed { $count } invalid card property. *[other] Fixed { $count } invalid card properties. } +database-check-card-last-review-time-empty = + { $count -> + [one] Added last review time to { $count } card. + *[other] Added last review time to { $count } cards. + } database-check-missing-templates = { $count -> [one] Deleted { $count } card with missing template. diff --git a/ftl/core/deck-config.ftl b/ftl/core/deck-config.ftl index 01eac3369..da3e4ea34 100644 --- a/ftl/core/deck-config.ftl +++ b/ftl/core/deck-config.ftl @@ -505,7 +505,9 @@ deck-config-desired-retention-below-optimal = Your desired retention is below op # Description of the y axis in the FSRS simulation # diagram (Deck options -> FSRS) showing the total number of # cards that can be recalled or retrieved on a specific date. -deck-config-fsrs-simulator-experimental = FSRS simulator (experimental) +deck-config-fsrs-simulator-experimental = FSRS Simulator (Experimental) +deck-config-fsrs-simulate-desired-retention-experimental = FSRS Desired Retention Simulator (Experimental) +deck-config-fsrs-desired-retention-help-me-decide-experimental = Help Me Decide (Experimental) deck-config-additional-new-cards-to-simulate = Additional new cards to simulate deck-config-simulate = Simulate deck-config-clear-last-simulate = Clear Last Simulation @@ -519,6 +521,9 @@ deck-config-save-options-to-preset-confirm = Overwrite the options in your curre # to show the total number of cards that can be recalled or retrieved on a # specific date. deck-config-fsrs-simulator-radio-memorized = Memorized +deck-config-fsrs-simulator-radio-ratio = Time / Memorized Ratio +# $time here is pre-formatted e.g. "10 Seconds" +deck-config-fsrs-simulator-ratio-tooltip = { $time } per memorized card ## Messages related to the FSRS scheduler’s health check. The health check determines whether the correlation between FSRS predictions and your memory is good or bad. It can be optionally triggered as part of the "Optimize" function. @@ -528,7 +533,7 @@ deck-config-health-check = Check health when optimizing deck-config-fsrs-bad-fit-warning = Health Check: Your memory is difficult for FSRS to predict. Recommendations: - - Suspend or reformulate leeches. + - Suspend or reformulate any cards you constantly forget. - Use the answer buttons consistently. Keep in mind that "Hard" is a passing grade, not a failing grade. - Understand before you memorize. @@ -539,6 +544,7 @@ deck-config-fsrs-good-fit = Health Check: ## NO NEED TO TRANSLATE. This text is no longer used by Anki, and will be removed in the future. +deck-config-plotted-on-x-axis = (Plotted on the X-axis) deck-config-a-100-day-interval = { $days -> [one] A 100 day interval will become { $days } day. diff --git a/ftl/core/preferences.ftl b/ftl/core/preferences.ftl index ce24df434..23b72f267 100644 --- a/ftl/core/preferences.ftl +++ b/ftl/core/preferences.ftl @@ -34,7 +34,7 @@ preferences-when-adding-default-to-current-deck = When adding, default to curren preferences-you-can-restore-backups-via-fileswitch = You can restore backups via File > Switch Profile. preferences-legacy-timezone-handling = Legacy timezone handling (buggy, but required for AnkiDroid <= 2.14) preferences-default-search-text = Default search text -preferences-default-search-text-example = eg. 'deck:current ' +preferences-default-search-text-example = e.g. "deck:current" preferences-theme = Theme preferences-theme-follow-system = Follow System preferences-theme-light = Light diff --git a/ftl/core/statistics.ftl b/ftl/core/statistics.ftl index 8da1aace8..c5551ef67 100644 --- a/ftl/core/statistics.ftl +++ b/ftl/core/statistics.ftl @@ -80,7 +80,7 @@ statistics-reviews = # This fragment of the tooltip in the FSRS simulation # diagram (Deck options -> FSRS) shows the total number of # cards that can be recalled or retrieved on a specific date. -statistics-memorized = {$memorized} memorized +statistics-memorized = {$memorized} cards memorized statistics-today-title = Today statistics-today-again-count = Again count: statistics-today-type-counts = Learn: { $learnCount }, Review: { $reviewCount }, Relearn: { $relearnCount }, Filtered: { $filteredCount } @@ -99,9 +99,9 @@ statistics-counts-relearning-cards = Relearning statistics-counts-title = Card Counts statistics-counts-separate-suspended-buried-cards = Separate suspended/buried cards -## Retention rate represents your actual retention rate from past reviews, in +## Retention represents your actual retention from past reviews, in ## comparison to the "desired retention" setting of FSRS, which forecasts -## future retention. Retention rate is the percentage of all reviewed cards +## future retention. Retention is the percentage of all reviewed cards ## that were marked as "Hard," "Good," or "Easy" within a specific time period. ## ## Most of these strings are used as column / row headings in a table. @@ -112,9 +112,9 @@ statistics-counts-separate-suspended-buried-cards = Separate suspended/buried ca ## N.B. Stats cards may be very small on mobile devices and when the Stats ## window is certain sizes. -statistics-true-retention-title = Retention rate +statistics-true-retention-title = Retention statistics-true-retention-subtitle = Pass rate of cards with an interval ≥ 1 day. -statistics-true-retention-tooltip = If you are using FSRS, your retention rate is expected to be close to your desired retention. Please keep in mind that data for a single day is noisy, so it's better to look at monthly data. +statistics-true-retention-tooltip = If you are using FSRS, your retention is expected to be close to your desired retention. Please keep in mind that data for a single day is noisy, so it's better to look at monthly data. statistics-true-retention-range = Range statistics-true-retention-pass = Pass statistics-true-retention-fail = Fail diff --git a/ftl/qt-repo b/ftl/qt-repo index c65a9587b..bb4207f3b 160000 --- a/ftl/qt-repo +++ b/ftl/qt-repo @@ -1 +1 @@ -Subproject commit c65a9587b1f18931986bdf145872e8e4c44c5c82 +Subproject commit bb4207f3b8e9a7c428db282d12c75b850be532f3 diff --git a/proto/anki/deck_config.proto b/proto/anki/deck_config.proto index 9dae49c6a..5ed02423e 100644 --- a/proto/anki/deck_config.proto +++ b/proto/anki/deck_config.proto @@ -40,12 +40,10 @@ message DeckConfigId { message GetRetentionWorkloadRequest { repeated float w = 1; string search = 2; - float before = 3; - float after = 4; } message GetRetentionWorkloadResponse { - float factor = 1; + map costs = 1; } message GetIgnoredBeforeCountRequest { @@ -219,6 +217,8 @@ message DeckConfigsForUpdate { bool review_today_active = 5; // Whether new_today applies to today or a past day. bool new_today_active = 6; + // Deck-specific desired retention override + optional float desired_retention = 7; } string name = 1; int64 config_id = 2; diff --git a/proto/anki/decks.proto b/proto/anki/decks.proto index bcd206b06..b244eb4a1 100644 --- a/proto/anki/decks.proto +++ b/proto/anki/decks.proto @@ -83,6 +83,8 @@ message Deck { optional uint32 new_limit = 7; DayLimit review_limit_today = 8; DayLimit new_limit_today = 9; + // Deck-specific desired retention override + optional float desired_retention = 10; reserved 12 to 15; } diff --git a/proto/anki/scheduler.proto b/proto/anki/scheduler.proto index 01f092a39..34b350642 100644 --- a/proto/anki/scheduler.proto +++ b/proto/anki/scheduler.proto @@ -55,6 +55,8 @@ service SchedulerService { returns (ComputeOptimalRetentionResponse); rpc SimulateFsrsReview(SimulateFsrsReviewRequest) returns (SimulateFsrsReviewResponse); + rpc SimulateFsrsWorkload(SimulateFsrsReviewRequest) + returns (SimulateFsrsWorkloadResponse); rpc EvaluateParams(EvaluateParamsRequest) returns (EvaluateParamsResponse); rpc EvaluateParamsLegacy(EvaluateParamsLegacyRequest) returns (EvaluateParamsResponse); @@ -404,6 +406,9 @@ message SimulateFsrsReviewRequest { repeated float easy_days_percentages = 10; deck_config.DeckConfig.Config.ReviewCardOrder review_order = 11; optional uint32 suspend_after_lapse_count = 12; + float historical_retention = 13; + uint32 learning_step_count = 14; + uint32 relearning_step_count = 15; } message SimulateFsrsReviewResponse { @@ -413,6 +418,12 @@ message SimulateFsrsReviewResponse { repeated float daily_time_cost = 4; } +message SimulateFsrsWorkloadResponse { + map cost = 1; + map memorized = 2; + map review_count = 3; +} + message ComputeOptimalRetentionResponse { float optimal_retention = 1; } diff --git a/pylib/anki/_backend.py b/pylib/anki/_backend.py index 03fbb30d6..9a68cf644 100644 --- a/pylib/anki/_backend.py +++ b/pylib/anki/_backend.py @@ -246,7 +246,7 @@ def backend_exception_to_pylib(err: backend_pb2.BackendError) -> Exception: return BackendError(err.message, help_page, context, backtrace) elif val == kind.SEARCH_ERROR: - return SearchError(markdown(err.message), help_page, context, backtrace) + return SearchError(err.message, help_page, context, backtrace) elif val == kind.UNDO_EMPTY: return UndoEmpty(err.message, help_page, context, backtrace) diff --git a/pylib/anki/cards.py b/pylib/anki/cards.py index 854d4ed18..b8154510e 100644 --- a/pylib/anki/cards.py +++ b/pylib/anki/cards.py @@ -133,6 +133,7 @@ class Card(DeprecatedNamesMixin): memory_state=self.memory_state, desired_retention=self.desired_retention, decay=self.decay, + last_review_time_secs=self.last_review_time, ) @deprecated(info="please use col.update_card()") diff --git a/pylib/anki/foreign_data/mnemosyne.py b/pylib/anki/foreign_data/mnemosyne.py index 078355571..9c35be38f 100644 --- a/pylib/anki/foreign_data/mnemosyne.py +++ b/pylib/anki/foreign_data/mnemosyne.py @@ -176,7 +176,7 @@ class MnemoFact: try: fact_view = self.cards[0].fact_view_id except IndexError as err: - raise Exception(f"Fact {id} has no cards") from err + raise Exception(f"Fact {self.id} has no cards") from err if fact_view.startswith("1.") or fact_view.startswith("1::"): return FrontOnly @@ -187,7 +187,7 @@ class MnemoFact: elif fact_view.startswith("5.1"): return Cloze - raise Exception(f"Fact {id} has unknown fact view: {fact_view}") + raise Exception(f"Fact {self.id} has unknown fact view: {fact_view}") def anki_fields(self, fact_view: type[MnemoFactView]) -> list[str]: return [munge_field(self.fields.get(k, "")) for k in fact_view.field_keys] diff --git a/pylib/anki/lang.py b/pylib/anki/lang.py index 9ff8dcd9e..b639b0416 100644 --- a/pylib/anki/lang.py +++ b/pylib/anki/lang.py @@ -73,7 +73,7 @@ langs = sorted( ("ଓଡ଼ିଆ", "or_OR"), ("Filipino", "tl"), ("ئۇيغۇر", "ug"), - ("Oʻzbek", "uz_UZ"), + ("Oʻzbekcha", "uz_UZ"), ] ) diff --git a/pylib/pyproject.toml b/pylib/pyproject.toml index 23e10077f..fb7422694 100644 --- a/pylib/pyproject.toml +++ b/pylib/pyproject.toml @@ -7,7 +7,7 @@ dependencies = [ "decorator", "markdown", "orjson", - "protobuf>=4.21", + "protobuf>=6.0,<8.0", "requests[socks]", # remove after we update to min python 3.11+ "typing_extensions", diff --git a/qt/aqt/about.py b/qt/aqt/about.py index 228d3cfeb..03e989f2c 100644 --- a/qt/aqt/about.py +++ b/qt/aqt/about.py @@ -70,10 +70,10 @@ def show(mw: aqt.AnkiQt) -> QDialog: abouttext += f"

{lede}" abouttext += f"

{tr.about_anki_is_licensed_under_the_agpl3()}" abouttext += f"

{tr.about_version(val=version_with_build())}
" - abouttext += ("Python %s Qt %s PyQt %s
") % ( + abouttext += ("Python %s Qt %s Chromium %s
") % ( platform.python_version(), qVersion(), - PYQT_VERSION_STR, + (qWebEngineChromiumVersion() or "").split(".")[0], ) abouttext += ( without_unicode_isolation(tr.about_visit_website(val=aqt.appWebsite)) @@ -225,6 +225,7 @@ def show(mw: aqt.AnkiQt) -> QDialog: "Adnane Taghi", "Anon_0000", "Bilolbek Normuminov", + "Sagiv Marzini", ) ) diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py index 5d41f4ac9..e222f62c2 100644 --- a/qt/aqt/browser/browser.py +++ b/qt/aqt/browser/browser.py @@ -10,6 +10,8 @@ import re from collections.abc import Callable, Sequence from typing import Any, cast +from markdown import markdown + import aqt import aqt.browser import aqt.editor @@ -20,7 +22,7 @@ from anki.cards import Card, CardId from anki.collection import Collection, Config, OpChanges, SearchNode from anki.consts import * from anki.decks import DeckId -from anki.errors import NotFoundError +from anki.errors import NotFoundError, SearchError from anki.lang import without_unicode_isolation from anki.models import NotetypeId from anki.notes import NoteId @@ -498,6 +500,8 @@ class Browser(QMainWindow): text = self.current_search() try: normed = self.col.build_search_string(text) + except SearchError as err: + showWarning(markdown(str(err))) except Exception as err: showWarning(str(err)) else: diff --git a/qt/aqt/browser/card_info.py b/qt/aqt/browser/card_info.py index fe031e630..c925d43bb 100644 --- a/qt/aqt/browser/card_info.py +++ b/qt/aqt/browser/card_info.py @@ -51,6 +51,7 @@ class CardInfoDialog(QDialog): def _setup_ui(self, card_id: CardId | None) -> None: self.mw.garbage_collect_on_dialog_finish(self) + self.setMinimumSize(400, 300) disable_help_button(self) restoreGeom(self, self.GEOMETRY_KEY, default_size=(800, 800)) add_close_shortcut(self) diff --git a/qt/aqt/data/qt/icons/media-record.png b/qt/aqt/data/qt/icons/media-record.png deleted file mode 100644 index 776e38f6a..000000000 Binary files a/qt/aqt/data/qt/icons/media-record.png and /dev/null differ diff --git a/qt/aqt/data/qt/icons/media-record.svg b/qt/aqt/data/qt/icons/media-record.svg new file mode 100644 index 000000000..894787f6c --- /dev/null +++ b/qt/aqt/data/qt/icons/media-record.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/qt/aqt/forms/preferences.ui b/qt/aqt/forms/preferences.ui index 807d4093c..0035e1f42 100644 --- a/qt/aqt/forms/preferences.ui +++ b/qt/aqt/forms/preferences.ui @@ -1292,9 +1292,10 @@ daily_backups weekly_backups monthly_backups - tabWidget syncAnkiHubLogout syncAnkiHubLogin + buttonBox + tabWidget diff --git a/qt/aqt/mediasrv.py b/qt/aqt/mediasrv.py index f08be4cef..820e762d9 100644 --- a/qt/aqt/mediasrv.py +++ b/qt/aqt/mediasrv.py @@ -483,7 +483,7 @@ def update_deck_configs() -> bytes: update.abort = True def on_success(changes: OpChanges) -> None: - if isinstance(window := aqt.mw.app.activeWindow(), DeckOptionsDialog): + if isinstance(window := aqt.mw.app.activeModalWidget(), DeckOptionsDialog): window.reject() def handle_on_main() -> None: @@ -511,7 +511,7 @@ def set_scheduling_states() -> bytes: def import_done() -> bytes: def update_window_modality() -> None: - if window := aqt.mw.app.activeWindow(): + if window := aqt.mw.app.activeModalWidget(): from aqt.import_export.import_dialog import ImportDialog if isinstance(window, ImportDialog): @@ -529,7 +529,7 @@ def import_request(endpoint: str) -> bytes: response.ParseFromString(output) def handle_on_main() -> None: - window = aqt.mw.app.activeWindow() + window = aqt.mw.app.activeModalWidget() on_op_finished(aqt.mw, response, window) aqt.mw.taskman.run_on_main(handle_on_main) @@ -569,7 +569,7 @@ def change_notetype() -> bytes: data = request.data def handle_on_main() -> None: - window = aqt.mw.app.activeWindow() + window = aqt.mw.app.activeModalWidget() if isinstance(window, ChangeNotetypeDialog): window.save(data) @@ -579,7 +579,7 @@ def change_notetype() -> bytes: def deck_options_require_close() -> bytes: def handle_on_main() -> None: - window = aqt.mw.app.activeWindow() + window = aqt.mw.app.activeModalWidget() if isinstance(window, DeckOptionsDialog): window.require_close() @@ -591,7 +591,7 @@ def deck_options_require_close() -> bytes: def deck_options_ready() -> bytes: def handle_on_main() -> None: - window = aqt.mw.app.activeWindow() + window = aqt.mw.app.activeModalWidget() if isinstance(window, DeckOptionsDialog): window.set_ready() @@ -654,6 +654,7 @@ exposed_backend_list = [ "evaluate_params_legacy", "get_optimal_retention_parameters", "simulate_fsrs_review", + "simulate_fsrs_workload", # DeckConfigService "get_ignored_before_count", "get_retention_workload", diff --git a/qt/aqt/package.py b/qt/aqt/package.py index 968218741..5d349c473 100644 --- a/qt/aqt/package.py +++ b/qt/aqt/package.py @@ -124,17 +124,14 @@ def launcher_executable() -> str | None: def trigger_launcher_run() -> None: - """Bump the mtime on pyproject.toml in the local data directory to trigger an update on next run.""" + """Create a trigger file to request launcher UI on next run.""" try: root = launcher_root() if not root: return - pyproject_path = Path(root) / "pyproject.toml" - - if pyproject_path.exists(): - # Touch the file to update its mtime - pyproject_path.touch() + trigger_path = Path(root) / ".want-launcher" + trigger_path.touch() except Exception as e: print(e) @@ -150,6 +147,7 @@ def update_and_restart() -> None: with contextlib.suppress(ResourceWarning): env = os.environ.copy() + env["ANKI_LAUNCHER_WANT_TERMINAL"] = "1" # fixes a bug where launcher fails to appear if opening it # straight after updating if "GNOME_TERMINAL_SCREEN" in env: @@ -159,12 +157,15 @@ def update_and_restart() -> None: creationflags = ( subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS ) + # On Windows 10, changing the handles breaks ANSI display + io = None if sys.platform == "win32" else subprocess.DEVNULL + subprocess.Popen( [launcher], start_new_session=True, - stdin=subprocess.DEVNULL, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, + stdin=io, + stdout=io, + stderr=io, env=env, creationflags=creationflags, ) diff --git a/qt/aqt/preferences.py b/qt/aqt/preferences.py index bd87ef830..afce6d489 100644 --- a/qt/aqt/preferences.py +++ b/qt/aqt/preferences.py @@ -82,11 +82,14 @@ class Preferences(QDialog): ) group = self.form.preferences_answer_keys group.setLayout(layout := QFormLayout()) + tab_widget: QWidget = self.form.url_schemes for ease, label in ease_labels: layout.addRow( label, line_edit := QLineEdit(self.mw.pm.get_answer_key(ease) or ""), ) + QWidget.setTabOrder(tab_widget, line_edit) + tab_widget = line_edit qconnect( line_edit.textChanged, functools.partial(self.mw.pm.set_answer_key, ease), diff --git a/qt/aqt/sound.py b/qt/aqt/sound.py index d20365232..e62786871 100644 --- a/qt/aqt/sound.py +++ b/qt/aqt/sound.py @@ -633,7 +633,7 @@ class QtAudioInputRecorder(Recorder): from PyQt6.QtMultimedia import QAudioFormat, QAudioSource # type: ignore format = QAudioFormat() - format.setChannelCount(1) + format.setChannelCount(2) format.setSampleRate(44100) format.setSampleFormat(QAudioFormat.SampleFormat.Int16) @@ -743,7 +743,8 @@ class RecordDialog(QDialog): def _setup_dialog(self) -> None: self.setWindowTitle("Anki") icon = QLabel() - icon.setPixmap(QPixmap("icons:media-record.png")) + qicon = QIcon("icons:media-record.svg") + icon.setPixmap(qicon.pixmap(60, 60)) self.label = QLabel("...") hbox = QHBoxLayout() hbox.addWidget(icon) diff --git a/qt/aqt/stylesheets.py b/qt/aqt/stylesheets.py index a262e18b9..6b4eff1f5 100644 --- a/qt/aqt/stylesheets.py +++ b/qt/aqt/stylesheets.py @@ -177,9 +177,13 @@ class CustomStyles: QPushButton:default {{ border: 1px solid {tm.var(colors.BORDER_FOCUS)}; }} + QPushButton {{ + margin: 1px; + }} QPushButton:focus {{ border: 2px solid {tm.var(colors.BORDER_FOCUS)}; outline: none; + margin: 0px; }} QPushButton:hover, QTabBar::tab:hover, diff --git a/qt/aqt/sync.py b/qt/aqt/sync.py index bedc05f8e..9b29ada20 100644 --- a/qt/aqt/sync.py +++ b/qt/aqt/sync.py @@ -73,7 +73,7 @@ def handle_sync_error(mw: aqt.main.AnkiQt, err: Exception) -> None: elif isinstance(err, Interrupted): # no message to show return - show_warning(str(err)) + show_warning(str(err), parent=mw) def on_normal_sync_timer(mw: aqt.main.AnkiQt) -> None: @@ -118,7 +118,7 @@ def sync_collection(mw: aqt.main.AnkiQt, on_done: Callable[[], None]) -> None: if out.new_endpoint: mw.pm.set_current_sync_url(out.new_endpoint) if out.server_message: - showText(out.server_message) + showText(out.server_message, parent=mw) if out.required == out.NO_CHANGES: tooltip(parent=mw, msg=tr.sync_collection_complete()) # all done; track media progress diff --git a/qt/aqt/utils.py b/qt/aqt/utils.py index 64d057082..43efc513f 100644 --- a/qt/aqt/utils.py +++ b/qt/aqt/utils.py @@ -226,29 +226,45 @@ def ask_user_dialog( ) -def show_info(text: str, callback: Callable | None = None, **kwargs: Any) -> MessageBox: +def show_info( + text: str, + callback: Callable | None = None, + parent: QWidget | None = None, + **kwargs: Any, +) -> MessageBox: "Show a small info window with an OK button." if "icon" not in kwargs: kwargs["icon"] = QMessageBox.Icon.Information return MessageBox( text, callback=(lambda _: callback()) if callback is not None else None, + parent=parent, **kwargs, ) def show_warning( - text: str, callback: Callable | None = None, **kwargs: Any + text: str, + callback: Callable | None = None, + parent: QWidget | None = None, + **kwargs: Any, ) -> MessageBox: "Show a small warning window with an OK button." - return show_info(text, icon=QMessageBox.Icon.Warning, callback=callback, **kwargs) + return show_info( + text, icon=QMessageBox.Icon.Warning, callback=callback, parent=parent, **kwargs + ) def show_critical( - text: str, callback: Callable | None = None, **kwargs: Any + text: str, + callback: Callable | None = None, + parent: QWidget | None = None, + **kwargs: Any, ) -> MessageBox: "Show a small critical error window with an OK button." - return show_info(text, icon=QMessageBox.Icon.Critical, callback=callback, **kwargs) + return show_info( + text, icon=QMessageBox.Icon.Critical, callback=callback, parent=parent, **kwargs + ) def showWarning( diff --git a/qt/launcher/addon/__init__.py b/qt/launcher/addon/__init__.py index 63a2cc5a9..4ef348b9f 100644 --- a/qt/launcher/addon/__init__.py +++ b/qt/launcher/addon/__init__.py @@ -69,17 +69,14 @@ def add_python_requirements(reqs: list[str]) -> tuple[bool, str]: def trigger_launcher_run() -> None: - """Bump the mtime on pyproject.toml in the local data directory to trigger an update on next run.""" + """Create a trigger file to request launcher UI on next run.""" try: root = launcher_root() if not root: return - pyproject_path = Path(root) / "pyproject.toml" - - if pyproject_path.exists(): - # Touch the file to update its mtime - pyproject_path.touch() + trigger_path = Path(root) / ".want-launcher" + trigger_path.touch() except Exception as e: print(e) @@ -93,17 +90,21 @@ def update_and_restart() -> None: with contextlib.suppress(ResourceWarning): env = os.environ.copy() + env["ANKI_LAUNCHER_WANT_TERMINAL"] = "1" creationflags = 0 if sys.platform == "win32": creationflags = ( subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS ) + # On Windows, changing the handles breaks ANSI display + io = None if sys.platform == "win32" else subprocess.DEVNULL + subprocess.Popen( [launcher], start_new_session=True, - stdin=subprocess.DEVNULL, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, + stdin=io, + stdout=io, + stderr=io, env=env, creationflags=creationflags, ) diff --git a/qt/launcher/lin/build.sh b/qt/launcher/lin/build.sh index 7bd78c27d..f38f6defe 100755 --- a/qt/launcher/lin/build.sh +++ b/qt/launcher/lin/build.sh @@ -13,7 +13,8 @@ HOST_ARCH=$(uname -m) # Define output paths OUTPUT_DIR="../../../out/launcher" -LAUNCHER_DIR="$OUTPUT_DIR/anki-linux" +ANKI_VERSION=$(cat ../../../.version | tr -d '\n') +LAUNCHER_DIR="$OUTPUT_DIR/anki-launcher-$ANKI_VERSION-linux" # Clean existing output directory rm -rf "$LAUNCHER_DIR" @@ -77,8 +78,8 @@ chmod +x \ chmod -R a+r "$LAUNCHER_DIR" ZSTD="zstd -c --long -T0 -18" -TRANSFORM="s%^.%anki-linux%S" -TARBALL="$OUTPUT_DIR/anki-linux.tar.zst" +TRANSFORM="s%^.%anki-launcher-$ANKI_VERSION-linux%S" +TARBALL="$OUTPUT_DIR/anki-launcher-$ANKI_VERSION-linux.tar.zst" tar -I "$ZSTD" --transform "$TRANSFORM" -cf "$TARBALL" -C "$LAUNCHER_DIR" . diff --git a/qt/launcher/mac/Info.plist b/qt/launcher/mac/Info.plist index ac0ab2f09..a48960208 100644 --- a/qt/launcher/mac/Info.plist +++ b/qt/launcher/mac/Info.plist @@ -5,7 +5,7 @@ CFBundleDisplayName Anki CFBundleShortVersionString - 1.0 + ANKI_VERSION LSMinimumSystemVersion 12 LSApplicationCategoryType diff --git a/qt/launcher/mac/build.sh b/qt/launcher/mac/build.sh index 470b5cd25..6143451b4 100755 --- a/qt/launcher/mac/build.sh +++ b/qt/launcher/mac/build.sh @@ -31,25 +31,26 @@ lipo -create \ cp "$OUTPUT_DIR/uv" "$APP_LAUNCHER/Contents/MacOS/" # Copy support files -cp Info.plist "$APP_LAUNCHER/Contents/" +ANKI_VERSION=$(cat ../../../.version | tr -d '\n') +sed "s/ANKI_VERSION/$ANKI_VERSION/g" Info.plist > "$APP_LAUNCHER/Contents/Info.plist" cp icon/Assets.car "$APP_LAUNCHER/Contents/Resources/" cp ../pyproject.toml "$APP_LAUNCHER/Contents/Resources/" cp ../../../.python-version "$APP_LAUNCHER/Contents/Resources/" cp ../versions.py "$APP_LAUNCHER/Contents/Resources/" -# Codesign -for i in "$APP_LAUNCHER/Contents/MacOS/uv" "$APP_LAUNCHER/Contents/MacOS/launcher" "$APP_LAUNCHER"; do - codesign --force -vvvv -o runtime -s "Developer ID Application:" \ - --entitlements entitlements.python.xml \ - "$i" -done - -# Check -codesign -vvv "$APP_LAUNCHER" -spctl -a "$APP_LAUNCHER" - -# Notarize and bundle (skip if NODMG is set) +# Codesign/bundle if [ -z "$NODMG" ]; then + for i in "$APP_LAUNCHER/Contents/MacOS/uv" "$APP_LAUNCHER/Contents/MacOS/launcher" "$APP_LAUNCHER"; do + codesign --force -vvvv -o runtime -s "Developer ID Application:" \ + --entitlements entitlements.python.xml \ + "$i" + done + + # Check + codesign -vvv "$APP_LAUNCHER" + spctl -a "$APP_LAUNCHER" + + # Notarize and build dmg ./notarize.sh "$OUTPUT_DIR" ./dmg/build.sh "$OUTPUT_DIR" fi \ No newline at end of file diff --git a/qt/launcher/mac/dmg/build.sh b/qt/launcher/mac/dmg/build.sh index 16b48c06a..7eeba9948 100755 --- a/qt/launcher/mac/dmg/build.sh +++ b/qt/launcher/mac/dmg/build.sh @@ -6,7 +6,8 @@ set -e # base folder with Anki.app in it output="$1" dist="$1/tmp" -dmg_path="$output/Anki.dmg" +ANKI_VERSION=$(cat ../../../.version | tr -d '\n') +dmg_path="$output/anki-launcher-$ANKI_VERSION-mac.dmg" if [ -d "/Volumes/Anki" ] then diff --git a/qt/launcher/src/bin/build_win.rs b/qt/launcher/src/bin/build_win.rs index 96688f190..4c2ca4413 100644 --- a/qt/launcher/src/bin/build_win.rs +++ b/qt/launcher/src/bin/build_win.rs @@ -22,6 +22,11 @@ const NSIS_PATH: &str = "C:\\Program Files (x86)\\NSIS\\makensis.exe"; fn main() -> Result<()> { println!("Building Windows launcher..."); + // Read version early so it can be used throughout the build process + let version = std::fs::read_to_string("../../../.version")? + .trim() + .to_string(); + let output_dir = PathBuf::from(OUTPUT_DIR); let launcher_exe_dir = PathBuf::from(LAUNCHER_EXE_DIR); let nsis_dir = PathBuf::from(NSIS_DIR); @@ -31,16 +36,20 @@ fn main() -> Result<()> { extract_nsis_plugins()?; copy_files(&output_dir)?; sign_binaries(&output_dir)?; - copy_nsis_files(&nsis_dir)?; + copy_nsis_files(&nsis_dir, &version)?; build_uninstaller(&output_dir, &nsis_dir)?; sign_file(&output_dir.join("uninstall.exe"))?; generate_install_manifest(&output_dir)?; build_installer(&output_dir, &nsis_dir)?; - sign_file(&PathBuf::from("../../../out/launcher_exe/anki-install.exe"))?; + + let installer_filename = format!("anki-launcher-{version}-windows.exe"); + let installer_path = PathBuf::from("../../../out/launcher_exe").join(&installer_filename); + + sign_file(&installer_path)?; println!("Build completed successfully!"); println!("Output directory: {}", output_dir.display()); - println!("Installer: ../../../out/launcher_exe/anki-install.exe"); + println!("Installer: ../../../out/launcher_exe/{installer_filename}"); Ok(()) } @@ -235,11 +244,13 @@ fn generate_install_manifest(output_dir: &Path) -> Result<()> { Ok(()) } -fn copy_nsis_files(nsis_dir: &Path) -> Result<()> { +fn copy_nsis_files(nsis_dir: &Path, version: &str) -> Result<()> { println!("Copying NSIS support files..."); - // Copy anki.template.nsi as anki.nsi - copy_file("anki.template.nsi", nsis_dir.join("anki.nsi"))?; + // Copy anki.template.nsi as anki.nsi and substitute version placeholders + let template_content = std::fs::read_to_string("anki.template.nsi")?; + let substituted_content = template_content.replace("ANKI_VERSION", version); + write_file(nsis_dir.join("anki.nsi"), substituted_content)?; // Copy fileassoc.nsh copy_file("fileassoc.nsh", nsis_dir.join("fileassoc.nsh"))?; diff --git a/qt/launcher/src/main.rs b/qt/launcher/src/main.rs index 5679f8f71..297df5b8b 100644 --- a/qt/launcher/src/main.rs +++ b/qt/launcher/src/main.rs @@ -11,7 +11,6 @@ use std::time::SystemTime; use std::time::UNIX_EPOCH; use anki_io::copy_file; -use anki_io::copy_if_newer; use anki_io::create_dir_all; use anki_io::modified_time; use anki_io::read_file; @@ -46,8 +45,12 @@ struct State { dist_python_version_path: std::path::PathBuf, uv_lock_path: std::path::PathBuf, sync_complete_marker: std::path::PathBuf, + launcher_trigger_file: std::path::PathBuf, + mirror_path: std::path::PathBuf, + pyproject_modified_by_user: bool, previous_version: Option, resources_dir: std::path::PathBuf, + venv_folder: std::path::PathBuf, } #[derive(Debug, Clone)] @@ -69,8 +72,8 @@ pub enum MainMenuChoice { Version(VersionKind), ToggleBetas, ToggleCache, + DownloadMirror, Uninstall, - Quit, } fn main() { @@ -106,8 +109,12 @@ fn run() -> Result<()> { dist_python_version_path: resources_dir.join(".python-version"), uv_lock_path: uv_install_root.join("uv.lock"), sync_complete_marker: uv_install_root.join(".sync_complete"), + launcher_trigger_file: uv_install_root.join(".want-launcher"), + mirror_path: uv_install_root.join("mirror"), + pyproject_modified_by_user: false, // calculated later previous_version: None, resources_dir, + venv_folder: uv_install_root.join(".venv"), }; // Check for uninstall request from Windows uninstaller @@ -117,23 +124,19 @@ fn run() -> Result<()> { return Ok(()); } - // Create install directory and copy project files in + // Create install directory create_dir_all(&state.uv_install_root)?; - copy_if_newer(&state.dist_pyproject_path, &state.user_pyproject_path)?; - copy_if_newer( - &state.dist_python_version_path, - &state.user_python_version_path, - )?; - let pyproject_has_changed = !state.sync_complete_marker.exists() || { - let pyproject_toml_time = modified_time(&state.user_pyproject_path)?; - let sync_complete_time = modified_time(&state.sync_complete_marker)?; - Ok::(pyproject_toml_time > sync_complete_time) - } - .unwrap_or(true); + let launcher_requested = + state.launcher_trigger_file.exists() || !state.user_pyproject_path.exists(); - if !pyproject_has_changed { - // If venv is already up to date, launch Anki normally + // Calculate whether user has custom edits that need syncing + let pyproject_time = file_timestamp_secs(&state.user_pyproject_path); + let sync_time = file_timestamp_secs(&state.sync_complete_marker); + state.pyproject_modified_by_user = pyproject_time > sync_time; + let pyproject_has_changed = state.pyproject_modified_by_user; + if !launcher_requested && !pyproject_has_changed { + // If no launcher request and venv is already up to date, launch Anki normally let args: Vec = std::env::args().skip(1).collect(); let cmd = build_python_command(&state, &args)?; launch_anki_normally(cmd)?; @@ -143,6 +146,11 @@ fn run() -> Result<()> { // If we weren't in a terminal, respawn ourselves in one ensure_terminal_shown()?; + if launcher_requested { + // Remove the trigger file to make request ephemeral + let _ = remove_file(&state.launcher_trigger_file); + } + print!("\x1B[2J\x1B[H"); // Clear screen and move cursor to top println!("\x1B[1mAnki Launcher\x1B[0m\n"); @@ -150,15 +158,10 @@ fn run() -> Result<()> { check_versions(&mut state); - let first_run = !state.uv_install_root.join(".venv").exists(); - if first_run { - handle_version_install_or_update(&state, MainMenuChoice::Latest)?; - } else { - main_menu_loop(&state)?; - } + main_menu_loop(&state)?; // Write marker file to indicate we've completed the sync process - write_sync_marker(&state.sync_complete_marker)?; + write_sync_marker(&state)?; #[cfg(target_os = "macos")] { @@ -184,12 +187,15 @@ fn run() -> Result<()> { Ok(()) } -fn extract_aqt_version( - uv_path: &std::path::Path, - uv_install_root: &std::path::Path, -) -> Option { - let output = Command::new(uv_path) - .current_dir(uv_install_root) +fn extract_aqt_version(state: &State) -> Option { + // Check if .venv exists first + if !state.venv_folder.exists() { + return None; + } + + let output = Command::new(&state.uv_path) + .current_dir(&state.uv_install_root) + .env("VIRTUAL_ENV", &state.venv_folder) .args(["pip", "show", "aqt"]) .output() .ok()?; @@ -214,7 +220,7 @@ fn check_versions(state: &mut State) { } // Determine current version by invoking uv pip show aqt - match extract_aqt_version(&state.uv_path, &state.uv_install_root) { + match extract_aqt_version(state) { Some(version) => { state.current_version = Some(version); } @@ -239,12 +245,12 @@ fn handle_version_install_or_update(state: &State, choice: MainMenuChoice) -> Re update_pyproject_for_version(choice.clone(), state)?; // Extract current version before syncing (but don't write to file yet) - let previous_version_to_save = extract_aqt_version(&state.uv_path, &state.uv_install_root); + let previous_version_to_save = extract_aqt_version(state); // Remove sync marker before attempting sync let _ = remove_file(&state.sync_complete_marker); - println!("\x1B[1mUpdating Anki...\x1B[0m\n"); + println!("Updating Anki...\n"); let python_version_trimmed = if state.user_python_version_path.exists() { let python_version = read_file(&state.user_python_version_path)?; @@ -255,29 +261,44 @@ fn handle_version_install_or_update(state: &State, choice: MainMenuChoice) -> Re None }; - // `uv sync` sometimes does not pull in Python automatically - // This might be system/platform specific and/or a uv bug. - let mut command = Command::new(&state.uv_path); - command - .current_dir(&state.uv_install_root) - .env("UV_CACHE_DIR", &state.uv_cache_dir) - .env("UV_PYTHON_INSTALL_DIR", &state.uv_python_install_dir) - .args(["python", "install", "--managed-python"]); - - // Add python version if .python-version file exists - if let Some(version) = &python_version_trimmed { - command.args([version]); + let have_venv = state.venv_folder.exists(); + if cfg!(target_os = "macos") && !have_developer_tools() && !have_venv { + println!("If you see a pop-up about 'install_name_tool', you can cancel it, and ignore the warning below.\n"); } - command.ensure_success().context("Python install failed")?; - - // Sync the venv + // Prepare to sync the venv let mut command = Command::new(&state.uv_path); + command.current_dir(&state.uv_install_root); + + // remove UV_* environment variables to avoid interference + for (key, _) in std::env::vars() { + if key.starts_with("UV_") || key == "VIRTUAL_ENV" { + command.env_remove(key); + } + } + + // remove CONDA_PREFIX/bin from PATH to avoid conda interference + #[cfg(target_os = "macos")] + if let Ok(conda_prefix) = std::env::var("CONDA_PREFIX") { + if let Ok(current_path) = std::env::var("PATH") { + let conda_bin = format!("{conda_prefix}/bin"); + let filtered_paths: Vec<&str> = current_path + .split(':') + .filter(|&path| path != conda_bin) + .collect(); + let new_path = filtered_paths.join(":"); + command.env("PATH", new_path); + } + } + command - .current_dir(&state.uv_install_root) .env("UV_CACHE_DIR", &state.uv_cache_dir) .env("UV_PYTHON_INSTALL_DIR", &state.uv_python_install_dir) - .args(["sync", "--upgrade", "--managed-python"]); + .env( + "UV_HTTP_TIMEOUT", + std::env::var("UV_HTTP_TIMEOUT").unwrap_or_else(|_| "180".to_string()), + ) + .args(["sync", "--upgrade", "--managed-python", "--no-config"]); // Add python version if .python-version file exists if let Some(version) = &python_version_trimmed { @@ -292,7 +313,7 @@ fn handle_version_install_or_update(state: &State, choice: MainMenuChoice) -> Re Ok(_) => { // Sync succeeded if matches!(&choice, MainMenuChoice::Version(VersionKind::PyOxidizer(_))) { - inject_helper_addon(&state.uv_install_root)?; + inject_helper_addon()?; } // Now that sync succeeded, save the previous version @@ -321,9 +342,11 @@ fn main_menu_loop(state: &State) -> Result<()> { let menu_choice = get_main_menu_choice(state)?; match menu_choice { - MainMenuChoice::Quit => std::process::exit(0), MainMenuChoice::KeepExisting => { - // Skip sync, just launch existing installation + if state.pyproject_modified_by_user { + // User has custom edits, sync them + handle_version_install_or_update(state, MainMenuChoice::KeepExisting)?; + } break; } MainMenuChoice::ToggleBetas => { @@ -354,6 +377,11 @@ fn main_menu_loop(state: &State) -> Result<()> { println!(); continue; } + MainMenuChoice::DownloadMirror => { + show_mirror_submenu(state)?; + println!(); + continue; + } MainMenuChoice::Uninstall => { if handle_uninstall(state)? { std::process::exit(0); @@ -361,9 +389,7 @@ fn main_menu_loop(state: &State) -> Result<()> { continue; } choice @ (MainMenuChoice::Latest | MainMenuChoice::Version(_)) => { - if handle_version_install_or_update(state, choice.clone()).is_err() { - continue; - } + handle_version_install_or_update(state, choice.clone())?; break; } } @@ -371,23 +397,37 @@ fn main_menu_loop(state: &State) -> Result<()> { Ok(()) } -fn write_sync_marker(sync_complete_marker: &std::path::Path) -> Result<()> { +fn write_sync_marker(state: &State) -> Result<()> { let timestamp = SystemTime::now() .duration_since(UNIX_EPOCH) .context("Failed to get system time")? .as_secs(); - write_file(sync_complete_marker, timestamp.to_string())?; + write_file(&state.sync_complete_marker, timestamp.to_string())?; Ok(()) } +/// Get mtime of provided file, or 0 if unavailable +fn file_timestamp_secs(path: &std::path::Path) -> i64 { + modified_time(path) + .map(|t| t.duration_since(UNIX_EPOCH).unwrap_or_default().as_secs() as i64) + .unwrap_or_default() +} + fn get_main_menu_choice(state: &State) -> Result { loop { println!("1) Latest Anki (press Enter)"); println!("2) Choose a version"); + if let Some(current_version) = &state.current_version { let normalized_current = normalize_version(current_version); - println!("3) Keep existing version ({normalized_current})"); + + if state.pyproject_modified_by_user { + println!("3) Sync project changes"); + } else { + println!("3) Keep existing version ({normalized_current})"); + } } + if let Some(prev_version) = &state.previous_version { if state.current_version.as_ref() != Some(prev_version) { let normalized_prev = normalize_version(prev_version); @@ -406,9 +446,13 @@ fn get_main_menu_choice(state: &State) -> Result { "6) Cache downloads: {}", if cache_enabled { "on" } else { "off" } ); + let mirror_enabled = is_mirror_enabled(state); + println!( + "7) Download mirror: {}", + if mirror_enabled { "on" } else { "off" } + ); println!(); - println!("7) Uninstall"); - println!("8) Quit"); + println!("8) Uninstall"); print!("> "); let _ = stdout().flush(); @@ -447,8 +491,8 @@ fn get_main_menu_choice(state: &State) -> Result { } "5" => MainMenuChoice::ToggleBetas, "6" => MainMenuChoice::ToggleCache, - "7" => MainMenuChoice::Uninstall, - "8" => MainMenuChoice::Quit, + "7" => MainMenuChoice::DownloadMirror, + "8" => MainMenuChoice::Uninstall, _ => { println!("Invalid input. Please try again."); continue; @@ -458,8 +502,6 @@ fn get_main_menu_choice(state: &State) -> Result { } fn get_version_kind(state: &State) -> Result> { - println!("Please wait..."); - let releases = get_releases(state)?; let releases_str = releases .latest @@ -618,15 +660,32 @@ fn fetch_versions(state: &State) -> Result> { let mut cmd = Command::new(&state.uv_path); cmd.current_dir(&state.uv_install_root) - .args(["run", "--no-project"]) - .arg(&versions_script); + .args(["run", "--no-project", "--no-config", "--managed-python"]) + .args(["--with", "pip-system-certs,requests[socks]"]); - let output = cmd.utf8_output()?; + let python_version = read_file(&state.dist_python_version_path)?; + let python_version_str = + String::from_utf8(python_version).context("Invalid UTF-8 in .python-version")?; + let version_trimmed = python_version_str.trim(); + if !version_trimmed.is_empty() { + cmd.args(["--python", version_trimmed]); + } + + cmd.arg(&versions_script); + + let output = match cmd.utf8_output() { + Ok(output) => output, + Err(e) => { + print!("Unable to check for Anki versions. Please check your internet connection.\n\n"); + return Err(e.into()); + } + }; let versions = serde_json::from_str(&output.stdout).context("Failed to parse versions JSON")?; Ok(versions) } fn get_releases(state: &State) -> Result { + println!("Checking for updates..."); let include_prereleases = state.prerelease_marker.exists(); let all_versions = fetch_versions(state)?; let all_versions = filter_and_normalize_versions(all_versions, include_prereleases); @@ -666,7 +725,15 @@ fn apply_version_kind(version_kind: &VersionKind, state: &State) -> Result<()> { &format!("anki-release=={version}\",\n \"anki=={version}\",\n \"aqt=={version}"), ), }; - write_file(&state.user_pyproject_path, &updated_content)?; + + // Add mirror configuration if enabled + let final_content = if let Some((python_mirror, pypi_mirror)) = get_mirror_urls(state)? { + format!("{updated_content}\n\n[[tool.uv.index]]\nname = \"mirror\"\nurl = \"{pypi_mirror}\"\ndefault = true\n\n[tool.uv]\npython-install-mirror = \"{python_mirror}\"\n") + } else { + updated_content + }; + + write_file(&state.user_pyproject_path, &final_content)?; // Update .python-version based on version kind match version_kind { @@ -700,15 +767,15 @@ fn update_pyproject_for_version(menu_choice: MainMenuChoice, state: &State) -> R MainMenuChoice::ToggleCache => { unreachable!(); } + MainMenuChoice::DownloadMirror => { + unreachable!(); + } MainMenuChoice::Uninstall => { unreachable!(); } MainMenuChoice::Version(version_kind) => { apply_version_kind(&version_kind, state)?; } - MainMenuChoice::Quit => { - std::process::exit(0); - } } Ok(()) } @@ -756,7 +823,7 @@ fn parse_version_kind(version: &str) -> Option { } } -fn inject_helper_addon(_uv_install_root: &std::path::Path) -> Result<()> { +fn inject_helper_addon() -> Result<()> { let addons21_path = get_anki_addons21_path()?; if !addons21_path.exists() { @@ -858,16 +925,24 @@ fn handle_uninstall(state: &State) -> Result { Ok(true) } +fn have_developer_tools() -> bool { + Command::new("xcode-select") + .args(["-p"]) + .output() + .map(|output| output.status.success()) + .unwrap_or(false) +} + fn build_python_command(state: &State, args: &[String]) -> Result { let python_exe = if cfg!(target_os = "windows") { let show_console = std::env::var("ANKI_CONSOLE").is_ok(); if show_console { - state.uv_install_root.join(".venv/Scripts/python.exe") + state.venv_folder.join("Scripts/python.exe") } else { - state.uv_install_root.join(".venv/Scripts/pythonw.exe") + state.venv_folder.join("Scripts/pythonw.exe") } } else { - state.uv_install_root.join(".venv/bin/python") + state.venv_folder.join("bin/python") }; let mut cmd = Command::new(&python_exe); @@ -884,6 +959,70 @@ fn build_python_command(state: &State, args: &[String]) -> Result { Ok(cmd) } +fn is_mirror_enabled(state: &State) -> bool { + state.mirror_path.exists() +} + +fn get_mirror_urls(state: &State) -> Result> { + if !state.mirror_path.exists() { + return Ok(None); + } + + let content = read_file(&state.mirror_path)?; + let content_str = String::from_utf8(content).context("Invalid UTF-8 in mirror file")?; + + let lines: Vec<&str> = content_str.lines().collect(); + if lines.len() >= 2 { + Ok(Some(( + lines[0].trim().to_string(), + lines[1].trim().to_string(), + ))) + } else { + Ok(None) + } +} + +fn show_mirror_submenu(state: &State) -> Result<()> { + loop { + println!("Download mirror options:"); + println!("1) No mirror"); + println!("2) China"); + print!("> "); + let _ = stdout().flush(); + + let mut input = String::new(); + let _ = stdin().read_line(&mut input); + let input = input.trim(); + + match input { + "1" => { + // Remove mirror file + if state.mirror_path.exists() { + let _ = remove_file(&state.mirror_path); + } + println!("Mirror disabled."); + break; + } + "2" => { + // Write China mirror URLs + let china_mirrors = "https://registry.npmmirror.com/-/binary/python-build-standalone/\nhttps://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/"; + write_file(&state.mirror_path, china_mirrors)?; + println!("China mirror enabled."); + break; + } + "" => { + // Empty input - return to main menu + break; + } + _ => { + println!("Invalid input. Please try again."); + continue; + } + } + } + Ok(()) +} + #[cfg(test)] mod tests { use super::*; diff --git a/qt/launcher/src/platform/mod.rs b/qt/launcher/src/platform/mod.rs index 50a303656..6a582f1aa 100644 --- a/qt/launcher/src/platform/mod.rs +++ b/qt/launcher/src/platform/mod.rs @@ -116,8 +116,9 @@ pub use windows::ensure_terminal_shown; pub fn ensure_terminal_shown() -> Result<()> { use std::io::IsTerminal; + let want_terminal = std::env::var("ANKI_LAUNCHER_WANT_TERMINAL").is_ok(); let stdout_is_terminal = IsTerminal::is_terminal(&std::io::stdout()); - if !stdout_is_terminal { + if want_terminal || !stdout_is_terminal { #[cfg(target_os = "macos")] mac::relaunch_in_terminal()?; #[cfg(not(target_os = "macos"))] diff --git a/qt/launcher/src/platform/windows.rs b/qt/launcher/src/platform/windows.rs index 3c060a9de..ebdff6261 100644 --- a/qt/launcher/src/platform/windows.rs +++ b/qt/launcher/src/platform/windows.rs @@ -8,6 +8,7 @@ use anyhow::Context; use anyhow::Result; use widestring::u16cstr; use windows::core::PCWSTR; +use windows::Wdk::System::SystemServices::RtlGetVersion; use windows::Win32::System::Console::AttachConsole; use windows::Win32::System::Console::GetConsoleWindow; use windows::Win32::System::Console::ATTACH_PARENT_PROCESS; @@ -18,8 +19,25 @@ use windows::Win32::System::Registry::HKEY; use windows::Win32::System::Registry::HKEY_CURRENT_USER; use windows::Win32::System::Registry::KEY_READ; use windows::Win32::System::Registry::REG_SZ; +use windows::Win32::System::SystemInformation::OSVERSIONINFOW; use windows::Win32::UI::Shell::SetCurrentProcessExplicitAppUserModelID; +/// Returns true if running on Windows 10 (not Windows 11) +fn is_windows_10() -> bool { + unsafe { + let mut info = OSVERSIONINFOW { + dwOSVersionInfoSize: std::mem::size_of::() as u32, + ..Default::default() + }; + if RtlGetVersion(&mut info).is_ok() { + // Windows 10 has build numbers < 22000, Windows 11 >= 22000 + info.dwBuildNumber < 22000 && info.dwMajorVersion == 10 + } else { + false + } + } +} + pub fn ensure_terminal_shown() -> Result<()> { unsafe { if !GetConsoleWindow().is_invalid() { @@ -29,6 +47,14 @@ pub fn ensure_terminal_shown() -> Result<()> { } if std::env::var("ANKI_IMPLICIT_CONSOLE").is_ok() && attach_to_parent_console() { + // This black magic triggers Windows to switch to the new + // ANSI-supporting console host, which is usually only available + // when the app is built with the console subsystem. + // Only needed on Windows 10, not Windows 11. + if is_windows_10() { + let _ = Command::new("cmd").args(["/C", ""]).status(); + } + // Successfully attached to parent console reconnect_stdio_to_console(); return Ok(()); diff --git a/qt/launcher/versions.py b/qt/launcher/versions.py index 02e16ba69..0fdf69c84 100644 --- a/qt/launcher/versions.py +++ b/qt/launcher/versions.py @@ -3,7 +3,11 @@ import json import sys -import urllib.request + +import pip_system_certs.wrapt_requests +import requests + +pip_system_certs.wrapt_requests.inject_truststore() def main(): @@ -11,25 +15,26 @@ def main(): url = "https://pypi.org/pypi/aqt/json" try: - with urllib.request.urlopen(url, timeout=30) as response: - data = json.loads(response.read().decode("utf-8")) - releases = data.get("releases", {}) + response = requests.get(url, timeout=30) + response.raise_for_status() + data = response.json() + releases = data.get("releases", {}) - # Create list of (version, upload_time) tuples - version_times = [] - for version, files in releases.items(): - if files: # Only include versions that have files - # Use the upload time of the first file for each version - upload_time = files[0].get("upload_time_iso_8601") - if upload_time: - version_times.append((version, upload_time)) + # Create list of (version, upload_time) tuples + version_times = [] + for version, files in releases.items(): + if files: # Only include versions that have files + # Use the upload time of the first file for each version + upload_time = files[0].get("upload_time_iso_8601") + if upload_time: + version_times.append((version, upload_time)) - # Sort by upload time - version_times.sort(key=lambda x: x[1]) + # Sort by upload time + version_times.sort(key=lambda x: x[1]) - # Extract just the version names - versions = [version for version, _ in version_times] - print(json.dumps(versions)) + # Extract just the version names + versions = [version for version, _ in version_times] + print(json.dumps(versions)) except Exception as e: print(f"Error fetching versions: {e}", file=sys.stderr) sys.exit(1) diff --git a/qt/launcher/win/anki.template.nsi b/qt/launcher/win/anki.template.nsi index 84dedf9c8..36b32a893 100644 --- a/qt/launcher/win/anki.template.nsi +++ b/qt/launcher/win/anki.template.nsi @@ -24,7 +24,7 @@ Name "Anki" Unicode true ; The file to write (relative to nsis directory) -OutFile "..\launcher_exe\anki-install.exe" +OutFile "..\launcher_exe\anki-launcher-ANKI_VERSION-windows.exe" ; Non elevated RequestExecutionLevel user @@ -214,7 +214,7 @@ Section "" ; Write the uninstall keys for Windows WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "DisplayName" "Anki Launcher" - WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "DisplayVersion" "1.0.0" + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "DisplayVersion" "ANKI_VERSION" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "QuietUninstallString" '"$INSTDIR\uninstall.exe" /S' WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Anki" "NoModify" 1 diff --git a/qt/mac/anki_mac_helper/__init__.py b/qt/mac/anki_mac_helper/__init__.py index a0adb469e..88dfedc8d 100644 --- a/qt/mac/anki_mac_helper/__init__.py +++ b/qt/mac/anki_mac_helper/__init__.py @@ -33,6 +33,12 @@ class _MacOSHelper: "On completion, file should be saved if no error has arrived." self._dll.end_wav_record() + def disable_appnap(self) -> None: + self._dll.disable_appnap() + + def enable_appnap(self) -> None: + self._dll.enable_appnap() + # this must not be overwritten or deallocated @CFUNCTYPE(None, c_char_p) # type: ignore diff --git a/qt/mac/appnap.swift b/qt/mac/appnap.swift new file mode 100644 index 000000000..1e6db3d17 --- /dev/null +++ b/qt/mac/appnap.swift @@ -0,0 +1,25 @@ +// Copyright: Ankitects Pty Ltd and contributors +// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + +import Foundation + +private var currentActivity: NSObjectProtocol? + +@_cdecl("disable_appnap") +public func disableAppNap() { + // No-op if already assigned + guard currentActivity == nil else { return } + + currentActivity = ProcessInfo.processInfo.beginActivity( + options: .userInitiatedAllowingIdleSystemSleep, + reason: "AppNap is disabled" + ) +} + +@_cdecl("enable_appnap") +public func enableAppNap() { + guard let activity = currentActivity else { return } + + ProcessInfo.processInfo.endActivity(activity) + currentActivity = nil +} \ No newline at end of file diff --git a/qt/mac/build.sh b/qt/mac/build.sh index 4c14a13f4..06a34ad36 100755 --- a/qt/mac/build.sh +++ b/qt/mac/build.sh @@ -15,6 +15,7 @@ echo "Building macOS helper dylib..." # Create the wheel using uv echo "Creating wheel..." cd "$SCRIPT_DIR" +rm -rf dist "$PROJ_ROOT/out/extracted/uv/uv" build --wheel echo "Build complete!" diff --git a/qt/mac/helper_build.py b/qt/mac/helper_build.py index aaf997669..cfdffeb89 100644 --- a/qt/mac/helper_build.py +++ b/qt/mac/helper_build.py @@ -1,8 +1,6 @@ # Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html -import os -import platform import subprocess import sys from pathlib import Path diff --git a/qt/mac/pyproject.toml b/qt/mac/pyproject.toml index 93f4e939b..ec78845d6 100644 --- a/qt/mac/pyproject.toml +++ b/qt/mac/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "anki-mac-helper" -version = "0.1.0" +version = "0.1.1" description = "Small support library for Anki on Macs" requires-python = ">=3.9" license = { text = "AGPL-3.0-or-later" } diff --git a/qt/mac/update-launcher-env b/qt/mac/update-launcher-env new file mode 100755 index 000000000..3150d1740 --- /dev/null +++ b/qt/mac/update-launcher-env @@ -0,0 +1,14 @@ +#!/bin/bash +# +# Build and install into the launcher venv + +set -e + +./build.sh +if [[ "$OSTYPE" == "darwin"* ]]; then + export VIRTUAL_ENV=$HOME/Library/Application\ Support/AnkiProgramFiles/.venv +else + export VIRTUAL_ENV=$HOME/.local/share/AnkiProgramFiles/.venv +fi +../../out/extracted/uv/uv pip install dist/*.whl + diff --git a/qt/pyproject.toml b/qt/pyproject.toml index 6a686dde8..35ecaa200 100644 --- a/qt/pyproject.toml +++ b/qt/pyproject.toml @@ -12,7 +12,7 @@ dependencies = [ "send2trash", "waitress>=2.0.0", "pywin32; sys.platform == 'win32'", - "anki-mac-helper; sys.platform == 'darwin'", + "anki-mac-helper>=0.1.1; sys.platform == 'darwin'", "pip-system-certs!=5.1", "pyqt6>=6.2", "pyqt6-webengine>=6.2", @@ -40,8 +40,8 @@ qt67 = [ qt = [ "pyqt6==6.9.1", "pyqt6-qt6==6.9.1", - "pyqt6-webengine==6.9.0", - "pyqt6-webengine-qt6==6.9.1", + "pyqt6-webengine==6.8.0", + "pyqt6-webengine-qt6==6.8.2", "pyqt6_sip==13.10.2", ] qt68 = [ diff --git a/rslib/Cargo.toml b/rslib/Cargo.toml index a1d24cc87..9be9e8d87 100644 --- a/rslib/Cargo.toml +++ b/rslib/Cargo.toml @@ -81,6 +81,7 @@ pin-project.workspace = true prost.workspace = true pulldown-cmark.workspace = true rand.workspace = true +rayon.workspace = true regex.workspace = true reqwest.workspace = true rusqlite.workspace = true diff --git a/rslib/process/src/lib.rs b/rslib/process/src/lib.rs index dcf0703f6..2a82bb9cc 100644 --- a/rslib/process/src/lib.rs +++ b/rslib/process/src/lib.rs @@ -11,6 +11,24 @@ use snafu::ensure; use snafu::ResultExt; use snafu::Snafu; +#[derive(Debug)] +pub struct CodeDisplay(Option); + +impl std::fmt::Display for CodeDisplay { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self.0 { + Some(code) => write!(f, "{code}"), + None => write!(f, "?"), + } + } +} + +impl From> for CodeDisplay { + fn from(code: Option) -> Self { + CodeDisplay(code) + } +} + #[derive(Debug, Snafu)] pub enum Error { #[snafu(display("Failed to execute: {cmdline}"))] @@ -18,8 +36,15 @@ pub enum Error { cmdline: String, source: std::io::Error, }, - #[snafu(display("Failed with code {code:?}: {cmdline}"))] - ReturnedError { cmdline: String, code: Option }, + #[snafu(display("Failed to run ({code}): {cmdline}"))] + ReturnedError { cmdline: String, code: CodeDisplay }, + #[snafu(display("Failed to run ({code}): {cmdline}: {stdout}{stderr}"))] + ReturnedWithOutputError { + cmdline: String, + code: CodeDisplay, + stdout: String, + stderr: String, + }, #[snafu(display("Couldn't decode stdout/stderr as utf8"))] InvalidUtf8 { cmdline: String, @@ -71,31 +96,36 @@ impl CommandExt for Command { status.success(), ReturnedSnafu { cmdline: get_cmdline(self), - code: status.code(), + code: CodeDisplay::from(status.code()), } ); Ok(self) } fn utf8_output(&mut self) -> Result { + let cmdline = get_cmdline(self); let output = self.output().with_context(|_| DidNotExecuteSnafu { - cmdline: get_cmdline(self), + cmdline: cmdline.clone(), })?; + + let stdout = String::from_utf8(output.stdout).with_context(|_| InvalidUtf8Snafu { + cmdline: cmdline.clone(), + })?; + let stderr = String::from_utf8(output.stderr).with_context(|_| InvalidUtf8Snafu { + cmdline: cmdline.clone(), + })?; + ensure!( output.status.success(), - ReturnedSnafu { - cmdline: get_cmdline(self), - code: output.status.code(), + ReturnedWithOutputSnafu { + cmdline, + code: CodeDisplay::from(output.status.code()), + stdout: stdout.clone(), + stderr: stderr.clone(), } ); - Ok(Utf8Output { - stdout: String::from_utf8(output.stdout).with_context(|_| InvalidUtf8Snafu { - cmdline: get_cmdline(self), - })?, - stderr: String::from_utf8(output.stderr).with_context(|_| InvalidUtf8Snafu { - cmdline: get_cmdline(self), - })?, - }) + + Ok(Utf8Output { stdout, stderr }) } fn ensure_spawn(&mut self) -> Result { @@ -135,7 +165,10 @@ mod test { #[cfg(not(windows))] assert!(matches!( Command::new("false").ensure_success(), - Err(Error::ReturnedError { code: Some(1), .. }) + Err(Error::ReturnedError { + code: CodeDisplay(_), + .. + }) )); } } diff --git a/rslib/src/browser_table.rs b/rslib/src/browser_table.rs index c297f2bac..4d943e408 100644 --- a/rslib/src/browser_table.rs +++ b/rslib/src/browser_table.rs @@ -105,7 +105,8 @@ impl Card { /// Returns true if the card has a due date in terms of days. fn is_due_in_days(&self) -> bool { - matches!(self.queue, CardQueue::DayLearn | CardQueue::Review) + self.ctype != CardType::New && self.original_or_current_due() <= 365_000 // keep consistent with SQL + || matches!(self.queue, CardQueue::DayLearn | CardQueue::Review) || (self.ctype == CardType::Review && self.is_undue_queue()) } @@ -125,22 +126,20 @@ impl Card { } } - /// This uses card.due and card.ivl to infer the elapsed time. If 'set due - /// date' or an add-on has changed the due date, this won't be accurate. - pub(crate) fn days_since_last_review(&self, timing: &SchedTimingToday) -> Option { + /// If last_review_date isn't stored in the card, this uses card.due and + /// card.ivl to infer the elapsed time, which won't be accurate if + /// 'set due date' or an add-on has changed the due date. + pub(crate) fn seconds_since_last_review(&self, timing: &SchedTimingToday) -> Option { if let Some(last_review_time) = self.last_review_time { - Some(timing.next_day_at.elapsed_days_since(last_review_time) as u32) - } else if !self.is_due_in_days() { - Some( - (timing.next_day_at.0 as u32).saturating_sub(self.original_or_current_due() as u32) - / 86_400, - ) - } else { + Some(timing.now.elapsed_secs_since(last_review_time) as u32) + } else if self.is_due_in_days() { self.due_time(timing).map(|due| { (due.adding_secs(-86_400 * self.interval as i64) - .elapsed_secs() - / 86_400) as u32 + .elapsed_secs()) as u32 }) + } else { + let last_review_time = TimestampSecs(self.original_or_current_due() as i64); + Some(timing.now.elapsed_secs_since(last_review_time) as u32) } } } @@ -543,12 +542,12 @@ impl RowContext { self.cards[0] .memory_state .as_ref() - .zip(self.cards[0].days_since_last_review(&self.timing)) + .zip(self.cards[0].seconds_since_last_review(&self.timing)) .zip(Some(self.cards[0].decay.unwrap_or(FSRS5_DEFAULT_DECAY))) - .map(|((state, days_elapsed), decay)| { - let r = FSRS::new(None).unwrap().current_retrievability( + .map(|((state, seconds), decay)| { + let r = FSRS::new(None).unwrap().current_retrievability_seconds( (*state).into(), - days_elapsed, + seconds, decay, ); format!("{:.0}%", r * 100.) diff --git a/rslib/src/dbcheck.rs b/rslib/src/dbcheck.rs index f58a2184a..42b9977be 100644 --- a/rslib/src/dbcheck.rs +++ b/rslib/src/dbcheck.rs @@ -24,6 +24,7 @@ use crate::notetype::NotetypeId; use crate::notetype::NotetypeKind; use crate::prelude::*; use crate::progress::ThrottlingProgressHandler; +use crate::storage::card::CardFixStats; use crate::timestamp::TimestampMillis; use crate::timestamp::TimestampSecs; @@ -40,6 +41,7 @@ pub struct CheckDatabaseOutput { notetypes_recovered: usize, invalid_utf8: usize, invalid_ids: usize, + card_last_review_time_empty: usize, } #[derive(Debug, Clone, Copy, Default)] @@ -69,6 +71,11 @@ impl CheckDatabaseOutput { if self.card_properties_invalid > 0 { probs.push(tr.database_check_card_properties(self.card_properties_invalid)); } + if self.card_last_review_time_empty > 0 { + probs.push( + tr.database_check_card_last_review_time_empty(self.card_last_review_time_empty), + ); + } if self.cards_missing_note > 0 { probs.push(tr.database_check_card_missing_note(self.cards_missing_note)); } @@ -158,14 +165,25 @@ impl Collection { fn check_card_properties(&mut self, out: &mut CheckDatabaseOutput) -> Result<()> { let timing = self.timing_today()?; - let (new_cnt, other_cnt) = self.storage.fix_card_properties( + let CardFixStats { + new_cards_fixed, + other_cards_fixed, + last_review_time_fixed, + } = self.storage.fix_card_properties( timing.days_elapsed, TimestampSecs::now(), self.usn()?, self.scheduler_version() == SchedulerVersion::V1, )?; - out.card_position_too_high = new_cnt; - out.card_properties_invalid += other_cnt; + out.card_position_too_high = new_cards_fixed; + out.card_properties_invalid += other_cards_fixed; + out.card_last_review_time_empty = last_review_time_fixed; + + // Trigger one-way sync if last_review_time was updated to avoid conflicts + if last_review_time_fixed > 0 { + self.set_schema_modified()?; + } + Ok(()) } diff --git a/rslib/src/deckconfig/service.rs b/rslib/src/deckconfig/service.rs index bc6bce8f4..11c4288d3 100644 --- a/rslib/src/deckconfig/service.rs +++ b/rslib/src/deckconfig/service.rs @@ -1,6 +1,10 @@ // Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +use std::collections::HashMap; + use anki_proto::generic; +use rayon::iter::IntoParallelIterator; +use rayon::iter::ParallelIterator; use crate::collection::Collection; use crate::deckconfig::DeckConfSchema11; @@ -9,6 +13,7 @@ use crate::deckconfig::DeckConfigId; use crate::deckconfig::UpdateDeckConfigsRequest; use crate::error::Result; use crate::scheduler::fsrs::params::ignore_revlogs_before_date_to_ms; +use crate::scheduler::fsrs::simulator::is_included_card; impl crate::services::DeckConfigService for Collection { fn add_or_update_deck_config_legacy( @@ -101,68 +106,41 @@ impl crate::services::DeckConfigService for Collection { &mut self, input: anki_proto::deck_config::GetRetentionWorkloadRequest, ) -> Result { - const LEARN_SPAN: usize = 100_000_000; - const TERMINATION_PROB: f32 = 0.001; - // the default values are from https://github.com/open-spaced-repetition/Anki-button-usage/blob/881009015c2a85ac911021d76d0aacb124849937/analysis.ipynb - const DEFAULT_LEARN_COST: f32 = 19.4698; - const DEFAULT_PASS_COST: f32 = 7.8454; - const DEFAULT_FAIL_COST: f32 = 23.185; - const DEFAULT_INITIAL_PASS_RATE: f32 = 0.7645; - + let days_elapsed = self.timing_today().unwrap().days_elapsed as i32; let guard = self.search_cards_into_table(&input.search, crate::search::SortMode::NoOrder)?; - let costs = guard.col.storage.get_costs_for_retention()?; - fn smoothing(obs: f32, default: f32, count: u32) -> f32 { - let alpha = count as f32 / (50.0 + count as f32); - obs * alpha + default * (1.0 - alpha) - } + let revlogs = guard + .col + .storage + .get_revlog_entries_for_searched_cards_in_card_order()?; - let cost_success = smoothing( - costs.average_pass_time_ms / 1000.0, - DEFAULT_PASS_COST, - costs.pass_count, - ); - let cost_failure = smoothing( - costs.average_fail_time_ms / 1000.0, - DEFAULT_FAIL_COST, - costs.fail_count, - ); - let cost_learn = smoothing( - costs.average_learn_time_ms / 1000.0, - DEFAULT_LEARN_COST, - costs.learn_count, - ); - let initial_pass_rate = smoothing( - costs.initial_pass_rate, - DEFAULT_INITIAL_PASS_RATE, - costs.pass_count, - ); + let config = guard.col.get_optimal_retention_parameters(revlogs)?; + let cards = guard + .col + .storage + .all_searched_cards()? + .into_iter() + .filter(is_included_card) + .filter_map(|c| crate::card::Card::convert(c.clone(), days_elapsed, c.memory_state?)) + .collect::>(); - let before = fsrs::expected_workload( - &input.w, - input.before, - LEARN_SPAN, - cost_success, - cost_failure, - cost_learn, - initial_pass_rate, - TERMINATION_PROB, - )?; - let after = fsrs::expected_workload( - &input.w, - input.after, - LEARN_SPAN, - cost_success, - cost_failure, - cost_learn, - initial_pass_rate, - TERMINATION_PROB, - )?; + let costs = (70u32..=99u32) + .into_par_iter() + .map(|dr| { + Ok(( + dr, + fsrs::expected_workload_with_existing_cards( + &input.w, + dr as f32 / 100., + &config, + &cards, + )?, + )) + }) + .collect::>>()?; - Ok(anki_proto::deck_config::GetRetentionWorkloadResponse { - factor: after / before, - }) + Ok(anki_proto::deck_config::GetRetentionWorkloadResponse { costs }) } } diff --git a/rslib/src/deckconfig/update.rs b/rslib/src/deckconfig/update.rs index 9eb3b595f..0bd549a20 100644 --- a/rslib/src/deckconfig/update.rs +++ b/rslib/src/deckconfig/update.rs @@ -212,10 +212,13 @@ impl Collection { if fsrs_toggled { self.set_config_bool_inner(BoolKey::Fsrs, req.fsrs)?; } + let mut deck_desired_retention: HashMap = Default::default(); for deck in self.storage.get_all_decks()? { if let Ok(normal) = deck.normal() { let deck_id = deck.id; - + if let Some(desired_retention) = normal.desired_retention { + deck_desired_retention.insert(deck_id, desired_retention); + } // previous order & params let previous_config_id = DeckConfigId(normal.config_id); let previous_config = configs_before_update.get(&previous_config_id); @@ -277,10 +280,11 @@ impl Collection { if req.fsrs { Some(UpdateMemoryStateRequest { params: c.fsrs_params().clone(), - desired_retention: c.inner.desired_retention, + preset_desired_retention: c.inner.desired_retention, max_interval: c.inner.maximum_review_interval, reschedule: req.fsrs_reschedule, historical_retention: c.inner.historical_retention, + deck_desired_retention: deck_desired_retention.clone(), }) } else { None @@ -409,6 +413,7 @@ fn normal_deck_to_limits(deck: &NormalDeck, today: u32) -> Limits { .new_limit_today .map(|limit| limit.today == today) .unwrap_or_default(), + desired_retention: deck.desired_retention, } } @@ -417,6 +422,7 @@ fn update_deck_limits(deck: &mut NormalDeck, limits: &Limits, today: u32) { deck.new_limit = limits.new; update_day_limit(&mut deck.review_limit_today, limits.review_today, today); update_day_limit(&mut deck.new_limit_today, limits.new_today, today); + deck.desired_retention = limits.desired_retention; } fn update_day_limit(day_limit: &mut Option, new_limit: Option, today: u32) { diff --git a/rslib/src/decks/mod.rs b/rslib/src/decks/mod.rs index d16ebac49..44b5d9e59 100644 --- a/rslib/src/decks/mod.rs +++ b/rslib/src/decks/mod.rs @@ -31,6 +31,7 @@ pub(crate) use name::immediate_parent_name; pub use name::NativeDeckName; pub use schema11::DeckSchema11; +use crate::deckconfig::DeckConfig; use crate::define_newtype; use crate::error::FilteredDeckError; use crate::markdown::render_markdown; @@ -89,6 +90,16 @@ impl Deck { } } + /// Get the effective desired retention value for a deck. + /// Returns deck-specific desired retention if available, otherwise falls + /// back to config default. + pub fn effective_desired_retention(&self, config: &DeckConfig) -> f32 { + self.normal() + .ok() + .and_then(|d| d.desired_retention) + .unwrap_or(config.inner.desired_retention) + } + // used by tests at the moment #[allow(dead_code)] diff --git a/rslib/src/decks/schema11.rs b/rslib/src/decks/schema11.rs index e10820ca1..5cd4094f0 100644 --- a/rslib/src/decks/schema11.rs +++ b/rslib/src/decks/schema11.rs @@ -325,6 +325,7 @@ impl From for NormalDeck { new_limit: deck.new_limit, review_limit_today: deck.review_limit_today, new_limit_today: deck.new_limit_today, + desired_retention: None, } } } diff --git a/rslib/src/revlog/mod.rs b/rslib/src/revlog/mod.rs index ad7f30261..f52698388 100644 --- a/rslib/src/revlog/mod.rs +++ b/rslib/src/revlog/mod.rs @@ -84,6 +84,42 @@ impl RevlogEntry { }) .unwrap() } + + /// Returns true if this entry represents a reset operation. + /// These entries are created when a card is reset using + /// [`Collection::reschedule_cards_as_new`]. + /// The 0 value of `ease_factor` differentiates it + /// from entry created by [`Collection::set_due_date`] that has + /// `RevlogReviewKind::Manual` but non-zero `ease_factor`. + pub(crate) fn is_reset(&self) -> bool { + self.review_kind == RevlogReviewKind::Manual && self.ease_factor == 0 + } + + /// Returns true if this entry represents a cramming operation. + /// These entries are created when a card is reviewed in a + /// filtered deck with "Reschedule cards based on my answers + /// in this deck" disabled. + /// [`crate::scheduler::answering::CardStateUpdater::apply_preview_state`]. + /// The 0 value of `ease_factor` distinguishes it from the entry + /// created when a card is reviewed before its due date in a + /// filtered deck with reschedule enabled or using Grade Now. + pub(crate) fn is_cramming(&self) -> bool { + self.review_kind == RevlogReviewKind::Filtered && self.ease_factor == 0 + } + + pub(crate) fn has_rating(&self) -> bool { + self.button_chosen > 0 + } + + /// Returns true if the review entry is not manually rescheduled and not + /// cramming. Used to filter out entries that shouldn't be considered + /// for statistics and scheduling. + pub(crate) fn has_rating_and_affects_scheduling(&self) -> bool { + // not rescheduled/set due date/reset + self.has_rating() + // not cramming + && !self.is_cramming() + } } impl Collection { diff --git a/rslib/src/scheduler/answering/mod.rs b/rslib/src/scheduler/answering/mod.rs index bfe0eafaf..6ff8c6e2d 100644 --- a/rslib/src/scheduler/answering/mod.rs +++ b/rslib/src/scheduler/answering/mod.rs @@ -444,6 +444,8 @@ impl Collection { .get_deck(card.deck_id)? .or_not_found(card.deck_id)?; let config = self.home_deck_config(deck.config_id(), card.original_deck_id)?; + + let desired_retention = deck.effective_desired_retention(&config); let fsrs_enabled = self.get_config_bool(BoolKey::Fsrs); let fsrs_next_states = if fsrs_enabled { let params = config.fsrs_params(); @@ -473,13 +475,13 @@ impl Collection { }; Some(fsrs.next_states( card.memory_state.map(Into::into), - config.inner.desired_retention, + desired_retention, days_elapsed, )?) } else { None }; - let desired_retention = fsrs_enabled.then_some(config.inner.desired_retention); + let desired_retention = fsrs_enabled.then_some(desired_retention); let fsrs_short_term_with_steps = self.get_config_bool(BoolKey::FsrsShortTermWithStepsEnabled); let fsrs_allow_short_term = if fsrs_enabled { @@ -662,6 +664,43 @@ pub(crate) mod test { col.get_scheduling_states(card_id).unwrap().current } + // Test that deck-specific desired retention is used when available + #[test] + fn deck_specific_desired_retention() -> Result<()> { + let mut col = Collection::new(); + + // Enable FSRS + col.set_config_bool(BoolKey::Fsrs, true, false)?; + + // Create a deck with specific desired retention + let deck_id = DeckId(1); + let deck = col.get_deck(deck_id)?.unwrap(); + let mut deck_clone = (*deck).clone(); + deck_clone.normal_mut().unwrap().desired_retention = Some(0.85); + col.update_deck(&mut deck_clone)?; + + // Create a card in this deck + let nt = col.get_notetype_by_name("Basic")?.unwrap(); + let mut note = nt.new_note(); + col.add_note(&mut note, deck_id)?; + + // Get the card using search_cards + let cards = col.search_cards(note.id, SortMode::NoOrder)?; + let card = col.storage.get_card(cards[0])?.unwrap(); + + // Test that the card state updater uses deck-specific desired retention + let updater = col.card_state_updater(card)?; + + // Print debug information + println!("FSRS enabled: {}", col.get_config_bool(BoolKey::Fsrs)); + println!("Desired retention: {:?}", updater.desired_retention); + + // Verify that the desired retention is from the deck, not the config + assert_eq!(updater.desired_retention, Some(0.85)); + + Ok(()) + } + // make sure the 'current' state for a card matches the // state we applied to it #[test] diff --git a/rslib/src/scheduler/fsrs/memory_state.rs b/rslib/src/scheduler/fsrs/memory_state.rs index 425d8da69..420ead5a3 100644 --- a/rslib/src/scheduler/fsrs/memory_state.rs +++ b/rslib/src/scheduler/fsrs/memory_state.rs @@ -45,10 +45,11 @@ pub(crate) fn get_decay_from_params(params: &[f32]) -> f32 { #[derive(Debug)] pub(crate) struct UpdateMemoryStateRequest { pub params: Params, - pub desired_retention: f32, + pub preset_desired_retention: f32, pub historical_retention: f32, pub max_interval: u32, pub reschedule: bool, + pub deck_desired_retention: HashMap, } pub(crate) struct UpdateMemoryStateEntry { @@ -98,7 +99,6 @@ impl Collection { historical_retention.unwrap_or(0.9), ignore_before, )?; - let desired_retention = req.as_ref().map(|w| w.desired_retention); let mut progress = self.new_progress_handler::(); progress.update(false, |s| s.total_cards = items.len() as u32)?; for (idx, (card_id, item)) in items.into_iter().enumerate() { @@ -106,10 +106,16 @@ impl Collection { let mut card = self.storage.get_card(card_id)?.or_not_found(card_id)?; let original = card.clone(); if let Some(req) = &req { + let preset_desired_retention = req.preset_desired_retention; // Store decay and desired retention in the card so that add-ons, card info, // stats and browser search/sorts don't need to access the deck config. // Unlike memory states, scheduler doesn't use decay and dr stored in the card. - card.desired_retention = desired_retention; + let deck_id = card.original_or_current_deck_id(); + let desired_retention = *req + .deck_desired_retention + .get(&deck_id) + .unwrap_or(&preset_desired_retention); + card.desired_retention = Some(desired_retention); card.decay = decay; if let Some(item) = item { card.set_memory_state(&fsrs, Some(item), historical_retention.unwrap())?; @@ -132,7 +138,7 @@ impl Collection { let original_interval = card.interval; let interval = fsrs.next_interval( Some(state.stability), - desired_retention.unwrap(), + desired_retention, 0, ); card.interval = rescheduler @@ -205,7 +211,11 @@ impl Collection { .storage .get_deck_config(conf_id)? .or_not_found(conf_id)?; - let desired_retention = config.inner.desired_retention; + + // Get deck-specific desired retention if available, otherwise use config + // default + let desired_retention = deck.effective_desired_retention(&config); + let historical_retention = config.inner.historical_retention; let params = config.fsrs_params(); let decay = get_decay_from_params(params); @@ -295,15 +305,15 @@ pub(crate) fn fsrs_items_for_memory_states( .collect() } -struct LastRevlogInfo { +pub(crate) struct LastRevlogInfo { /// Used to determine the actual elapsed time between the last time the user /// reviewed the card and now, so that we can determine an accurate period /// when the card has subsequently been rescheduled to a different day. - last_reviewed_at: Option, + pub(crate) last_reviewed_at: Option, } -/// Return a map of cards to info about last review/reschedule. -fn get_last_revlog_info(revlogs: &[RevlogEntry]) -> HashMap { +/// Return a map of cards to info about last review. +pub(crate) fn get_last_revlog_info(revlogs: &[RevlogEntry]) -> HashMap { let mut out = HashMap::new(); revlogs .iter() @@ -312,8 +322,10 @@ fn get_last_revlog_info(revlogs: &[RevlogEntry]) -> HashMap= 1 { + if e.has_rating_and_affects_scheduling() { last_reviewed_at = Some(e.id.as_secs()); + } else if e.is_reset() { + last_reviewed_at = None; } } out.insert(card_id, LastRevlogInfo { last_reviewed_at }); @@ -377,6 +389,7 @@ pub(crate) fn fsrs_item_for_memory_state( Ok(None) } } else { + // no revlogs (new card or caused by ignore_revlogs_before or deleted revlogs) Ok(None) } } diff --git a/rslib/src/scheduler/fsrs/params.rs b/rslib/src/scheduler/fsrs/params.rs index 63bdebe79..726870fe1 100644 --- a/rslib/src/scheduler/fsrs/params.rs +++ b/rslib/src/scheduler/fsrs/params.rs @@ -394,13 +394,13 @@ pub(crate) fn reviews_for_fsrs( let mut revlogs_complete = false; // Working backwards from the latest review... for (index, entry) in entries.iter().enumerate().rev() { - if entry.review_kind == RevlogReviewKind::Filtered && entry.ease_factor == 0 { + if entry.is_cramming() { continue; } // For incomplete review histories, initial memory state is based on the first // user-graded review after the cutoff date with interval >= 1d. let within_cutoff = entry.id.0 > ignore_revlogs_before.0; - let user_graded = matches!(entry.button_chosen, 1..=4); + let user_graded = entry.has_rating(); let interday = entry.interval >= 1 || entry.interval <= -86400; if user_graded && within_cutoff && interday { first_user_grade_idx = Some(index); @@ -409,10 +409,7 @@ pub(crate) fn reviews_for_fsrs( if user_graded && entry.review_kind == RevlogReviewKind::Learning { first_of_last_learn_entries = Some(index); revlogs_complete = true; - } else if matches!( - (entry.review_kind, entry.ease_factor), - (RevlogReviewKind::Manual, 0) - ) { + } else if entry.is_reset() { // Ignore entries prior to a `Reset` if a learning step has come after, // but consider revlogs complete. if first_of_last_learn_entries.is_some() { @@ -472,16 +469,7 @@ pub(crate) fn reviews_for_fsrs( } // Filter out unwanted entries - entries.retain(|entry| { - !( - // set due date, reset or rescheduled - (entry.review_kind == RevlogReviewKind::Manual || entry.button_chosen == 0) - || // cram - (entry.review_kind == RevlogReviewKind::Filtered && entry.ease_factor == 0) - || // rescheduled - (entry.review_kind == RevlogReviewKind::Rescheduled) - ) - }); + entries.retain(|entry| entry.has_rating_and_affects_scheduling()); // Compute delta_t for each entry let delta_ts = iter::once(0) @@ -560,10 +548,14 @@ pub(crate) mod tests { } pub(crate) fn revlog(review_kind: RevlogReviewKind, days_ago: i64) -> RevlogEntry { + let button_chosen = match review_kind { + RevlogReviewKind::Manual | RevlogReviewKind::Rescheduled => 0, + _ => 3, + }; RevlogEntry { review_kind, id: days_ago_ms(days_ago).into(), - button_chosen: 3, + button_chosen, interval: 1, ..Default::default() } diff --git a/rslib/src/scheduler/fsrs/simulator.rs b/rslib/src/scheduler/fsrs/simulator.rs index 34cc925d6..005f7ca86 100644 --- a/rslib/src/scheduler/fsrs/simulator.rs +++ b/rslib/src/scheduler/fsrs/simulator.rs @@ -1,20 +1,27 @@ // Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +use std::collections::HashMap; use std::sync::Arc; use anki_proto::deck_config::deck_config::config::ReviewCardOrder; use anki_proto::deck_config::deck_config::config::ReviewCardOrder::*; use anki_proto::scheduler::SimulateFsrsReviewRequest; use anki_proto::scheduler::SimulateFsrsReviewResponse; +use anki_proto::scheduler::SimulateFsrsWorkloadResponse; use fsrs::simulate; use fsrs::PostSchedulingFn; use fsrs::ReviewPriorityFn; use fsrs::SimulatorConfig; +use fsrs::FSRS; use itertools::Itertools; use rand::rngs::StdRng; use rand::Rng; +use rayon::iter::IntoParallelIterator; +use rayon::iter::ParallelIterator; use crate::card::CardQueue; +use crate::card::CardType; +use crate::card::FsrsMemoryState; use crate::prelude::*; use crate::scheduler::states::fuzz::constrained_fuzz_bounds; use crate::scheduler::states::load_balancer::calculate_easy_days_modifiers; @@ -114,6 +121,12 @@ fn create_review_priority_fn( } } +pub(crate) fn is_included_card(c: &Card) -> bool { + c.queue != CardQueue::Suspended + && c.queue != CardQueue::PreviewRepeat + && c.ctype != CardType::New +} + impl Collection { pub fn simulate_request_to_config( &mut self, @@ -126,30 +139,42 @@ impl Collection { .get_revlog_entries_for_searched_cards_in_card_order()?; let mut cards = guard.col.storage.all_searched_cards()?; drop(guard); - fn is_included_card(c: &Card) -> bool { - c.queue != CardQueue::Suspended - && c.queue != CardQueue::PreviewRepeat - && c.queue != CardQueue::New - } // calculate any missing memory state for c in &mut cards { if is_included_card(c) && c.memory_state.is_none() { - let original = c.clone(); - let new_state = self.compute_memory_state(c.id)?.state; - c.memory_state = new_state.map(Into::into); - self.update_card_inner(c, original, self.usn()?)?; + let fsrs_data = self.compute_memory_state(c.id)?; + c.memory_state = fsrs_data.state.map(Into::into); + c.desired_retention = Some(fsrs_data.desired_retention); + c.decay = Some(fsrs_data.decay); + self.storage.update_card(c)?; } } let days_elapsed = self.timing_today().unwrap().days_elapsed as i32; let new_cards = cards .iter() - .filter(|c| c.memory_state.is_none() || c.queue == CardQueue::New) + .filter(|c| c.ctype == CardType::New && c.queue != CardQueue::Suspended) .count() + req.deck_size as usize; + let fsrs = FSRS::new(Some(&req.params))?; let mut converted_cards = cards .into_iter() .filter(is_included_card) - .filter_map(|c| Card::convert(c, days_elapsed)) + .filter_map(|c| { + let memory_state = match c.memory_state { + Some(state) => state, + // cards that lack memory states after compute_memory_state have no FSRS items, + // implying a truncated or ignored revlog + None => fsrs + .memory_state_from_sm2( + c.ease_factor(), + c.interval as f32, + req.historical_retention, + ) + .ok()? + .into(), + }; + Card::convert(c, days_elapsed, memory_state) + }) .collect_vec(); let introduced_today_count = self .search_cards(&format!("{} introduced:1", &req.search), SortMode::NoOrder)? @@ -214,8 +239,8 @@ impl Collection { learning_step_transitions: p.learning_step_transitions, relearning_step_transitions: p.relearning_step_transitions, state_rating_costs: p.state_rating_costs, - learning_step_count: p.learning_step_count, - relearning_step_count: p.relearning_step_count, + learning_step_count: req.learning_step_count as usize, + relearning_step_count: req.relearning_step_count as usize, }; Ok((config, converted_cards)) @@ -248,42 +273,74 @@ impl Collection { daily_time_cost: result.cost_per_day, }) } + + pub fn simulate_workload( + &mut self, + req: SimulateFsrsReviewRequest, + ) -> Result { + let (config, cards) = self.simulate_request_to_config(&req)?; + let dr_workload = (70u32..=99u32) + .into_par_iter() + .map(|dr| { + let result = simulate( + &config, + &req.params, + dr as f32 / 100., + None, + Some(cards.clone()), + )?; + Ok(( + dr, + ( + *result.memorized_cnt_per_day.last().unwrap_or(&0.), + result.cost_per_day.iter().sum::(), + result.review_cnt_per_day.iter().sum::() as u32 + + result.learn_cnt_per_day.iter().sum::() as u32, + ), + )) + }) + .collect::>>()?; + Ok(SimulateFsrsWorkloadResponse { + memorized: dr_workload.iter().map(|(k, v)| (*k, v.0)).collect(), + cost: dr_workload.iter().map(|(k, v)| (*k, v.1)).collect(), + review_count: dr_workload.iter().map(|(k, v)| (*k, v.2)).collect(), + }) + } } impl Card { - fn convert(card: Card, days_elapsed: i32) -> Option { - match card.memory_state { - Some(state) => match card.queue { - CardQueue::DayLearn | CardQueue::Review => { - let due = card.original_or_current_due(); - let relative_due = due - days_elapsed; - let last_date = (relative_due - card.interval as i32).min(0) as f32; - Some(fsrs::Card { - id: card.id.0, - difficulty: state.difficulty, - stability: state.stability, - last_date, - due: relative_due as f32, - interval: card.interval as f32, - lapses: card.lapses, - }) - } - CardQueue::New => None, - CardQueue::Learn | CardQueue::SchedBuried | CardQueue::UserBuried => { - Some(fsrs::Card { - id: card.id.0, - difficulty: state.difficulty, - stability: state.stability, - last_date: 0.0, - due: 0.0, - interval: card.interval as f32, - lapses: card.lapses, - }) - } - CardQueue::PreviewRepeat => None, - CardQueue::Suspended => None, - }, - None => None, + pub(crate) fn convert( + card: Card, + days_elapsed: i32, + memory_state: FsrsMemoryState, + ) -> Option { + match card.queue { + CardQueue::DayLearn | CardQueue::Review => { + let due = card.original_or_current_due(); + let relative_due = due - days_elapsed; + let last_date = (relative_due - card.interval as i32).min(0) as f32; + Some(fsrs::Card { + id: card.id.0, + difficulty: memory_state.difficulty, + stability: memory_state.stability, + last_date, + due: relative_due as f32, + interval: card.interval as f32, + lapses: card.lapses, + }) + } + CardQueue::New => None, + CardQueue::Learn | CardQueue::SchedBuried | CardQueue::UserBuried => Some(fsrs::Card { + id: card.id.0, + difficulty: memory_state.difficulty, + stability: memory_state.stability, + last_date: 0.0, + due: 0.0, + interval: card.interval as f32, + lapses: card.lapses, + }), + CardQueue::PreviewRepeat => None, + CardQueue::Suspended => None, } } } diff --git a/rslib/src/scheduler/service/mod.rs b/rslib/src/scheduler/service/mod.rs index 43d694e4f..9f42a79f7 100644 --- a/rslib/src/scheduler/service/mod.rs +++ b/rslib/src/scheduler/service/mod.rs @@ -16,6 +16,7 @@ use anki_proto::scheduler::FuzzDeltaResponse; use anki_proto::scheduler::GetOptimalRetentionParametersResponse; use anki_proto::scheduler::SimulateFsrsReviewRequest; use anki_proto::scheduler::SimulateFsrsReviewResponse; +use anki_proto::scheduler::SimulateFsrsWorkloadResponse; use fsrs::ComputeParametersInput; use fsrs::FSRSItem; use fsrs::FSRSReview; @@ -283,6 +284,13 @@ impl crate::services::SchedulerService for Collection { self.simulate_review(input) } + fn simulate_fsrs_workload( + &mut self, + input: SimulateFsrsReviewRequest, + ) -> Result { + self.simulate_workload(input) + } + fn compute_optimal_retention( &mut self, input: SimulateFsrsReviewRequest, diff --git a/rslib/src/scheduler/timespan.rs b/rslib/src/scheduler/timespan.rs index b015e3e1e..9ae53d78c 100644 --- a/rslib/src/scheduler/timespan.rs +++ b/rslib/src/scheduler/timespan.rs @@ -57,10 +57,10 @@ const SECOND: f32 = 1.0; const MINUTE: f32 = 60.0 * SECOND; const HOUR: f32 = 60.0 * MINUTE; const DAY: f32 = 24.0 * HOUR; -const MONTH: f32 = 30.417 * DAY; // 365/12 ≈ 30.417 const YEAR: f32 = 365.0 * DAY; +const MONTH: f32 = YEAR / 12.0; -#[derive(Clone, Copy)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub(crate) enum TimespanUnit { Seconds, Minutes, @@ -111,6 +111,13 @@ impl Timespan { } } + pub fn to_unit(self, unit: TimespanUnit) -> Timespan { + Timespan { + seconds: self.seconds, + unit, + } + } + /// Round seconds and days to integers, otherwise /// truncates to one decimal place. pub fn as_rounded_unit(self) -> f32 { diff --git a/rslib/src/search/mod.rs b/rslib/src/search/mod.rs index ff21bf4ca..d42ea8323 100644 --- a/rslib/src/search/mod.rs +++ b/rslib/src/search/mod.rs @@ -378,9 +378,10 @@ fn card_order_from_sort_column(column: Column, timing: SchedTimingToday) -> Cow< Column::Stability => "extract_fsrs_variable(c.data, 's') asc".into(), Column::Difficulty => "extract_fsrs_variable(c.data, 'd') asc".into(), Column::Retrievability => format!( - "extract_fsrs_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, c.ivl, {}, {}) asc", + "extract_fsrs_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, c.ivl, {}, {}, {}) asc", timing.days_elapsed, - timing.next_day_at.0 + timing.next_day_at.0, + timing.now.0, ) .into(), } diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index 8528376cb..542dba4fc 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -418,13 +418,13 @@ impl SqlWriter<'_> { write!(self.sql, "extract_fsrs_variable(c.data, 'd') {op} {d}").unwrap() } PropertyKind::Retrievability(r) => { - let (elap, next_day_at) = { + let (elap, next_day_at, now) = { let timing = self.col.timing_today()?; - (timing.days_elapsed, timing.next_day_at) + (timing.days_elapsed, timing.next_day_at, timing.now) }; write!( self.sql, - "extract_fsrs_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, c.ivl, {elap}, {next_day_at}) {op} {r}" + "extract_fsrs_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, c.ivl, {elap}, {next_day_at}, {now}) {op} {r}" ) .unwrap() } diff --git a/rslib/src/stats/card.rs b/rslib/src/stats/card.rs index fdab209c8..008977fe9 100644 --- a/rslib/src/stats/card.rs +++ b/rslib/src/stats/card.rs @@ -30,14 +30,24 @@ impl Collection { let (average_secs, total_secs) = average_and_total_secs_strings(&revlog); let timing = self.timing_today()?; - let seconds_elapsed = if let Some(last_review_time) = card.last_review_time { - timing.now.elapsed_secs_since(last_review_time) as u32 + + let last_review_time = if let Some(last_review_time) = card.last_review_time { + last_review_time } else { - self.storage + let mut new_card = card.clone(); + let last_review_time = self + .storage .time_of_last_review(card.id)? - .map(|ts| timing.now.elapsed_secs_since(ts)) - .unwrap_or_default() as u32 + .unwrap_or_default(); + + new_card.last_review_time = Some(last_review_time); + + self.storage.update_card(&new_card)?; + last_review_time }; + + let seconds_elapsed = timing.now.elapsed_secs_since(last_review_time) as u32; + let fsrs_retrievability = card .memory_state .zip(Some(seconds_elapsed)) @@ -187,7 +197,7 @@ impl Collection { } fn average_and_total_secs_strings(revlog: &[RevlogEntry]) -> (f32, f32) { - let normal_answer_count = revlog.iter().filter(|r| r.button_chosen > 0).count(); + let normal_answer_count = revlog.iter().filter(|r| r.has_rating()).count(); let total_secs: f32 = revlog .iter() .map(|entry| (entry.taken_millis as f32) / 1000.0) diff --git a/rslib/src/stats/graphs/retention.rs b/rslib/src/stats/graphs/retention.rs index c21f43301..231a892f0 100644 --- a/rslib/src/stats/graphs/retention.rs +++ b/rslib/src/stats/graphs/retention.rs @@ -53,10 +53,7 @@ impl GraphsContext { self.revlog .iter() .filter(|review| { - // not rescheduled/set due date/reset - review.button_chosen > 0 - // not cramming - && (review.review_kind != RevlogReviewKind::Filtered || review.ease_factor != 0) + review.has_rating_and_affects_scheduling() // cards with an interval ≥ 1 day && (review.review_kind == RevlogReviewKind::Review || review.last_interval <= -86400 diff --git a/rslib/src/stats/graphs/retrievability.rs b/rslib/src/stats/graphs/retrievability.rs index 94f4d6bc9..6881a6062 100644 --- a/rslib/src/stats/graphs/retrievability.rs +++ b/rslib/src/stats/graphs/retrievability.rs @@ -30,10 +30,10 @@ impl GraphsContext { .or_insert((0.0, 0)); entry.1 += 1; if let Some(state) = card.memory_state { - let elapsed_days = card.days_since_last_review(&timing).unwrap_or_default(); - let r = fsrs.current_retrievability( + let elapsed_seconds = card.seconds_since_last_review(&timing).unwrap_or_default(); + let r = fsrs.current_retrievability_seconds( state.into(), - elapsed_days, + elapsed_seconds, card.decay.unwrap_or(FSRS5_DEFAULT_DECAY), ); diff --git a/rslib/src/stats/today.rs b/rslib/src/stats/today.rs index f856ce271..d9680c282 100644 --- a/rslib/src/stats/today.rs +++ b/rslib/src/stats/today.rs @@ -5,17 +5,18 @@ use anki_i18n::I18n; use crate::prelude::*; use crate::scheduler::timespan::Timespan; +use crate::scheduler::timespan::TimespanUnit; pub fn studied_today(cards: u32, secs: f32, tr: &I18n) -> String { let span = Timespan::from_secs(secs).natural_span(); - let amount = span.as_unit(); - let unit = span.unit().as_str(); + let unit = std::cmp::min(span.unit(), TimespanUnit::Minutes); + let amount = span.to_unit(unit).as_unit(); let secs_per_card = if cards > 0 { secs / (cards as f32) } else { 0.0 }; - tr.statistics_studied_today(unit, secs_per_card, amount, cards) + tr.statistics_studied_today(unit.as_str(), secs_per_card, amount, cards) .into() } @@ -41,5 +42,9 @@ mod test { &studied_today(3, 13.0, &tr).replace('\n', " "), "Studied 3 cards in 13 seconds today (4.33s/card)" ); + assert_eq!( + &studied_today(300, 5400.0, &tr).replace('\n', " "), + "Studied 300 cards in 90 minutes today (18s/card)" + ); } } diff --git a/rslib/src/storage/card/filtered.rs b/rslib/src/storage/card/filtered.rs index ea935c18c..ef436f6e8 100644 --- a/rslib/src/storage/card/filtered.rs +++ b/rslib/src/storage/card/filtered.rs @@ -14,6 +14,8 @@ pub(crate) fn order_and_limit_for_search( ) -> String { let temp_string; let today = timing.days_elapsed; + let next_day_at = timing.next_day_at.0; + let now = timing.now.0; let order = match term.order() { FilteredSearchOrder::OldestReviewedFirst => "(select max(id) from revlog where cid=c.id)", FilteredSearchOrder::Random => "random()", @@ -29,15 +31,13 @@ pub(crate) fn order_and_limit_for_search( &temp_string } FilteredSearchOrder::RetrievabilityAscending => { - let next_day_at = timing.next_day_at.0; temp_string = - build_retrievability_query(fsrs, today, next_day_at, SqlSortOrder::Ascending); + build_retrievability_query(fsrs, today, next_day_at, now, SqlSortOrder::Ascending); &temp_string } FilteredSearchOrder::RetrievabilityDescending => { - let next_day_at = timing.next_day_at.0; temp_string = - build_retrievability_query(fsrs, today, next_day_at, SqlSortOrder::Descending); + build_retrievability_query(fsrs, today, next_day_at, now, SqlSortOrder::Descending); &temp_string } }; @@ -49,11 +49,12 @@ fn build_retrievability_query( fsrs: bool, today: u32, next_day_at: i64, + now: i64, order: SqlSortOrder, ) -> String { if fsrs { format!( - "extract_fsrs_relative_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, {today}, ivl, {next_day_at}) {order}" + "extract_fsrs_relative_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, {today}, ivl, {next_day_at}, {now}) {order}" ) } else { format!( diff --git a/rslib/src/storage/card/get_costs_for_retention.sql b/rslib/src/storage/card/get_costs_for_retention.sql deleted file mode 100644 index ba21cc3f6..000000000 --- a/rslib/src/storage/card/get_costs_for_retention.sql +++ /dev/null @@ -1,85 +0,0 @@ -WITH searched_revlogs AS ( - SELECT *, - RANK() OVER ( - PARTITION BY cid - ORDER BY id ASC - ) AS rank_num - FROM revlog - WHERE ease > 0 - AND cid IN search_cids - ORDER BY id DESC -- Use the last 10_000 reviews - LIMIT 10000 -), average_pass AS ( - SELECT AVG(time) - FROM searched_revlogs - WHERE ease > 1 - AND type = 1 -), -lapse_count AS ( - SELECT COUNT(time) AS lapse_count - FROM searched_revlogs - WHERE ease = 1 - AND type = 1 -), -fail_sum AS ( - SELECT SUM(time) AS total_fail_time - FROM searched_revlogs - WHERE ( - ease = 1 - AND type = 1 - ) - OR type = 2 -), --- (sum(Relearning) + sum(Lapses)) / count(Lapses) -average_fail AS ( - SELECT total_fail_time * 1.0 / NULLIF(lapse_count, 0) AS avg_fail_time - FROM fail_sum, - lapse_count -), --- Can lead to cards with partial learn histories skewing the time -summed_learns AS ( - SELECT cid, - SUM(time) AS total_time - FROM searched_revlogs - WHERE searched_revlogs.type = 0 - GROUP BY cid -), -average_learn AS ( - SELECT AVG(total_time) AS avg_learn_time - FROM summed_learns -), -initial_pass_rate AS ( - SELECT AVG( - CASE - WHEN ease > 1 THEN 1.0 - ELSE 0.0 - END - ) AS initial_pass_rate - FROM searched_revlogs - WHERE rank_num = 1 -), -pass_cnt AS ( - SELECT COUNT(*) AS cnt - FROM searched_revlogs - WHERE ease > 1 - AND type = 1 -), -fail_cnt AS ( - SELECT COUNT(*) AS cnt - FROM searched_revlogs - WHERE ease = 1 - AND type = 1 -), -learn_cnt AS ( - SELECT COUNT(*) AS cnt - FROM searched_revlogs - WHERE type = 0 -) -SELECT * -FROM average_pass, - average_fail, - average_learn, - initial_pass_rate, - pass_cnt, - fail_cnt, - learn_cnt; \ No newline at end of file diff --git a/rslib/src/storage/card/mod.rs b/rslib/src/storage/card/mod.rs index 35a229e93..1d0d62fd7 100644 --- a/rslib/src/storage/card/mod.rs +++ b/rslib/src/storage/card/mod.rs @@ -33,6 +33,7 @@ use crate::decks::DeckKind; use crate::error::Result; use crate::notes::NoteId; use crate::scheduler::congrats::CongratsInfo; +use crate::scheduler::fsrs::memory_state::get_last_revlog_info; use crate::scheduler::queue::BuryMode; use crate::scheduler::queue::DueCard; use crate::scheduler::queue::DueCardKind; @@ -42,15 +43,11 @@ use crate::timestamp::TimestampMillis; use crate::timestamp::TimestampSecs; use crate::types::Usn; -#[derive(Debug, Clone, Default)] -pub struct RetentionCosts { - pub average_pass_time_ms: f32, - pub average_fail_time_ms: f32, - pub average_learn_time_ms: f32, - pub initial_pass_rate: f32, - pub pass_count: u32, - pub fail_count: u32, - pub learn_count: u32, +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) struct CardFixStats { + pub new_cards_fixed: usize, + pub other_cards_fixed: usize, + pub last_review_time_fixed: usize, } impl FromSql for CardType { @@ -376,7 +373,7 @@ impl super::SqliteStorage { mtime: TimestampSecs, usn: Usn, v1_sched: bool, - ) -> Result<(usize, usize)> { + ) -> Result { let new_cnt = self .db .prepare(include_str!("fix_due_new.sql"))? @@ -401,7 +398,24 @@ impl super::SqliteStorage { .db .prepare(include_str!("fix_ordinal.sql"))? .execute(params![mtime, usn])?; - Ok((new_cnt, other_cnt)) + let mut last_review_time_cnt = 0; + let revlog = self.get_all_revlog_entries_in_card_order()?; + let last_revlog_info = get_last_revlog_info(&revlog); + for (card_id, last_revlog_info) in last_revlog_info { + let card = self.get_card(card_id)?; + if let Some(mut card) = card { + if card.ctype != CardType::New && card.last_review_time.is_none() { + card.last_review_time = last_revlog_info.last_reviewed_at; + self.update_card(&card)?; + last_review_time_cnt += 1; + } + } + } + Ok(CardFixStats { + new_cards_fixed: new_cnt, + other_cards_fixed: other_cnt, + last_review_time_fixed: last_review_time_cnt, + }) } pub(crate) fn delete_orphaned_cards(&self) -> Result { @@ -759,24 +773,6 @@ impl super::SqliteStorage { .get(0)?) } - pub(crate) fn get_costs_for_retention(&self) -> Result { - let mut statement = self - .db - .prepare(include_str!("get_costs_for_retention.sql"))?; - let mut query = statement.query(params![])?; - let row = query.next()?.unwrap(); - - Ok(RetentionCosts { - average_pass_time_ms: row.get(0).unwrap_or(7000.), - average_fail_time_ms: row.get(1).unwrap_or(23_000.), - average_learn_time_ms: row.get(2).unwrap_or(30_000.), - initial_pass_rate: row.get(3).unwrap_or(0.5), - pass_count: row.get(4).unwrap_or(0), - fail_count: row.get(5).unwrap_or(0), - learn_count: row.get(6).unwrap_or(0), - }) - } - #[cfg(test)] pub(crate) fn get_all_cards(&self) -> Vec { self.db @@ -837,8 +833,9 @@ impl fmt::Display for ReviewOrderSubclause { ReviewOrderSubclause::RetrievabilityFsrs { timing, order } => { let today = timing.days_elapsed; let next_day_at = timing.next_day_at.0; + let now = timing.now.0; temp_string = - format!("extract_fsrs_relative_retrievability(data, case when odue !=0 then odue else due end, {today}, ivl, {next_day_at}) {order}"); + format!("extract_fsrs_relative_retrievability(data, case when odue !=0 then odue else due end, {today}, ivl, {next_day_at}, {now}) {order}"); &temp_string } ReviewOrderSubclause::Added => "nid asc, ord asc", diff --git a/rslib/src/storage/sqlite.rs b/rslib/src/storage/sqlite.rs index e4b6f60f0..3ce1baff0 100644 --- a/rslib/src/storage/sqlite.rs +++ b/rslib/src/storage/sqlite.rs @@ -310,14 +310,14 @@ fn add_extract_fsrs_variable(db: &Connection) -> rusqlite::Result<()> { } /// eg. extract_fsrs_retrievability(card.data, card.due, card.ivl, -/// timing.days_elapsed, timing.next_day_at) -> float | null +/// timing.days_elapsed, timing.next_day_at, timing.now) -> float | null fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> { db.create_scalar_function( "extract_fsrs_retrievability", - 5, + 6, FunctionFlags::SQLITE_DETERMINISTIC, move |ctx| { - assert_eq!(ctx.len(), 5, "called with unexpected number of arguments"); + assert_eq!(ctx.len(), 6, "called with unexpected number of arguments"); let Ok(card_data) = ctx.get_raw(0).as_str() else { return Ok(None); }; @@ -328,18 +328,18 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> { let Ok(due) = ctx.get_raw(1).as_i64() else { return Ok(None); }; - let days_elapsed = if let Some(last_review_time) = card_data.last_review_time { - // Use last_review_time to calculate days_elapsed - let Ok(next_day_at) = ctx.get_raw(4).as_i64() else { - return Ok(None); - }; - (next_day_at as u32).saturating_sub(last_review_time.0 as u32) / 86_400 + let Ok(now) = ctx.get_raw(5).as_i64() else { + return Ok(None); + }; + let seconds_elapsed = if let Some(last_review_time) = card_data.last_review_time { + now.saturating_sub(last_review_time.0) as u32 } else if due > 365_000 { // (re)learning card in seconds - let Ok(next_day_at) = ctx.get_raw(4).as_i64() else { + let Ok(ivl) = ctx.get_raw(2).as_i64() else { return Ok(None); }; - (next_day_at as u32).saturating_sub(due as u32) / 86_400 + let last_review_time = due.saturating_sub(ivl); + now.saturating_sub(last_review_time) as u32 } else { let Ok(ivl) = ctx.get_raw(2).as_i64() else { return Ok(None); @@ -348,29 +348,32 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> { return Ok(None); }; let review_day = due.saturating_sub(ivl); - (days_elapsed as u32).saturating_sub(review_day as u32) + days_elapsed.saturating_sub(review_day) as u32 * 86_400 }; let decay = card_data.decay.unwrap_or(FSRS5_DEFAULT_DECAY); - Ok(card_data.memory_state().map(|state| { - FSRS::new(None) - .unwrap() - .current_retrievability(state.into(), days_elapsed, decay) - })) + let retrievability = card_data.memory_state().map(|state| { + FSRS::new(None).unwrap().current_retrievability_seconds( + state.into(), + seconds_elapsed, + decay, + ) + }); + Ok(retrievability) }, ) } /// eg. extract_fsrs_relative_retrievability(card.data, card.due, -/// timing.days_elapsed, card.ivl, timing.next_day_at) -> float | null. The -/// higher the number, the higher the card's retrievability relative to the -/// configured desired retention. +/// timing.days_elapsed, card.ivl, timing.next_day_at, timing.now) -> float | +/// null. The higher the number, the higher the card's retrievability relative +/// to the configured desired retention. fn add_extract_fsrs_relative_retrievability(db: &Connection) -> rusqlite::Result<()> { db.create_scalar_function( "extract_fsrs_relative_retrievability", - 5, + 6, FunctionFlags::SQLITE_DETERMINISTIC, move |ctx| { - assert_eq!(ctx.len(), 5, "called with unexpected number of arguments"); + assert_eq!(ctx.len(), 6, "called with unexpected number of arguments"); let Ok(due) = ctx.get_raw(1).as_i64() else { return Ok(None); @@ -381,6 +384,9 @@ fn add_extract_fsrs_relative_retrievability(db: &Connection) -> rusqlite::Result let Ok(next_day_at) = ctx.get_raw(4).as_i64() else { return Ok(None); }; + let Ok(now) = ctx.get_raw(5).as_i64() else { + return Ok(None); + }; let days_elapsed = if due > 365_000 { // (re)learning (next_day_at as u32).saturating_sub(due as u32) / 86_400 @@ -402,17 +408,30 @@ fn add_extract_fsrs_relative_retrievability(db: &Connection) -> rusqlite::Result desired_retrievability = desired_retrievability.max(0.0001); let decay = card_data.decay.unwrap_or(FSRS5_DEFAULT_DECAY); - let days_elapsed = if let Some(last_review_time) = - card_data.last_review_time - { - TimestampSecs(next_day_at).elapsed_days_since(last_review_time) as u32 - } else { - days_elapsed - }; + let seconds_elapsed = + if let Some(last_review_time) = card_data.last_review_time { + now.saturating_sub(last_review_time.0) as u32 + } else if due > 365_000 { + // (re)learning card in seconds + let Ok(ivl) = ctx.get_raw(2).as_i64() else { + return Ok(None); + }; + let last_review_time = due.saturating_sub(ivl); + now.saturating_sub(last_review_time) as u32 + } else { + let Ok(ivl) = ctx.get_raw(2).as_i64() else { + return Ok(None); + }; + let Ok(days_elapsed) = ctx.get_raw(3).as_i64() else { + return Ok(None); + }; + let review_day = due.saturating_sub(ivl); + days_elapsed.saturating_sub(review_day) as u32 * 86_400 + }; let current_retrievability = FSRS::new(None) .unwrap() - .current_retrievability(state.into(), days_elapsed, decay) + .current_retrievability_seconds(state.into(), seconds_elapsed, decay) .max(0.0001); return Ok(Some( diff --git a/rslib/src/tags/complete.rs b/rslib/src/tags/complete.rs index 1093017b0..f995b63a2 100644 --- a/rslib/src/tags/complete.rs +++ b/rslib/src/tags/complete.rs @@ -12,14 +12,20 @@ impl Collection { .map(component_to_regex) .collect::>()?; let mut tags = vec![]; + let mut priority = vec![]; self.storage.get_tags_by_predicate(|tag| { - if tags.len() <= limit && filters_match(&filters, tag) { - tags.push(tag.to_string()); + if priority.len() + tags.len() <= limit { + match filters_match(&filters, tag) { + Some(true) => priority.push(tag.to_string()), + Some(_) => tags.push(tag.to_string()), + _ => {} + } } // we only need the tag name false })?; - Ok(tags) + priority.append(&mut tags); + Ok(priority) } } @@ -27,20 +33,26 @@ fn component_to_regex(component: &str) -> Result { Regex::new(&format!("(?i){}", regex::escape(component))).map_err(Into::into) } -fn filters_match(filters: &[Regex], tag: &str) -> bool { +/// Returns None if tag wasn't a match, otherwise whether it was a consecutive +/// prefix match +fn filters_match(filters: &[Regex], tag: &str) -> Option { let mut remaining_tag_components = tag.split("::"); + let mut is_prefix = true; 'outer: for filter in filters { loop { if let Some(component) = remaining_tag_components.next() { - if filter.is_match(component) { + if let Some(m) = filter.find(component) { + is_prefix &= m.start() == 0; continue 'outer; + } else { + is_prefix = false; } } else { - return false; + return None; } } } - true + Some(is_prefix) } #[cfg(test)] @@ -50,28 +62,32 @@ mod test { #[test] fn matching() -> Result<()> { let filters = &[component_to_regex("b")?]; - assert!(filters_match(filters, "ABC")); - assert!(filters_match(filters, "ABC::def")); - assert!(filters_match(filters, "def::abc")); - assert!(!filters_match(filters, "def")); + assert!(filters_match(filters, "ABC").is_some()); + assert!(filters_match(filters, "ABC::def").is_some()); + assert!(filters_match(filters, "def::abc").is_some()); + assert!(filters_match(filters, "def").is_none()); let filters = &[component_to_regex("b")?, component_to_regex("E")?]; - assert!(!filters_match(filters, "ABC")); - assert!(filters_match(filters, "ABC::def")); - assert!(!filters_match(filters, "def::abc")); - assert!(!filters_match(filters, "def")); + assert!(filters_match(filters, "ABC").is_none()); + assert!(filters_match(filters, "ABC::def").is_some()); + assert!(filters_match(filters, "def::abc").is_none()); + assert!(filters_match(filters, "def").is_none()); let filters = &[ component_to_regex("a")?, component_to_regex("c")?, component_to_regex("e")?, ]; - assert!(!filters_match(filters, "ace")); - assert!(!filters_match(filters, "a::c")); - assert!(!filters_match(filters, "c::e")); - assert!(filters_match(filters, "a::c::e")); - assert!(filters_match(filters, "a::b::c::d::e")); - assert!(filters_match(filters, "1::a::b::c::d::e::f")); + assert!(filters_match(filters, "ace").is_none()); + assert!(filters_match(filters, "a::c").is_none()); + assert!(filters_match(filters, "c::e").is_none()); + assert!(filters_match(filters, "a::c::e").is_some()); + assert!(filters_match(filters, "a::b::c::d::e").is_some()); + assert!(filters_match(filters, "1::a::b::c::d::e::f").is_some()); + + assert_eq!(filters_match(filters, "a1::c2::e3"), Some(true)); + assert_eq!(filters_match(filters, "a1::c2::?::e4"), Some(false)); + assert_eq!(filters_match(filters, "a1::c2::3e"), Some(false)); Ok(()) } diff --git a/rslib/src/timestamp.rs b/rslib/src/timestamp.rs index a020d706d..8a6ac4eb7 100644 --- a/rslib/src/timestamp.rs +++ b/rslib/src/timestamp.rs @@ -93,6 +93,10 @@ impl TimestampMillis { pub fn adding_secs(self, secs: i64) -> Self { Self(self.0 + secs * 1000) } + + pub fn elapsed_millis(self) -> u64 { + (Self::now().0 - self.0).max(0) as u64 + } } fn elapsed() -> time::Duration { diff --git a/tools/minilints/Cargo.toml b/tools/minilints/Cargo.toml index bb6629f38..782fc8f78 100644 --- a/tools/minilints/Cargo.toml +++ b/tools/minilints/Cargo.toml @@ -12,5 +12,6 @@ anki_io.workspace = true anki_process.workspace = true anyhow.workspace = true camino.workspace = true +serde_json.workspace = true walkdir.workspace = true which.workspace = true diff --git a/tools/minilints/src/main.rs b/tools/minilints/src/main.rs index 37e213570..c99fbe06e 100644 --- a/tools/minilints/src/main.rs +++ b/tools/minilints/src/main.rs @@ -2,6 +2,7 @@ // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html use std::cell::LazyCell; +use std::collections::BTreeMap; use std::collections::HashSet; use std::env; use std::fs; @@ -148,7 +149,7 @@ impl LintContext { if last_author == "49699333+dependabot[bot]@users.noreply.github.com" { println!("Dependabot whitelisted."); - return Ok(()); + std::process::exit(0); } else if all_contributors.contains(last_author.as_str()) { return Ok(()); } @@ -267,5 +268,16 @@ fn generate_licences() -> Result { "--manifest-path", "rslib/Cargo.toml", ])?; - Ok(output.stdout) + + let licenses: Vec> = serde_json::from_str(&output.stdout)?; + + let filtered: Vec> = licenses + .into_iter() + .map(|mut entry| { + entry.remove("version"); + entry + }) + .collect(); + + Ok(serde_json::to_string_pretty(&filtered)?) } diff --git a/ts/editor/ClozeButtons.svelte b/ts/editor/ClozeButtons.svelte index e9faae540..dfe4fb7c3 100644 --- a/ts/editor/ClozeButtons.svelte +++ b/ts/editor/ClozeButtons.svelte @@ -4,7 +4,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html -->

- {#if onTitleClick} - -

- {title} -

-
- {:else} -

- {title} -

- {/if} +

+ {title} +

diff --git a/ts/lib/tslib/help-page.ts b/ts/lib/tslib/help-page.ts index ff4e7e434..e3f209c6a 100644 --- a/ts/lib/tslib/help-page.ts +++ b/ts/lib/tslib/help-page.ts @@ -24,6 +24,7 @@ export const HelpPage = { displayOrder: "https://docs.ankiweb.net/deck-options.html#display-order", maximumReviewsday: "https://docs.ankiweb.net/deck-options.html#maximum-reviewsday", newCardsday: "https://docs.ankiweb.net/deck-options.html#new-cardsday", + limitsFromTop: "https://docs.ankiweb.net/deck-options.html#limits-start-from-top", dailyLimits: "https://docs.ankiweb.net/deck-options.html#daily-limits", audio: "https://docs.ankiweb.net/deck-options.html#audio", fsrs: "http://docs.ankiweb.net/deck-options.html#fsrs", diff --git a/ts/lib/tslib/platform.ts b/ts/lib/tslib/platform.ts index 7aa5e137d..d055bcb53 100644 --- a/ts/lib/tslib/platform.ts +++ b/ts/lib/tslib/platform.ts @@ -13,3 +13,20 @@ export function isApplePlatform(): boolean { export function isDesktop(): boolean { return !(/iphone|ipad|ipod|android/i.test(window.navigator.userAgent)); } + +export function chromiumVersion(): number | null { + const userAgent = window.navigator.userAgent; + + // Check if it's a Chromium-based browser (Chrome, Edge, Opera, etc.) + // but exclude Safari which also contains "Chrome" in its user agent + if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) { + return null; // Safari + } + + const chromeMatch = userAgent.match(/Chrome\/(\d+)/); + if (chromeMatch) { + return parseInt(chromeMatch[1], 10); + } + + return null; // Not a Chromium-based browser +} diff --git a/ts/lib/tslib/time.ts b/ts/lib/tslib/time.ts index f40758d8d..25d70eef3 100644 --- a/ts/lib/tslib/time.ts +++ b/ts/lib/tslib/time.ts @@ -89,7 +89,7 @@ export function naturalWholeUnit(secs: number): TimespanUnit { } export function studiedToday(cards: number, secs: number): string { - const unit = naturalUnit(secs); + const unit = Math.min(naturalUnit(secs), TimespanUnit.Minutes); const amount = unitAmount(unit, secs); const name = unitName(unit); diff --git a/ts/routes/+error.svelte b/ts/routes/+error.svelte index 8f171d33d..3dfb64e22 100644 --- a/ts/routes/+error.svelte +++ b/ts/routes/+error.svelte @@ -3,9 +3,9 @@ Copyright: Ankitects Pty Ltd and contributors License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html --> {message} diff --git a/ts/routes/card-info/[cardId]/+page.svelte b/ts/routes/card-info/[cardId]/+page.svelte index a1e137e10..af0b0997c 100644 --- a/ts/routes/card-info/[cardId]/+page.svelte +++ b/ts/routes/card-info/[cardId]/+page.svelte @@ -3,7 +3,7 @@ Copyright: Ankitects Pty Ltd and contributors License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html --> - + + + + openHelpModal("desiredRetention")}> + {tr.deckConfigDesiredRetention()} + + + + + + @@ -408,6 +469,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html {onPresetChange} /> + +