Repository navigation
PyPCAPKit v1.5.0b11
Pre-release
Pre-release
What's Changed
💥 Breaking Changes
- fix(foundation): make register_mh_extension take schema keyword-only (#516) by @JarryShaw in #526
- fix(corekit): reject a bool where a maker converts an address itself (#508) by @JarryShaw in #539
- feat(foundation): make subclass registration opt-in for Engine, Reassembly, TraceFlow and Dumper (#514) by @JarryShaw in #547
- fix(foundation): rename Engine's registry keyword to
engine, which works on Python 3.10 (#514) by @JarryShaw in #557 - fix(corekit): stop a malformed TCP SACK's exception type depending on sys.modules state (#525) by @JarryShaw in #562
- fix(link,internet): reject a bool at the four remaining maker call sites (#540) by @JarryShaw in #568
- fix(tcp): set MPTCP.subtype on construction, fix MP_CAPABLE's length/rkey (#566, #567) by @JarryShaw in #579
- fix(ipv6-route): size the RPL fixed area at 4 octets per RFC 6554 (#564) by @JarryShaw in #590
- fix(l2tp): refuse a version nibble other than 2, and settle what IP protocol 115 is (#548) by @JarryShaw in #589
- fix(hopopt,ipv6-opts): size the ILNP nonce with a real ceiling, not a floored one (#601) by @JarryShaw in #607
- fix(corekit): pad a short field read on the tail, not the head (#604) by @JarryShaw in #621
- fix(hip): size the SOLUTION parameter as two whole-octet fields (#608) by @JarryShaw in #629
- fix(corekit): keep SeekableReader's buffer content when truncating it (#622) by @JarryShaw in #633
- fix(tcp): seed
TCP.read's flag accumulator withEnum_Flags(0), not a no-op cast (#616) by @JarryShaw in #634 - fix(pcap):
Frame.lenis the on-wire length,cap_lenthe captured one (#618) by @JarryShaw in #635 - fix(foundation): close the input stream pcapkit opened, not the caller's (#610) by @JarryShaw in #636
- fix(protocol): refuse a construction keyword no signature declares (#617) by @JarryShaw in #640
- fix(corekit): keep SeekableReader's position bookkeeping in step (#643, #644) by @JarryShaw in #663
- fix(hip): PUZZLE and SOLUTION builders must stop inventing wire-format values (#653, #654, #655) by @JarryShaw in #665
- fix(httpv2): restore END_STREAM on rebuild, and seed the parsed flag accumulator as
Flags(#652, #650) by @JarryShaw in #669 - fix(dumpkit): a nameless flag member no longer renders as
Type::None [0](#648) by @JarryShaw in #670 - fix(hip): pad HIP parameters to the record length RFC 7401 gives, not the contents (#651) by @JarryShaw in #664
- fix(pcapng): bound an option's payload to the area its block declares (#594) by @JarryShaw in #676
- fix(const): give the six unguarded registries the same bare-ValueError guard by @JarryShaw in #677
- fix(corekit): refuse truncate on a reader that reports itself unwritable (#645) by @JarryShaw in #680
- fix(pcapng): keep the captured octets every packet block declares (#646) by @JarryShaw in #683
- fix(httpv2): keep the payload an unpadded DATA/HEADERS/PUSH_PROMISE declares by @JarryShaw in #691
- fix(pcapng): stop a negative length reaching a read on a truncated capture (#678) by @JarryShaw in #699
- fix(hip): correct R1_COUNTER's counter width and LOCATOR_SET's Length unit (#672) (#679) by @JarryShaw in #696
- fix(corekit): resolve an unassigned enum value instead of raising aenum's ValueError (#701) by @JarryShaw in #706
- feat(reg)!: split AppType into per-transport registries, dropping the portless rows by @JarryShaw in #754
- fix(reg)!: reject an out-of-range port in AppType.get, and claim each span by transport by @JarryShaw in #764
- fix(fields): fall through to the bounded pseudo-member instead of minting (#575) by @JarryShaw in #771
- fix(const): refuse a multi-bit proto in AppType._dispatch rather than resolving it LSB-first (#759) by @JarryShaw in #783
- feat(corekit,schema,utilities)!: enforce @Final at runtime on Info and Schema (#778) by @JarryShaw in #788
- fix(fields): raise ProtocolError, not struct.error, on a negative resolved field length by @JarryShaw in #811
- feat(reg)!: retype AppType.proto to its own transport, and give register_apptype varargs (#806) by @JarryShaw in #815
- fix(reg)!: drop TransportProtocol's IntFlag base now that nothing composes by @JarryShaw in #836
- fix(vendor): stop get() minting; missing fixed for 21 of 105 (#775) by @JarryShaw in #838
- fix(toolkit): key pyshark link-type resolution on frame.encap_type by @JarryShaw in #850
- fix(ipx): order Socket.missing range branches narrowest-first by @JarryShaw in #847
- fix(reg): emit tcpdump legacy link-type names after current ones by @JarryShaw in #848
- ci: rebuild engine-tests as a Python × engine matrix with three cell outcomes by @JarryShaw in #849
- feat(corekit): add EnumRegistry base for const registries, convert 5 (#775) by @JarryShaw in #855
- refactor(const,vendor): move the generated const-enum template onto EnumRegistry (#775) by @JarryShaw in #858
- fix(corekit): make EnumRegistry.get's no-default marker an identity sentinel (#857) by @JarryShaw in #859
- refactor(const,vendor): apply the mint/unmint criterion ruling to 82 registries (#775) by @JarryShaw in #861
- fix(const,vendor): Old Xerox ethertype range shadowed by IEEE802.3 range by @JarryShaw in #865
- fix(corekit): stop EnumRegistry.get's default from minting by @JarryShaw in #868
- fix(const,vendor): bring 8 bespoke registries onto EnumRegistry, stop them minting by @JarryShaw in #869
- fix(const,vendor): give Method's registered members their str payload (#870) by @JarryShaw in #871
- fix(const,vendor): bring the AppType family onto EnumRegistry, stop it minting (#860) by @JarryShaw in #874
- refactor(vendor,pcapng): generate TLSKeyLabel from the RFC 9850 IANA registry by @JarryShaw in #890
- fix(const,vendor): make Method.get case-sensitive, per RFC 9110 (#896) by @JarryShaw in #907
- fix(ipv6): parse unrecognised extension headers generically (#891) by @JarryShaw in #904
- fix(corekit): export the sentinel objects, not their types by @JarryShaw in #916
- ci(deps): narrow the all extra to core addons, add a dev extra (#910) by @JarryShaw in #914
- refactor(ipv6): rename IPv6_GenericExt to IPv6_Ext and make it the shared base (#917) by @JarryShaw in #924
- refactor(corekit): house all four sentinels in one shared module (#911) by @JarryShaw in #922
- fix(vendor): source ExtensionHeader from the extension-header registry, not the protocol-numbers flag (#925) by @JarryShaw in #926
- fix(corekit,utilities): raise pcapkit exceptions from EnumLookup.get, in stdlib Enum's shape (#923) by @JarryShaw in #927
- refactor(corekit,protocols): normalise the four sentinel objects to SCREAMING_SNAKE (#937) by @JarryShaw in #939
- fix(foundation): declare the engine-typed slots as EngineBase, not Engine by @JarryShaw in #1023
- fix(foundation): name the base class the registrar guard actually checks by @JarryShaw in #1020
- fix(protocols): let Application carry an undissected remainder (#719) by @JarryShaw in #1030
- feat(protocols)!: move OSPF and RARP to the application layer (#719) by @JarryShaw in #1031
- fix(tcp): parse all five MP_CAPABLE lengths of RFC 8684 (#1042) by @JarryShaw in #1048
- fix(protocols)!: rename OSPF_CrytographicAuthentication and group OSPF under the application layer by @JarryShaw in #1116
- fix(httpv2)!: frame Length counts the 9-octet header, so RFC 9113 frames are rejected by @JarryShaw in #1138
- fix(arp): non-IP protocol addresses pack as ASCII text, and hlen/plen are never checked by @JarryShaw in #1145
- fix(tcp): from_data reorders and re-pads TCP options by @JarryShaw in #1163
- fix(protocols): from_data keeps declared lengths on truncated captures by @JarryShaw in #1166
- fix(protocols): a payload layer parsed from a short stream rebuilds default-filled octets by @JarryShaw in #1171
- fix(l2tp): L2TPv2.from_data drops the L flag and the Length field by @JarryShaw in #1174
- fix(l2tpv2): correct the Type enum and L bit against RFC 2661 (#1175) by @JarryShaw in #1183
- fix(ipv6-opts): RPL option drops reserved flag bits on rebuild and rejects RFC 6553 sub-TLVs by @JarryShaw in #1201
- fix(link): ARP family rebuilds InARP/DRARP, any Ethernet hlen, and a ptype/plen mismatch by @JarryShaw in #1224
- fix(link)!: L2TPv2 drops the reserved flag bits on rebuild, and make() drops a lone ns or nr by @JarryShaw in #1226
- fix(sctp): chunk flags, reserved fields and final padding round-trip by @JarryShaw in #1253
- fix(tcp): MPTCP options round-trip byte-exactly (#1212-#1217, #1220) by @JarryShaw in #1254
- fix(ftp,httpv1): FTP and HTTP/1 lines do not rebuild byte for byte by @JarryShaw in #1301
- fix(ospf,ngap): keep the parsed OSPF Packet Length and refuse octets after the NGAP-PDU by @JarryShaw in #1304
- fix(dumpkit)!: output writers drop or corrupt what the packets carried by @JarryShaw in #1305
- fix(ipv6): IPv6 core headers rebuild byte-exactly (#1230, #1231, #1236, #1235) by @JarryShaw in #1307
- fix(ipv6-opts): rebuild HOPOPT and IPv6-Opts option areas byte-exactly by @JarryShaw in #1310
- fix(ipx,ah): IPX from_data raises struct.error; AH reserved field written back as zero by @JarryShaw in #1338
- fix(hip): rebuild parsed packets byte-exactly (Header Length, no parameters, PUZZLE lifetime, reserved bits) by @JarryShaw in #1342
- fix(httpv2): HTTP/2 frames lose octets on rebuild (#1242-#1248, #1251) by @JarryShaw in #1341
- fix(ipv4): rebuild option areas, route slots, timestamps and reserved bits byte-exactly by @JarryShaw in #1344
- fix(mh): keep zero-length PadN, reserved fields and BU/BA flag bits on rebuild by @JarryShaw in #1345
- fix(corekit): IPv4InterfaceField keeps non-netmask masks; OrderedMultiDict deepcopy keeps order by @JarryShaw in #1346
- fix(ftp,httpv1): keep the raw command case, HTTP/1 whitespace and field octets, and parse whole multi-line FTP replies by @JarryShaw in #1347
- fix(tcp)!: reserved bits, post-EOOL octets and the UTO granularity round-trip (#1211, #1218, #1219) by @JarryShaw in #1348
- fix(hip): Locator flags drop the seven bits other than Preferred on rebuild by @JarryShaw in #1367
- fix(pcapng): rebuilt blocks keep their lengths and padding (#1276, #1279, #1280, #1282, #1283, #1284) by @JarryShaw in #1373
- fix(pcapng): blocks and options rebuild as parsed (#1272, #1273, #1277, #1278, #1281, #1286) by @JarryShaw in #1378
- fix(ipv4)!: the TS option zeroes the timestamp slots beyond the pointer on rebuild (#1349) by @JarryShaw in #1390
- fix(protocols)!: a declared length running past the data is accepted and zero-filled on rebuild by @JarryShaw in #1398
- fix(ipv4)!: TS and SEC options do not rebuild byte for byte (#1391, #1392, #1393) by @JarryShaw in #1399
- fix(ipv6)!: a CALIPSO option loses its trailing pad and shrinks its length on rebuild (#1403) by @JarryShaw in #1407
- fix(ipv4,tcp)!: a header length declared past the data zero-fills on rebuild; TS make() rejects string address keys (#1402, #1404) by @JarryShaw in #1411
- fix(pcapng)!: PCAP-NG round-trip follow-ups (#1382, #1383, #1384, #1401, #1405, #1406) by @JarryShaw in #1412
- fix(hip): three BitField namespaces leave reserved bits unnamed, so they rebuild as zero by @JarryShaw in #1419
- fix(pcapng)!: keep malformed journal entries and short packet blocks as captured (#1413, #1414) by @JarryShaw in #1420
- fix(mh): keep the reserved bits of 24 BitField flag namespaces on rebuild by @JarryShaw in #1421
- fix(pcapng)!: keep an SHB or IDB shorter than its fixed fields as captured (#1422) by @JarryShaw in #1425
- fix(ipv4,ipv6)!: keep the octets past Total Length or Payload Length as captured (#1209) by @JarryShaw in #1431
- fix(ipx)!: keep the octets past the IPX Length field as captured (#1433) by @JarryShaw in #1435
- fix(corekit)!: non-zero padding octets are zeroed on rebuild (#1223) by @JarryShaw in #1436
- fix(mh)!: keep the reserved octets MH PaddingField sites capture (#1437) by @JarryShaw in #1442
- fix(ipv6)!: an extension header parsed with extension=True cannot rebuild from its own info (#1446) by @JarryShaw in #1449
- fix(l2tpv2,ospf)!: keep the octets past the Length field as captured (#1455) by @JarryShaw in #1460
- fix(hip)!: parse and keep the two fixed header bits (#1459) by @JarryShaw in #1462
- fix(corekit)!: to_dict() returns an InfoDict, so a repeated IPv6 extension header survives the dict rebuild (#1453) by @JarryShaw in #1466
- fix(udp)!: keep the octets past the UDP Length field as captured (#1461) by @JarryShaw in #1467
- fix(sctp)!: keep the octets after the last whole chunk as captured (#1468) by @JarryShaw in #1472
- fix(pcap,pcapng)!: a cut PCAP header or PCAP-NG block rebuilds as captured (#1470) by @JarryShaw in #1475
- fix(ipv6)!: rebuild a cut extension header chain byte-exact (#1471, #1473) by @JarryShaw in #1476
- refactor(corekit)!: Info.to_dict() returns an OrderedMultiDict; add MultiInfo and OrderedMultiInfo (#1484) by @JarryShaw in #1523
✨ Features
- feat(protocols): opt-in code= registration with enum-type inference for Protocol/ProtocolBase by @JarryShaw in #570
- feat(util): have bump_version.py keep CITATION.cff in step with the bump by @JarryShaw in #625
- feat(reg): expose AppType aliases in repr/str and allow registering them per transport (#807) by @JarryShaw in #837
- docs(changelog): summarise each release with a link to its full entry (#900) by @JarryShaw in #909
- feat(changelog): cite issues, PRs and discussions with Sphinx roles by @JarryShaw in #1008
🐛 Fixes
- fix(vendor): retire the IPX socket scrape, its data source is gone (#507) by @JarryShaw in #511
- fix(foundation): let register_extractor_* accept pcapkit's own built-in classes by @JarryShaw in #523
- fix(vendor): send a descriptive User-Agent and retarget the dead pcapng draft by @JarryShaw in #524
- fix(protocols): repair all entries that name nothing, and guard the class by @JarryShaw in #527
- fix(mh): count a CGA extension's 4-octet header in its reported length by @JarryShaw in #528
- fix(vendor): make the handover_initiate_status crawler reachable (release blocker for
make vendor) by @JarryShaw in #531 - fix(tcp): enforce the SACK length rule its docstring already promised (#519) by @JarryShaw in #535
- fix(protocols): let from_data rebuild a parsed packet by @JarryShaw in #536
- fix(vendor): end the manual-intervention wait when nobody can answer it (#522) by @JarryShaw in #542
- fix(ipv4): terminate the SEC bitmap, reject its terminator bit, and narrow SID to 16 bits by @JarryShaw in #543
- fix(exports): export the 23 public attributes their package all omitted (#533) by @JarryShaw in #544
- fix(corekit): reject a signed= that contradicts a field's fixed sign (#545) by @JarryShaw in #549
- fix(ipv4): three defects in the IPv4 option schemas (#552) by @JarryShaw in #559
- fix(schema): read the MPTCP option length from bit 8, not bit 1 (#553) by @JarryShaw in #558
- fix(schema): stop EnumSchema.registry from retaining a lookup miss (#555) by @JarryShaw in #560
- fix(hip,ipv6-route): stop dropping the ENCRYPTED IV and RPL's pack-time cast (#556) by @JarryShaw in #561
- fix(tcp): give MPTCP real kind/length fields, repairing pack and parse by @JarryShaw in #565
- fix(corekit): bound FieldBase.unpack's rjust() padding to a sane ceiling (#554) by @JarryShaw in #569
- fix(tcp): correct MPTCP option length arithmetic at all six #576 sites by @JarryShaw in #585
- fix(corekit): bound the total zero padding a parse may synthesise (#573) by @JarryShaw in #593
- fix(changelog-md): cite a line the entry has, and accept an anchored :rfc: role (#588, #592) by @JarryShaw in #595
- fix(tcp): resolve the connection flags before building the options (#587) by @JarryShaw in #597
- fix(corekit): recompute _need_process from the width in force, not once from the placeholder (#591) by @JarryShaw in #598
- fix(corekit): size the width repair with a real ceiling, not a floored one (#599) by @JarryShaw in #600
- fix(const): normalise the key get() looks up, and honour its documented default (#582, #583, #584) by @JarryShaw in #596
- fix(generators): spell TCP_BASE's keys the way TCP.make declares them (#602) by @JarryShaw in #609
- fix(pcap): seed the frame byte order under the key the reader consults (#605) by @JarryShaw in #614
- fix(license): start the copyright term at 2017, and drop the end year by @JarryShaw in #630
- fix(packaging): ship CITATION.cff in the source distribution by @JarryShaw in #631
- fix(mh): stop the four flag enums recursing on any non-member value (#623) by @JarryShaw in #632
- fix: import three names used only in string annotations, and correct a false packaging claim (#642) by @JarryShaw in #666
- fix(tcp): drop the doubled separator from four MPTCP error messages (#649) by @JarryShaw in #671
- fix(foundation): give
no_eofa way to stop, so extract() returns (#620) by @JarryShaw in #639 - fix(registry): report the protocol-name collision register_protocol hid (#675) by @JarryShaw in #681
- fix(registry): report the silent schema overwrites, and name what the code-keyed registrars displaced by @JarryShaw in #695
- fix(registry): disambiguate register_protocol's overwrite warning when two classes share a repr by @JarryShaw in #711
- fix(pcapng): bound the skip after a journal binary field to one octet by @JarryShaw in #722
- fix(hip): register R1CounterParameter under HIPv1's code 128 too by @JarryShaw in #721
- fix(pcapng): walk the journal entry instead of splitting it on b'\n\n' by @JarryShaw in #728
- fix(registry): add register_protocol's identity guard to sibling registrars by @JarryShaw in #726
- fix(vendor): derive each crawler's const/ path from vendor/'s own root by @JarryShaw in #741
- fix(foundation): add the #718 identity guard to the five registrars it missed by @JarryShaw in #742
- fix(toolkit): parse PyPCAPFile's dotted-decimal IPv4 text, not packed bytes by @JarryShaw in #747
- fix(engines): un-hexlify pypcapfile frames before decoding them by @JarryShaw in #748
- fix(lint): reach every const/vendor init.py in isort and drop five stale pylint flags by @JarryShaw in #773
- fix(reg): cast TransportProtocol.undefined so mypy infers its own type by @JarryShaw in #777
- fix(dumpkit): escape mapping keys for the plist writer (#772) by @JarryShaw in #784
- fix(http): reach _guess_version's HTTP/2 arm, and resolve PayloadField names by @JarryShaw in #789
- fix: strip a systemd journal entry's own block padding, not its data by @JarryShaw in #795
- fix(http): check the buffer's length, not just the declared one, in HTTP/2's frame guard by @JarryShaw in #802
- fix(vendor): pass regex flags as flags=, not positional count (#796) by @JarryShaw in #813
- fix(http): identify the HTTP version before parsing, not by trial and error (#800) by @JarryShaw in #814
- fix(tcp): repoint TCP:80/8080 at the HTTP version proxy (#682) by @JarryShaw in #821
- fix(fields): distinguish a malformed template from a negative length in FieldBase.length by @JarryShaw in #827
- fix(fields): raise ProtocolError for a NumberField negative resolved length (#828) by @JarryShaw in #829
- fix(corekit): raise ProtocolError for a NumberField negative bit_length (#831) by @JarryShaw in #834
- fix(reg,corekit): retype the registry NULL sentinel and raise ProtocolError from ModuleDescriptor.klass by @JarryShaw in #835
- fix(vendor): make the LinkType legacy-sink rule value-aware by @JarryShaw in #854
- fix(corekit): fall EnumRegistry.get() back to a str key's value (#860) by @JarryShaw in #863
- fix(const,vendor): return the unregistered member instead of re-entering missing (#866) by @JarryShaw in #867
- fix(vendor): make main() exit non-zero when any crawler target raises (#872) by @JarryShaw in #873
- fix(vendor): pin except BaseException and correct a false docstring clause by @JarryShaw in #876
- fix(const,vendor): stop EtherType and Socket minting on an unrecognised value by @JarryShaw in #878
- fix(pcapng): repoint TLSKeyLabel at RFC 9850, add ECH_SECRET/ECH_CONFIG by @JarryShaw in #883
- fix(mh): stop the four RFC-inline helper enums from minting on unassigned bytes by @JarryShaw in #889
- ci(release): gate tag/pypi/conda on their own evidence, not the v* tag by @JarryShaw in #905
- fix(ngap): source ProcedureCode/ProtocolIE from pycrate, stop the shared -1 mint (#880) by @JarryShaw in #899
- fix(const): value-lookup in Method.get, so BASELINE-CONTROL/VERSION-CONTROL resolve (#908) by @JarryShaw in #915
- fix(const,vendor,docs): audit registry case sensitivity, fold FEATCode.get (#903) by @JarryShaw in #913
- fix(corekit): reparent the unblocked non-registry enums onto EnumLookup (#877) by @JarryShaw in #921
- fix(protocols): widen the two kept get overrides in mh.py to accept default by @JarryShaw in #940
- fix(utilities): stop truncating every traceback for a loud BaseError by @JarryShaw in #983
- fix(foundation): raise RegistryError, not a leaked TypeError, for a non-class by @JarryShaw in #1025
- fix(protocols): raise RegistryError for a non-class in seven register guards (#1026) by @JarryShaw in #1028
- fix(foundation): warn once when an extraction engine is unavailable (#1045) by @JarryShaw in #1046
- fix(pcapng): name the Name Resolution Block in its guard messages (#1038) by @JarryShaw in #1047
- fix(httpv1): accept HTTP/1 messages with no header fields (#1041) by @JarryShaw in #1049
- fix(httpv1): rebuild a message whose body is empty (#1050) by @JarryShaw in #1054
- fix(corekit): ProtoChain.add returns stale protocols/aliases by @JarryShaw in #1107
- fix(toolkit): pypcapfile tcp_reassembly sets last one past the segment by @JarryShaw in #1108
- fix(ipv6): _read_ip_hextet slices include the version nibble by @JarryShaw in #1109
- fix(mh): Message ID option always writes and reads a zero fraction by @JarryShaw in #1110
- fix(hip): HIP_CIPHER warns at six Cipher IDs although RFC 7401 allows six by @JarryShaw in #1111
- fix(pcap): _make_magic ignores nanosecond with explicit endian flags; _read_protos ignores size by @JarryShaw in #1112
- fix(foundation): Extractor.output message, make_name registry pollution, scapy engine _offmt by @JarryShaw in #1113
- fix(tcp): NS flag is written by make() but never parsed by @JarryShaw in #1114
- fix(protocols): _make_data returns keys make() does not accept (Frame ts_src, L2TPv2 prio) by @JarryShaw in #1115
- fix(protocols): Quick-Start option readers use schema.func, which exists only under TYPE_CHECKING by @JarryShaw in #1117
- fix(all): pcapkit.all lists OSPF on the Link Layer line by @JarryShaw in #1129
- fix(ethernet): _make_data turns MAC addresses into ASCII hex text by @JarryShaw in #1130
- fix(tcp): User Timeout maker writes length=3; RFC 5482 requires 4 by @JarryShaw in #1131
- fix(protocols): ARP and PCAP-NG pack MAC addresses as ASCII hex text by @JarryShaw in #1137
- fix(hip): HOST_ID packs DI-Type/DI-Length as 4 octets where RFC 7401 has one 16-bit word by @JarryShaw in #1132
- fix(tcp): Quick-Start Response reader reads a stray octet; maker fails below 40 kbps by @JarryShaw in #1135
- fix(all): pcapkit.all.all omits names its packages export by @JarryShaw in #1142
- fix(pcap): Header.pack() writes the same magic for every endian/nanosecond setting; _make_data returns magic_number by @JarryShaw in #1143
- fix(httpv2): SETTINGS ListField reads past the last pair and warns 'packet length < 0' by @JarryShaw in #1146
- fix(pcap): Frame.from_data cannot be called — it has no way to pass num and header by @JarryShaw in #1147
- fix(foundation): restore record_header as the shared global-header step for third-party engines by @JarryShaw in #1149
- fix(http): tighten HTTP/2 version guessing so arbitrary binary is not taken for a DATA frame by @JarryShaw in #1153
- fix(corekit): a length-less SchemaField passes -1 to its schema, so every list item warns 'packet length < 0' by @JarryShaw in #1157
- fix(dumpkit): JSON output for test.pcapng does not parse by @JarryShaw in #1158
- fix(pcap): a lone lilendian/bigendian flag is ignored by Header._make_magic by @JarryShaw in #1159
- fix(hip): HIPv2-only parameters are accepted inside HIPv1 packets by @JarryShaw in #1160
- fix(http): HTTP.from_data raises 'invalid HTTP version: 0' by @JarryShaw in #1162
- fix(extraction): extraction with format='pcap' fails (#1127) by @JarryShaw in #1164
- fix(dumpkit): pcap output drops the input's snaplen, thiszone and sigfigs (#1165) by @JarryShaw in #1168
- fix(protocols): a capture cut inside the IPv4 header rebuilds with a fabricated UDP header by @JarryShaw in #1169
- fix(protocols): understated length_hint and an unguarded next-layer import still fabricate octets by @JarryShaw in #1176
- fix(ipv6-ext): raise the fallback length hint to the RFC 8200 minimum (#1178) by @JarryShaw in #1181
- fix(ipv6): keep the extension-header chain in from_data rebuilds (#1177) by @JarryShaw in #1182
- fix(ipv6-opts): rebuild every MPL seed-id kind from its parsed value (#1185) by @JarryShaw in #1187
- fix(hip): from_data no longer reads alias before _info is set (#1184) by @JarryShaw in #1188
- fix(hip): make() without parameters writes Header Length 0, below the RFC 7401 minimum of 4 by @JarryShaw in #1191
- fix(ipv6-opts): _make_opt_smf_dpd overwrites the parsed DPD mode, so H-DPD rebuilds as I-DPD by @JarryShaw in #1192
- fix(ipv6-opts): SMF_DPD H-DPD with an empty hav raises IndexError instead of ProtocolError by @JarryShaw in #1194
- fix(schema): SMF_DPD option at the end of the header raises TypeError from smf_i_dpd_id_len by @JarryShaw in #1197
- fix(ipv6-opts): RPL option 0x23 raises AttributeError in _read_opt_unassigned by @JarryShaw in #1198
- fix(protocols): make() rejects an enum member name given as str unless a namespace is passed by @JarryShaw in #1227
- fix(toolkit): scapy packet2dict dumps nested packets as {} and mutates its input by @JarryShaw in #1287
- fix(const): OptionType and Command register() round-trip through get() by @JarryShaw in #1311
- fix(corekit): from_dict(to_dict()) loses nested values, and Info.len counts hidden keys by @JarryShaw in #1334
- fix(corekit): signed NumberField decode, zero-length PayloadField, PCAP trailing bytes and empty Raw by @JarryShaw in #1331
- fix(toolkit): dpkt reassembly adapters build their data from dpkt's re-serialised bytes and mutate the packet by @JarryShaw in #1335
- fix(corekit): StringField is not lossless: guessed charset, U+FFFD substitution, and a character-count length by @JarryShaw in #1336
- fix(pcapng): constructed and rebuilt blocks round-trip (#1267, #1268, #1269, #1270, #1271) by @JarryShaw in #1339
- fix(protocol): raw items in a make() list build a packet; str enum names resolve per argument by @JarryShaw in #1352
- fix(const): the Quick-Start function enums reject 9-15, though the field is 4 bits wide by @JarryShaw in #1353
- fix(dumpkit): tree output raises on complex and is undocumented as lossy (#1266) by @JarryShaw in #1366
- fix(reassembly): IP reassembly reports only the octets it holds (truncated fragments, strict runs, zero-length datagrams) by @JarryShaw in #1368
- fix(const): OptionType.register_alias always raises 'not a registered OptionType' by @JarryShaw in #1369
- fix(traceflow): TCP flow labels are not unique, so a second flow with the same label truncates the first flow's file by @JarryShaw in #1371
- fix(schema): Schema.pack keeps option padding, SchemaField spans and iterated keys (#1289, #1291, #1292) by @JarryShaw in #1374
- fix(reassembly): TCP completion from per-buffer gaps, mod-2**32 sequence numbers, FIN waits for reordered data by @JarryShaw in #1375
- fix(registry): foundation registrars restore the built-in a name shipped with (#1363) by @JarryShaw in #1376
- fix(dpkt): extract(engine='dpkt') keeps a frame dpkt cannot parse instead of leaking AttributeError (#1351) by @JarryShaw in #1377
- fix(dumpkit): JSON output of DPKT/Scapy frames grows without bound and fills the disk by @JarryShaw in #1381
- fix(generators): make_samples builds fixtures from the shared checkout, not the tree it runs in by @JarryShaw in #1388
- fix(protocol): main is red, IPv4 make() with an unparsable raw item no longer raises the wrapped error by @JarryShaw in #1395
- fix(engines): the dpkt engine applies the first PCAP-NG interface's linktype and timestamp resolution to every frame by @JarryShaw in #1396
- fix(schema): a SchemaField's unread octets are lost through from_data, so a direct SchemaField rebuilds zero-filled by @JarryShaw in #1397
- fix(protocols): parser registrars warn only when the entry really changes (#1362) by @JarryShaw in #1400
- fix(ipv6): CALIPSO make() writes a corrupt length on overflow and raises raw errors for a bad pad by @JarryShaw in #1409
- fix(pcap): building a frame with snaplen 0 writes a record with no packet data (#1385) by @JarryShaw in #1410
- fix(registry): re-registering a stored ModuleDescriptor keeps it (#1364) by @JarryShaw in #1415
- fix(foundation): number pcapng blocks across the whole file, not per section (#1256) by @JarryShaw in #1426
- fix(generators): correct stale options.py comments and the code they justified (#1337) by @JarryShaw in #1427
- fix(pcapng): keep out-of-range if_tzone as captured and catch every fromtimestamp failure (#1340) by @JarryShaw in #1429
- fix(foundation): keep format='pcap' when an unavailable engine falls back to the default one (#1264) by @JarryShaw in #1430
- fix(ipv6): dissect a jumbogram's payload up to its Jumbo Payload Length (#1434) by @JarryShaw in #1440
- fix(pcapng): keep captured padding octets on rebuild (#1437) by @JarryShaw in #1441
- fix(const): resolve every three-digit FTP reply and HTTP status code (#1443) by @JarryShaw in #1444
- fix(dumpkit): write plist dates to whole seconds so plistlib reads them (#1448) by @JarryShaw in #1450
- fix(protocols): rebuild the payload from info.to_dict() in from_data (#1447) by @JarryShaw in #1452
- fix(ipv6-route): rebuild RPL source routes byte for byte (#1456, #1457) by @JarryShaw in #1463
- fix(schema): a header cut inside a fixed-width field rebuilds as captured (#1458, #1451) by @JarryShaw in #1465
- fix(ospf): rebuild cryptographic authentication from its dict form (#1464) by @JarryShaw in #1469
- fix(sctp): rebuild a last chunk short of its padding as captured (#1474) by @JarryShaw in #1477
- fix(sctp): accept a final parameter or cause short of its padding (#1479) by @JarryShaw in #1481
- fix(sctp): rebuild a Host Name parameter without a NUL terminator as captured (#1482) by @JarryShaw in #1483
- fix(corekit): give unnamed ListField, PayloadField and SchemaField a default name (#1491) by @JarryShaw in #1493
- fix(corekit): an untyped ListField packs the bytes it unpacks (#1489) by @JarryShaw in #1494
- fix(corekit): keep a BitField's unnamed bits as captured (#1487) by @JarryShaw in #1495
- fix(corekit): finalise each non-final Info subclass on its own state (#1490) by @JarryShaw in #1496
- fix(schema): finalise each non-final Schema subclass on its own state (#1498) by @JarryShaw in #1499
- fix(extraction): accept a file object without a name as fin (#1506) by @JarryShaw in #1509
- fix(corekit): keep a NumberField's bits outside bit_length as captured (#1488) by @JarryShaw in #1497
- fix(protocols): restoring a registration puts back the shipped ModuleDescriptor (#1504) by @JarryShaw in #1533
- fix(dumpkit): scale a PCAP trace record's fraction to the trace's resolution (#1500) by @JarryShaw in #1529
- fix(engines): write real PCAP traces for dpkt and scapy (#1507) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1511
- fix(toolkit): accept tshark's True/False TCP flags in the pyshark trace (#1514) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1527
- fix(registry): unregistering a custom protocol removes its name from proto (#1505) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1530
- fix(protocols): dissect an IPv6 extension header behind a first fragment as without it (#1539) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1540
- fix(dumpkit): a PCAP trace writes the octets it has, not a truncated record's claimed length (#1541) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1543
- fix(corekit): copying or pickling a stream proxy no longer recurses (#1524) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1544
- fix(engines): the pyshark engine skips non-packet PCAP-NG blocks (#1515) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1531
- fix(engines): reset the scapy reader's interfaces at each PCAP-NG section (#1522) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1546
- fix(protocols): a later IPv6 fragment's data is raw, not an upper-layer header (#1545) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1552
- fix(protocols): an IPv4 Total Length of 0 is TSO, and one inside the header is bogus (#1547) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1554
- fix(toolkit): the pypcapfile engine warns that it leaves TCP over IPv6 out (#1513) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1535
- fix(toolkit): trace and reassemble a TCP segment whose header the snapshot cut (#1518) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1556
- fix(protocols): a next-layer hit resolves its descriptor instead of memoising the class (#1559) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1561
- fix(protocols): a later IPv4 fragment's data is raw, not an upper-layer header (#1553) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1562
- fix(engines): dpkt float timestamps, Simple Packet Blocks and raw-IP tracing (#1501, #1520, #1548) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1550
- fix(engines): take a scapy packet's link type and clock from its interface (#1503, #1517, #1549) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1563
- fix(reassembly): a TSO fragment's length is its captured length, and RCVBT covers the last block (#1555, #1565) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1564
- fix(engines): require scapy>=2.6.0 in the Scapy and dev extras (#1572) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1578
- fix(protocols): PCAPNG.register restores the shipped descriptor; a zero snaplen drops SPB padding (#1504, #1558) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1573
- fix(engines): the pypcapfile engine reads the PCAP records pypcapfile drops (#1512) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1569
- fix(toolkit): pypcapfile TCP reads past VLAN tags, warns of tunnels, skips later fragments and padding (#1537, #1576, #1577) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1575
- fix(reassembly): only the final fragment's partial block counts, and an oversized datagram never completes (#1566, #1567) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1582
- fix(protocols): drop the warnings of a next layer replaced by Raw (#1580) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1588
- fix(foundation): read every frame from a pipe or non-seekable stream (#1586) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1595
- fix(toolkit): the scapy adapters stop at the IP datagram's declared length (#1584) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1589
- fix(protocols): dissect LINKTYPE_RAW by version nibble; add the BSD loopback layer for LINKTYPE_NULL/LOOP (#1502, #1574) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1594
- fix(reassembly): a datagram too long for its length field never completes (#1585) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1598
- fix(toolkit): pypcapfile checks IPv4 and TCP headers as the default engine does (#1590, #1591, #1592, #1593, #1596, #1597) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1600
- fix(utilities): export hold_warnings in pcapkit.utilities.warnings.all (#1602) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1603
- fix(toolkit): key tunnelled TCP by the innermost IP header (#1581) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1605
- fix(protocols): bound the IPv6 extension-header chain at 32 headers (#1604) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1608
- fix(toolkit): pyshark skips partial TCP headers and traces first fragments (#1611, #1612) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1613
- fix(toolkit): dpkt and scapy check IPv4 headers as the default engine does (#1607) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1614
- fix(protocols): bound a frame's dissection at 64 layers (#1610) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1620
- fix(toolkit): dpkt reads SYN, FIN and RST from the flags octet whatever the NS bit (#1618) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1621
- fix(toolkit): dpkt hands IPv4 reassembly what the default engine does (#1615, #1616) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1622
- fix(toolkit): dpkt and scapy find TCP in IPv4 where the default engine does (#1606, #1617) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1624
- fix(protocols): rebuilding a frame cut at the extension-chain bound warns once (#1619) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1630
- fix(toolkit): scapy cuts 4in6 at each Payload Length and skips ICMP quotes (#1623, #1627) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1631
- fix(toolkit): a copied DecimalTimestamp keeps orig_len under _pydecimal (#1647) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1653
- fix(ci): tag and upload each Conda Update bump exactly once (#1632) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1641
- fix(toolkit): pyshark traces TCP behind an IPv4 extension header as the default engine does (#1625) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1642
- fix(toolkit): scapy reads IP and TCP only in layers the default engine dissects (#1635, #1636) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1652
- fix(toolkit): dpkt reads IPv6 in IPv4, and nothing behind MPLS or Cisco ISL (#1637, #1638, #1646) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1655
- fix(examples): retry the Wireshark sample downloads on 429, 5xx and timeouts (#1658) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1659
- fix(toolkit): dpkt walks IP layers off the octets as the default engine does (#1609, #1626, #1651, #1654) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1662
♻️ Refactoring
- refactor: extract duplicated wire-unit arithmetic across mh/ipv6_route/hopopt/ipv6_opts by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/509
- refactor: import each *Base class under its own name, not the public one by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/750
- refactor(protocols): import ProtocolBase under its own name in the last 54 sites by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/752
- refactor(const): convert AppType's six %-style raises to f-strings (#792) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/797
- refactor(vendor): finish the %-to-f-string sweep on the four bespoke templates by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/803
- refactor(const): f-string the last three %-formatted repr methods (#804) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/817
- docs(http): fix three stale measurements in the guess_version fallback comment by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/826
- refactor(const,vendor): f-string the three remaining %-formatted repr methods by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/830
- test(const): key the manufactured-name exemption on the name shape, not on file paths by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/881
- refactor(enum): use auto() for the three StrEnum classes name.lower() matches by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/885
- refactor(corekit): give EnumRegistry a bare EnumLookup parent carrying get/get_all (#877) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/906
- docs: move the process pages out of the docs top level (#901) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/912
- refactor(const,protocols): reparent the last seven non-registry enums onto EnumLookup by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/932
- refactor(http): move test_start_line and its patterns into the http base module (#1519) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1525
- refactor(corekit): share one PortEnumField across TCP, UDP and SCTP (#1516) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1526
- refactor(corekit): move the stream proxy classes into corekit.io (#1516) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1521
- refactor(schema): share the IPv6-option and byte-order schema helpers (#1519) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1528
- refactor(corekit): merge the two DeferredPacket classes into corekit.packet (#1516) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1532
- refactor(interface): make the registry-entry helpers public in pcapkit.interface.registry (#1519) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1568
- refactor(toolkit): make tcp_segment and its result type public in toolkit.pcap (#1570) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1579
⚙️ CI & Build
- ci: feed the generated CHANGELOG.md to the release body, and gate its drift by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/529
- ci: wire the existing linters into CI as advisory checks by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/626
- ci(release): gate every publishing job on a deployment environment (#641) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/673
- ci(unit-tests): raise pytest job timeouts from 30 to 45 minutes by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/716
- ci(unit-tests): stop the integration job re-running the unit tier by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/727
- ci: parallelise pytest with xdist and drop 3.15 from the blocking matrix by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/725
- ci(gate-only): chain the push gate off Unit Tests instead of re-running it by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/731
- ci(release): key release notes on the real type labels, not just dependencies by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/735
- ci(unit-tests): install DPKT so the dpkt-gated tests actually run by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/737
- ci(unit-tests): install crypto, cli and NGAP for their gated tests by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/740
- ci(lint): make all three isort lines clean and repin lint.yml's counts by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/761
- ci: add a per-engine test job for Scapy, PyShark, PyPCAPFile and pcap-ct by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/755
- ci(deps): install the vendor extra on engine-tests, closing HAS_VENDOR_DEPS (#738) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/774
- test: gate test_isort_clean.py visibly and put isort on the test extra by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/786
- fix(test): gate the re.sub positional-flag DeprecationWarning test on Python 3.13 by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/820
- ci: give the pyshark engine real-capture coverage, and stop a fallback passing as a pass by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/846
- ci: add a single aggregate required-check job to unit-tests.yml by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/856
- ci(release): gate
tagongithub, document the release process by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/893 - docs(ci): document the GitHub Actions workflow graph by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/898
- ci(create-release): scope the cascade-guard comment to the publishing predecessors (#960) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/961
- ci(cron): say Saturday where the cron is Saturday-only (#964) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/965
- test(project): evaluate the release gates' if: expressions (#962) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/966
- test(project): tell == 'false' from != 'true' on an evidence output (#967) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/970
- ci(unit-tests): bound the apt install steps so a mirror stall cannot burn the job (#974) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/976
- ci(tests): add a plain-unittest leg to catch conftest-masked ordering defects by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/984
- docs(pcapkit,ci): cite the issue a defect belongs to, not the pull request (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/982
- ci(tests): run tests/vendor in the unittest-ordering job (#981, #985) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/988
- ci(unittest-ordering): shard the protocols leg into internet and the rest (#1029) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1032
- ci(release): run the full-suite gate only when a release will publish (#1052) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1053
- ci: sync the project board's Status from the state labels by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1057
- ci: bound unittest-leg reimport growth and add stall diagnostics (#1052) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1059
- ci(coverage): report test coverage from a workflow (#1063) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1064
- ci: cut queue pressure in unit-tests (#1052) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1055
- ci(project-status): stop a superseded sync from leaving a red check (#1066) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1071
- ci(unit-tests): widen the apt bounds so a slow mirror still installs tshark by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1309
- ci(unit-tests): coverage combine can silently miss a worker's data file, under-reporting a PR's coverage by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1389
- ci(unit-tests): save each xdist worker's coverage at session finish and keep the process log (#1423) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1424
- ci(unit-tests): cache the tshark .deb files and retry apt on a fallback mirror (#1432) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1438
- ci: weekly CI timing review and per-test timings from the unit legs (#1538) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1542
- ci: queue the ordering cells after the unit legs, run Engines 3.15 on main only, drop Engines (DPKT) (#1538) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1551
- ci(matrix): split Python into supported 3.11-3.15 and non-blocking KTLO 3.8-3.10 (#1633) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1645
- ci(release): Create Release tags and builds the commit its run was created for (#1634) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1656
- ci(python): add 3.7 as a KTLO leg (#1633) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1665
⚡ Performance
- perf(corekit): resolve a ModuleDescriptor through sys.modules, not import_module (#574) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/586
- perf: call field.copy() directly instead of copy.copy(self) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/733
- perf(reg): drop the per-member annotation and TransportProtocol.get() calls by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/769
- perf(const): load the TCP and UDP app-type registries on first use (#1538) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1560
📝 Documentation
- docs: set PCAPKIT_SPHINX before importing pcapkit, not after by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/520
- docs: add CHANGELOG.rst and render it in the Sphinx docs by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/521
- docs: mark the Type Stubs copies of four TypedDicts :no-index: by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/532
- docs(hopopt): cite RFC 8200 section 4.2 for the Opt Data Len sentence (#530) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/538
- docs: correct documentation that stated untrue things (#546) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/550
- docs: say in SECURITY.md that hostile captures are a live risk, not a closed one by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/611
- docs: repair the Code of Conduct's rendering and refresh CONTRIBUTING by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/613
- docs: add CITATION.cff and bring the copyright notice up to date by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/615
- docs: adopt Contributor Covenant 3.0 for the Code of Conduct by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/624
- docs(readme): trim to a landing page and convert to Markdown by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/619
- docs(github): review the non-workflow metadata under .github/ by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/637
- docs(changelog): correct the LICENSE history in the #630 entry by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/638
- docs(contributing): correct four statements the recent merges falsified by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/656
- docs(contributing): the
make vermintrap is the opposite of what was recorded by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/659 - docs: reconcile the Sphinx directives to the contract-versus-recipe tenet (#684) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/694
- fix(traceflow): qualify the bare
Type[Dumper]autodoc references (#709) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/712 - fix(docs): qualify the ambiguous Type refs in the foundation rst tree by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/714
- docs(tests): stop stating how many captures are committed (#700) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/703
- docs(foundation): cite the real class statement in the engine-check note by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/763
- docs: render #771's two unregistered-member helpers in numbers.rst (#780) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/781
- test: reword PcapngUnescapedKeyTests' claims that #784 falsified by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/790
- docs(pcapng): repoint the generator's stale journal-defect citation by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/793
- docs: add pcapkit.version entry and the missing corekit.enum page by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/919
- docs(conventions): harvest the settled rulings, correct the stale prose (#918) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/929
- docs(corekit): add the sentinels API page so conventions.rst references resolve (#934) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/936
- docs(protocols): cite the extension-header registry in ESP/AH, not protocol-numbers-1.csv by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/938
- docs(conventions,const): resolve part B's unresolved cross-references (#934) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/941
- docs(const,vendor): fix RFC anchor typos and missing section- prefixes by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/943
- docs(contributing): split conventions.rst into one file per anchor (#918) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/945
- docs: retarget every dead :rfc:
959sub-section anchor (#944) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/946 - docs(contributing): record the get-override rulings on the conventions page (#918) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/948
- docs(contributing): paraphrase the quoted rulings, and pin claims not wording (#949) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/951
- docs(changelog): shared 1.5.0 changelog — long-lived, merges last (#610, #616, #617, #618, #620) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/657
- docs: tighten demo.rst and the docs landing page (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/954
- docs(contributing): sweep pep.rst and testing.rst (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/955
- docs: cut timed context from the Sphinx prose and root docs (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/953
- docs(contributing): correct pep.rst's release gating description (#956) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/957
- docs(contributing): correct releasing.rst's cascade guard (#958) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/959
- docs(contributing): draw pep.rst's release-trigger chain as a Mermaid graph by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/963
- docs(contributing): sweep the conventions pages for accuracy and concision (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/968
- docs(contributing): heading casing per the #719 ruling by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/971
- docs(sphinx): caption the root toctrees, point the edit button at main (#719, #969) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/972
- docs(sphinx): hide the three root toctrees from the page body by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/975
- docs(contributing): record the documentation house rules (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/977
- docs(contributing): cite the issue, not the pull request, on the conventions pages (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/978
- docs(contributing): record the tests/ and changelog PR-citation exemptions by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/980
- docs(protocols): state the rulings behind mh, vendor and exceptions in our own words by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/991
- docs(corekit): state the sentinel rulings instead of quoting them by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/992
- docs(corekit): state the enum.py rulings as statements, not quotations by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/990
- docs(tests): state the rulings these tests cite instead of quoting them by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/993
- docs(tests): stop crediting the owner with wording he never wrote by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/994
- docs(const,vendor): state the generated files' rulings instead of quoting them by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/996
- docs(corekit,tests): state what the enum tiers actually declare and dispatch by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/997
- docs(sphinx): add opt-in issue, pr and discussion roles and convert the conventions pages by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/998
- docs(tests): stop calling pull requests issues in the const suites by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/999
- docs(corekit): convert bare citations to the issue role in corekit docstrings by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1000
- docs(sphinx): define the wikipedia and iana extlinks roles ahead of first use by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1001
- docs(foundation): convert bare citations to the issue role in docstrings by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1002
- docs(internet): convert bare citations to the issue role in docstrings by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1003
- docs(schema): convert bare citations to the issue role in docstrings by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1004
- docs(vendor,const): convert bare citations to the issue role in generators and generated files by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1005
- docs(tests): stop calling pull requests issues in test prose by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1006
- docs(pep,tests): correct the checksum protocol count and the registry-leak lineage by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1007
- docs(changelog,protocols): credit the registry-leak fixes to the right layer by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1009
- docs(changelog): cut the 1.5.0 entries to what changed and its effect by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1010
- docs: cut the root markdown documents to what a reader needs by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1011
- docs(contributing): cut the contributing pages and repair drifted line references by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1012
- docs: repair the top-level Sphinx pages and cut their timed context by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1014
- docs(foundation): correct the registrar contracts and cut timed context by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1015
- docs(utilities): drop the change-over-time narration from the small subtrees by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1017
- docs(const): state what missing actually does instead of claiming it mints by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1018
- docs(foundation): document the engine members on EngineBase, not Engine (#1024) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1027
- docs(protocols): tighten the transport-layer docstrings and cut timed context (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1034
- docs(protocols): tighten the internet-layer prose and cut timed context (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1035
- docs(protocols): tighten the internet-layer prose and correct stale claims (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1036
- docs(protocols): tighten misc protocol prose and correct the record docs (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1037
- docs(protocols): tighten application, link and root protocol prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1039
- docs(protocols): tighten the schema prose and cut timed context (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1040
- docs(autodoc): cut timed context from the non-protocol autodoc pages (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1043
- docs(protocols): repair the protocol pages and cut their restatement (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1044
- docs: tighten utilities, foundation, corekit, dumpkit and toolkit prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1051
- docs: close the #719 sweep's last three leftovers (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1056
- docs(tests): tighten the foundation and corekit test prose from the post-sweep merges (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1072
- docs(tests): tighten the protocols test prose from the post-sweep merges (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1073
- docs(contributing): tighten the prose from the post-sweep merges (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1075
- docs(tests): tighten the shared test-support prose from the post-sweep merges (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1074
- docs(protocols): second-round pass over the data-model prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1080
- docs(protocols): second-round pass over the internet-layer prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1081
- docs(protocols): second-round pass over the application-layer prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1082
- docs(protocols): second-round pass over the schema prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1083
- docs(foundation): second-round pass over the foundation prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1084
- docs: second-round pass over the remaining Sphinx pages and root docs (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1085
- docs(protocols): second-round pass over the link, misc, transport and root protocol prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1087
- docs(changelog): second-round concision pass over 1.5.0 (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1088
- docs(protocols): second-round pass over the protocol pages (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1086
- docs(corekit): second-round pass over corekit, dumpkit, toolkit, utilities and interface prose (#719) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1089
- docs(protocols): Protocol docstring claims it is the base of all protocol families by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1106
- docs: prose sweep after the defect wave (schema-data) (#1103) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1179
- docs: prose sweep after the defect wave (protocols) (#1103) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1180
- docs: prose sweep after the defect wave (foundation-docs) (#1103) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1186
- docs(conventions): a test-coverage convention by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1225
- docs(engines): the dpkt engine silently drops PCAP-NG Simple Packet Blocks by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1370
- docs(sctp): a parsed Host Name may lack its null terminator by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1486
- docs(reassembly): a fragment after its datagram completes starts a new buffer (#1507) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1510
🧹 Chores
- chore(examples): stop tracking the four rendered capture reports (#685) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/697
- chore: add isort to Pipfile's dev-packages so
make isortresolves it by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/812 - chore: generate pyshark's encap-type and filter-name maps from a util script by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/853
- chore(deps): add PyYAML to the test extra (#1076) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1078
- chore(github): add a release commit-type box to the PR template by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1105
🧪 Tests
- test: sort sample_path() calls into real source order in the tier guard by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/510
- test: pin the truncated-data half of the #431 short-read accommodation by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/578
- test: correct docstrings on the #572 truncated-option tests by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/580
- test(utilities,foundation): pin the quiet StreamEOFError convention and register_extractor_engine's keyword by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/577
- test(tcp): reach the MP_JOIN dispatchers through TCP(), not a hand-written _flags (#603) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/612
- test(tcp): expect the short-read padding on the tail, repairing
main(#604) (#621) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/627 - test(tcp): retarget the last assertion pinning the old padding side (#604) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/628
- fix(tests): restore sys.modules after a test installs a stand-in module (#660) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/662
- fix(tests): put sys.modules back after a test loads modules from source (#674) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/686
- fix(tests): keep a faked version and hand-bound stand-ins inside the test that made them (#687, #688) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/693
- fix(tests): derive the nameless-flag probe from each registry's own width (#702) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/705
- fix(tests): complete the warm-up list #693 left resting on someone else's imports by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/698
- test: map mypy in MODULE_PROVIDERS and name the module an unmapped lookup wanted by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/782
- test(const): fix the stale StrEnum docstring and rename EXCLUDED_STILL_BESPOKE by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/894
- test(prose): correct a stale PR state and two issue/PR mislabels by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/979
- test(vendor): re-resolve VendorRuntimeWarning fresh per generation (#985) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/986
- test: make the time_limit hang guard robust to slow runners (#1058) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1061
- test(project-status): make the workflow-injection guard fail closed (#1060) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1067
- test(project-status): guard shell: against expression injection (#1068) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1069
- test: re-import pcapkit only where isolation needs it (#1065) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1070
- test(project-status): guard container/services options and working-directory against expressions (#1077) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1079
- test(generators): HIP_TRANSFORM is generated into a HIPv2 packet although it is HIPv1-only by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1128
- test(generators): HTTP/2 sample frames are all written on stream 0 by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1161
- test(corekit): test_sentinel_exports_unit passes in the corekit unittest leg by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1386
- test(schema): every BitField namespace covers all of its bits by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1416
- test(generators): scale the option generator's per-case deadline by PCAPKIT_TEST_TIMEOUT_SCALE (#1428) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1439
- test: capture-driven parse→rebuild and dumper round trips (#1202) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1445
- test(protocols): edge-case round trips for every layer family (#1202) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1454
- test(integration): skip upstream-pinned PCAP-NG counts on a stand-in fixture (#1478) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1480
- test(corekit): field, schema and Info round trips (#1202) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1492
- test(foundation): reassembly, traceflow, engine and registry round trips (#1202) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1508
- test(foundation): retry a pyshark engine run once on a tshark crash (#1534) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1536
- test: keep the per-class pcapkit import in 12 classes that re-imported per test (#1538) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1557
- test(foundation): sequence the no_eof growing-file append on end of stream, not a timer (#1583) by @JarryShaw in https://github.com/JarryShaw/PyPCAPKit/pull/1587
👒 Dependencies
- Scheduled weekly dependency update for week 38 by @pyup-bot in https://github.com/JarryShaw/PyPCAPKit/pull/581
- Scheduled weekly dependency update for week 40 by @pyup-bot in https://github.com/JarryShaw/PyPCAPKit/pull/1033
🏕 Changes
- Scheduled weekly dependency update for week 41 by @pyup-bot in https://github.com/JarryShaw/PyPCAPKit/pull/1629
Full Changelog: v1.5.0b3...v1.5.0b11