cli/repology: dump raw cache
JSON serializer from Pydantic will be used, resulting in possibly better perfomance.
This commit is contained in:
parent
7ec4b058eb
commit
c632100837
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue
Block a user