diff --git a/grew/graph.py b/grew/graph.py index a10edb6341c3c6747703c528cf4a9a6e813efe27..4a7698421bbc7c2cd19c9916ae03cbe7362732ae 100644 --- a/grew/graph.py +++ b/grew/graph.py @@ -36,33 +36,35 @@ def graph(data=None): or another graph :return: a graph """ - if not data: - return dict() - if isinstance(data, list): - # builds a flat ordered (using list order) graph - return {float2id(float(i)): (data[i], []) for i in range(len(data))} - elif isinstance(data, str): - # build from a JSON string - try: - return json.loads(data) - except json.decoder.JSONDecodeError: - if os.path.isfile(data): - req = { "command": "load_graph", "filename": data } - reply = network.send_and_receive(req) - else: - with tempfile.NamedTemporaryFile(mode="w", delete=True, suffix=".gr") as f: - f.write(data) - f.seek(0) # to be read by others - req = { "command": "load_graph", "filename": f.name } + try: + if not data: + return dict() + if isinstance(data, list): + # builds a flat ordered (using list order) graph + return {float2id(float(i)): (data[i], []) for i in range(len(data))} + elif isinstance(data, str): + # build from a JSON string + try: + return json.loads(data) + except json.decoder.JSONDecodeError: + if os.path.isfile(data): + req = { "command": "load_graph", "filename": data } reply = network.send_and_receive(req) - return (reply) - - elif isinstance(data,dict): - # copy an existing graph - return copy.deepcopy(data) - else: - raise GrewError('Library call error') - + else: + with tempfile.NamedTemporaryFile(mode="w", delete=True, suffix=".gr") as f: + f.write(data) + f.seek(0) # to be read by others + req = { "command": "load_graph", "filename": f.name } + reply = network.send_and_receive(req) + return (reply) + + elif isinstance(data,dict): + # copy an existing graph + return copy.deepcopy(data) + else: + raise GrewError('Library call error') + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.graph", "data": data, "message":e.value}) def save(gr, filename): req = { "command": "save_graph", "graph": json.dumps(gr), "filename": filename } @@ -84,8 +86,10 @@ def add_edge(gr, source, label, target): :param target: the target node id :return: """ - if source not in gr or target not in gr: - raise KeyError("Add_edge") + if source not in gr: + raise utils.GrewError({"function": "grew.add_edge", "src": source, "message":"KeyError"}) + elif target not in gr: + raise utils.GrewError({"function": "grew.add_edge", "tar": target, "message":"KeyError"}) else: succs = gr[source][1] if not (label, target) in succs: diff --git a/grew/grew.py b/grew/grew.py index 3b9560f75609b07f764843cf573d74ae1e4d52a8..3162349ff8b824f2c8d16fdf029bc78fd2234fbd 100644 --- a/grew/grew.py +++ b/grew/grew.py @@ -38,8 +38,8 @@ def grs(data): req = { "command": "load_grs", "filename": f.name } reply = network.send_and_receive(req) return reply["index"] - except: - raise utils.GrewError("[grew.grs] Could not build a GRS with: %s" % data) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.grs", "data":data, "message":e.value}) def run(grs_data, graph_data, strat="main"): """ @@ -49,19 +49,22 @@ def run(grs_data, graph_data, strat="main"): :param strat: the strategy (by default "main") :return: the list of rewritten graphs """ - if isinstance(grs_data, int): - grs_index = grs_data - else: - grs_index = grs(grs_data) + try: + if isinstance(grs_data, int): + grs_index = grs_data + else: + grs_index = grs(grs_data) - req = { - "command": "run", - "graph": json.dumps(graph_data), - "grs_index": grs_index, - "strat": strat - } - reply = network.send_and_receive(req) - return utils.rm_dups(reply) + req = { + "command": "run", + "graph": json.dumps(graph_data), + "grs_index": grs_index, + "strat": strat + } + reply = network.send_and_receive(req) + return utils.rm_dups(reply) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.run", "strat": strat, "message":e.value}) def corpus(data): """Load a corpus from a file of a string @@ -83,8 +86,8 @@ def corpus(data): req = { "command": "load_corpus", "files": [f.name] } reply = network.send_and_receive(req) return reply["index"] - except: - raise utils.GrewError("Could not build a corpus with: %s" % data) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.corpus", "data": data, "message":e.value}) def search(pattern, gr): """ @@ -93,13 +96,17 @@ def search(pattern, gr): :param gr: the graph :return: the list of matching of [pattern] into [gr] """ - req = { - "command": "search", - "graph": json.dumps(gr), - "pattern": pattern - } - reply = network.send_and_receive(req) - return reply + try: + req = { + "command": "search", + "graph": json.dumps(gr), + "pattern": pattern + } + reply = network.send_and_receive(req) + return reply + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.search", "message":e.value}) + def corpus_search(pattern, corpus_index): """ @@ -108,12 +115,15 @@ def corpus_search(pattern, corpus_index): :param corpus_index: an integer given by the [corpus] function :return: the list of matching of [pattern] into the corpus """ - req = { - "command": "corpus_search", - "corpus_index": corpus_index, - "pattern": pattern, - } - return network.send_and_receive(req) + try: + req = { + "command": "corpus_search", + "corpus_index": corpus_index, + "pattern": pattern, + } + return network.send_and_receive(req) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.corpus_search", "message":e.value}) def corpus_count(pattern, corpus_index): """ @@ -122,12 +132,15 @@ def corpus_count(pattern, corpus_index): :param corpus_index: an integer given by the [corpus] function :return: the number of matching of [pattern] into the corpus """ - req = { - "command": "corpus_count", - "corpus_index": corpus_index, - "pattern": pattern, - } - return network.send_and_receive(req) + try: + req = { + "command": "corpus_count", + "corpus_index": corpus_index, + "pattern": pattern, + } + return network.send_and_receive(req) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.corpus_count", "message":e.value}) def corpus_get(data, corpus_index): """ @@ -149,8 +162,11 @@ def corpus_get(data, corpus_index): "sent_id": data, } else: - raise utils.GrewError("Data error in 'corpus_get': %s" % data) - return network.send_and_receive(req) + raise utils.GrewError({"function": "grew.corpus_get", "message":"unexpected data, should be int or str"}) + try: + return network.send_and_receive(req) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.corpus_get", "message":e.value}) def corpus_size(corpus_index): """ @@ -159,7 +175,10 @@ def corpus_size(corpus_index): :return: a integer """ req = { "command": "corpus_size", "corpus_index": corpus_index} - return network.send_and_receive(req) + try: + return network.send_and_receive(req) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.corpus_size", "message":e.value}) def corpus_sent_ids(corpus_index): """ @@ -167,11 +186,11 @@ def corpus_sent_ids(corpus_index): :param corpus_index: an integer given by the [corpus] function :return: a list of strings """ - req = { - "command": "corpus_sent_ids", - "corpus_index": corpus_index, - } - return network.send_and_receive(req) + req = { "command": "corpus_sent_ids", "corpus_index": corpus_index } + try: + return network.send_and_receive(req) + except utils.GrewError as e: + raise utils.GrewError({"function": "grew.corpus_sent_ids", "message":e.value}) def graph_svg(graph): req = { diff --git a/grew/utils.py b/grew/utils.py index 523608105d415fa534f0b901acb730d8508c26b2..b8ee1aebaecf089857935a46ae8e1e006547ee2c 100644 --- a/grew/utils.py +++ b/grew/utils.py @@ -1,5 +1,6 @@ import re import math +import json ''' Identifier tools @@ -51,7 +52,10 @@ class GrewError(Exception): def __init__(self, message): self.value = message def __str__(self): - return repr(self.value) + if isinstance(self.value, dict): + return ("\n".join (("", "-"*80, json.dumps(self.value, indent=2), "-"*80))) + else: + return ("\n".join (("", "="*80, str (self.value), "="*80))) GrewError.__doc__ = "A wrapper for grew-related errors" diff --git a/src_ocaml/grewpy.ml b/src_ocaml/grewpy.ml index e9e8b6810c424176fca9ae400ef128d6169ecb28..434f87e14ee32ed564e56e593318b5bbdd8f44ee 100644 --- a/src_ocaml/grewpy.ml +++ b/src_ocaml/grewpy.ml @@ -21,7 +21,6 @@ end let json_error msg = Yojson.Basic.to_string (`Assoc [("status", `String "ERROR"); ("message", `String msg)]) -exception Error of string (* ==================================================================================================== *) let run_command request = @@ -79,11 +78,14 @@ let run_command request = | None -> files | Some dir -> List.map (fun file -> Filename.concat dir file) files in - let conll_corpus = Conllx_corpus.load_list ~config complete_files in + try + let conll_corpus = Conllx_corpus.load_list ~quiet:true ~config complete_files in - let index = Global.corpus_add conll_corpus in - let data = `Assoc [("index", `Int index)] in - Yojson.Basic.to_string (`Assoc [("status", `String "OK"); ("data", data)]) + let index = Global.corpus_add conll_corpus in + let data = `Assoc [("index", `Int index)] in + Yojson.Basic.to_string (`Assoc [("status", `String "OK"); ("data", data)]) + with Conllx_error js -> + Yojson.Basic.to_string (`Assoc [("status", `String "ERROR"); ("message", js)]) end (* ======================= corpus_get ======================= *) @@ -204,7 +206,7 @@ let run_command request = ) with | Some graph, Some grs_index, Some strat -> let gr = Graph.of_json_python ~config (Yojson.Basic.from_string graph) in - let grs = Global.grs_get grs_index in + let grs = try Global.grs_get grs_index with Not_found -> raise (Error "Reference to an undefined GRS") in let graph_list = Rewrite.simple_rewrite ~config gr grs strat in Yojson.Basic.to_string (`Assoc [ @@ -219,7 +221,7 @@ let run_command request = begin match json |> member "grs_index" |> to_int_option with | Some grs_index -> - let grs = Global.grs_get grs_index in + let grs = try Global.grs_get grs_index with Not_found -> raise (Error "Reference to an undefined GRS") in Yojson.Basic.to_string (`Assoc [ ("status", `String "OK"); diff --git a/src_ocaml/grewpy_utils.ml b/src_ocaml/grewpy_utils.ml index d3b44875bd789d6fb72ed9f996513eb24de7539e..407d4425f30539ee1c0700dd873a4630f2c9057b 100644 --- a/src_ocaml/grewpy_utils.ml +++ b/src_ocaml/grewpy_utils.ml @@ -7,6 +7,8 @@ module Int_map = Map.Make (struct type t=int let compare=Stdlib.compare end) let config = Conllx_config.build "ud" +exception Error of string + (* ==================================================================================================== *) module Utils = struct let dot_to_png dot = @@ -65,7 +67,9 @@ module Global = struct corpus_map := Int_map.add !corpus_max corpus !corpus_map; !corpus_max - let corpus_get index = Int_map.find index !corpus_map + let corpus_get index = + try Int_map.find index !corpus_map + with Not_found -> raise (Error "Reference to an undefined corpus") end (* ==================================================================================================== *)