v0.52.0
Read as well as run
Everything a stranger's machine did with this file, it did by running it. A
third job reads it instead: ruff for what the text says, ty for whether what
it says about itself holds together. It is its own job because the first
job's whole claim is that nothing is installed, and this one installs two
things. Both are pinned to a version, the way the actions are pinned to a
commit, and ruff runs isolated so its rules are the ones written in the
workflow rather than whatever a config file somewhere up the tree says.
Twenty-two things to fix between them, and three were worth the trip.
A class decorator was annotated as taking a type and answering a type, so
every class it decorated came out the far side as some class rather than the
one it is; seven complaints downstream were all that same flattening. Five
zips whose two sides are equal by a check immediately above them now say so,
which turns each of those invariants into an assertion instead of a comment.
And a closure in the fuzzer read a name the loop around it rebinds - right
today by a hair, since it is called in the same turn, and no longer depending
on the hair.
The rest were housekeeping: eight casts that said nothing, an abstract base
that could be instantiated and so was not one, a counter nothing counted, and
five parameters in the seed named for a letter rather than for what they
hold. The three fixpoints confirm no octet moved.
Three of ty's rules are set aside, and all three are one complaint: the front
end hands back the abstract node and every reader of it knows which one it
really is. Narrowing that is a change to layers 5 through 7 rather than to a
workflow, so it is written down in the workflow instead of hidden in a config
file or waved through with a suppression on every line.
Full Changelog: v0.51.0...v0.52.0
LOC: 25110