@@ -27,6 +27,7 @@ import array
27
27
import asyncio
28
28
import collections as _collections
29
29
import contextlib
30
+ import base64
30
31
import enum as _enum
31
32
import inspect as _inspect
32
33
import os as _os
@@ -969,17 +970,17 @@ cdef _DynamicStructBuilder temp_msg_b
969
970
cdef _DynamicStructReader temp_msg_r
970
971
971
972
972
- cdef _to_dict(msg, bint verbose, bint ordered):
973
+ cdef _to_dict(msg, bint verbose, bint ordered, bint encode_bytes_as_base64 = False ):
973
974
msg_type = type (msg)
974
975
if msg_type is _DynamicListBuilder:
975
976
temp_list_b = msg
976
- return [_to_dict(temp_list_b._get(i), verbose, ordered) for i in range (len (msg))]
977
+ return [_to_dict(temp_list_b._get(i), verbose, ordered, encode_bytes_as_base64 ) for i in range (len (msg))]
977
978
elif msg_type is _DynamicListReader:
978
979
temp_list_r = msg
979
- return [_to_dict(temp_list_r._get(i), verbose, ordered) for i in range (len (msg))]
980
+ return [_to_dict(temp_list_r._get(i), verbose, ordered, encode_bytes_as_base64 ) for i in range (len (msg))]
980
981
elif msg_type is _DynamicResizableListBuilder:
981
982
temp_list_rb = msg
982
- return [_to_dict(temp_list_rb._get(i), verbose, ordered) for i in range (len (msg))]
983
+ return [_to_dict(temp_list_rb._get(i), verbose, ordered, encode_bytes_as_base64 ) for i in range (len (msg))]
983
984
984
985
if msg_type is _DynamicStructBuilder or isinstance (msg, _Request):
985
986
temp_msg_b = msg
@@ -989,13 +990,13 @@ cdef _to_dict(msg, bint verbose, bint ordered):
989
990
ret = {}
990
991
try :
991
992
which = temp_msg_b.which()
992
- ret[which] = _to_dict(temp_msg_b._get(which), verbose, ordered)
993
+ ret[which] = _to_dict(temp_msg_b._get(which), verbose, ordered, encode_bytes_as_base64 )
993
994
except KjException:
994
995
pass
995
996
996
997
for field in temp_msg_b.schema.non_union_fields:
997
998
if verbose or temp_msg_b._has(field):
998
- ret[field] = _to_dict(temp_msg_b._get(field), verbose, ordered)
999
+ ret[field] = _to_dict(temp_msg_b._get(field), verbose, ordered, encode_bytes_as_base64 )
999
1000
1000
1001
return ret
1001
1002
elif msg_type is _DynamicStructReader or isinstance (msg, _Response):
@@ -1006,13 +1007,13 @@ cdef _to_dict(msg, bint verbose, bint ordered):
1006
1007
ret = {}
1007
1008
try :
1008
1009
which = temp_msg_r.which()
1009
- ret[which] = _to_dict(temp_msg_r._get(which), verbose, ordered)
1010
+ ret[which] = _to_dict(temp_msg_r._get(which), verbose, ordered, encode_bytes_as_base64 )
1010
1011
except KjException:
1011
1012
pass
1012
1013
1013
1014
for field in temp_msg_r.schema.non_union_fields:
1014
1015
if verbose or temp_msg_r._has(field):
1015
- ret[field] = _to_dict(temp_msg_r._get(field), verbose, ordered)
1016
+ ret[field] = _to_dict(temp_msg_r._get(field), verbose, ordered, encode_bytes_as_base64 )
1016
1017
1017
1018
return ret
1018
1019
@@ -1022,6 +1023,10 @@ cdef _to_dict(msg, bint verbose, bint ordered):
1022
1023
if msg_type is _DynamicEnum:
1023
1024
return str (msg)
1024
1025
1026
+ if encode_bytes_as_base64 and msg_type is bytes:
1027
+ # encode the message as base64 and return utf-8 string
1028
+ return base64.b64encode(msg).decode(' utf-8' )
1029
+
1025
1030
return msg
1026
1031
1027
1032
@@ -1234,8 +1239,8 @@ cdef class _DynamicStructReader:
1234
1239
def __repr__ (self ):
1235
1240
return ' <%s reader %s >' % (self .schema.node.displayName, < char * > strStructReader(self .thisptr).cStr())
1236
1241
1237
- def to_dict (self , verbose = False , ordered = False ):
1238
- return _to_dict(self , verbose, ordered)
1242
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
1243
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
1239
1244
1240
1245
cpdef as_builder(self , num_first_segment_words = None ):
1241
1246
""" A method for casting this Reader to a Builder
@@ -1618,12 +1623,18 @@ cdef class _DynamicStructBuilder:
1618
1623
def __repr__ (self ):
1619
1624
return ' <%s builder %s >' % (self .schema.node.displayName, < char * > strStructBuilder(self .thisptr).cStr())
1620
1625
1621
- def to_dict (self , verbose = False , ordered = False ):
1622
- return _to_dict(self , verbose, ordered)
1626
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
1627
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
1623
1628
1624
1629
def from_dict (self , dict d ):
1625
1630
for key, val in d.iteritems():
1626
1631
if key != ' which' :
1632
+ field = self .schema.fields.get(key)
1633
+ if isinstance (val, str ):
1634
+ dtype = field.proto.slot.type.which()
1635
+ if dtype == " data" :
1636
+ # decode bytes from utf-8 base64 encoding
1637
+ val = base64.b64decode(val)
1627
1638
try :
1628
1639
self ._set(key, val)
1629
1640
except Exception as e:
@@ -1703,8 +1714,8 @@ cdef class _DynamicStructPipeline:
1703
1714
# def __repr__(self):
1704
1715
# return '<%s reader %s>' % (self.schema.node.displayName, strStructReader(self.thisptr).cStr())
1705
1716
1706
- def to_dict (self , verbose = False , ordered = False ):
1707
- return _to_dict(self , verbose, ordered)
1717
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
1718
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
1708
1719
1709
1720
1710
1721
cdef class _DynamicOrphan:
@@ -2086,8 +2097,8 @@ cdef class _RemotePromise:
2086
2097
def __dir__ (self ):
2087
2098
return list (set (self .schema.fieldnames + tuple (dir (self .__class__))))
2088
2099
2089
- def to_dict (self , verbose = False , ordered = False ):
2090
- return _to_dict(self , verbose, ordered)
2100
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
2101
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
2091
2102
2092
2103
cpdef cancel(self ):
2093
2104
self .thisptr = Own[RemotePromise]()
0 commit comments