diff --git a/lang/python/python-asgiref/Makefile b/lang/python/python-asgiref/Makefile index d2ad9ae963081b..69848879952db6 100644 --- a/lang/python/python-asgiref/Makefile +++ b/lang/python/python-asgiref/Makefile @@ -1,11 +1,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-asgiref -PKG_VERSION:=3.7.2 -PKG_RELEASE:=2 +PKG_VERSION:=3.11.1 +PKG_RELEASE:=1 PYPI_NAME:=asgiref -PKG_HASH:=9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed +PKG_HASH:=5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce PKG_BUILD_DEPENDS:=python-setuptools/host diff --git a/lang/python/python-asgiref/test.sh b/lang/python/python-asgiref/test.sh new file mode 100755 index 00000000000000..9c436420d48dd1 --- /dev/null +++ b/lang/python/python-asgiref/test.sh @@ -0,0 +1,24 @@ +#!/bin/sh +[ "$1" = python3-asgiref ] || exit 0 +python3 - << 'EOF' +import asgiref +assert asgiref.__version__, "asgiref version is empty" + +from asgiref.sync import async_to_sync, sync_to_async +import asyncio + +async def async_add(a, b): + return a + b + +result = async_to_sync(async_add)(3, 4) +assert result == 7, f"async_to_sync failed: {result}" + +def sync_mul(a, b): + return a * b + +async def run(): + result = await sync_to_async(sync_mul)(6, 7) + assert result == 42, f"sync_to_async failed: {result}" + +asyncio.run(run()) +EOF diff --git a/lang/python/python-async-timeout/Makefile b/lang/python/python-async-timeout/Makefile index f6d0a4c89633c2..6bb9d7a954150c 100644 --- a/lang/python/python-async-timeout/Makefile +++ b/lang/python/python-async-timeout/Makefile @@ -8,11 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-async-timeout -PKG_VERSION:=4.0.2 +PKG_VERSION:=5.0.1 PKG_RELEASE:=1 PYPI_NAME:=async-timeout -PKG_HASH:=2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15 +PYPI_SOURCE_NAME:=async_timeout +PKG_HASH:=d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3 PKG_MAINTAINER:=Josef Schlehofer PKG_LICENSE:=Apache-2.0 @@ -30,7 +31,8 @@ define Package/python3-async-timeout URL:=https://github.com/aio-libs/async-timeout DEPENDS:= \ +python3-light \ - +python3-asyncio + +python3-asyncio \ + +python3-logging endef define Package/python3-async-timeout/description diff --git a/lang/python/python-async-timeout/test.sh b/lang/python/python-async-timeout/test.sh new file mode 100644 index 00000000000000..03ac5ffbe9b2e1 --- /dev/null +++ b/lang/python/python-async-timeout/test.sh @@ -0,0 +1,32 @@ +#!/bin/sh +[ "$1" = python3-async-timeout ] || exit 0 + +python3 - << 'EOF' +import asyncio +import async_timeout + +async def test_no_timeout(): + async with async_timeout.timeout(10): + await asyncio.sleep(0) + print("no_timeout OK") + +async def test_timeout_fires(): + try: + async with async_timeout.timeout(0.01): + await asyncio.sleep(1) + assert False, "Should have timed out" + except asyncio.TimeoutError: + print("timeout_fires OK") + +async def test_timeout_none(): + async with async_timeout.timeout(None): + await asyncio.sleep(0) + print("timeout_none OK") + +async def main(): + await test_no_timeout() + await test_timeout_fires() + await test_timeout_none() + +asyncio.run(main()) +EOF diff --git a/lang/python/python-cachelib/Makefile b/lang/python/python-cachelib/Makefile index 6fcef3b4383e68..7d4107b48973ae 100644 --- a/lang/python/python-cachelib/Makefile +++ b/lang/python/python-cachelib/Makefile @@ -5,11 +5,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-cachelib -PKG_VERSION:=0.10.2 +PKG_VERSION:=0.13.0 PKG_RELEASE:=1 PYPI_NAME:=cachelib -PKG_HASH:=593faeee62a7c037d50fc835617a01b887503f972fb52b188ae7e50e9cb69740 +PKG_HASH:=209d8996e3c57595bee274ff97116d1d73c4980b2fd9a34c7846cd07fd2e1a48 PKG_MAINTAINER:=Stepan Henek PKG_LICENSE:=BSD-3-Clause diff --git a/lang/python/python-cachelib/test.sh b/lang/python/python-cachelib/test.sh new file mode 100755 index 00000000000000..4d6a0de95e2179 --- /dev/null +++ b/lang/python/python-cachelib/test.sh @@ -0,0 +1,21 @@ +#!/bin/sh +[ "$1" = python3-cachelib ] || exit 0 +python3 - << 'EOF' +from cachelib import SimpleCache, NullCache + +cache = SimpleCache() +cache.set("key", "value") +assert cache.get("key") == "value", "SimpleCache set/get failed" +assert cache.get("missing") is None +cache.delete("key") +assert cache.get("key") is None, "delete failed" + +cache.set("a", 1) +cache.set("b", 2) +cache.clear() +assert cache.get("a") is None, "clear failed" + +null = NullCache() +null.set("k", "v") +assert null.get("k") is None, "NullCache should not store" +EOF diff --git a/lang/python/python-dns/Makefile b/lang/python/python-dns/Makefile index 03fbffee67a097..5ac612fd942725 100644 --- a/lang/python/python-dns/Makefile +++ b/lang/python/python-dns/Makefile @@ -8,17 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-dns -PKG_VERSION:=2.4.1 +PKG_VERSION:=2.8.0 PKG_RELEASE:=1 PYPI_NAME:=dnspython -PKG_HASH:=c33971c79af5be968bb897e95c2448e11a645ee84d93b265ce0b7aabe5dfdca8 +PKG_HASH:=181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f PKG_LICENSE:=ISC PKG_LICENSE_FILES:=LICENSE PKG_MAINTAINER:=Josef Schlehofer -PKG_BUILD_DEPENDS:=python-poetry-core/host +PKG_BUILD_DEPENDS:=python-hatchling/host include ../pypi.mk include $(INCLUDE_DIR)/package.mk diff --git a/lang/python/python-dns/test.sh b/lang/python/python-dns/test.sh new file mode 100755 index 00000000000000..413fa9978f58f0 --- /dev/null +++ b/lang/python/python-dns/test.sh @@ -0,0 +1,22 @@ +#!/bin/sh +[ "$1" = python3-dns ] || exit 0 +python3 - << 'EOF' +import dns +import dns.name +import dns.rdatatype +import dns.rdata +import dns.rdataset +import dns.message +import dns.resolver + +n = dns.name.from_text("www.example.com.") +assert str(n) == "www.example.com.", f"unexpected name: {n}" +assert n.is_absolute() + +parent = dns.name.from_text("example.com.") +assert n.is_subdomain(parent) + +rdtype = dns.rdatatype.from_text("A") +assert rdtype == dns.rdatatype.A +assert dns.rdatatype.to_text(rdtype) == "A" +EOF diff --git a/lang/python/python-jsonschema-specifications/Makefile b/lang/python/python-jsonschema-specifications/Makefile index 1d358c23d3fe35..ce098368f35c3f 100644 --- a/lang/python/python-jsonschema-specifications/Makefile +++ b/lang/python/python-jsonschema-specifications/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-jsonschema-specifications -PKG_VERSION:=2023.11.2 +PKG_VERSION:=2025.9.1 PKG_RELEASE:=1 PYPI_NAME:=jsonschema-specifications PYPI_SOURCE_NAME:=jsonschema_specifications -PKG_HASH:=9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8 +PKG_HASH:=b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d PKG_LICENSE:=MIT PKG_LICENSE_FILES:=COPYING diff --git a/lang/python/python-orjson/Makefile b/lang/python/python-orjson/Makefile index 7d584204a97095..e1ef7f04249c5f 100644 --- a/lang/python/python-orjson/Makefile +++ b/lang/python/python-orjson/Makefile @@ -1,11 +1,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-orjson -PKG_VERSION:=3.10.12 +PKG_VERSION:=3.11.8 PKG_RELEASE:=1 PYPI_NAME:=orjson -PKG_HASH:=0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff +PKG_HASH:=96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e PKG_MAINTAINER:=Timothy Ace PKG_LICENSE:=Apache-2.0 MIT @@ -26,6 +26,7 @@ define Package/python3-orjson URL:=https://github.com/ijl/orjson DEPENDS:= \ +python3-light \ + +python3-uuid \ $(RUST_ARCH_DEPENDS) endef diff --git a/lang/python/python-orjson/test.sh b/lang/python/python-orjson/test.sh new file mode 100644 index 00000000000000..0854b353e903e0 --- /dev/null +++ b/lang/python/python-orjson/test.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +[ "$1" = python3-orjson ] || exit 0 + +python3 - << 'EOF' +import faulthandler +faulthandler.enable() + +print("importing orjson...", flush=True) +import orjson +print("import OK", flush=True) + +# Basic encode/decode +data = {"key": "value", "number": 42, "flag": True, "empty": None} +encoded = orjson.dumps(data) +assert isinstance(encoded, bytes) +decoded = orjson.loads(encoded) +assert decoded == data +print("basic encode/decode OK", flush=True) + +# List roundtrip +lst = [1, 2, 3, "hello"] +assert orjson.loads(orjson.dumps(lst)) == lst +print("list roundtrip OK", flush=True) + +# Nested structures +nested = {"a": {"b": {"c": 1}}} +assert orjson.loads(orjson.dumps(nested)) == nested +print("nested OK", flush=True) + +# OPT_SORT_KEYS option +obj = {"z": 1, "a": 2, "m": 3} +sorted_json = orjson.dumps(obj, option=orjson.OPT_SORT_KEYS) +assert sorted_json == b'{"a":2,"m":3,"z":1}' +print("sort_keys OK", flush=True) + +print("orjson OK") +EOF diff --git a/lang/python/python-pathspec/Makefile b/lang/python/python-pathspec/Makefile index 9a0e0bf39a54a4..07a806894700d9 100644 --- a/lang/python/python-pathspec/Makefile +++ b/lang/python/python-pathspec/Makefile @@ -8,11 +8,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-pathspec -PKG_VERSION:=0.12.1 +PKG_VERSION:=1.0.4 PKG_RELEASE:=1 PYPI_NAME:=pathspec -PKG_HASH:=a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 +PKG_HASH:=0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645 PKG_LICENSE:=MPL-2.0 PKG_LICENSE_FILES:=LICENSE diff --git a/lang/python/python-pathspec/test.sh b/lang/python/python-pathspec/test.sh new file mode 100755 index 00000000000000..7b8278802e156a --- /dev/null +++ b/lang/python/python-pathspec/test.sh @@ -0,0 +1,12 @@ +#!/bin/sh +[ "$1" = python3-pathspec ] || exit 0 +python3 - << 'EOF' +import pathspec +assert pathspec.__version__, "pathspec version is empty" + +spec = pathspec.PathSpec.from_lines("gitwildmatch", ["*.py", "!test_*.py", "build/"]) +assert spec.match_file("foo.py") +assert not spec.match_file("test_foo.py") +assert spec.match_file("build/output.txt") +assert not spec.match_file("foo.txt") +EOF diff --git a/lang/python/python-pip/Makefile b/lang/python/python-pip/Makefile index fff0f7018e37e5..658f6ea83fad48 100644 --- a/lang/python/python-pip/Makefile +++ b/lang/python/python-pip/Makefile @@ -8,17 +8,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-pip -PKG_VERSION:=23.3.1 +PKG_VERSION:=26.0.1 PKG_RELEASE:=1 PYPI_NAME:=pip -PKG_HASH:=1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174 +PKG_HASH:=c4037d8a277c89b320abe636d59f91e6d0922d08a05b60e85e53b296613346d8 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE.txt PKG_MAINTAINER:=Alexandru Ardelean PKG_CPE_ID:=cpe:/a:pypa:pip +PKG_BUILD_DEPENDS:=python-setuptools/host + include ../pypi.mk include $(INCLUDE_DIR)/package.mk include ../python3-package.mk @@ -43,9 +45,8 @@ endef define Py3Package/python3-pip/install $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pip$(PYTHON3_VERSION) $(1)/usr/bin/ - $(LN) pip$(PYTHON3_VERSION) $(1)/usr/bin/pip3 - $(LN) pip$(PYTHON3_VERSION) $(1)/usr/bin/pip + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pip3 $(1)/usr/bin/ + $(LN) pip3 $(1)/usr/bin/pip $(INSTALL_DIR) $(1)/etc $(INSTALL_DATA) ./files/pip.conf $(1)/etc/ diff --git a/lang/python/python-pip/patches/001-pyproject-hooks-pyc-fix.patch b/lang/python/python-pip/patches/001-pyproject-hooks-pyc-fix.patch index e9eafab969dacb..b32733134ccc20 100644 --- a/lang/python/python-pip/patches/001-pyproject-hooks-pyc-fix.patch +++ b/lang/python/python-pip/patches/001-pyproject-hooks-pyc-fix.patch @@ -1,19 +1,22 @@ --- a/src/pip/_vendor/pyproject_hooks/_in_process/__init__.py +++ b/src/pip/_vendor/pyproject_hooks/_in_process/__init__.py -@@ -11,8 +11,14 @@ try: +@@ -11,11 +11,17 @@ try: except AttributeError: # Python 3.8 compatibility def _in_proc_script_path(): -- return resources.path(__package__, '_in_process.py') -+ filename = '_in_process.pyc' -+ if resources.is_resource(__package__, '_in_process.py'): -+ filename = '_in_process.py' +- return resources.path(__package__, "_in_process.py") ++ filename = "_in_process.pyc" ++ if resources.is_resource(__package__, "_in_process.py"): ++ filename = "_in_process.py" + return resources.path(__package__, filename) + else: + def _in_proc_script_path(): -+ filename = '_in_process.pyc' -+ if resources.files(__package__).joinpath('_in_process.py').is_file(): -+ filename = '_in_process.py' ++ filename = "_in_process.pyc" ++ if resources.files(__package__).joinpath("_in_process.py").is_file(): ++ filename = "_in_process.py" return resources.as_file( -- resources.files(__package__).joinpath('_in_process.py')) -+ resources.files(__package__).joinpath(filename)) +- resources.files(__package__).joinpath("_in_process.py") ++ resources.files(__package__).joinpath(filename) + ) diff --git a/lang/python/python-pip/patches/002-pip-runner-pyc-fix.patch b/lang/python/python-pip/patches/002-pip-runner-pyc-fix.patch index 8f68049a8b284f..c7d80688893d79 100644 --- a/lang/python/python-pip/patches/002-pip-runner-pyc-fix.patch +++ b/lang/python/python-pip/patches/002-pip-runner-pyc-fix.patch @@ -1,6 +1,6 @@ --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py -@@ -54,7 +54,11 @@ def get_runnable_pip() -> str: +@@ -74,7 +74,11 @@ def get_runnable_pip() -> str: # case, we can use that directly. return str(source) @@ -12,4 +12,4 @@ + return os.fsdecode(source / filename) - def _get_system_sitepackages() -> Set[str]: + def _get_system_sitepackages() -> set[str]: diff --git a/lang/python/python-pip/patches/003-disable-pip-version-check.patch b/lang/python/python-pip/patches/003-disable-pip-version-check.patch index 99a0258aa60884..f08530edad91ea 100644 --- a/lang/python/python-pip/patches/003-disable-pip-version-check.patch +++ b/lang/python/python-pip/patches/003-disable-pip-version-check.patch @@ -9,7 +9,7 @@ Patch-Name: disable-pip-version-check.patch --- a/src/pip/_internal/cli/cmdoptions.py +++ b/src/pip/_internal/cli/cmdoptions.py -@@ -895,7 +895,7 @@ disable_pip_version_check: Callable[..., +@@ -1069,7 +1069,7 @@ disable_pip_version_check: Callable[..., "--disable-pip-version-check", dest="disable_pip_version_check", action="store_true", diff --git a/lang/python/python-pyasn1-modules/Makefile b/lang/python/python-pyasn1-modules/Makefile index 71a9b1f61b4e96..d65c3d7223d36f 100644 --- a/lang/python/python-pyasn1-modules/Makefile +++ b/lang/python/python-pyasn1-modules/Makefile @@ -8,11 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-pyasn1-modules -PKG_VERSION:=0.2.8 -PKG_RELEASE:=2 +PKG_VERSION:=0.4.2 +PKG_RELEASE:=1 PYPI_NAME:=pyasn1-modules -PKG_HASH:=905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e +PYPI_SOURCE_NAME:=pyasn1_modules +PKG_HASH:=677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6 PKG_LICENSE:=BSD-2-Clause PKG_LICENSE_FILES:=LICENSE.txt diff --git a/lang/python/python-pyasn1-modules/test.sh b/lang/python/python-pyasn1-modules/test.sh new file mode 100644 index 00000000000000..ee404d9c37a3dc --- /dev/null +++ b/lang/python/python-pyasn1-modules/test.sh @@ -0,0 +1,20 @@ +#!/bin/sh +[ "$1" = python3-pyasn1-modules ] || exit 0 + +python3 - << 'EOF' +import pyasn1_modules +from pyasn1_modules import pem, rfc2314, rfc2459, rfc2986, rfc5280 +from pyasn1.codec.der.decoder import decode as der_decode +from pyasn1.type import univ + +# Basic OID parsing (common in ASN.1 modules) +oid = univ.ObjectIdentifier((1, 2, 840, 113549, 1, 1, 1)) +assert str(oid) == '1.2.840.113549.1.1.1' + +# Verify key RFC modules are importable and have expected attributes +assert hasattr(rfc2459, 'Certificate') +assert hasattr(rfc5280, 'Certificate') +assert hasattr(rfc2986, 'CertificationRequest') + +print("pyasn1-modules OK") +EOF diff --git a/lang/python/python-pytest-xdist/Makefile b/lang/python/python-pytest-xdist/Makefile index 041f1ac0136825..3ffd04bd6489b0 100644 --- a/lang/python/python-pytest-xdist/Makefile +++ b/lang/python/python-pytest-xdist/Makefile @@ -8,11 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=python-pytest-xdist -PKG_VERSION:=3.3.1 +PKG_VERSION:=3.8.0 PKG_RELEASE:=1 PYPI_NAME:=pytest-xdist -PKG_HASH:=d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93 +PYPI_SOURCE_NAME:=pytest_xdist +PKG_HASH:=7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1 PKG_MAINTAINER:=Alexandru Ardelean PKG_LICENSE:=MIT diff --git a/lang/python/python-pytest-xdist/test.sh b/lang/python/python-pytest-xdist/test.sh new file mode 100644 index 00000000000000..d6a21688c88db5 --- /dev/null +++ b/lang/python/python-pytest-xdist/test.sh @@ -0,0 +1,18 @@ +#!/bin/sh +[ "$1" = python3-pytest-xdist ] || exit 0 + +python3 - << 'EOF' +import xdist +import xdist.plugin +import xdist.scheduler + +# Verify version +assert xdist.__version__, "xdist version is empty" + +# Verify key scheduler classes are importable +from xdist.scheduler import LoadScheduling, EachScheduling +sched = LoadScheduling.__name__ +assert sched == 'LoadScheduling' + +print("pytest-xdist OK") +EOF diff --git a/net/tailscale/Makefile b/net/tailscale/Makefile index 81c2143a00601b..5fb3d1e82c3de7 100644 --- a/net/tailscale/Makefile +++ b/net/tailscale/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=tailscale -PKG_VERSION:=1.94.2 +PKG_VERSION:=1.96.4 PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/tailscale/tailscale/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=c45975beb4cb7bab8047cfba77ec8b170570d184f3c806258844f3e49c60d7aa +PKG_HASH:=57b70731af7ae0ed167519924905fd032ddd8559a65bc8a3329d9da495f0feb2 PKG_MAINTAINER:=Zephyr Lykos , \ Sandro Jäckel diff --git a/net/tor/Makefile b/net/tor/Makefile index 412879dceed625..069640ed06f82c 100644 --- a/net/tor/Makefile +++ b/net/tor/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=tor -PKG_VERSION:=0.4.9.5 +PKG_VERSION:=0.4.9.6 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://dist.torproject.org/ \ https://archive.torproject.org/tor-package-archive -PKG_HASH:=c949c2f86b348e64891976f6b1e49c177655b23df97193049bf1b8cd3099e179 +PKG_HASH:=a89aba97052e9963a654b40df2d46be07e8a6b6e24e5437917fd81acd90a7017 PKG_MAINTAINER:=Rui Salvaterra PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=LICENSE