Add progress bar

This commit is contained in:
Charlie Marsh 2023-10-05 00:48:21 -04:00
parent 8032d4606e
commit 7f497fa43f
5 changed files with 13 additions and 4 deletions

View file

@ -24,3 +24,4 @@ pep440_rs = "0.3.12"
tracing = "0.1.37" tracing = "0.1.37"
tracing-tree = "0.2.5" tracing-tree = "0.2.5"
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
indicatif = "0.17.7"

View file

@ -13,14 +13,16 @@ use puffin_client::{File, PypiClientBuilder, SimpleJson};
use puffin_requirements::metadata::Metadata21; use puffin_requirements::metadata::Metadata21;
use puffin_requirements::package_name::PackageName; use puffin_requirements::package_name::PackageName;
use puffin_requirements::wheel::WheelName; use puffin_requirements::wheel::WheelName;
use indicatif::{ProgressBar, ProgressStyle};
use crate::commands::ExitStatus; use crate::commands::ExitStatus;
#[derive(Debug)]
enum Request { enum Request {
Package(Requirement), Package(Requirement),
Version(Requirement, File), Version(Requirement, File),
} }
#[derive(Debug)]
enum Response { enum Response {
Package(SimpleJson, Requirement), Package(SimpleJson, Requirement),
Version(Metadata21, Requirement), Version(Metadata21, Requirement),
@ -66,7 +68,7 @@ pub(crate) async fn install(src: &Path) -> Result<ExitStatus> {
), ),
Request::Version(requirement, file) => Either::Right( Request::Version(requirement, file) => Either::Right(
proxy_client proxy_client
.file(file.clone()) .file(file)
.map_ok(move |metadata| Response::Version(metadata, requirement)), .map_ok(move |metadata| Response::Version(metadata, requirement)),
), ),
}) })
@ -84,6 +86,10 @@ pub(crate) async fn install(src: &Path) -> Result<ExitStatus> {
// Resolve the requirements. // Resolve the requirements.
let mut resolution: HashMap<PackageName, Version> = HashMap::with_capacity(requirements.len()); let mut resolution: HashMap<PackageName, Version> = HashMap::with_capacity(requirements.len());
let spinner_style = ProgressStyle::with_template("{spinner} {wide_bar} [{pos}/{len}] {msg}").unwrap();
let bar = ProgressBar::new(8);
bar.set_style(spinner_style);
while let Some(chunk) = package_stream.next().await { while let Some(chunk) = package_stream.next().await {
for result in chunk { for result in chunk {
let result: Response = result?; let result: Response = result?;
@ -125,6 +131,7 @@ pub(crate) async fn install(src: &Path) -> Result<ExitStatus> {
let normalized_name = PackageName::normalize(&requirement.name); let normalized_name = PackageName::normalize(&requirement.name);
in_flight.remove(&normalized_name); in_flight.remove(&normalized_name);
resolution.insert(normalized_name, metadata.version); resolution.insert(normalized_name, metadata.version);
bar.inc(1);
// Enqueue its dependencies. // Enqueue its dependencies.
for dependency in metadata.requires_dist { for dependency in metadata.requires_dist {

View file

@ -17,3 +17,4 @@ serde_json = { version = "1.0.107" }
thiserror = { version = "1.0.49" } thiserror = { version = "1.0.49" }
url = { version = "2.4.1" } url = { version = "2.4.1" }
tracing = "0.1.37" tracing = "0.1.37"
indicatif = "0.17.7"

View file

@ -35,7 +35,7 @@ impl PypiClient {
// Fetch from the registry. // Fetch from the registry.
let text = self.simple_impl(&package_name, &url).await?; let text = self.simple_impl(&package_name, &url).await?;
let payload = serde_json::from_str(&text) let payload = serde_json::from_str(&text)
.map_err(move |e| PypiClientError::from_json_err(e, "".to_string())); .map_err(move |e| PypiClientError::from_json_err(e, String::new()));
trace!("fetched metadata for {} in {:?}", url, start.elapsed()); trace!("fetched metadata for {} in {:?}", url, start.elapsed());

View file

@ -1 +1 @@
flask black