|
7 | 7 | from tempfile import TemporaryDirectory |
8 | 8 | from typing import Iterator, Optional, Callable |
9 | 9 |
|
10 | | -import nanopub |
11 | 10 | import networkx as nx |
12 | 11 | import noodles |
13 | 12 | import rdflib |
14 | 13 | from noodles.interface import PromisedObject |
15 | | -from rdflib import RDF, RDFS, DCTERMS |
| 14 | +from rdflib import RDF |
16 | 15 | from rdflib.tools.rdf2dot import rdf2dot |
17 | 16 | from requests import HTTPError |
18 | 17 |
|
| 18 | +from fairworkflows import namespaces, LinguisticSystem, LINGSYS_PYTHON |
19 | 19 | from fairworkflows.config import LOGGER |
20 | | -from fairworkflows import namespaces, LinguisticSystem, LINGSYS_ENGLISH, LINGSYS_PYTHON |
21 | 20 | from fairworkflows.fairstep import FairStep |
| 21 | +from fairworkflows.prov import WorkflowRetroProv, prov_logger |
22 | 22 | from fairworkflows.rdf_wrapper import RdfWrapper |
23 | 23 |
|
24 | 24 |
|
@@ -363,47 +363,31 @@ def execute(self, *args, **kwargs): |
363 | 363 | Returns a tuple (result, retroprov), where result is the final output of the executed |
364 | 364 | workflow and retroprov is the retrospective provenance logged during execution. |
365 | 365 | """ |
366 | | - |
367 | 366 | if not hasattr(self, 'workflow_level_promise'): |
368 | 367 | raise ValueError('Cannot execute workflow as no noodles step_level_promise has been constructed.') |
369 | | - |
370 | | - log = io.StringIO() |
371 | | - log_handler = logging.StreamHandler(log) |
372 | | - formatter = logging.Formatter('%(asctime)s - %(message)s') |
373 | | - log_handler.setFormatter(formatter) |
374 | | - |
375 | | - LOGGER.setLevel(logging.INFO) |
376 | | - LOGGER.handlers = [log_handler] |
| 368 | + prov_logger.empty() |
377 | 369 | self.workflow_level_promise = noodles.workflow.from_call( |
378 | 370 | noodles.get_workflow(self.workflow_level_promise).root_node.foo, args, kwargs, {}) |
379 | 371 | result = noodles.run_single(self.workflow_level_promise) |
380 | 372 |
|
381 | 373 | # Generate the retrospective provenance as a (nano-) Publication object |
382 | | - retroprov = self._generate_retrospective_prov_publication(log.getvalue()) |
| 374 | + retroprov = self._generate_retrospective_prov_publication() |
383 | 375 |
|
384 | 376 | return result, retroprov |
385 | 377 |
|
386 | | - def _generate_retrospective_prov_publication(self, log:str) -> nanopub.Publication: |
| 378 | + def _generate_retrospective_prov_publication(self) -> WorkflowRetroProv: |
387 | 379 | """ |
388 | 380 | Utility method for generating a Publication object for the retrospective |
389 | 381 | provenance of this workflow. Uses the given 'log' string as the actual |
390 | 382 | provenance for now. |
391 | 383 | """ |
392 | | - log_message = rdflib.Literal(log) |
393 | | - this_retroprov = rdflib.BNode('retroprov') |
394 | | - if self.uri is None or self.uri == 'None': # TODO: This is horrific |
395 | | - this_workflow = rdflib.URIRef('http://www.example.org/unpublishedworkflow') |
| 384 | + if self._is_published: |
| 385 | + workflow_uri = rdflib.URIRef(self.uri) |
396 | 386 | else: |
397 | | - this_workflow = rdflib.URIRef(self.uri) |
398 | | - |
399 | | - retroprov_assertion = rdflib.Graph() |
400 | | - retroprov_assertion.add((this_retroprov, rdflib.RDF.type, namespaces.PROV.Activity)) |
401 | | - retroprov_assertion.add((this_retroprov, namespaces.PROV.wasDerivedFrom, this_workflow)) |
402 | | - retroprov_assertion.add((this_retroprov, RDFS.label, log_message)) |
403 | | - retroprov = nanopub.Publication.from_assertion(assertion_rdf=retroprov_assertion) |
404 | | - |
405 | | - return retroprov |
| 387 | + workflow_uri = rdflib.URIRef('http://www.example.org/unpublishedworkflow') |
406 | 388 |
|
| 389 | + step_provs = prov_logger.get_all() |
| 390 | + return WorkflowRetroProv(self, workflow_uri, step_provs) |
407 | 391 |
|
408 | 392 | def draw(self, filepath): |
409 | 393 | """Visualize workflow. |
|
0 commit comments