Source code for onixcheck.validation

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from os.path import basename
from lxml.etree import XMLSyntaxError
from onixcheck.exeptions import OnixError
from onixcheck.models import OnixFile, Message
from onixcheck.onixfix import OnixFix
from onixcheck import schema


[docs]def validate(infile, schemas=('xsd',)): """Validate an ONIX file. :param infile: File or path to file :type infile: file or str :param schemas: Iterable with paths to custom valdation profiles :type schemas: collections.Iterable[str] :return: List of `Message` objects (invalid ONIX) or empty list (valid ONIX) :rtype: list[Message] """ if hasattr(infile, 'name'): filename = basename(infile.name) else: filename = basename(infile) try: onix_file = OnixFile(infile) except (OnixError, XMLSyntaxError) as e: return [Message.from_exception(e, filename)] messages = [] for s in schemas: if s in ('xsd', 'rng',): try: validator = onix_file.get_validator(s) except OnixError as e: messages.append(Message.from_exception(e, filename)) continue validator(onix_file.xml_tree()) errors = validator.error_log msg = Message.from_logentry messages.extend([msg(err, filename) for err in errors]) for s in schemas: if s in ('google', 'biblon'): if s == 'google': profile = schema.GOOGLE_O30_YML_REFERENCE elif s == 'biblon': profile = schema.BIBLON_O30_YML_REFERENCE validator = OnixFix(infile, profile) validator.validate() messages.extend(validator.errors) return messages