Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/planemo/xml/validation.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:26e78fe6e8c4 |
---|---|
1 """Module describing abstractions for validating XML content.""" | |
2 import abc | |
3 import subprocess | |
4 from collections import namedtuple | |
5 | |
6 from galaxy.tool_util.deps.commands import which | |
7 from galaxy.util import unicodify | |
8 try: | |
9 from lxml import etree | |
10 except ImportError: | |
11 etree = None | |
12 | |
13 XMLLINT_COMMAND = "xmllint --noout --schema {0} {1} 2>&1" | |
14 INSTALL_VALIDATOR_MESSAGE = ("This feature requires an external dependency " | |
15 "to function, pleaes install xmllint (e.g 'brew " | |
16 "install libxml2' or 'apt-get install " | |
17 "libxml2-utils'.") | |
18 | |
19 | |
20 class XsdValidator(object): | |
21 """Class allowing validation of XML files against XSD schema.""" | |
22 | |
23 __metaclass__ = abc.ABCMeta | |
24 | |
25 @abc.abstractmethod | |
26 def validate(self, schema_path, target_path): | |
27 """Validate ``target_path`` against ``schema_path``. | |
28 | |
29 :return type: ValidationResult | |
30 """ | |
31 | |
32 @abc.abstractmethod | |
33 def enabled(self): | |
34 """Return True iff system has dependencies for this validator. | |
35 | |
36 :return type: bool | |
37 """ | |
38 | |
39 | |
40 ValidationResult = namedtuple("ValidationResult", ["passed", "output"]) | |
41 | |
42 | |
43 class LxmlValidator(XsdValidator): | |
44 """Validate XSD files using lxml library.""" | |
45 | |
46 def validate(self, schema_path, target_path): | |
47 try: | |
48 xsd_doc = etree.parse(schema_path) | |
49 xsd = etree.XMLSchema(xsd_doc) | |
50 xml = etree.parse(target_path) | |
51 passed = xsd.validate(xml) | |
52 return ValidationResult(passed, xsd.error_log) | |
53 except etree.XMLSyntaxError as e: | |
54 return ValidationResult(False, unicodify(e)) | |
55 | |
56 def enabled(self): | |
57 return etree is not None | |
58 | |
59 | |
60 class XmllintValidator(XsdValidator): | |
61 """Validate XSD files with the external tool xmllint.""" | |
62 | |
63 def validate(self, schema_path, target_path): | |
64 command = XMLLINT_COMMAND.format(schema_path, target_path) | |
65 p = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) | |
66 stdout, _ = p.communicate() | |
67 passed = p.returncode == 0 | |
68 return ValidationResult(passed, stdout) | |
69 | |
70 def enabled(self): | |
71 return bool(which("xmllint")) | |
72 | |
73 | |
74 VALIDATORS = [LxmlValidator(), XmllintValidator()] | |
75 | |
76 | |
77 def get_validator(require=True): | |
78 """Return a :class:`XsdValidator` object based on available dependencies.""" | |
79 for validator in VALIDATORS: | |
80 if validator.enabled(): | |
81 return validator | |
82 | |
83 if require: | |
84 raise Exception(INSTALL_VALIDATOR_MESSAGE) | |
85 | |
86 return None | |
87 | |
88 | |
89 __all__ = ( | |
90 "get_validator", | |
91 "XsdValidator", | |
92 ) |