mdrs-client-python/mdrsclient/connection.py

108 lines
3.2 KiB
Python
Raw Normal View History

2023-05-17 14:51:19 +09:00
import platform
import threading
2023-07-20 11:43:07 +09:00
from typing import TypedDict
2023-05-10 14:46:08 +09:00
from requests import Response, Session
2024-07-04 12:33:57 +09:00
from requests_toolbelt.multipart.encoder import MultipartEncoder
2023-05-01 20:00:32 +09:00
2023-07-20 11:43:07 +09:00
# Unpack is new in 3.11
from typing_extensions import Unpack
2023-05-17 14:51:19 +09:00
from mdrsclient.__version__ import __version__
2023-05-01 20:00:32 +09:00
from mdrsclient.cache import CacheFile
from mdrsclient.exceptions import MissingConfigurationException
from mdrsclient.models import Laboratories, Token, User
class _KwArgsMDRSConnectionGet(TypedDict, total=False):
params: dict[str, str | int]
stream: bool
class _KwArgsMDRSConnectionPost(TypedDict, total=False):
params: dict[str, str | int]
2024-07-04 12:33:57 +09:00
data: dict[str, str | int] | MultipartEncoder
headers: dict[str, str]
class _KwArgsMDRSConnectionPut(TypedDict, total=False):
params: dict[str, str | int]
2024-07-04 12:33:57 +09:00
data: dict[str, str | int] | MultipartEncoder
headers: dict[str, str]
class _KwArgsMDRSConnectionDelete(TypedDict, total=False):
params: dict[str, str | int]
class MDRSConnection:
2023-05-01 20:00:32 +09:00
url: str
2023-05-10 14:46:08 +09:00
session: Session
lock: threading.Lock
2023-05-01 20:00:32 +09:00
__cache: CacheFile
def __init__(self, remote: str, url: str) -> None:
super().__init__()
self.url = url
2023-05-10 14:46:08 +09:00
self.session = Session()
self.lock = threading.Lock()
2023-05-01 20:00:32 +09:00
self.__cache = CacheFile(remote)
self.__prepare_headers()
def get(self, url: str, **kwargs: Unpack[_KwArgsMDRSConnectionGet]) -> Response:
return self.session.get(self.__build_url(url), **kwargs)
2023-05-10 14:46:08 +09:00
def post(self, url: str, **kwargs: Unpack[_KwArgsMDRSConnectionPost]) -> Response:
return self.session.post(self.__build_url(url), **kwargs)
2023-05-10 14:46:08 +09:00
def put(self, url: str, **kwargs: Unpack[_KwArgsMDRSConnectionPut]) -> Response:
return self.session.put(self.__build_url(url), **kwargs)
2023-05-10 14:46:08 +09:00
def delete(self, url: str, **kwargs: Unpack[_KwArgsMDRSConnectionDelete]) -> Response:
return self.session.delete(self.__build_url(url), **kwargs)
2023-05-01 20:00:32 +09:00
def logout(self) -> None:
del self.__cache.user
del self.__cache.token
self.session.headers.update({"Authorization": ""})
2023-05-01 20:00:32 +09:00
@property
def user(self) -> User | None:
return self.__cache.user
@user.setter
def user(self, user: User) -> None:
self.__cache.user = user
@property
def token(self) -> Token | None:
return self.__cache.token
@token.setter
def token(self, token: Token) -> None:
self.__cache.token = token
self.__prepare_headers()
@property
def laboratories(self) -> Laboratories:
return self.__cache.laboratories
@laboratories.setter
def laboratories(self, laboratories: Laboratories) -> None:
self.__cache.laboratories = laboratories
def __build_url(self, path: str) -> str:
2023-05-10 14:46:08 +09:00
if self.url == "":
raise MissingConfigurationException("remote host is not configured")
return f"{self.url}/{path}"
2023-05-10 14:46:08 +09:00
2023-05-01 20:00:32 +09:00
def __prepare_headers(self) -> None:
2023-05-17 14:51:19 +09:00
self.session.headers.update(
{
"User-Agent": f"MdrsClient/{__version__} (Python {platform.python_version()} - {platform.platform()})",
"Accept": "application/json",
}
)
2023-05-01 20:00:32 +09:00
if self.token is not None:
self.session.headers.update({"Authorization": f"Bearer {self.token.access}"})