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#")
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)
from __future__ import (absolute_import, division, print_function, unicode_literals) import six from prov.identifier import Namespace __author__ = 'Trung Dong Huynh' __email__ = '*****@*****.**' XSD = Namespace('xsd', 'http://www.w3.org/2001/XMLSchema#') PROV = Namespace('prov', 'http://www.w3.org/ns/prov#') XSI = Namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance') # C1. Entities/Activities PROV_ENTITY = PROV['Entity'] PROV_ACTIVITY = PROV['Activity'] PROV_GENERATION = PROV['Generation'] PROV_USAGE = PROV['Usage'] PROV_COMMUNICATION = PROV['Communication'] PROV_START = PROV['Start'] PROV_END = PROV['End'] PROV_INVALIDATION = PROV['Invalidation'] # C2. Derivations PROV_DERIVATION = PROV['Derivation'] # C3. Agents/Responsibility PROV_AGENT = PROV['Agent'] PROV_ATTRIBUTION = PROV['Attribution'] PROV_ASSOCIATION = PROV['Association'] PROV_DELEGATION = PROV['Delegation']
import os import uuid import json from datetime import datetime import pathlib from prov.identifier import Namespace import prov.model as prov from prov.dot import prov_to_dot # prov namespace PROV_ORGANISATION = prov.PROV["Organization"] PROV_SOFTWARE_AGENT = prov.PROV["SoftwareAgent"] # provone namespace PROVONE = Namespace("provone", uri="http://purl.dataone.org/provone/2015/01/15/ontology#") PROVONE_WORKFLOW = PROVONE["Workflow"] PROVONE_DATA = PROVONE["Data"] PROVONE_EXECUTION = PROVONE["Execution"] # dcterms namespace DCTERMS = Namespace("dct", uri="http://purl.org/dc/terms/") DCTERMS_SOURCE = DCTERMS["source"] # roocs namespace ROOCS = Namespace("roocs", uri="urn:roocs:") class Provenance(object): def __init__(self, output_dir): if isinstance(output_dir, pathlib.Path):
from __future__ import unicode_literals from __future__ import print_function from __future__ import division from __future__ import absolute_import from future import standard_library standard_library.install_aliases() from prov.identifier import Namespace HYSDS = Namespace('hysds', 'http://hysds.domain.com/hysds/0.1#') EOS = Namespace('eos', 'http://nasa.gov/eos.owl#') GCIS = Namespace('gcis', 'http://data.globalchange.gov/gcis.owl#') INFO = Namespace('info', 'http://info-uri.info/') BIBO = Namespace('bibo', 'http://purl.org/ontology/bibo/') DCTERMS = Namespace('dcterms', 'http://purl.org/dc/terms/') # EOS convenience defs EOS_COLLECTION = EOS['collection'] EOS_SHORTNAME = EOS['shortName'] EOS_LONGNAME = EOS['longName'] EOS_LEVEL = EOS['level'] EOS_VERSION = EOS['version'] EOS_DATASET = EOS['dataset'] EOS_PARTOFCOLLECTION = EOS['partOfCollection'] EOS_GRANULE = EOS['granule'] EOS_PRODUCT = EOS['product'] EOS_FILE = EOS['file'] EOS_PLATFORM = EOS['platform'] EOS_INSTRUMENT = EOS['instrument'] EOS_SENSOR = EOS['sensor'] EOS_SOFTWARE = EOS['software'] EOS_ALGORITHM = EOS['algorithm']
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")
# 1. Bump major number if removing/"breaking" resources or PROV statements # 2. Bump minor number if adding resources or PROV statements # 3. Bump patch number for non-breaking non-adding changes, # e.g. fixing broken relative paths CWLPROV_VERSION = "https://w3id.org/cwl/prov/0.6.0" # Research Object folders METADATA = "metadata" DATA = "data" WORKFLOW = "workflow" SNAPSHOT = "snapshot" # sub-folders MAIN = os.path.join(WORKFLOW, "main") PROVENANCE = os.path.join(METADATA, "provenance") LOGS = os.path.join(METADATA, "logs") WFDESC = Namespace("wfdesc", "http://purl.org/wf4ever/wfdesc#") WFPROV = Namespace("wfprov", "http://purl.org/wf4ever/wfprov#") WF4EVER = Namespace("wf4ever", "http://purl.org/wf4ever/wf4ever#") RO = Namespace("ro", "http://purl.org/wf4ever/ro#") ORE = Namespace("ore", "http://www.openarchives.org/ore/terms/") FOAF = Namespace("foaf", "http://xmlns.com/foaf/0.1/") SCHEMA = Namespace("schema", "http://schema.org/") CWLPROV = Namespace("cwlprov", "https://w3id.org/cwl/prov#") ORCID = Namespace("orcid", "https://orcid.org/") UUID = Namespace("id", "urn:uuid:") # BagIt and YAML always use UTF-8 ENCODING = "UTF-8" TEXT_PLAIN = 'text/plain; charset="%s"' % ENCODING # sha1, compatible with the File type's "checksum" field
# # PROV record constants - PROV-DM # Built-in namespaces from prov.identifier import Namespace XSD = Namespace('xsd', 'http://www.w3.org/2001/XMLSchema#') PROV = Namespace('prov', 'http://www.w3.org/ns/prov#') # C1. Entities/Activities PROV_ENTITY = PROV['Entity'] PROV_ACTIVITY = PROV['Activity'] PROV_GENERATION = PROV['Generation'] PROV_USAGE = PROV['Usage'] PROV_COMMUNICATION = PROV['Communication'] PROV_START = PROV['Start'] PROV_END = PROV['End'] PROV_INVALIDATION = PROV['Invalidation'] # C2. Derivations PROV_DERIVATION = PROV['Derivation'] # C3. Agents/Responsibility PROV_AGENT = PROV['Agent'] PROV_ATTRIBUTION = PROV['Attribution'] PROV_ASSOCIATION = PROV['Association'] PROV_DELEGATION = PROV['Delegation'] PROV_INFLUENCE = PROV['Influence'] # C4. Bundles PROV_BUNDLE = PROV['Bundle'] # C5. Alternate PROV_ALTERNATE = PROV['Alternate']