22import dataclasses
33import io
44import json as jsonlib
5- from typing import Any , Tuple
5+ import logging
6+ from typing import Any , Tuple , Union
7+ from steamship .base .error import SteamshipError
68
7- from steamship .base .mime_types import MimeTypes
9+ from steamship .base .mime_types import MimeTypes , ContentEncodings
810
911
1012def guess_mime (obj : Any , provided_mime : str = None ) -> str :
@@ -14,15 +16,24 @@ def guess_mime(obj: Any, provided_mime: str = None) -> str:
1416 return MimeTypes .TXT
1517 return MimeTypes .BINARY
1618
19+ def to_b64 (obj : Any ) -> str :
20+ ret_bytes = obj
21+ if type (obj ) == bytes :
22+ ret_bytes = obj
23+ elif type (obj ) == str :
24+ ret_bytes = ret_bytes .encode ('utf-8' )
25+ else :
26+ ret_bytes = str (obj ).encode ('utf-8' )
27+ return base64 .b64encode (ret_bytes ).decode ('utf-8' )
1728
1829def flexi_create (
1930 base64string : str = None ,
2031 data : Any = None ,
2132 string : str = None ,
2233 json : Any = None ,
23- bytes : io .BytesIO = None ,
34+ bytes : Union [ bytes , io .BytesIO ] = None ,
2435 mimeType = None ,
25- alwaysBase64 = False ) -> Tuple [Any , str ]:
36+ alwaysBase64 = False ) -> Tuple [Any , Union [ None , str ], Union [ None , str ] ]:
2637 """
2738 It's convenient for some constructors to accept a variety of input types:
2839 - data (your chocie)
@@ -33,38 +44,46 @@ def flexi_create(
3344 .. And have them all homogenized.
3445 """
3546
36- if base64string is not None :
37- return base64string , mimeType or MimeTypes .BINARY
47+ try :
48+ if base64string is not None :
49+ logging .error ("B64" )
50+ return base64string , mimeType or MimeTypes .BINARY , ContentEncodings .BASE64
3851
39- ret_data = None
40- ret_mime = None
52+ ret_data = None # the body of the result
53+ ret_mime = None # for the Content-Type field
54+ ret_encoding = None # for the Content-Encoding field
55+ is_b64 = False
4156
42- if data is not None :
43- ret_data , ret_mime = data , guess_mime (data , mimeType )
57+ if data is not None :
58+ ret_data , ret_mime = data , mimeType or guess_mime (data , mimeType )
4459
45- elif string is not None :
46- ret_data , ret_mime = string , mimeType or MimeTypes .TXT
60+ elif string is not None :
61+ ret_data , ret_mime = string , mimeType or MimeTypes .TXT
4762
48- elif json is not None :
49- if dataclasses .is_dataclass (json ):
50- ret_data , ret_mime = jsonlib . dumps ( dataclasses .asdict (json ) ), mimeType or MimeTypes .JSON
51- else :
52- ret_data , ret_mime = jsonlib . dumps ( json ) , mimeType or MimeTypes .JSON
63+ elif json is not None :
64+ if dataclasses .is_dataclass (json ):
65+ ret_data , ret_mime = dataclasses .asdict (json ), mimeType or MimeTypes .JSON
66+ else :
67+ ret_data , ret_mime = json , mimeType or MimeTypes .JSON
5368
54- if ret_data is not None :
55- if alwaysBase64 is False :
56- return ret_data , ret_mime
69+ elif bytes is not None :
70+ if isinstance (bytes , io .BytesIO ):
71+ bytes = bytes .getvalue () # Turn it into regular bytes
72+ ret_data , ret_mime = base64 .b64encode (bytes ).decode ('utf-8' ), mimeType or ret_mime or MimeTypes .BINARY
73+ is_b64 = True
74+ ret_encoding = ContentEncodings .BASE64
5775
58- ret_bytes = ret_data
59- if type ( ret_data ) == bytes :
60- ret_bytes = ret_data
61- elif type ( ret_data ) == str :
62- ret_bytes = ret_bytes . encode ( 'utf-8' )
63- else :
64- ret_bytes = str ( ret_data ). encode ( 'utf-8' )
65- return base64 . b64encode ( ret_bytes ). decode ( 'utf-8' ) , ret_mime or MimeTypes .BINARY
76+ if ret_data is not None :
77+ logging . error ( "had ret data" )
78+ if alwaysBase64 is False :
79+ return ret_data , ret_mime , ret_encoding
80+ if is_b64 is True :
81+ return ret_data , ret_mime , ContentEncodings . BASE64
82+ else :
83+ return to_b64 ( ret_data ) , ret_mime or MimeTypes .BINARY , ContentEncodings . BASE64
6684
67- if bytes is not None :
68- return base64 .b64encode (bytes ).decode ('utf-8' ), mimeType or MimeTypes .BINARY
69-
70- return None , None
85+ return None , None , None
86+ except Exception as ex :
87+ logging .error ("Exception thrown trying to encode data" )
88+ logging .error (ex )
89+ raise SteamshipError (message = "There was an exception thrown while trying to encode your app/plugin data." , error = ex )
0 commit comments