From 822e74c1aa3c832eb59c04eb323669a65f812ed4 Mon Sep 17 00:00:00 2001 From: Kai Chappell Date: Wed, 25 Jun 2025 19:25:42 +0000 Subject: [PATCH] Refactor Transport from Protocol to ABC for explicit interface implementation --- src/py_dvt_ate/instruments/transport/base.py | 34 +++++++++++++------- src/py_dvt_ate/instruments/transport/tcp.py | 6 ++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/py_dvt_ate/instruments/transport/base.py b/src/py_dvt_ate/instruments/transport/base.py index 7cb2e87..0538114 100644 --- a/src/py_dvt_ate/instruments/transport/base.py +++ b/src/py_dvt_ate/instruments/transport/base.py @@ -1,31 +1,38 @@ -"""Base transport protocol for instrument communication.""" +"""Base transport interface for instrument communication.""" -from typing import Protocol +from abc import ABC, abstractmethod -class Transport(Protocol): +class Transport(ABC): """Abstract transport interface for instrument communication. - This protocol defines the interface that all transport implementations - (TCP, VISA, etc.) must satisfy. It provides basic connection management - and communication primitives for SCPI-based instruments. + This abstract base class defines the interface that all transport + implementations (TCP, VISA, etc.) must implement. It provides basic + connection management and communication primitives for SCPI-based + instruments. + + Implementations must inherit from this class and implement all abstract + methods. """ + @abstractmethod def connect(self) -> None: """Establish connection to instrument. Raises: ConnectionError: If connection fails. """ - ... + pass + @abstractmethod def disconnect(self) -> None: """Close connection to instrument. Should be idempotent - safe to call multiple times. """ - ... + pass + @abstractmethod def write(self, command: str) -> None: """Send command to instrument. @@ -36,8 +43,9 @@ class Transport(Protocol): ConnectionError: If not connected. IOError: If write fails. """ - ... + pass + @abstractmethod def read(self, timeout: float | None = None) -> str: """Read response from instrument. @@ -52,8 +60,9 @@ class Transport(Protocol): TimeoutError: If read times out. IOError: If read fails. """ - ... + pass + @abstractmethod def query(self, command: str, timeout: float | None = None) -> str: """Send command and read response. @@ -71,13 +80,14 @@ class Transport(Protocol): TimeoutError: If read times out. IOError: If communication fails. """ - ... + pass @property + @abstractmethod def is_connected(self) -> bool: """Check if connection is active. Returns: True if connected, False otherwise. """ - ... + pass diff --git a/src/py_dvt_ate/instruments/transport/tcp.py b/src/py_dvt_ate/instruments/transport/tcp.py index 32b82f0..342b75d 100644 --- a/src/py_dvt_ate/instruments/transport/tcp.py +++ b/src/py_dvt_ate/instruments/transport/tcp.py @@ -3,11 +3,13 @@ import socket from typing import Any +from py_dvt_ate.instruments.transport.base import Transport -class TCPTransport: + +class TCPTransport(Transport): """TCP socket transport implementation. - Implements the Transport protocol for communicating with SCPI + Implements the Transport interface for communicating with SCPI instruments over TCP/IP using newline-terminated messages. Attributes: