From c3e9af3901de9a5924fb2135abac11e15ec3a666 Mon Sep 17 00:00:00 2001
From: Arcadiy Ivanov
Date: Mon, 24 Aug 2026 18:14:42 -0400
Subject: [PATCH 1/2] Document Python 3.15 support and 0.13.21 vendorized
upgrades
Adds the 0.13.21 release notes covering Python 3.15 support, the PEP 451
loader fix, the `packaging` 26.3 `Requirement.__slots__` fix, the removal of
pre-3.10 compatibility workarounds and the vendorized dependency bumps.
Bumps the supported version range on the front page to 3.10 through 3.15.
---
articles/_release-notes/v0.13.x.md | 28 ++++++++++++++++++++++++++++
index.html | 4 ++--
2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/articles/_release-notes/v0.13.x.md b/articles/_release-notes/v0.13.x.md
index 19158b9..dd8bc92 100644
--- a/articles/_release-notes/v0.13.x.md
+++ b/articles/_release-notes/v0.13.x.md
@@ -6,6 +6,34 @@ list_title: Versions 0.13.x
# Release Notes - Versions 0.13.x
+## Version 0.13.21
+
+### New Features
+* Python 3.15 support
+
+### Bugs Fixed
+* Vendored packages and `coverage` failed to import on Python 3.15, which
+ removed the legacy `load_module()` fallback from the import machinery. Both
+ of PyBuilder's meta path loaders now implement the PEP 451
+ `create_module()`/`exec_module()` protocol.
+* `packaging` 26.3 gave `Requirement` a `__slots__` layout, breaking the
+ `project_name` attribute PyBuilder attached to dependency requirements.
+ Requirement names are now read from `Requirement.name`.
+
+### Removed Features
+* Removed compatibility workarounds for Python versions below 3.10
+
+### Vendorized Dependency Upgrades
+* Bumped vendorized dependencies, notably:
+ * virtualenv 20.36.1 to 21.7.4, which splits interpreter discovery into a
+ separate `python-discovery` package and no longer depends on `click`
+ * importlib-metadata 8.7.1 to 9.0.0
+ * packaging 26.0 to 26.3
+ * importlib-resources 6.5.2 to 7.1.0
+ * rich 14.3.2 to 15.0.0
+ * wheel 0.46.3 to 0.48.0
+ * setuptools to 84.0.0
+
## Version 0.13.20
### New Features
diff --git a/index.html b/index.html
index b9c2d46..ad9639f 100644
--- a/index.html
+++ b/index.html
@@ -16,10 +16,10 @@
from other famous build tools like Apache Maven and Gradle.
- PyBuilder runs on Python 3.10 to 3.14 and PyPy.
+ PyBuilder runs on Python 3.10 to 3.15 and PyPy.
Every commit is tested via
GitHub Actions
- on CPython 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy on Linux, MacOS
+ on CPython 3.10, 3.11, 3.12, 3.13, 3.14, 3.15 and PyPy on Linux, MacOS
(with and without Homebrew) and Windows.
From f95bbcd04515359200151fea481e61905a119f14 Mon Sep 17 00:00:00 2001
From: Arcadiy Ivanov
Date: Mon, 24 Aug 2026 18:59:57 -0400
Subject: [PATCH 2/2] Ignore openhub.net and coveralls.io in the external link
check
Cloudflare-style bot protection now answers htmlproofer's requests to both
hosts with 403, failing every build regardless of the change under test.
Scoped to those two hosts via --ignore-urls rather than adding 403 to
--ignore-status-codes, so a genuinely forbidden link anywhere else still fails
the build. The patterns require a path separator after the host so that
lookalike domains are not silently skipped.
---
build.sh | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/build.sh b/build.sh
index 5c30881..ca8452d 100755
--- a/build.sh
+++ b/build.sh
@@ -2,8 +2,12 @@
bundle exec jekyll build
+# openhub.net and coveralls.io answer htmlproofer with 403 from bot protection.
+# Ignore those two hosts by URL rather than ignoring 403 globally, so a genuinely
+# forbidden link anywhere else still fails the build.
bundle exec htmlproofer --allow-hash-href \
--ignore-status-codes=429,999,302 \
+ --ignore-urls='/^https://www\.openhub\.net//,/^https://coveralls\.io//' \
--no-check-internal-hash \
--no-check-external-hash \
--no-enforce-https \