From a107662e996b65ede53e5bd9f75518e265aa4366 Mon Sep 17 00:00:00 2001 From: IluaAir Date: Wed, 18 Mar 2026 00:15:09 +0300 Subject: [PATCH] Enhance OxiAPI and Node classes with type hints and property updates - Updated the `OxiAPI` class to check for `None` explicitly when setting authentication credentials. - Added type hints to the `Node` class and introduced a TODO for future enhancements. - Refactored properties in the `NodeView` class to include type hints and improved handling of optional data retrieval. --- oxi/core.py | 3 ++- oxi/interfaces/contract.py | 4 ++-- oxi/node.py | 2 +- oxi/view.py | 27 ++++++++++++++++----------- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/oxi/core.py b/oxi/core.py index 9a618f2..fa14a57 100644 --- a/oxi/core.py +++ b/oxi/core.py @@ -3,6 +3,7 @@ from requests import Session from .node import Node +# TODO: Add custom adapter for Oxi class OxiAPI: def __init__( self, @@ -14,7 +15,7 @@ class OxiAPI: self.base_url = url.rstrip("/") self._session = Session() self._session.verify = verify - if username and password: + if username is not None and password is not None: self._session.auth = (username, password) self.node = Node(self._session, self.base_url) diff --git a/oxi/interfaces/contract.py b/oxi/interfaces/contract.py index 091e663..d5bbb24 100644 --- a/oxi/interfaces/contract.py +++ b/oxi/interfaces/contract.py @@ -8,7 +8,7 @@ class Base(BaseModel): class System(BaseModel): """ - Requred + Required """ model: str @@ -18,7 +18,7 @@ class System(BaseModel): class Interfaces(Base): """ - Requred + Required """ name: str = Field(alias="interface") diff --git a/oxi/node.py b/oxi/node.py index a93caa0..0ea9b20 100644 --- a/oxi/node.py +++ b/oxi/node.py @@ -7,11 +7,11 @@ if TYPE_CHECKING: from requests import Session +# TODO: Add type hints class Node: def __init__(self, session: "Session", base_url: str): self._session = session self._base_url = base_url - self._data = None def __call__(self, name: str) -> NodeView: url = f"{self._base_url}/node/show/{name}" diff --git a/oxi/view.py b/oxi/view.py index 0e12cf2..88e4885 100644 --- a/oxi/view.py +++ b/oxi/view.py @@ -20,36 +20,41 @@ class NodeView: return response.status_code @property - def ip(self): + def name(self) -> str: + return self._data.get("name") + + @property + def ip(self) -> str: return self._data.get("ip") @property - def full_name(self): + def full_name(self) -> str: return self._data.get("full_name") @property - def group(self): + def group(self) -> str: return self._data.get("group") @property - def model(self): + def model(self) -> str: return self._data.get("model") @property - def last_status(self): - return self._data.get("last").get("status") + def last_status(self) -> str: + last = self._data.get("last") or {} + return last.get("status") @property - def last_check(self): - return self._data.get("last").get("start") + def last_check(self) -> str: + last = self._data.get("last") or {} + return last.get("start") - @property - def refresh(self): + def refresh(self) -> str: result = self._updater() if result != 200: raise ValueError(f"Failed to refresh node {self.full_name}") return "OK" @cached_property - def config(self): + def config(self) -> NodeConfig: return NodeConfig(self._session, self.full_name, self.model, self._base_url)