4
4
import json
5
5
import struct
6
6
import sys
7
- import warnings
7
+ import typing
8
8
from abc import ABC
9
9
from base64 import b64decode , b64encode
10
10
from datetime import datetime , timedelta , timezone
22
22
get_type_hints ,
23
23
)
24
24
25
- import typing
26
-
27
25
from ._types import T
28
26
from .casing import camel_case , safe_snake_case , snake_case
29
27
from .grpc .grpclib_client import ServiceStub
@@ -126,11 +124,7 @@ class Casing(enum.Enum):
126
124
SNAKE = snake_case
127
125
128
126
129
- class _PLACEHOLDER :
130
- pass
131
-
132
-
133
- PLACEHOLDER : Any = _PLACEHOLDER ()
127
+ PLACEHOLDER : Any = object ()
134
128
135
129
136
130
@dataclasses .dataclass (frozen = True )
@@ -261,7 +255,7 @@ class Enum(enum.IntEnum):
261
255
def from_string (cls , name : str ) -> int :
262
256
"""Return the value which corresponds to the string name."""
263
257
try :
264
- return cls .__members__ [name ]
258
+ return cls ._member_map_ [name ]
265
259
except KeyError as e :
266
260
raise ValueError (f"Unknown value { name } for enum { cls .__name__ } " ) from e
267
261
@@ -349,7 +343,7 @@ def _serialize_single(
349
343
"""Serializes a single field and value."""
350
344
value = _preprocess_single (proto_type , wraps , value )
351
345
352
- output = b""
346
+ output = bytearray ()
353
347
if proto_type in WIRE_VARINT_TYPES :
354
348
key = encode_varint (field_number << 3 )
355
349
output += key + value
@@ -366,10 +360,10 @@ def _serialize_single(
366
360
else :
367
361
raise NotImplementedError (proto_type )
368
362
369
- return output
363
+ return bytes ( output )
370
364
371
365
372
- def decode_varint (buffer : bytes , pos : int , signed : bool = False ) -> Tuple [int , int ]:
366
+ def decode_varint (buffer : bytes , pos : int ) -> Tuple [int , int ]:
373
367
"""
374
368
Decode a single varint value from a byte buffer. Returns the value and the
375
369
new position in the buffer.
@@ -513,7 +507,7 @@ def __post_init__(self) -> None:
513
507
all_sentinel = True
514
508
515
509
# Set current field of each group after `__init__` has already been run.
516
- group_current : Dict [str , str ] = {}
510
+ group_current : Dict [str , Optional [ str ] ] = {}
517
511
for field_name , meta in self ._betterproto .meta_by_field_name .items ():
518
512
519
513
if meta .group :
@@ -571,7 +565,7 @@ def __bytes__(self) -> bytes:
571
565
"""
572
566
Get the binary encoded Protobuf representation of this instance.
573
567
"""
574
- output = b""
568
+ output = bytearray ()
575
569
for field_name , meta in self ._betterproto .meta_by_field_name .items ():
576
570
value = getattr (self , field_name )
577
571
@@ -609,7 +603,7 @@ def __bytes__(self) -> bytes:
609
603
# Packed lists look like a length-delimited field. First,
610
604
# preprocess/encode each value into a buffer and then
611
605
# treat it like a field of raw bytes.
612
- buf = b""
606
+ buf = bytearray ()
613
607
for item in value :
614
608
buf += _preprocess_single (meta .proto_type , "" , item )
615
609
output += _serialize_single (meta .number , TYPE_BYTES , buf )
@@ -644,7 +638,8 @@ def __bytes__(self) -> bytes:
644
638
wraps = meta .wraps or "" ,
645
639
)
646
640
647
- return output + self ._unknown_fields
641
+ output += self ._unknown_fields
642
+ return bytes (output )
648
643
649
644
# For compatibility with other libraries
650
645
SerializeToString = __bytes__
@@ -754,14 +749,14 @@ def parse(self: T, data: bytes) -> T:
754
749
"""
755
750
# Got some data over the wire
756
751
self ._serialized_on_wire = True
757
-
752
+ proto_meta = self . _betterproto
758
753
for parsed in parse_fields (data ):
759
- field_name = self . _betterproto .field_name_by_number .get (parsed .number )
754
+ field_name = proto_meta .field_name_by_number .get (parsed .number )
760
755
if not field_name :
761
756
self ._unknown_fields += parsed .raw
762
757
continue
763
758
764
- meta = self . _betterproto .meta_by_field_name [field_name ]
759
+ meta = proto_meta .meta_by_field_name [field_name ]
765
760
766
761
value : Any
767
762
if parsed .wire_type == WIRE_LEN_DELIM and meta .proto_type in PACKED_TYPES :
@@ -907,7 +902,6 @@ def from_dict(self: T, value: dict) -> T:
907
902
returns the instance itself and is therefore assignable and chainable.
908
903
"""
909
904
self ._serialized_on_wire = True
910
- fields_by_name = {f .name : f for f in dataclasses .fields (self )}
911
905
for key in value :
912
906
field_name = safe_snake_case (key )
913
907
meta = self ._betterproto .meta_by_field_name .get (field_name )
0 commit comments