Skip to content

Commit 94c3545

Browse files
committed
refactor(corekit)!: Info.to_dict() returns an OrderedMultiDict; add MultiInfo and OrderedMultiInfo (#1484)
- corekit/infoclass: add MultiInfo and OrderedMultiInfo, Info subclasses that also derive from MultiDict/OrderedMultiDict. They inherit from_dict and Info's finalisation, keep the multi-mapping protocol, refuse every mutation, read keys as attributes and keep every value of a repeated key. Info stores every MultiDict value as one of them, so a finalised Info holds no mutable multi-mapping. - Info.to_dict() returns an OrderedMultiDict at every level, and a MultiInfo/OrderedMultiInfo exports its plain multi-mapping; from_dict() restores them, including an annotated subclass (HTTP/2 Settings, now an OrderedMultiInfo). The OrderedMultiDict exports are a private subclass whose != negates ==, as OrderedMultiInfo's does, so two equal exports or option lists no longer compare unequal. - corekit/multidict: drop InfoDict; the module is Werkzeug's classes only. - dumpkit: write an Info's fields with every value of a repeated field, as a list; the PCAP and PCAP-NG engines hand the writers the Info itself. - protocols/data: retype the attribute annotations to OrderedMultiInfo and MultiInfo; PCAP-NG freezes the entries it holds in a tuple or dict. - tests: move the to_dict() assertions to the OrderedMultiDict contract. Every test directory and top-level test module passes, run one at a time.
1 parent cf6e78a commit 94c3545

34 files changed

Lines changed: 1465 additions & 276 deletions

‎docs/source/pcapkit/corekit/infoclass.rst‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ Info Class
55

66
:mod:`pcapkit.corekit.infoclass` contains the :obj:`dict`-like class
77
:class:`~pcapkit.corekit.infoclass.Info`, modelled on
8-
:func:`dataclasses.dataclass` (:pep:`557`).
8+
:func:`dataclasses.dataclass` (:pep:`557`), and the immutable multi-mapping
9+
classes :class:`~pcapkit.corekit.infoclass.MultiInfo` and
10+
:class:`~pcapkit.corekit.infoclass.OrderedMultiInfo` that a finalised
11+
:class:`~pcapkit.corekit.infoclass.Info` holds its option lists in.
912

1013
.. autoclass:: pcapkit.corekit.infoclass.Info
1114
:members:
@@ -24,16 +27,35 @@ Info Class
2427

2528
.. autodecorator:: pcapkit.corekit.infoclass.info_final
2629

30+
.. autoclass:: pcapkit.corekit.infoclass.MultiInfo
31+
:no-members:
32+
:show-inheritance:
33+
34+
.. autoclass:: pcapkit.corekit.infoclass.OrderedMultiInfo
35+
:no-members:
36+
:show-inheritance:
37+
2738
Internal Definitions
2839
--------------------
2940

3041
.. autoclass:: pcapkit.corekit.infoclass.InfoMeta
3142
:no-members:
3243
:show-inheritance:
3344

45+
.. autoclass:: pcapkit.corekit.infoclass._MultiInfo
46+
:no-members:
47+
:show-inheritance:
48+
49+
.. autoclass:: pcapkit.corekit.infoclass._OrderedMultiDict
50+
:no-members:
51+
:show-inheritance:
52+
3453
Type Variables
3554
--------------
3655

56+
.. data:: pcapkit.corekit.infoclass.KT
57+
:type: typing.Any
58+
3759
.. data:: pcapkit.corekit.infoclass.VT
3860
:type: typing.Any
3961

‎docs/source/pcapkit/corekit/multidict.rst‎

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,6 @@ values per key, based on the `Werkzeug`_ project.
3535
:no-special-members: __init__
3636
:show-inheritance:
3737

38-
.. autoclass:: pcapkit.corekit.multidict.InfoDict
39-
:no-members:
40-
:no-special-members: __init__
41-
:show-inheritance:
42-
43-
.. automethod:: keys
44-
.. automethod:: values
45-
.. automethod:: items
46-
4738
Type Variables
4839
--------------
4940

‎pcapkit/all.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
# pcapkit.corekit
5454
'EnumRegistry', # Enum Registry
5555
'Info', 'info_final', # Info Class
56+
'MultiInfo', 'OrderedMultiInfo',
5657
'ProtoChain', # ProtoChain
5758
'VersionInfo', # Version
5859
'NumberField', 'Int32Field', 'UInt32Field', # numeric protocol fields

‎pcapkit/corekit/__init__.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class :class:`~pcapkit.corekit.infoclass.Info`,
1919
from pcapkit.corekit.io import SeekableReader
2020
from pcapkit.corekit.enum import EnumRegistry
2121
from pcapkit.corekit.fields import *
22-
from pcapkit.corekit.infoclass import Info, info_final
22+
from pcapkit.corekit.infoclass import Info, MultiInfo, OrderedMultiInfo, info_final
2323
from pcapkit.corekit.module import ModuleDescriptor
2424
from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict
2525
from pcapkit.corekit.protochain import ProtoChain
@@ -29,6 +29,7 @@ class :class:`~pcapkit.corekit.infoclass.Info`,
2929
'EnumRegistry',
3030

3131
'Info', 'info_final',
32+
'MultiInfo', 'OrderedMultiInfo',
3233

3334
'ProtoChain',
3435

0 commit comments

Comments
 (0)