diff env/lib/python3.7/site-packages/prov/tests/test_xml.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/prov/tests/test_xml.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,395 +0,0 @@
-from __future__ import (absolute_import, division, print_function,
-                        unicode_literals)
-
-import difflib
-import glob
-import inspect
-import io
-from lxml import etree
-import os
-import unittest
-import warnings
-
-from prov.identifier import Namespace, QualifiedName
-from prov.constants import PROV
-import prov.model as prov
-from prov.tests.test_model import AllTestsBase
-from prov.tests.utility import RoundTripTestCase
-
-
-EX_NS = ('ex', 'http://example.com/ns/ex#')
-EX_TR = ('tr', 'http://example.com/ns/tr#')
-
-# Most general way to get the path.
-DATA_PATH = os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(
-    inspect.currentframe()))), "xml")
-
-
-def remove_empty_tags(tree):
-    if tree.text is not None and tree.text.strip() == "":
-        tree.text = None
-    for elem in tree:
-        if etree.iselement(elem):
-            remove_empty_tags(elem)
-
-
-def compare_xml(doc1, doc2):
-    """
-    Helper function to compare two XML files. It will parse both once again
-    and write them in a canonical fashion.
-    """
-    try:
-        doc1.seek(0, 0)
-    except AttributeError:
-        pass
-    try:
-        doc2.seek(0, 0)
-    except AttributeError:
-        pass
-
-    obj1 = etree.parse(doc1)
-    obj2 = etree.parse(doc2)
-
-    # Remove comments from both.
-    for c in obj1.getroot().xpath("//comment()"):
-        p = c.getparent()
-        p.remove(c)
-    for c in obj2.getroot().xpath("//comment()"):
-        p = c.getparent()
-        p.remove(c)
-
-    remove_empty_tags(obj1.getroot())
-    remove_empty_tags(obj2.getroot())
-
-    buf = io.BytesIO()
-    obj1.write_c14n(buf)
-    buf.seek(0, 0)
-    str1 = buf.read().decode()
-    str1 = [_i.strip() for _i in str1.splitlines() if _i.strip()]
-
-    buf = io.BytesIO()
-    obj2.write_c14n(buf)
-    buf.seek(0, 0)
-    str2 = buf.read().decode()
-    str2 = [_i.strip() for _i in str2.splitlines() if _i.strip()]
-
-    unified_diff = difflib.unified_diff(str1, str2)
-
-    err_msg = "\n".join(unified_diff)
-    if err_msg:
-        msg = "Strings are not equal.\n"
-        raise AssertionError(msg + err_msg)
-
-
-class ProvXMLTestCase(unittest.TestCase):
-    def test_serialization_example_6(self):
-        """
-        Test the serialization of example 6 which is a simple entity
-        description.
-        """
-        document = prov.ProvDocument()
-        ex_ns = document.add_namespace(*EX_NS)
-        document.add_namespace(*EX_TR)
-
-        document.entity("tr:WD-prov-dm-20111215", (
-            (prov.PROV_TYPE, ex_ns["Document"]),
-            ("ex:version", "2")
-        ))
-
-        with io.BytesIO() as actual:
-            document.serialize(format='xml', destination=actual)
-            compare_xml(os.path.join(DATA_PATH, "example_06.xml"), actual)
-
-    def test_serialization_example_7(self):
-        """
-        Test the serialization of example 7 which is a basic activity.
-        """
-        document = prov.ProvDocument()
-        document.add_namespace(*EX_NS)
-
-        document.activity(
-            "ex:a1",
-            "2011-11-16T16:05:00",
-            "2011-11-16T16:06:00", [
-                (prov.PROV_TYPE, prov.Literal("ex:edit", prov.XSD_QNAME)),
-                ("ex:host", "server.example.org")])
-
-        with io.BytesIO() as actual:
-            document.serialize(format='xml', destination=actual)
-            compare_xml(os.path.join(DATA_PATH, "example_07.xml"), actual)
-
-    def test_serialization_example_8(self):
-        """
-        Test the serialization of example 8 which deals with generation.
-        """
-        document = prov.ProvDocument()
-        document.add_namespace(*EX_NS)
-
-        e1 = document.entity("ex:e1")
-        a1 = document.activity("ex:a1")
-
-        document.wasGeneratedBy(entity=e1, activity=a1,
-                                time="2001-10-26T21:32:52",
-                                other_attributes={"ex:port": "p1"})
-
-        e2 = document.entity("ex:e2")
-
-        document.wasGeneratedBy(entity=e2, activity=a1,
-                                time="2001-10-26T10:00:00",
-                                other_attributes={"ex:port": "p2"})
-
-        with io.BytesIO() as actual:
-            document.serialize(format='xml', destination=actual)
-            compare_xml(os.path.join(DATA_PATH, "example_08.xml"), actual)
-
-    def test_deserialization_example_6(self):
-        """
-        Test the deserialization of example 6 which is a simple entity
-        description.
-        """
-        actual_doc = prov.ProvDocument.deserialize(
-            source=os.path.join(DATA_PATH, "example_06.xml"),
-            format="xml")
-
-        expected_document = prov.ProvDocument()
-        ex_ns = expected_document.add_namespace(*EX_NS)
-        expected_document.add_namespace(*EX_TR)
-
-        expected_document.entity("tr:WD-prov-dm-20111215", (
-            (prov.PROV_TYPE, ex_ns["Document"]),
-            ("ex:version", "2")
-        ))
-
-        self.assertEqual(actual_doc, expected_document)
-
-    def test_deserialization_example_7(self):
-        """
-        Test the deserialization of example 7 which is a simple activity
-        description.
-        """
-        actual_doc = prov.ProvDocument.deserialize(
-            source=os.path.join(DATA_PATH, "example_07.xml"),
-            format="xml")
-
-        expected_document = prov.ProvDocument()
-        ex_ns = Namespace(*EX_NS)
-        expected_document.add_namespace(ex_ns)
-
-        expected_document.activity(
-            "ex:a1",
-            "2011-11-16T16:05:00",
-            "2011-11-16T16:06:00", [
-                (prov.PROV_TYPE, QualifiedName(ex_ns, "edit")),
-                ("ex:host", "server.example.org")])
-
-        self.assertEqual(actual_doc, expected_document)
-
-    def test_deserialization_example_04_and_05(self):
-        """
-        Example 4 and 5 have a different type specification. They use an
-        xsi:type as an attribute on an entity. This can be read but if
-        written again it will become an XML child element. This is
-        semantically identical but cannot be tested with a round trip.
-        """
-        # Example 4.
-        xml_string = """
-        <prov:document
-            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-            xmlns:prov="http://www.w3.org/ns/prov#"
-            xmlns:ex="http://example.com/ns/ex#"
-            xmlns:tr="http://example.com/ns/tr#">
-
-          <prov:entity prov:id="tr:WD-prov-dm-20111215" xsi:type="prov:Plan">
-            <prov:type xsi:type="xsd:QName">ex:Workflow</prov:type>
-          </prov:entity>
-
-        </prov:document>
-        """
-        with io.StringIO() as xml:
-            xml.write(xml_string)
-            xml.seek(0, 0)
-            actual_document = prov.ProvDocument.deserialize(source=xml,
-                                                            format="xml")
-
-        expected_document = prov.ProvDocument()
-        ex_ns = Namespace(*EX_NS)
-        expected_document.add_namespace(ex_ns)
-        expected_document.add_namespace(*EX_TR)
-
-        # The xsi:type attribute is mapped to a proper PROV attribute.
-        expected_document.entity("tr:WD-prov-dm-20111215", (
-            (prov.PROV_TYPE, QualifiedName(ex_ns, "Workflow")),
-            (prov.PROV_TYPE, PROV["Plan"])))
-
-        self.assertEqual(actual_document, expected_document, "example_04")
-
-        # Example 5.
-        xml_string = """
-        <prov:document
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-          xmlns:prov="http://www.w3.org/ns/prov#"
-          xmlns:ex="http://example.com/ns/ex#"
-          xmlns:tr="http://example.com/ns/tr#">
-
-        <prov:entity prov:id="tr:WD-prov-dm-20111215" xsi:type="prov:Plan">
-          <prov:type xsi:type="xsd:QName">ex:Workflow</prov:type>
-          <prov:type xsi:type="xsd:QName">prov:Plan</prov:type> <!-- inferred -->
-          <prov:type xsi:type="xsd:QName">prov:Entity</prov:type> <!-- inferred -->
-        </prov:entity>
-
-        </prov:document>
-        """
-        with io.StringIO() as xml:
-            xml.write(xml_string)
-            xml.seek(0, 0)
-            actual_document = prov.ProvDocument.deserialize(source=xml,
-                                                            format="xml")
-
-        expected_document = prov.ProvDocument()
-        expected_document.add_namespace(*EX_NS)
-        expected_document.add_namespace(*EX_TR)
-
-        # The xsi:type attribute is mapped to a proper PROV attribute.
-        expected_document.entity("tr:WD-prov-dm-20111215", (
-            (prov.PROV_TYPE, QualifiedName(ex_ns, "Workflow")),
-            (prov.PROV_TYPE, PROV["Entity"]),
-            (prov.PROV_TYPE, PROV["Plan"])
-        ))
-
-        self.assertEqual(actual_document, expected_document, "example_05")
-
-    def test_other_elements(self):
-        """
-        PROV XML uses the <prov:other> element to enable the storage of non
-        PROV information in a PROV XML document. It will be ignored by this
-        library a warning will be raised informing the user.
-        """
-        # This is example 42 from the PROV XML documentation.
-        xml_string = """
-        <prov:document
-            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-            xmlns:prov="http://www.w3.org/ns/prov#"
-            xmlns:ex="http://example.com/ns/ex#">
-
-          <!-- prov statements go here -->
-
-          <prov:other>
-            <ex:foo>
-              <ex:content>bar</ex:content>
-            </ex:foo>
-          </prov:other>
-
-          <!-- more prov statements can go here -->
-
-        </prov:document>
-        """
-        with warnings.catch_warnings(record=True) as w:
-            warnings.simplefilter("always")
-
-            with io.StringIO() as xml:
-                xml.write(xml_string)
-                xml.seek(0, 0)
-                doc = prov.ProvDocument.deserialize(source=xml, format="xml")
-
-        self.assertEqual(len(w), 1)
-        self.assertTrue(
-            "Document contains non-PROV information in <prov:other>. It will "
-            "be ignored in this package." in str(w[0].message))
-
-        # This document contains nothing else.
-        self.assertEqual(len(doc._records), 0)
-
-    def test_nested_default_namespace(self):
-        """
-        Tests that a default namespace that is defined in a lower level tag is
-        written to a bundle.
-        """
-        filename = os.path.join(DATA_PATH, "nested_default_namespace.xml")
-        doc = prov.ProvDocument.deserialize(source=filename, format="xml")
-
-        ns = Namespace("", "http://example.org/0/")
-
-        self.assertEqual(len(doc._records), 1)
-        self.assertEqual(doc.get_default_namespace(), ns)
-        self.assertEqual(doc._records[0].identifier.namespace, ns)
-        self.assertEqual(doc._records[0].identifier.localpart, "e001")
-
-    def test_redefining_namespaces(self):
-        """
-        Test the behaviour when namespaces are redefined at the element level.
-        """
-        filename = os.path.join(DATA_PATH,
-                                "namespace_redefined_but_does_not_change.xml")
-        doc = prov.ProvDocument.deserialize(source=filename, format="xml")
-        # This has one record part of the original namespace.
-        self.assertEqual(len(doc._records), 1)
-        ns = Namespace("ex", "http://example.com/ns/ex#")
-        self.assertEqual(doc._records[0].attributes[0][1].namespace, ns)
-
-        # This also has one record but now in a different namespace.
-        filename = os.path.join(DATA_PATH, "namespace_redefined.xml")
-        doc = prov.ProvDocument.deserialize(source=filename, format="xml")
-        new_ns = doc._records[0].attributes[0][1].namespace
-        self.assertNotEqual(new_ns, ns)
-        self.assertEqual(new_ns.uri, "http://example.com/ns/new_ex#")
-
-
-class ProvXMLRoundTripFromFileTestCase(unittest.TestCase):
-    def _perform_round_trip(self, filename, force_types=False):
-        document = prov.ProvDocument.deserialize(
-            source=filename, format="xml")
-
-        with io.BytesIO() as new_xml:
-            document.serialize(format='xml', destination=new_xml,
-                               force_types=force_types)
-            compare_xml(filename, new_xml)
-
-
-# Add one test for each found file. Lazy way to do metaprogramming...
-# I think parametrized tests are justified in this case as the test
-# function names make it clear what is going on.
-for filename in glob.iglob(os.path.join(
-        DATA_PATH, "*" + os.path.extsep + "xml")):
-    name = os.path.splitext(os.path.basename(filename))[0]
-    test_name = "test_roundtrip_from_xml_%s" % name
-
-    # Cannot round trip this one as the namespace in the PROV data model are
-    # always defined per bundle and not per element.
-    if name in ("nested_default_namespace",
-                "nested_changing_default_namespace",
-                "namespace_redefined_but_does_not_change",
-                "namespace_redefined"):
-        continue
-
-    # Python creates closures on function calls...
-    def get_fct(f):
-        # Some test files have a lot of type declarations...
-        if name in ["pc1"]:
-            force_types = True
-        else:
-            force_types = False
-
-        def fct(self):
-            self._perform_round_trip(f, force_types=force_types)
-        return fct
-
-    fct = get_fct(filename)
-    fct.__name__ = str(test_name)
-
-    # Disabled round-trip XML comparisons since deserializing then serializing
-    # PROV-XML does not maintain XML equivalence. (For example, prov:entity
-    # elements with type prov:Plan become prov:plan elements)
-    # TODO: Revisit these tests
-
-    # setattr(ProvXMLRoundTripFromFileTestCase, test_name, fct)
-
-
-class RoundTripXMLTests(RoundTripTestCase, AllTestsBase):
-    FORMAT = 'xml'
-
-
-if __name__ == '__main__':
-    unittest.main()