@@ -23,6 +23,7 @@ Most of it is not yours to edit:
2323| ` _engine/_builder_check_typing.py ` | 1 | 315 |
2424| ` _engine/_capable_typing.py ` | 10 | 324 |
2525| ` _engine/_poll_typing.py ` | 2 | 739 |
26+ | ` _engine/_negated_typing.py ` | 18 | 862 |
2627
2728One is written by hand. ` tests/test_architecture_doc.py ` recomputes this table. No line counts, which
2829move on every edit to a generated file.
@@ -39,12 +40,13 @@ move on every edit to a generated file.
3940| ` _engine/_negated_typing.py ` | ` scripts/generate_poll_protocols.py ` | ` _typing.py ` and ` _engine/_operations.py ` |
4041| ` _engine/_check_typing.py ` | ` scripts/generate_check_protocols.py ` | ` _typing.py ` , ` _engine/_operations.py ` |
4142
42- One script writes three of them. That is the part people miss.
43+ One script writes four of them. That is the part people miss.
4344
4445- ** polling twins** answer ` eventually() ` and ` eventually_sync() ` , so every assertion hands back the chain.
4546- ** verdict twins** answer ` check() ` , returning an ` AssertionOutcome ` instead of ` Self ` .
4647- ** the capability façade** stands in for the builder itself, so it reads the mixins rather than the views:
4748 reading the views would narrow it to what one value type answers. It skips its own hand-written list.
49+ - ** negation twins** answer ` .not_ ` , where one assertion hands back the view the chain had before it.
4850
4951` _engine/_operations.py ` decides what the first two leave out: ` NOT_AN_OPERATION ` , ` WITHOUT_A_VERDICT ` .
5052
@@ -111,7 +113,7 @@ import lines are templates inside the generators.
111113| ` test_typing_completeness.py ` | can a checker name a type for every exported symbol |
112114| ` test_pyright_baseline.py ` | has a new pyright diagnostic appeared in the package |
113115| ` test_typing_promises.py ` | is the object at the end of a chain the type the checker was promised |
114- | ` test_negated_protocols.py ` | does every reachable view have a negation twin that hands the view back |
116+ | ` test_negated_protocols.py ` | does every reachable view have a negation twin that hands the view back, and is the file what the generator produces |
115117| ` test_architecture_doc.py ` | does this document still describe the tree, counts included |
116118| ` test_typing_negative.py ` | do the checkers still refuse what they should |
117119| ` test_typing_from_a_wheel.py ` | does the typed surface survive packaging |
@@ -126,9 +128,9 @@ Which one goes red tells you what you did:
126128
127129- a declaration the runtime does not have: ` test_protocol_parity.py `
128130- a declaration whose parameters the runtime does not match: ` test_typing_conformance.py `
129- - a generated file edited by hand: that file's own gate, one of the three
130- - a protocol changed without regenerating: the polling and verdict gates, never the facade one, which
131- reads the mixins instead
131+ - a generated file edited by hand: that file's own gate, one of the four
132+ - a protocol changed without regenerating: the polling, verdict and negation gates, never the facade one,
133+ which reads the mixins instead
132134- a subject resolving to the wrong protocol: ` test_typing.py ` , and only under whichever checker sees it
133135- a public name added or moved: ` test_api_compatibility.py ` , which is a snapshot rather than a rule
134136
0 commit comments