diff --git a/app/appstate.py b/app/appstate.py index 10feeaf..e77e806 100644 --- a/app/appstate.py +++ b/app/appstate.py @@ -12,12 +12,13 @@ from enum import Enum from functools import cmp_to_key from urllib.parse import quote_plus, quote from typing import List, Set, Dict, Tuple, Optional, Type, Sequence, NamedTuple, Any -from pydantic import BaseModel, Field +from pydantic import BaseModel from .appconfig import REPOSITORIES from .utils import vercmp, version_is_newer_than, extract_upstream_version, split_depends, \ split_optdepends, strip_vcs from .pgp import parse_signature +from .pkgmeta import PkgMeta, PkgMetaEntry PackageKey = Tuple[str, str, str, str, str] @@ -142,21 +143,6 @@ class Repository: return sum(int(p.isize) for p in self.packages) -class PkgMetaEntry(BaseModel): - - internal: bool = Field(default=False) - """If the package is MSYS2 internal or just a meta package""" - - references: Dict[str, Optional[str]] = Field(default_factory=dict) - """References to third party repositories""" - - -class PkgMeta(BaseModel): - - packages: Dict[str, PkgMetaEntry] - """A mapping of pkgbase names to PkgMetaEntry""" - - class BuildStatusBuild(BaseModel): desc: Optional[str] status: str diff --git a/app/fetch.py b/app/fetch.py index 815e18e..708c97e 100644 --- a/app/fetch.py +++ b/app/fetch.py @@ -10,7 +10,6 @@ import traceback import hashlib import functools import gzip -import yaml import datetime from asyncio import Event from urllib.parse import urlparse, quote_plus @@ -21,8 +20,9 @@ import httpx from aiolimiter import AsyncLimiter import zstandard -from .appstate import state, Source, get_repositories, SrcInfoPackage, Package, DepType, Repository, BuildStatus, PkgMeta, \ +from .appstate import state, Source, get_repositories, SrcInfoPackage, Package, DepType, Repository, BuildStatus, \ ExtInfo, ExtId +from .pkgmeta import PkgMeta, parse_yaml from .appconfig import CYGWIN_METADATA_URL, REQUEST_TIMEOUT, AUR_METADATA_URL, ARCH_REPO_CONFIG, PKGMETA_URLS, \ SRCINFO_URLS, UPDATE_INTERVAL, BUILD_STATUS_URLS, UPDATE_MIN_RATE, UPDATE_MIN_INTERVAL, PYPI_URLS from .utils import version_is_newer_than, arch_version_to_msys, extract_upstream_version @@ -386,7 +386,7 @@ async def update_pkgmeta() -> None: for url in urls: print("Loading %r" % url) data = await get_content_cached(url, timeout=REQUEST_TIMEOUT) - merged.packages.update(PkgMeta.parse_obj(yaml.safe_load(data)).packages) + merged.packages.update(parse_yaml(data).packages) state.pkgmeta = merged await update_pypi_versions(merged) diff --git a/app/pkgmeta.py b/app/pkgmeta.py new file mode 100644 index 0000000..b053e04 --- /dev/null +++ b/app/pkgmeta.py @@ -0,0 +1,27 @@ +# Copyright 2023 Christoph Reiter +# SPDX-License-Identifier: MIT + +import yaml +from pydantic import BaseModel, Field +from typing import Dict, Optional + + +class PkgMetaEntry(BaseModel): + + internal: bool = Field(default=False) + """If the package is MSYS2 internal or just a meta package""" + + references: Dict[str, Optional[str]] = Field(default_factory=dict) + """References to third party repositories""" + + +class PkgMeta(BaseModel): + + packages: Dict[str, PkgMetaEntry] + """A mapping of pkgbase names to PkgMetaEntry""" + + +def parse_yaml(data: bytes) -> PkgMeta: + """Parse a YAML string into a PkgMeta object""" + + return PkgMeta.model_validate(yaml.safe_load(data))