From 617d24b6683e6c6bf6d82a3202611e0e1186804d Mon Sep 17 00:00:00 2001 From: "M. Sonntag" Date: Fri, 16 Nov 2018 11:11:46 +0100 Subject: [PATCH 1/4] [tools/xmlparser] Add show_warnings on load --- odml/tools/xmlparser.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py index ecd3c5ff..c6d08cc3 100644 --- a/odml/tools/xmlparser.py +++ b/odml/tools/xmlparser.py @@ -148,10 +148,21 @@ class XMLReader(object): >>> doc = XMLReader().from_file("file.odml") """ - def __init__(self, ignore_errors=False, filename=None): + def __init__(self, ignore_errors=False, show_warnings=True, filename=None): + """ + :param ignore_errors: To allow loading and fixing of invalid odml files + encountered errors can be converted to warnings + instead. Such a document can only be saved when + all errors have been addressed though. + :param show_warnings: Toggle whether to print warnings to the command line. + Any warnings can be accessed via the Reader's class + warnings attribute after parsing is done. + :param filename: Path to an odml file. + """ self.parser = ET.XMLParser(remove_comments=True) self.tags = dict([(obj.name, obj) for obj in format.__all__]) self.ignore_errors = ignore_errors + self.show_warnings = show_warnings self.filename = filename self.warnings = [] @@ -229,8 +240,10 @@ def warn(self, msg, elem): self.filename, elem.sourceline, elem.tag, msg) else: msg = "warning: %s\n" % msg + self.warnings.append(msg) - sys.stderr.write(msg) + if self.show_warnings: + sys.stderr.write(msg) def parse_element(self, node): if node.tag not in self.tags: From 9988ad1e5d149d917dd0ca632b751052790a5440 Mon Sep 17 00:00:00 2001 From: "M. Sonntag" Date: Fri, 16 Nov 2018 11:13:32 +0100 Subject: [PATCH 2/4] [tools/dictparser] Add show_warnings on load --- odml/tools/dict_parser.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/odml/tools/dict_parser.py b/odml/tools/dict_parser.py index 19fe1ff8..2da96fc1 100644 --- a/odml/tools/dict_parser.py +++ b/odml/tools/dict_parser.py @@ -104,8 +104,14 @@ class DictReader: A reader to parse dictionaries with odML content into a proper odML document. """ - def __init__(self): + def __init__(self, show_warnings=True): + """ + :param show_warnings: Toggle whether to print warnings to the command line. + Any warnings can be accessed via the Reader's class + warnings attribute after parsing is done. + """ self.parsed_doc = None # Python dictionary object equivalent + self.show_warnings = show_warnings self.warnings = [] def is_valid_attribute(self, attr, fmt): @@ -116,8 +122,9 @@ def is_valid_attribute(self, attr, fmt): return attr msg = "Invalid element <%s> inside <%s> tag" % (attr, fmt.__class__.__name__) - print(msg) self.warnings.append(msg) + if self.show_warnings: + print(msg) return None def to_odml(self, parsed_doc): From 3f11ff90bf0fca39e6c8cfd7a11299dbeae98a89 Mon Sep 17 00:00:00 2001 From: "M. Sonntag" Date: Fri, 16 Nov 2018 11:13:55 +0100 Subject: [PATCH 3/4] [tools/odmlparser] Add show warnings on load --- odml/tools/odmlparser.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/odml/tools/odmlparser.py b/odml/tools/odmlparser.py index 00dbdec0..369b9977 100644 --- a/odml/tools/odmlparser.py +++ b/odml/tools/odmlparser.py @@ -107,19 +107,25 @@ class ODMLReader: json_odml_doc = ODMLReader(parser='JSON').from_file("odml_doc.json") """ - def __init__(self, parser='XML'): + def __init__(self, parser='XML', show_warnings=True): + """ + :param parser: odml parser; supported are 'XML', 'JSON', 'YAML' and 'RDF'. + :param show_warnings: Toggle whether to print warnings to the command line. + """ self.doc = None # odML document self.parsed_doc = None # Python dictionary object equivalent parser = parser.upper() if parser not in SUPPORTED_PARSERS: raise NotImplementedError("'%s' odML parser does not exist!" % parser) self.parser = parser + self.show_warnings = show_warnings self.warnings = [] def from_file(self, file, doc_format=None): if self.parser == 'XML': - par = xmlparser.XMLReader(ignore_errors=True) + par = xmlparser.XMLReader(ignore_errors=True, + show_warnings=self.show_warnings) self.warnings = par.warnings self.doc = par.from_file(file) return self.doc @@ -132,7 +138,8 @@ def from_file(self, file, doc_format=None): print(err) return - self.doc = DictReader().to_odml(self.parsed_doc) + par = DictReader(show_warnings=self.show_warnings) + self.doc = par.to_odml(self.parsed_doc) # Provide original file name via the in memory document self.doc._origin_file_name = basename(file) return self.doc @@ -145,7 +152,8 @@ def from_file(self, file, doc_format=None): print("JSON Decoder Error: %s" % err) return - self.doc = DictReader().to_odml(self.parsed_doc) + par = DictReader(show_warnings=self.show_warnings) + self.doc = par.to_odml(self.parsed_doc) # Provide original file name via the in memory document self.doc._origin_file_name = basename(file) return self.doc From 3654d37540adb28063a96fedca57adb4c4f375b0 Mon Sep 17 00:00:00 2001 From: "M. Sonntag" Date: Fri, 16 Nov 2018 11:14:19 +0100 Subject: [PATCH 4/4] [fileio] Add show warnings flag on load Closes #305 --- odml/fileio.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/odml/fileio.py b/odml/fileio.py index 2d095bd5..d9e52695 100644 --- a/odml/fileio.py +++ b/odml/fileio.py @@ -2,13 +2,14 @@ from .tools.odmlparser import ODMLReader, ODMLWriter -def load(filename, backend="xml"): +def load(filename, backend="xml", show_warnings=True): """ Load an odML document from file. :param filename: Path and filename from where the odML document is to be loaded and parsed. :param backend: File format of the file containing the odML document. The default format is XML. + :param show_warnings: Toggle whether to print warnings to the command line. :return: The parsed odML document. """ if not os.path.exists(filename): @@ -16,7 +17,7 @@ def load(filename, backend="xml"): (filename if len(filename) < 20 else "...%s" % filename[19:]) raise FileNotFoundError(msg) - reader = ODMLReader(backend) + reader = ODMLReader(backend, show_warnings) return reader.from_file(filename)