summaryrefslogtreecommitdiff
path: root/dev-python
diff options
context:
space:
mode:
authorroot <root@alpha.trunkmasters.com>2026-07-31 03:04:46 -0500
committerroot <root@alpha.trunkmasters.com>2026-07-31 03:04:46 -0500
commit3f283d6a71e35a9c6d89dc73d76f01aec1c1a6b3 (patch)
treebe269d99a452403d508fed631b1bdd5ebdc98d9f /dev-python
parent0fb86e044f244e00302b1878b3e15e0db0e4b7e5 (diff)
downloadbaldeagleos-repo-3f283d6a71e35a9c6d89dc73d76f01aec1c1a6b3.tar.gz
baldeagleos-repo-3f283d6a71e35a9c6d89dc73d76f01aec1c1a6b3.tar.xz
baldeagleos-repo-3f283d6a71e35a9c6d89dc73d76f01aec1c1a6b3.zip
Adding metadata
Diffstat (limited to 'dev-python')
-rw-r--r--dev-python/baseline/baseline-1.2.1.ebuild2
-rw-r--r--dev-python/boto3/Manifest1
-rw-r--r--dev-python/boto3/boto3-1.43.60.ebuild53
-rw-r--r--dev-python/botocore/Manifest1
-rw-r--r--dev-python/botocore/botocore-1.43.60.ebuild67
-rw-r--r--dev-python/cachelib/Manifest2
-rw-r--r--dev-python/cachelib/cachelib-0.15.0.ebuild45
-rw-r--r--dev-python/exif/exif-1.6.0.ebuild4
-rw-r--r--dev-python/feedparser-sgmllib/Manifest2
-rw-r--r--dev-python/feedparser-sgmllib/feedparser-sgmllib-2.0.1.ebuild23
-rw-r--r--dev-python/feedparser-sgmllib/metadata.xml9
-rw-r--r--dev-python/feedparser/Manifest1
-rw-r--r--dev-python/feedparser/feedparser-6.0.14.ebuild42
-rw-r--r--dev-python/guessit/Manifest2
-rw-r--r--dev-python/guessit/guessit-4.3.0.ebuild (renamed from dev-python/guessit/guessit-3.8.0.ebuild)22
-rw-r--r--dev-python/hypothesis/Manifest1
-rw-r--r--dev-python/hypothesis/hypothesis-6.164.0.ebuild143
-rw-r--r--dev-python/jupyter-builder/Manifest1
-rw-r--r--dev-python/jupyter-builder/jupyter-builder-1.2.0.ebuild40
-rw-r--r--dev-python/lesscpy/Manifest2
-rw-r--r--dev-python/lesscpy/lesscpy-0.15.2.ebuild31
-rw-r--r--dev-python/lsprotocol/Manifest1
-rw-r--r--dev-python/lsprotocol/files/lsprotocol-2025.0.0-fix-against-cattrs-25.0.0.patch36
-rw-r--r--dev-python/lsprotocol/lsprotocol-2025.0.0-r1.ebuild52
-rw-r--r--dev-python/markdown/Manifest1
-rw-r--r--dev-python/markdown/markdown-3.10.3.ebuild39
-rw-r--r--dev-python/mdformat-gfm/Manifest1
-rw-r--r--dev-python/mdformat-gfm/mdformat-gfm-1.0.0.ebuild32
-rw-r--r--dev-python/mdformat-gfm/metadata.xml20
-rw-r--r--dev-python/mdformat/Manifest1
-rw-r--r--dev-python/mdformat/mdformat-1.0.0.ebuild35
-rw-r--r--dev-python/mdformat/metadata.xml20
-rw-r--r--dev-python/parver/Manifest2
-rw-r--r--dev-python/parver/parver-1.0.1_p0.ebuild33
-rw-r--r--dev-python/plum/plum-0.8.7.ebuild2
-rw-r--r--dev-python/rectangle-packer/rectangle-packer-2.0.2.ebuild2
-rw-r--r--dev-python/redis/Manifest1
-rw-r--r--dev-python/redis/redis-8.1.0.ebuild126
-rw-r--r--dev-python/shtab/Manifest2
-rw-r--r--dev-python/shtab/shtab-1.8.2.ebuild27
-rw-r--r--dev-python/translate-toolkit/Manifest3
-rw-r--r--dev-python/translate-toolkit/translate-toolkit-3.19.11.ebuild123
-rw-r--r--dev-python/translate-toolkit/translate-toolkit-3.19.16.ebuild (renamed from dev-python/translate-toolkit/translate-toolkit-3.19.12.ebuild)0
-rw-r--r--dev-python/virtualenv/Manifest2
-rw-r--r--dev-python/virtualenv/virtualenv-21.7.1.ebuild117
-rw-r--r--dev-python/xmlsec/files/xmlsec-1.3.17-fix-against-xmlsec-1.3.11.patch108
-rw-r--r--dev-python/xmlsec/xmlsec-1.3.17-r1.ebuild64
47 files changed, 1202 insertions, 142 deletions
diff --git a/dev-python/baseline/baseline-1.2.1.ebuild b/dev-python/baseline/baseline-1.2.1.ebuild
index e8d25cdff9d7..c2990ee58b6f 100644
--- a/dev-python/baseline/baseline-1.2.1.ebuild
+++ b/dev-python/baseline/baseline-1.2.1.ebuild
@@ -1,4 +1,4 @@
-# Copyright 2025 Gentoo Authors
+# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
diff --git a/dev-python/boto3/Manifest b/dev-python/boto3/Manifest
index 920db816cecb..f577ea24fee7 100644
--- a/dev-python/boto3/Manifest
+++ b/dev-python/boto3/Manifest
@@ -15,3 +15,4 @@ DIST boto3-1.43.56.gh.tar.gz 1191375 BLAKE2B 3e98c6b40c4386ba8f4653af18162537650
DIST boto3-1.43.57.gh.tar.gz 1192652 BLAKE2B 1fe7c1bb69e4d234f69554518f07151a9f6ea1a24dac5fb91ca49a867fb4bff1064e96d9bcf0f653e91be8707ff651f5b397500a104ee175702b583d06412bdf SHA512 838301792c71c52de1b293b28771aa5d7a3baa10d56c11da423dd8971ca2d76f64cb3b4f45a9cec6d1ab1de2ef90d0c68800880c7357749da2608aa6c388f602
DIST boto3-1.43.58.gh.tar.gz 1193531 BLAKE2B ac792780b99f2fad11db5a04b5b1784269ca08ee0dcf977990b91ca9a781f5b3d9c0753d092ec4eaead5c6bd44a53431cff35dfbcca3080809e3c351d30b174f SHA512 f19614bf5b8a07d245c2dfb44b66faf5944ba8c5ea0515e12d4d9d5e9e96b5e662c8d93d40211ce14856421037894cd58b12c348d4e3e1bd389abf1b03aa20fd
DIST boto3-1.43.59.gh.tar.gz 1194595 BLAKE2B 170ddbac49d627ed6032bd71914c53392461aa48be8507ea1517bf3af9ecb345b0d89e93c4fede1c73654f9603061858ad036afcabf9697366e3667898b73caa SHA512 33a9d4b7ebfaa0c42a3e08c12c574c950c184827a3687085f510815152e6c51e9232bdc2a2a6a81a5b3851adbc91f155d274c3e19665e02147bd8e980fe0363f
+DIST boto3-1.43.60.gh.tar.gz 1195559 BLAKE2B ea1b56bcda79258020d63cfdbff37c4ac90e7f1d1f85eaf258afba1f46ded202bb6dd7a13aebd5d6df3020a339d49665ca1427d870f6397df5ef60cd4dbc2365 SHA512 0f8c4261e40cee4cc2484493213c94acb7181c5f2bda6306c349348e4be9b4c1bdbf0dba4aa2355b2f9426bf9cd5aacb01a633d77347f9b04c598f0f6deb983c
diff --git a/dev-python/boto3/boto3-1.43.60.ebuild b/dev-python/boto3/boto3-1.43.60.ebuild
new file mode 100644
index 000000000000..93fbbe6dd59b
--- /dev/null
+++ b/dev-python/boto3/boto3-1.43.60.ebuild
@@ -0,0 +1,53 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1
+
+DESCRIPTION="The AWS SDK for Python"
+HOMEPAGE="
+ https://github.com/boto/boto3/
+ https://pypi.org/project/boto3/
+"
+SRC_URI="
+ https://github.com/boto/boto3/archive/${PV}.tar.gz
+ -> ${P}.gh.tar.gz
+"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~sparc ~x86"
+
+RDEPEND="
+ >=dev-python/botocore-${PV}[${PYTHON_USEDEP}]
+ >=dev-python/jmespath-0.7.1[${PYTHON_USEDEP}]
+ >=dev-python/s3transfer-0.19.0[${PYTHON_USEDEP}]
+"
+
+EPYTEST_PLUGINS=()
+EPYTEST_XDIST=1
+distutils_enable_tests pytest
+
+python_prepare_all() {
+ # don't lock versions to narrow ranges
+ sed -e '/botocore/ d' \
+ -e '/jmespath/ d' \
+ -e '/s3transfer/ d' \
+ -i setup.py || die
+
+ # do not rely on bundled deps in botocore (sic!)
+ find -name '*.py' -exec sed -i \
+ -e 's:from botocore[.]vendored import:import:' \
+ -e 's:from botocore[.]vendored[.]:from :' \
+ {} + || die
+
+ distutils-r1_python_prepare_all
+}
+
+python_test() {
+ epytest tests/{functional,unit}
+}
diff --git a/dev-python/botocore/Manifest b/dev-python/botocore/Manifest
index 93c6a1114b62..4dc9eba6b0ab 100644
--- a/dev-python/botocore/Manifest
+++ b/dev-python/botocore/Manifest
@@ -15,3 +15,4 @@ DIST botocore-1.43.56.gh.tar.gz 16732272 BLAKE2B 4a399f5febf5ff58a49b09f1e1a0646
DIST botocore-1.43.57.gh.tar.gz 16738874 BLAKE2B cdb542e910966ad785337eadbfad829a179256d56b1b803b96838ce60ff01ddc0a787ba77d1ce2a56d354008b360e333e14bcd8ff61bab156e1ac37101d5b6e9 SHA512 0ecd214c1d33ec33aa66bf8eb082d379c47481efc59bf96d052e6bfa34183f000fd20c05cb0765490c6ce9cafba8d994ac7bc68c952da02ff3b8ed31d43a0658
DIST botocore-1.43.58.gh.tar.gz 16740851 BLAKE2B 19be86a3b7d0f3a9d62862c0a6bfa53d275fe149b879333cc49be9af4f43e9d1af919c966087d7de2da01f6b9f48c524457209dd7ab1ffe4e8291a185a89fa04 SHA512 3acdd10cbba121f9c32cc3931847c5778e2e273409869dd79e9150d9c5d787da010b9df4df642ce16a97d2b0d351eaa5d8a22e37c9d042f54341e65389fd162d
DIST botocore-1.43.59.gh.tar.gz 16787137 BLAKE2B 6f2f018b252e7b1ddbb0cd77d0b5b5fa9ce2b9c0e3387ecff69ba8942301697f7fb037df232c8759fccb57fdab2a47293f7d7c86b3252d7a2025afe285884321 SHA512 8162143bcbde8e4552d2ea3b3e5c2819e12e09477e4b5e68b48e48abb3cc8c596fa382843a08af3c1967c2c9a0234647c1733f8b503ed4cfacf61d5306ade698
+DIST botocore-1.43.60.gh.tar.gz 16803466 BLAKE2B 0153288f3787913baaf2905d74d4f42399e2a19ba741bf669b231f02d468f95b0ad810b4d5397dc3f5c3e3b6d01e5fb1e2fd2895eeb008ab3546eb50bc9efdde SHA512 84e6e6447bae7436ddd666e1df89c99a98c468ab7a243b5f7b8338854f0e0da3c701afa261997b8301668d36140845a5b7497f711912f2c8e4117e4169022c2e
diff --git a/dev-python/botocore/botocore-1.43.60.ebuild b/dev-python/botocore/botocore-1.43.60.ebuild
new file mode 100644
index 000000000000..a3a161f78545
--- /dev/null
+++ b/dev-python/botocore/botocore-1.43.60.ebuild
@@ -0,0 +1,67 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1
+
+DESCRIPTION="Low-level, data-driven core of boto 3"
+HOMEPAGE="
+ https://github.com/boto/botocore/
+ https://pypi.org/project/botocore/
+"
+SRC_URI="
+ https://github.com/boto/botocore/archive/${PV}.tar.gz
+ -> ${P}.gh.tar.gz
+"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~sparc ~x86"
+
+RDEPEND="
+ <dev-python/jmespath-2[${PYTHON_USEDEP}]
+ dev-python/python-dateutil[${PYTHON_USEDEP}]
+ >=dev-python/urllib3-1.25.4[${PYTHON_USEDEP}]
+"
+# unbundled packages
+RDEPEND+="
+ dev-python/requests[${PYTHON_USEDEP}]
+ dev-python/six[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ test? (
+ dev-python/jsonschema[${PYTHON_USEDEP}]
+ )
+"
+
+EPYTEST_PLUGINS=()
+EPYTEST_XDIST=1
+distutils_enable_tests pytest
+
+src_prepare() {
+ # unpin deps
+ sed -i -e "s:>=.*':':" setup.py || die
+
+ # unbundle deps
+ rm -r botocore/vendored || die
+ find -name '*.py' -exec sed -i \
+ -e 's:from botocore[.]vendored import:import:' \
+ -e 's:from botocore[.]vendored[.]:from :' \
+ {} + || die
+
+ distutils-r1_src_prepare
+}
+
+python_test() {
+ local EPYTEST_DESELECT=(
+ # rely on bundled six
+ tests/functional/test_six_imports.py::test_no_bare_six_imports
+ tests/functional/test_six_threading.py::test_six_thread_safety
+ )
+
+ epytest tests/{functional,unit}
+}
diff --git a/dev-python/cachelib/Manifest b/dev-python/cachelib/Manifest
index aa848d2a6e5c..87f1969b7f7c 100644
--- a/dev-python/cachelib/Manifest
+++ b/dev-python/cachelib/Manifest
@@ -1,2 +1,4 @@
DIST cachelib-0.14.0.tar.gz 170320 BLAKE2B eef18a1840468057ddd79a1b647de81d20d49abdc4b51c6b13ae1ed18cc5a635447c6e8ebe2112a3853c4809982f45ad5f2ac09afe66c36442c327fb584f0f02 SHA512 ed14f9e944454067b30c748b558670fc50343f332ec4bf91e7df97bbc2ad9647e97d221b62287b139df70faafcccbbf1c455710c71cb969e096e61997e98d13e
DIST cachelib-0.14.0.tar.gz.provenance 9394 BLAKE2B cbb5092520d5510df628b504cc67b24d970ec202beead31831792f10da048c8bac02b86a2077778fe71e51884a5c50120fdab77248e438b9f81c196e9d662ddf SHA512 830d3d3b2a693e668aaed43cfbad7ada69b1670033c36d1354ab069cf7ba19ed4197b1c2cb7da77f8a5fa4817b8140982777cc2ba9d84362d963cf3c6684848f
+DIST cachelib-0.15.0.tar.gz 113028 BLAKE2B 7e56e5d1df3d4a6f709d3377b3258c5ffc939fe4b3c70846cec2e0731bed4974df5b56db45ba6a976a3e3c4e7b7767f18b1c07b567330cd592cf7f5c336e97b2 SHA512 6fdba94598e674131e7689c7b2e8e8e33e9e145673bbb9230c191c0abbe071401b08c40cf93508d64624bc38c82f062d087b202375d62f7be272f132b253b71a
+DIST cachelib-0.15.0.tar.gz.provenance 9677 BLAKE2B e4b197c2e40f467e3696bf2dce3a4d00cbf41bfe7d74d8847924fe9cfe3fff8c5edb86430b02ff009b7969384c4ad6799fee723965929db8c1b871b77596026b SHA512 1d1f41306bce40fdc9f56486fce723a7edd511f715deba00529da0324441343bde811d4e8ff9013ee4da21ee0bb4a8f9cf63fc9bfaf095049208037cd2ac1e05
diff --git a/dev-python/cachelib/cachelib-0.15.0.ebuild b/dev-python/cachelib/cachelib-0.15.0.ebuild
new file mode 100644
index 000000000000..0761d3e7cb36
--- /dev/null
+++ b/dev-python/cachelib/cachelib-0.15.0.ebuild
@@ -0,0 +1,45 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=flit-core
+PYPI_VERIFY_REPO=https://github.com/pallets-eco/cachelib
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="Collection of cache libraries in the same API interface. Extracted from werkzeug"
+HOMEPAGE="
+ https://pypi.org/project/cachelib/
+ https://github.com/pallets-eco/cachelib/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86"
+
+BDEPEND="
+ test? (
+ dev-db/redis
+ dev-python/redis[${PYTHON_USEDEP}]
+ net-misc/memcached
+ www-servers/uwsgi[python,${PYTHON_USEDEP}]
+ !sparc? (
+ dev-python/pylibmc[${PYTHON_USEDEP}]
+ )
+ )
+"
+
+EPYTEST_PLUGINS=( pytest-xprocess )
+distutils_enable_tests pytest
+
+EPYTEST_IGNORE=(
+ # bug #818523
+ tests/test_redis_cache.py
+ # requires some test server running
+ # (these tests require dev-python/boto3)
+ tests/test_dynamodb_cache.py
+ # requires mongo test server
+ tests/test_mongodb_cache.py
+)
diff --git a/dev-python/exif/exif-1.6.0.ebuild b/dev-python/exif/exif-1.6.0.ebuild
index 98faaf405fa8..e2869ff06f05 100644
--- a/dev-python/exif/exif-1.6.0.ebuild
+++ b/dev-python/exif/exif-1.6.0.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2025 Gentoo Authors
+# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
@@ -6,7 +6,7 @@ PYTHON_COMPAT=( python3_{13..14} )
DISTUTILS_USE_PEP517=setuptools
inherit distutils-r1
-DESCRIPTION="Read and modify image EXIF metadata using Python."
+DESCRIPTION="Read and modify image EXIF metadata using Python"
HOMEPAGE="https://gitlab.com/TNThieding/exif"
SRC_URI="https://gitlab.com/TNThieding/${PN}/-/archive/v${PV}/${PN}-v${PV}.tar.bz2"
S="${WORKDIR}/${PN}-v${PV}"
diff --git a/dev-python/feedparser-sgmllib/Manifest b/dev-python/feedparser-sgmllib/Manifest
new file mode 100644
index 000000000000..5c7dab7ea43d
--- /dev/null
+++ b/dev-python/feedparser-sgmllib/Manifest
@@ -0,0 +1,2 @@
+DIST feedparser_sgmllib-2.0.1.tar.gz 22962 BLAKE2B 721e2c000ae6d398430d30e02498fc164471f5aa2274c90e016bb0d5f431e8b9538d2176f514858ea5de7c9b7233f732929d285cd449e81ca13ec8f5241a2bf0 SHA512 876d0d6f164b2044bcb0cb7aa77476090dca3d99b444806c747329ac03109753de77174459b8fdc6aa77cb0696ca3f3f3eb72b70232b71d7ee8c33bd13f9dc7c
+DIST feedparser_sgmllib-2.0.1.tar.gz.provenance 10323 BLAKE2B a1c520121aacf34bf3be63d6f79cd0cae8a8059f1be29e5d0193ee576e248940fcfdd8342d3177b06cdf26b390c5e02234263d54544ae368a7e1f44e531fb13c SHA512 8d9f0f3b1a6b249e50d3cc535823ce8e23a132949c594692dcd216a0dca95f3c9aa46392e20b07813c747d9ff54420d17bf9a00217a007f1e6343ff8cfa13c74
diff --git a/dev-python/feedparser-sgmllib/feedparser-sgmllib-2.0.1.ebuild b/dev-python/feedparser-sgmllib/feedparser-sgmllib-2.0.1.ebuild
new file mode 100644
index 000000000000..b622b8b03349
--- /dev/null
+++ b/dev-python/feedparser-sgmllib/feedparser-sgmllib-2.0.1.ebuild
@@ -0,0 +1,23 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=poetry-core
+PYPI_VERIFY_REPO=https://github.com/python-syndication/feedparser-sgmllib
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="sgmllib from Python 2.7 for feedparser use"
+HOMEPAGE="
+ https://github.com/python-syndication/feedparser-sgmllib/
+ https://pypi.org/project/feedparser-sgmllib/
+"
+
+LICENSE="PSF-2"
+SLOT="0"
+KEYWORDS="~amd64"
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
diff --git a/dev-python/feedparser-sgmllib/metadata.xml b/dev-python/feedparser-sgmllib/metadata.xml
new file mode 100644
index 000000000000..d34971a915e9
--- /dev/null
+++ b/dev-python/feedparser-sgmllib/metadata.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://docs.baldeagleos.com/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="project">
+ <email>python@gentoo.org</email>
+ </maintainer>
+ <stabilize-allarches />
+ <origin>baldeagleos-repo</origin>
+</pkgmetadata>
diff --git a/dev-python/feedparser/Manifest b/dev-python/feedparser/Manifest
index fd0551631740..4dc2f5a6250b 100644
--- a/dev-python/feedparser/Manifest
+++ b/dev-python/feedparser/Manifest
@@ -1 +1,2 @@
DIST feedparser-6.0.12.gh.tar.gz 253342 BLAKE2B b3147c07c3319d644930face3818d93eb8ba786e0500d7e101c2b54b332488811c76340f033d13cfff39fbdd8126482f31baa27ff4f2b8f0ed1cab7dca9414ac SHA512 147b92f3be728726efb6c0f981c8b8fc0715ffb5e8f07f22ce40c3f9f7b1022f4a02452e2211ca472a27dad3ce5e1460412c7a341518a46becc7d5a3bf13c37f
+DIST feedparser-6.0.14.gh.tar.gz 252830 BLAKE2B 831421d9e9c012cbeb25a8e34e1f1ae6cc6e69dc2ce3b866a731d3aedd4bb8c3360374fe83158a1ff6440e7a2aeedfee869839fbf5ae8f4b2899c4b5aa16f2fc SHA512 1480317e09835e1aba82b83b11f6622568950852754fb830c7b3d7be1192bc8ca6c1a6dad23e8340c2cff3add4c8baa8e479b9aa4f162bcd9c05330bc0a49caf
diff --git a/dev-python/feedparser/feedparser-6.0.14.ebuild b/dev-python/feedparser/feedparser-6.0.14.ebuild
new file mode 100644
index 000000000000..28cbb5b145b6
--- /dev/null
+++ b/dev-python/feedparser/feedparser-6.0.14.ebuild
@@ -0,0 +1,42 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1
+
+MY_PV=${PV/_beta/b}
+MY_P=${PN}-${MY_PV}
+DESCRIPTION="Parse RSS and Atom feeds in Python"
+HOMEPAGE="
+ https://github.com/kurtmckee/feedparser/
+ https://pypi.org/project/feedparser/
+"
+SRC_URI="
+ https://github.com/kurtmckee/feedparser/archive/v${MY_PV}.tar.gz
+ -> ${MY_P}.gh.tar.gz
+"
+S=${WORKDIR}/${MY_P}
+
+LICENSE="BSD-2"
+SLOT="0"
+KEYWORDS="~amd64"
+
+RDEPEND="
+ =dev-python/feedparser-sgmllib-2*[${PYTHON_USEDEP}]
+"
+
+src_prepare() {
+ # broken
+ rm \
+ tests/illformed/chardet/{euckr,gb2312,tis620,windows1255}.xml \
+ tests/illformed/undeclared_namespace.xml || die
+ distutils-r1_src_prepare
+}
+
+python_test() {
+ "${EPYTHON}" tests/runtests.py -v || die "Tests failed with ${EPYTHON}"
+}
diff --git a/dev-python/guessit/Manifest b/dev-python/guessit/Manifest
index 25fa4a8d01d3..c7305630c24b 100644
--- a/dev-python/guessit/Manifest
+++ b/dev-python/guessit/Manifest
@@ -1,3 +1,3 @@
-DIST guessit-3.8.0.tar.gz 271285 BLAKE2B 67ff29739839c79b95ad6022ad0329698af62abcbbbed7e9f52ba1c2e60f5c69defda5e87d97607d3eaeeb7668a9f4b82de05140f23555c800731c2236b0f7e6 SHA512 968e8f27dd41dcaece27444cd5117990726ef73467cedbc008dcf0fe2d1f2010209253e2fa6d645e30d9eaffe613080f1c2d77bda772227c1e6e04910d58f7ad
DIST guessit-4.0.2.tar.gz 394394 BLAKE2B a5f9b85e2a9323db982c484aa19e6e56e8e3b138abce226dcefcef0bc9e8a105ad3fb9ab57aac4d1b65d6cc663781949934d96e3f2d9e5984fd6b1bfec34e223 SHA512 1687ace42d4c95d401949bef905a4962be3b04f7c8151da83a8803ef8e0e5b407d35159ad744a9b478607a50f4c15456f508852e638156896d1d92720cc987ac
DIST guessit-4.1.0.tar.gz 464269 BLAKE2B 79cb2018233b1c1e603e6e50faff267769fbc91aaf7a5c011c1dd7c5ba162bcbf0beb507162ffecc8290cff63e8c441d2ed1ba150960d89a39f2d70d69a0344c SHA512 1a770f67a2950cfd62a1e26cd439dd770631efb992512dfce5b0f1efee219c15bec75ad9e5b81d15a69ff21e8e9780708af1bf58e4306e9fead5c9e694155e32
+DIST guessit-4.3.0.tar.gz 478988 BLAKE2B b9373976f3a5f9c0b633334167bb04ca68406af4d32478d2eb7f4a4055824498b0a9cee61bcc49df3b239fd13e3ff2f2ee829b2592c8932a44d1b31523b0e09a SHA512 ea512c73e3e60e6b318393dd7844f921d22878db1aed69418686db82fa11dbd395e04248c615ae5c8619b9aa864fdab9fa4c065471eb34108e53f4f3c1381dd8
diff --git a/dev-python/guessit/guessit-3.8.0.ebuild b/dev-python/guessit/guessit-4.3.0.ebuild
index f3edb1b7d795..7291194841ef 100644
--- a/dev-python/guessit/guessit-3.8.0.ebuild
+++ b/dev-python/guessit/guessit-4.3.0.ebuild
@@ -1,9 +1,9 @@
-# Copyright 1999-2025 Gentoo Authors
+# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
-DISTUTILS_USE_PEP517=setuptools
+DISTUTILS_USE_PEP517=hatchling
PYTHON_COMPAT=( python3_{13..14} )
inherit distutils-r1 pypi
@@ -16,20 +16,20 @@ HOMEPAGE="
LICENSE="LGPL-3"
SLOT="0"
-KEYWORDS="amd64 ~arm arm64 x86"
+KEYWORDS="~amd64 ~arm ~arm64 ~x86"
RDEPEND="
- >=dev-python/babelfish-0.5.5[${PYTHON_USEDEP}]
- >=dev-python/rebulk-3.2.0[${PYTHON_USEDEP}]
- dev-python/python-dateutil[${PYTHON_USEDEP}]
- dev-python/pyyaml[${PYTHON_USEDEP}]
+ >=dev-python/babelfish-0.6.1[${PYTHON_USEDEP}]
+ <dev-python/rebulk-7[${PYTHON_USEDEP}]
+ >=dev-python/rebulk-6.0.1[${PYTHON_USEDEP}]
+ >=dev-python/python-dateutil-2.8.0[${PYTHON_USEDEP}]
"
-BDEPEND="
- test? (
- dev-python/pytest-mock[${PYTHON_USEDEP}]
- )
+# pyyaml is optional, keep it because we historically had it by default
+RDEPEND+="
+ dev-python/pyyaml[${PYTHON_USEDEP}]
"
+EPYTEST_PLUGINS=( pytest-mock )
distutils_enable_tests pytest
EPYTEST_IGNORE=(
diff --git a/dev-python/hypothesis/Manifest b/dev-python/hypothesis/Manifest
index 466545fd96d2..d80327adaa39 100644
--- a/dev-python/hypothesis/Manifest
+++ b/dev-python/hypothesis/Manifest
@@ -17,6 +17,7 @@ DIST hypothesis-6.161.1.gh.tar.gz 9643537 BLAKE2B 82d8fc72747c3d724a2194d278f68e
DIST hypothesis-6.161.5.gh.tar.gz 9645193 BLAKE2B d504a70bfa7e6cc18befcb86ce5be627847d3f040829bee45a4a19d942c9ab1e217314b3f48d0d3478583d95a28b45423715f486d01fcc0dcc6e9398023f6421 SHA512 cdd8169993fb1fb23631412794054b047d093862b005afa37858e79b5e4e599c55a2c514adc21e78d1cecd099ed7470e4b52e07e0da202b137244d5d7e3833f4
DIST hypothesis-6.161.8.gh.tar.gz 9649785 BLAKE2B 7058bec35557b223b4539401c830a806b20f8fae23577782d1917a14aacf64b62c4af3c59df2554b98aff9f21fe93b324150112ccceb1f8dbe21c04b1ed4630f SHA512 d1ee1f48e9589854ed1df59d6be7a385edcde03f325d43573867d8abd44cfa817406c31102c969bcfd8e9c4455c30397379742e1aaa8eaff057f02a77567043c
DIST hypothesis-6.163.0.gh.tar.gz 9654307 BLAKE2B 8a1d1d67b3eee42ce2ab4623de53b27333473371abb12936fb4a706fb9de8c289c3600940603590e497ca4c4d5b8b8609137358d60c4b31ab26a01cf1d75dc18 SHA512 5322e735a4bd08eed4c13b22872101e4b7bd5681aeeb164a1cfa456e18b2cc48f6da2c49543873fe24aa0642c10c1fdfb5b9b7628e824abc7584f23600dd7f3f
+DIST hypothesis-6.164.0.gh.tar.gz 9665401 BLAKE2B 9d5c5fc98191166cb0da35ac03ae5a377dd5c6d77144974d1b76e8e83368bbf0ad24d3c9ab6cf9758b77db59a5c5863b6ede859f91749ca5ded863fef554d9c8 SHA512 081e8643a6046eebfa4eec792ec001420e07be1acccbe6fc738a7baf476fa705991b34072d5b04dcf1a88ab77b90d6c26f99ee9edb2c1439cef54f16120e0def
DIST libc-0.2.186.crate 821883 BLAKE2B ebe7aac5f8937a8064c64a0d4dc72e5fc794080e09b96c6d245bdec0fd9a19d49ab38e25306e22e47564764cf5dcde45855237cffc70230a143eca2626bd5c3c SHA512 6a58e671ec6811dff9a0d7d4db8f37d38bcbca9efff20dad4706190e5cdb77b426567754bcf0ef0f2d0c31d6506401f724f3ca500b9bed57bb8605b1141ed690
DIST once_cell-1.21.4.crate 35010 BLAKE2B 9117ed1d478e626b7b7be2e3ff8b68a382b051112c7ca4425367bdae86977671f8b5c576131c82fb437740b6d98b72501f718f4172d39781decac2385e8fbd4d SHA512 af67669b0107f44268ba74c355200cb2ed1aab235a6989a8bc54323eb2c9a45677010f8672e7790edadd4c981e939436e0c3a099d33c06dce9c14fd5ede86155
DIST portable-atomic-1.13.1.crate 197001 BLAKE2B 6d0898c2a537a9bf204b7749cca5f5fddf280772b56eb7ce8fdd9cf7d71561137b26ef89f415c40277a1c89981333eef78e5bb4624515a294ba28fdaeb4c70ea SHA512 2a1b31ac9814af884640b3398ab824a9795c72d260527a0966b193113808cfbb3345d50cd1beaebb45863437c3d06c8706d34b26efecceefc649319a4bc274a3
diff --git a/dev-python/hypothesis/hypothesis-6.164.0.ebuild b/dev-python/hypothesis/hypothesis-6.164.0.ebuild
new file mode 100644
index 000000000000..8903f56543dd
--- /dev/null
+++ b/dev-python/hypothesis/hypothesis-6.164.0.ebuild
@@ -0,0 +1,143 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_EXT=1
+DISTUTILS_USE_PEP517=maturin
+CLI_COMPAT=( python3_{12..15} )
+PYTHON_COMPAT=( python3_{13..14} )
+PYTHON_REQ_USE="threads(+),sqlite"
+
+RUST_MIN_VER="1.91.0"
+CRATES="
+ cfg-if@1.0.4
+ crunchy@0.2.4
+ getrandom@0.3.4
+ half@2.7.1
+ heck@0.5.0
+ libc@0.2.186
+ once_cell@1.21.4
+ portable-atomic@1.13.1
+ ppv-lite86@0.2.21
+ proc-macro2@1.0.106
+ pyo3-build-config@0.29.0
+ pyo3-ffi@0.29.0
+ pyo3-macros-backend@0.29.0
+ pyo3-macros@0.29.0
+ pyo3@0.29.0
+ quote@1.0.46
+ r-efi@5.3.0
+ rand@0.9.4
+ rand_chacha@0.9.0
+ rand_core@0.9.5
+ syn@2.0.118
+ target-lexicon@0.13.5
+ unicode-ident@1.0.24
+ wasip2@1.0.4+wasi-0.2.12
+ wit-bindgen@0.57.1
+ zerocopy-derive@0.8.53
+ zerocopy@0.8.53
+"
+
+inherit cargo distutils-r1 optfeature
+
+DESCRIPTION="A library for property based testing"
+HOMEPAGE="
+ https://github.com/HypothesisWorks/hypothesis/
+ https://pypi.org/project/hypothesis/
+"
+SRC_URI="
+ https://github.com/HypothesisWorks/hypothesis/archive/v${PV}.tar.gz
+ -> ${P}.gh.tar.gz
+ ${CARGO_CRATE_URIS}
+"
+S="${WORKDIR}/${P}/hypothesis"
+
+LICENSE="MPL-2.0"
+# Dependent crate licenses
+LICENSE+=" Apache-2.0-with-LLVM-exceptions MIT Unicode-3.0"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
+IUSE="cli"
+
+RDEPEND="
+ >=dev-python/sortedcontainers-2.1.0[${PYTHON_USEDEP}]
+ cli? (
+ $(python_gen_cond_dep '
+ dev-python/black[${PYTHON_USEDEP}]
+ dev-python/click[${PYTHON_USEDEP}]
+ ' "${CLI_COMPAT[@]}")
+ )
+"
+BDEPEND="
+ test? (
+ >=dev-python/attrs-22.2.0[${PYTHON_USEDEP}]
+ dev-python/pexpect[${PYTHON_USEDEP}]
+ >=dev-python/pytest-8[${PYTHON_USEDEP}]
+ )
+"
+PDEPEND="
+ dev-python/hypothesis-gentoo[${PYTHON_USEDEP}]
+"
+
+EPYTEST_PLUGIN_LOAD_VIA_ENV=1
+EPYTEST_PLUGINS=( "${PN}" pytest-xdist )
+EPYTEST_RERUNS=5
+EPYTEST_XDIST=1
+distutils_enable_tests pytest
+
+QA_PREBUILT="usr/lib/python.*/site-packages/hypothesis/_native.*"
+
+python_test() {
+ # NB: paths need to be relative to pytest.ini, i.e. start with hypothesis/
+ local EPYTEST_DESELECT=(
+ # broken somehow (xdist?)
+ 'hypothesis/tests/pytest/test_constant_collection_timing.py::test_constant_collection_timing[True]'
+ )
+ local EPYTEST_IGNORE=(
+ # require syrupy
+ tests/cover/test_custom_reprs.py
+ )
+
+ case ${EPYTHON} in
+ python3.15*)
+ EPYTEST_DESELECT+=(
+ 'hypothesis/tests/cover/test_lookup.py::test_resolves_forwardrefs_to_builtin_types[sentinel]'
+ 'hypothesis/tests/cover/test_lookup.py::test_resolves_builtin_types[sentinel]'
+ 'hypothesis/tests/cover/test_lambda_formatting.py::test_modifying_lambda_source_code_returns_unknown[False]'
+ )
+ ;;
+ esac
+
+ local -x HYPOTHESIS_NO_PLUGINS=1
+ epytest -o filterwarnings= tests/{cover,pytest,quality}
+}
+
+src_install() {
+ local HAD_CLI=
+
+ distutils-r1_src_install
+
+ if [[ ! ${HAD_CLI} ]]; then
+ rm -r "${ED}/usr/bin" || die
+ fi
+}
+
+python_install() {
+ distutils-r1_python_install
+ if use cli && has "${EPYTHON}" "${CLI_COMPAT[@]/_/.}"; then
+ HAD_CLI=1
+ else
+ rm -r "${D}$(python_get_scriptdir)" || die
+ fi
+}
+
+pkg_postinst() {
+ optfeature "datetime support" dev-python/pytz
+ optfeature "dateutil support" dev-python/python-dateutil
+ optfeature "numpy support" dev-python/numpy
+ optfeature "django support" dev-python/django dev-python/pytz
+ optfeature "pandas support" dev-python/pandas
+ optfeature "pytest support" dev-python/pytest
+}
diff --git a/dev-python/jupyter-builder/Manifest b/dev-python/jupyter-builder/Manifest
index 68ac7b85360a..26f466b45998 100644
--- a/dev-python/jupyter-builder/Manifest
+++ b/dev-python/jupyter-builder/Manifest
@@ -1 +1,2 @@
DIST jupyter_builder-1.1.1.tar.gz 971667 BLAKE2B 188d02c6aa1b414ff5a7b183bc67c762c9b7f02fa9ab633feb303e41f9c14247b2bc26a0c215461d8612f07776ca191f970218a3d00c05691b96340a8804482a SHA512 1a68ab521a748a1cf88da0bab8a68a3b07993b0b58bc828b5bdc82c558815179101d80797e14e27b72a15fbe4fc0e5f58e2d59e018a6f4c01b851bf96e14d8f6
+DIST jupyter_builder-1.2.0.tar.gz 976342 BLAKE2B 858f02b0eb14b3ffd8c170840130474442391f09196305732c40693b8711ade7f92cb31a6950b98b2743c7732c2426337b7c8ac11ab4c87f9f79a4c8a129747f SHA512 dff7817798a8a54c79cb791426679fbe7c40cc9924ca00441140f75cfd56e1eb79ddaea75af36b09e20486e1831047cb58b1b7ea0a997d9145dfb59f6d1f9bb1
diff --git a/dev-python/jupyter-builder/jupyter-builder-1.2.0.ebuild b/dev-python/jupyter-builder/jupyter-builder-1.2.0.ebuild
new file mode 100644
index 000000000000..02718c0e34a9
--- /dev/null
+++ b/dev-python/jupyter-builder/jupyter-builder-1.2.0.ebuild
@@ -0,0 +1,40 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=hatchling
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi xdg
+
+DESCRIPTION="JupyterLab build tools"
+HOMEPAGE="
+ https://jupyter.org/
+ https://github.com/jupyterlab/jupyter-builder
+ https://pypi.org/project/jupyter-builder/
+"
+
+LICENSE="BSD MIT ISC"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64"
+
+RDEPEND="
+ !<dev-python/jupyterlab-4.6.0
+ dev-python/jupyter-core[${PYTHON_USEDEP}]
+ dev-python/traitlets[${PYTHON_USEDEP}]
+"
+
+BDEPEND="
+ test? (
+ dev-python/jinja2-time[${PYTHON_USEDEP}]
+ )
+"
+
+EPYTEST_IGNORE=(
+ # TODO: package copier
+ tests/test_tpl.py
+)
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
diff --git a/dev-python/lesscpy/Manifest b/dev-python/lesscpy/Manifest
index 97a0ae499107..922fce26cc1f 100644
--- a/dev-python/lesscpy/Manifest
+++ b/dev-python/lesscpy/Manifest
@@ -1 +1,3 @@
DIST lesscpy-0.15.1.tar.gz 177240 BLAKE2B 3199c3daecb3703039d13be6a23619e2a0e590c2b8f5450cd526e3bdedb22f8f782291ba820a8e1dcd06bca6542fb91eacd9d20b7f1f05cff701038d45e8e3cb SHA512 3a88c14d1e47a28d5e427e9cd0e1c2553dd3fc937085c54975c3e2612d623673e0a2fe05d7bb60dcdeda0f352b1be0354595ba9fac38483e7ab0a21529036e65
+DIST lesscpy-0.15.2.tar.gz 153361 BLAKE2B 0ede278d29dc15b2f5aabc7b4a392e23005b7220434036aaaf908024cef0c6b1623fddb0e8b1b868233dbe4755e987c51df4b213513b64e0282f404fee84d727 SHA512 1e78151917878b73c5c847b3aa246f14dbe0ac753e51252e209a9776e2e7f22359656f7ceed3eb669ea386ef98864b1b7b41804c79e850315b6c43dd0d15fd11
+DIST lesscpy-0.15.2.tar.gz.provenance 9312 BLAKE2B 65d90b1346d9bb2711e4b7d0c7426f08c2953d957ffa16a8e01049a0df37ddb6ac636e81f5accb5fcf57c642fa981a275b5529f7625f63e07c5b3520788f6f3f SHA512 7f15fc431ece18ce6329d181028967e12d7a14fb9ddce6e24b084aa27052c1fd31144fd6753f16a704867be207e7033b7cd48ed1395b7308cbf0958a10e6f57e
diff --git a/dev-python/lesscpy/lesscpy-0.15.2.ebuild b/dev-python/lesscpy/lesscpy-0.15.2.ebuild
new file mode 100644
index 000000000000..83598dbf8054
--- /dev/null
+++ b/dev-python/lesscpy/lesscpy-0.15.2.ebuild
@@ -0,0 +1,31 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYPI_VERIFY_REPO=https://github.com/lesscpy/lesscpy
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="A compiler written in Python for the LESS language"
+HOMEPAGE="
+ https://github.com/lesscpy/lesscpy/
+ https://pypi.org/project/lesscpy/
+"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+
+RDEPEND="
+ dev-python/ply[${PYTHON_USEDEP}]
+ dev-python/six[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ dev-python/pkg-resources[${PYTHON_USEDEP}]
+"
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
diff --git a/dev-python/lsprotocol/Manifest b/dev-python/lsprotocol/Manifest
index 14f03a15ea4b..11612a64b213 100644
--- a/dev-python/lsprotocol/Manifest
+++ b/dev-python/lsprotocol/Manifest
@@ -1 +1,2 @@
+DIST lsprotocol-2025.0.0.gh.tar.gz 280633 BLAKE2B 56071055d8c23f942ef74bb7e4138546d5d6723bbb4448cc8b91ad435a66c2a328beaa65026b604daf313aa45009b75bb0df4d87a1b11cd6183b270607fd6c97 SHA512 d8b003516aac34e9a78d42235879b38a218133bfd71a06ef5aa829ecbda756ebad1675e8581da7f1d5730a7ff4593e8ea14fa58cf837278f4b6ee9e10b7ad4ce
DIST lsprotocol-2025.0.0.tar.gz 74896 BLAKE2B 7e998352ed256455dc02ba1312ca9cb63ee6ad9cc77ca27f764037d249ce40a80e0860831b18930d399168840a21d86fefb8d443495e5909d76e7958304f889a SHA512 82d99f4176c85e8fcae0bb34d4fb6648d7212467b7b9d4edc108fab46e0b5e63c0e41c70a7d5d5888807115429d28cb59c17ce60abb16def09ec93605e95a6e1
diff --git a/dev-python/lsprotocol/files/lsprotocol-2025.0.0-fix-against-cattrs-25.0.0.patch b/dev-python/lsprotocol/files/lsprotocol-2025.0.0-fix-against-cattrs-25.0.0.patch
new file mode 100644
index 000000000000..1069f979dccc
--- /dev/null
+++ b/dev-python/lsprotocol/files/lsprotocol-2025.0.0-fix-against-cattrs-25.0.0.patch
@@ -0,0 +1,36 @@
+https://github.com/microsoft/lsprotocol/pull/443
+
+From 7b5d4f7422bfe4c597b8124f99861e751d47f153 Mon Sep 17 00:00:00 2001
+From: Aleksandr Dovydenkov <asd@altlinux.org>
+Date: Fri, 26 Sep 2025 10:29:26 +0300
+Subject: [PATCH] Add support cattrs>=25.0.0.
+
+Breaking on update to cattrs version 25.1.0. See: https://catt.rs/en/latest/migrations.html#the-default-structure-hook-fallback-factory
+--- a/packages/python/lsprotocol/converters.py
++++ b/packages/python/lsprotocol/converters.py
+@@ -1,6 +1,7 @@
+ # Copyright (c) Microsoft Corporation. All rights reserved.
+ # Licensed under the MIT License.
+
++from importlib.metadata import version
+ from typing import Optional
+
+ import cattrs
+@@ -8,10 +9,16 @@
+ from . import _hooks
+
+
++def _get_default_converter():
++ if version("cattrs") >= "25.0.0":
++ return cattrs.Converter(structure_fallback_factory=lambda _: cattrs.fns.raise_error)
++ return cattrs.Converter()
++
++
+ def get_converter(
+ converter: Optional[cattrs.Converter] = None,
+ ) -> cattrs.Converter:
+ """Adds cattrs hooks for LSP lsp_types to the given converter."""
+ if converter is None:
+- converter = cattrs.Converter()
++ converter = _get_default_converter()
+ return _hooks.register_hooks(converter)
diff --git a/dev-python/lsprotocol/lsprotocol-2025.0.0-r1.ebuild b/dev-python/lsprotocol/lsprotocol-2025.0.0-r1.ebuild
new file mode 100644
index 000000000000..db1e4f96fe49
--- /dev/null
+++ b/dev-python/lsprotocol/lsprotocol-2025.0.0-r1.ebuild
@@ -0,0 +1,52 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=flit
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit edo distutils-r1
+
+DESCRIPTION="Language Server Protocol types code generator packages"
+HOMEPAGE="
+ https://github.com/microsoft/lsprotocol
+ https://pypi.org/project/lsprotocol/
+"
+# no tests in sdist
+SRC_URI="
+ https://github.com/microsoft/lsprotocol/archive/refs/tags/${PV}.tar.gz
+ -> ${P}.gh.tar.gz
+"
+S="${S}/packages/python"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64"
+
+RDEPEND="
+ dev-python/attrs[${PYTHON_USEDEP}]
+ dev-python/cattrs[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ test? (
+ dev-python/pyhamcrest[${PYTHON_USEDEP}]
+ )
+"
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
+
+PATCHES=(
+ "${FILESDIR}"/lsprotocol-2025.0.0-fix-against-cattrs-25.0.0.patch
+)
+
+src_prepare() {
+ pushd "${WORKDIR}/${P}" >/dev/null || die
+ default
+ popd >/dev/null || die
+}
+
+python_test() {
+ epytest ../../tests/python
+}
diff --git a/dev-python/markdown/Manifest b/dev-python/markdown/Manifest
index 37d1c77e5416..c2c3b4d9c5d5 100644
--- a/dev-python/markdown/Manifest
+++ b/dev-python/markdown/Manifest
@@ -1 +1,2 @@
DIST markdown-3.10.2.tar.gz 368805 BLAKE2B cc5bbbfe702e81937b849f3b9b48089ca07a314ae8603ca5203b11f3eaed0591a042ac855abb1231378848073b9c0d071e22550952659e6b7711e5607ecf0d77 SHA512 cd84d5715002ed58cb1ec64f1b33d048892162cfc9675f570e146bc611ea92cf0dbb3a99018e091131188f29efde8c25da2e9218b5d0d96890c406cbde300074
+DIST markdown-3.10.3.tar.gz 372596 BLAKE2B 3f5ad04979c29234964928e436d4523ac0abbbbd9e4f1816652ca889d82993bc324f3d8d855f47b1be9291c3a4f97b9fbef1df0772af24af7aa3b920089cc26a SHA512 64e5e5f27a2aa0297e316c20796969e802acc3ffcf5e8c266fcf0eda2d188f30458adf1f0420508b104dfdb2a8b153d58b10a5b20f48d8327df5318b784307f9
diff --git a/dev-python/markdown/markdown-3.10.3.ebuild b/dev-python/markdown/markdown-3.10.3.ebuild
new file mode 100644
index 000000000000..5a1dd7ba2712
--- /dev/null
+++ b/dev-python/markdown/markdown-3.10.3.ebuild
@@ -0,0 +1,39 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYPI_PN=${PN^}
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="Python implementation of the markdown markup language"
+HOMEPAGE="
+ https://python-markdown.github.io/
+ https://pypi.org/project/Markdown/
+ https://github.com/Python-Markdown/markdown/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-macos"
+IUSE="doc test"
+RESTRICT="!test? ( test )"
+
+BDEPEND="
+ test? (
+ dev-python/pygments[${PYTHON_USEDEP}]
+ dev-python/pytidylib[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ )
+"
+
+distutils_enable_tests unittest
+
+python_install_all() {
+ use doc && dodoc -r docs/
+
+ distutils-r1_python_install_all
+}
diff --git a/dev-python/mdformat-gfm/Manifest b/dev-python/mdformat-gfm/Manifest
new file mode 100644
index 000000000000..1abda9d37f70
--- /dev/null
+++ b/dev-python/mdformat-gfm/Manifest
@@ -0,0 +1 @@
+DIST mdformat-gfm-1.0.0.gh.tar.gz 36267 BLAKE2B 26afb9022cfa529d81acd7aad5245bb161f6b0da04ce11335dba17d5dd3db6f9f2bea85ad137f21da1c17400e36595d3e82266bbf32dfd6fca368ab5608f66c9 SHA512 b3dd249883085a2aa0eaca5b8ec30f00f2ca17322a3e2d30ccb47f559b7f3b15641024d509369f4bc0dfb0947bd95b565ad6f9ee8c263028abcd726c46de0b77
diff --git a/dev-python/mdformat-gfm/mdformat-gfm-1.0.0.ebuild b/dev-python/mdformat-gfm/mdformat-gfm-1.0.0.ebuild
new file mode 100644
index 000000000000..e420ee5ee712
--- /dev/null
+++ b/dev-python/mdformat-gfm/mdformat-gfm-1.0.0.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+DISTUTILS_USE_PEP517=flit
+inherit distutils-r1
+
+DESCRIPTION="Mdformat plugin for GitHub Flavored Markdown compatibility"
+HOMEPAGE="
+ https://github.com/hukkin/mdformat-gfm
+ https://pypi.org/project/mdformat-gfm/
+"
+SRC_URI="
+ https://github.com/hukkin/${PN}/archive/${PV}.tar.gz
+ -> ${P}.gh.tar.gz
+"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+
+RDEPEND="
+ >=dev-python/mdformat-0.7.5[${PYTHON_USEDEP}]
+ dev-python/markdown-it-py[${PYTHON_USEDEP}]
+ >=dev-python/mdit-py-plugins-0.2.0[${PYTHON_USEDEP}]
+ >=dev-python/wcwidth-0.2.13[${PYTHON_USEDEP}]
+"
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
diff --git a/dev-python/mdformat-gfm/metadata.xml b/dev-python/mdformat-gfm/metadata.xml
new file mode 100644
index 000000000000..b746277b65d6
--- /dev/null
+++ b/dev-python/mdformat-gfm/metadata.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://docs.baldeagleos.com/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>vowstar@gmail.com</email>
+ <name>Huang Rui</name>
+ </maintainer>
+ <longdescription lang="en">
+ An mdformat plugin that adds GitHub Flavored Markdown support, covering
+ tables, task list items, strikethroughs and autolinks. It registers two
+ plugins, gfm for the full GFM syntax and tables for table rendering
+ alone, and supersedes the mdformat-tables plugin.
+ </longdescription>
+ <longdescription lang="zh">
+ 为 mdformat 添加 GitHub Flavored Markdown 支持的插件,涵盖表格、任务
+ 列表项、删除线和自动链接。它注册两个插件,gfm 提供完整的 GFM 语法,
+ tables 仅提供表格渲染,并取代了原先的 mdformat-tables 插件。
+ </longdescription>
+ <origin>baldeagleos-repo</origin>
+</pkgmetadata>
diff --git a/dev-python/mdformat/Manifest b/dev-python/mdformat/Manifest
new file mode 100644
index 000000000000..6473ee78f91d
--- /dev/null
+++ b/dev-python/mdformat/Manifest
@@ -0,0 +1 @@
+DIST mdformat-1.0.0.gh.tar.gz 118368 BLAKE2B f98c96e8b37f0079b44b3861ef517c8e0c66523a23130157e2f383542b652561306ac7d4e988750583a2ee96f9fd76581a9b5e9cbe5eacec2093ad0f596224bc SHA512 5aa75c71520016046be93745146cb8cc031d3658208616d160f11ad9bfbc64ac0edc9451148e94df7ba3b92c195d331d8ed3a915062d0c1d134c609e2d2f6a24
diff --git a/dev-python/mdformat/mdformat-1.0.0.ebuild b/dev-python/mdformat/mdformat-1.0.0.ebuild
new file mode 100644
index 000000000000..f5daafc58f37
--- /dev/null
+++ b/dev-python/mdformat/mdformat-1.0.0.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+DISTUTILS_USE_PEP517=setuptools
+inherit distutils-r1
+
+DESCRIPTION="CommonMark compliant Markdown formatter"
+HOMEPAGE="
+ https://github.com/hukkin/mdformat
+ https://pypi.org/project/mdformat/
+"
+SRC_URI="
+ https://github.com/hukkin/${PN}/archive/${PV}.tar.gz
+ -> ${P}.gh.tar.gz
+"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+
+RDEPEND="
+ >=dev-python/markdown-it-py-1[${PYTHON_USEDEP}]
+ <dev-python/markdown-it-py-5[${PYTHON_USEDEP}]
+"
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
+
+python_test() {
+ # read_toml_opts() caches per directory, recycled tmp dirs poison the cache
+ epytest -o tmp_path_retention_count=3 -o tmp_path_retention_policy=all
+}
diff --git a/dev-python/mdformat/metadata.xml b/dev-python/mdformat/metadata.xml
new file mode 100644
index 000000000000..05fc7f9d4a08
--- /dev/null
+++ b/dev-python/mdformat/metadata.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://docs.baldeagleos.com/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>vowstar@gmail.com</email>
+ <name>Huang Rui</name>
+ </maintainer>
+ <longdescription lang="en">
+ Mdformat is an opinionated Markdown formatter that can be used to
+ enforce a consistent style in Markdown files. It is a CommonMark
+ compliant formatter, and its plugin system extends the syntax it
+ understands, for example to GitHub Flavored Markdown tables.
+ </longdescription>
+ <longdescription lang="zh">
+ Mdformat 是一个风格固定的 Markdown 格式化工具,用于在 Markdown 文件中
+ 强制统一的排版风格。它完全符合 CommonMark 规范,并通过插件系统扩展所
+ 支持的语法,例如 GitHub Flavored Markdown 表格。
+ </longdescription>
+ <origin>baldeagleos-repo</origin>
+</pkgmetadata>
diff --git a/dev-python/parver/Manifest b/dev-python/parver/Manifest
index 85ed613d5feb..6275c9fc257c 100644
--- a/dev-python/parver/Manifest
+++ b/dev-python/parver/Manifest
@@ -1 +1,3 @@
+DIST parver-1.0.1.post0.tar.gz 105980 BLAKE2B 318eb4d6d2d7b09d650995111dc099834948291e8e6f99d675a0a3d1b6a7e241fa5e731b092eaa64d69a78e135fc85733c69e926a201a63cfee6a99df66c6821 SHA512 be62768239893cbce5d510d9e3f830490cdc697afd44fe896ba2f22336845b49b6562423fb1e1fecd15554038292af7ece9a57392d6a9128d81979e4f622d6f6
+DIST parver-1.0.1.post0.tar.gz.provenance 9880 BLAKE2B 13db08e3facaae3cd07bc4fe4084619d2846ef26ff3f356f75481f6e272c946114a59a612ce1ec2e147ea71a9bf2df5ccd6ee720f2e77ea43f5abe34c586f882 SHA512 c2d13b8e4d4da60d834cae5eda3598267577106c5f4e24887d5fa10e8a99c1d830f1bfff496cebdeb0c3d8af2c360c78f4f1b2f08a7a2884ff1199a4fd31eab2
DIST parver-1.0.gh.tar.gz 105724 BLAKE2B 8fd53a7dbd0e2c906226cb96429b0642a2418cca0589fcd0ccd03491d7dbdfee5b82b64aa51b692a35037742932882d3dccd884308fe5599edb968f3633e86da SHA512 6d25f54f9c55c96d6bece378fa1d0e16abdbf6a1819512331469ad6339e34c8bd00a2cca9a39df2e3d496fd5727de69da9977d64172663efb3dccce79e186648
diff --git a/dev-python/parver/parver-1.0.1_p0.ebuild b/dev-python/parver/parver-1.0.1_p0.ebuild
new file mode 100644
index 000000000000..aca16f9d7538
--- /dev/null
+++ b/dev-python/parver/parver-1.0.1_p0.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2019-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=hatchling
+PYPI_VERIFY_REPO=https://github.com/RazerM/parver
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="Parse and manipulate version numbers"
+HOMEPAGE="
+ https://github.com/RazerM/parver/
+ https://pypi.org/project/parver/
+"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~riscv ~x86"
+
+BDEPEND="
+ test? (
+ dev-python/pretend[${PYTHON_USEDEP}]
+ )
+"
+
+EPYTEST_PLUGINS=( hypothesis )
+distutils_enable_tests pytest
+
+python_test() {
+ epytest -o addopts=
+}
diff --git a/dev-python/plum/plum-0.8.7.ebuild b/dev-python/plum/plum-0.8.7.ebuild
index 70041224a9e2..d58c72d05b50 100644
--- a/dev-python/plum/plum-0.8.7.ebuild
+++ b/dev-python/plum/plum-0.8.7.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2025 Gentoo Authors
+# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
diff --git a/dev-python/rectangle-packer/rectangle-packer-2.0.2.ebuild b/dev-python/rectangle-packer/rectangle-packer-2.0.2.ebuild
index 3a6136a92c32..ff8fee6735c0 100644
--- a/dev-python/rectangle-packer/rectangle-packer-2.0.2.ebuild
+++ b/dev-python/rectangle-packer/rectangle-packer-2.0.2.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2024 Gentoo Authors
+# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
diff --git a/dev-python/redis/Manifest b/dev-python/redis/Manifest
index a76ee40c1013..5ca32455cf27 100644
--- a/dev-python/redis/Manifest
+++ b/dev-python/redis/Manifest
@@ -1,2 +1,3 @@
DIST redis-py-7.4.1.gh.tar.gz 5201318 BLAKE2B 77fe9d5680cf0a9a70822d018c8af19c7b0222b4efd32fa0b5d5bc9a95eb9a0239cecb269940dacf41cc3bc86af1b1eec7fec4f338d9a6b0fdf87e1473f8c39b SHA512 ddce69580ee42c2622794f7bf94fb9170d2f3ac03041ac3ff0c5cc56b87d6f1876335e7304d7c22dac402bf7318f088e4a990bc2be818b54568959afcabc73bf
DIST redis-py-8.0.1.gh.tar.gz 5407455 BLAKE2B 13345dae770f997c334df82930f0e78e2448798e2564b4a921e36e0c10999eb23244e12ffaf4bc74783ee3514c4bba01534053b06eb62d73063ac6a606667ec4 SHA512 76dde110fe52a8bf7fb24f3619ee12ae0818bb045918f5d68cecfc5b19b9f9abc2b206428161b895abebf6a52fa81788d3802f8367b4b6b800e1f24c52009165
+DIST redis-py-8.1.0.gh.tar.gz 5577112 BLAKE2B 65ccd47cbae320bb13272e19b9d355f122137341188896633377c462127659771d520a4d83eb4f905584cbe16e549c58dbc0a3ac1610249f961eb6f837f7d136 SHA512 d95349362e4ddfa18b2ea9c25c7a7614750dce20d27eb449a7048bd7f9fa7189d465d2bda32bcbe0143cd47be4a92aa11cfa68c3d8b73f0bbd7bbfbd3383a7e5
diff --git a/dev-python/redis/redis-8.1.0.ebuild b/dev-python/redis/redis-8.1.0.ebuild
new file mode 100644
index 000000000000..bb3b3e921d62
--- /dev/null
+++ b/dev-python/redis/redis-8.1.0.ebuild
@@ -0,0 +1,126 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=hatchling
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1
+
+MY_P=redis-py-${PV/_beta/b}
+DESCRIPTION="Python client for Redis key-value store"
+HOMEPAGE="
+ https://github.com/redis/redis-py/
+ https://pypi.org/project/redis/
+"
+SRC_URI="
+ https://github.com/redis/redis-py/archive/v${PV/_beta/b}.tar.gz
+ -> ${MY_P}.gh.tar.gz
+"
+S=${WORKDIR}/${MY_P}
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~sparc ~x86"
+
+BDEPEND="
+ test? (
+ dev-db/redis
+ dev-python/numpy[${PYTHON_USEDEP}]
+ dev-python/xxhash[${PYTHON_USEDEP}]
+ )
+"
+
+EPYTEST_PLUGINS=( pytest-{asyncio,forked,timeout} )
+distutils_enable_tests pytest
+
+python_test() {
+ local EPYTEST_DESELECT=(
+ # Flaky test
+ tests/test_pubsub.py::TestPubSubDeadlock::test_pubsub_deadlock
+ tests/test_background.py::TestBackgroundScheduler::test_run_recurring
+ # require extra redis modules that apparently aren't packaged
+ # on Gentoo
+ tests/{,test_asyncio/}test_bloom.py
+ tests/{,test_asyncio/}test_graph.py
+ tests/{,test_asyncio/}test_json.py
+ tests/{,test_asyncio/}test_timeseries.py
+ # apparently available only in "Redis Stack 7.2 RC3 or later"
+ tests/test_commands.py::TestRedisCommands::test_tfunction_load_delete
+ tests/test_commands.py::TestRedisCommands::test_tfunction_list
+ tests/test_commands.py::TestRedisCommands::test_tfcall
+ # TODO
+ tests/test_commands.py::TestRedisCommands::test_lolwut
+ tests/test_commands.py::TestRedisCommands::test_module
+ tests/test_commands.py::TestRedisCommands::test_module_loadex
+ tests/test_commands.py::TestRedisCommands::test_zrank_withscore
+ tests/test_commands.py::TestRedisCommands::test_zrevrank_withscore
+ tests/test_commands.py::TestRedisCommands::test_xinfo_consumers
+ tests/test_asyncio/test_commands.py::TestRedisCommands::test_zrank_withscore
+ tests/test_asyncio/test_commands.py::TestRedisCommands::test_zrevrank_withscore
+ tests/test_asyncio/test_commands.py::TestRedisCommands::test_xinfo_consumers
+ tests/test_asyncio/test_pubsub.py::TestPubSubAutoReconnect::test_reconnect_socket_error[pool-hiredis-listen]
+ # requires sentinel?
+ tests/{,test_asyncio/}test_sentinel.py
+ # require REDIS_ENDPOINTS_CONFIG_PATH, except there's zero documentation
+ # or examples of what this is
+ tests/test_scenario/test_hitless_upgrade.py::TestPushNotifications
+ tests/test_scenario/test_maint_notifications.py::TestPushNotifications
+ # requires opentelemetry (with some unpackaged stuff)
+ tests/test_observability/test_provider.py::TestOTelProviderManagerGetMeterProvider
+ tests/test_asyncio/test_observability/test_recorder.py::TestObservableGaugeIntegration
+ # not marked properly
+ tests/test_cache.py::TestSSLCache
+ tests/test_cache.py::TestSentinelCache
+ )
+ local EPYTEST_IGNORE=(
+ # fails over missing certs, we don't do cluster anyway
+ tests/test_asyncio/test_cluster.py
+ # require redis_entraid
+ tests/test_asyncio/test_credentials.py
+ tests/test_credentials.py
+ # pybreaker
+ tests/test_asyncio/test_multidb
+ tests/test_asyncio/test_scenario
+ tests/test_multidb
+ tests/test_scenario
+ # cluster, not marked properly
+ tests/maint_notifications/test_cluster_maint_notifications_handling.py
+ tests/maint_notifications/test_async_cluster_maint_notifications_handling.py
+ # opentelemetry
+ tests/test_observability/test_recorder.py
+ )
+
+ # TODO: try to run more servers?
+ epytest -m "not redismod and not onlycluster and not replica and not ssl and not multidb_integration"
+}
+
+src_test() {
+ local redis_pid="${T}"/redis.pid
+ local redis_port=6379
+
+ if has_version ">=dev-db/redis-7"; then
+ local extra_conf="
+ enable-debug-command yes
+ enable-module-command yes
+ "
+ fi
+
+ # Spawn Redis itself for testing purposes
+ einfo "Spawning Redis"
+ einfo "NOTE: Port ${redis_port} must be free"
+ "${EPREFIX}"/usr/sbin/redis-server - <<- EOF || die "Unable to start redis server"
+ daemonize yes
+ pidfile ${redis_pid}
+ port ${redis_port}
+ bind 127.0.0.1 ::1
+ ${extra_conf}
+ EOF
+
+ # Run the tests
+ distutils-r1_src_test
+
+ # Clean up afterwards
+ kill "$(<"${redis_pid}")" || die
+}
diff --git a/dev-python/shtab/Manifest b/dev-python/shtab/Manifest
index 5f783f485311..383e6a4c3e34 100644
--- a/dev-python/shtab/Manifest
+++ b/dev-python/shtab/Manifest
@@ -2,3 +2,5 @@ DIST shtab-1.8.0.tar.gz 46062 BLAKE2B 513c1b12a7fe511c1515d146180bfe8f26bf724f76
DIST shtab-1.8.0.tar.gz.provenance 9212 BLAKE2B 6f2c759c9e4b0583d786043598c7c9f7678c5533dfa1e54d6286a076eaccd8112dfb0aaa4cd7620aef70bb603ae23005d49c2db3aaa8eff9911afc4159e78628 SHA512 f30c2838b11f548e8e11be363b0563c7475f48dcb47e846a5697872013efcae20112b46c8f9505248ca91823815baea42dd8100e30b955921743433329bbfcca
DIST shtab-1.8.1.tar.gz 46449 BLAKE2B eb71eff85121ccb37bcd4ac00e33aed89ed770c69386ec3c8fd6d17b8895a3b24b755880b58eb7ea6d02dc77b19e740ca44870919c384c2b630f39062f529a47 SHA512 d8a1dc61a12272c72c06c719806400f182fddc7b8e75e62a77c85e1f773e6e37a5138e3e166187fdab06a94e2f9676a1da6d3f66f86e6c778bf4055d222461ab
DIST shtab-1.8.1.tar.gz.provenance 9531 BLAKE2B 1a422235d4a1387c139e01d50079b9456939242628e097f291053a939d18bdb2aeb6a33358630ebe212b8d6873e73417f0fa3ab093244825807eeb3ae5a9f0d9 SHA512 e85a719310143fec6df4f87aaa312009f39c24b98185f812b66ec2a5a3776943f00ac49501709bd742ba95b524edcc05c3fbad44f7f25092038cf4e0a2571635
+DIST shtab-1.8.2.tar.gz 46701 BLAKE2B 6b943b26f29984d3d736ab43ece3e8fff4ba513edbaab282b8485db219451d77cfab5d08172cde7949dd5229289c3424f356011741265ff0616a9b3eb3a8e906 SHA512 9b4e88e648daa6c5709ad83b9781d787752d8eeb71dfe6bc6392fd530211f36d710ffb96aaa67730a4f29ff48d2b7c8e7195e9fb8169a20fccad1fc1ec608081
+DIST shtab-1.8.2.tar.gz.provenance 9249 BLAKE2B e4d849b6172ccd282c744263b58063ee87298f096d6612eb0e2a0cd0c716e01493d38a540316103bffd221ec29852b3df5afdaab46bfa64bcd1d3c86efdfea82 SHA512 c7bc34b4feba05ee44300a463bf6dca53bb5ca1f887cdc21bd2517476285d0129e3295be0603f3104d01034cd47a9a14d6e7b66c13dba8aff1893ae074749670
diff --git a/dev-python/shtab/shtab-1.8.2.ebuild b/dev-python/shtab/shtab-1.8.2.ebuild
new file mode 100644
index 000000000000..cbff23aac821
--- /dev/null
+++ b/dev-python/shtab/shtab-1.8.2.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2024-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYPI_VERIFY_REPO=https://github.com/tqdm/shtab
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="Automagic shell tab completion for Python CLI applications"
+HOMEPAGE="
+ https://github.com/tqdm/shtab/
+ https://pypi.org/project/shtab/
+"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+BDEPEND="
+ dev-python/setuptools-scm[${PYTHON_USEDEP}]
+"
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
diff --git a/dev-python/translate-toolkit/Manifest b/dev-python/translate-toolkit/Manifest
index 449aa1209ede..100f3c518316 100644
--- a/dev-python/translate-toolkit/Manifest
+++ b/dev-python/translate-toolkit/Manifest
@@ -1,5 +1,4 @@
-DIST translate-3.19.11.gh.tar.gz 1355618 BLAKE2B 65424bb83f67c04566611ebd426ad6dd233cebab252b09768cc5253c44d9291a543fe91a91e23ecbc8fdc5586fdb340fcb40f26028dcbf9973a8a20d7dd91f2c SHA512 776392694ff9802b74e90c5ac01d2f74da9069840c73b24ad6b7f6ffa4c912acd14a4ef8f390fd74acd48e01b0364ac69faf47027725c41775685b03032732a6
-DIST translate-3.19.12.gh.tar.gz 1363988 BLAKE2B 2a9b9ffc74de96d31fafef18c3576b56834844bfcd459bff0eb7eff01938bbf48ec9051ac97de4e5862bf5c6438d599c0055a50d0a8e661d816fc2d4f95729d4 SHA512 8ee6753d20d4a5bb460a23c7538c2d90be98023d61661b6e036d88d6003f18d4b51ec4673f3ce562b5ecba903a63e0dfa16205548477366c796f9714a541a2b7
DIST translate-3.19.13.gh.tar.gz 1365289 BLAKE2B 533cbe8be6e5585157bf63518b9f53f359626c04e1c495d8dc713c3ed00ac43fc5591a2db8c6686776ad440c8711d8e5544003abf11fe9bb457df5ea5a3364d0 SHA512 814ad39c2d49f3c96079039173949a09649ef671516f0c77ce749b0c3b7b8978d4217458e7e39f9c10f497f5bd013f80796fa098794cd59ee33c52466beed867
DIST translate-3.19.14.gh.tar.gz 1375782 BLAKE2B 37f1dfb46592e1f70b5f437ff016e529f4f4432747e7c592cfe065ecd286a6dd0ef30e4babca7007fd3eb536b86d2832d81b744aee4a009f6ca23ea88ddf4715 SHA512 27f71881a498054e367e77f1a19df46e2a58c37325f55e764b2022754b0ac11fc2b574874da473f30e0ffb586ee5f16d4b625e49dd843cae1a920b89a185a6a4
DIST translate-3.19.15.gh.tar.gz 1406521 BLAKE2B a47cd9202ef318b518a7c268fd3eb8b9f3aca526c4735d1c71d4dccf150da7793b6fd468cf473c25006a4f32fe3a8677b8544f7407a90a9c4f5e3a95a32efcaa SHA512 cdc353b7730eb18a177fdc32a0c0018d636be37cba4392eb6f28d74fcc33c8abf34caa8f54cb0e7351a9fcfddf0bb78ced065a2309995b82a24338766b9c917a
+DIST translate-3.19.16.gh.tar.gz 1414743 BLAKE2B 8bd639d9c47841a242a2f6c5b0b24d224d6aee2e5489b71a74cdf4eda29e85860cb865975604f39ef42d9362d39ee1c991e98350cb86b31a963af11751e6e6bf SHA512 2fe361987416cd454f8e2c68d8420396c3f9f673ef0c9322adeadadabcaa70463126f429d2852dd43f3895a25c9c6e99a521631c4c543547a77434fabdc18144
diff --git a/dev-python/translate-toolkit/translate-toolkit-3.19.11.ebuild b/dev-python/translate-toolkit/translate-toolkit-3.19.11.ebuild
deleted file mode 100644
index e3e3737485ca..000000000000
--- a/dev-python/translate-toolkit/translate-toolkit-3.19.11.ebuild
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 1999-2026 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-DISTUTILS_USE_PEP517=setuptools
-PYTHON_COMPAT=( python3_{13..14} )
-PYTHON_REQ_USE="sqlite"
-
-inherit distutils-r1
-
-MY_P=translate-${PV}
-DESCRIPTION="Toolkit to convert between many translation formats"
-HOMEPAGE="
- https://github.com/translate/translate/
- https://pypi.org/project/translate-toolkit/
-"
-SRC_URI="
- https://github.com/translate/translate/archive/${PV}.tar.gz
- -> ${MY_P}.gh.tar.gz
-"
-S="${WORKDIR}"/${MY_P}
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="amd64 arm64 ~x86"
-IUSE="+html +ical +ini +subtitles +yaml"
-
-RDEPEND="
- app-text/iso-codes
- >=dev-python/chardet-3.0.4[${PYTHON_USEDEP}]
- dev-python/cheroot[${PYTHON_USEDEP}]
- >=dev-python/levenshtein-0.12.0[${PYTHON_USEDEP}]
- >=dev-python/lxml-5.2.0[${PYTHON_USEDEP}]
- >=dev-python/mistletoe-1.1.0[${PYTHON_USEDEP}]
- >=dev-python/pyparsing-3[${PYTHON_USEDEP}]
- dev-python/ruamel-yaml[${PYTHON_USEDEP}]
- dev-python/tomlkit[${PYTHON_USEDEP}]
- >=dev-python/unicode-segmentation-rs-0.2.0[${PYTHON_USEDEP}]
- >=dev-python/wcwidth-0.2.14[${PYTHON_USEDEP}]
- sys-devel/gettext
- html? ( dev-python/utidylib[${PYTHON_USEDEP}] )
- ical? ( dev-python/vobject[${PYTHON_USEDEP}] )
- ini? ( >=dev-python/iniparse-0.5[${PYTHON_USEDEP}] )
- subtitles? ( media-video/gaupol[${PYTHON_USEDEP}] )
- yaml? ( dev-python/pyyaml[${PYTHON_USEDEP}] )
-"
-BDEPEND="
- test? (
- dev-python/phply[${PYTHON_USEDEP}]
- )
-"
-
-EPYTEST_PLUGINS=( syrupy )
-EPYTEST_XDIST=1
-distutils_enable_tests pytest
-
-src_prepare() {
- distutils-r1_src_prepare
-
- # strip unnecessary pins
- sed -i -e 's:,<[0-9.]*::' pyproject.toml || die
-}
-
-src_test() {
- # unfortunately, this bad quality package doesn't support XDG_DATA_DIRS
- # correctly, so we need to reassemble all data files in a single directory
- local -x XDG_DATA_HOME=${T}/share
- cp -r translate/share "${T}/" || die
- cp -r "${ESYSROOT}"/usr/share/gaupol "${XDG_DATA_HOME}"/ || die
-
- distutils-r1_src_test
-}
-
-python_test() {
- local EPYTEST_DESELECT=(
- # Fails with network-sandbox (and even with it off but w/ softer fail)
- 'tests/xliff_conformance/test_xliff_conformance.py::test_open_office_to_xliff'
- 'tests/xliff_conformance/test_xliff_conformance.py::test_po_to_xliff'
- )
- local EPYTEST_IGNORE=(
- # unpackaged fluent.*
- tests/translate/storage/test_fluent.py
- tests/translate/convert/test_fluent2po.py
- # changes directory and does not change it back, sigh
- tests/odf_xliff/test_odf_xliff.py
- )
-
- if ! has_version "dev-python/iniparse[${PYTHON_USEDEP}]"; then
- EPYTEST_IGNORE+=(
- translate/convert/test_ini2po.py
- translate/convert/test_po2ini.py
- )
- fi
-
- if ! has_version "media-video/gaupol[${PYTHON_USEDEP}]"; then
- EPYTEST_IGNORE+=(
- translate/storage/test_subtitles.py
- )
- fi
-
- epytest
-}
-
-python_install_all() {
- distutils-r1_python_install_all
-
- insinto /usr
- doins -r translate/share
-
- if ! use html; then
- rm "${ED}"/usr/bin/{html2po,po2html} || die
- fi
- if ! use ical; then
- rm "${ED}"/usr/bin/{ical2po,po2ical} || die
- fi
- if ! use ini; then
- rm "${ED}"/usr/bin/{ini2po,po2ini} || die
- fi
- if ! use subtitles; then
- rm "${ED}"/usr/bin/{sub2po,po2sub} || die
- fi
-}
diff --git a/dev-python/translate-toolkit/translate-toolkit-3.19.12.ebuild b/dev-python/translate-toolkit/translate-toolkit-3.19.16.ebuild
index 87c171eea069..87c171eea069 100644
--- a/dev-python/translate-toolkit/translate-toolkit-3.19.12.ebuild
+++ b/dev-python/translate-toolkit/translate-toolkit-3.19.16.ebuild
diff --git a/dev-python/virtualenv/Manifest b/dev-python/virtualenv/Manifest
index 54eddf39cddd..aef398702125 100644
--- a/dev-python/virtualenv/Manifest
+++ b/dev-python/virtualenv/Manifest
@@ -6,3 +6,5 @@ DIST virtualenv-21.6.1.tar.gz 5526620 BLAKE2B a970f52b9a8ef5948ac0f2827ce9d2b724
DIST virtualenv-21.6.1.tar.gz.provenance 9508 BLAKE2B fa5122071df6df6435ad11f102bed2f85d5ebbaf8ab6056c2f2c66c1d3e8366692dadda375f2c39151abc413ec540169197730101ba3061dccec0cf2f7bd2668 SHA512 f5180591d1f4cca9bb5632ea2918437daf30c1deb91fac7676a783e5ee19ea424a6bac7fd3a8c6eddff7996ef6c1a4358746d92788cbd283a8abb579d745935e
DIST virtualenv-21.7.0.tar.gz 5527510 BLAKE2B 915d3d3fb3c221fa5a245f7856ec3fa398a70ffb37af246992648d2ed1e6cefcd0aeea4ac64fab2273220cc692020b39512f41d3fc348524dca500f9788a006b SHA512 f6ccbf966e5296129ac82ec52f56900d417bd96ca5cd222493a2c67d6bd33459a8cf7e445c82d04da7e7239e6e46b670643e180153445315fd8ef7e062a9eb1b
DIST virtualenv-21.7.0.tar.gz.provenance 9669 BLAKE2B 12e8b7ad4728e5a1c0563a41829b28d9baacac63b4258ff0a2b54f465b38bad1c3ff1e8605634261a286a15b78b937e91a8d344c09b5daf304972fdbdd0e0013 SHA512 65d295d5c9207d439a12f39aa458572e9b6388a2685ec309d2350922a9dba67cc288b8f3bfb7b91da4e3dff9e628884f1a1d32c1b666965de23871a0456b0346
+DIST virtualenv-21.7.1.tar.gz 5525237 BLAKE2B f3c8c19804d37ed22a5e114b5cede8bb9c7232310d3cfc12d15437e5bce8495043938a0eaf1fdacee4d3030dde71aa78a5e82ce4fb8b6bab78436b823eb85de2 SHA512 6faa5e3441dcbdd4f540107e84a903d392863b7ad050e5d6f3042d039cf597029be5541be062d7b6c421b1ea6d8a907b866bb6745e05ff5a2f9142f1c0c3f333
+DIST virtualenv-21.7.1.tar.gz.provenance 9508 BLAKE2B 97e69664764c1151a7d4b2d9d3e6b4ad5d053ac297dcea5d5c1238c0a3692867dc4e36bb394dd5ddfe513fbbf11b7218c2e5956513a3ecef43cf1f74b2dbdfb8 SHA512 26de17a71d01421028d38c0074b7564c8c01a20226a3e43eb1e6e990e0d2af0311e789428567ad939544967a61f49cd9ec05490b99c130b14968fdcfa2b34a55
diff --git a/dev-python/virtualenv/virtualenv-21.7.1.ebuild b/dev-python/virtualenv/virtualenv-21.7.1.ebuild
new file mode 100644
index 000000000000..0abb2e161fb7
--- /dev/null
+++ b/dev-python/virtualenv/virtualenv-21.7.1.ebuild
@@ -0,0 +1,117 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=hatchling
+PYPI_VERIFY_REPO=https://github.com/pypa/virtualenv
+PYTHON_TESTED=( python3_{13..14} )
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="Virtual Python Environment builder"
+HOMEPAGE="
+ https://virtualenv.pypa.io/en/stable/
+ https://pypi.org/project/virtualenv/
+ https://github.com/pypa/virtualenv/
+"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
+IUSE="test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+ >=dev-python/distlib-0.3.7[${PYTHON_USEDEP}]
+ >=dev-python/filelock-3.24.2[${PYTHON_USEDEP}]
+ >=dev-python/platformdirs-3.9.1[${PYTHON_USEDEP}]
+ >=dev-python/python-discovery-1.4.2[${PYTHON_USEDEP}]
+
+ dev-python/ensurepip-pip
+ >=dev-python/ensurepip-setuptools-70.1
+ dev-python/ensurepip-wheel
+"
+# coverage is used somehow magically in virtualenv, maybe it actually
+# tests something useful
+BDEPEND="
+ dev-python/hatch-vcs[${PYTHON_USEDEP}]
+ test? (
+ ${RDEPEND}
+ $(python_gen_cond_dep '
+ dev-python/coverage[${PYTHON_USEDEP}]
+ >=dev-python/pip-22.2.1[${PYTHON_USEDEP}]
+ >=dev-python/pytest-mock-3.6.1[${PYTHON_USEDEP}]
+ dev-python/pytest-rerunfailures[${PYTHON_USEDEP}]
+ dev-python/pytest-timeout[${PYTHON_USEDEP}]
+ dev-python/pytest-xdist[${PYTHON_USEDEP}]
+ >=dev-python/setuptools-67.8[${PYTHON_USEDEP}]
+ dev-python/time-machine[${PYTHON_USEDEP}]
+ dev-python/wheel[${PYTHON_USEDEP}]
+ >=dev-python/packaging-20.0[${PYTHON_USEDEP}]
+ ' "${PYTHON_TESTED[@]}")
+ )
+"
+
+src_prepare() {
+ local PATCHES=(
+ # use wheels from ensurepip bundle
+ "${FILESDIR}/${PN}-21.5.1-ensurepip.patch"
+ )
+
+ distutils-r1_src_prepare
+
+ # workaround test failures due to warnings from setuptools-scm, sigh
+ echo '[tool.setuptools_scm]' >> pyproject.toml || die
+
+ # remove useless pins
+ sed -i -e 's:,<[=0-9.]*::' pyproject.toml || die
+
+ # remove bundled wheels
+ rm src/virtualenv/seed/wheels/embed/*.whl || die
+}
+
+python_test() {
+ if ! has "${EPYTHON}" "${PYTHON_TESTED[@]/_/.}"; then
+ einfo "Skipping testing on ${EPYTHON}"
+ return
+ fi
+
+ local EPYTEST_DESELECT=(
+ tests/unit/seed/embed/test_bootstrap_link_via_app_data.py::test_seed_link_via_app_data
+ # tests for old wheels with py3.7 support
+ tests/unit/seed/embed/test_pip_invoke.py::test_base_bootstrap_via_pip_invoke
+ tests/unit/seed/wheels/test_wheels_util.py::test_wheel_not_support
+ # broken by different wheel versions in ensurepip
+ tests/unit/seed/wheels/test_acquire_find_wheel.py::test_find_latest_string
+ tests/unit/seed/wheels/test_acquire_find_wheel.py::test_find_exact
+ tests/unit/seed/wheels/test_acquire_find_wheel.py::test_find_latest_none
+ tests/unit/seed/wheels/test_acquire.py::test_download_wheel_bad_output
+ tests/unit/seed/wheels/test_wheels_util.py::test_embed_wheel_below_oldest_supported_is_missing
+ # hangs on a busy system, sigh
+ tests/unit/test_util.py::test_reentrant_file_lock_is_thread_safe
+ # TODO
+ tests/unit/create/via_global_ref/test_build_c_ext.py::test_can_build_c_extensions
+ # random resource leaks or xdist
+ tests/unit/test_file_limit.py::test_too_many_open_files
+ # Internet
+ tests/unit/create/test_creator.py::test_create_distutils_cfg
+ # we do not use bundled wheels
+ tests/unit/seed/wheels/test_bundle.py::test_every_wheel_on_disk_has_sha256
+ )
+
+ local -x TZ=UTC
+ local EPYTEST_PLUGINS=( pytest-{mock,rerunfailures} time-machine )
+ local EPYTEST_RERUNS=5
+ local EPYTEST_TIMEOUT=180
+ local EPYTEST_XDIST=1
+ epytest -o addopts=
+}
+
+src_install() {
+ distutils-r1_src_install
+
+ # remove bundled wheels, we're using ensurepip bundle instead
+ find "${ED}" -name '*.whl' -delete || die
+}
diff --git a/dev-python/xmlsec/files/xmlsec-1.3.17-fix-against-xmlsec-1.3.11.patch b/dev-python/xmlsec/files/xmlsec-1.3.17-fix-against-xmlsec-1.3.11.patch
new file mode 100644
index 000000000000..5ecb22b6ace8
--- /dev/null
+++ b/dev-python/xmlsec/files/xmlsec-1.3.17-fix-against-xmlsec-1.3.11.patch
@@ -0,0 +1,108 @@
+https://github.com/lsh123/xmlsec/issues/1148
+https://github.com/xmlsec/python-xmlsec/pull/422
+https://github.com/xmlsec/python-xmlsec/commit/5e8b4e6aa133c358b8aaf8e17ceb5b3b7fea78e8
+
+From 5e8b4e6aa133c358b8aaf8e17ceb5b3b7fea78e8 Mon Sep 17 00:00:00 2001
+From: Amin Solhizadeh <amin.solhizadeh@gmail.com>
+Date: Tue, 28 Apr 2026 09:19:53 +0200
+Subject: [PATCH] Bump xmlsec1 unix lib to 1.3.11 (#422)
+
+xmlsec1 1.3.11 may call OPENSSL_cleanup() from the OpenSSL
+backend during shutdown. OpenSSL cannot be reinitialized in the
+same process after that cleanup runs.
+
+Update the lifecycle test to call init() before shutdown(), run it
+last, and stop testing shutdown/init reinitialization. Document the
+new lifecycle constraint in the module docs and runtime docstrings.
+
+See https://github.com/lsh123/xmlsec/issues/1148 for details.
+--- a/doc/source/modules/xmlsec.rst
++++ b/doc/source/modules/xmlsec.rst
+@@ -1,6 +1,17 @@
+ ``xmlsec``
+ ----------
+
++Lifecycle
++~~~~~~~~~
++
++The module initializes the underlying xmlsec library on import. Applications
++that call :func:`xmlsec.shutdown` should treat it as process-final and should
++not call :func:`xmlsec.init` afterwards.
++
++This is required because upstream xmlsec1 versions starting with 1.3.11 may
++call ``OPENSSL_cleanup()`` during shutdown when using the OpenSSL backend.
++OpenSSL cannot be reinitialized in the same process after that cleanup has run.
++
+ .. automodule:: xmlsec
+ :members:
+ :undoc-members:
+--- a/src/main.c
++++ b/src/main.c
+@@ -101,8 +101,11 @@ static int PyXmlSec_Init(void) {
+ static char PyXmlSec_PyInit__doc__[] = \
+ "init() -> None\n"
+ "Initializes the library for general operation.\n\n"
+- "This is called upon library import and does not need to be called\n"
+- "again :func:`~.shutdown` is called explicitly).\n";
++ "This is called upon library import and normally does not need to be\n"
++ "called explicitly. It is only valid before shutdown() has been called.\n\n"
++ "Calling init() after shutdown() is unsupported because upstream\n"
++ "xmlsec1 1.3.11+ may call OPENSSL_cleanup() during shutdown, and OpenSSL\n"
++ "cannot be reinitialized in the same process after that cleanup.\n";
+ static PyObject* PyXmlSec_PyInit(PyObject *self) {
+ if (PyXmlSec_Init() < 0) {
+ return NULL;
+@@ -114,7 +117,11 @@ static char PyXmlSec_PyShutdown__doc__[] = \
+ "shutdown() -> None\n"
+ "Shutdowns the library and cleanup any leftover resources.\n\n"
+ "This is called automatically upon interpreter termination and\n"
+- "should not need to be called explicitly.";
++ "should not need to be called explicitly.\n\n"
++ "Shutdown is process-final. Do not call init() after shutdown(),\n"
++ "because upstream xmlsec1 1.3.11+ may call OPENSSL_cleanup() during shutdown,\n"
++ "and OpenSSL cannot be reinitialized in the same process after that\n"
++ "cleanup.";
+ static PyObject* PyXmlSec_PyShutdown(PyObject* self) {
+ PyXmlSec_Free(free_mode);
+ Py_RETURN_NONE;
+--- a/tests/conftest.py
++++ b/tests/conftest.py
+@@ -1,10 +1,11 @@
+ def pytest_collection_modifyitems(items):
+- """Put the module init test first.
++ """Put the module shutdown test last.
+
+- This way, we implicitly check whether any subsequent test fails because of module reinitialization.
++ xmlsec shutdown is process-final with OpenSSL cleanup introduced in
++ xmlsec1 1.3.11, so no tests should use xmlsec after it runs.
+ """
+
+- def module_init_tests_first(item):
+- return int('test_xmlsec.py::TestModule::test_reinitialize_module' not in item.nodeid)
++ def module_init_shutdown_tests_last(item):
++ return int('test_xmlsec.py::TestModule::test_init_shutdown_module' in item.nodeid)
+
+- items.sort(key=module_init_tests_first)
++ items.sort(key=module_init_shutdown_tests_last)
+--- a/tests/test_xmlsec.py
++++ b/tests/test_xmlsec.py
+@@ -3,11 +3,14 @@
+
+
+ class TestModule(base.TestMemoryLeaks):
+- def test_reinitialize_module(self):
+- """This test doesn't explicitly verify anything, but will be invoked first in the suite.
++ iterations = 0
+
+- So if the subsequent tests don't fail, we know that the ``init()``/``shutdown()``
+- function pair doesn't break anything.
++ def test_init_shutdown_module(self):
++ """Check explicit initialization before final module shutdown.
++
++ This test is invoked last because shutdown is process-final: since
++ xmlsec1 1.3.11, its OpenSSL backend may call OPENSSL_cleanup(), after
++ which OpenSSL cannot be reinitialized in the same process.
+ """
+- xmlsec.shutdown()
+ xmlsec.init()
++ xmlsec.shutdown()
diff --git a/dev-python/xmlsec/xmlsec-1.3.17-r1.ebuild b/dev-python/xmlsec/xmlsec-1.3.17-r1.ebuild
new file mode 100644
index 000000000000..c1b12cec07ac
--- /dev/null
+++ b/dev-python/xmlsec/xmlsec-1.3.17-r1.ebuild
@@ -0,0 +1,64 @@
+# Copyright 2021-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_EXT=1
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit distutils-r1
+
+MY_P=python-xmlsec-${PV}
+DESCRIPTION="Python bindings for the XML Security Library"
+HOMEPAGE="
+ https://github.com/xmlsec/python-xmlsec/
+ https://pypi.org/project/xmlsec/
+"
+SRC_URI="
+ https://github.com/xmlsec/python-xmlsec/archive/${PV}.tar.gz
+ -> ${MY_P}.gh.tar.gz
+"
+S=${WORKDIR}/${MY_P}
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~x86"
+
+DEPEND="
+ dev-libs/libxml2:=
+ dev-libs/xmlsec:=[openssl]
+"
+RDEPEND="
+ ${DEPEND}
+ dev-python/lxml[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ dev-python/lxml[${PYTHON_USEDEP}]
+ dev-python/pkgconfig[${PYTHON_USEDEP}]
+ dev-python/setuptools-scm[${PYTHON_USEDEP}]
+ dev-python/wheel[${PYTHON_USEDEP}]
+"
+
+EPYTEST_DESELECT=(
+ # Fragile based on black version?
+ tests/test_type_stubs.py::test_xmlsec_constants_stub
+)
+
+EPYTEST_PLUGINS=()
+distutils_enable_tests pytest
+
+PATCHES=(
+ "${FILESDIR}"/xmlsec-1.3.17-fix-against-xmlsec-1.3.11.patch
+)
+
+src_configure() {
+ export SETUPTOOLS_SCM_PRETEND_VERSION=${PV}
+
+ export PYXMLSEC_OPTIMIZE_SIZE=
+ if use debug; then
+ # we don't want to use PYXMLSEC_ENABLE_DEBUG envvar,
+ # as it forces -O0
+ export CPPFLAGS="${CPPFLAGS} -DPYXMLSEC_ENABLE_DEBUG=1"
+ fi
+}