Coverage for /Users/ajo/work/jumpstarter/jumpstarter/packages/jumpstarter-driver-power/jumpstarter_driver_power/driver.py: 80%

46 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-05-06 10:21 +0200

1from abc import ABCMeta, abstractmethod 

2from collections.abc import AsyncGenerator, Generator 

3 

4from .common import PowerReading 

5from jumpstarter.driver import Driver, export 

6 

7 

8class PowerInterface(metaclass=ABCMeta): 

9 @classmethod 

10 def client(cls) -> str: 

11 return "jumpstarter_driver_power.client.PowerClient" 

12 

13 @abstractmethod 

14 async def on(self) -> None: ... 

15 

16 @abstractmethod 

17 async def off(self) -> None: ... 

18 

19 @abstractmethod 

20 async def read(self) -> AsyncGenerator[PowerReading, None]: ... 

21 

22 

23class VirtualPowerInterface(metaclass=ABCMeta): 

24 @classmethod 

25 def client(cls) -> str: 

26 return "jumpstarter_driver_power.client.VirtualPowerClient" 

27 

28 @abstractmethod 

29 async def on(self) -> None: ... 

30 

31 @abstractmethod 

32 async def off(self, destroy: bool = False) -> None: ... 

33 

34 @abstractmethod 

35 async def read(self) -> AsyncGenerator[PowerReading, None]: ... 

36 

37 

38 

39class MockPower(PowerInterface, Driver): 

40 """ 

41 MockPower is a mock driver implementing the PowerInterface 

42 

43 >>> with serve(MockPower()) as power: 

44 ... power.on() 

45 ... power.off() 

46 ... 

47 ... assert list(power.read()) == [ 

48 ... PowerReading(voltage=0.0, current=0.0), 

49 ... PowerReading(voltage=5.0, current=2.0), 

50 ... ] 

51 """ 

52 

53 @export 

54 async def on(self) -> None: 

55 self.logger.info("power on") 

56 

57 @export 

58 async def off(self) -> None: 

59 self.logger.info("power off") 

60 

61 @export 

62 async def read(self) -> AsyncGenerator[PowerReading, None]: 

63 yield PowerReading(voltage=0.0, current=0.0) 

64 yield PowerReading(voltage=5.0, current=2.0) 

65 

66 

67class SyncMockPower(PowerInterface, Driver): 

68 """ 

69 SyncMockPower is a mock driver implementing the PowerInterface 

70 

71 >>> with serve(SyncMockPower()) as power: 

72 ... power.on() 

73 ... power.off() 

74 ... 

75 ... assert list(power.read()) == [ 

76 ... PowerReading(voltage=0.0, current=0.0), 

77 ... PowerReading(voltage=5.0, current=2.0), 

78 ... ] 

79 """ 

80 

81 @export 

82 def on(self) -> None: 

83 self.logger.info("power on") 

84 

85 @export 

86 def off(self) -> None: 

87 self.logger.info("power off") 

88 

89 @export 

90 def read(self) -> Generator[PowerReading, None]: 

91 yield PowerReading(voltage=0.0, current=0.0) 

92 yield PowerReading(voltage=5.0, current=2.0)