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

1"""Exceptions raised by the signalk_cli library API.""" 

2 

3import contextlib 

4 

5import niquests 

6 

7 

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) 

16 

17 

18class SignalKError(Exception): 

19 """A request to a SignalK server failed. 

20 

21 Attributes: 

22 status_code: HTTP status of the failed response, or None if the 

23 server couldn't be reached. 

24 """ 

25 

26 def __init__(self, message: str, *, status_code: int | None = None) -> None: 

27 super().__init__(message) 

28 self.status_code = status_code 

29 

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 )