Conversation
max_length=True previously truncated to one character because bool is an int subclass. separator=None raised a cryptic replace() TypeError. Validate types up front with clear TypeErrors.
|
Confirmed and merging. 🚀 Generated with Dojo ⛩️ |
|
Follow-up: after merging, we reverted this change (commit reverting #196 on On reflection it runs against this project's hard compatibility rule: the This is not a reflection on the fix quality; the diagnosis ( 🚀 Generated with Dojo ⛩️ |
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) ⛩️
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) ⛩️
* 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) ⛩️
Summary
max_length=Truepreviously truncated to one character becauseboolis anintsubclass.separator=Noneraised a crypticreplace() argument 2 must be strTypeError.Validate types up front with clear
TypeErrors. Nonpositivemax_lengthremains unlimited per existing docs.Test plan
python -m unittest test.TestSlugify.test_max_length_rejects_boolslugify("Hello World", max_length=5)still returnshello