From b8cfd9e24f09e704cc267ff440a1c21ac6623191 Mon Sep 17 00:00:00 2001 From: innocentzero Date: Sat, 27 Jan 2024 23:35:37 +0530 Subject: [PATCH] feat(pipx support): Fully supports pipx features Now able to support packages installed via pipx with the exception of packages that do not provide a binary themselves. Install those explicitly via `pipx install --include-deps `. Signed-off-by: innocentzero --- .../pacdef_core/src/backend/actual/python.rs | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/crates/pacdef_core/src/backend/actual/python.rs b/crates/pacdef_core/src/backend/actual/python.rs index 454e4a2..4e7f2bf 100644 --- a/crates/pacdef_core/src/backend/actual/python.rs +++ b/crates/pacdef_core/src/backend/actual/python.rs @@ -40,7 +40,18 @@ impl Backend for Python { let output = run_pip_command(&mut cmd, self.get_switches_runtime())?; match self.get_binary(){ "pip" => extract_pacdef_packages(output), - "pipx" => extract_pacdef_packages_pipx(output), + "pipx" => { + let packs = extract_pacdef_packages_pipx(&output); + let deps = extract_pacdef_packages_deps(&output); + match (packs, deps) { + (Ok(mut pack), Ok(deps)) => { + pack.extend(deps.into_iter()); + Ok(pack) + } + (Ok(pack), Err(_)) => Ok(pack), + (Err(pack), _) => Err(pack), + } + } _ => panic!("Cannot use {} for package management in python. Please use a valid package manager like pip or pipx", self.get_binary()), } } @@ -50,7 +61,7 @@ impl Backend for Python { let output = run_pip_command(&mut cmd, self.get_switches_explicit())?; match self.get_binary(){ "pip" => extract_pacdef_packages(output), - "pipx" => extract_pacdef_packages_pipx(output), + "pipx" => extract_pacdef_packages_pipx(&output), _ => panic!("Cannot use {} for package management in python. Please use a valid package manager like pip or pipx", self.get_binary()), } } @@ -102,7 +113,7 @@ fn extract_pacdef_packages(value: Value) -> Result> { Ok(result) } -fn extract_pacdef_packages_pipx(value: Value) -> Result> { +fn extract_pacdef_packages_pipx(value: &Value) -> Result> { let result = value["venvs"] .as_object() .context("getting inner json object")? @@ -112,20 +123,23 @@ fn extract_pacdef_packages_pipx(value: Value) -> Result> { Ok(result) } -// fn extract_pacdef_packages_deps(value: Value) -> Result> { -// let mut alldeps: HashSet = HashSet::new(); -// -// value["venvs"] -// .as_object() -// .context("getting inner json object")? -// .iter() -// .map(|(_, deps_obj)| { -// let deps = deps_obj["metadata"]["main_package"]["apps_paths_of_dependencies"] -// .as_object() -// .iter() -// .map(|(name, _)| Package::from(name)) -// .collect(); -// alldeps.extend(&deps); -// }); -// Ok(alldeps) -// } +fn extract_pacdef_packages_deps(value: &Value) -> Result> { + let mut alldeps: HashSet = HashSet::new(); + let _ = value["venvs"] + .as_object() + .context("getting inner json object")? + .iter() + .map(|(_, deps_obj)| -> Result<()> { + let deps: HashSet = deps_obj["metadata"]["main_package"] + ["apps_paths_of_dependencies"] + .as_object() + .context("getting inner dependencies")? + .iter() + .map(|(name, _)| Package::from(name.as_str())) + .collect(); + + alldeps.extend(deps); + Ok(()) + }); + Ok(alldeps) +}