From cc4a0cd3013ccdb580867222480bed1b08571556 Mon Sep 17 00:00:00 2001 From: lilydjwg Date: Sat, 14 Oct 2023 14:39:01 +0800 Subject: [PATCH] support url in results --- nvchecker/core.py | 27 +++++++++++++++++++-------- nvchecker/slogconf.py | 5 +++++ nvchecker/util.py | 11 ++++++++++- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/nvchecker/core.py b/nvchecker/core.py index 7875298..ea97e81 100644 --- a/nvchecker/core.py +++ b/nvchecker/core.py @@ -36,7 +36,7 @@ import platformdirs from .lib import nicelogger from . import slogconf from .util import ( - Entry, Entries, KeyManager, RawResult, Result, VersData, + Entry, Entries, KeyManager, RawResult, RichResult, Result, VersData, FunctionWorker, GetVersionError, FileLoadError, EntryWaiter, ) @@ -76,6 +76,7 @@ def process_common_arguments(args: argparse.Namespace) -> bool: processors = [ slogconf.exc_info, slogconf.filter_exc, + slogconf.filter_nones, ] logger_factory = None @@ -329,6 +330,7 @@ def _process_result(r: RawResult) -> Union[Result, Exception]: conf = r.conf name = r.name + url = None if isinstance(version, GetVersionError): kw = version.kwargs kw['name'] = name @@ -340,6 +342,9 @@ def _process_result(r: RawResult) -> Union[Result, Exception]: return version elif isinstance(version, list): version_str = apply_list_options(version, conf) + elif isinstance(version, RichResult): + version_str = version.version + url = version.url else: version_str = version @@ -348,7 +353,7 @@ def _process_result(r: RawResult) -> Union[Result, Exception]: try: version_str = substitute_version(version_str, conf) - return Result(name, version_str, conf) + return Result(name, version_str, conf, url) except (ValueError, re.error) as e: logger.exception('error occurred in version substitutions', name=name) return e @@ -357,13 +362,19 @@ def _process_result(r: RawResult) -> Union[Result, Exception]: return ValueError('no version returned') def check_version_update( - oldvers: VersData, name: str, version: str, + oldvers: VersData, r: Result, ) -> None: - oldver = oldvers.get(name, None) - if not oldver or oldver != version: - logger.info('updated', name=name, version=version, old_version=oldver) + oldver = oldvers.get(r.name, None) + if not oldver or oldver != r.version: + logger.info( + 'updated', + name = r.name, + version = r.version, + old_version = oldver, + url = r.url, + ) else: - logger.debug('up-to-date', name=name, version=version) + logger.debug('up-to-date', name=r.name, version=r.version, url=r.url) async def process_result( oldvers: VersData, @@ -384,7 +395,7 @@ async def process_result( entry_waiter.set_exception(r.name, r1) has_failures = True continue - check_version_update(oldvers, r1.name, r1.version) + check_version_update(oldvers, r1) entry_waiter.set_result(r1.name, r1.version) ret[r1.name] = r1.version except asyncio.CancelledError: diff --git a/nvchecker/slogconf.py b/nvchecker/slogconf.py index fd041f1..68f7166 100644 --- a/nvchecker/slogconf.py +++ b/nvchecker/slogconf.py @@ -39,6 +39,11 @@ def exc_info(logger, level, event): event['exc_info'] = True return event +def filter_nones(logger, level, event): + if 'url' in event and event['url'] is None: + del event['url'] + return event + def filter_exc(logger, level, event): exc_info = event.get('exc_info') if not exc_info: diff --git a/nvchecker/util.py b/nvchecker/util.py index 8d006f4..f347c3a 100644 --- a/nvchecker/util.py +++ b/nvchecker/util.py @@ -13,6 +13,7 @@ from typing import ( from pathlib import Path import contextvars import abc +from dataclasses import dataclass if TYPE_CHECKING: import tomli as tomllib @@ -37,12 +38,19 @@ Entry = Dict[str, Any] Entry.__doc__ = '''The configuration `dict` for an entry.''' Entries = Dict[str, Entry] VersData = Dict[str, str] -VersionResult = Union[None, str, List[str], Exception] + +@dataclass(kw_only=True) +class RichResult: + version: str + url: Optional[str] = None + +VersionResult = Union[None, str, List[str], RichResult, Exception] VersionResult.__doc__ = '''The result of a `get_version` check. * `None` - No version found. * `str` - A single version string is found. * `List[str]` - Multiple version strings are found. :ref:`list options` will be applied. +* `RichResult` - A version string with additional information. * `Exception` - An error occurred. ''' @@ -110,6 +118,7 @@ class Result(NamedTuple): name: str version: str conf: Entry + url: Optional[str] class BaseWorker: '''The base class for defining `Worker` classes for source plugins.