From fb45d7291ca877d9d72825f90f804c0e33614f17 Mon Sep 17 00:00:00 2001 From: Mikhail Zelenyy Date: Fri, 13 Oct 2023 22:33:07 +0300 Subject: [PATCH] For homework 3 --- controls/__init__.py | 0 controls/device.py | 82 +++++++++++++++++++++++++++ equipment/__init__.py | 0 equipment/turtle_device.py | 8 +++ tests/controls/test_device.py | 12 ++++ tests/equipment/test_turtle_device.py | 13 +++++ 6 files changed, 115 insertions(+) create mode 100644 controls/__init__.py create mode 100644 controls/device.py create mode 100644 equipment/__init__.py create mode 100644 equipment/turtle_device.py create mode 100644 tests/controls/test_device.py create mode 100644 tests/equipment/test_turtle_device.py diff --git a/controls/__init__.py b/controls/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/controls/device.py b/controls/device.py new file mode 100644 index 0000000..d126692 --- /dev/null +++ b/controls/device.py @@ -0,0 +1,82 @@ +from dataclasses import dataclass +from typing import Optional, Collection, Any +from abc import abstractmethod + +class DeviceLifecycleState: + pass # TODO(Homework #3) + + +class DevaceError(Exception): + pass + + +class NonReadableTrait(Exception): + pass + + +class NonWritableTrait(Exception): + pass + + +@dataclass +class TraitDescriptor: + name: str + info: Optional[str] = None + readable: bool = True + writable: bool = False + + +@dataclass +class ActionDescriptor: + name: str + arguments: dict[str, type] + info: Optional[str] = None + + +class Device: + # TODO(Homework #3) + _state = DeviceLifecycleState.INIT + + @property + def state(self) -> DeviceLifecycleState: + return self._state + + def close(self): + self._state = DeviceLifecycleState.CLOSE + + def trait_descriptors(self) -> Collection[TraitDescriptor]: + pass + + def action_descriptors(self) -> Collection[ActionDescriptor]: + pass + + @abstractmethod + def __getitem__(self, trait_name: str) -> Optional[Any]: + """Return logical state of trait `trait_name`.""" + pass + + +class SynchronyDevice(Device): + + def open(self): + self._state = DeviceLifecycleState.OPEN + + @abstractmethod + def execute(self, action_name: str, *args, **kwargs): + """Execute action `action_name`, using `args` and `kwargs` as action argument.""" + pass + + @abstractmethod + def read(self, trait_name: str) -> Any: + """Read physical state of trait `trait_name` from device.""" + raise NonReadableTrait + + @abstractmethod + def write(self, trait_name: str, value: Any) -> bool: + """Pass `value` to trait `trait_name` of device.""" + raise NonWritableTrait + + @abstractmethod + def invalidate(self, trait_name: str): + """Invalidate logical state of trait `trait_name`""" + pass \ No newline at end of file diff --git a/equipment/__init__.py b/equipment/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/equipment/turtle_device.py b/equipment/turtle_device.py new file mode 100644 index 0000000..3ba251f --- /dev/null +++ b/equipment/turtle_device.py @@ -0,0 +1,8 @@ +from turtle import Turtle +from controls.device import SynchronyDevice + +class TurtleDevice(SynchronyDevice): + pass # TODO(Homework #3) + + + diff --git a/tests/controls/test_device.py b/tests/controls/test_device.py new file mode 100644 index 0000000..51249ad --- /dev/null +++ b/tests/controls/test_device.py @@ -0,0 +1,12 @@ +from unittest import TestCase + +from controls.device import DeviceLifecycleState + + +class DeviceLifecycleStateTest(TestCase): + + def setUp(self) -> None: + pass + + def test_enum(self): + self.assertEqual(DeviceLifecycleStateTest["INIT"], DeviceLifecycleStateTest.INIT) diff --git a/tests/equipment/test_turtle_device.py b/tests/equipment/test_turtle_device.py new file mode 100644 index 0000000..a12912b --- /dev/null +++ b/tests/equipment/test_turtle_device.py @@ -0,0 +1,13 @@ +from unittest import TestCase + +from equipment.turtle_device import TurtleDevice + + +class TurtleDeviceTest(TestCase): + + def setUp(self) -> None: + self.device = TurtleDevice() + + def test_open(self): + self.device.open() + self.device.close() \ No newline at end of file