diff --git a/src/huak/lib.rs b/src/huak/lib.rs index 4fafe7c3..81694aa7 100644 --- a/src/huak/lib.rs +++ b/src/huak/lib.rs @@ -135,9 +135,7 @@ impl Project { /// Add a Python package as a dependency to the project's manifest file. pub fn add_dependency(&mut self, package_str: &str) -> HuakResult<()> { - if !self.contains_dependency(package_str)? - && !self.contains_optional_dependency(package_str)? - { + if !self.contains_dependency(package_str)? { self.pyproject_toml.add_dependency(package_str); } Ok(()) @@ -149,8 +147,9 @@ impl Project { package_str: &str, group_name: &str, ) -> HuakResult<()> { - if !self.contains_dependency(package_str)? - && !self.contains_optional_dependency(package_str)? + if !self + .contains_optional_dependency(package_str, group_name) + .unwrap_or_default() { self.pyproject_toml .add_optional_dependency(package_str, group_name) @@ -190,7 +189,32 @@ impl Project { pub fn contains_optional_dependency( &self, package_str: &str, + group: &str, + ) -> HuakResult { + if let Some(groups) = + self.pyproject_toml.optional_dependencey_group(group) + { + if groups.is_empty() { + return Ok(false); + } + let package = Package::from_str(package_str)?; + for dep in groups { + if Package::from_str(dep)?.name() == package.name() { + return Ok(true); + } + } + } + Ok(false) + } + + /// Check if the project has a dependency listed in its manifest file as part of any group. + pub fn contains_dependency_any( + &self, + package_str: &str, ) -> HuakResult { + if self.contains_dependency(package_str).unwrap_or_default() { + return Ok(true); + } if let Some(groups) = self.pyproject_toml.optional_dependencies() { if groups.is_empty() { return Ok(false); diff --git a/src/huak/ops.rs b/src/huak/ops.rs index a84183b0..3b3e5c23 100644 --- a/src/huak/ops.rs +++ b/src/huak/ops.rs @@ -41,9 +41,6 @@ pub fn add_project_dependencies( let packages = package_iter(dependencies) .filter(|item| { !project.contains_dependency(item.name()).unwrap_or_default() - && !project - .contains_optional_dependency(item.name()) - .unwrap_or_default() }) .collect::>(); if packages.is_empty() { @@ -71,10 +68,9 @@ pub fn add_project_optional_dependencies( let mut project = Project::from_manifest(&manifest_path)?; let packages = package_iter(dependencies) .filter(|item| { - !project.contains_dependency(item.name()).unwrap_or_default() - && !project - .contains_optional_dependency(item.name()) - .unwrap_or_default() + !project + .contains_optional_dependency(item.name(), group) + .unwrap_or_default() }) .collect::>(); if packages.is_empty() { @@ -104,9 +100,7 @@ pub fn build_project(config: &OperationConfig) -> HuakResult<()> { &mut terminal, )?; } - if !project.contains_dependency("build")? - && !project.contains_optional_dependency("build")? - { + if !project.contains_dependency_any("build")? { project.add_optional_dependency("build", "dev")?; project.pyproject_toml().write_file(&manifest_path)?; } @@ -187,7 +181,7 @@ pub fn format_project(config: &OperationConfig) -> HuakResult<()> { .filter(|item| { !project.contains_dependency(item.name()).unwrap_or_default() && !project - .contains_optional_dependency(item.name()) + .contains_dependency_any(item.name()) .unwrap_or_default() }) .collect::>(); @@ -324,9 +318,7 @@ pub fn lint_project(config: &OperationConfig) -> HuakResult<()> { &mut terminal, )?; } - if !project.contains_dependency("ruff")? - && !project.contains_optional_dependency("ruff")? - { + if !project.contains_dependency_any("ruff")? { project.add_optional_dependency("ruff", "dev")?; project.pyproject_toml().write_file(&manifest_path)?; } @@ -344,9 +336,7 @@ pub fn lint_project(config: &OperationConfig) -> HuakResult<()> { &mut terminal, )?; } - if !project.contains_dependency("mypy")? - && !project.contains_optional_dependency("mypy")? - { + if !project.contains_dependency_any("mypy")? { project.add_optional_dependency("mypy", "dev")?; project.pyproject_toml().write_file(&manifest_path)?; } @@ -426,9 +416,7 @@ pub fn publish_project(config: &OperationConfig) -> HuakResult<()> { &mut terminal, )?; } - if !project.contains_dependency("twine")? - && !project.contains_optional_dependency("twine")? - { + if !project.contains_dependency_any("twine")? { project.add_optional_dependency("twine", "dev")?; project.pyproject_toml().write_file(&manifest_path)?; } @@ -488,7 +476,7 @@ pub fn remove_project_optional_dependencies( .iter() .filter(|item| { project - .contains_optional_dependency(item) + .contains_optional_dependency(item, group) .unwrap_or_default() }) .cloned() @@ -540,9 +528,7 @@ pub fn test_project(config: &OperationConfig) -> HuakResult<()> { &mut terminal, )?; } - if !project.contains_dependency("pytest")? - && !project.contains_optional_dependency("pytest")? - { + if !project.contains_dependency_any("pytest")? { project.add_optional_dependency("pytest", "dev")?; project.pyproject_toml.write_file(&manifest_path)?; }