From cf812f23cdb77183578593c27d0bb8596b3fc841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn-Michael=20Miehe?= Date: Thu, 27 Oct 2022 23:32:45 +0000 Subject: [PATCH] DAV Caching --- api/advent22_api/dav_common.py | 12 ++++++++---- api/advent22_api/routers/_misc.py | 7 ++++--- api/advent22_api/routers/days.py | 1 + api/advent22_api/settings.py | 3 +++ api/poetry.lock | 13 ++++++++++++- api/pyproject.toml | 1 + 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/api/advent22_api/dav_common.py b/api/advent22_api/dav_common.py index ab602d6..9a83a1b 100644 --- a/api/advent22_api/dav_common.py +++ b/api/advent22_api/dav_common.py @@ -1,7 +1,7 @@ import re from io import BytesIO, TextIOWrapper -from typing import TextIO +from cache import AsyncTTL from webdav3.client import Client as WebDAVclient from .settings import SETTINGS @@ -14,6 +14,7 @@ _WEBDAV_CLIENT = WebDAVclient({ }) +@AsyncTTL(time_to_live=SETTINGS.cache_ttl) async def dav_list_files(regex: re.Pattern, directory: str = "") -> list[str]: ls = _WEBDAV_CLIENT.list(directory) return [ @@ -23,15 +24,18 @@ async def dav_list_files(regex: re.Pattern, directory: str = "") -> list[str]: ] +@AsyncTTL(time_to_live=SETTINGS.cache_ttl) async def dav_get_file(path: str) -> BytesIO: resource = _WEBDAV_CLIENT.resource(path) buffer = BytesIO() resource.write_to(buffer) - buffer.seek(0) return buffer -async def dav_get_textfile(path: str, encoding="utf-8") -> TextIO: +@AsyncTTL(time_to_live=SETTINGS.cache_ttl) +async def dav_get_textfile_content(path: str, encoding="utf-8") -> str: buffer = await dav_get_file(path) - return TextIOWrapper(buffer, encoding=encoding) + tio = TextIOWrapper(buffer, encoding=encoding) + tio.seek(0) + return tio.read().strip() diff --git a/api/advent22_api/routers/_misc.py b/api/advent22_api/routers/_misc.py index f1c98de..d59d3f1 100644 --- a/api/advent22_api/routers/_misc.py +++ b/api/advent22_api/routers/_misc.py @@ -2,12 +2,13 @@ import itertools import random from typing import Any, Sequence -from ..dav_common import dav_get_textfile +from advent22_api.settings import SETTINGS + +from ..dav_common import dav_get_textfile_content async def get_loesungswort() -> str: - fp = await dav_get_textfile("loesungswort.txt") - return fp.read().strip() + return await dav_get_textfile_content(SETTINGS.solution_filename) async def get_rnd(bonus_salt: Any = "") -> random.Random: diff --git a/api/advent22_api/routers/days.py b/api/advent22_api/routers/days.py index 80112a1..298bd3a 100644 --- a/api/advent22_api/routers/days.py +++ b/api/advent22_api/routers/days.py @@ -77,6 +77,7 @@ async def load_image( # Bild laden img_buffer = await dav_get_file(images[index]) + img_buffer.seek(0) return await AdventImage.load_standard(img_buffer) diff --git a/api/advent22_api/settings.py b/api/advent22_api/settings.py index ddf8fe4..f93e414 100644 --- a/api/advent22_api/settings.py +++ b/api/advent22_api/settings.py @@ -50,6 +50,9 @@ class Settings(BaseSettings): webdav: DavSettings = DavSettings() + cache_ttl: int = 30 + solution_filename: str = "loesungswort.txt" + class Config: env_file = ".env" env_file_encoding = "utf-8" diff --git a/api/poetry.lock b/api/poetry.lock index 1acaf54..081e267 100644 --- a/api/poetry.lock +++ b/api/poetry.lock @@ -15,6 +15,14 @@ doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] trio = ["trio (>=0.16)"] +[[package]] +name = "async-cache" +version = "1.1.1" +description = "An asyncio Cache" +category = "main" +optional = false +python-versions = ">=3.3" + [[package]] name = "certifi" version = "2022.9.24" @@ -316,13 +324,16 @@ python-versions = ">=3.7" [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "eb18799d40638df47cfa261dd96d530cfefdcdc60bde70f156d48820e870a144" +content-hash = "d37ea64eccdac520a3649119169642395eaeeb42ab20668c444774f2baccede3" [metadata.files] anyio = [ {file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"}, {file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"}, ] +async-cache = [ + {file = "async-cache-1.1.1.tar.gz", hash = "sha256:81aa9ccd19fb06784aaf30bd5f2043dc0a23fc3e998b93d0c2c17d1af9803393"}, +] certifi = [ {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, diff --git a/api/pyproject.toml b/api/pyproject.toml index ac09794..f05e958 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -15,6 +15,7 @@ uvicorn = {extras = ["standard"], version = "^0.18.3"} Pillow = "^9.2.0" numpy = "^1.23.3" webdavclient3 = "3.14.5" +async-cache = "^1.1.1" [tool.poetry.dev-dependencies]