Skip to content

Commit b519e67

Browse files
committed
wip: rewrite repository
An LRU cache makes 0 sense here
1 parent 83dda60 commit b519e67

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

questionpy_server/repository/__init__.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,46 @@
33
# (c) Technische Universität Berlin, innoCampus <info@isis.tu-berlin.de>
44

55
import logging
6+
import re
67
from asyncio import to_thread
78
from gzip import decompress
8-
from urllib.parse import urljoin
9+
from urllib.parse import urljoin, urlparse
910

1011
from questionpy_server.cache import CacheItemTooLargeError, FileCache
1112
from questionpy_server.repository.helper import download
1213
from questionpy_server.repository.models import RepoMeta, RepoPackage, RepoPackageIndex
1314
from questionpy_server.utils.logger import URLAdapter
1415

16+
_SCHEME_AND_AUTH_PATTERN = re.compile(r"^https?://(?:[^/]+@)?")
17+
_FILENAME_SPECIAL_CHARACTERS_PATTERN = re.compile(r"[/\\?%*:|\"<>,;=\s]+")
18+
19+
def _url_to_safe_path_part(url: str) -> str:
20+
return _FILENAME_SPECIAL_CHARACTERS_PATTERN.sub("-", _SCHEME_AND_AUTH_PATTERN.sub("", url))
1521

1622
class Repository:
1723
def __init__(self, url: str, cache: FileCache):
1824
self._url_base = url
1925
self._url_index = urljoin(self._url_base, "PACKAGES.json.gz")
2026
self._url_meta = urljoin(self._url_base, "META.json")
2127

28+
self._cache_key = _url_to_safe_path_part(url)
29+
2230
self._cache = cache
2331

2432
logger = logging.getLogger("questionpy-server:repository")
2533
self._log = URLAdapter(logger, {"url": self._url_base})
2634

2735
async def get_meta(self) -> RepoMeta:
28-
"""Downloads and verifies metadata.
29-
30-
Returns:
31-
RepoMeta: Metadata
32-
"""
36+
"""Downloads and verifies metadata."""
3337
meta = await download(self._url_meta)
3438
# TODO: verify downloaded data
3539
return RepoMeta.model_validate_json(meta)
3640

3741
async def get_packages(self, meta: RepoMeta) -> dict[str, RepoPackage]:
3842
"""Downloads and verifies package index.
3943
40-
Args:
41-
meta (RepoMeta): Metadata
42-
4344
Returns:
44-
dict[str, RepoPackage]: package index, where keys are package hashes
45+
Package index, where keys are package hashes.
4546
"""
4647
try:
4748
# Try to get the index from cache.
@@ -71,11 +72,8 @@ async def get_packages(self, meta: RepoMeta) -> dict[str, RepoPackage]:
7172
async def get_package(self, package: RepoPackage) -> bytes:
7273
"""Download a specific package from the repository.
7374
74-
Args:
75-
package (RepoPackage): repository package
76-
7775
Returns:
78-
bytes: raw package bytes
76+
Raw package bytes.
7977
"""
8078
url = urljoin(self._url_base, package.path)
8179
return await download(url, size=package.size, expected_hash=package.sha256)

0 commit comments

Comments
 (0)