From aed742208e72d5c54e28570cf6022e8c39102f5a Mon Sep 17 00:00:00 2001 From: alejo Date: Sun, 23 Apr 2023 15:41:58 +0200 Subject: [PATCH] added type hinting, document string, TODO statements, fixed small type in readme --- README.md | 2 +- python/mujinwebstackclient/__init__.py | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 00fc91c..02b6c5b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This is an open-source client library communicating with the Mujin Controller We - Versions have three numbers: MAJOR.MINOR.PATCH - - All versions with the same MAJOR.MINOR number have the same API ande are ABI compatible. + - All versions with the same MAJOR.MINOR number have the same API and are ABI compatible. ## Running on Linux diff --git a/python/mujinwebstackclient/__init__.py b/python/mujinwebstackclient/__init__.py index 62a8052..3fd57e8 100644 --- a/python/mujinwebstackclient/__init__.py +++ b/python/mujinwebstackclient/__init__.py @@ -4,6 +4,7 @@ from .version import __version__ # noqa: F401 import six +from typing import Optional try: import ujson as json # noqa: F401 @@ -49,15 +50,15 @@ class ClientExceptionBase(Exception): """ _message = None # the error message, should be unicode - def __init__(self, message=''): - if message is not None and not isinstance(message, six.text_type): + def __init__(self, message: Optional[str]='') -> None: + if message is not None and not isinstance(message, six.text_type): message = message.decode('utf-8', 'ignore') self._message = message - def __str__(self): + def __str__(self) -> str: return u'%s: %s' % (self.__class__.__name__, self._message) - def __repr__(self): + def __repr__(self) -> str: return '<%s(message=%r)>' % (self.__class__.__name__, self._message) @@ -69,7 +70,7 @@ class APIServerError(ClientExceptionBase): _detailInfo = None # dcit, the detailed info _inputcommand = None # the command sent to the server - def __init__(self, message, errorcode=None, inputcommand=None, detailInfoType=None, detailInfo=None): + def __init__(self, message: str, errorcode: Optional[int]=None, inputcommand: Optional[str]=None, detailInfoType: Optional[str]=None, detailInfo: Optional[dict]=None) -> None: if message is not None and not isinstance(message, six.text_type): message = message.decode('utf-8', 'ignore') self._message = message @@ -78,7 +79,7 @@ def __init__(self, message, errorcode=None, inputcommand=None, detailInfoType=No self._detailInfoType = detailInfoType self._detailInfo = detailInfo - def __str__(self): + def __str__(self) -> str: if self._message is not None: return _('API Server Error: %s')%self._message @@ -88,7 +89,7 @@ def __repr__(self): return '<%s(message=%r, errorcode=%r, inputcommand=%r, detailInfoType=%r, detailInfo=%r)>' % (self.__class__.__name__, self._message, self._errorcode, self._inputcommand, self._detailInfoType, self._detailInfo) @property - def message(self): + def message(self) -> str: """The error message from server.""" return self._message @@ -98,16 +99,17 @@ def errorcode(self): return self._errorcode @property - def stacktrace(self): + def stacktrace(self) -> str: + """The stack trace for the error""" return '' @property - def inputcommand(self): + def inputcommand(self) -> Optional[str]: """The command that was sent to the server. Could be None.""" return self._inputcommand @property - def detailInfoType(self): + def detailInfoType(self) -> Optional[str]: """string for the detai info type""" return self._detailInfoType @@ -125,7 +127,7 @@ class AuthenticationError(ClientExceptionBase): class WebstackClientError(ClientExceptionBase): - + """Exeption class for errors returned by the web stack client""" _response = None # http response that resulted in the error def __init__(self, message='', response=None): @@ -134,6 +136,7 @@ def __init__(self, message='', response=None): @property def response(self): + """The http response that resulted in the error""" return self._response