Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/usethis/_integrations/uv/deps.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,16 @@ class Dependency(BaseModel):
extras: frozenset[str] = frozenset()

def __str__(self) -> str:
extras = sorted(self.extras or set())
return self.name + "".join(f"[{extra}]" for extra in extras)
return self.to_requirements_string()

def __hash__(self) -> int:
return hash((self.__class__.__name__, self.name, self.extras))

def to_requirements_string(self) -> str:
"""Convert the dependency to a requirements string."""
extras_str = f"[{','.join(sorted(self.extras))}]" if self.extras else ""
return f"{self.name}{extras_str}"


def get_project_deps() -> list[Dependency]:
"""Get all project dependencies.
Expand Down
15 changes: 15 additions & 0 deletions tests/usethis/_integrations/uv/test_deps.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,21 @@
from usethis._test import change_cwd


class TestDependency:
class TestToRequirementsString:
def test_no_extras(self):
dep = Dependency(name="requests")
assert dep.to_requirements_string() == "requests"

def test_single_extra(self):
dep = Dependency(name="requests", extras=frozenset({"security"}))
assert dep.to_requirements_string() == "requests[security]"

def test_multiple_extras(self):
dep = Dependency(name="requests", extras=frozenset({"security", "socks"}))
assert dep.to_requirements_string() == "requests[security,socks]"


class TestGetProjectDeps:
def test_no_pyproject(self, tmp_path: Path):
# Arrange - No pyproject.toml file exists
Expand Down
Loading