pypcapkit 1.3.3.post1__cp313-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pcapkit/__init__.py +126 -0
- pcapkit/__main__.py +138 -0
- pcapkit/all.py +136 -0
- pcapkit/const/__init__.py +81 -0
- pcapkit/const/arp/__init__.py +25 -0
- pcapkit/const/arp/hardware.py +181 -0
- pcapkit/const/arp/operation.py +131 -0
- pcapkit/const/ftp/__init__.py +25 -0
- pcapkit/const/ftp/command.py +309 -0
- pcapkit/const/ftp/return_code.py +304 -0
- pcapkit/const/hip/__init__.py +94 -0
- pcapkit/const/hip/certificate.py +77 -0
- pcapkit/const/hip/cipher.py +65 -0
- pcapkit/const/hip/di.py +59 -0
- pcapkit/const/hip/ecdsa_curve.py +59 -0
- pcapkit/const/hip/ecdsa_low_curve.py +56 -0
- pcapkit/const/hip/eddsa_curve.py +65 -0
- pcapkit/const/hip/esp_transform_suite.py +98 -0
- pcapkit/const/hip/group.py +86 -0
- pcapkit/const/hip/hi_algorithm.py +86 -0
- pcapkit/const/hip/hit_suite.py +68 -0
- pcapkit/const/hip/nat_traversal.py +62 -0
- pcapkit/const/hip/notify_message.py +200 -0
- pcapkit/const/hip/packet.py +89 -0
- pcapkit/const/hip/parameter.py +377 -0
- pcapkit/const/hip/registration.py +68 -0
- pcapkit/const/hip/registration_failure.py +84 -0
- pcapkit/const/hip/suite.py +71 -0
- pcapkit/const/hip/transport.py +59 -0
- pcapkit/const/http/__init__.py +39 -0
- pcapkit/const/http/error_code.py +95 -0
- pcapkit/const/http/frame.py +95 -0
- pcapkit/const/http/method.py +184 -0
- pcapkit/const/http/setting.py +96 -0
- pcapkit/const/http/status_code.py +294 -0
- pcapkit/const/ipv4/__init__.py +57 -0
- pcapkit/const/ipv4/classification_level.py +64 -0
- pcapkit/const/ipv4/option_class.py +55 -0
- pcapkit/const/ipv4/option_number.py +137 -0
- pcapkit/const/ipv4/protection_authority.py +63 -0
- pcapkit/const/ipv4/qs_function.py +51 -0
- pcapkit/const/ipv4/router_alert.py +251 -0
- pcapkit/const/ipv4/tos_del.py +51 -0
- pcapkit/const/ipv4/tos_ecn.py +55 -0
- pcapkit/const/ipv4/tos_pre.py +63 -0
- pcapkit/const/ipv4/tos_rel.py +51 -0
- pcapkit/const/ipv4/tos_thr.py +51 -0
- pcapkit/const/ipv4/ts_flag.py +53 -0
- pcapkit/const/ipv6/__init__.py +53 -0
- pcapkit/const/ipv6/extension_header.py +66 -0
- pcapkit/const/ipv6/option.py +137 -0
- pcapkit/const/ipv6/option_action.py +55 -0
- pcapkit/const/ipv6/qs_function.py +51 -0
- pcapkit/const/ipv6/router_alert.py +266 -0
- pcapkit/const/ipv6/routing.py +80 -0
- pcapkit/const/ipv6/seed_id.py +55 -0
- pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
- pcapkit/const/ipv6/tagger_id.py +62 -0
- pcapkit/const/ipx/__init__.py +27 -0
- pcapkit/const/ipx/packet.py +72 -0
- pcapkit/const/ipx/socket.py +104 -0
- pcapkit/const/l2tp/__init__.py +21 -0
- pcapkit/const/l2tp/type.py +51 -0
- pcapkit/const/mh/__init__.py +204 -0
- pcapkit/const/mh/access_type.py +92 -0
- pcapkit/const/mh/ack_status_code.py +71 -0
- pcapkit/const/mh/ani_suboption.py +74 -0
- pcapkit/const/mh/auth_subtype.py +53 -0
- pcapkit/const/mh/binding_ack_flag.py +66 -0
- pcapkit/const/mh/binding_error.py +51 -0
- pcapkit/const/mh/binding_revocation.py +59 -0
- pcapkit/const/mh/binding_update_flag.py +81 -0
- pcapkit/const/mh/cga_extension.py +66 -0
- pcapkit/const/mh/cga_sec.py +57 -0
- pcapkit/const/mh/cga_type.py +68 -0
- pcapkit/const/mh/dhcp_support_mode.py +53 -0
- pcapkit/const/mh/dns_status_code.py +65 -0
- pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
- pcapkit/const/mh/dsmipv6_home_address.py +74 -0
- pcapkit/const/mh/enumerating_algorithm.py +56 -0
- pcapkit/const/mh/fb_ack_status.py +62 -0
- pcapkit/const/mh/fb_action.py +71 -0
- pcapkit/const/mh/fb_indication_trigger.py +65 -0
- pcapkit/const/mh/fb_type.py +59 -0
- pcapkit/const/mh/flow_id_status.py +77 -0
- pcapkit/const/mh/flow_id_suboption.py +71 -0
- pcapkit/const/mh/handoff_type.py +71 -0
- pcapkit/const/mh/handover_ack_flag.py +54 -0
- pcapkit/const/mh/handover_ack_status.py +92 -0
- pcapkit/const/mh/handover_initiate_flag.py +57 -0
- pcapkit/const/mh/handover_initiate_status.py +62 -0
- pcapkit/const/mh/home_address_reply.py +71 -0
- pcapkit/const/mh/lla_code.py +63 -0
- pcapkit/const/mh/lma_mag_suboption.py +59 -0
- pcapkit/const/mh/mn_group_id.py +59 -0
- pcapkit/const/mh/mn_id_subtype.py +77 -0
- pcapkit/const/mh/operator_id.py +63 -0
- pcapkit/const/mh/option.py +260 -0
- pcapkit/const/mh/packet.py +119 -0
- pcapkit/const/mh/qos_attribute.py +89 -0
- pcapkit/const/mh/revocation_status_code.py +83 -0
- pcapkit/const/mh/revocation_trigger.py +86 -0
- pcapkit/const/mh/status_code.py +232 -0
- pcapkit/const/mh/traffic_selector.py +62 -0
- pcapkit/const/mh/upa_status.py +71 -0
- pcapkit/const/mh/upn_reason.py +80 -0
- pcapkit/const/ospf/__init__.py +27 -0
- pcapkit/const/ospf/authentication.py +65 -0
- pcapkit/const/ospf/packet.py +71 -0
- pcapkit/const/pcapng/__init__.py +51 -0
- pcapkit/const/pcapng/block_type.py +152 -0
- pcapkit/const/pcapng/filter_type.py +48 -0
- pcapkit/const/pcapng/hash_algorithm.py +59 -0
- pcapkit/const/pcapng/option_type.py +233 -0
- pcapkit/const/pcapng/record_type.py +57 -0
- pcapkit/const/pcapng/secrets_type.py +56 -0
- pcapkit/const/pcapng/verdict_type.py +53 -0
- pcapkit/const/reg/__init__.py +34 -0
- pcapkit/const/reg/apptype.py +32702 -0
- pcapkit/const/reg/ethertype.py +714 -0
- pcapkit/const/reg/linktype.py +902 -0
- pcapkit/const/reg/transtype.py +523 -0
- pcapkit/const/tcp/__init__.py +35 -0
- pcapkit/const/tcp/checksum.py +55 -0
- pcapkit/const/tcp/flags.py +73 -0
- pcapkit/const/tcp/mp_tcp_option.py +80 -0
- pcapkit/const/tcp/option.py +198 -0
- pcapkit/const/vlan/__init__.py +23 -0
- pcapkit/const/vlan/priority_level.py +71 -0
- pcapkit/corekit/__init__.py +59 -0
- pcapkit/corekit/fields/__init__.py +45 -0
- pcapkit/corekit/fields/collections.py +282 -0
- pcapkit/corekit/fields/field.py +269 -0
- pcapkit/corekit/fields/ipaddress.py +274 -0
- pcapkit/corekit/fields/misc.py +722 -0
- pcapkit/corekit/fields/numbers.py +375 -0
- pcapkit/corekit/fields/strings.py +245 -0
- pcapkit/corekit/infoclass.py +394 -0
- pcapkit/corekit/io.py +506 -0
- pcapkit/corekit/module.py +39 -0
- pcapkit/corekit/multidict.py +626 -0
- pcapkit/corekit/protochain.py +263 -0
- pcapkit/corekit/version.py +33 -0
- pcapkit/dumpkit/__init__.py +15 -0
- pcapkit/dumpkit/common.py +199 -0
- pcapkit/dumpkit/null.py +77 -0
- pcapkit/dumpkit/pcap.py +144 -0
- pcapkit/foundation/__init__.py +45 -0
- pcapkit/foundation/engines/__init__.py +36 -0
- pcapkit/foundation/engines/dpkt.py +230 -0
- pcapkit/foundation/engines/engine.py +194 -0
- pcapkit/foundation/engines/pcap.py +188 -0
- pcapkit/foundation/engines/pcapng.py +310 -0
- pcapkit/foundation/engines/pyshark.py +166 -0
- pcapkit/foundation/engines/scapy.py +161 -0
- pcapkit/foundation/extraction.py +915 -0
- pcapkit/foundation/reassembly/__init__.py +49 -0
- pcapkit/foundation/reassembly/data/__init__.py +48 -0
- pcapkit/foundation/reassembly/data/ip.py +117 -0
- pcapkit/foundation/reassembly/data/tcp.py +145 -0
- pcapkit/foundation/reassembly/ip.py +192 -0
- pcapkit/foundation/reassembly/ipv4.py +50 -0
- pcapkit/foundation/reassembly/ipv6.py +50 -0
- pcapkit/foundation/reassembly/reassembly.py +389 -0
- pcapkit/foundation/reassembly/tcp.py +249 -0
- pcapkit/foundation/registry/__init__.py +41 -0
- pcapkit/foundation/registry/foundation.py +327 -0
- pcapkit/foundation/registry/protocols.py +885 -0
- pcapkit/foundation/traceflow/__init__.py +44 -0
- pcapkit/foundation/traceflow/data/__init__.py +30 -0
- pcapkit/foundation/traceflow/data/tcp.py +105 -0
- pcapkit/foundation/traceflow/tcp.py +159 -0
- pcapkit/foundation/traceflow/traceflow.py +390 -0
- pcapkit/interface/__init__.py +22 -0
- pcapkit/interface/core.py +185 -0
- pcapkit/interface/misc.py +120 -0
- pcapkit/protocols/__init__.py +85 -0
- pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
- pcapkit/protocols/application/NotImplemented/dns.py +0 -0
- pcapkit/protocols/application/NotImplemented/imap.py +0 -0
- pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
- pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
- pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
- pcapkit/protocols/application/NotImplemented/pop.py +0 -0
- pcapkit/protocols/application/NotImplemented/rip.py +0 -0
- pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/sip.py +0 -0
- pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
- pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
- pcapkit/protocols/application/NotImplemented/tls.py +0 -0
- pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
- pcapkit/protocols/application/__init__.py +34 -0
- pcapkit/protocols/application/application.py +114 -0
- pcapkit/protocols/application/ftp.py +206 -0
- pcapkit/protocols/application/http.py +176 -0
- pcapkit/protocols/application/httpv1.py +320 -0
- pcapkit/protocols/application/httpv2.py +1255 -0
- pcapkit/protocols/data/__init__.py +192 -0
- pcapkit/protocols/data/application/__init__.py +57 -0
- pcapkit/protocols/data/application/ftp.py +59 -0
- pcapkit/protocols/data/application/httpv1.py +79 -0
- pcapkit/protocols/data/application/httpv2.py +293 -0
- pcapkit/protocols/data/data.py +25 -0
- pcapkit/protocols/data/internet/__init__.py +298 -0
- pcapkit/protocols/data/internet/ah.py +31 -0
- pcapkit/protocols/data/internet/hip.py +804 -0
- pcapkit/protocols/data/internet/hopopt.py +351 -0
- pcapkit/protocols/data/internet/ipv4.py +369 -0
- pcapkit/protocols/data/internet/ipv6.py +67 -0
- pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
- pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
- pcapkit/protocols/data/internet/ipv6_route.py +86 -0
- pcapkit/protocols/data/internet/ipx.py +56 -0
- pcapkit/protocols/data/internet/mh.py +509 -0
- pcapkit/protocols/data/link/__init__.py +33 -0
- pcapkit/protocols/data/link/arp.py +74 -0
- pcapkit/protocols/data/link/ethernet.py +28 -0
- pcapkit/protocols/data/link/l2tp.py +63 -0
- pcapkit/protocols/data/link/ospf.py +58 -0
- pcapkit/protocols/data/link/vlan.py +42 -0
- pcapkit/protocols/data/misc/__init__.py +109 -0
- pcapkit/protocols/data/misc/null.py +18 -0
- pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
- pcapkit/protocols/data/misc/pcap/frame.py +56 -0
- pcapkit/protocols/data/misc/pcap/header.py +53 -0
- pcapkit/protocols/data/misc/pcapng.py +925 -0
- pcapkit/protocols/data/misc/raw.py +25 -0
- pcapkit/protocols/data/protocol.py +32 -0
- pcapkit/protocols/data/transport/__init__.py +71 -0
- pcapkit/protocols/data/transport/tcp.py +555 -0
- pcapkit/protocols/data/transport/udp.py +29 -0
- pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
- pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
- pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
- pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
- pcapkit/protocols/internet/__init__.py +43 -0
- pcapkit/protocols/internet/ah.py +275 -0
- pcapkit/protocols/internet/hip.py +4727 -0
- pcapkit/protocols/internet/hopopt.py +1879 -0
- pcapkit/protocols/internet/internet.py +240 -0
- pcapkit/protocols/internet/ip.py +51 -0
- pcapkit/protocols/internet/ipsec.py +50 -0
- pcapkit/protocols/internet/ipv4.py +1782 -0
- pcapkit/protocols/internet/ipv6.py +361 -0
- pcapkit/protocols/internet/ipv6_frag.py +258 -0
- pcapkit/protocols/internet/ipv6_opts.py +1890 -0
- pcapkit/protocols/internet/ipv6_route.py +710 -0
- pcapkit/protocols/internet/ipx.py +230 -0
- pcapkit/protocols/internet/mh.py +2764 -0
- pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
- pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
- pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
- pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
- pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
- pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
- pcapkit/protocols/link/__init__.py +35 -0
- pcapkit/protocols/link/arp.py +421 -0
- pcapkit/protocols/link/ethernet.py +248 -0
- pcapkit/protocols/link/l2tp.py +267 -0
- pcapkit/protocols/link/link.py +140 -0
- pcapkit/protocols/link/ospf.py +342 -0
- pcapkit/protocols/link/rarp.py +82 -0
- pcapkit/protocols/link/vlan.py +225 -0
- pcapkit/protocols/misc/__init__.py +37 -0
- pcapkit/protocols/misc/null.py +129 -0
- pcapkit/protocols/misc/pcap/__init__.py +17 -0
- pcapkit/protocols/misc/pcap/frame.py +478 -0
- pcapkit/protocols/misc/pcap/header.py +358 -0
- pcapkit/protocols/misc/pcapng.py +5520 -0
- pcapkit/protocols/misc/raw.py +180 -0
- pcapkit/protocols/protocol.py +1216 -0
- pcapkit/protocols/schema/__init__.py +140 -0
- pcapkit/protocols/schema/application/__init__.py +40 -0
- pcapkit/protocols/schema/application/ftp.py +21 -0
- pcapkit/protocols/schema/application/httpv1.py +21 -0
- pcapkit/protocols/schema/application/httpv2.py +384 -0
- pcapkit/protocols/schema/internet/__init__.py +294 -0
- pcapkit/protocols/schema/internet/ah.py +40 -0
- pcapkit/protocols/schema/internet/hip.py +1184 -0
- pcapkit/protocols/schema/internet/hopopt.py +679 -0
- pcapkit/protocols/schema/internet/ipv4.py +576 -0
- pcapkit/protocols/schema/internet/ipv6.py +63 -0
- pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
- pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
- pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
- pcapkit/protocols/schema/internet/ipx.py +40 -0
- pcapkit/protocols/schema/internet/mh.py +718 -0
- pcapkit/protocols/schema/link/__init__.py +19 -0
- pcapkit/protocols/schema/link/arp.py +39 -0
- pcapkit/protocols/schema/link/ethernet.py +51 -0
- pcapkit/protocols/schema/link/l2tp.py +88 -0
- pcapkit/protocols/schema/link/ospf.py +90 -0
- pcapkit/protocols/schema/link/vlan.py +69 -0
- pcapkit/protocols/schema/misc/__init__.py +108 -0
- pcapkit/protocols/schema/misc/null.py +18 -0
- pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
- pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
- pcapkit/protocols/schema/misc/pcap/header.py +63 -0
- pcapkit/protocols/schema/misc/pcapng.py +1689 -0
- pcapkit/protocols/schema/misc/raw.py +24 -0
- pcapkit/protocols/schema/schema.py +809 -0
- pcapkit/protocols/schema/transport/__init__.py +69 -0
- pcapkit/protocols/schema/transport/tcp.py +928 -0
- pcapkit/protocols/schema/transport/udp.py +90 -0
- pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
- pcapkit/protocols/transport/__init__.py +27 -0
- pcapkit/protocols/transport/tcp.py +3025 -0
- pcapkit/protocols/transport/transport.py +158 -0
- pcapkit/protocols/transport/udp.py +214 -0
- pcapkit/py.typed +0 -0
- pcapkit/toolkit/__init__.py +57 -0
- pcapkit/toolkit/dpkt.py +306 -0
- pcapkit/toolkit/pcap.py +212 -0
- pcapkit/toolkit/pcapng.py +251 -0
- pcapkit/toolkit/pyshark.py +99 -0
- pcapkit/toolkit/scapy.py +297 -0
- pcapkit/utilities/__init__.py +20 -0
- pcapkit/utilities/compat.py +196 -0
- pcapkit/utilities/decorators.py +192 -0
- pcapkit/utilities/exceptions.py +365 -0
- pcapkit/utilities/logging.py +55 -0
- pcapkit/utilities/warnings.py +185 -0
- pcapkit/vendor/__init__.py +105 -0
- pcapkit/vendor/__main__.py +92 -0
- pcapkit/vendor/arp/__init__.py +27 -0
- pcapkit/vendor/arp/hardware.py +29 -0
- pcapkit/vendor/arp/operation.py +29 -0
- pcapkit/vendor/default.py +474 -0
- pcapkit/vendor/ftp/__init__.py +27 -0
- pcapkit/vendor/ftp/command.py +244 -0
- pcapkit/vendor/ftp/return_code.py +256 -0
- pcapkit/vendor/hip/__init__.py +94 -0
- pcapkit/vendor/hip/certificate.py +29 -0
- pcapkit/vendor/hip/cipher.py +29 -0
- pcapkit/vendor/hip/di.py +29 -0
- pcapkit/vendor/hip/ecdsa_curve.py +29 -0
- pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
- pcapkit/vendor/hip/eddsa_curve.py +85 -0
- pcapkit/vendor/hip/esp_transform_suite.py +29 -0
- pcapkit/vendor/hip/group.py +87 -0
- pcapkit/vendor/hip/hi_algorithm.py +29 -0
- pcapkit/vendor/hip/hit_suite.py +29 -0
- pcapkit/vendor/hip/nat_traversal.py +29 -0
- pcapkit/vendor/hip/notify_message.py +29 -0
- pcapkit/vendor/hip/packet.py +88 -0
- pcapkit/vendor/hip/parameter.py +88 -0
- pcapkit/vendor/hip/registration.py +29 -0
- pcapkit/vendor/hip/registration_failure.py +29 -0
- pcapkit/vendor/hip/suite.py +29 -0
- pcapkit/vendor/hip/transport.py +29 -0
- pcapkit/vendor/http/__init__.py +39 -0
- pcapkit/vendor/http/error_code.py +95 -0
- pcapkit/vendor/http/frame.py +91 -0
- pcapkit/vendor/http/method.py +167 -0
- pcapkit/vendor/http/setting.py +93 -0
- pcapkit/vendor/http/status_code.py +185 -0
- pcapkit/vendor/ipv4/__init__.py +57 -0
- pcapkit/vendor/ipv4/classification_level.py +91 -0
- pcapkit/vendor/ipv4/option_class.py +80 -0
- pcapkit/vendor/ipv4/option_number.py +105 -0
- pcapkit/vendor/ipv4/protection_authority.py +84 -0
- pcapkit/vendor/ipv4/qs_function.py +78 -0
- pcapkit/vendor/ipv4/router_alert.py +93 -0
- pcapkit/vendor/ipv4/tos_del.py +78 -0
- pcapkit/vendor/ipv4/tos_ecn.py +95 -0
- pcapkit/vendor/ipv4/tos_pre.py +84 -0
- pcapkit/vendor/ipv4/tos_rel.py +78 -0
- pcapkit/vendor/ipv4/tos_thr.py +77 -0
- pcapkit/vendor/ipv4/ts_flag.py +79 -0
- pcapkit/vendor/ipv6/__init__.py +53 -0
- pcapkit/vendor/ipv6/extension_header.py +171 -0
- pcapkit/vendor/ipv6/option.py +104 -0
- pcapkit/vendor/ipv6/option_action.py +90 -0
- pcapkit/vendor/ipv6/qs_function.py +78 -0
- pcapkit/vendor/ipv6/router_alert.py +93 -0
- pcapkit/vendor/ipv6/routing.py +87 -0
- pcapkit/vendor/ipv6/seed_id.py +81 -0
- pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
- pcapkit/vendor/ipv6/tagger_id.py +81 -0
- pcapkit/vendor/ipx/__init__.py +37 -0
- pcapkit/vendor/ipx/packet.py +123 -0
- pcapkit/vendor/ipx/socket.py +125 -0
- pcapkit/vendor/l2tp/__init__.py +21 -0
- pcapkit/vendor/l2tp/type.py +78 -0
- pcapkit/vendor/mh/__init__.py +204 -0
- pcapkit/vendor/mh/access_type.py +87 -0
- pcapkit/vendor/mh/ack_status_code.py +88 -0
- pcapkit/vendor/mh/ani_suboption.py +88 -0
- pcapkit/vendor/mh/auth_subtype.py +83 -0
- pcapkit/vendor/mh/binding_ack_flag.py +148 -0
- pcapkit/vendor/mh/binding_error.py +78 -0
- pcapkit/vendor/mh/binding_revocation.py +87 -0
- pcapkit/vendor/mh/binding_update_flag.py +147 -0
- pcapkit/vendor/mh/cga_extension.py +91 -0
- pcapkit/vendor/mh/cga_sec.py +91 -0
- pcapkit/vendor/mh/cga_type.py +74 -0
- pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
- pcapkit/vendor/mh/dns_status_code.py +87 -0
- pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
- pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
- pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
- pcapkit/vendor/mh/fb_ack_status.py +87 -0
- pcapkit/vendor/mh/fb_action.py +88 -0
- pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
- pcapkit/vendor/mh/fb_type.py +88 -0
- pcapkit/vendor/mh/flow_id_status.py +87 -0
- pcapkit/vendor/mh/flow_id_suboption.py +87 -0
- pcapkit/vendor/mh/handoff_type.py +87 -0
- pcapkit/vendor/mh/handover_ack_flag.py +143 -0
- pcapkit/vendor/mh/handover_ack_status.py +87 -0
- pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
- pcapkit/vendor/mh/handover_initiate_status.py +87 -0
- pcapkit/vendor/mh/home_address_reply.py +87 -0
- pcapkit/vendor/mh/lla_code.py +97 -0
- pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
- pcapkit/vendor/mh/mn_group_id.py +87 -0
- pcapkit/vendor/mh/mn_id_subtype.py +87 -0
- pcapkit/vendor/mh/operator_id.py +87 -0
- pcapkit/vendor/mh/option.py +83 -0
- pcapkit/vendor/mh/packet.py +82 -0
- pcapkit/vendor/mh/qos_attribute.py +87 -0
- pcapkit/vendor/mh/revocation_status_code.py +87 -0
- pcapkit/vendor/mh/revocation_trigger.py +87 -0
- pcapkit/vendor/mh/status_code.py +91 -0
- pcapkit/vendor/mh/traffic_selector.py +87 -0
- pcapkit/vendor/mh/upa_status.py +87 -0
- pcapkit/vendor/mh/upn_reason.py +87 -0
- pcapkit/vendor/ospf/__init__.py +27 -0
- pcapkit/vendor/ospf/authentication.py +29 -0
- pcapkit/vendor/ospf/packet.py +29 -0
- pcapkit/vendor/pcapng/__init__.py +51 -0
- pcapkit/vendor/pcapng/block_type.py +94 -0
- pcapkit/vendor/pcapng/filter_type.py +77 -0
- pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
- pcapkit/vendor/pcapng/option_type.py +287 -0
- pcapkit/vendor/pcapng/record_type.py +81 -0
- pcapkit/vendor/pcapng/secrets_type.py +81 -0
- pcapkit/vendor/pcapng/verdict_type.py +79 -0
- pcapkit/vendor/reg/__init__.py +34 -0
- pcapkit/vendor/reg/apptype.py +338 -0
- pcapkit/vendor/reg/ethertype.py +121 -0
- pcapkit/vendor/reg/linktype.py +110 -0
- pcapkit/vendor/reg/transtype.py +111 -0
- pcapkit/vendor/tcp/__init__.py +35 -0
- pcapkit/vendor/tcp/checksum.py +80 -0
- pcapkit/vendor/tcp/flags.py +149 -0
- pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
- pcapkit/vendor/tcp/option.py +103 -0
- pcapkit/vendor/vlan/__init__.py +23 -0
- pcapkit/vendor/vlan/priority_level.py +97 -0
- pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
- pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
- pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
- pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
- pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
- pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,394 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Info Class
|
3
|
+
================
|
4
|
+
|
5
|
+
.. module:: pcapkit.corekit.infoclass
|
6
|
+
|
7
|
+
:mod:`pcapkit.corekit.infoclass` contains :obj:`dict` like class
|
8
|
+
:class:`~pcapkit.corekit.infoclass.Info` only, which is originally
|
9
|
+
designed to work alike :func:`dataclasses.dataclass` as introduced
|
10
|
+
in :pep:`557`.
|
11
|
+
|
12
|
+
"""
|
13
|
+
import abc
|
14
|
+
import collections.abc
|
15
|
+
import enum
|
16
|
+
import itertools
|
17
|
+
from typing import TYPE_CHECKING, Generic, TypeVar, final
|
18
|
+
|
19
|
+
from pcapkit.utilities.compat import Mapping
|
20
|
+
from pcapkit.utilities.exceptions import UnsupportedCall, stacklevel
|
21
|
+
from pcapkit.utilities.warnings import InfoWarning, warn
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from typing import Any, Iterable, Iterator, NoReturn, Optional, Type
|
25
|
+
|
26
|
+
from typing_extensions import Self
|
27
|
+
|
28
|
+
__all__ = ['Info', 'info_final']
|
29
|
+
|
30
|
+
VT = TypeVar('VT')
|
31
|
+
ST = TypeVar('ST', bound='Type[Info]')
|
32
|
+
|
33
|
+
|
34
|
+
class FinalisedState(enum.IntEnum):
|
35
|
+
"""Finalised state."""
|
36
|
+
|
37
|
+
#: Not finalised.
|
38
|
+
NONE = enum.auto()
|
39
|
+
#: Base class.
|
40
|
+
BASE = enum.auto()
|
41
|
+
#: Finalised.
|
42
|
+
FINAL = enum.auto()
|
43
|
+
|
44
|
+
|
45
|
+
def info_final(cls: 'ST', *, _finalised: 'bool' = True) -> 'ST':
|
46
|
+
"""Finalise info class.
|
47
|
+
|
48
|
+
This decorator function is used to generate necessary
|
49
|
+
attributes and methods for the decorated :class:`Info`
|
50
|
+
class. It can be useful to reduce runtime generation
|
51
|
+
time as well as caching already generated attributes.
|
52
|
+
|
53
|
+
Notes:
|
54
|
+
The decorator should only be used on the *final*
|
55
|
+
class, otherwise, any subclasses derived from a
|
56
|
+
finalised info class will not be re-finalised.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
cls: Info class.
|
60
|
+
_finalised: Whether to make the info class as finalised.
|
61
|
+
|
62
|
+
Returns:
|
63
|
+
Finalised info class.
|
64
|
+
|
65
|
+
:meta decorator:
|
66
|
+
"""
|
67
|
+
if cls.__finalised__ == FinalisedState.FINAL:
|
68
|
+
warn(f'{cls.__name__}: info class has been finalised; now skipping',
|
69
|
+
InfoWarning, stacklevel=stacklevel())
|
70
|
+
return cls
|
71
|
+
|
72
|
+
temp = ['__map__', '__map_reverse__', '__builtin__', '__finalised__']
|
73
|
+
temp.extend(cls.__additional__)
|
74
|
+
for obj in cls.mro():
|
75
|
+
temp.extend(dir(obj))
|
76
|
+
cls.__builtin__ = set(temp)
|
77
|
+
cls.__excluded__.extend(cls.__builtin__)
|
78
|
+
|
79
|
+
# NOTE: We only generate ``__init__`` method for subclasses of the
|
80
|
+
# ``Info`` class, rather than itself, plus that such class does not
|
81
|
+
# override the ``__init__`` method of the meta class.
|
82
|
+
if '__init__' not in cls.__dict__ and cls is not Info:
|
83
|
+
args_ = [] # type: list[str]
|
84
|
+
dict_ = [] # type: list[str]
|
85
|
+
|
86
|
+
for cls_ in cls.mro():
|
87
|
+
# NOTE: We skip the ``Info`` class itself, to avoid superclass
|
88
|
+
# type annotations being considered.
|
89
|
+
if cls_ is Info:
|
90
|
+
break
|
91
|
+
|
92
|
+
# NOTE: We iterate in reversed order to ensure that the type
|
93
|
+
# annotations of the superclasses are considered first.
|
94
|
+
for key in reversed(cls_.__annotations__):
|
95
|
+
# NOTE: We skip duplicated annotations to avoid duplicate
|
96
|
+
# argument in function definition.
|
97
|
+
if key in args_:
|
98
|
+
continue
|
99
|
+
|
100
|
+
args_.append(key)
|
101
|
+
dict_.append(f'{key}={key}')
|
102
|
+
|
103
|
+
# NOTE: We reverse the two lists such that the order of the
|
104
|
+
# arguments is the same as the order of the type annotations, i.e.,
|
105
|
+
# from the most base class to the most derived class.
|
106
|
+
args_.reverse()
|
107
|
+
dict_.reverse()
|
108
|
+
|
109
|
+
# NOTE: We only generate typed ``__init__`` method if only the class
|
110
|
+
# has type annotations from any of itself and its base classes.
|
111
|
+
if args_:
|
112
|
+
# NOTE: The following code is to make the ``__init__`` method work.
|
113
|
+
# It is inspired from the :func:`dataclasses._create_fn` function.
|
114
|
+
init_ = (
|
115
|
+
f'def __create_fn__():\n'
|
116
|
+
f' def __init__(self, {", ".join(args_)}):\n'
|
117
|
+
f' self.__update__({", ".join(dict_)})\n'
|
118
|
+
f' self.__post_init__()\n'
|
119
|
+
f' return __init__\n'
|
120
|
+
)
|
121
|
+
else:
|
122
|
+
init_ = (
|
123
|
+
'def __create_fn__():\n'
|
124
|
+
' def __init__(self, dict_=None, **kwargs):\n'
|
125
|
+
' self.__update__(dict_, **kwargs)\n'
|
126
|
+
' self.__post_init__()\n'
|
127
|
+
' return __init__\n'
|
128
|
+
)
|
129
|
+
|
130
|
+
ns = {} # type: dict[str, Any]
|
131
|
+
exec(init_, None, ns) # pylint: disable=exec-used # nosec
|
132
|
+
|
133
|
+
cls.__init__ = ns['__create_fn__']() # type: ignore[misc]
|
134
|
+
cls.__init__.__qualname__ = f'{cls.__name__}.__init__' # type: ignore[misc]
|
135
|
+
|
136
|
+
if not _finalised:
|
137
|
+
cls.__finalised__ = FinalisedState.BASE
|
138
|
+
return cls
|
139
|
+
|
140
|
+
cls.__finalised__ = FinalisedState.FINAL
|
141
|
+
return final(cls)
|
142
|
+
|
143
|
+
|
144
|
+
class InfoMeta(abc.ABCMeta):
|
145
|
+
"""Meta class to add dynamic support to :class:`Info`.
|
146
|
+
|
147
|
+
This meta class is used to generate necessary attributes for the
|
148
|
+
:class:`Info` class. It can be useful to reduce runtime generation
|
149
|
+
cost as well as caching already generated attributes.
|
150
|
+
|
151
|
+
* :attr:`Info.__additional__` and :attr:`Info.__excluded__` are
|
152
|
+
lists of additional and excluded field names, which are used to
|
153
|
+
determine certain names to be included or excluded from the field
|
154
|
+
dictionary. They will be automatically populated from the class
|
155
|
+
attributes of the :class:`Info` class and its base classes.
|
156
|
+
|
157
|
+
.. note::
|
158
|
+
|
159
|
+
This is implemented thru the :meth:`__new__` method, which will
|
160
|
+
inherit the additional and excluded field names from the base
|
161
|
+
classes, as well as populating the additional and excluded field
|
162
|
+
from the subclass attributes.
|
163
|
+
|
164
|
+
.. code-block:: python
|
165
|
+
|
166
|
+
class A(Info):
|
167
|
+
__additional__ = ['a', 'b']
|
168
|
+
|
169
|
+
class B(A):
|
170
|
+
__additional__ = ['c', 'd']
|
171
|
+
|
172
|
+
class C(B):
|
173
|
+
__additional__ = ['e', 'f']
|
174
|
+
|
175
|
+
print(A.__additional__) # ['a', 'b']
|
176
|
+
print(B.__additional__) # ['a', 'b', 'c', 'd']
|
177
|
+
print(C.__additional__) # ['a', 'b', 'c', 'd', 'e', 'f']
|
178
|
+
|
179
|
+
"""
|
180
|
+
|
181
|
+
def __new__(cls, name: 'str', bases: 'tuple[type, ...]', attrs: 'dict[str, Any]', **kwargs: 'Any') -> 'Type[Info]':
|
182
|
+
if '__additional__' not in attrs:
|
183
|
+
attrs['__additional__'] = []
|
184
|
+
if '__excluded__' not in attrs:
|
185
|
+
attrs['__excluded__'] = []
|
186
|
+
|
187
|
+
for base in bases:
|
188
|
+
if hasattr(base, '__additional__'):
|
189
|
+
attrs['__additional__'].extend(
|
190
|
+
name for name in base.__additional__ if name not in attrs['__additional__'])
|
191
|
+
if hasattr(base, '__excluded__'):
|
192
|
+
attrs['__excluded__'].extend(name for name in base.__excluded__ if name not in attrs['__excluded__'])
|
193
|
+
return super().__new__(cls, name, bases, attrs, **kwargs) # type: ignore[return-value]
|
194
|
+
|
195
|
+
|
196
|
+
class Info(Mapping[str, VT], Generic[VT], metaclass=InfoMeta):
|
197
|
+
"""Turn dictionaries into :obj:`object` like instances.
|
198
|
+
|
199
|
+
* :class:`Info` objects inherit from :obj:`dict` type
|
200
|
+
* :class:`Info` objects are *iterable*, and support all functions as
|
201
|
+
:obj:`dict` type
|
202
|
+
* :class:`Info` objects are **immutable**, thus cannot set or delete
|
203
|
+
attributes after initialisation
|
204
|
+
|
205
|
+
Important:
|
206
|
+
:class:`Info` will attempt to rename keys with the same names as the
|
207
|
+
class's builtin methods, and store the mapping information in the
|
208
|
+
:attr:`__map__` and :attr:`__map_reverse__` attributes. However, when
|
209
|
+
accessing such renamed keys, the original key name should always be
|
210
|
+
used, i.e., such renaming is totally transparent to the user.
|
211
|
+
|
212
|
+
"""
|
213
|
+
|
214
|
+
if TYPE_CHECKING:
|
215
|
+
#: Mapping of name conflicts with builtin methods (original names to
|
216
|
+
#: transformed names).
|
217
|
+
__map__: 'dict[str, str]'
|
218
|
+
#: Mapping of name conflicts with builtin methods (transformed names to
|
219
|
+
#: original names).
|
220
|
+
__map_reverse__: 'dict[str, str]'
|
221
|
+
#: List of builtin methods.
|
222
|
+
__builtin__: 'set[str]'
|
223
|
+
|
224
|
+
#: Flag for finalised class initialisation.
|
225
|
+
__finalised__: 'FinalisedState' = FinalisedState.NONE
|
226
|
+
|
227
|
+
#: List of additional built-in names.
|
228
|
+
__additional__: 'list[str]' = []
|
229
|
+
#: List of names to be excluded from :obj:`dict` conversion.
|
230
|
+
__excluded__: 'list[str]' = []
|
231
|
+
|
232
|
+
def __new__(cls, *args: 'VT', **kwargs: 'VT') -> 'Self': # pylint: disable=unused-argument
|
233
|
+
"""Create a new instance.
|
234
|
+
|
235
|
+
The class will try to automatically generate ``__init__`` method with
|
236
|
+
the same signature as specified in class variables' type annotations,
|
237
|
+
which is inspired by :pep:`557` (:mod:`dataclasses`).
|
238
|
+
|
239
|
+
Args:
|
240
|
+
*args: Arbitrary positional arguments.
|
241
|
+
**kwargs: Arbitrary keyword arguments.
|
242
|
+
|
243
|
+
"""
|
244
|
+
if cls.__finalised__ == FinalisedState.NONE:
|
245
|
+
cls = info_final(cls, _finalised=False)
|
246
|
+
self = super().__new__(cls)
|
247
|
+
|
248
|
+
# NOTE: We define the ``__map__`` and ``__map_reverse__`` attributes
|
249
|
+
# here under ``self`` to avoid them being considered as class variables
|
250
|
+
# and thus being shared by all instances.
|
251
|
+
super().__setattr__(self, '__map__', {})
|
252
|
+
super().__setattr__(self, '__map_reverse__', {})
|
253
|
+
|
254
|
+
return self
|
255
|
+
|
256
|
+
def __post_init__(self) -> 'None':
|
257
|
+
"""Customisation method to be called after initialisation."""
|
258
|
+
|
259
|
+
def __update__(self, dict_: 'Optional[Mapping[str, VT] | Iterable[tuple[str, VT]]]' = None,
|
260
|
+
**kwargs: 'VT') -> 'None':
|
261
|
+
# NOTE: Keys with the same names as the class's builtin methods will be
|
262
|
+
# renamed with the class name prefixed as mangled class variables
|
263
|
+
# implicitly and internally. Such mapping information will be stored
|
264
|
+
# within: attr: `__map__` attribute.
|
265
|
+
|
266
|
+
__name__ = type(self).__name__ # pylint: disable=redefined-builtin
|
267
|
+
|
268
|
+
if dict_ is None:
|
269
|
+
data_iter = kwargs.items() # type: Iterable[tuple[str, Any]]
|
270
|
+
elif isinstance(dict_, (dict, collections.abc.Mapping)) or hasattr(dict_, 'items'):
|
271
|
+
data_iter = itertools.chain(dict_.items(), kwargs.items())
|
272
|
+
else:
|
273
|
+
data_iter = itertools.chain(dict_, kwargs.items())
|
274
|
+
|
275
|
+
for (key, value) in data_iter:
|
276
|
+
if key in self.__builtin__:
|
277
|
+
new_key = f'_{__name__}{key}'
|
278
|
+
|
279
|
+
# NOTE: We keep record of the mapping bidirectionally.
|
280
|
+
self.__map__[key] = new_key
|
281
|
+
self.__map_reverse__[new_key] = key
|
282
|
+
|
283
|
+
key = new_key
|
284
|
+
|
285
|
+
# if key in self.__dict__:
|
286
|
+
# raise KeyExists(f'{key!r} already exists')
|
287
|
+
|
288
|
+
# NOTE: We don't rewrite the key names here, just keep the
|
289
|
+
# original ones, even though they might break on the ``.``
|
290
|
+
# (:obj:`getattr`) operator.
|
291
|
+
|
292
|
+
# if isinstance(key, str):
|
293
|
+
# key = re.sub(r'\W', '_', key)
|
294
|
+
self.__dict__[key] = value
|
295
|
+
|
296
|
+
__init__ = __update__
|
297
|
+
|
298
|
+
def __str__(self) -> 'str':
|
299
|
+
temp = [] # type: list[str]
|
300
|
+
for (key, value) in self.__dict__.items():
|
301
|
+
if key in self.__excluded__:
|
302
|
+
continue
|
303
|
+
|
304
|
+
out_key = self.__map_reverse__.get(key, key)
|
305
|
+
temp.append(f'{out_key}={value}')
|
306
|
+
args = ', '.join(temp)
|
307
|
+
return f'{type(self).__name__}({args})'
|
308
|
+
|
309
|
+
def __repr__(self) -> 'str':
|
310
|
+
temp = [] # type: list[str]
|
311
|
+
for (key, value) in self.__dict__.items():
|
312
|
+
if key in self.__excluded__:
|
313
|
+
continue
|
314
|
+
|
315
|
+
out_key = self.__map_reverse__.get(key, key)
|
316
|
+
if isinstance(value, Info):
|
317
|
+
temp.append(f'{out_key}={type(value).__name__}(...)')
|
318
|
+
else:
|
319
|
+
temp.append(f'{out_key}={value!r}')
|
320
|
+
args = ', '.join(temp)
|
321
|
+
return f'<{type(self).__name__} {args}>'
|
322
|
+
|
323
|
+
def __len__(self) -> 'int':
|
324
|
+
return len(self.__dict__)
|
325
|
+
|
326
|
+
def __iter__(self) -> 'Iterator[str]':
|
327
|
+
for key in self.__dict__:
|
328
|
+
if key in self.__excluded__:
|
329
|
+
continue
|
330
|
+
yield self.__map_reverse__.get(key, key)
|
331
|
+
|
332
|
+
def __getitem__(self, name: 'str') -> 'VT':
|
333
|
+
key = self.__map__.get(name, name)
|
334
|
+
return self.__dict__[key]
|
335
|
+
|
336
|
+
def __setattr__(self, name: 'str', value: 'VT') -> 'NoReturn':
|
337
|
+
raise UnsupportedCall("can't set attribute")
|
338
|
+
|
339
|
+
def __delattr__(self, name: 'str') -> 'NoReturn':
|
340
|
+
raise UnsupportedCall("can't delete attribute")
|
341
|
+
|
342
|
+
@classmethod
|
343
|
+
def from_dict(cls, dict_: 'Optional[Mapping[str, VT] | Iterable[tuple[str, VT]]]' = None,
|
344
|
+
**kwargs: 'VT') -> 'Self':
|
345
|
+
r"""Create a new instance.
|
346
|
+
|
347
|
+
* If ``dict_`` is present and has a ``.keys()`` method, then does:
|
348
|
+
``for k in dict_: self[k] = dict_[k]``.
|
349
|
+
* If ``dict_`` is present and has no ``.keys()`` method, then does:
|
350
|
+
``for k, v in dict_: self[k] = v``.
|
351
|
+
* If ``dict_`` is not present, then does:
|
352
|
+
``for k, v in kwargs.items(): self[k] = v``.
|
353
|
+
|
354
|
+
Args:
|
355
|
+
dict\_: Source data.
|
356
|
+
**kwargs: Arbitrary keyword arguments.
|
357
|
+
|
358
|
+
"""
|
359
|
+
self = cls.__new__(cls)
|
360
|
+
self.__update__(dict_, **kwargs)
|
361
|
+
return self
|
362
|
+
|
363
|
+
def to_dict(self) -> 'dict[str, VT]':
|
364
|
+
"""Convert :class:`Info` into :obj:`dict`.
|
365
|
+
|
366
|
+
Important:
|
367
|
+
We only convert nested :class:`Info` objects into :obj:`dict` if
|
368
|
+
they are the direct value of the :class:`Info` object's attribute.
|
369
|
+
Should such :class:`Info` objects be nested within other data,
|
370
|
+
types, such as :obj:`list`, :obj:`tuple`, :obj:`set`, etc., we
|
371
|
+
shall not convert them into :obj:`dict` and remain them intact.
|
372
|
+
|
373
|
+
"""
|
374
|
+
dict_ = {} # type: dict[str, Any]
|
375
|
+
for (key, value) in self.__dict__.items():
|
376
|
+
if key in self.__excluded__:
|
377
|
+
continue
|
378
|
+
|
379
|
+
out_key = self.__map_reverse__.get(key, key)
|
380
|
+
if isinstance(value, Info):
|
381
|
+
dict_[out_key] = value.to_dict()
|
382
|
+
|
383
|
+
#elif isinstance(value, (tuple, list, set, frozenset)):
|
384
|
+
# temp = [] # type: list[Any]
|
385
|
+
# for item in value:
|
386
|
+
# if isinstance(item, Info):
|
387
|
+
# temp.append(item.to_dict())
|
388
|
+
# else:
|
389
|
+
# temp.append(item)
|
390
|
+
# dict_[out_key] = value.__class__(temp)
|
391
|
+
|
392
|
+
else:
|
393
|
+
dict_[out_key] = value
|
394
|
+
return dict_
|