Coverage for lintro / tools / core / install_plan.py: 100%
22 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
1"""Data classes for tool installation planning and results."""
3from __future__ import annotations
5from dataclasses import dataclass, field
7from lintro.tools.core.manifest_models import ManifestTool
10@dataclass
11class InstallResult:
12 """Result of installing a single tool.
14 Attributes:
15 tool: The manifest tool entry.
16 success: Whether installation succeeded.
17 message: Human-readable result message.
18 duration_seconds: How long the install took.
19 """
21 tool: ManifestTool
22 success: bool
23 message: str
24 duration_seconds: float = 0.0
27@dataclass
28class InstallPlan:
29 """Planned installation actions.
31 Attributes:
32 to_install: Tools to install with their install command.
33 to_upgrade: Tools to upgrade (tool, current version, upgrade command).
34 already_ok: Tools already installed at correct version.
35 outdated: Tools with outdated versions (not upgrading).
36 skipped: Tools skipped (e.g., Rust tools when cargo unavailable).
37 """
39 to_install: list[tuple[ManifestTool, str]] = field(default_factory=list)
40 to_upgrade: list[tuple[ManifestTool, str, str]] = field(default_factory=list)
41 already_ok: list[ManifestTool] = field(default_factory=list)
42 outdated: list[tuple[ManifestTool, str]] = field(default_factory=list)
43 skipped: list[tuple[ManifestTool, str]] = field(default_factory=list)
45 @property
46 def has_work(self) -> bool:
47 """Whether there are tools to install or upgrade."""
48 return bool(self.to_install or self.to_upgrade)
50 @property
51 def total_actions(self) -> int:
52 """Total number of install/upgrade actions."""
53 return len(self.to_install) + len(self.to_upgrade)