diff --git a/api/advent22_api/core/webdav.py b/api/advent22_api/core/webdav.py index 66d1e20..d10de41 100644 --- a/api/advent22_api/core/webdav.py +++ b/api/advent22_api/core/webdav.py @@ -1,7 +1,5 @@ import re -from contextlib import asynccontextmanager -from io import BytesIO, TextIOWrapper -from typing import AsyncContextManager, AsyncIterator +from io import BytesIO from cache import AsyncTTL from webdav3.client import Client as WebDAVclient @@ -44,38 +42,25 @@ class WebDAV: return cls._webdav_client.check(path) + @AsyncTTL(time_to_live=SETTINGS.cache_ttl) @classmethod - async def read_buffer(cls, path: str) -> AsyncContextManager[BytesIO]: + async def read_bytes(cls, path: str) -> bytes: """ - Datei aus Pfad `path` in einen `BytesIO` Puffer laden + Datei aus Pfad `path` als bytes laden """ - @AsyncTTL(time_to_live=SETTINGS.cache_ttl) - async def inner() -> BytesIO: - buffer = BytesIO() - cls._webdav_client.resource(path).write_to(buffer) - return buffer - - @asynccontextmanager - async def ctx() -> AsyncIterator[BytesIO]: - buffer = await inner() - buffer.seek(0) - yield buffer - - return ctx() + buffer = BytesIO() + cls._webdav_client.resource(path).write_to(buffer) + return buffer.read() @AsyncTTL(time_to_live=SETTINGS.cache_ttl) @classmethod - async def read_text(cls, path: str, encoding="utf-8") -> str: + async def read_str(cls, path: str, encoding="utf-8") -> str: """ - Datei aus Pfad `path` als string zurückgeben + Datei aus Pfad `path` als string laden """ - async with await cls.read_buffer(path) as buffer: - tio = TextIOWrapper(buffer, encoding=encoding) - tio.seek(0) - - return tio.read().strip() + return (await cls.read_bytes(path)).decode(encoding=encoding).strip() @classmethod async def write_buffer(cls, path: str, buffer: BytesIO) -> None: @@ -86,7 +71,7 @@ class WebDAV: cls._webdav_client.resource(path).read_from(buffer) @classmethod - async def write_text(cls, path: str, content: str, encoding="utf-8") -> None: + async def write_str(cls, path: str, content: str, encoding="utf-8") -> None: """ String `content` in Datei in Pfad `path` schreiben """ diff --git a/api/asynccontextmanager.py b/api/asynccontextmanager.py deleted file mode 100644 index 25abf5c..0000000 --- a/api/asynccontextmanager.py +++ /dev/null @@ -1,56 +0,0 @@ -import asyncio -import functools -from io import BytesIO - -from cache import AsyncLRU - -FILES = __file__, "pyproject.toml" -REPS = 3 - -# -# sync impl -# - - -@functools.lru_cache -def get_bytes_sync(fn) -> bytes: - print("sync open") - with open(fn, "rb") as file: - return file.readline() - - -def get_buf_sync(fn) -> BytesIO: - return BytesIO(get_bytes_sync(fn)) - - -def main_sync() -> None: - for fn in FILES: - for _ in range(REPS): - print(get_buf_sync(fn).read()) - - -# -# async impl -# - - -@AsyncLRU() -async def get_bytes_async(fn) -> bytes: - print("async open") - with open(fn, "rb") as file: - return file.readline() - - -async def get_buf_async(fn) -> BytesIO: - return BytesIO(await get_bytes_async(fn)) - - -async def main_async() -> None: - for fn in FILES: - for _ in range(REPS): - print((await get_buf_async(fn)).read()) - - -if __name__ == "__main__": - main_sync() - asyncio.run(main_async())