1212sys .path .insert (0 , os .path .dirname (__file__ ))
1313
1414
15+ class NonUTF8ContentException (Exception ):
16+ pass
17+
18+
1519class BblfshClient (object ):
1620 """
1721 Babelfish gRPC client. Currently it is only capable of fetching UASTs.
@@ -28,6 +32,21 @@ def __init__(self, endpoint):
2832 self ._channel = grpc .insecure_channel (endpoint )
2933 self ._stub = ProtocolServiceStub (self ._channel )
3034
35+ @staticmethod
36+ def _check_utf8 (text ):
37+ try :
38+ text .decode ("utf-8" )
39+ except UnicodeDecodeError :
40+ raise NonUTF8ContentException ("Content must be UTF-8, ASCII or Base64 encoded" )
41+
42+ @staticmethod
43+ def _get_contents (contents , filename ):
44+ if contents is None :
45+ with open (filename , "rb" ) as fin :
46+ contents = fin .read ()
47+ BblfshClient ._check_utf8 (contents )
48+ return contents
49+
3150 def parse (self , filename , language = None , contents = None , timeout = None ):
3251 """
3352 Queries the Babelfish server and receives the UAST response for the specified
@@ -48,9 +67,7 @@ def parse(self, filename, language=None, contents=None, timeout=None):
4867 :return: UAST object.
4968 """
5069
51- if contents is None :
52- with open (filename , "rb" ) as fin :
53- contents = fin .read ()
70+ contents = self ._get_contents (contents , filename )
5471 request = ParseRequest (filename = os .path .basename (filename ),
5572 content = contents ,
5673 language = self ._scramble_language (language ))
@@ -76,9 +93,7 @@ def native_parse(self, filename, language=None, contents=None, timeout=None):
7693 :return: Native AST object.
7794 """
7895
79- if contents is None :
80- with open (filename , "rb" ) as fin :
81- contents = fin .read ()
96+ contents = self ._get_contents (contents , filename )
8297 request = NativeParseRequest (filename = os .path .basename (filename ),
8398 content = contents ,
8499 language = self ._scramble_language (language ))
0 commit comments