X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gps303%2Fgps303proto.py;h=ab03c6829ccc94b025504ddb79208c5fcac4945b;hb=bd031f87f4d3f640ce8862271aa69107f31a06d5;hp=da5796f988eeb281f4fa2e85c64e55e12c7e44f1;hpb=dbcd32b54fe0832a9020ab3cc32f886ad9761093;p=loctrkd.git diff --git a/gps303/gps303proto.py b/gps303/gps303proto.py index da5796f..ab03c68 100755 --- a/gps303/gps303proto.py +++ b/gps303/gps303proto.py @@ -18,7 +18,17 @@ from datetime import datetime, timezone from enum import Enum from inspect import isclass from struct import error, pack, unpack -from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union +from typing import ( + Any, + Callable, + Dict, + List, + Optional, + Tuple, + Type, + TYPE_CHECKING, + Union, +) __all__ = ( "class_by_prefix", @@ -95,6 +105,8 @@ def hhmm(x: str) -> str: def l3str(x: Union[str, List[str]]) -> List[str]: if isinstance(x, str): lx = x.split(",") + else: + lx = x if len(lx) != 3 or not all(isinstance(el, str) for el in x): raise ValueError(str(lx) + " is not a list of three strings") return lx @@ -103,6 +115,8 @@ def l3str(x: Union[str, List[str]]) -> List[str]: def l3int(x: Union[str, List[int]]) -> List[int]: if isinstance(x, str): lx = [int(el) for el in x.split(",")] + else: + lx = x if len(lx) != 3 or not all(isinstance(el, int) for el in lx): raise ValueError(str(lx) + " is not a list of three integers") return lx @@ -120,37 +134,40 @@ class MetaPkt(type): respectively. """ + if TYPE_CHECKING: + + def __getattr__(self, name: str) -> Any: + pass + + def __setattr__(self, name: str, value: Any) -> None: + pass + def __new__( - cls, name: str, bases: Tuple[type, ...], attrs: Dict[str, Any] + cls: Type["MetaPkt"], + name: str, + bases: Tuple[type, ...], + attrs: Dict[str, Any], ) -> "MetaPkt": newcls = super().__new__(cls, name, bases, attrs) - setattr( - newcls, - "In", - super().__new__( - cls, - name + ".In", - (newcls,) + bases, - { - "KWARGS": newcls.IN_KWARGS, - "decode": newcls.in_decode, - "encode": newcls.in_encode, - }, - ), + newcls.In = super().__new__( + cls, + name + ".In", + (newcls,) + bases, + { + "KWARGS": newcls.IN_KWARGS, + "decode": newcls.in_decode, + "encode": newcls.in_encode, + }, ) - setattr( - newcls, - "Out", - super().__new__( - cls, - name + ".Out", - (newcls,) + bases, - { - "KWARGS": newcls.OUT_KWARGS, - "decode": newcls.out_decode, - "encode": newcls.out_encode, - }, - ), + newcls.Out = super().__new__( + cls, + name + ".Out", + (newcls,) + bases, + { + "KWARGS": newcls.OUT_KWARGS, + "decode": newcls.out_decode, + "encode": newcls.out_encode, + }, ) return newcls @@ -170,6 +187,14 @@ class GPS303Pkt(metaclass=MetaPkt): In: Type["GPS303Pkt"] Out: Type["GPS303Pkt"] + if TYPE_CHECKING: + + def __getattr__(self, name: str) -> Any: + pass + + def __setattr__(self, name: str, value: Any) -> None: + pass + def __init__(self, *args: Any, **kwargs: Any): """ Construct the object _either_ from (length, payload), @@ -644,7 +669,9 @@ if True: # just to indent the code, sorry! PROTOS[cls.__name__] = cls.PROTO -def class_by_prefix(prefix: str) -> Union[type, List[Tuple[str, int]]]: +def class_by_prefix( + prefix: str, +) -> Union[Type[GPS303Pkt], List[Tuple[str, int]]]: lst = [ (name, proto) for name, proto in PROTOS.items()