From cc9001ad887c7f35860192f04b87ca9f2fb0b53c Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Sat, 22 Feb 2025 06:16:54 +0000 Subject: [PATCH] feat: add snapcraft source --- docs/usage.rst | 14 ++++++++++++++ nvchecker_source/snapcraft.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 nvchecker_source/snapcraft.py diff --git a/docs/usage.rst b/docs/usage.rst index c2afdf9..958a07f 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -1080,6 +1080,20 @@ repo This source supports :ref:`list options`. +Check Snapcraft +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:: + + source = "snapcraft" + +This source allows you to check the latest package versions in the `Snapcraft `_. + +snap + Name of the snap package. + +channel + Name of the channel. + Combine others' results ~~~~~~~~~~~~~~~~~~~~~~~ :: diff --git a/nvchecker_source/snapcraft.py b/nvchecker_source/snapcraft.py new file mode 100644 index 0000000..346fe0c --- /dev/null +++ b/nvchecker_source/snapcraft.py @@ -0,0 +1,32 @@ +# MIT licensed +# Copyright (c) 2025 Maxim Slipenko , et al. + +from nvchecker.api import ( + GetVersionError +) + +URL="https://api.snapcraft.io/v2/snaps/info/%(snap)s" + +async def get_version( + name: str, conf, *, + cache, keymanager, + **kwargs, +): + try: + snap = conf.get("snap") + channel = conf.get("channel") + + result = await cache.get_json( + URL % { "snap": snap }, + headers={ + "Snap-Device-Series": "16", + }, + ) + except: + raise GetVersionError(f"Failed to request snap info for {snap}") + + for c in result['channel-map']: + if c['channel']['name'] == channel: + return c['version'] + + raise GetVersionError(f"Failed to find version for {snap}")