Preserve fitting post-replacement output during modern truncation - #193
Merged
un33k merged 1 commit intoSep 18, 2026
Merged
Conversation
Owner
|
Confirmed and merging. When the whole 🚀 Generated with Dojo ⛩️ |
un33k
added a commit
that referenced
this pull request
Sep 18, 2026
Bump to 9.1.0. Modern-only: decode uppercase &#X..; hex references (Rupayon Haldar, #195); preserve fitting post-replacement output during truncation (emme1t, #193); relocate up-front argument type validation to the modern path (Jon Bailey, #196). Fix add_uppercase_char atomicity (Cristian Ramirez, #194). Legacy output unchanged. 🚀 Generated with [Dojo](https://heydojo.ai) ⛩️
un33k
added a commit
that referenced
this pull request
Sep 18, 2026
* Split frozen legacy pipeline into slugify/_legacy.py Move the legacy slug pipeline into a dedicated frozen module and make the public slugify() a thin dispatcher: algorithm='legacy' (default) calls the frozen _legacy implementation, algorithm='modern' runs the modern pipeline. Relocate the existing up-front TypeError validation for bool/non-int max_length and non-str separator (from #196) into the modern path only, so legacy output is unchanged while modern keeps rejecting invalid types. 🚀 Generated with [Dojo](https://heydojo.ai) ⛩️ * Reorganize tests under tests/ with frozen legacy suite Move the test suite into tests/: the original upstream legacy suite becomes the frozen tests/test_legacy.py (contents unchanged), mirroring the _legacy.py code split, alongside tests/test_release.py and the add_uppercase test. The modern-only bool/separator validation test moves to the modern suite. Update pyproject testpaths, MANIFEST.in, and tox commands to the tests/ layout. 🚀 Generated with [Dojo](https://heydojo.ai) ⛩️ * Document legacy-frozen policy and split in DOJO.md and README Record that legacy is architecturally frozen (slugify/_legacy.py and tests/test_legacy.py) and that all new work targets algorithm='modern'. Add a contributor note in the README not to open PRs that change legacy output. 🚀 Generated with [Dojo](https://heydojo.ai) ⛩️ * Release 9.1.0: modern uppercase hex, truncation and validation fixes Bump to 9.1.0. Modern-only: decode uppercase &#X..; hex references (Rupayon Haldar, #195); preserve fitting post-replacement output during truncation (emme1t, #193); relocate up-front argument type validation to the modern path (Jon Bailey, #196). Fix add_uppercase_char atomicity (Cristian Ramirez, #194). Legacy output unchanged. 🚀 Generated with [Dojo](https://heydojo.ai) ⛩️ * Fix release checks for 9.1.0 and tests/ layout Update tools/check_dist.py to assert version 9.1.0 and the tests/ sdist layout (tests/test_legacy.py, tests/test_release.py). Add coverage for reachable branches in the split modules via the public API, restoring the 97% coverage gate without changing legacy behavior. 🚀 Generated with [Dojo](https://heydojo.ai) ⛩️
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
With the modern algorithm, enabling a length limit can change a slug which already fits that limit:
The README specifies that post replacements remain unfiltered. The word-boundary truncation loop drops empty internal tokens, which collapses intentionally repeated delimiters even when the whole output fits. At an exact length limit, the hard-cut branch can also drop an intentionally added trailing delimiter.
Check the final emitted length before truncating. When the entire output fits, return it with the configured separator mapping intact. The length calculation accounts for empty and multi-character separators without constructing an expanded output just to measure it. This change is confined to the modern helper; the default legacy algorithm and public
smart_truncateretain their implementations.Validation on Windows with Python 3.13.13:
save_order.git diff --checkall pass.Dojo follow-up: OpenAI Codex assisted with the investigation, patch, regression tests, and this PR description. The reproductions and checks above were executed locally.