diff --git a/srcpkgs/pdm/template b/srcpkgs/pdm/template new file mode 100644 index 00000000000..0b3123c5d8a --- /dev/null +++ b/srcpkgs/pdm/template @@ -0,0 +1,25 @@ +# Template file for 'pdm' +pkgname=pdm +version=2.25.4 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-pdm-backend python3-pdm-build-locked" +depends="python3-blinker python3-dep-logic python3-dotenv python3-filelock python3-findpython python3-httpx python3-hishel + python3-idna python3-id python3-installer python3-msgpack python3-pbs-installer python3-pyproject-hooks python3-resolvelib + python3-certifi python3-httpcore python3-packaging python3-platformdirs python3-rich python3-shellingham python3-truststore + python3-tomli python3-tomlkit python3-virtualenv python3-unearth" +checkdepends="${depends} python3-pytest python3-pytest-cov python3-pytest-httpserver python3-pytest-httpx + python3-pytest-mock python3-pytest-rerunfailures python3-pytest-xdist" +short_desc="Modern Python package and dependency manager" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://pdm-project.org/" +changelog="https://raw.githubusercontent.com/pdm-project/pdm/main/CHANGELOG.md" +distfiles="${PYPI_SITE}/p/pdm/pdm-${version}.tar.gz" +checksum=bd655d789429928d6e27ff6693c19c82bc81aa75ba51d7b1c6102d039c8f211c +# Tests fail on Python 3.13 due to type annotation incompatibilities (e.g. AbstractProvider[str]) +make_check=no + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-dep-logic/template b/srcpkgs/python3-dep-logic/template new file mode 100644 index 00000000000..fc831330d14 --- /dev/null +++ b/srcpkgs/python3-dep-logic/template @@ -0,0 +1,19 @@ +# Template file for 'python3-dep-logic' +pkgname=python3-dep-logic +version=0.5.1 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-pdm-backend" +depends="python3-packaging" +checkdepends="python3-pytest" +short_desc="Python dependency specifications supporting logical operations" +maintainer="Komeil Parseh " +license="Apache-2.0" +homepage="https://github.com/pdm-project/dep-logic" +distfiles="https://github.com/pdm-project/dep-logic/archive/refs/tags/${version}.tar.gz" +checksum=9f6a253d7dae80c6f05bd429333066b97b9130841792870722af28003b2de852 + +pre_build() { + # Specify fallback version to avoid SCM detection issues + export PDM_BUILD_SCM_VERSION="${version}" +} diff --git a/srcpkgs/python3-findpython/template b/srcpkgs/python3-findpython/template new file mode 100644 index 00000000000..2421d9b30b3 --- /dev/null +++ b/srcpkgs/python3-findpython/template @@ -0,0 +1,24 @@ +# Template file for 'python3-findpython' +pkgname=python3-findpython +version=0.6.3 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-pdm-backend" +depends="python3-packaging" +checkdepends="python3-pytest" +short_desc="Utility to find python versions on your system" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://github.com/frostming/findpython" +changelog="https://raw.githubusercontent.com/pdm-project/pdm/main/CHANGELOG.md" +distfiles="https://github.com/frostming/findpython/archive/refs/tags/${version}.tar.gz" +checksum=6da4a3f00326db2765e60a61bcd5f7941836cdadc3a4b0e60b860da9f8b3fbaa + +pre_build() { + # Specify fallback version to avoid SCM detection issues + export PDM_BUILD_SCM_VERSION="${version}" +} + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-hishel/patches/0001-skip-anysqlite-yaml-and-redis-tests-if-optional-deps.patch b/srcpkgs/python3-hishel/patches/0001-skip-anysqlite-yaml-and-redis-tests-if-optional-deps.patch new file mode 100644 index 00000000000..5399030a153 --- /dev/null +++ b/srcpkgs/python3-hishel/patches/0001-skip-anysqlite-yaml-and-redis-tests-if-optional-deps.patch @@ -0,0 +1,262 @@ +From 8ce61a6e604d5ae948b5eb68d1e9fc8e640a71dd Mon Sep 17 00:00:00 2001 +From: Komeil Parseh +Date: Wed, 2 Jul 2025 16:17:36 +0330 +Subject: [PATCH] skip anysqlite, yaml and redis tests if optional deps are + missing + +--- + tests/_async/test_storages.py | 29 ++++++++++++++++++++++++++++- + tests/_sync/test_storages.py | 29 ++++++++++++++++++++++++++++- + tests/test_serializers.py | 10 ++++++++++ + 3 files changed, 66 insertions(+), 2 deletions(-) + +diff --git a/tests/_async/test_storages.py b/tests/_async/test_storages.py +index b780185..08087b0 100644 +--- a/tests/_async/test_storages.py ++++ b/tests/_async/test_storages.py +@@ -2,7 +2,6 @@ import datetime + import os + from pathlib import Path + +-import anysqlite + import pytest + from httpcore import Request, Response + +@@ -10,6 +9,16 @@ from hishel import AsyncFileStorage, AsyncInMemoryStorage, AsyncRedisStorage, As + from hishel._serializers import Metadata + from hishel._utils import asleep, generate_key + ++try: ++ import anysqlite ++except ImportError: ++ anysqlite = None # type: ignore ++ ++try: ++ import redis ++except ImportError: ++ redis = None # type: ignore ++ + dummy_metadata = Metadata(cache_key="test", number_of_uses=0, created_at=datetime.datetime.now(datetime.timezone.utc)) + + +@@ -48,6 +57,8 @@ async def test_filestorage(use_temp_dir): + + @pytest.mark.parametrize("anyio_backend", ["asyncio"]) + async def test_redisstorage(anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis is not installed") + if await is_redis_down(): # pragma: no cover + pytest.fail("Redis server was not found") + storage = AsyncRedisStorage() +@@ -73,6 +84,8 @@ async def test_redisstorage(anyio_backend): + + @pytest.mark.anyio + async def test_sqlitestorage(): ++ if anysqlite is None: # pragma: no cover ++ pytest.skip("anysqlite not installed") + storage = AsyncSQLiteStorage(connection=await anysqlite.connect(":memory:")) + + request = Request(b"GET", "https://example.com") +@@ -196,6 +209,8 @@ async def test_filestorage_ttl_after_hits(use_temp_dir, anyio_backend): + + @pytest.mark.parametrize("anyio_backend", ["asyncio"]) + async def test_redisstorage_expired(anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis is not installed") + if await is_redis_down(): # pragma: no cover + pytest.fail("Redis server was not found") + storage = AsyncRedisStorage(ttl=0.1) +@@ -219,6 +234,10 @@ async def test_redisstorage_expired(anyio_backend): + + @pytest.mark.parametrize("anyio_backend", ["asyncio"]) + async def test_redis_ttl_after_hits(use_temp_dir, anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis not installed") ++ if await is_redis_down(): # pragma: no cover ++ pytest.fail("Redis server was not found") + storage = AsyncRedisStorage(ttl=0.2) + + request = Request(b"GET", "https://example.com") +@@ -249,6 +268,8 @@ async def test_redis_ttl_after_hits(use_temp_dir, anyio_backend): + + @pytest.mark.parametrize("anyio_backend", ["asyncio"]) + async def test_sqlite_expired(anyio_backend): ++ if anysqlite is None: # pragma: no cover ++ pytest.skip("anysqlite not installed") + storage = AsyncSQLiteStorage(ttl=0.1, connection=await anysqlite.connect(":memory:")) + first_request = Request(b"GET", "https://example.com") + second_request = Request(b"GET", "https://anotherexample.com") +@@ -271,6 +292,8 @@ async def test_sqlite_expired(anyio_backend): + @pytest.mark.xfail + @pytest.mark.parametrize("anyio_backend", ["asyncio"]) + async def test_sqlite_ttl_after_hits(use_temp_dir, anyio_backend): ++ if anysqlite is None: # pragma: no cover ++ pytest.skip("anysqlite not installed") + storage = AsyncSQLiteStorage(ttl=0.2) + + request = Request(b"GET", "https://example.com") +@@ -390,6 +413,8 @@ async def test_filestorage_remove(use_temp_dir): + + @pytest.mark.parametrize("anyio_backend", ["asyncio"]) + async def test_redisstorage_remove(anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis not installed") + if await is_redis_down(): # pragma: no cover + pytest.fail("Redis server was not found") + +@@ -408,6 +433,8 @@ async def test_redisstorage_remove(anyio_backend): + + @pytest.mark.anyio + async def test_sqlitestorage_remove(): ++ if anysqlite is None: # pragma: no cover ++ pytest.skip("anysqlite not installed") + storage = AsyncSQLiteStorage(connection=await anysqlite.connect(":memory:")) + request = Request(b"GET", "https://example.com") + +diff --git a/tests/_sync/test_storages.py b/tests/_sync/test_storages.py +index 43151de..16c8336 100644 +--- a/tests/_sync/test_storages.py ++++ b/tests/_sync/test_storages.py +@@ -2,7 +2,6 @@ import datetime + import os + from pathlib import Path + +-import sqlite3 + import pytest + from httpcore import Request, Response + +@@ -10,6 +9,16 @@ from hishel import FileStorage, InMemoryStorage, RedisStorage, SQLiteStorage + from hishel._serializers import Metadata + from hishel._utils import sleep, generate_key + ++try: ++ import sqlite3 ++except ImportError: ++ sqlite3 = None # type: ignore ++ ++try: ++ import redis ++except ImportError: ++ redis = None # type: ignore ++ + dummy_metadata = Metadata(cache_key="test", number_of_uses=0, created_at=datetime.datetime.now(datetime.timezone.utc)) + + +@@ -48,6 +57,8 @@ def test_filestorage(use_temp_dir): + + + def test_redisstorage(anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis is not installed") + if is_redis_down(): # pragma: no cover + pytest.fail("Redis server was not found") + storage = RedisStorage() +@@ -73,6 +84,8 @@ def test_redisstorage(anyio_backend): + + + def test_sqlitestorage(): ++ if sqlite3 is None: # pragma: no cover ++ pytest.skip("sqlite3 not installed") + storage = SQLiteStorage(connection=sqlite3.connect(":memory:")) + + request = Request(b"GET", "https://example.com") +@@ -196,6 +209,8 @@ def test_filestorage_ttl_after_hits(use_temp_dir, anyio_backend): + + + def test_redisstorage_expired(anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis is not installed") + if is_redis_down(): # pragma: no cover + pytest.fail("Redis server was not found") + storage = RedisStorage(ttl=0.1) +@@ -219,6 +234,10 @@ def test_redisstorage_expired(anyio_backend): + + + def test_redis_ttl_after_hits(use_temp_dir, anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis not installed") ++ if is_redis_down(): # pragma: no cover ++ pytest.fail("Redis server was not found") + storage = RedisStorage(ttl=0.2) + + request = Request(b"GET", "https://example.com") +@@ -249,6 +268,8 @@ def test_redis_ttl_after_hits(use_temp_dir, anyio_backend): + + + def test_sqlite_expired(anyio_backend): ++ if sqlite3 is None: # pragma: no cover ++ pytest.skip("sqlite3 not installed") + storage = SQLiteStorage(ttl=0.1, connection=sqlite3.connect(":memory:")) + first_request = Request(b"GET", "https://example.com") + second_request = Request(b"GET", "https://anotherexample.com") +@@ -271,6 +292,8 @@ def test_sqlite_expired(anyio_backend): + @pytest.mark.xfail + + def test_sqlite_ttl_after_hits(use_temp_dir, anyio_backend): ++ if sqlite3 is None: # pragma: no cover ++ pytest.skip("sqlite3 not installed") + storage = SQLiteStorage(ttl=0.2) + + request = Request(b"GET", "https://example.com") +@@ -390,6 +413,8 @@ def test_filestorage_remove(use_temp_dir): + + + def test_redisstorage_remove(anyio_backend): ++ if redis is None: # pragma: no cover ++ pytest.skip("redis not installed") + if is_redis_down(): # pragma: no cover + pytest.fail("Redis server was not found") + +@@ -408,6 +433,8 @@ def test_redisstorage_remove(anyio_backend): + + + def test_sqlitestorage_remove(): ++ if sqlite3 is None: # pragma: no cover ++ pytest.skip("sqlite3 not installed") + storage = SQLiteStorage(connection=sqlite3.connect(":memory:")) + request = Request(b"GET", "https://example.com") + +diff --git a/tests/test_serializers.py b/tests/test_serializers.py +index d22ed0a..cf7df2f 100644 +--- a/tests/test_serializers.py ++++ b/tests/test_serializers.py +@@ -1,5 +1,6 @@ + import datetime + ++import pytest + from httpcore import Request, Response + + from hishel._serializers import ( +@@ -10,6 +11,11 @@ from hishel._serializers import ( + ) + from hishel._utils import normalized_url + ++try: ++ import yaml ++except ImportError: ++ yaml = None # type: ignore ++ + + def test_pickle_serializer_dumps_and_loads(): + request = Request( +@@ -192,6 +198,8 @@ def test_dict_serializer_loads(): + + + def test_yaml_serializer_dumps(): ++ if yaml is None: # pragma: no cover ++ pytest.skip("yaml not installed") + request = Request( + method="GET", + url="https://example.com", +@@ -248,6 +256,8 @@ def test_yaml_serializer_dumps(): + + + def test_yaml_serializer_loads(): ++ if yaml is None: # pragma: no cover ++ pytest.skip("yaml not installed") + raw_response = "\n".join( + [ + "response:", +-- +2.50.0 + diff --git a/srcpkgs/python3-hishel/template b/srcpkgs/python3-hishel/template new file mode 100644 index 00000000000..15b709cf75b --- /dev/null +++ b/srcpkgs/python3-hishel/template @@ -0,0 +1,20 @@ +# Template file for 'python3-hishel' +pkgname=python3-hishel +version=0.1.2 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 hatch hatch-fancy-pypi-readme" +makedepends="python3 hatch hatch-fancy-pypi-readme" +depends="python3-httpx" +checkdepends="python3-pytest python3-trio" +short_desc="Elegant HTTP Cache implementation for httpx and httpcore" +maintainer="Komeil Parseh " +license="BSD-3-Clause" +homepage="https://github.com/karpetrosyan/hishel" +changelog="${homepage}/raw/refs/heads/master/CHANGELOG.md" +distfiles="${homepage}/archive/refs/tags/${version}.tar.gz" +checksum=ee41e09d18d0b6c63d87797def3c3825dbedf871664764d7afbd0cc0305fa317 + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-id/template b/srcpkgs/python3-id/template new file mode 100644 index 00000000000..84fa56e0101 --- /dev/null +++ b/srcpkgs/python3-id/template @@ -0,0 +1,16 @@ +# Template file for 'python3-id' +pkgname=python3-id +version=1.5.0 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-flit_core" +makedepends="python3 python3-flit_core" +depends="python3 python3-requests" +checkdepends="python3-pretend python3-pytest python3-requests" +short_desc="Tool for generating OIDC identities" +maintainer="Komeil Parseh " +license="Apache-2.0" +homepage="https://github.com/di/id" +changelog="${homepage}/raw/refs/heads/master/CHANGELOG.md" +distfiles="${homepage}/archive/refs/tags/v${version}.tar.gz" +checksum=386c68dbaa0191165b44017781b373e49d9a4ae8ba9d01db772daed28d0849e3 diff --git a/srcpkgs/python3-pbs-installer/template b/srcpkgs/python3-pbs-installer/template new file mode 100644 index 00000000000..ea650b4f487 --- /dev/null +++ b/srcpkgs/python3-pbs-installer/template @@ -0,0 +1,23 @@ +# Template file for 'python3-pbs-installer' +pkgname=python3-pbs-installer +version=2025.06.26 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-pdm-backend" +depends="python3-httpx python3-zstandard" +short_desc="Installer for @indygreg's python-build-standalone" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://github.com/frostming/pbs-installer" +changelog="https://raw.githubusercontent.com/pdm-project/pdm/main/CHANGELOG.md" +distfiles="https://github.com/frostming/pbs-installer/archive/refs/tags/${version}.tar.gz" +checksum=01e6c545005a304b1bcc2a4ebb82212e4fc3ed8cd48e2ebc0e46dd30932fc492 + +pre_build() { + # Specify fallback version to avoid SCM detection issues + export PDM_BUILD_SCM_VERSION="${version}" +} + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-pdm-build-locked/template b/srcpkgs/python3-pdm-build-locked/template new file mode 100644 index 00000000000..0fae9c4e533 --- /dev/null +++ b/srcpkgs/python3-pdm-build-locked/template @@ -0,0 +1,16 @@ +# Template file for 'python3-pdm-build-locked' +pkgname=python3-pdm-build-locked +version=0.3.5 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-pdm-backend" +short_desc="Pdm plugin to publish locked dependencies as optional-dependencies" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://pdm-build-locked.readthedocs.io/" +distfiles="${PYPI_SITE}/p/pdm_build_locked/pdm_build_locked-${version}.tar.gz" +checksum=ab2f381e00d79841d46be2e6909c265038b9fa951de2bf551ca6adb7f6844201 + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-pytest-httpx/template b/srcpkgs/python3-pytest-httpx/template new file mode 100644 index 00000000000..3037a8a4008 --- /dev/null +++ b/srcpkgs/python3-pytest-httpx/template @@ -0,0 +1,18 @@ +# Template file for 'python3-pytest-httpx' +pkgname=python3-pytest-httpx +version=0.35.0 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3-setuptools_scm python3-wheel" +depends="python3-pytest python3-httpx python3-pytest-asyncio" +checkdepends="$depends python3-pytest-cov" +short_desc="Pytest fixture to mock HTTPX" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://github.com/Colin-b/pytest_httpx" +distfiles="${homepage}/archive/refs/tags/v${version}.tar.gz" +checksum=c0653073f7690ea1ab068cc5872655ff79634377441dce1f71ae7396721df915 + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-truststore/template b/srcpkgs/python3-truststore/template new file mode 100644 index 00000000000..d18240ce57e --- /dev/null +++ b/srcpkgs/python3-truststore/template @@ -0,0 +1,21 @@ +# Template file for 'python3-truststore' +pkgname=python3-truststore +version=0.10.0 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-flit_core" +makedepends="python3-flit_core" +depends="python3" +checkdepends="python3-aiohttp python3-httpx python3-pytest python3-pytest-httpserver + python3-flaky python3-pytest-asyncio python3-requests" +short_desc="Verify certificates using OS trust stores" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://github.com/sethmlarson/truststore" +changelog="${homepage}/raw/refs/heads/master/CHANGELOG.md" +distfiles="${homepage}/archive/refs/tags/v${version}.tar.gz" +checksum=12e89641dba78a9427f782ad2d824bed93583a9465002fe59b63c3fd12cbe8f5 + +post_install() { + vlicense LICENSE +} diff --git a/srcpkgs/python3-unearth/template b/srcpkgs/python3-unearth/template new file mode 100644 index 00000000000..589a6b90c58 --- /dev/null +++ b/srcpkgs/python3-unearth/template @@ -0,0 +1,22 @@ +# Template file for 'python3-unearth' +pkgname=python3-unearth +version=0.17.5 +revision=1 +build_style=python3-pep517 +hostmakedepends="python3 python3-build python3-pdm-backend" +depends="python3-httpx python3-packaging python3-requests" +short_desc="Utility to fetch and download python packages" +maintainer="Komeil Parseh " +license="MIT" +homepage="https://github.com/frostming/unearth" +distfiles="https://github.com/frostming/unearth/archive/refs/tags/${version}.tar.gz" +checksum=306a4b4722988866217e0315fdc3f7716abab3b112cc7126a52f1cc8015b96cd + +pre_build() { + # Specify fallback version to avoid SCM detection issues + export PDM_BUILD_SCM_VERSION="${version}" +} + +post_install() { + vlicense LICENSE +}