From e57534cfdc14c21b30c2a1d16f3805fc354e75b3 Mon Sep 17 00:00:00 2001 From: Louis Orleans Date: Tue, 10 Feb 2026 14:29:33 -0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=9A=A7=20implement=20sparkle=20parser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nix_update/version/__init__.py | 2 ++ nix_update/version/sparkle.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 nix_update/version/sparkle.py diff --git a/nix_update/version/__init__.py b/nix_update/version/__init__.py index 78b134a..902a6f6 100644 --- a/nix_update/version/__init__.py +++ b/nix_update/version/__init__.py @@ -22,6 +22,7 @@ from .rubygems import fetch_rubygem_versions from .savannah import fetch_savannah_versions from .sourcehut import fetch_sourcehut_snapshots, fetch_sourcehut_versions +from .sparkle import fetch_sparkle_versions from .version import Version, VersionPreference @@ -71,6 +72,7 @@ def __call__( fetch_rubygem_versions, fetch_savannah_versions, fetch_sourcehut_versions, + fetch_sparkle_versions, fetch_bitbucket_versions, # all entries below perform requests to check if the target url is of that type fetch_gitea_versions, diff --git a/nix_update/version/sparkle.py b/nix_update/version/sparkle.py new file mode 100644 index 0000000..3d8531e --- /dev/null +++ b/nix_update/version/sparkle.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from nix_update.utils import info + +from .http import urlopen, DEFAULT_TIMEOUT +# from urllib.request import urlopen +import xml.etree.ElementTree as ET +from .version import Version + +if TYPE_CHECKING: + from urllib.parse import ParseResult + + +def fetch_sparkle_versions(url: ParseResult) -> list[Version]: + # https://fork.dev/update/feed-stable.xml + # if the URL isn't an xml document, it can't be sparkle + if not url.path.endswith(".xml"): + return [] + + with urlopen(url.geturl(), timeout=DEFAULT_TIMEOUT) as resp: + xml = resp.read() + info(f"xml: {xml}") + tree = ET.fromstring(xml) + + # tree.findall("enclosure").sort(key=lambda enc: enc.attrib["sparkle:version"]) + versions = tree.findall(".//channel/item/enclosure") + info(versions) + # for enclosure in tree.findall("enclosure"): + + return [versions[0].attrib["sparkle:version"]] From c17ede17435e650ab88828e8e78f33e86e2a1133 Mon Sep 17 00:00:00 2001 From: Louis Orleans Date: Thu, 12 Feb 2026 11:49:09 -0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nix_update/version/sparkle.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix_update/version/sparkle.py b/nix_update/version/sparkle.py index 3d8531e..f7681de 100644 --- a/nix_update/version/sparkle.py +++ b/nix_update/version/sparkle.py @@ -1,17 +1,17 @@ from __future__ import annotations +import xml.etree.ElementTree as ET from typing import TYPE_CHECKING from nix_update.utils import info -from .http import urlopen, DEFAULT_TIMEOUT -# from urllib.request import urlopen -import xml.etree.ElementTree as ET -from .version import Version +from .http import DEFAULT_TIMEOUT, urlopen if TYPE_CHECKING: from urllib.parse import ParseResult + from .version import Version + def fetch_sparkle_versions(url: ParseResult) -> list[Version]: # https://fork.dev/update/feed-stable.xml