From 0e0eb2c363baf8053c20cdd72201296cb2ed4b03 Mon Sep 17 00:00:00 2001 From: yingziwu Date: Sat, 9 Mar 2024 18:41:20 +0800 Subject: [PATCH] feat: add go pkg support (#259) --- docs/usage.rst | 11 +++++++++++ nvchecker_source/go.py | 36 ++++++++++++++++++++++++++++++++++++ tests/test_go.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 nvchecker_source/go.py create mode 100644 tests/test_go.py diff --git a/docs/usage.rst b/docs/usage.rst index 34c07a0..64e27ac 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -946,6 +946,17 @@ Check `Visual Studio Code Marketplace `_ for updates. + +go + The name of Go package or module, e.g. ``github.com/caddyserver/caddy/v2/cmd``. + Combine others' results ~~~~~~~~~~~~~~~~~~~~~~~ :: diff --git a/nvchecker_source/go.py b/nvchecker_source/go.py new file mode 100644 index 0000000..00a017b --- /dev/null +++ b/nvchecker_source/go.py @@ -0,0 +1,36 @@ +# MIT licensed +# Copyright (c) 2024 bgme . + +from lxml import html + +from nvchecker.api import ( + VersionResult, Entry, AsyncCache, KeyManager, + session, GetVersionError, HTTPError +) + +GO_PKG_URL = 'https://pkg.go.dev/{pkg}?tab=versions' + + +async def get_version( + name: str, conf: Entry, *, + cache: AsyncCache, keymanager: KeyManager, + **kwargs, +) -> VersionResult: + key = tuple(sorted(conf.items())) + return await cache.get(key, get_version_impl) + + +async def get_version_impl(info) -> VersionResult: + conf = dict(info) + pkg_name = conf.get('go') + + url = GO_PKG_URL.format(pkg=pkg_name) + res = await session.get(url) + doc = html.fromstring(res.body.decode()) + + elements = doc.xpath("//div[@class='Version-tag']/a/text()") + try: + version = elements[0] + return version + except IndexError: + raise GetVersionError("parse error", pkg_name=pkg_name) diff --git a/tests/test_go.py b/tests/test_go.py new file mode 100644 index 0000000..b0d39aa --- /dev/null +++ b/tests/test_go.py @@ -0,0 +1,36 @@ +# MIT licensed +# Copyright (c) 2024 bgme . + +import pytest + +from nvchecker.api import HTTPError + +lxml_available = True +try: + import lxml +except ImportError: + lxml_available = False + +pytestmark = [ + pytest.mark.asyncio(scope="session"), + pytest.mark.needs_net, + pytest.mark.skipif(not lxml_available, reason="needs lxml") +] + + +async def test_go(get_version): + assert await get_version("one version", { + "source": "go", + "go": "github.com/caddyserver/replace-response", + }) == "v0.0.0-20231221003037-a85d4ddc11d6" + + assert await get_version("multiple version", { + "source": "go", + "go": "github.com/corazawaf/coraza-caddy", + }) == "v1.2.2" + + with pytest.raises(HTTPError): + await get_version("not found", { + "source": "go", + "go": "github.com/asdas/sadfasdf", + })