diff --git a/Cargo.lock b/Cargo.lock index bc42e30af..1e3ef7bd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -268,6 +268,36 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attribute-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0053e96dd3bec5b4879c23a138d6ef26f2cb936c9cdc96274ac2b9ed44b5bb54" +dependencies = [ + "attribute-derive-macro", + "derive-where", + "manyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463b53ad0fd5b460af4b1915fe045ff4d946d025fb6c4dc3337752eaa980f71b" +dependencies = [ + "collection_literals", + "interpolator", + "manyhow", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -557,6 +587,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" version = "1.2.11" @@ -742,6 +781,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "collection_literals" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b3f65b8fb8e88ba339f7d23a390fe1b0896217da05e2a66c584c9b29a91df8" + [[package]] name = "color_quant" version = "1.1.0" @@ -764,6 +809,20 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -989,6 +1048,17 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +[[package]] +name = "derive-where" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "derive_arbitrary" version = "1.4.1" @@ -1415,6 +1485,38 @@ dependencies = [ "version_check", ] +[[package]] +name = "get-size-derive2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f3cfad7c3e3b1d8d04ef0a1c03576f2d62800803fe1301a4cd262849f2dea" +dependencies = [ + "attribute-derive", + "quote", + "syn", +] + +[[package]] +name = "get-size2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a09c2043819a3def7bfbb4927e7df96aab0da4cfd8824484b22d0c94e84458e" +dependencies = [ + "compact_str", + "get-size-derive2", + "hashbrown 0.15.4", + "smallvec", +] + +[[package]] +name = "getopts" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" +dependencies = [ + "unicode-width 0.2.1", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -1942,6 +2044,12 @@ dependencies = [ "similar", ] +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + [[package]] name = "ipnet" version = "2.11.0" @@ -1958,6 +2066,18 @@ dependencies = [ "serde", ] +[[package]] +name = "is-macro" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "is-terminal" version = "0.4.15" @@ -2222,6 +2342,29 @@ dependencies = [ "quoted_printable", ] +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + [[package]] name = "markdown" version = "1.0.0" @@ -2624,6 +2767,44 @@ dependencies = [ "serde", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", +] + [[package]] name = "pico-args" version = "0.5.0" @@ -2771,6 +2952,17 @@ dependencies = [ "indexmap", ] +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -2897,6 +3089,28 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quote-use" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9619db1197b497a36178cfc736dc96b271fe918875fbf1344c436a7e93d0321e" +dependencies = [ + "quote", + "quote-use-macros", +] + +[[package]] +name = "quote-use-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82ebfb7faafadc06a7ab141a6f67bcfb24cb8beb158c6fe933f2f035afa99f35" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quoted_printable" version = "0.5.1" @@ -3266,7 +3480,7 @@ dependencies = [ "log", "roxmltree 0.18.1", "simplecss", - "siphasher", + "siphasher 0.3.11", "svgtypes 0.9.0", ] @@ -3285,6 +3499,73 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "ruff_python_ast" +version = "0.0.0" +source = "git+https://github.com/astral-sh/ruff#dca594f89fe0f892f8f939e09d799d2974a811d7" +dependencies = [ + "aho-corasick", + "bitflags 2.9.1", + "compact_str", + "get-size2", + "is-macro", + "itertools 0.14.0", + "memchr", + "ruff_python_trivia", + "ruff_source_file", + "ruff_text_size", + "rustc-hash", + "thiserror 2.0.12", +] + +[[package]] +name = "ruff_python_parser" +version = "0.0.0" +source = "git+https://github.com/astral-sh/ruff#dca594f89fe0f892f8f939e09d799d2974a811d7" +dependencies = [ + "bitflags 2.9.1", + "bstr", + "compact_str", + "get-size2", + "memchr", + "ruff_python_ast", + "ruff_python_trivia", + "ruff_text_size", + "rustc-hash", + "static_assertions", + "unicode-ident", + "unicode-normalization", + "unicode_names2", +] + +[[package]] +name = "ruff_python_trivia" +version = "0.0.0" +source = "git+https://github.com/astral-sh/ruff#dca594f89fe0f892f8f939e09d799d2974a811d7" +dependencies = [ + "itertools 0.14.0", + "ruff_source_file", + "ruff_text_size", + "unicode-ident", +] + +[[package]] +name = "ruff_source_file" +version = "0.0.0" +source = "git+https://github.com/astral-sh/ruff#dca594f89fe0f892f8f939e09d799d2974a811d7" +dependencies = [ + "memchr", + "ruff_text_size", +] + +[[package]] +name = "ruff_text_size" +version = "0.0.0" +source = "git+https://github.com/astral-sh/ruff#dca594f89fe0f892f8f939e09d799d2974a811d7" +dependencies = [ + "get-size2", +] + [[package]] name = "rust-netrc" version = "0.1.2" @@ -3696,6 +3977,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -3742,6 +4029,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "statrs" version = "0.18.0" @@ -3817,7 +4110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9ee29c1407a5b18ccfe5f6ac82ac11bab3b14407e09c209a6c1a32098b19734" dependencies = [ "kurbo 0.8.3", - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -3827,7 +4120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ffacedcdcf1da6579c907279b4f3c5492fbce99fbbf227f5ed270a589c2765" dependencies = [ "kurbo 0.9.5", - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -4486,6 +4779,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-script" version = "0.5.7" @@ -4510,6 +4812,28 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +[[package]] +name = "unicode_names2" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1673eca9782c84de5f81b82e4109dcfb3611c8ba0d52930ec4a9478f547b2dd" +dependencies = [ + "phf", + "unicode_names2_generator", +] + +[[package]] +name = "unicode_names2_generator" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91e5b84611016120197efd7dc93ef76774f4e084cd73c9fb3ea4a86c570c56e" +dependencies = [ + "getopts", + "log", + "phf_codegen", + "rand", +] + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -4660,6 +4984,7 @@ dependencies = [ "tracing-tree", "unicode-width 0.2.1", "url", + "uv-analyze", "uv-auth", "uv-build-backend", "uv-build-frontend", @@ -4713,6 +5038,16 @@ dependencies = [ "zip", ] +[[package]] +name = "uv-analyze" +version = "0.0.1" +dependencies = [ + "ruff_python_ast", + "ruff_python_parser", + "rustc-hash", + "uv-normalize", +] + [[package]] name = "uv-auth" version = "0.0.1" diff --git a/Cargo.toml b/Cargo.toml index ecdc11701..54d84138e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ authors = ["uv"] license = "MIT OR Apache-2.0" [workspace.dependencies] +uv-analyze = { path = "crates/uv-analyze" } uv-auth = { path = "crates/uv-auth" } uv-build-backend = { path = "crates/uv-build-backend" } uv-build-frontend = { path = "crates/uv-build-frontend" } @@ -72,6 +73,8 @@ uv-virtualenv = { path = "crates/uv-virtualenv" } uv-warnings = { path = "crates/uv-warnings" } uv-workspace = { path = "crates/uv-workspace" } +ruff_python_ast = { git = "https://github.com/astral-sh/ruff" } +ruff_python_parser = { git = "https://github.com/astral-sh/ruff" } anstream = { version = "0.6.15" } anyhow = { version = "1.0.89" } arcstr = { version = "1.2.0" } diff --git a/crates/uv-analyze/Cargo.toml b/crates/uv-analyze/Cargo.toml new file mode 100644 index 000000000..570e906f0 --- /dev/null +++ b/crates/uv-analyze/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "uv-analyze" +version = "0.0.1" +edition = { workspace = true } + +[lib] +doctest = false + +[lints] +workspace = true + +[dependencies] +uv-normalize = { workspace = true } + +ruff_python_ast = { workspace = true } +ruff_python_parser = { workspace = true } +rustc-hash = { workspace = true } diff --git a/crates/uv-analyze/src/lib.rs b/crates/uv-analyze/src/lib.rs new file mode 100644 index 000000000..76e073743 --- /dev/null +++ b/crates/uv-analyze/src/lib.rs @@ -0,0 +1,145 @@ +use std::collections::BTreeSet; +use std::str::FromStr; +use std::sync::LazyLock; + +use ruff_python_ast::statement_visitor::{StatementVisitor, walk_stmt}; +use ruff_python_ast::{Stmt, StmtImport, StmtImportFrom}; +use rustc_hash::{FxHashMap, FxHashSet}; + +use uv_normalize::PackageName; + +/// Extract the inferred requirements from Python source code. +/// +/// Assumes that all non-relative imports in the source code are either standard library modules or +/// PyPI packages. +pub fn extract_requirements( + source: &str, +) -> Result, ruff_python_parser::ParseError> { + // Parse the source code into a Python module. + let module = ruff_python_parser::parse_module(source)?; + + // Extract the import names from the module. + let imports = { + let mut imports_visitor = ImportsVisitor::new(); + imports_visitor.visit_body(module.suite()); + + imports_visitor.into_imports() + }; + + // Map the imports to requirements. + let requirements = imports + .into_iter() + .filter_map(|module| { + // Skip standard library modules. + if STDLIB.contains(module.as_ref()) { + return None; + } + + // Use static mapping for known modules. + if let Some(name) = MODULE_MAPPING.lookup(module.as_ref()).cloned() { + return Some(name); + } + + // Otherwise, treat it as a package name. + PackageName::from_str(module).ok() + }) + .collect::>(); + + Ok(requirements) +} + +/// A collection of known Python standard library modules. +#[derive(Debug)] +struct Stdlib<'a>(FxHashSet<&'a str>); + +impl<'a> Stdlib<'a> { + /// Generate a [`Stdlib`] from a string representation, with each line containing a module name. + fn from_str(source: &'a str) -> Self { + let mut stdlib = FxHashSet::default(); + for line in source.lines() { + let module = line.trim(); + if !module.is_empty() { + stdlib.insert(module); + } + } + Self(stdlib) + } + + /// Returns `true` if the standard library contains the given module. + fn contains(&self, module: &str) -> bool { + self.0.contains(module) + } +} + +/// A mapping from module name to PyPI package name. +struct ModuleMap<'a>(FxHashMap<&'a str, PackageName>); + +impl<'a> ModuleMap<'a> { + /// Generate a [`ModuleMap`] from a string representation, encoded in `${module}:{package}` format. + fn from_str(source: &'a str) -> Self { + let mut mapping = FxHashMap::default(); + for line in source.lines() { + if let Some((module, package)) = line.split_once(':') { + let module = module.trim(); + let package = PackageName::from_str(package.trim()).unwrap(); + mapping.insert(module, package); + } + } + Self(mapping) + } + + /// Look up a PyPI package name for a given module name. + fn lookup(&self, module: &str) -> Option<&PackageName> { + self.0.get(module) + } +} + +/// A mapping from module name to PyPI package name. +static MODULE_MAPPING: LazyLock = + LazyLock::new(|| ModuleMap::from_str(include_str!("pipreqs/mapping"))); + +/// A mapping of known standard library modules to their names. +static STDLIB: LazyLock = + LazyLock::new(|| Stdlib::from_str(include_str!("pipreqs/stdlib"))); + +/// Extracts the set of global names from a given scope. +#[derive(Debug)] +struct ImportsVisitor<'a>(FxHashSet<&'a str>); + +impl<'a> ImportsVisitor<'a> { + fn new() -> Self { + Self(FxHashSet::default()) + } + + /// Extracts the set of import names from a given scope. + fn into_imports(self) -> FxHashSet<&'a str> { + self.0 + } +} + +impl<'a> StatementVisitor<'a> for ImportsVisitor<'a> { + fn visit_stmt(&mut self, stmt: &'a Stmt) { + match stmt { + Stmt::Import(StmtImport { names, .. }) => { + for name in names { + let name = name.name.as_str(); + let module = name.split('.').next().unwrap_or(name); + self.0.insert(module); + } + } + Stmt::ImportFrom(StmtImportFrom { + names, + module: Some(..), + level: 0, + .. + }) => { + for name in names { + let name = name.name.as_str(); + let module = name.split('.').next().unwrap_or(name); + self.0.insert(module); + } + } + _ => walk_stmt(self, stmt), + } + } +} diff --git a/crates/uv-analyze/src/pipreqs/LICENSE b/crates/uv-analyze/src/pipreqs/LICENSE new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/crates/uv-analyze/src/pipreqs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/crates/uv-analyze/src/pipreqs/mapping b/crates/uv-analyze/src/pipreqs/mapping new file mode 100644 index 000000000..8edacdd6d --- /dev/null +++ b/crates/uv-analyze/src/pipreqs/mapping @@ -0,0 +1,1156 @@ +AFQ:pyAFQ +AG_fft_tools:agpy +ANSI:pexpect +Adafruit:Adafruit_Libraries +App:Zope2 +Asterisk:py_Asterisk +BB_jekyll_hook:bitbucket_jekyll_hook +Banzai:Banzai_NGS +BeautifulSoupTests:BeautifulSoup +BioSQL:biopython +BuildbotStatusShields:BuildbotEightStatusShields +ComputedAttribute:ExtensionClass +constraint:python-constraint +Crypto:pycryptodome +Cryptodome:pycryptodomex +FSM:pexpect +FiftyOneDegrees:51degrees_mobile_detector_v3_wrapper +functional:pyfunctional +GeoBaseMain:GeoBasesDev +GeoBases:GeoBasesDev +Globals:Zope2 +HelpSys:Zope2 +IPython:ipython +Kittens:astro_kittens +Levenshtein:python_Levenshtein +Lifetime:Zope2 +MethodObject:ExtensionClass +MySQLdb:MySQL-python +OFS:Zope2 +OpenGL:PyOpenGL +OpenSSL:pyOpenSSL +PIL:Pillow +Products:Zope2 +PyWCSTools:astLib +Pyxides:astro_pyxis +QtCore:PySide +S3:s3cmd +SCons:pystick +speech_recognition:SpeechRecognition +Shared:Zope2 +Signals:Zope2 +Stemmer:PyStemmer +Testing:Zope2 +TopZooTools:topzootools +TreeDisplay:DocumentTemplate +WorkingWithDocumentConversion:aspose_pdf_java_for_python +ZPublisher:Zope2 +ZServer:Zope2 +ZTUtils:Zope2 +aadb:auto_adjust_display_brightness +abakaffe:abakaffe_cli +abiosgaming:abiosgaming.py +abiquo:abiquo_api +abl:abl.cssprocessor +abl:abl.robot +abl:abl.util +abl:abl.vpath +abo:abo_generator +abris_transform:abris +abstract:abstract.jwrotator +abu:abu.admin +ac_flask:AC_Flask_HipChat +acg:anikom15 +acme:acme.dchat +acme:acme.hello +acted:acted.projects +action:ActionServer +actionbar:actionbar.panel +activehomed:afn +activepapers:ActivePapers.Py +address_book:address_book_lansry +adi:adi.commons +adi:adi.devgen +adi:adi.fullscreen +adi:adi.init +adi:adi.playlist +adi:adi.samplecontent +adi:adi.slickstyle +adi:adi.suite +adi:adi.trash +adict:aDict2 +aditam:aditam.agent +aditam:aditam.core +adiumsh:adium_sh +adjector:AdjectorClient +adjector:AdjectorTracPlugin +adkit:Banner_Ad_Toolkit +admin_tools:django_admin_tools +adminishcategories:adminish_categories +adminsortable:django_admin_sortable +adspygoogle:adspygoogle.adwords +advancedcaching:agtl +adytum:Adytum_PyMonitor +affinitic:affinitic.docpyflakes +affinitic:affinitic.recipe.fakezope2eggs +affinitic:affinitic.simplecookiecuttr +affinitic:affinitic.verifyinterface +affinitic:affinitic.zamqp +afpy:afpy.xap +agatesql:agate_sql +ageliaco:ageliaco.recipe.csvconfig +agent_http:agent.http +agora:Agora_Client +agora:Agora_Fountain +agora:Agora_Fragment +agora:Agora_Planner +agora:Agora_Service_Provider +agoraplex:agoraplex.themes.sphinx +agsci:agsci.blognewsletter +agx:agx.core +agx:agx.dev +agx:agx.generator.buildout +agx:agx.generator.dexterity +agx:agx.generator.generator +agx:agx.generator.plone +agx:agx.generator.pyegg +agx:agx.generator.sql +agx:agx.generator.uml +agx:agx.generator.zca +agx:agx.transform.uml2fs +agx:agx.transform.xmi2uml +aimes:aimes.bundle +aimes:aimes.skeleton +aio:aio.app +aio:aio.config +aio:aio.core +aio:aio.signals +aiohs2:aio_hs2 +aioroutes:aio_routes +aios3:aio_s3 +airbrake:airbrake_flask +airship:airship_icloud +airship:airship_steamcloud +airflow:apache-airflow +akamai:edgegrid_python +alation:alation_api +alba_client:alba_client_python +alburnum:alburnum_maas_client +alchemist:alchemist.audit +alchemist:alchemist.security +alchemist:alchemist.traversal +alchemist:alchemist.ui +alchemyapi:alchemyapi_python +alerta:alerta_server +alexandria_upload:Alexandria_Upload_Utils +alibaba:alibaba_python_sdk +aliyun:aliyun_python_sdk +aliyuncli:alicloudcli +aliyunsdkacs:aliyun_python_sdk_acs +aliyunsdkbatchcompute:aliyun_python_sdk_batchcompute +aliyunsdkbsn:aliyun_python_sdk_bsn +aliyunsdkbss:aliyun_python_sdk_bss +aliyunsdkcdn:aliyun_python_sdk_cdn +aliyunsdkcms:aliyun_python_sdk_cms +aliyunsdkcore:aliyun_python_sdk_core +aliyunsdkcrm:aliyun_python_sdk_crm +aliyunsdkcs:aliyun_python_sdk_cs +aliyunsdkdrds:aliyun_python_sdk_drds +aliyunsdkecs:aliyun_python_sdk_ecs +aliyunsdkess:aliyun_python_sdk_ess +aliyunsdkft:aliyun_python_sdk_ft +aliyunsdkmts:aliyun_python_sdk_mts +aliyunsdkocs:aliyun_python_sdk_ocs +aliyunsdkoms:aliyun_python_sdk_oms +aliyunsdkossadmin:aliyun_python_sdk_ossadmin +aliyunsdkr-kvstore:aliyun_python_sdk_r_kvstore +aliyunsdkram:aliyun_python_sdk_ram +aliyunsdkrds:aliyun_python_sdk_rds +aliyunsdkrisk:aliyun_python_sdk_risk +aliyunsdkros:aliyun_python_sdk_ros +aliyunsdkslb:aliyun_python_sdk_slb +aliyunsdksts:aliyun_python_sdk_sts +aliyunsdkubsms:aliyun_python_sdk_ubsms +aliyunsdkyundun:aliyun_python_sdk_yundun +allattachments:AllAttachmentsMacro +allocine:allocine_wrapper +allowedsites:django_allowedsites +alm:alm.solrindex +aloft:aloft.py +alpacalib:alpaca +alphabetic:alphabetic_simple +alphasms:alphasms_client +altered:altered.states +alterootheme:alterootheme.busycity +alterootheme:alterootheme.intensesimplicity +alterootheme:alterootheme.lazydays +alurinium:alurinium_image_processing +alxlib:alx +amara3:amara3_iri +amara3:amara3_xml +amazon:AmazonAPIWrapper +amazon:python_amazon_simple_product_api +ambikesh1349-1:ambikesh1349_1 +ambilight:AmbilightParty +amifs:amifs_core +amiorganizer:ami_organizer +amitu:amitu.lipy +amitu:amitu_putils +amitu:amitu_websocket_client +amitu:amitu_zutils +amltlearn:AMLT_learn +amocrm:amocrm_api +amqpdispatcher:amqp_dispatcher +amqpstorm:AMQP_Storm +analytics:analytics_python +analyzedir:AnalyzeDirectory +ancientsolutions:ancientsolutions_crypttools +anderson_paginator:anderson.paginator +android_clean_app:android_resource_remover +anel_power_control:AnelPowerControl +angus:angus_sdk_python +annalist_root:Annalist +annogesiclib:ANNOgesic +ansible-role-apply:ansible_role_apply +ansibledebugger:ansible_playbook_debugger +ansibledocgen:ansible_docgen +ansibleflow:ansible_flow +ansibleinventorygrapher:ansible_inventory_grapher +ansiblelint:ansible_lint +ansiblerolesgraph:ansible_roles_graph +ansibletools:ansible_tools +anthill:anthill.exampletheme +anthill:anthill.skinner +anthill:anthill.tal.macrorenderer +anthrax:AnthraxDojoFrontend +anthrax:AnthraxHTMLInput +anthrax:AnthraxImage +antisphinx:antiweb +antispoofing:antispoofing.evaluation +antlr4:antlr4_python2_runtime +antlr4:antlr4_python3_runtime +antlr4:antlr4_python_alt +anybox:anybox.buildbot.openerp +anybox:anybox.nose.odoo +anybox:anybox.paster.odoo +anybox:anybox.paster.openerp +anybox:anybox.recipe.sysdeps +anybox:anybox.scripts.odoo +apiclient:google_api_python_client +apitools:google_apitools +apm:arpm +app_data:django_appdata +appconf:django_appconf +appd:AppDynamicsDownloader +appd:AppDynamicsREST +appdynamics_bindeps:appdynamics_bindeps_linux_x64 +appdynamics_bindeps:appdynamics_bindeps_linux_x86 +appdynamics_bindeps:appdynamics_bindeps_osx_x64 +appdynamics_proxysupport:appdynamics_proxysupport_linux_x64 +appdynamics_proxysupport:appdynamics_proxysupport_linux_x86 +appdynamics_proxysupport:appdynamics_proxysupport_osx_x64 +appium:Appium_Python_Client +appliapps:applibase +appserver:broadwick +archetypes:archetypes.kss +archetypes:archetypes.multilingual +archetypes:archetypes.schemaextender +arm:ansible_role_manager +armor:armor_api +armstrong:armstrong.apps.related_content +armstrong:armstrong.apps.series +armstrong:armstrong.cli +armstrong:armstrong.core.arm_access +armstrong:armstrong.core.arm_layout +armstrong:armstrong.core.arm_sections +armstrong:armstrong.core.arm_wells +armstrong:armstrong.dev +armstrong:armstrong.esi +armstrong:armstrong.hatband +armstrong:armstrong.templates.standard +armstrong:armstrong.utils.backends +armstrong:armstrong.utils.celery +arstecnica:arstecnica.raccoon.autobahn +arstecnica:arstecnica.sqlalchemy.async +article-downloader:article_downloader +artifactcli:artifact_cli +arvados:arvados_python_client +arvados_cwl:arvados_cwl_runner +arvnodeman:arvados_node_manager +asana_to_github:AsanaToGithub +asciibinary:AsciiBinaryConverter +asd:AdvancedSearchDiscovery +askbot:askbot_tuan +askbot:askbot_tuanpa +asnhistory:asnhistory_redis +aspen_jinja2_renderer:aspen_jinja2 +aspen_tornado_engine:aspen_tornado +asprise_ocr_api:asprise_ocr_sdk_python_api +aspy:aspy.refactor_imports +aspy:aspy.yaml +asterisk:asterisk_ami +asts:add_asts +asymmetricbase:asymmetricbase.enum +asymmetricbase:asymmetricbase.fields +asymmetricbase:asymmetricbase.logging +asymmetricbase:asymmetricbase.utils +asyncirc:asyncio_irc +asyncmongoorm:asyncmongoorm_je +asyncssh:asyncssh_unofficial +athletelist:athletelistyy +atm:automium +atmosphere:atmosphere_python_client +atom:gdata +atomic:AtomicWrite +atomisator:atomisator.db +atomisator:atomisator.enhancers +atomisator:atomisator.feed +atomisator:atomisator.indexer +atomisator:atomisator.outputs +atomisator:atomisator.parser +atomisator:atomisator.readers +atreal:atreal.cmfeditions.unlocker +atreal:atreal.filestorage.common +atreal:atreal.layouts +atreal:atreal.mailservices +atreal:atreal.massloader +atreal:atreal.monkeyplone +atreal:atreal.override.albumview +atreal:atreal.richfile.preview +atreal:atreal.richfile.qualifier +atreal:atreal.usersinout +atsim:atsim.potentials +attractsdk:attract_sdk +audio:audio.bitstream +audio:audio.coders +audio:audio.filters +audio:audio.fourier +audio:audio.frames +audio:audio.lp +audio:audio.psychoacoustics +audio:audio.quantizers +audio:audio.shrink +audio:audio.wave +aufrefer:auf_refer +auslfe:auslfe.formonline.content +auspost:auspost_apis +auth0:auth0_python +auth_server_client:AuthServerClient +authorize:AuthorizeSauce +authzpolicy:AuthzPolicyPlugin +autobahn:autobahn_rce +avatar:geonode_avatar +awebview:android_webview +azure:azure_common +azure:azure_mgmt_common +azure:azure_mgmt_compute +azure:azure_mgmt_network +azure:azure_mgmt_nspkg +azure:azure_mgmt_resource +azure:azure_mgmt_storage +azure:azure_nspkg +azure:azure_servicebus +azure:azure_servicemanagement_legacy +azure:azure_storage +b2gcommands:b2g_commands +b2gperf:b2gperf_v1.3 +b2gperf:b2gperf_v1.4 +b2gperf:b2gperf_v2.0 +b2gperf:b2gperf_v2.1 +b2gperf:b2gperf_v2.2 +b2gpopulate:b2gpopulate_v1.3 +b2gpopulate:b2gpopulate_v1.4 +b2gpopulate:b2gpopulate_v2.0 +b2gpopulate:b2gpopulate_v2.1 +b2gpopulate:b2gpopulate_v2.2 +b3j0f:b3j0f.annotation +b3j0f:b3j0f.aop +b3j0f:b3j0f.conf +b3j0f:b3j0f.sync +b3j0f:b3j0f.utils +babel:Babel +babelglade:BabelGladeExtractor +backplane:backplane2_pyclient +backport_abcoll:backport_collections +backports:backports.functools_lru_cache +backports:backports.inspect +backports:backports.pbkdf2 +backports:backports.shutil_get_terminal_size +backports:backports.socketpair +backports:backports.ssl +backports:backports.ssl_match_hostname +backports:backports.statistics +badgekit:badgekit_api_client +badlinks:BadLinksPlugin +bael:bael.project +baidu:baidupy +balrog:buildtools +baluhn:baluhn_redux +bamboo:bamboo.pantrybell +bamboo:bamboo.scaffold +bamboo:bamboo.setuptools_version +bamboo:bamboo_data +bamboo:bamboo_server +bambu:bambu_codemirror +bambu:bambu_dataportability +bambu:bambu_enqueue +bambu:bambu_faq +bambu:bambu_ffmpeg +bambu:bambu_grids +bambu:bambu_international +bambu:bambu_jwplayer +bambu:bambu_minidetect +bambu:bambu_navigation +bambu:bambu_notifications +bambu:bambu_payments +bambu:bambu_pusher +bambu:bambu_saas +bambu:bambu_sites +banana:Bananas +banana:banana.maya +bang:bangtext +barcode:barcode_generator +bark:bark_ssg +barking_owl:BarkingOwl +bart:bart_py +basalt:basalt_tasks +base62:base_62 +basemap:basemap_Jim +bash:bash_toolbelt +bashutils:Python_Bash_Utils +basic_http:BasicHttp +basil:basil_daq +batchapps:azure_batch_apps +bcrypt:python_bcrypt +beaker:Beaker +beetsplug:beets +begin:begins +benchit:bench_it +beproud:beproud.utils +bfillings:burrito_fillings +bigjob:BigJob +billboard:billboard.py +binstar_build_client:anaconda_build +binstar_client:anaconda_client +biocommons:biocommons.dev +birdhousebuilder:birdhousebuilder.recipe.conda +birdhousebuilder:birdhousebuilder.recipe.docker +birdhousebuilder:birdhousebuilder.recipe.redis +birdhousebuilder:birdhousebuilder.recipe.supervisor +blender26-meshio:pymeshio +bootstrap:BigJob +borg:borg.localrole +bow:bagofwords +bpdb:bpython +bqapi:bisque_api +braces:django_braces +briefscaster:briefs_caster +brisa_media_server/plugins:brisa_media_server_plugins +brkt_requests:brkt_sdk +broadcastlogging:broadcast_logging +brocadetool:brocade_tool +bronto:bronto_python +brownie:Brownie +browsermobproxy:browsermob_proxy +brubeckmysql:brubeck_mysql +brubeckoauth:brubeck_oauth +brubeckservice:brubeck_service +brubeckuploader:brubeck_uploader +bs4:beautifulsoup4 +bson:pymongo +bst:bst.pygasus.core +bst:bst.pygasus.datamanager +bst:bst.pygasus.demo +bst:bst.pygasus.i18n +bst:bst.pygasus.resources +bst:bst.pygasus.scaffolding +bst:bst.pygasus.security +bst:bst.pygasus.session +bst:bst.pygasus.wsgi +btable:btable_py +btapi:bananatag_api +btceapi:btce_api +btcebot:btce_bot +btsync:btsync.py +buck:buck.pprint +bud:bud.nospam +budy:budy_api +buffer:buffer_alpaca +buggd:bug.gd +bugle:bugle_sites +bugspots:bug_spots +bugzilla:python_bugzilla +bugzscout:bugzscout_py +buildTools:ajk_ios_buildTools +buildnotifylib:BuildNotify +buildout:buildout.bootstrap +buildout:buildout.disablessl +buildout:buildout.dumppickedversions +buildout:buildout.dumppickedversions2 +buildout:buildout.dumprequirements +buildout:buildout.eggnest +buildout:buildout.eggscleaner +buildout:buildout.eggsdirectories +buildout:buildout.eggtractor +buildout:buildout.extensionscripts +buildout:buildout.locallib +buildout:buildout.packagename +buildout:buildout.recipe.isolation +buildout:buildout.removeaddledeggs +buildout:buildout.requirements +buildout:buildout.sanitycheck +buildout:buildout.sendpickedversions +buildout:buildout.threatlevel +buildout:buildout.umask +buildout:buildout.variables +buildslave:buildbot_slave +builtins:pies2overrides +bumper:bumper_lib +bumple:bumple_downloader +bundesliga:bundesliga_cli +bundlemaker:bundlemanager +burpui:burp_ui +busyflow:busyflow.pivotal +buttercms-django:buttercms_django +buzz:buzz_python_client +bvc:buildout_versions_checker +bvggrabber:bvg_grabber +byond:BYONDTools +bzETL:Bugzilla_ETL +bzlib:bugzillatools +bzrlib:bzr +bzrlib:bzr_automirror +bzrlib:bzr_bash_completion +bzrlib:bzr_colo +bzrlib:bzr_killtrailing +bzrlib:bzr_pqm +c2c:c2c.cssmin +c2c:c2c.recipe.closurecompile +c2c:c2c.recipe.cssmin +c2c:c2c.recipe.jarfile +c2c:c2c.recipe.msgfmt +c2c:c2c.recipe.pkgversions +c2c:c2c.sqlalchemy.rest +c2c:c2c.versions +c2c_recipe_facts:c2c.recipe.facts +cabalgata:cabalgata_silla_de_montar +cabalgata:cabalgata_zookeeper +cache_utils:django_cache_utils +captcha:django_recaptcha +cartridge:Cartridge +cassandra:cassandra_driver +cassandralauncher:CassandraLauncher +cc42:42qucc +cerberus:Cerberus +cfnlint:cfn-lint +chameleon:Chameleon +charmtools:charm_tools +chef:PyChef +chip8:c8d +cjson:python_cjson +classytags:django_classy_tags +cloghandler:ConcurrentLogHandler +clonevirtualenv:virtualenv_clone +cloud-insight:al_cloudinsight +cloud_admin:adminapi +cloudservers:python_cloudservers +clusterconsole:cerebrod +clustersitter:cerebrod +cms:django_cms +colander:ba_colander +colors:ansicolors +compile:bf_lc3 +compose:docker_compose +compressor:django_compressor +concurrent:futures +configargparse:ConfigArgParse +configparser:pies2overrides +contracts:PyContracts +coordination:BigJob +copyreg:pies2overrides +corebio:weblogo +couchapp:Couchapp +couchdb:CouchDB +couchdbcurl:couchdb_python_curl +courseradownloader:coursera_dl +cow:cow_framework +creole:python_creole +creoleparser:Creoleparser +crispy_forms:django_crispy_forms +cronlog:python_crontab +crontab:python_crontab +ctff:tff +cups:pycups +curator:elasticsearch_curator +curl:pycurl +cv2:opencv-python +daemon:python_daemon +dare:DARE +dateutil:python_dateutil +dawg:DAWG +deb822:python_debian +debian:python_debian +decouple:python-decouple +demo:webunit +demosongs:PySynth +deployer:juju_deployer +depot:filedepot +devtools:tg.devtools +dgis:2gis +dhtmlparser:pyDHTMLParser +digitalocean:python_digitalocean +discord:discord.py +distribute_setup:ez_setup +distutils2:Distutils2 +django:Django +django_hstore:amitu_hstore +djangobower:django_bower +djcelery:django_celery +djkombu:django_kombu +djorm_pgarray:djorm_ext_pgarray +dns:dnspython +docgen:ansible_docgenerator +docker:docker_py +dogpile:dogpile.cache +dogpile:dogpile.core +dogshell:dogapi +dot_parser:pydot +dot_parser:pydot2 +dot_parser:pydot3k +dotenv:python-dotenv +dpkt:dpkt_fix +dsml:python_ldap +durationfield:django_durationfield +dzclient:datazilla +easybuild:easybuild_framework +editor:python_editor +elasticluster:azure_elasticluster +elasticluster:azure_elasticluster_current +elftools:pyelftools +elixir:Elixir +em:empy +emlib:empy +enchant:pyenchant +encutils:cssutils +engineio:python_engineio +enum:enum34 +ephem:pyephem +errorreporter:abl.errorreporter +esplot:beaker_es_plot +example:adrest +examples:tweepy +ez_setup:pycassa +fabfile:Fabric +fabric:Fabric +faker:Faker +fdpexpect:pexpect +fedora:python_fedora +fias:ailove_django_fias +fiftyone_degrees:51degrees_mobile_detector +five:five.customerize +five:five.globalrequest +five:five.intid +five:five.localsitemanager +five:five.pt +flasher:android_flasher +flask:Flask +flask_frozen:Frozen_Flask +flask_redis:Flask_And_Redis +flaskext:Flask_Bcrypt +flvscreen:vnc2flv +followit:django_followit +forge:pyforge +formencode:FormEncode +formtools:django_formtools +fourch:4ch +franz:allegrordf +freetype:freetype_py +frontmatter:python_frontmatter +ftpcloudfs:ftp_cloudfs +funtests:librabbitmq +fuse:fusepy +fuzzy:Fuzzy +gabbi:tiddlyweb +gen_3dwallet:3d_wallet_generator +gendimen:android_gendimen +genshi:Genshi +geohash:python_geohash +geonode:GeoNode +geoserver:gsconfig +geraldo:Geraldo +getenv:django_getenv +geventwebsocket:gevent_websocket +gflags:python_gflags +git:GitPython +github:PyGithub +github3:github3.py +gitpy:git_py +globusonline:globusonline_transfer_api_client +google:protobuf +googleapiclient:google_api_python_client +grace-dizmo:grace_dizmo +grammar:anovelmous_grammar +grapheneapi:graphenelib +greplin:scales +gridfs:pymongo +grokcore:grokcore.component +gslib:gsutil +hamcrest:PyHamcrest +harpy:HARPy +hawk:PyHawk_with_a_single_extra_commit +haystack:django_haystack +hgext:mercurial +hggit:hg_git +hglib:python_hglib +ho:pisa +hola:amarokHola +hoover:Hoover +hostlist:python_hostlist +html:pies2overrides +htmloutput:nosehtmloutput +http:pies2overrides +hvad:django_hvad +hydra:hydra-core +i99fix:199Fix +igraph:python_igraph +imdb:IMDbPY +impala:impyla +inmemorystorage:ambition_inmemorystorage +ipaddress:backport_ipaddress +jaraco:jaraco.timing +jaraco:jaraco.util +jinja2:Jinja2 +jiracli:jira_cli +johnny:johnny_cache +jose:python_jose +jpgrid:python_geohash +jpiarea:python_geohash +jpype:JPype1 +jpypex:JPype1 +jsonfield:django_jsonfield +jstools:aino_jstools +jupyterpip:jupyter_pip +jwt:PyJWT +kazoo:asana_kazoo +kernprof:line_profiler +keyczar:python_keyczar +keyedcache:django_keyedcache +keystoneclient:python_keystoneclient +kickstarter:kickstart +krbv:krbV +kss:kss.core +kuyruk:Kuyruk +langconv:AdvancedLangConv +lava:lava_utils_interface +lazr:lazr.authentication +lazr:lazr.restfulclient +lazr:lazr.uri +ldap:python_ldap +ldaplib:adpasswd +ldapurl:python_ldap +ldif:python_ldap +lib2or3:2or3 +lib3to2:3to2 +libaito:Aito +libbe:bugs_everywhere +libbucket:bucket +libcloud:apache_libcloud +libfuturize:future +libgenerateDS:generateDS +libmproxy:mitmproxy +libpasteurize:future +libsvm:7lk_ocr_deploy +lisa:lisa_server +loadingandsaving:aspose_words_java_for_python +locust:locustio +logbook:Logbook +logentries:buildbot_status_logentries +logilab:logilab_mtconverter +machineconsole:cerebrod +machinesitter:cerebrod +magic:python_magic +mako:Mako +manifestparser:ManifestDestiny +marionette:marionette_client +markdown:Markdown +marks:pytest_marks +markupsafe:MarkupSafe +mavnative:pymavlink +memcache:python_memcached +metacomm:AllPairs +metaphone:Metafone +metlog:metlog_py +mezzanine:Mezzanine +migrate:sqlalchemy_migrate +mimeparse:python_mimeparse +minitage:minitage.paste +minitage:minitage.recipe.common +missingdrawables:android_missingdrawables +mixfiles:PySynth +mkfreq:PySynth +mkrst_themes:2lazy2rest +mockredis:mockredispy +modargs:python_modargs +model_utils:django_model_utils +models:asposebarcode +models:asposestorage +moksha:moksha.common +moksha:moksha.hub +moksha:moksha.wsgi +moneyed:py_moneyed +mongoalchemy:MongoAlchemy +monthdelta:MonthDelta +mopidy:Mopidy +mopytools:MoPyTools +mptt:django_mptt +mpv:python-mpv +mrbob:mr.bob +msgpack:msgpack_python +mutations:aino_mutations +mws:amazon_mws +mysql:mysql_connector_repackaged +native_tags:django_native_tags +ndg:ndg_httpsclient +nereid:trytond_nereid +nested:baojinhuan +nester:Amauri +nester:abofly +nester:bssm_pythonSig +novaclient:python_novaclient +oauth2_provider:alauda_django_oauth +oauth2client:oauth2client +odf:odfpy +ometa:Parsley +openid:python_openid +opensearchsdk:ali_opensearch +oslo_i18n:oslo.i18n +oslo_serialization:oslo.serialization +oslo_utils:oslo.utils +oss:alioss +oss:aliyun_python_sdk_oss +oss:aliyunoss +output:cashew +owslib:OWSLib +packetdiag:nwdiag +paho:paho_mqtt +paintstore:django_paintstore +parler:django_parler +past:future +paste:PasteScript +path:forked_path +path:path.py +patricia:patricia-trie +paver:Paver +peak:ProxyTypes +picasso:anderson.picasso +picklefield:django-picklefield +pilot:BigJob +pivotal:pivotal_py +play_wav:PySynth +playhouse:peewee +plivoxml:plivo +plone:plone.alterego +plone:plone.api +plone:plone.app.blob +plone:plone.app.collection +plone:plone.app.content +plone:plone.app.contentlisting +plone:plone.app.contentmenu +plone:plone.app.contentrules +plone:plone.app.contenttypes +plone:plone.app.controlpanel +plone:plone.app.customerize +plone:plone.app.dexterity +plone:plone.app.discussion +plone:plone.app.event +plone:plone.app.folder +plone:plone.app.i18n +plone:plone.app.imaging +plone:plone.app.intid +plone:plone.app.layout +plone:plone.app.linkintegrity +plone:plone.app.locales +plone:plone.app.lockingbehavior +plone:plone.app.multilingual +plone:plone.app.portlets +plone:plone.app.querystring +plone:plone.app.redirector +plone:plone.app.registry +plone:plone.app.relationfield +plone:plone.app.textfield +plone:plone.app.theming +plone:plone.app.users +plone:plone.app.uuid +plone:plone.app.versioningbehavior +plone:plone.app.viewletmanager +plone:plone.app.vocabularies +plone:plone.app.widgets +plone:plone.app.workflow +plone:plone.app.z3cform +plone:plone.autoform +plone:plone.batching +plone:plone.behavior +plone:plone.browserlayer +plone:plone.caching +plone:plone.contentrules +plone:plone.dexterity +plone:plone.event +plone:plone.folder +plone:plone.formwidget.namedfile +plone:plone.formwidget.recurrence +plone:plone.i18n +plone:plone.indexer +plone:plone.intelligenttext +plone:plone.keyring +plone:plone.locking +plone:plone.memoize +plone:plone.namedfile +plone:plone.outputfilters +plone:plone.portlet.collection +plone:plone.portlet.static +plone:plone.portlets +plone:plone.protect +plone:plone.recipe.zope2install +plone:plone.registry +plone:plone.resource +plone:plone.resourceeditor +plone:plone.rfc822 +plone:plone.scale +plone:plone.schema +plone:plone.schemaeditor +plone:plone.session +plone:plone.stringinterp +plone:plone.subrequest +plone:plone.supermodel +plone:plone.synchronize +plone:plone.theme +plone:plone.transformchain +plone:plone.uuid +plone:plone.z3cform +plonetheme:plonetheme.barceloneta +png:pypng +polymorphic:django_polymorphic +postmark:python_postmark +powerprompt:bash_powerprompt +prefetch:django-prefetch +printList:AndrewList +progressbar:progressbar2 +progressbar:progressbar33 +provider:django_oauth2_provider +puresasl:pure_sasl +pwiz:peewee +pxssh:pexpect +py7zlib:pylzma +pyAMI:pyAMI_core +pyarsespyder:arsespyder +pyasdf:asdf +pyaspell:aspell_python_ctypes +pybb:pybbm +pybloomfilter:pybloomfiltermmap +pyccuracy:Pyccuracy +pyck:PyCK +pycrfsuite:python_crfsuite +pydispatch:PyDispatcher +pygeolib:pygeocoder +pygments:Pygments +pygraph:python_graph_core +pyjon:pyjon.utils +pyjsonrpc:python_jsonrpc +pykka:Pykka +pylogo:PyLogo +pylons:adhocracy_Pylons +pymagic:libmagic +pymycraawler:Amalwebcrawler +pynma:AbakaffeNotifier +pyphen:Pyphen +pyrimaa:AEI +pysideuic:PySide +pysqlite2:adhocracy_pysqlite +pysqlite2:pysqlite +pysynth_b:PySynth +pysynth_beeper:PySynth +pysynth_c:PySynth +pysynth_d:PySynth +pysynth_e:PySynth +pysynth_p:PySynth +pysynth_s:PySynth +pysynth_samp:PySynth +pythongettext:python_gettext +pythonjsonlogger:python_json_logger +pyutilib:PyUtilib +pywintypes:pywin32 +pyximport:Cython +qs:qserve +quadtree:python_geohash +queue:future +quickapi:django_quickapi +quickunit:nose_quickunit +rackdiag:nwdiag +radical:radical.pilot +radical:radical.utils +reStructuredText:Zope2 +readability:readability_lxml +readline:gnureadline +recaptcha_works:django_recaptcha_works +relstorage:RelStorage +reportapi:django_reportapi +reprlib:pies2overrides +requests:Requests +requirements:requirements_parser +rest_framework:djangorestframework +restclient:py_restclient +retrial:async_retrial +reversion:django_reversion +rhaptos2:rhaptos2.common +robot:robotframework +robots:django_robots +rosdep2:rosdep +rsbackends:RSFile +ruamel:ruamel.base +s2repoze:pysaml2 +saga:saga_python +saml2:pysaml2 +samtranslator:aws-sam-translator +sass:libsass +sassc:libsass +sasstests:libsass +sassutils:libsass +sayhi:alex_sayhi +scalrtools:scalr +scikits:scikits.talkbox +scratch:scratchpy +screen:pexpect +scss:pyScss +sdict:dict.sorted +sdk_updater:android_sdk_updater +sekizai:django_sekizai +sendfile:pysendfile +serial:pyserial +setuputils:astor +shapefile:pyshp +shapely:Shapely +sika:ahonya_sika +singleton:pysingleton +sittercommon:cerebrod +skbio:scikit_bio +sklearn:scikit_learn +slack:slackclient +slugify:unicode_slugify +slugify:python-slugify +smarkets:smk_python_sdk +snappy:ctypes_snappy +socketio:python-socketio +socketserver:pies2overrides +sockjs:sockjs_tornado +socks:SocksiPy_branch +solr:solrpy +solution:Solution +sorl:sorl_thumbnail +south:South +sphinx:Sphinx +sphinx_pypi_upload:ATD_document +sphinxcontrib:sphinxcontrib_programoutput +sqlalchemy:SQLAlchemy +src:atlas +src:auto_mix_prep +stats_toolkit:bw_stats_toolkit +statsd:dogstatsd_python +stdnum:python_stdnum +stoneagehtml:StoneageHTML +storages:django_storages +stubout:mox +suds:suds_jurko +swiftclient:python_swiftclient +sx:pisa +tabix:pytabix +taggit:django_taggit +tasksitter:cerebrod +tastypie:django_tastypie +teamcity:teamcity_messages +telebot:pyTelegramBotAPI +telegram:python-telegram-bot +tempita:Tempita +tenjin:Tenjin +termstyle:python_termstyle +test:pytabix +thclient:treeherder_client +threaded_multihost:django_threaded_multihost +threecolor:3color_Press +tidylib:pytidylib +tkinter:future +tlw:3lwg +toredis:toredis_fork +tornadoredis:tornado_redis +tower_cli:ansible_tower_cli +trac:Trac +tracopt:Trac +translation_helper:android_localization_helper +treebeard:django_treebeard +trytond:trytond_stock +tsuru:tsuru_circus +tvrage:python_tvrage +tw2:tw2.core +tw2:tw2.d3 +tw2:tw2.dynforms +tw2:tw2.excanvas +tw2:tw2.forms +tw2:tw2.jit +tw2:tw2.jqplugins.flot +tw2:tw2.jqplugins.gritter +tw2:tw2.jqplugins.ui +tw2:tw2.jquery +tw2:tw2.sqla +twisted:Twisted +twitter:python_twitter +txclib:transifex_client +u115:115wangpan +unidecode:Unidecode +universe:ansible_universe +usb:pyusb +useless:useless.pipes +userpass:auth_userpass +utilities:automakesetup.py +utkik:aino_utkik +uwsgidecorators:uWSGI +valentine:ab +validate:configobj +version:chartio +virtualenvapi:ar_virtualenv_api +vyatta:brocade_plugins +webdav:Zope2 +weblogolib:weblogo +webob:WebOb +websocket:websocket_client +webtest:WebTest +werkzeug:Werkzeug +wheezy:wheezy.caching +wheezy:wheezy.core +wheezy:wheezy.http +wikklytext:tiddlywebwiki +winreg:future +winrm:pywinrm +workflow:Alfred_Workflow +wsmeext:WSME +wtforms:WTForms +wtfpeewee:wtf_peewee +xdg:pyxdg +xdist:pytest_xdist +xmldsig:pysaml2 +xmlenc:pysaml2 +xmlrpc:pies2overrides +xmpp:xmpppy +xstatic:XStatic_Font_Awesome +xstatic:XStatic_jQuery +xstatic:XStatic_jquery_ui +yaml:PyYAML +z3c:z3c.autoinclude +z3c:z3c.caching +z3c:z3c.form +z3c:z3c.formwidget.query +z3c:z3c.objpath +z3c:z3c.pt +z3c:z3c.relationfield +z3c:z3c.traverser +z3c:z3c.zcmlhook +zmq:pyzmq +zopyx:zopyx.textindexng3 diff --git a/crates/uv-analyze/src/pipreqs/stdlib b/crates/uv-analyze/src/pipreqs/stdlib new file mode 100644 index 000000000..ec03d2594 --- /dev/null +++ b/crates/uv-analyze/src/pipreqs/stdlib @@ -0,0 +1,1785 @@ +_abc +abc +aifc +_aix_support +antigravity +argparse +array +_ast +ast +asynchat +_asyncio +asyncio +asyncio.base_events +asyncio.base_futures +asyncio.base_subprocess +asyncio.base_tasks +asyncio.constants +asyncio.coroutines +asyncio.events +asyncio.exceptions +asyncio.format_helpers +asyncio.futures +asyncio.locks +asyncio.log +asyncio.__main__ +asyncio.proactor_events +asyncio.protocols +asyncio.queues +asyncio.runners +asyncio.selector_events +asyncio.sslproto +asyncio.staggered +asyncio.streams +asyncio.subprocess +asyncio.tasks +asyncio.threads +asyncio.transports +asyncio.trsock +asyncio.unix_events +asyncio.windows_events +asyncio.windows_utils +asyncore +atexit +audioop +base64 +bdb +binascii +binhex +_bisect +bisect +_blake2 +_bootlocale +_bootsubprocess +builtins +_bz2 +bz2 +calendar +cgi +cgitb +chunk +cmath +cmd +code +_codecs +codecs +_codecs_cn +_codecs_hk +_codecs_iso2022 +_codecs_jp +_codecs_kr +_codecs_tw +codeop +_collections +collections +_collections_abc +collections.abc +colorsys +_compat_pickle +compileall +_compression +concurrent +concurrent.futures +concurrent.futures._base +concurrent.futures.process +concurrent.futures.thread +configparser +contextlib +_contextvars +contextvars +copy +copyreg +cProfile +_crypt +crypt +_csv +csv +_ctypes +ctypes +ctypes._aix +ctypes._endian +ctypes.macholib +ctypes.macholib.dyld +ctypes.macholib.dylib +ctypes.macholib.framework +_ctypes_test +ctypes.test +ctypes.test.__main__ +ctypes.test.test_anon +ctypes.test.test_array_in_pointer +ctypes.test.test_arrays +ctypes.test.test_as_parameter +ctypes.test.test_bitfields +ctypes.test.test_buffers +ctypes.test.test_bytes +ctypes.test.test_byteswap +ctypes.test.test_callbacks +ctypes.test.test_cast +ctypes.test.test_cfuncs +ctypes.test.test_checkretval +ctypes.test.test_delattr +ctypes.test.test_errno +ctypes.test.test_find +ctypes.test.test_frombuffer +ctypes.test.test_funcptr +ctypes.test.test_functions +ctypes.test.test_incomplete +ctypes.test.test_init +ctypes.test.test_internals +ctypes.test.test_keeprefs +ctypes.test.test_libc +ctypes.test.test_loading +ctypes.test.test_macholib +ctypes.test.test_memfunctions +ctypes.test.test_numbers +ctypes.test.test_objects +ctypes.test.test_parameters +ctypes.test.test_pep3118 +ctypes.test.test_pickling +ctypes.test.test_pointers +ctypes.test.test_prototypes +ctypes.test.test_python_api +ctypes.test.test_random_things +ctypes.test.test_refcounts +ctypes.test.test_repr +ctypes.test.test_returnfuncptrs +ctypes.test.test_simplesubclasses +ctypes.test.test_sizes +ctypes.test.test_slicing +ctypes.test.test_stringptr +ctypes.test.test_strings +ctypes.test.test_struct_fields +ctypes.test.test_structures +ctypes.test.test_unaligned_structures +ctypes.test.test_unicode +ctypes.test.test_values +ctypes.test.test_varsize_struct +ctypes.test.test_win32 +ctypes.test.test_wintypes +ctypes.util +ctypes.wintypes +_curses +curses +curses.ascii +curses.has_key +_curses_panel +curses.panel +curses.textpad +dataclasses +_datetime +datetime +_dbm +dbm +dbm.dumb +dbm.gnu +dbm.ndbm +_decimal +decimal +difflib +dis +distutils +distutils.archive_util +distutils.bcppcompiler +distutils.ccompiler +distutils.cmd +distutils.command +distutils.command.bdist +distutils.command.bdist_dumb +distutils.command.bdist_msi +distutils.command.bdist_packager +distutils.command.bdist_rpm +distutils.command.bdist_wininst +distutils.command.build +distutils.command.build_clib +distutils.command.build_ext +distutils.command.build_py +distutils.command.build_scripts +distutils.command.check +distutils.command.clean +distutils.command.config +distutils.command.install +distutils.command.install_data +distutils.command.install_egg_info +distutils.command.install_headers +distutils.command.install_lib +distutils.command.install_scripts +distutils.command.register +distutils.command.sdist +distutils.command.upload +distutils.config +distutils.core +distutils.cygwinccompiler +distutils.debug +distutils.dep_util +distutils.dir_util +distutils.dist +distutils.errors +distutils.extension +distutils.fancy_getopt +distutils.filelist +distutils.file_util +distutils.log +distutils.msvc9compiler +distutils._msvccompiler +distutils.msvccompiler +distutils.spawn +distutils.sysconfig +distutils.tests +distutils.tests.support +distutils.tests.test_archive_util +distutils.tests.test_bdist +distutils.tests.test_bdist_dumb +distutils.tests.test_bdist_msi +distutils.tests.test_bdist_rpm +distutils.tests.test_bdist_wininst +distutils.tests.test_build +distutils.tests.test_build_clib +distutils.tests.test_build_ext +distutils.tests.test_build_py +distutils.tests.test_build_scripts +distutils.tests.test_check +distutils.tests.test_clean +distutils.tests.test_cmd +distutils.tests.test_config +distutils.tests.test_config_cmd +distutils.tests.test_core +distutils.tests.test_cygwinccompiler +distutils.tests.test_dep_util +distutils.tests.test_dir_util +distutils.tests.test_dist +distutils.tests.test_extension +distutils.tests.test_filelist +distutils.tests.test_file_util +distutils.tests.test_install +distutils.tests.test_install_data +distutils.tests.test_install_headers +distutils.tests.test_install_lib +distutils.tests.test_install_scripts +distutils.tests.test_log +distutils.tests.test_msvc9compiler +distutils.tests.test_msvccompiler +distutils.tests.test_register +distutils.tests.test_sdist +distutils.tests.test_spawn +distutils.tests.test_sysconfig +distutils.tests.test_text_file +distutils.tests.test_unixccompiler +distutils.tests.test_upload +distutils.tests.test_util +distutils.tests.test_version +distutils.tests.test_versionpredicate +distutils.text_file +distutils.unixccompiler +distutils.util +distutils.version +distutils.versionpredicate +doctest +_dummy_thread +dummy_threading +_elementtree +email +email.base64mime +email.charset +email.contentmanager +email._encoded_words +email.encoders +email.errors +email.feedparser +email.generator +email.header +email.headerregistry +email._header_value_parser +email.iterators +email.message +email.mime +email.mime.application +email.mime.audio +email.mime.base +email.mime.image +email.mime.message +email.mime.multipart +email.mime.nonmultipart +email.mime.text +email._parseaddr +email.parser +email.policy +email._policybase +email.quoprimime +email.utils +encodings +encodings.aliases +encodings.ascii +encodings.base64_codec +encodings.big5 +encodings.big5hkscs +encodings.bz2_codec +encodings.charmap +encodings.cp037 +encodings.cp1006 +encodings.cp1026 +encodings.cp1125 +encodings.cp1140 +encodings.cp1250 +encodings.cp1251 +encodings.cp1252 +encodings.cp1253 +encodings.cp1254 +encodings.cp1255 +encodings.cp1256 +encodings.cp1257 +encodings.cp1258 +encodings.cp273 +encodings.cp424 +encodings.cp437 +encodings.cp500 +encodings.cp720 +encodings.cp737 +encodings.cp775 +encodings.cp850 +encodings.cp852 +encodings.cp855 +encodings.cp856 +encodings.cp857 +encodings.cp858 +encodings.cp860 +encodings.cp861 +encodings.cp862 +encodings.cp863 +encodings.cp864 +encodings.cp865 +encodings.cp866 +encodings.cp869 +encodings.cp874 +encodings.cp875 +encodings.cp932 +encodings.cp949 +encodings.cp950 +encodings.euc_jis_2004 +encodings.euc_jisx0213 +encodings.euc_jp +encodings.euc_kr +encodings.gb18030 +encodings.gb2312 +encodings.gbk +encodings.hex_codec +encodings.hp_roman8 +encodings.hz +encodings.idna +encodings.iso2022_jp +encodings.iso2022_jp_1 +encodings.iso2022_jp_2 +encodings.iso2022_jp_2004 +encodings.iso2022_jp_3 +encodings.iso2022_jp_ext +encodings.iso2022_kr +encodings.iso8859_1 +encodings.iso8859_10 +encodings.iso8859_11 +encodings.iso8859_13 +encodings.iso8859_14 +encodings.iso8859_15 +encodings.iso8859_16 +encodings.iso8859_2 +encodings.iso8859_3 +encodings.iso8859_4 +encodings.iso8859_5 +encodings.iso8859_6 +encodings.iso8859_7 +encodings.iso8859_8 +encodings.iso8859_9 +encodings.johab +encodings.koi8_r +encodings.koi8_t +encodings.koi8_u +encodings.kz1048 +encodings.latin_1 +encodings.mac_arabic +encodings.mac_centeuro +encodings.mac_croatian +encodings.mac_cyrillic +encodings.mac_farsi +encodings.mac_greek +encodings.mac_iceland +encodings.mac_latin2 +encodings.mac_roman +encodings.mac_romanian +encodings.mac_turkish +encodings.mbcs +encodings.oem +encodings.palmos +encodings.ptcp154 +encodings.punycode +encodings.quopri_codec +encodings.raw_unicode_escape +encodings.rot_13 +encodings.shift_jis +encodings.shift_jis_2004 +encodings.shift_jisx0213 +encodings.tis_620 +encodings.undefined +encodings.unicode_escape +encodings.utf_16 +encodings.utf_16_be +encodings.utf_16_le +encodings.utf_32 +encodings.utf_32_be +encodings.utf_32_le +encodings.utf_7 +encodings.utf_8 +encodings.utf_8_sig +encodings.uu_codec +encodings.zlib_codec +ensurepip +ensurepip._bundled +ensurepip.__main__ +ensurepip._uninstall +enum +errno +faulthandler +fcntl +filecmp +fileinput +fnmatch +formatter +fractions +_frozen_importlib +_frozen_importlib_external +ftplib +_functools +functools +__future__ +gc +_gdbm +genericpath +getopt +getpass +gettext +glob +graphlib +grp +gzip +_hashlib +hashlib +_heapq +heapq +hmac +html +html.entities +html.parser +http +http.client +http.cookiejar +http.cookies +http.server +idlelib +idlelib.autocomplete +idlelib.autocomplete_w +idlelib.autoexpand +idlelib.browser +idlelib.calltip +idlelib.calltip_w +idlelib.codecontext +idlelib.colorizer +idlelib.config +idlelib.configdialog +idlelib.config_key +idlelib.debugger +idlelib.debugger_r +idlelib.debugobj +idlelib.debugobj_r +idlelib.delegator +idlelib.dynoption +idlelib.editor +idlelib.filelist +idlelib.format +idlelib.grep +idlelib.help +idlelib.help_about +idlelib.history +idlelib.hyperparser +idlelib.idle +idlelib.idle_test +idlelib.idle_test.htest +idlelib.idle_test.mock_idle +idlelib.idle_test.mock_tk +idlelib.idle_test.template +idlelib.idle_test.test_autocomplete +idlelib.idle_test.test_autocomplete_w +idlelib.idle_test.test_autoexpand +idlelib.idle_test.test_browser +idlelib.idle_test.test_calltip +idlelib.idle_test.test_calltip_w +idlelib.idle_test.test_codecontext +idlelib.idle_test.test_colorizer +idlelib.idle_test.test_config +idlelib.idle_test.test_configdialog +idlelib.idle_test.test_config_key +idlelib.idle_test.test_debugger +idlelib.idle_test.test_debugger_r +idlelib.idle_test.test_debugobj +idlelib.idle_test.test_debugobj_r +idlelib.idle_test.test_delegator +idlelib.idle_test.test_editmenu +idlelib.idle_test.test_editor +idlelib.idle_test.test_filelist +idlelib.idle_test.test_format +idlelib.idle_test.test_grep +idlelib.idle_test.test_help +idlelib.idle_test.test_help_about +idlelib.idle_test.test_history +idlelib.idle_test.test_hyperparser +idlelib.idle_test.test_iomenu +idlelib.idle_test.test_macosx +idlelib.idle_test.test_mainmenu +idlelib.idle_test.test_multicall +idlelib.idle_test.test_outwin +idlelib.idle_test.test_parenmatch +idlelib.idle_test.test_pathbrowser +idlelib.idle_test.test_percolator +idlelib.idle_test.test_pyparse +idlelib.idle_test.test_pyshell +idlelib.idle_test.test_query +idlelib.idle_test.test_redirector +idlelib.idle_test.test_replace +idlelib.idle_test.test_rpc +idlelib.idle_test.test_run +idlelib.idle_test.test_runscript +idlelib.idle_test.test_scrolledlist +idlelib.idle_test.test_search +idlelib.idle_test.test_searchbase +idlelib.idle_test.test_searchengine +idlelib.idle_test.test_sidebar +idlelib.idle_test.test_squeezer +idlelib.idle_test.test_stackviewer +idlelib.idle_test.test_statusbar +idlelib.idle_test.test_text +idlelib.idle_test.test_textview +idlelib.idle_test.test_tooltip +idlelib.idle_test.test_tree +idlelib.idle_test.test_undo +idlelib.idle_test.test_warning +idlelib.idle_test.test_window +idlelib.idle_test.test_zoomheight +idlelib.iomenu +idlelib.macosx +idlelib.__main__ +idlelib.mainmenu +idlelib.multicall +idlelib.outwin +idlelib.parenmatch +idlelib.pathbrowser +idlelib.percolator +idlelib.pyparse +idlelib.pyshell +idlelib.query +idlelib.redirector +idlelib.replace +idlelib.rpc +idlelib.run +idlelib.runscript +idlelib.scrolledlist +idlelib.search +idlelib.searchbase +idlelib.searchengine +idlelib.sidebar +idlelib.squeezer +idlelib.stackviewer +idlelib.statusbar +idlelib.textview +idlelib.tooltip +idlelib.tree +idlelib.undo +idlelib.window +idlelib.zoomheight +idlelib.zzdummy +imaplib +imghdr +_imp +imp +importlib +importlib.abc +importlib._bootstrap +importlib._bootstrap_external +importlib._common +importlib.machinery +importlib.metadata +importlib.resources +importlib.util +inspect +_io +io +ipaddress +itertools +_json +json +json.decoder +json.encoder +json.scanner +json.tool +keyword +lib2to3 +lib2to3.btm_matcher +lib2to3.btm_utils +lib2to3.fixer_base +lib2to3.fixer_util +lib2to3.fixes +lib2to3.fixes.fix_apply +lib2to3.fixes.fix_asserts +lib2to3.fixes.fix_basestring +lib2to3.fixes.fix_buffer +lib2to3.fixes.fix_dict +lib2to3.fixes.fix_except +lib2to3.fixes.fix_exec +lib2to3.fixes.fix_execfile +lib2to3.fixes.fix_exitfunc +lib2to3.fixes.fix_filter +lib2to3.fixes.fix_funcattrs +lib2to3.fixes.fix_future +lib2to3.fixes.fix_getcwdu +lib2to3.fixes.fix_has_key +lib2to3.fixes.fix_idioms +lib2to3.fixes.fix_import +lib2to3.fixes.fix_imports +lib2to3.fixes.fix_imports2 +lib2to3.fixes.fix_input +lib2to3.fixes.fix_intern +lib2to3.fixes.fix_isinstance +lib2to3.fixes.fix_itertools +lib2to3.fixes.fix_itertools_imports +lib2to3.fixes.fix_long +lib2to3.fixes.fix_map +lib2to3.fixes.fix_metaclass +lib2to3.fixes.fix_methodattrs +lib2to3.fixes.fix_ne +lib2to3.fixes.fix_next +lib2to3.fixes.fix_nonzero +lib2to3.fixes.fix_numliterals +lib2to3.fixes.fix_operator +lib2to3.fixes.fix_paren +lib2to3.fixes.fix_print +lib2to3.fixes.fix_raise +lib2to3.fixes.fix_raw_input +lib2to3.fixes.fix_reduce +lib2to3.fixes.fix_reload +lib2to3.fixes.fix_renames +lib2to3.fixes.fix_repr +lib2to3.fixes.fix_set_literal +lib2to3.fixes.fix_standarderror +lib2to3.fixes.fix_sys_exc +lib2to3.fixes.fix_throw +lib2to3.fixes.fix_tuple_params +lib2to3.fixes.fix_types +lib2to3.fixes.fix_unicode +lib2to3.fixes.fix_urllib +lib2to3.fixes.fix_ws_comma +lib2to3.fixes.fix_xrange +lib2to3.fixes.fix_xreadlines +lib2to3.fixes.fix_zip +lib2to3.main +lib2to3.__main__ +lib2to3.patcomp +lib2to3.pgen2 +lib2to3.pgen2.conv +lib2to3.pgen2.driver +lib2to3.pgen2.grammar +lib2to3.pgen2.literals +lib2to3.pgen2.parse +lib2to3.pgen2.pgen +lib2to3.pgen2.token +lib2to3.pgen2.tokenize +lib2to3.pygram +lib2to3.pytree +lib2to3.refactor +lib2to3.tests +lib2to3.tests.data.bom +lib2to3.tests.data.crlf +lib2to3.tests.data.different_encoding +lib2to3.tests.data.false_encoding +lib2to3.tests.data.fixers.bad_order +lib2to3.tests.data.fixers.myfixes +lib2to3.tests.data.fixers.myfixes.fix_explicit +lib2to3.tests.data.fixers.myfixes.fix_first +lib2to3.tests.data.fixers.myfixes.fix_last +lib2to3.tests.data.fixers.myfixes.fix_parrot +lib2to3.tests.data.fixers.myfixes.fix_preorder +lib2to3.tests.data.fixers.no_fixer_cls +lib2to3.tests.data.fixers.parrot_example +lib2to3.tests.data.infinite_recursion +lib2to3.tests.data.py2_test_grammar +lib2to3.tests.data.py3_test_grammar +lib2to3.tests.__main__ +lib2to3.tests.pytree_idempotency +lib2to3.tests.support +lib2to3.tests.test_all_fixers +lib2to3.tests.test_fixers +lib2to3.tests.test_main +lib2to3.tests.test_parser +lib2to3.tests.test_pytree +lib2to3.tests.test_refactor +lib2to3.tests.test_util +lib.libpython3 +linecache +_locale +locale +logging +logging.config +logging.handlers +_lsprof +_lzma +lzma +mailbox +mailcap +__main__ +_markupbase +marshal +math +_md5 +mimetypes +mmap +modulefinder +msilib +msvcrt +_multibytecodec +_multiprocessing +multiprocessing +multiprocessing.connection +multiprocessing.context +multiprocessing.dummy +multiprocessing.dummy.connection +multiprocessing.forkserver +multiprocessing.heap +multiprocessing.managers +multiprocessing.pool +multiprocessing.popen_fork +multiprocessing.popen_forkserver +multiprocessing.popen_spawn_posix +multiprocessing.popen_spawn_win32 +multiprocessing.process +multiprocessing.queues +multiprocessing.reduction +multiprocessing.resource_sharer +multiprocessing.resource_tracker +multiprocessing.sharedctypes +multiprocessing.shared_memory +multiprocessing.spawn +multiprocessing.synchronize +multiprocessing.util +netrc +nis +nntplib +ntpath +nturl2path +numbers +_opcode +opcode +_operator +operator +optparse +os +os.path +ossaudiodev +_osx_support +parser +pathlib +pdb +__phello__.foo +_pickle +pickle +pickletools +pipes +pkgutil +platform +plistlib +poplib +posix +posixpath +_posixshmem +_posixsubprocess +pprint +profile +pstats +pty +pwd +_py_abc +pyclbr +py_compile +_pydecimal +pydoc +pydoc_data +pydoc_data.topics +pyexpat +_pyio +_queue +queue +quopri +_random +random +re +readline +reprlib +resource +rlcompleter +runpy +sched +secrets +select +selectors +_sha1 +_sha256 +_sha3 +_sha512 +shelve +shlex +shutil +_signal +signal +site +_sitebuiltins +smtpd +smtplib +sndhdr +_socket +socket +socketserver +spwd +_sqlite3 +sqlite3 +sqlite3.dbapi2 +sqlite3.dump +sqlite3.test +sqlite3.test.backup +sqlite3.test.dbapi +sqlite3.test.dump +sqlite3.test.factory +sqlite3.test.hooks +sqlite3.test.regression +sqlite3.test.transactions +sqlite3.test.types +sqlite3.test.userfunctions +_sre +sre_compile +sre_constants +sre_parse +_ssl +ssl +_stat +stat +_statistics +statistics +_string +string +stringprep +_strptime +_struct +struct +subprocess +sunau +symbol +_symtable +symtable +sys +sysconfig +_sysconfigdata_x86_64_conda_cos6_linux_gnu +_sysconfigdata_x86_64_conda_linux_gnu +syslog +tabnanny +tarfile +telnetlib +tempfile +termios +test +test.ann_module +test.ann_module2 +test.ann_module3 +test.audiotests +test.autotest +test.bad_coding +test.bad_coding2 +test.bad_getattr +test.bad_getattr2 +test.bad_getattr3 +test.badsyntax_3131 +test.badsyntax_future10 +test.badsyntax_future3 +test.badsyntax_future4 +test.badsyntax_future5 +test.badsyntax_future6 +test.badsyntax_future7 +test.badsyntax_future8 +test.badsyntax_future9 +test.badsyntax_pep3120 +test.bisect_cmd +_testbuffer +test.bytecode_helper +_testcapi +test.coding20731 +test.curses_tests +test.dataclass_module_1 +test.dataclass_module_1_str +test.dataclass_module_2 +test.dataclass_module_2_str +test.datetimetester +test.dis_module +test.doctest_aliases +test.double_const +test.dtracedata.call_stack +test.dtracedata.gc +test.dtracedata.instance +test.dtracedata.line +test.eintrdata.eintr_tester +test.encoded_modules +test.encoded_modules.module_iso_8859_1 +test.encoded_modules.module_koi8_r +test.final_a +test.final_b +test.fork_wait +test.future_test1 +test.future_test2 +test.gdb_sample +test.good_getattr +test.imp_dummy +_testimportmultiple +test.inspect_fodder +test.inspect_fodder2 +_testinternalcapi +test.libregrtest +test.libregrtest.cmdline +test.libregrtest.main +test.libregrtest.pgo +test.libregrtest.refleak +test.libregrtest.runtest +test.libregrtest.runtest_mp +test.libregrtest.save_env +test.libregrtest.setup +test.libregrtest.utils +test.libregrtest.win_utils +test.list_tests +test.lock_tests +test.__main__ +test.make_ssl_certs +test.mapping_tests +test.memory_watchdog +test.mock_socket +test.mod_generics_cache +test.mp_fork_bomb +test.mp_preload +test.multibytecodec_support +_testmultiphase +test.outstanding_bugs +test.pickletester +test.profilee +test.pyclbr_input +test.pydocfodder +test.pydoc_mod +test.pythoninfo +test.regrtest +test.relimport +test.reperf +test.re_tests +test.sample_doctest +test.sample_doctest_no_docstrings +test.sample_doctest_no_doctests +test.seq_tests +test.signalinterproctester +test.sortperf +test.ssl_servers +test.ssltests +test.string_tests +test.subprocessdata.fd_status +test.subprocessdata.input_reader +test.subprocessdata.qcat +test.subprocessdata.qgrep +test.subprocessdata.sigchild_ignore +test.support +test.support.bytecode_helper +test.support.hashlib_helper +test.support.logging_helper +test.support.script_helper +test.support.socket_helper +test.support.testresult +test.test_abc +test.test_abstract_numbers +test.test_aifc +test.test___all__ +test.test_argparse +test.test_array +test.test_asdl_parser +test.test_ast +test.test_asyncgen +test.test_asynchat +test.test_asyncio +test.test_asyncio.echo +test.test_asyncio.echo2 +test.test_asyncio.echo3 +test.test_asyncio.functional +test.test_asyncio.__main__ +test.test_asyncio.test_base_events +test.test_asyncio.test_buffered_proto +test.test_asyncio.test_context +test.test_asyncio.test_events +test.test_asyncio.test_futures +test.test_asyncio.test_locks +test.test_asyncio.test_pep492 +test.test_asyncio.test_proactor_events +test.test_asyncio.test_protocols +test.test_asyncio.test_queues +test.test_asyncio.test_runners +test.test_asyncio.test_selector_events +test.test_asyncio.test_sendfile +test.test_asyncio.test_server +test.test_asyncio.test_sock_lowlevel +test.test_asyncio.test_sslproto +test.test_asyncio.test_streams +test.test_asyncio.test_subprocess +test.test_asyncio.test_tasks +test.test_asyncio.test_transports +test.test_asyncio.test_unix_events +test.test_asyncio.test_windows_events +test.test_asyncio.test_windows_utils +test.test_asyncio.utils +test.test_asyncore +test.test_atexit +test.test_audioop +test.test_audit +test.test_augassign +test.test_base64 +test.test_baseexception +test.test_bdb +test.test_bigaddrspace +test.test_bigmem +test.test_binascii +test.test_binhex +test.test_binop +test.test_bisect +test.test_bool +test.test_buffer +test.test_bufio +test.test_builtin +test.test_bytes +test.test_bz2 +test.test_calendar +test.test_call +test.test_capi +test.test_cgi +test.test_cgitb +test.test_charmapcodec +test.test_class +test.test_clinic +test.test_c_locale_coercion +test.test_cmath +test.test_cmd +test.test_cmd_line +test.test_cmd_line_script +test.test_code +test.testcodec +test.test_codeccallbacks +test.test_codecencodings_cn +test.test_codecencodings_hk +test.test_codecencodings_iso2022 +test.test_codecencodings_jp +test.test_codecencodings_kr +test.test_codecencodings_tw +test.test_codecmaps_cn +test.test_codecmaps_hk +test.test_codecmaps_jp +test.test_codecmaps_kr +test.test_codecmaps_tw +test.test_codecs +test.test_code_module +test.test_codeop +test.test_collections +test.test_colorsys +test.test_compare +test.test_compile +test.test_compileall +test.test_complex +test.test_concurrent_futures +test.test_configparser +test.test_contains +test.test_context +test.test_contextlib +test.test_contextlib_async +test.test_copy +test.test_copyreg +test.test_coroutines +test.test_cprofile +test.test_crashers +test.test_crypt +test.test_csv +test.test_ctypes +test.test_curses +test.test_dataclasses +test.test_datetime +test.test_dbm +test.test_dbm_dumb +test.test_dbm_gnu +test.test_dbm_ndbm +test.test_decimal +test.test_decorators +test.test_defaultdict +test.test_deque +test.test_descr +test.test_descrtut +test.test_devpoll +test.test_dict +test.test_dictcomps +test.test_dict_version +test.test_dictviews +test.test_difflib +test.test_dis +test.test_distutils +test.test_doctest +test.test_doctest2 +test.test_docxmlrpc +test.test_dtrace +test.test_dummy_thread +test.test_dummy_threading +test.test_dynamic +test.test_dynamicclassattribute +test.test_eintr +test.test_email +test.test_email.__main__ +test.test_email.test_asian_codecs +test.test_email.test_contentmanager +test.test_email.test_defect_handling +test.test_email.test_email +test.test_email.test__encoded_words +test.test_email.test_generator +test.test_email.test_headerregistry +test.test_email.test__header_value_parser +test.test_email.test_inversion +test.test_email.test_message +test.test_email.test_parser +test.test_email.test_pickleable +test.test_email.test_policy +test.test_email.test_utils +test.test_email.torture_test +test.test_embed +test.test_ensurepip +test.test_enum +test.test_enumerate +test.test_eof +test.test_epoll +test.test_errno +test.test_exception_hierarchy +test.test_exceptions +test.test_exception_variations +test.test_extcall +test.test_faulthandler +test.test_fcntl +test.test_file +test.test_filecmp +test.test_file_eintr +test.test_fileinput +test.test_fileio +test.test_finalization +test.test_float +test.test_flufl +test.test_fnmatch +test.test_fork1 +test.test_format +test.test_fractions +test.test_frame +test.test_frozen +test.test_fstring +test.test_ftplib +test.test_funcattrs +test.test_functools +test.test___future__ +test.test_future +test.test_future3 +test.test_future4 +test.test_future5 +test.test_gc +test.test_gdb +test.test_generators +test.test_generator_stop +test.test_genericclass +test.test_genericpath +test.test_genexps +test.test_getargs2 +test.test_getopt +test.test_getpass +test.test_gettext +test.test_glob +test.test_global +test.test_grammar +test.test_grp +test.test_gzip +test.test_hash +test.test_hashlib +test.test_heapq +test.test_hmac +test.test_html +test.test_htmlparser +test.test_http_cookiejar +test.test_http_cookies +test.test_httplib +test.test_httpservers +test.test_idle +test.test_imaplib +test.test_imghdr +test.test_imp +test.test_import +test.test_import.data.circular_imports.basic +test.test_import.data.circular_imports.basic2 +test.test_import.data.circular_imports.binding +test.test_import.data.circular_imports.binding2 +test.test_import.data.circular_imports.from_cycle1 +test.test_import.data.circular_imports.from_cycle2 +test.test_import.data.circular_imports.indirect +test.test_import.data.circular_imports.rebinding +test.test_import.data.circular_imports.rebinding2 +test.test_import.data.circular_imports.source +test.test_import.data.circular_imports.subpackage +test.test_import.data.circular_imports.subpkg.subpackage2 +test.test_import.data.circular_imports.subpkg.util +test.test_import.data.circular_imports.use +test.test_import.data.circular_imports.util +test.test_import.data.package +test.test_import.data.package2.submodule1 +test.test_import.data.package2.submodule2 +test.test_import.data.package.submodule +test.test_importlib +test.test_importlib.abc +test.test_importlib.builtin +test.test_importlib.builtin.__main__ +test.test_importlib.builtin.test_finder +test.test_importlib.builtin.test_loader +test.test_importlib.data +test.test_importlib.data01 +test.test_importlib.data01.subdirectory +test.test_importlib.data02 +test.test_importlib.data02.one +test.test_importlib.data02.two +test.test_importlib.data03 +test.test_importlib.data03.namespace.portion1 +test.test_importlib.data03.namespace.portion2 +test.test_importlib.extension +test.test_importlib.extension.__main__ +test.test_importlib.extension.test_case_sensitivity +test.test_importlib.extension.test_finder +test.test_importlib.extension.test_loader +test.test_importlib.extension.test_path_hook +test.test_importlib.fixtures +test.test_importlib.frozen +test.test_importlib.frozen.__main__ +test.test_importlib.frozen.test_finder +test.test_importlib.frozen.test_loader +test.test_importlib.import_ +test.test_importlib.import_.__main__ +test.test_importlib.import_.test_api +test.test_importlib.import_.test_caching +test.test_importlib.import_.test_fromlist +test.test_importlib.import_.test___loader__ +test.test_importlib.import_.test_meta_path +test.test_importlib.import_.test___package__ +test.test_importlib.import_.test_packages +test.test_importlib.import_.test_path +test.test_importlib.import_.test_relative_imports +test.test_importlib.__main__ +test.test_importlib.namespace_pkgs.both_portions.foo.one +test.test_importlib.namespace_pkgs.both_portions.foo.two +test.test_importlib.namespace_pkgs.module_and_namespace_package.a_test +test.test_importlib.namespace_pkgs.not_a_namespace_pkg.foo +test.test_importlib.namespace_pkgs.not_a_namespace_pkg.foo.one +test.test_importlib.namespace_pkgs.portion1.foo.one +test.test_importlib.namespace_pkgs.portion2.foo.two +test.test_importlib.namespace_pkgs.project1.parent.child.one +test.test_importlib.namespace_pkgs.project2.parent.child.two +test.test_importlib.namespace_pkgs.project3.parent.child.three +test.test_importlib.source +test.test_importlib.source.__main__ +test.test_importlib.source.test_case_sensitivity +test.test_importlib.source.test_file_loader +test.test_importlib.source.test_finder +test.test_importlib.source.test_path_hook +test.test_importlib.source.test_source_encoding +test.test_importlib.test_abc +test.test_importlib.test_api +test.test_importlib.test_lazy +test.test_importlib.test_locks +test.test_importlib.test_main +test.test_importlib.test_metadata_api +test.test_importlib.test_namespace_pkgs +test.test_importlib.test_open +test.test_importlib.test_path +test.test_importlib.test_read +test.test_importlib.test_resource +test.test_importlib.test_spec +test.test_importlib.test_util +test.test_importlib.test_windows +test.test_importlib.test_zip +test.test_importlib.util +test.test_importlib.zipdata01 +test.test_importlib.zipdata02 +test.test_import.__main__ +test.test_index +test.test_inspect +test.test_int +test.test_int_literal +test.test_io +test.test_ioctl +test.test_ipaddress +test.test_isinstance +test.test_iter +test.test_iterlen +test.test_itertools +test.test_json +test.test_json.__main__ +test.test_json.test_decode +test.test_json.test_default +test.test_json.test_dump +test.test_json.test_encode_basestring_ascii +test.test_json.test_enum +test.test_json.test_fail +test.test_json.test_float +test.test_json.test_indent +test.test_json.test_pass1 +test.test_json.test_pass2 +test.test_json.test_pass3 +test.test_json.test_recursion +test.test_json.test_scanstring +test.test_json.test_separators +test.test_json.test_speedups +test.test_json.test_tool +test.test_json.test_unicode +test.test_keyword +test.test_keywordonlyarg +test.test_kqueue +test.test_largefile +test.test_lib2to3 +test.test_linecache +test.test_list +test.test_listcomps +test.test_lltrace +test.test__locale +test.test_locale +test.test_logging +test.test_long +test.test_longexp +test.test_lzma +test.test_mailbox +test.test_mailcap +test.test_marshal +test.test_math +test.test_memoryio +test.test_memoryview +test.test_metaclass +test.test_mimetypes +test.test_minidom +test.test_mmap +test.test_module +test.test_modulefinder +test.test_msilib +test.test_multibytecodec +test._test_multiprocessing +test.test_multiprocessing_fork +test.test_multiprocessing_forkserver +test.test_multiprocessing_main_handling +test.test_multiprocessing_spawn +test.test_named_expressions +test.test_netrc +test.test_nis +test.test_nntplib +test.test_normalization +test.test_ntpath +test.test_numeric_tower +test.test__opcode +test.test_opcodes +test.test_openpty +test.test_operator +test.test_optparse +test.test_ordered_dict +test.test_os +test.test_ossaudiodev +test.test_osx_env +test.test__osx_support +test.test_parser +test.test_pathlib +test.test_pdb +test.test_peepholer +test.test_pickle +test.test_picklebuffer +test.test_pickletools +test.test_pipes +test.test_pkg +test.test_pkgimport +test.test_pkgutil +test.test_platform +test.test_plistlib +test.test_poll +test.test_popen +test.test_poplib +test.test_positional_only_arg +test.test_posix +test.test_posixpath +test.test_pow +test.test_pprint +test.test_print +test.test_profile +test.test_property +test.test_pstats +test.test_pty +test.test_pulldom +test.test_pwd +test.test_pyclbr +test.test_py_compile +test.test_pydoc +test.test_pyexpat +test.test_queue +test.test_quopri +test.test_raise +test.test_random +test.test_range +test.test_re +test.test_readline +test.test_regrtest +test.test_repl +test.test_reprlib +test.test_resource +test.test_richcmp +test.test_rlcompleter +test.test_robotparser +test.test_runpy +test.test_sax +test.test_sched +test.test_scope +test.test_script_helper +test.test_secrets +test.test_select +test.test_selectors +test.test_set +test.test_setcomps +test.test_shelve +test.test_shlex +test.test_shutil +test.test_signal +test.test_site +test.test_slice +test.test_smtpd +test.test_smtplib +test.test_smtpnet +test.test_sndhdr +test.test_socket +test.test_socketserver +test.test_sort +test.test_source_encoding +test.test_spwd +test.test_sqlite +test.test_ssl +test.test_startfile +test.test_stat +test.test_statistics +test.test_strftime +test.test_string +test.test_string_literals +test.test_stringprep +test.test_strptime +test.test_strtod +test.test_struct +test.test_structmembers +test.test_structseq +test.test_subclassinit +test.test_subprocess +test.test_sunau +test.test_sundry +test.test_super +test.test_support +test.test_symbol +test.test_symtable +test.test_syntax +test.test_sys +test.test_sysconfig +test.test_syslog +test.test_sys_setprofile +test.test_sys_settrace +test.test_tabnanny +test.test_tarfile +test.test_tcl +test.test_telnetlib +test.test_tempfile +test.test_textwrap +test.test_thread +test.test_threaded_import +test.test_threadedtempfile +test.test_threading +test.test_threading_local +test.test_threadsignals +test.test_time +test.test_timeit +test.test_timeout +test.test_tix +test.test_tk +test.test_tokenize +test.test_tools +test.test_tools.__main__ +test.test_tools.test_fixcid +test.test_tools.test_gprof2html +test.test_tools.test_i18n +test.test_tools.test_lll +test.test_tools.test_md5sum +test.test_tools.test_pathfix +test.test_tools.test_pdeps +test.test_tools.test_pindent +test.test_tools.test_reindent +test.test_tools.test_sundry +test.test_tools.test_unparse +test.test_trace +test.test_traceback +test.test_tracemalloc +test.test_ttk_guionly +test.test_ttk_textonly +test.test_tuple +test.test_turtle +test.test_typechecks +test.test_type_comments +test.test_types +test.test_typing +test.test_ucn +test.test_unary +test.test_unicode +test.test_unicodedata +test.test_unicode_file +test.test_unicode_file_functions +test.test_unicode_identifiers +test.test_unittest +test.test_univnewlines +test.test_unpack +test.test_unpack_ex +test.test_urllib +test.test_urllib2 +test.test_urllib2_localnet +test.test_urllib2net +test.test_urllibnet +test.test_urllib_response +test.test_urlparse +test.test_userdict +test.test_userlist +test.test_userstring +test.test_utf8_mode +test.test_utf8source +test.test_uu +test.test_uuid +test.test_venv +test.test_wait3 +test.test_wait4 +test.test_warnings +test.test_warnings.data.import_warning +test.test_warnings.data.stacklevel +test.test_warnings.__main__ +test.test_wave +test.test_weakref +test.test_weakset +test.test_webbrowser +test.test_winconsoleio +test.test_winreg +test.test_winsound +test.test_with +test.test_wsgiref +test.test_xdrlib +test.test_xml_dom_minicompat +test.test_xml_etree +test.test_xml_etree_c +test.test_xmlrpc +test.test_xmlrpc_net +test.test__xxsubinterpreters +test.test_xxtestfuzz +test.test_yield_from +test.test_zipapp +test.test_zipfile +test.test_zipfile64 +test.test_zipimport +test.test_zipimport_support +test.test_zlib +test.tf_inherit_check +test.threaded_import_hangers +test.time_hashlib +test.tracedmodules +test.tracedmodules.testmod +test.win_console_handler +test.xmltests +test.ziptestdata.testdata_module_inside_zip +textwrap +this +_thread +threading +_threading_local +time +timeit +_tkinter +tkinter +tkinter.colorchooser +tkinter.commondialog +tkinter.constants +tkinter.dialog +tkinter.dnd +tkinter.filedialog +tkinter.font +tkinter.__main__ +tkinter.messagebox +tkinter.scrolledtext +tkinter.simpledialog +tkinter.test +tkinter.test.runtktests +tkinter.test.support +tkinter.test.test_tkinter +tkinter.test.test_tkinter.test_font +tkinter.test.test_tkinter.test_geometry_managers +tkinter.test.test_tkinter.test_images +tkinter.test.test_tkinter.test_loadtk +tkinter.test.test_tkinter.test_misc +tkinter.test.test_tkinter.test_text +tkinter.test.test_tkinter.test_variables +tkinter.test.test_tkinter.test_widgets +tkinter.test.test_ttk +tkinter.test.test_ttk.test_extensions +tkinter.test.test_ttk.test_functions +tkinter.test.test_ttk.test_style +tkinter.test.test_ttk.test_widgets +tkinter.test.widget_tests +tkinter.tix +tkinter.ttk +token +tokenize +trace +traceback +_tracemalloc +tracemalloc +tty +turtle +turtledemo +turtledemo.bytedesign +turtledemo.chaos +turtledemo.clock +turtledemo.colormixer +turtledemo.forest +turtledemo.fractalcurves +turtledemo.lindenmayer +turtledemo.__main__ +turtledemo.minimal_hanoi +turtledemo.nim +turtledemo.paint +turtledemo.peace +turtledemo.penrose +turtledemo.planet_and_moon +turtledemo.rosette +turtledemo.round_dance +turtledemo.sorting_animate +turtledemo.tree +turtledemo.two_canvases +turtledemo.yinyang +types +typing +typing.io +typing.re +unicodedata +unittest +unittest.async_case +unittest.case +unittest.loader +unittest._log +unittest.__main__ +unittest.main +unittest.mock +unittest.result +unittest.runner +unittest.signals +unittest.suite +unittest.test +unittest.test.dummy +unittest.test.__main__ +unittest.test.support +unittest.test.test_assertions +unittest.test.test_async_case +unittest.test.test_break +unittest.test.test_case +unittest.test.test_discovery +unittest.test.test_functiontestcase +unittest.test.test_loader +unittest.test.testmock +unittest.test.testmock.__main__ +unittest.test.testmock.support +unittest.test.testmock.testasync +unittest.test.testmock.testcallable +unittest.test.testmock.testhelpers +unittest.test.testmock.testmagicmethods +unittest.test.testmock.testmock +unittest.test.testmock.testpatch +unittest.test.testmock.testsealable +unittest.test.testmock.testsentinel +unittest.test.testmock.testwith +unittest.test.test_program +unittest.test.test_result +unittest.test.test_runner +unittest.test.test_setups +unittest.test.test_skipping +unittest.test.test_suite +unittest.test._test_warnings +unittest.util +urllib +urllib.error +urllib.parse +urllib.request +urllib.response +urllib.robotparser +uu +_uuid +uuid +venv +venv.__main__ +_warnings +warnings +wave +_weakref +weakref +_weakrefset +webbrowser +winreg +winsound +wsgiref +wsgiref.handlers +wsgiref.headers +wsgiref.simple_server +wsgiref.util +wsgiref.validate +xdrlib +xml +xml.dom +xml.dom.domreg +xml.dom.expatbuilder +xml.dom.minicompat +xml.dom.minidom +xml.dom.NodeFilter +xml.dom.pulldom +xml.dom.xmlbuilder +xml.etree +xml.etree.cElementTree +xml.etree.ElementInclude +xml.etree.ElementPath +xml.etree.ElementTree +xml.parsers +xml.parsers.expat +xml.parsers.expat.errors +xml.parsers.expat.model +xmlrpc +xmlrpc.client +xmlrpc.server +xml.sax +xml.sax._exceptions +xml.sax.expatreader +xml.sax.handler +xml.sax.saxutils +xml.sax.xmlreader +xxlimited +_xxsubinterpreters +xxsubtype +_xxtestfuzz +zipapp +zipfile +zipimport +zlib +zoneinfo +zoneinfo._common +zoneinfo._tzpath +zoneinfo._zoneinfo diff --git a/crates/uv-cli/src/lib.rs b/crates/uv-cli/src/lib.rs index 056447959..5511c645b 100644 --- a/crates/uv-cli/src/lib.rs +++ b/crates/uv-cli/src/lib.rs @@ -3537,6 +3537,15 @@ pub struct AddArgs { #[arg(long, short, alias = "requirement", group = "sources", value_parser = parse_file_path)] pub requirements: Vec, + /// Auto-detect the requirements from the given Python script. + /// + /// This option is only available when used with `--script`. When enabled, uv will parse the + /// given script and map its import statements to requirements based on heuristics. + /// + /// This option is in preview and may change in any future release. + #[arg(long, group = "sources")] + pub auto: bool, + /// Constrain versions using the given requirements files. /// /// Constraints files are `requirements.txt`-like files that only control the _version_ of a diff --git a/crates/uv-distribution-types/src/requirement.rs b/crates/uv-distribution-types/src/requirement.rs index 432cc4e12..38414e8f2 100644 --- a/crates/uv-distribution-types/src/requirement.rs +++ b/crates/uv-distribution-types/src/requirement.rs @@ -192,6 +192,24 @@ impl PartialOrd for Requirement { } } +impl From for Requirement { + /// Convert a [`PackageName`] to a [`Requirement`]. + fn from(name: PackageName) -> Self { + Requirement { + name, + extras: Box::new([]), + groups: Box::new([]), + marker: MarkerTree::default(), + source: RequirementSource::Registry { + specifier: VersionSpecifiers::empty(), + index: None, + conflict: None, + }, + origin: None, + } + } +} + impl From for uv_pep508::Requirement { /// Convert a [`Requirement`] to a [`uv_pep508::Requirement`]. fn from(requirement: Requirement) -> Self { diff --git a/crates/uv-scripts/src/lib.rs b/crates/uv-scripts/src/lib.rs index b80cdc219..644f72028 100644 --- a/crates/uv-scripts/src/lib.rs +++ b/crates/uv-scripts/src/lib.rs @@ -302,6 +302,11 @@ impl Pep723Script { .and_then(|uv| uv.sources.as_ref()) .unwrap_or(&EMPTY) } + + /// Return the source code of the script, excluding the PEP 723 metadata. + pub fn source_code(&self) -> String { + format!("{}{}", self.prelude, self.postlude) + } } /// PEP 723 metadata as parsed from a `script` comment block. diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index 7fa28ed67..f35e5a5b4 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -14,6 +14,7 @@ default-run = "uv" workspace = true [dependencies] +uv-analyze = { workspace = true } uv-auth = { workspace = true } uv-build-backend = { workspace = true } uv-build-frontend = { workspace = true } diff --git a/crates/uv/src/commands/project/add.rs b/crates/uv/src/commands/project/add.rs index d65866483..9207237ff 100644 --- a/crates/uv/src/commands/project/add.rs +++ b/crates/uv/src/commands/project/add.rs @@ -25,7 +25,7 @@ use uv_dispatch::BuildDispatch; use uv_distribution::DistributionDatabase; use uv_distribution_types::{ Index, IndexName, IndexUrl, IndexUrls, NameRequirementSpecification, Requirement, - RequirementSource, UnresolvedRequirement, VersionId, + RequirementSource, UnresolvedRequirement, UnresolvedRequirementSpecification, VersionId, }; use uv_fs::{LockedFile, Simplified}; use uv_git::GIT_STORE; @@ -74,6 +74,7 @@ pub(crate) async fn add( marker: Option, editable: Option, dependency_type: DependencyType, + auto: bool, raw: bool, bounds: Option, indexes: Vec, @@ -98,7 +99,11 @@ pub(crate) async fn add( preview: PreviewMode, ) -> Result { if bounds.is_some() && preview.is_disabled() { - warn_user_once!("The bounds option is in preview and may change in any future release."); + warn_user_once!("The bounds option is in preview and may change in any future release"); + } + + if auto && preview.is_disabled() { + warn_user_once!("The `--auto` option is in preview and may change in any future release"); } for source in &requirements { @@ -338,7 +343,7 @@ pub(crate) async fn add( // Read the requirements. let RequirementsSpecification { - requirements, + mut requirements, constraints, .. } = RequirementsSpecification::from_sources( @@ -350,6 +355,40 @@ pub(crate) async fn add( ) .await?; + // If `--auto` was provided, infer the requirements from the script. + if auto { + match target { + AddTarget::Script(ref script, ..) => { + // Extract the inferred requirements. + let names = uv_analyze::extract_requirements(&script.source_code())?; + + if names.is_empty() { + writeln!( + printer.stderr(), + "No requirements found in script `{}`", + script.path.user_display().cyan() + )?; + } else { + writeln!( + printer.stderr(), + "Inferred requirements: {}", + names.iter().map(|name| name.cyan()).join(", ") + )?; + } + + // Add the inferred requirements to the list of requirements. + for name in names { + requirements.push(UnresolvedRequirementSpecification::from(Requirement::from( + name, + ))); + } + } + AddTarget::Project(..) => { + bail!("`--auto` is not supported for projects, only scripts") + } + } + } + // Initialize any shared state. let state = PlatformState::default(); diff --git a/crates/uv/src/lib.rs b/crates/uv/src/lib.rs index 84d889599..506eb825b 100644 --- a/crates/uv/src/lib.rs +++ b/crates/uv/src/lib.rs @@ -1958,6 +1958,7 @@ async fn run_project( args.marker, args.editable, args.dependency_type, + args.auto, args.raw, args.bounds, args.indexes, diff --git a/crates/uv/src/settings.rs b/crates/uv/src/settings.rs index f89704d45..f776a4382 100644 --- a/crates/uv/src/settings.rs +++ b/crates/uv/src/settings.rs @@ -1321,6 +1321,7 @@ pub(crate) struct AddSettings { pub(crate) dependency_type: DependencyType, pub(crate) editable: Option, pub(crate) extras: Vec, + pub(crate) auto: bool, pub(crate) raw: bool, pub(crate) bounds: Option, pub(crate) rev: Option, @@ -1343,6 +1344,7 @@ impl AddSettings { let AddArgs { packages, requirements, + auto, constraints, marker, dev, @@ -1461,6 +1463,7 @@ impl AddSettings { marker, dependency_type, raw, + auto, bounds, rev, tag,