Skip to content

release: 4.3.0 - #105

Merged
liquidsec merged 29 commits into
stablefrom
dev
Oct 20, 2026
Merged

liquidsec merged 29 commits into
stablefrom
dev

Conversation

@liquidsec

Copy link
Copy Markdown
Contributor

Release 4.3.0. Merging this into stable publishes to PyPI and crates.io.

The version bump and the 3.15 wheel-matrix fix are in #104 (into dev), and they land here once that merges. Until then this PR still says 4.2.0, so merge #104 first.

What's in 4.3.0 (dev since 4.2.0)

Breaking-ish

Features and performance

CI

TheTechromancer and others added 28 commits December 9, 2025 17:06
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.1 to 0.15.6.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.14.1...0.15.6)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.6
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Org-wide standards now live once in blacklanternsecurity/.github. This
AGENTS.md states what the repo is, its toolchain and test commands,
links each standard with when to read it, and keeps only what is true
here and nowhere else. CLAUDE.md points at it instead of duplicating
it, so agent context stops paying for restated rules.

Refs blacklanternsecurity/bbot-enterprise#157
The table said Rust is pinned in rust-toolchain.toml, which does not
exist here, retyped a Python range narrower than requires-python
(>=3.9), and called a ruff floor pinned. Reference the manifests and
state that the toolchain is not yet pinned.
…ff-0.15.6

Bump ruff from 0.14.1 to 0.15.6
CI installs unpinned latest ruff and stable Rust, both of which added
new checks that fail on dev:

- ruff: sort imports/__slots__, collapse nested if in IPRadixTree,
  use != in the __eq__ test (SIM201)
- clippy for_kv_map: iterate values_mut() in BaseNode::clear
fix: get CI green (latest ruff + clippy lint fixes)
`radixtarget` is a Black Lantern original, so this is the copyright holder
relicensing its own work. The notices carry `either version 3 of the
License, or (at your option) any later version`, and GPLv3 section 13
already permits AGPLv3 interoperation, so making the AGPL grant explicit
needs no contributor sign-off.

The file is the same AGPL-3.0 text `bbot` carries.

The manifest moves in the same commit. A tree that ships an AGPL-3.0 file
next to a manifest naming something else is self-contradictory at the point
a packager reads it: `Cargo.toml`, `pyproject.toml`.

Refs #151
Bumps [maturin](https://github.com/pyo3/maturin) from 1.9.6 to 1.15.0.
- [Release notes](https://github.com/pyo3/maturin/releases)
- [Changelog](https://github.com/PyO3/maturin/blob/main/Changelog.md)
- [Commits](PyO3/maturin@v1.9.6...v1.15.0)

---
updated-dependencies:
- dependency-name: maturin
  dependency-version: 1.12.6
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Matches bbot. Without target-branch, the github-actions ecosystem
falls back to the default branch (stable).
docs: make AGENTS.md an index of the org standards
…-dev

ci: target dev for github-actions dependabot updates
Dependabot and fork PR runs get a read-only GITHUB_TOKEN, so posting the
results comment fails with 403 and the error handler's fallback comment
fails the same way, failing the job. Skip the comment for those runs
instead of granting write access; results remain in the job log and the
uploaded artifact.
docs: relicense from GPL-3.0 to AGPL-3.0
- Keep IPv4 and IPv6 in separate trees. The tree is keyed on address
  bits only, so a shared tree let 7ea4:c5d8:: match 126.164.197.216.
- Cap longest_match at the query's prefix length. Searching
  192.168.128.0/23 returned a stored /24 that doesn't contain it, which
  also made ACL mode skip a parent inserted after its child.
- ACL mode: remove networks covered by a newly inserted parent, walking
  only the subtree under it.
- defrag: find sibling pairs with an exact-match lookup instead of
  comparing every pair of networks (O(n) instead of O(n^2)).

Adds a differential test that runs random insert/get/delete/defrag
sequences against the original IpRadixTree, in normal and ACL mode.
…turin-1.12.6

Bump maturin from 1.9.6 to 1.15.0
The bucket allocator managed raw memory with ptr::copy/read/write and
Vec::from_raw_parts, so a bookkeeping bug in the tree would corrupt
memory instead of panicking. Back BucketVec with a Vec<T> and do every
access through a bounds-checked slice of one bucket, restricting stored
types to Copy + Default (only Node and IpNet are stored). With only
Copy types, TreeBitmap no longer needs its unsafe Drop impl.

forbid(unsafe_code) on the module keeps it that way. Benchmark cost is
within noise for IPv4 and ~10% on IPv6 insert.
Drop the ip_network_table comparison. The benchmark now measures only
RadixTarget, and CI runs it twice: once against the PR and once against
the target branch, then posts a table of the change per benchmark.

- The PR's harness is built against both sides, so measurements stay
  identical even when a PR changes the harness. If it can't build
  against the target branch (e.g. a public API change), the report
  shows the PR's numbers alone.
- Data is generated from a fixed seed so both sides get identical
  inputs, and each benchmark reports the median of 5 runs.
- Insert timing no longer includes freeing the finished tree.
- Skip the PR comment on fork and dependabot PRs, whose token is
  read-only (same change as #101).
…t-perms

ci(benchmark): skip PR comment on dependabot and fork PRs
pyo3 0.27 refuses to build for Python 3.15 ("the configured Python
version (3.15) is newer than PyO3's maximum supported version (3.14)").
With no 3.15 wheel on PyPI, installs on 3.15 build from source and
fail, which blocks bbot's Python 3.15 support (bbot#3474).

- pyo3 0.27 -> 0.30, no code changes needed
- cargo update for all other semver-compatible crates
- uv lock --upgrade for dev tools (pytest 9.1, ruff 0.17, pytest-cov 7.1)
- add 3.15 to the CI test matrix and classifiers

rand stays on 0.8: the 0.10 API rename would conflict with #64's tests.
ci(benchmark): compare PR against its target branch
3.9 is end-of-life and 3.10 reaches end-of-life this month; bbot is
dropping 3.10 as well (bbot#3474). requires-python is now >=3.11, and
3.9/3.10 are removed from the CI matrix, classifiers and README badge.
build(deps): bump pyo3 to 0.30 for Python 3.15, drop 3.9 and 3.10
Bump the version to 4.3.0 in Cargo.toml, pyproject.toml and lockfiles.

The Windows and macOS wheel jobs installed only `3.x` and relied on
maturin --find-interpreter finding other versions on the runner, so
4.2.0's macOS wheels stopped at 3.14 and skipped 3.9/3.10. Install
3.11-3.15 explicitly so every supported version gets a wheel. Linux
builds already get 3.15 from the manylinux/musllinux images.
@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

RadixTarget Benchmark Results

100000 networks per table, 100000 lookups, median of 5 runs (seed 1337).

Benchmark stable (ms) dev (ms) Change
IPv4 insert 261.32 36.92 🟢 -85.9%
IPv4 lookup 230.09 34.15 🟢 -85.2%
IPv6 insert 1278.39 90.57 🟢 -92.9%
IPv6 lookup 395.81 67.18 🟢 -83.0%

Change is in time taken: negative is faster.

@en0f en0f left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The version number was never bumped, so the release won’t publish. The PR is titled “release: 4.3.0”, but Cargo.toml and pyproject.toml both still say version = "4.2.0". 4.2.0 is already the latest release on both PyPI and crates.io. Once this merges to stable:

PyPI: the publish job in python-tests.yml runs maturin publish, and PyPI will reject it because 4.2.0 already exists. Every wheel job (linux, musllinux, windows, macos, sdist) and release waits on publish, so no wheels get built and no GitHub release is created.
crates.io: cargo publish in rust-tests.yml will also fail, because the crate’s 4.2.0 is already published.

The fix is to set the version to 4.3.0 in both files and update Cargo.lock so the root crate’s version matches.

chore: bump version to 4.3.0 and build 3.15 wheels
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100%. Comparing base (e26e924) to head (950cd0d).
⚠️ Report is 8 commits behind head on stable.

Additional details and impacted files
@@          Coverage Diff          @@
##           stable   #105   +/-   ##
=====================================
  Coverage     100%   100%           
=====================================
  Files           3      3           
  Lines         604    605    +1     
=====================================
+ Hits          604    605    +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@liquidsec
liquidsec merged commit 3317d3e into stable Oct 20, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants