Coverage for src/signalk_cli/errors.py: 100%
18 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-06 00:17 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-06 00:17 +0000
1"""Exceptions raised by the signalk_cli library API."""
3import contextlib
5import niquests
8def api_error(exc: niquests.RequestException) -> str:
9 """Return the most informative message from an API error response."""
10 resp = getattr(exc, "response", None)
11 if resp is not None:
12 with contextlib.suppress(Exception):
13 body = resp.json()
14 return body.get("error") or body.get("message") or str(exc)
15 return str(exc)
18class SignalKError(Exception):
19 """A request to a SignalK server failed.
21 Attributes:
22 status_code: HTTP status of the failed response, or None if the
23 server couldn't be reached.
24 """
26 def __init__(self, message: str, *, status_code: int | None = None) -> None:
27 super().__init__(message)
28 self.status_code = status_code
30 @classmethod
31 def from_request(cls, exc: niquests.RequestException) -> "SignalKError":
32 """Wrap a niquests exception, using the server's error message if it sent one."""
33 resp = getattr(exc, "response", None)
34 status = getattr(resp, "status_code", None)
35 return cls(
36 api_error(exc), status_code=status if isinstance(status, int) else None
37 )