v0.6.2 — correctness, security, performance & maintenance
A correctness, security, performance and maintenance release triaged from a
post-0.6.1 issue sweep (#101–#132). No public API removed; one small new public
behaviour (slugify(save_order=True) now functions). Two output-affecting
fixes — see Upgrade notes.
Upgrade notes (output-affecting)
slugify(save_order=True)was an accepted no-op; it now strips only
leading/trailing stopwords (preserving interior word order), matching
python-slugify (#118). If you passedsave_order=True, slug output changes.decode_to_utf8defaultmin_confidence0.5→0.95(#103). The old
default was inert (the detector only reports0.50/0.95, and0.50 < 0.50
is false), so it never rejected. It now requires high confidence by default;
passmin_confidence=0.0to accept any guess. (No practical change today —
the detector currently always reports0.95.)
Fixed
- #102 —
UniqueSlugifyno longer panics across the FFI boundary on a
multibyte separator + smallmax_length(byte slice landed mid-codepoint;
now usesfloor_char_boundary). - #101 — context bigram disambiguation tier was unreachable (it reset on
every inter-word space); it now resets only on hard boundaries, so the tier
fires in normal prose. - #104 —
set_emoji_providernow obeysseal_registrations()(the provider
swap previously defeated the seal). - #103 —
decode_to_utf8default confidence now actually gates (see notes). - #107 — a corrupt context dictionary now reports a distinct "corrupt" error
instead of the misleading "not found" remedy (DictStateenum). - #121 —
PRESETS["sanitize_user_input"]now reflects the real pipeline
order (strip invisibles before zalgo); Python registry and Rust doc aligned. - #129 —
Text.transliterate()stub now declares thetones/context
parameters the implementation accepts. - #131 —
Slugify(uids=...)emits a correct wrong-class warning rather than
a spurious deprecation warning. - #122 — disambiguated the
_compatshould_warnnested ternary.
Security
- #105 — added a
cargo audit(RustSec advisory) CI job and acargo
Dependabot ecosystem. - #132 — added a Trivy CVE scan of the published image to the release
workflow (SARIF → Security tab, fails on fixable HIGH/CRITICAL) +.trivyignore. - #106 — Rust diagnostics now route through Python
warningsinstead of
bareeprintln!, so applications can capture/suppress them.
Performance (output-preserving)
- #108 codepoint-range diacritic checks in
tokenize(); #109mem::take
per token boundary; #110 singlech.nfkc()pass on the NFKC fallback;
#111 loweredMAX_CAPACITY_HINT256 MiB → 8 MiB; #112/#113 emoji
matching uses stack buffers + a fixed sliding window (no per-charVec/String);
#114 slugify usesCow(no eagerto_owned); #115 contexttokenize()
returns borrowed (Cow) slices of the input — zero per-token allocation
(Rust API: the crate-internalcontext::Token.textchanged fromString
toCow<'_, str>; no effect on the Python API); #116 clamped the
ContextDictcapacity hint.
Maintenance
- #118 implemented
slugify(save_order=True); #119SlugConfig::from_pyargs
dedupes the four slugify PyO3 entrypoints; #120_build_slug_kwargshelper;
#123 seal-enforcement docs on eachtables::mutator; #124
infallibility comments; #125 typed_CallableModule.__call__kwargs;
#126 correctedrecover_lockdoc; #127 documented the lazy-import
workaround; #128 renamed_mutation_generation→_registration_generation;
#130 annotated the defence-in-depth conflict check.