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

1"""Data classes for tool installation planning and results.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass, field 

6 

7from lintro.tools.core.manifest_models import ManifestTool 

8 

9 

10@dataclass 

11class InstallResult: 

12 """Result of installing a single tool. 

13 

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 """ 

20 

21 tool: ManifestTool 

22 success: bool 

23 message: str 

24 duration_seconds: float = 0.0 

25 

26 

27@dataclass 

28class InstallPlan: 

29 """Planned installation actions. 

30 

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 """ 

38 

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) 

44 

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) 

49 

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)