@@ -420,11 +420,14 @@ class Message(ABC):
420
420
register the message fields which get used by the serializers and parsers
421
421
to go between Python, binary and JSON protobuf message representations.
422
422
"""
423
+ _serialized_on_wire : bool
424
+ _unknown_fields : bytes
425
+ _group_map : Dict [str , dict ]
423
426
424
427
def __post_init__ (self ) -> None :
425
428
# Set a default value for each field in the class after `__init__` has
426
429
# already been run.
427
- group_map = {"fields" : {}, "groups" : {}}
430
+ group_map : Dict [ str , dict ] = {"fields" : {}, "groups" : {}}
428
431
for field in dataclasses .fields (self ):
429
432
meta = FieldMetadata .get (field )
430
433
@@ -518,7 +521,7 @@ def __bytes__(self) -> bytes:
518
521
else :
519
522
for item in value :
520
523
output += _serialize_single (
521
- meta .number , meta .proto_type , item , wraps = meta .wraps
524
+ meta .number , meta .proto_type , item , wraps = meta .wraps or ""
522
525
)
523
526
elif isinstance (value , dict ):
524
527
for k , v in value .items ():
@@ -532,7 +535,7 @@ def __bytes__(self) -> bytes:
532
535
meta .proto_type ,
533
536
value ,
534
537
serialize_empty = serialize_empty ,
535
- wraps = meta .wraps ,
538
+ wraps = meta .wraps or "" ,
536
539
)
537
540
538
541
return output + self ._unknown_fields
@@ -702,14 +705,14 @@ def to_dict(self, casing: Casing = Casing.CAMEL) -> dict:
702
705
for field in dataclasses .fields (self ):
703
706
meta = FieldMetadata .get (field )
704
707
v = getattr (self , field .name )
705
- cased_name = casing (field .name ).rstrip ("_" )
708
+ cased_name = casing (field .name ).rstrip ("_" ) # type: ignore
706
709
if meta .proto_type == "message" :
707
710
if isinstance (v , datetime ):
708
711
if v != DATETIME_ZERO :
709
- output [cased_name ] = _Timestamp .to_json (v )
712
+ output [cased_name ] = _Timestamp .timestamp_to_json (v )
710
713
elif isinstance (v , timedelta ):
711
714
if v != timedelta (0 ):
712
- output [cased_name ] = _Duration .to_json (v )
715
+ output [cased_name ] = _Duration .delta_to_json (v )
713
716
elif meta .wraps :
714
717
if v is not None :
715
718
output [cased_name ] = v
@@ -738,7 +741,7 @@ def to_dict(self, casing: Casing = Casing.CAMEL) -> dict:
738
741
else :
739
742
output [cased_name ] = b64encode (v ).decode ("utf8" )
740
743
elif meta .proto_type == TYPE_ENUM :
741
- enum_values = list (self ._cls_for (field ))
744
+ enum_values = list (self ._cls_for (field )) # type: ignore
742
745
if isinstance (v , list ):
743
746
output [cased_name ] = [enum_values [e ].name for e in v ]
744
747
else :
@@ -853,7 +856,7 @@ def to_timedelta(self) -> timedelta:
853
856
return timedelta (seconds = self .seconds , microseconds = self .nanos / 1e3 )
854
857
855
858
@staticmethod
856
- def to_json (delta : timedelta ) -> str :
859
+ def delta_to_json (delta : timedelta ) -> str :
857
860
parts = str (delta .total_seconds ()).split ("." )
858
861
if len (parts ) > 1 :
859
862
while len (parts [1 ]) not in [3 , 6 , 9 ]:
@@ -876,7 +879,7 @@ def to_datetime(self) -> datetime:
876
879
return datetime .fromtimestamp (ts , tz = timezone .utc )
877
880
878
881
@staticmethod
879
- def to_json (dt : datetime ) -> str :
882
+ def timestamp_to_json (dt : datetime ) -> str :
880
883
nanos = dt .microsecond * 1e3
881
884
copy = dt .replace (microsecond = 0 , tzinfo = None )
882
885
result = copy .isoformat ()
@@ -899,12 +902,15 @@ class _WrappedMessage(Message):
899
902
Google protobuf wrapper types base class. JSON representation is just the
900
903
value itself.
901
904
"""
902
- def to_dict (self ) -> Any :
905
+ value : Any
906
+
907
+ def to_dict (self , casing : Casing = Casing .CAMEL ) -> Any :
903
908
return self .value
904
909
905
- def from_dict (self , value : Any ) -> None :
910
+ def from_dict (self : T , value : Any ) -> T :
906
911
if value is not None :
907
912
self .value = value
913
+ return self
908
914
909
915
910
916
@dataclasses .dataclass
@@ -952,7 +958,7 @@ class _BytesValue(_WrappedMessage):
952
958
value : bytes = bytes_field (1 )
953
959
954
960
955
- def _get_wrapper (proto_type : str ) -> _WrappedMessage :
961
+ def _get_wrapper (proto_type : str ) -> Type :
956
962
"""Get the wrapper message class for a wrapped type."""
957
963
return {
958
964
TYPE_BOOL : _BoolValue ,
0 commit comments