Tier 2 of the post-1.3.0 roadmap. Target version: 2.0.0 (major).
The highest-leverage tier: the things people need before they can build
on the library rather than merely call it.
| # | Item |
|---|
| #87 | A public protocol registry |
| #88 | Ship decode_frame() — the chain walker belongs in the library |
| #89 | Flow keys — hashable 5-tuples with a canonical bidirectional form |
| #90 | Make Packet pull its weight — type indexing, hashing, a rename |
| #91 | Structured parse diagnostics on ProtocolError |
| #92 | A named lax decode mode for deliberately truncated input |
Why major
#90 renames Packet.payload, which is a breaking change. Everything
else in the tier is additive, so if #90 is deferred or handled with a
deprecation period, the rest could ship as 1.5.0 instead.
Sequencing
#87 first, and design it with #82 in hand — a public registry is a
module-level dict built once, which is exactly the internal table #82
introduces. They are the same change at different levels of
visibility; doing them independently means doing dispatch twice.
#91 before #92. The lax mode's "reason for stopping" should be the
same structured diagnostic object #91 introduces, not a second
parallel concept. #88's lenient mode is the multi-layer version of #92
— all three want one shared notion of partial success.
#89 and #90 are independent, though #89 may want to live on Packet.
The two gaps behind this tier
Neither appeared in the original differentiation advice, and both
matter more than anything that did:
- There is no extension point. No registry, no
__init_subclass__,
no hook. Nobody can add a protocol without editing library source. - Errors carry no structure. Strictness is the security story, but
every exception is a formatted string with no offset or field.
Part of the post-1.3.0 roadmap: #107
Tier 2 of the post-1.3.0 roadmap. Target version: 2.0.0 (major).
The highest-leverage tier: the things people need before they can build
on the library rather than merely call it.
decode_frame()— the chain walker belongs in the libraryPacketpull its weight — type indexing, hashing, a renameProtocolErrorWhy major
#90 renames
Packet.payload, which is a breaking change. Everythingelse in the tier is additive, so if #90 is deferred or handled with a
deprecation period, the rest could ship as 1.5.0 instead.
Sequencing
#87 first, and design it with #82 in hand — a public registry is a
module-level dict built once, which is exactly the internal table #82
introduces. They are the same change at different levels of
visibility; doing them independently means doing dispatch twice.
#91 before #92. The lax mode's "reason for stopping" should be the
same structured diagnostic object #91 introduces, not a second
parallel concept. #88's lenient mode is the multi-layer version of #92
— all three want one shared notion of partial success.
#89 and #90 are independent, though #89 may want to live on
Packet.The two gaps behind this tier
Neither appeared in the original differentiation advice, and both
matter more than anything that did:
__init_subclass__,no hook. Nobody can add a protocol without editing library source.
every exception is a formatted string with no
offsetorfield.Part of the post-1.3.0 roadmap: #107