Changed
- A string measures from the start of its key. A long key can be what pushes a value past
column_width; measuring the value alone left lines running past the column the setting asks for. (#448) - Deep input comes back as an error rather than a crash. Reading a value, writing it and dropping it each walk it by calling themselves, so the model caps nesting at 256 levels. A 12,000-deep value used to end the process. (#448)
Fixed
- A requirement written with a space after its operator reads as a requirement.
requires-python = ">= 3.12"did not parse as a version bound, so the generated classifiers fell back to the configured floor and ceiling.pypa/buildcarried a 3.9 classifier it does not support. (#448) - The classifier window works at patch precision.
requires-python = "<3.10.1"lost the whole 3.10 series, and claimedProgramming Language :: Python :: 3 :: Onlyfor a bound that admits Python 2. (#448) - A literal string sorts with the values around it.
'zz'and'aa'held their order while the same values in double quotes sorted. (#448) - A comment written before a member's comma stays on that member's line. The comma is what says which member a comment belongs to: one written before it closes that member's line, one written after it leads the next member. Both used to end up on a line of their own, leaving the comma stranded below. (#448)
classifierswritten as a string stays as written. Asking for generated classifiers replaced the string with an array, losing what the file said. (#448)- Folding sub-tables into their parent no longer depends on the order the file wrote them in. (#448)
- The key order covers pyrefly's documented option names. It spells them with hyphens, the order listed only the underscore forms, and a file using the documented spelling fell through to alphabetical order. (#448)
- A dependency group keeps its
include-groupentries where the file wrote them. Aninclude-grouppulls its group in at the point it sits, so moving it changes what the group resolves to. (#448) - Free-form license text stays as written.
license = "MIT or later"came back rewritten as though it were an SPDX expression; the formatter now rewrites the value only once it parses as one over registered identifiers. (#448) - The
*catch-all in a setuptools data table matches the way the file spells it.*is not a name TOML reads bare, so a file writes it quoted; the catch-all led the table only because a quote happens to sort before a letter. (#448)
Performance
- The quadratic walks the old parse tree forced are gone. 32,000 interleaved root keys under two tables took 618 seconds and now take 4.8; scaling is close to linear. (#448)