Repository navigation
fix(const,vendor,docs): audit registry case sensitivity, fold FEATCode.get (#903) - #913
Conversation
|
Verified the one behaviour change's justification myself, since the whole PR rests on it. The citation holds, with one wrinkle the table should mention. RFC 5797 §2, lines 149–151 — quoted accurately, verbatim:
Note for anyone re-checking this: RFC 2389 §3.2 supports limb 2 as the table says — "implementations are recommended to use upper case letters when transmitting the feature response." But the same paragraph opens with:
That does not overturn the verdict — RFC 5797 §2 is limb 1 and explicit, and §3.2's own next clause points the same way — but a contributor who follows the Two other checks, both clean:
Cross-review is running on a different model from the author. |
b63fb1c to
c0b88bb
Compare
|
GOOD TO GO on It re-derived the finding the whole audit rests on rather than accepting it: that the criterion is vacuous on the 117 Also independently confirmed: 127 registries / 124 files, 117 int (5 flags) + 10 str, 24 non-registry enumerations (17 top-level + 7 nested) = 151; exactly one name-fold collision ( One discrepancy, which I re-derived myself: 7 test methods fail pre-change, not the 6 the commit message claimed. My list matches the reviewer's exactly. The cause is worth recording — reverting the three source files and running under plain Also amended: the Deferrals all judged correct, including Unverified and stated as such: the exact coverage percentages, and mypy/pylint/isort were not re-run. |
|
Resolve conflicts. And I'm thinking we should probably consider splitting conventions.rst into several files per category as it grows longer. |
…e.get (#903) - Record the audit in docs/source/conventions.rst: the lenient criterion's two limbs, the population it covers (127 registries, 24 helper enumerations), and a per-class table of governing source, quoted rule and verdict. - FEATCode.get was case-sensitive with nothing behind it, and RFC 5797 Section 2 states the opposite outright -- IANA keeps FEAT codes unique by case-insensitive comparison -- so give it a folding get, in the crawler template as well as the generated module. - The fold is a fallback only: an exact name or value hit still delegates to the base, so name-before-value precedence and the non-minting str path are unchanged, and nothing calls cls(key). - Correct three stale prose claims this invalidates: the "Four do" override count on the conventions page, and two test-module notes stating FEATCode carries no get of its own. - Remeasure "the 125 classes that reach this method" in pcapkit/corekit/enum.py as 127, after #880's two NGAP registries landed. 15 new tests, 7 of which fail without the fix (measured by reverting the three source files and re-running under plain unittest, since pytest-subtests miscounts a method whose subTests fail). tests/const and tests/corekit pass: 549 passed, 16 skipped, 40970 subtests. mypy and pylint show no new finding; isort clean.
c0b88bb to
50813f1
Compare
|
Rebased onto Verified blob-identical to the head you reviewed, file by file — The four pre-existing test references to the doc already point at On splitting
It is now ~440 lines carrying three unrelated rulings — the mint/unmint criterion, sentinel naming, and the registry protocol plus this case-sensitivity audit. A reader wanting the sentinel rule reads past two hundred lines about enum minting to reach it. I have not folded that into this PR, because it would turn a reviewed and verified change into a reviewed change plus an unreviewed restructure, and the doc move has already cost three rebases today. I will file it as its own issue once this lands, and the natural split is one file per |
…up (#877) Phase 2 of #877, the 11 classes across 8 files not held by #913/#904: TransportProtocol, FinalisedState, Completion, ftp.Type, httpv1.Type, Criticality, PDUKind, PacketDirection, PacketReception, WireGuardKeyLabel, and FrameType.Flags (carrying its 6 per-frame subclasses transitively). Each now mixes in EnumLookup ahead of its enum base for the shared get/get_all contract. TransportProtocol and Criticality already had their own get, both as a staticmethod against EnumLookup.get's classmethod (the #908/#915 trap). Both are now classmethods delegating to super().get(), keeping only what the base does not reproduce -- TransportProtocol's case-fold and no-mint refusal, Criticality's case-sensitive miss -- each re-raised as the ValueError callers already depend on rather than the base's KeyError. Each gained a default parameter forwarded to the base, since dropping one the base declares is a real classmethod-override violation under mypy. Updated test_const_enum_get.py's exclusion set for TransportProtocol's new default, and added test_enum_lookup_reparent_877_unit.py pinning the re-parenting, both preserved overrides, and no member-table growth.
…up (#877) Phase 2 of #877, the 11 classes across 8 files not held by #913/#904: TransportProtocol, FinalisedState, Completion, ftp.Type, httpv1.Type, Criticality, PDUKind, PacketDirection, PacketReception, WireGuardKeyLabel, and FrameType.Flags (carrying its 6 per-frame subclasses transitively). Each now mixes in EnumLookup ahead of its enum base for the shared get/get_all contract. TransportProtocol and Criticality already had their own get, both as a staticmethod against EnumLookup.get's classmethod (the #908/#915 trap). Both are now classmethods delegating to super().get(), keeping only what the base does not reproduce -- TransportProtocol's case-fold and no-mint refusal, Criticality's case-sensitive miss -- each re-raised as the ValueError callers already depend on rather than the base's KeyError. Each gained a default parameter forwarded to the base, since dropping one the base declares is a real classmethod-override violation under mypy. Updated test_const_enum_get.py's exclusion set for TransportProtocol's new default, and added test_enum_lookup_reparent_877_unit.py pinning the re-parenting, both preserved overrides, and no member-table growth.
…up (#877) (#921) Phase 2 of #877, the 11 classes across 8 files not held by #913/#904: TransportProtocol, FinalisedState, Completion, ftp.Type, httpv1.Type, Criticality, PDUKind, PacketDirection, PacketReception, WireGuardKeyLabel, and FrameType.Flags (carrying its 6 per-frame subclasses transitively). Each now mixes in EnumLookup ahead of its enum base for the shared get/get_all contract. TransportProtocol and Criticality already had their own get, both as a staticmethod against EnumLookup.get's classmethod (the #908/#915 trap). Both are now classmethods delegating to super().get(), keeping only what the base does not reproduce -- TransportProtocol's case-fold and no-mint refusal, Criticality's case-sensitive miss -- each re-raised as the ValueError callers already depend on rather than the base's KeyError. Each gained a default parameter forwarded to the base, since dropping one the base declares is a real classmethod-override violation under mypy. Updated test_const_enum_get.py's exclusion set for TransportProtocol's new default, and added test_enum_lookup_reparent_877_unit.py pinning the re-parenting, both preserved overrides, and no member-table growth.
… onto EnumLookup (#930) Finishes #877's phase 2, which #921 left seven classes out of because their files were held by #913/#904 at the time: CommandType and ConformanceRequirement (const/ftp/command.py), ESPStatus (protocols/internet/esp.py), and FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode and LocalizedRoutingStatus (protocols/internet/mh.py). Both blockers have since merged. Each now mixes in EnumLookup ahead of its enum base; member-table sizes are unchanged. FastBindingAcknowledgmentStatus and IPv6AddressPrefixCode kept their own get, still a staticmethod that never calls super() -- left untouched, since #923's EnumKeyError name-miss conversion already matches the base's shape. mypy's [override] and pylint's arguments-differ against the kept decorator are suppressed rather than resolved by widening it. The other five are pure re-parents. Brought conventions.rst and its own doc-claims test in line with #929, which merged in the interim: phase 2 is now 24 of 24, zero enumerations outside the hierarchy. Added test_enum_lookup_reparent_930_unit.py pinning the re-parenting, the kept overrides, no growth, and the zero-outside census; fixed three tests whose claims this change made stale (test_const_enum_get, test_const_ftp_featcode_case_903_unit, test_mh_unit). Build: mypy/pylint/isort clean against baseline; affected test files pass.
… onto EnumLookup (#930) Finishes #877's phase 2, which #921 left seven classes out of because their files were held by #913/#904 at the time: CommandType and ConformanceRequirement (const/ftp/command.py), ESPStatus (protocols/internet/esp.py), and FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode and LocalizedRoutingStatus (protocols/internet/mh.py). Both blockers have since merged. Each now mixes in EnumLookup ahead of its enum base; member-table sizes are unchanged. FastBindingAcknowledgmentStatus and IPv6AddressPrefixCode kept their own get, still a staticmethod that never calls super() -- left untouched, since #923's EnumKeyError name-miss conversion already matches the base's shape. mypy's [override] and pylint's arguments-differ against the kept decorator are suppressed rather than resolved by widening it. The other five are pure re-parents. Brought conventions.rst and its own doc-claims test in line with #929, which merged in the interim: phase 2 is now 24 of 24, zero enumerations outside the hierarchy. Added test_enum_lookup_reparent_930_unit.py pinning the re-parenting, the kept overrides, no growth, and the zero-outside census; fixed three tests whose claims this change made stale (test_const_enum_get, test_const_ftp_featcode_case_903_unit, test_mh_unit). Build: mypy/pylint/isort clean against baseline; affected test files pass.
… onto EnumLookup (#930) Finishes #877's phase 2, which #921 left seven classes out of because their files were held by #913/#904 at the time: CommandType and ConformanceRequirement (const/ftp/command.py), ESPStatus (protocols/internet/esp.py), and FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode and LocalizedRoutingStatus (protocols/internet/mh.py). Both blockers have since merged. Each now mixes in EnumLookup ahead of its enum base; member-table sizes are unchanged. FastBindingAcknowledgmentStatus and IPv6AddressPrefixCode kept their own get, still a staticmethod that never calls super() -- left untouched, since #923's EnumKeyError name-miss conversion already matches the base's shape. mypy's [override] and pylint's arguments-differ against the kept decorator are suppressed rather than resolved by widening it. The other five are pure re-parents. Brought conventions.rst and its own doc-claims test in line with #929, which merged in the interim: phase 2 is now 24 of 24, zero enumerations outside the hierarchy. Added test_enum_lookup_reparent_930_unit.py pinning the re-parenting, the kept overrides, no growth, and the zero-outside census; fixed three tests whose claims this change made stale (test_const_enum_get, test_const_ftp_featcode_case_903_unit, test_mh_unit). Build: mypy/pylint/isort clean against baseline; affected test files pass.
… onto EnumLookup (#932) Finishes #877's phase 2, which #921 left seven classes out of because their files were held by #913/#904 at the time: CommandType and ConformanceRequirement (const/ftp/command.py), ESPStatus (protocols/internet/esp.py), and FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode and LocalizedRoutingStatus (protocols/internet/mh.py). Both blockers have since merged. Each now mixes in EnumLookup ahead of its enum base; member-table sizes are unchanged. FastBindingAcknowledgmentStatus and IPv6AddressPrefixCode kept their own get, still a staticmethod that never calls super() -- left untouched, since #923's EnumKeyError name-miss conversion already matches the base's shape. mypy's [override] and pylint's arguments-differ against the kept decorator are suppressed rather than resolved by widening it. The other five are pure re-parents. Brought conventions.rst and its own doc-claims test in line with #929, which merged in the interim: phase 2 is now 24 of 24, zero enumerations outside the hierarchy. Added test_enum_lookup_reparent_930_unit.py pinning the re-parenting, the kept overrides, no growth, and the zero-outside census; fixed three tests whose claims this change made stale (test_const_enum_get, test_const_ftp_featcode_case_903_unit, test_mh_unit). Build: mypy/pylint/isort clean against baseline; affected test files pass.
RFC 959's rendered HTML carries anchors only for its eight top-level sections, ``section-1`` through ``section-8``, so **every** sub-numbered ``959`` fragment is a live link to nothing. Per the ruling on #944, they now cite the enclosing top-level section. - ``#section-4.1`` -> ``#section-4`` at eleven sites: the six in ``pcapkit/{const,vendor}/{ftp/command,http/method}.py`` #944 reported, plus four rendered roles in ``docs/source/contributing/conventions/registry-protocol.rst`` and one in ``tests/const/test_const_enum_no_mint.py``. The five extra sites predate this branch -- ``git log -S`` puts them at #913 (``1f4337e12``) -- and were found by the cross-review, not by #944's ``pcapkit/``-only grep. - ``#section-5.3`` -> ``#section-5`` at two more, in ``tests/protocols/application/test_ftp_unit.py`` and ``docs/source/changelog/1.5.0.rst``, cited for the case-insensitivity rule §5.3 does correctly name in prose. ``CHANGELOG.md`` regenerated with ``util/changelog_md.py`` for the second of those, one line. - The three ``pcapkit/`` template/generated pairs stay byte-identical on the cited lines; each string is a literal in the ``vendor/`` template, verified to contain no interpolation, so a regeneration reproduces the edit. No crawl was run. - Add ``KNOWN_DEAD_ANCHORS`` (both ``959`` fragments) and ``test_no_known_dead_anchor_citations`` to ``tests/project/test_rfc_anchor_fragments.py``. #943's shape invariant accepts ``section-4.1`` as well-formed and by construction cannot see a dead anchor, so this is a narrower second check for the same class. It scans ``pcapkit/``, ``docs/source`` and ``tests/`` rather than ``pcapkit/`` alone -- looking at one directory is what let five sites sit unnoticed -- and matches roles only, via a lookbehind, so a ``literal`` naming the defect stays writable. Offline by design: CI has no network. Prose left standing where it is still true: ``ftp/command.py``'s citations carry the command-*kind* claim, which §4 does support. ``http/method.py``'s carry a case-insensitivity claim that §4 does not; that is #947's question, deliberately not widened into here. tests/project: 207 passed, 1 skipped, 562 subtests. tests/protocols/application/test_ftp_unit.py + tests/const/test_const_enum_no_mint.py: 79 passed, 602 subtests. Each new assertion was shown to fail without its fix, including from a ``docs/`` site the pre-widening scan could not see.
RFC 959's rendered HTML carries anchors only for its eight top-level sections, ``section-1`` through ``section-8``, so **every** sub-numbered ``959`` fragment is a live link to nothing. Per the rulings on #944 and #947, they now cite the section that supports the claim they carry. - ``#section-4.1`` -> ``#section-4`` at eleven sites: the six in ``pcapkit/{const,vendor}/{ftp/command,http/method}.py`` #944 reported, plus four rendered roles in ``docs/source/contributing/conventions/registry-protocol.rst`` and one in ``tests/const/test_const_enum_no_mint.py``. The five extra sites predate this branch -- ``git log -S`` puts them at #913 (``1f4337e12``) -- and were found by cross-review, not by #944's ``pcapkit/``-only grep. - ``#section-5.3`` -> ``#section-5`` at two more, in ``tests/protocols/application/test_ftp_unit.py`` and ``docs/source/changelog/1.5.0.rst``. ``CHANGELOG.md`` regenerated with ``util/changelog_md.py`` for the second, one line. - The three ``pcapkit/`` template/generated pairs stay byte-identical on the cited lines; each string is a literal in the ``vendor/`` template, carrying no interpolation, so a regeneration reproduces the edit. No crawl was run. - Add ``KNOWN_DEAD_ANCHORS`` (both ``959`` fragments) and ``test_no_known_dead_anchor_citations`` to ``tests/project/test_rfc_anchor_fragments.py``. #943's shape invariant accepts ``section-4.1`` as well-formed and by construction cannot see a dead anchor, so this is a narrower second check for the same class. It scans ``pcapkit/``, ``docs/source`` and ``tests/`` rather than ``pcapkit/`` alone -- looking at one directory is what let five sites sit unnoticed. Offline by design: CI has no network. - Classify role-versus-literal by **masking inline literal spans** before matching, rather than by a one-character lookbehind. The lookbehind was wrong in both directions, measured: a role written straight after a closing literal or a title reference was silently skipped, and an inert literal padded with spaces was wrongly flagged. Masking fixes all three. Two residual gaps are documented rather than claimed away -- a ``::`` literal block, and a triple-backtick wrapper around a padded literal -- both of which fail in the safe direction, since a false positive fails loudly where a false negative is a dead link nobody sees. Prose left standing where it is still true: ``ftp/command.py``'s citations carry the command-*kind* claim, which §4 does support. ``http/method.py``'s carry a case-insensitivity claim stated in §5.3, tracked in #947. Dead sub-anchors in *other* RFCs -- ten sites across RFC 1122 and RFC 719, both of which render no sub-section anchors either -- are out of #944's scope and are filed as #950. tests/project: 207 passed, 1 skipped, 562 subtests. tests/protocols/application/test_ftp_unit.py + tests/const/test_const_enum_no_mint.py: 79 passed, 602 subtests. Each new assertion was shown to fail without its fix, including from a ``docs/`` site the pre-widening scan could not see.
RFC 959's rendered HTML carries anchors only for its eight top-level sections, ``section-1`` through ``section-8``, so **every** sub-numbered ``959`` fragment is a live link to nothing. Per the rulings on #944 and #947, they now cite the section that supports the claim they carry. - ``#section-4.1`` -> ``#section-4`` at eleven sites: the six in ``pcapkit/{const,vendor}/{ftp/command,http/method}.py`` #944 reported, plus four rendered roles in ``docs/source/contributing/conventions/registry-protocol.rst`` and one in ``tests/const/test_const_enum_no_mint.py``. The five extra sites predate this branch -- ``git log -S`` puts them at #913 (``1f4337e12``) -- and were found by cross-review, not by #944's ``pcapkit/``-only grep. - ``#section-5.3`` -> ``#section-5`` at two more, in ``tests/protocols/application/test_ftp_unit.py`` and ``docs/source/changelog/1.5.0.rst``. ``CHANGELOG.md`` regenerated with ``util/changelog_md.py`` for the second, one line. - The three ``pcapkit/`` template/generated pairs stay byte-identical on the cited lines; each string is a literal in the ``vendor/`` template, carrying no interpolation, so a regeneration reproduces the edit. No crawl was run. - Add ``KNOWN_DEAD_ANCHORS`` (both ``959`` fragments) and ``test_no_known_dead_anchor_citations`` to ``tests/project/test_rfc_anchor_fragments.py``. #943's shape invariant accepts ``section-4.1`` as well-formed and by construction cannot see a dead anchor, so this is a narrower second check for the same class. It scans ``pcapkit/``, ``docs/source`` and ``tests/`` rather than ``pcapkit/`` alone -- looking at one directory is what let five sites sit unnoticed. Offline by design: CI has no network. - Classify role-versus-literal by **masking inline literal spans** before matching, rather than by a one-character lookbehind. The lookbehind was wrong in both directions, measured: a role written straight after a closing literal or a title reference was silently skipped, and an inert literal padded with spaces was wrongly flagged. Masking fixes all three. Two residual gaps are documented rather than claimed away -- a ``::`` literal block, and a triple-backtick wrapper around a padded literal -- both of which fail in the safe direction, since a false positive fails loudly where a false negative is a dead link nobody sees. Prose left standing where it is still true: ``ftp/command.py``'s citations carry the command-*kind* claim, which §4 does support. ``http/method.py``'s carry a case-insensitivity claim stated in §5.3, tracked in #947. Dead sub-anchors in *other* RFCs -- ten sites across RFC 1122 and RFC 719, both of which render no sub-section anchors either -- are out of #944's scope and are filed as #950. tests/project: 207 passed, 1 skipped, 562 subtests. tests/protocols/application/test_ftp_unit.py + tests/const/test_const_enum_no_mint.py: 79 passed, 602 subtests. Each new assertion was shown to fail without its fix, including from a ``docs/`` site the pre-widening scan could not see.
RFC 959's rendered HTML carries anchors only for its eight top-level sections, ``section-1`` through ``section-8``, so **every** sub-numbered ``959`` fragment is a live link to nothing. Per the rulings on #944 and #947, they now cite the section that supports the claim they carry. - ``#section-4.1`` -> ``#section-4`` at eleven sites: the six in ``pcapkit/{const,vendor}/{ftp/command,http/method}.py`` #944 reported, plus four rendered roles in ``docs/source/contributing/conventions/registry-protocol.rst`` and one in ``tests/const/test_const_enum_no_mint.py``. The five extra sites predate this branch -- ``git log -S`` puts them at #913 (``1f4337e12``) -- and were found by cross-review, not by #944's ``pcapkit/``-only grep. - ``#section-5.3`` -> ``#section-5`` at two more, in ``tests/protocols/application/test_ftp_unit.py`` and ``docs/source/changelog/1.5.0.rst``. ``CHANGELOG.md`` regenerated with ``util/changelog_md.py`` for the second, one line. - The three ``pcapkit/`` template/generated pairs stay byte-identical on the cited lines; each string is a literal in the ``vendor/`` template, carrying no interpolation, so a regeneration reproduces the edit. No crawl was run. - Add ``KNOWN_DEAD_ANCHORS`` (both ``959`` fragments) and ``test_no_known_dead_anchor_citations`` to ``tests/project/test_rfc_anchor_fragments.py``. #943's shape invariant accepts ``section-4.1`` as well-formed and by construction cannot see a dead anchor, so this is a narrower second check for the same class. It scans ``pcapkit/``, ``docs/source`` and ``tests/`` rather than ``pcapkit/`` alone -- looking at one directory is what let five sites sit unnoticed. Offline by design: CI has no network. - Classify role-versus-literal by **masking inline literal spans** before matching, rather than by a one-character lookbehind. The lookbehind was wrong in both directions, measured: a role written straight after a closing literal or a title reference was silently skipped, and an inert literal padded with spaces was wrongly flagged. Masking fixes all three. Two residual gaps are documented rather than claimed away -- a ``::`` literal block, and a triple-backtick wrapper around a padded literal -- both of which fail in the safe direction, since a false positive fails loudly where a false negative is a dead link nobody sees. Prose left standing where it is still true: ``ftp/command.py``'s citations carry the command-*kind* claim, which §4 does support. ``http/method.py``'s carry a case-insensitivity claim stated in §5.3, tracked in #947. Dead sub-anchors in *other* RFCs -- ten sites across RFC 1122 and RFC 719, both of which render no sub-section anchors either -- are out of #944's scope and are filed as #950. tests/project: 207 passed, 1 skipped, 562 subtests. tests/protocols/application/test_ftp_unit.py + tests/const/test_const_enum_no_mint.py: 79 passed, 602 subtests. Each new assertion was shown to fail without its fix, including from a ``docs/`` site the pre-widening scan could not see.
RFC 959's rendered HTML carries anchors only for its eight top-level sections, ``section-1`` through ``section-8``, so **every** sub-numbered ``959`` fragment is a live link to nothing. Per the rulings on #944 and #947, they now cite the section that supports the claim they carry. - ``#section-4.1`` -> ``#section-4`` at eleven sites: the six in ``pcapkit/{const,vendor}/{ftp/command,http/method}.py`` #944 reported, plus four rendered roles in ``docs/source/contributing/conventions/registry-protocol.rst`` and one in ``tests/const/test_const_enum_no_mint.py``. The five extra sites predate this branch -- ``git log -S`` puts them at #913 (``1f4337e12``) -- and were found by cross-review, not by #944's ``pcapkit/``-only grep. - ``#section-5.3`` -> ``#section-5`` at two more, in ``tests/protocols/application/test_ftp_unit.py`` and ``docs/source/changelog/1.5.0.rst``. ``CHANGELOG.md`` regenerated with ``util/changelog_md.py`` for the second, one line. - The three ``pcapkit/`` template/generated pairs stay byte-identical on the cited lines; each string is a literal in the ``vendor/`` template, carrying no interpolation, so a regeneration reproduces the edit. No crawl was run. - Add ``KNOWN_DEAD_ANCHORS`` (both ``959`` fragments) and ``test_no_known_dead_anchor_citations`` to ``tests/project/test_rfc_anchor_fragments.py``. #943's shape invariant accepts ``section-4.1`` as well-formed and by construction cannot see a dead anchor, so this is a narrower second check for the same class. It scans ``pcapkit/``, ``docs/source`` and ``tests/`` rather than ``pcapkit/`` alone -- looking at one directory is what let five sites sit unnoticed. Offline by design: CI has no network. - Classify role-versus-literal by **masking inline literal spans** before matching, rather than by a one-character lookbehind. The lookbehind was wrong in both directions, measured: a role written straight after a closing literal or a title reference was silently skipped, and an inert literal padded with spaces was wrongly flagged. Masking fixes all three. Two residual gaps are documented rather than claimed away -- a ``::`` literal block, and a triple-backtick wrapper around a padded literal -- both of which fail in the safe direction, since a false positive fails loudly where a false negative is a dead link nobody sees. Prose left standing where it is still true: ``ftp/command.py``'s citations carry the command-*kind* claim, which §4 does support. ``http/method.py``'s carry a case-insensitivity claim stated in §5.3, tracked in #947. Dead sub-anchors in *other* RFCs -- ten sites across RFC 1122 and RFC 719, both of which render no sub-section anchors either -- are out of #944's scope and are filed as #950. tests/project: 207 passed, 1 skipped, 562 subtests. tests/protocols/application/test_ftp_unit.py + tests/const/test_const_enum_no_mint.py: 79 passed, 602 subtests. Each new assertion was shown to fail without its fix, including from a ``docs/`` site the pre-widening scan could not see.
…ision (#719) Accuracy fixes, each re-derived against the code: - mint-criterion.rst presented `EtherType`'s company names and `Socket`'s `Registered by Xerox` as the worked *mint* examples. #878 converted both to `_unregistered_member`; `CGAType` is now the only `_missing_` that mints, so the criterion decides the unregistered member's *name*, not whether it registers. - Its `ast` snippet matched only `ast.Name` callees, so it reported 1 MINT and 0 UNMINT; `_unregistered_member` is called on `cls`. Matches attributes now. - "Every registry defines `_missing_`" -> 121 of 127, naming the six without one. - registry-protocol.rst: `__new__` exemption said "a handful ... tracked in #860"; it is six named classes and #860 closed with all 127 on the base. - The 6 mh/ngap helpers are not all numeric: `PDUKind` is `str`, and it was listed in two rows at once. - `TCP`/`UDP`/`SCTP`/`DCCP` member *names* come from the service-name column; the values are composites. - process.rst: 9 sections, 8 of them module-level; `pcapkit.interface` has none. - sentinel-convention.rst: `NO_VALUE` also lacks `__copy__`/`__deepcopy__`/ `__reduce__`; the quoted `AbsentType` excerpt did not support the privacy claim it was cited for. - Two `/issues/` links pointed at pull requests (#847, #913). Concision: dropped timed context (the page's former title, the two-pass #877 history, the pre-#937 casing narrative, the pre-restructure changelog shape) and fixed a duplicated clause. Added two Mermaid flows for `_missing_` and for `get`'s dispatch, modelled on workflows.rst:102. Build: docutils parse unchanged from base; tests/project/test_conventions_doc_claims.py and the seven other suites reading these pages 111 passed, 1 skipped, 241 subtests.
make pylint,make mypy,make isort)make testpasses, and a test case covers the changedocs/source/changelog/and regeneratedCHANGELOG.md, if the change is user-visible — N/A -- changelog centralised in docs(changelog): shared 1.5.0 changelog — long-lived, merges last (#610, #616, #617, #618, #620) #657What is the purpose of your pull request?
fix— corrects a defectfeat— adds a featureperf— changes performance, not behaviourrefactor— changes neither behaviour nor performancetest— tests onlydocs— documentation onlyci— workflows or build toolingchore— anything elseDescription of your pull request and other information
Closes #903 — the registry-wide case-sensitivity audit, under the owner's lenient criterion.
The audit table is the deliverable, and it lives in
docs/source/conventions.rstbeside the ruling, as the issue asks. Population, with the counting convention stated: 127EnumRegistrysubclasses across 124 files (117int-valued, 10StrEnum-valued), plus 24 non-registry enumerations by a runtime walk over bothenumandaenumincluding nested classes — 151 in total. The 127 is 125 plus the two NGAP registries #880 landed while this was in flight.The
inttier needs no per-class row, and the table says why. A registry whose values are numbers has nothing for case to apply to; the only string that reachesgetthere is a member name, whichVendor.safe_namederives from the registrar's own column with casing preserved. Measured across all 151: exactly one would collide if names were folded (hip.Parameter,R1_CountervsR1_COUNTER), and none has twostrvalues that collide.One defect found and fixed:
FEATCode.get. It folded nothing, so it ran the case-sensitive default — but RFC 5797 §2, defining the very registry the crawler reads, states "IANA maintains uniqueness of feature names (FEAT codes) based on case-insensitive comparison." Both limbs hold: that comparison rule, and a measured spelling disagreement — RFC 2389 §3.2 recommends upper case on the wire while the registry spells 5 of its 15 codes lower case (of 64 CSV rows: 11 upper-case, 52 lower-case, 1 blank, 0 mixed).get('BASE')raisedKeyErrorbefore. The fold is a fallback: an exact hit still delegates to the base, so precedence and the non-mintingstrpath are untouched, and members keep the registrar's casing.Two rows left open deliberately, both wider than a case fix and recorded in the table rather than acted on: a service-name lookup on the
AppTypetransport registries (RFC 6335 §5.1 does make service names case-insensitive, but no such lookup exists to fold — new public API on a 6,000-member registry), andCommandType/ConformanceRequirement(the disagreement is measured, but nothing looks them up by string and neither inheritsEnumLookupyet — #877 phase 2).