@@ -26,6 +26,7 @@ import array
26
26
import asyncio
27
27
import collections as _collections
28
28
import contextlib
29
+ import base64
29
30
import enum as _enum
30
31
import inspect as _inspect
31
32
import os as _os
@@ -957,17 +958,17 @@ cdef _DynamicStructBuilder temp_msg_b
957
958
cdef _DynamicStructReader temp_msg_r
958
959
959
960
960
- cdef _to_dict(msg, bint verbose, bint ordered):
961
+ cdef _to_dict(msg, bint verbose, bint ordered, bint encode_bytes_as_base64 = False ):
961
962
msg_type = type (msg)
962
963
if msg_type is _DynamicListBuilder:
963
964
temp_list_b = msg
964
- return [_to_dict(temp_list_b._get(i), verbose, ordered) for i in range (len (msg))]
965
+ return [_to_dict(temp_list_b._get(i), verbose, ordered, encode_bytes_as_base64 ) for i in range (len (msg))]
965
966
elif msg_type is _DynamicListReader:
966
967
temp_list_r = msg
967
- return [_to_dict(temp_list_r._get(i), verbose, ordered) for i in range (len (msg))]
968
+ return [_to_dict(temp_list_r._get(i), verbose, ordered, encode_bytes_as_base64 ) for i in range (len (msg))]
968
969
elif msg_type is _DynamicResizableListBuilder:
969
970
temp_list_rb = msg
970
- return [_to_dict(temp_list_rb._get(i), verbose, ordered) for i in range (len (msg))]
971
+ return [_to_dict(temp_list_rb._get(i), verbose, ordered, encode_bytes_as_base64 ) for i in range (len (msg))]
971
972
972
973
if msg_type is _DynamicStructBuilder or isinstance (msg, _Request):
973
974
temp_msg_b = msg
@@ -977,13 +978,13 @@ cdef _to_dict(msg, bint verbose, bint ordered):
977
978
ret = {}
978
979
try :
979
980
which = temp_msg_b.which()
980
- ret[which] = _to_dict(temp_msg_b._get(which), verbose, ordered)
981
+ ret[which] = _to_dict(temp_msg_b._get(which), verbose, ordered, encode_bytes_as_base64 )
981
982
except KjException:
982
983
pass
983
984
984
985
for field in temp_msg_b.schema.non_union_fields:
985
986
if verbose or temp_msg_b._has(field):
986
- ret[field] = _to_dict(temp_msg_b._get(field), verbose, ordered)
987
+ ret[field] = _to_dict(temp_msg_b._get(field), verbose, ordered, encode_bytes_as_base64 )
987
988
988
989
return ret
989
990
elif msg_type is _DynamicStructReader or isinstance (msg, _Response):
@@ -994,13 +995,13 @@ cdef _to_dict(msg, bint verbose, bint ordered):
994
995
ret = {}
995
996
try :
996
997
which = temp_msg_r.which()
997
- ret[which] = _to_dict(temp_msg_r._get(which), verbose, ordered)
998
+ ret[which] = _to_dict(temp_msg_r._get(which), verbose, ordered, encode_bytes_as_base64 )
998
999
except KjException:
999
1000
pass
1000
1001
1001
1002
for field in temp_msg_r.schema.non_union_fields:
1002
1003
if verbose or temp_msg_r._has(field):
1003
- ret[field] = _to_dict(temp_msg_r._get(field), verbose, ordered)
1004
+ ret[field] = _to_dict(temp_msg_r._get(field), verbose, ordered, encode_bytes_as_base64 )
1004
1005
1005
1006
return ret
1006
1007
@@ -1010,6 +1011,10 @@ cdef _to_dict(msg, bint verbose, bint ordered):
1010
1011
if msg_type is _DynamicEnum:
1011
1012
return str (msg)
1012
1013
1014
+ if encode_bytes_as_base64 and msg_type is bytes:
1015
+ # encode the message as base64 and return utf-8 string
1016
+ return base64.b64encode(msg).decode(' utf-8' )
1017
+
1013
1018
return msg
1014
1019
1015
1020
@@ -1220,8 +1225,8 @@ cdef class _DynamicStructReader:
1220
1225
def __repr__ (self ):
1221
1226
return ' <%s reader %s >' % (self .schema.node.displayName, < char * > strStructReader(self .thisptr).cStr())
1222
1227
1223
- def to_dict (self , verbose = False , ordered = False ):
1224
- return _to_dict(self , verbose, ordered)
1228
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
1229
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
1225
1230
1226
1231
cpdef as_builder(self , num_first_segment_words = None ):
1227
1232
""" A method for casting this Reader to a Builder
@@ -1598,12 +1603,18 @@ cdef class _DynamicStructBuilder:
1598
1603
def __repr__ (self ):
1599
1604
return ' <%s builder %s >' % (self .schema.node.displayName, < char * > strStructBuilder(self .thisptr).cStr())
1600
1605
1601
- def to_dict (self , verbose = False , ordered = False ):
1602
- return _to_dict(self , verbose, ordered)
1606
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
1607
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
1603
1608
1604
1609
def from_dict (self , dict d ):
1605
1610
for key, val in d.iteritems():
1606
1611
if key != ' which' :
1612
+ field = self .schema.fields.get(key)
1613
+ if isinstance (val, str ):
1614
+ dtype = field.proto.slot.type.which()
1615
+ if dtype == " data" :
1616
+ # decode bytes from utf-8 base64 encoding
1617
+ val = base64.b64decode(val)
1607
1618
try :
1608
1619
self ._set(key, val)
1609
1620
except Exception as e:
@@ -1683,8 +1694,8 @@ cdef class _DynamicStructPipeline:
1683
1694
# def __repr__(self):
1684
1695
# return '<%s reader %s>' % (self.schema.node.displayName, strStructReader(self.thisptr).cStr())
1685
1696
1686
- def to_dict (self , verbose = False , ordered = False ):
1687
- return _to_dict(self , verbose, ordered)
1697
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
1698
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
1688
1699
1689
1700
1690
1701
cdef class _DynamicOrphan:
@@ -2065,8 +2076,8 @@ cdef class _RemotePromise:
2065
2076
def __dir__ (self ):
2066
2077
return list (set (self .schema.fieldnames + tuple (dir (self .__class__))))
2067
2078
2068
- def to_dict (self , verbose = False , ordered = False ):
2069
- return _to_dict(self , verbose, ordered)
2079
+ def to_dict (self , verbose = False , ordered = False , encode_bytes_as_base64 = False ):
2080
+ return _to_dict(self , verbose, ordered, encode_bytes_as_base64 )
2070
2081
2071
2082
cpdef cancel(self ) except + reraise_kj_exception:
2072
2083
self .thisptr = Own[RemotePromise]()
0 commit comments