init commit
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
"""Mock switch driver used in development and simulation modes."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class MockSwitchDriver:
|
||||
"""In-memory switch driver that validates and tracks current position."""
|
||||
|
||||
name: str
|
||||
positions: int
|
||||
default_position: int = 0
|
||||
_is_open: bool = field(init=False, default=False, repr=False)
|
||||
_current_position: int = field(init=False, default=0, repr=False)
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
"""Initialize closed driver state."""
|
||||
self._is_open = False
|
||||
self._current_position = 0
|
||||
|
||||
def open(self) -> None:
|
||||
"""Validate config and open driver."""
|
||||
self._validate()
|
||||
self._is_open = True
|
||||
self.switch_to(self.default_position)
|
||||
|
||||
def close(self) -> None:
|
||||
"""Close mock driver."""
|
||||
self._is_open = False
|
||||
|
||||
def position_count(self) -> int:
|
||||
"""Return number of supported positions."""
|
||||
return self.positions
|
||||
|
||||
def switch_to(self, position: int) -> None:
|
||||
"""Switch to requested position."""
|
||||
if not self._is_open:
|
||||
raise RuntimeError(f"Switch driver is not open for {self.name}")
|
||||
if position < 0 or position >= self.positions:
|
||||
raise ValueError(f"Position out of range for {self.name}: {position}")
|
||||
self._current_position = int(position)
|
||||
|
||||
@property
|
||||
def current_position(self) -> int:
|
||||
"""Return current position."""
|
||||
return self._current_position
|
||||
|
||||
def _validate(self) -> None:
|
||||
"""Validate mock driver parameters."""
|
||||
if self.positions <= 0:
|
||||
raise ValueError(f"Switch positions must be > 0 for {self.name}")
|
||||
if self.default_position < 0 or self.default_position >= self.positions:
|
||||
raise ValueError(f"Switch default_position out of range for {self.name}")
|
||||
Reference in New Issue
Block a user