From 162bb2c59b9b3faa7a161e192c1821602d2ab326 Mon Sep 17 00:00:00 2001 From: Timotej Lazar Date: Thu, 7 May 2015 17:09:28 +0200 Subject: Improve error & warning reporting Hope it does not break anything. --- prolog/engine.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'prolog') diff --git a/prolog/engine.py b/prolog/engine.py index 96191ae..b3cd805 100644 --- a/prolog/engine.py +++ b/prolog/engine.py @@ -17,15 +17,12 @@ def create(code='', query=''): opts = {'format': 'json-html', 'destroy': True, 'src_text': code} if query: opts['ask'] = query - reply, messages = request('POST', '/pengine/create', body=json.dumps(opts)) - - if reply.get('event') != 'create' or 'error' in messages: - raise Exception('\n'.join(messages['error'])) + reply, output = request('POST', '/pengine/create', body=json.dumps(opts)) # If query was given, the actual reply is nested in create/destroy objects. if query: reply = reply['answer']['data'] - return reply + return reply, output def ask(engine, query): return send(engine, 'ask(({}),[])'.format(query)) @@ -44,14 +41,13 @@ def send(engine, event): 'id': engine, 'event': event, 'format': 'json-html'}) - reply, messages = request('GET', '/pengine/send?' + params) - return reply + return request('GET', '/pengine/send?' + params) # Return the main reply and pull potential output replies. address, port = 'localhost', 3030 # TODO put this somewhere sane def request(method, path, body=None): headers = {'Content-Type': 'application/json;charset=utf-8'} - messages = collections.defaultdict(list) + messages = [] try: conn = http.client.HTTPConnection(address, port, timeout=10) conn.request(method, path, body, headers=headers) @@ -62,8 +58,7 @@ def request(method, path, body=None): reply = json.loads(response.read().decode('utf-8')) if reply.get('event') == 'output': - msg_type, msg_data = get_message(reply) - messages[msg_type].append(msg_data) + messages.append(get_message(reply)) # Request next reply. params = urllib.parse.urlencode({ @@ -79,7 +74,8 @@ def request(method, path, body=None): def get_message(reply): data = strip_html(reply['data']).strip() message = '' - if reply['message'] == 'error': + if reply['message'] in ('error', 'warning'): + message = reply['message'] + ': ' if 'location' in reply: loc = reply['location'] message += 'near line ' + str(loc['line']) @@ -96,7 +92,7 @@ def get_message(reply): elif reply.get('code') == 'type_error': match = re.match(r'^.*(Type error: [^\n]*)', data, flags=re.DOTALL) data = match.group(1) - message += data + message += data # Replace anonymous variable names with _. message = re.sub(r'_G[0-9]*', '_', message) -- cgit v1.2.1