cli/repology: dump raw cache

JSON serializer from Pydantic will be used, resulting in possibly better
perfomance.
This commit is contained in:
Anna “CyberTailor” 2024-04-26 21:47:33 +05:00
parent 7ec4b058eb
commit c632100837
Signed by: CyberTaIlor
GPG Key ID: E7B76EDC50864BB1
3 changed files with 13 additions and 16 deletions

View File

@ -110,7 +110,7 @@ def _get_cache_path(cache_key: SupportsBytes) -> Path:
return file.with_suffix(".json")
def write_json_cache(data: Any, cache_key: SupportsBytes,
def write_json_cache(data: Any, cache_key: SupportsBytes, *, raw: bool = False,
**kwargs: Any) -> None:
"""
Write a JSON cache file in a temporary directory. Keyword arguments are
@ -118,6 +118,7 @@ def write_json_cache(data: Any, cache_key: SupportsBytes,
:param data: data to serialize
:param cache_key: cache key object
:param raw: skip encoding and write raw data instead
"""
cache = _get_cache_path(cache_key)
@ -128,6 +129,9 @@ def write_json_cache(data: Any, cache_key: SupportsBytes,
with open(cache, "wb") as file:
try:
if raw:
cache.write_bytes(bytes(data))
return
json.dump(data, file, **kwargs)
except OSError:
pass

View File

@ -12,7 +12,7 @@ import gentoopm
import repology_client
import repology_client.exceptions
from gentoopm.basepm.atom import PMAtom
from pydantic import RootModel, TypeAdapter
from pydantic import TypeAdapter
from repology_client.types import Package
from sortedcontainers import SortedSet
@ -43,15 +43,9 @@ def _projects_from_raw_json(raw_json: str | bytes) -> ProjectsMapping:
return projects_adapter.validate_json(raw_json)
def _projects_to_json(data: ProjectsMapping) -> dict[str, list]:
result: dict[str, list] = {}
for project, packages in data.items():
result[project] = []
for pkg in packages:
pkg_model = RootModel[Package](pkg)
pkg_dump = pkg_model.model_dump(mode="json", exclude_none=True)
result[project].append(pkg_dump)
return result
def _projects_to_raw_json(data: ProjectsMapping) -> bytes:
projects_adapter = TypeAdapter(ProjectsMapping)
return projects_adapter.dump_json(data, exclude_none=True)
def _collect_version_bumps(data: Iterable[set[Package]],
@ -105,8 +99,8 @@ async def _outdated(options: Options) -> None:
return
options.say(Message.CACHE_WRITE)
with dots():
json_data = _projects_to_json(data)
write_json_cache(json_data, options.cache_key)
raw_json_data = _projects_to_raw_json(data)
write_json_cache(raw_json_data, options.cache_key, raw=True)
no_work = True
for bump in _collect_version_bumps(data.values(), options):

View File

@ -2,7 +2,6 @@
# SPDX-FileCopyrightText: 2024 Anna <cyber@sysrq.in>
# No warranty
import json
from sortedcontainers import SortedSet
from repology_client.types import Package
@ -11,7 +10,7 @@ from find_work.cli import Options
from find_work.cli.repology import (
_collect_version_bumps,
_projects_from_raw_json,
_projects_to_json,
_projects_to_raw_json,
)
@ -34,7 +33,7 @@ def test_projects_json_roundtrip():
),
},
}
assert data == _projects_from_raw_json(json.dumps(_projects_to_json(data)))
assert data == _projects_from_raw_json(_projects_to_raw_json(data))
def test_collect_version_bumps():