Skip to content

Commit f316b8b

Browse files
committed
Merge pull request #1444 from satra/fix/prov
fix: cleaned up provenance generation
2 parents 5d335cb + 669dbaf commit f316b8b

File tree

5 files changed

+41
-17
lines changed

5 files changed

+41
-17
lines changed

Diff for: doc/_templates/indexsidebar.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<h3>{{ _('Links') }}</h3>
33

44
<ul>
5-
<li>Docs: <a href="http://nipy.org/nipype">Stable</a> · <a href="http://www.mit.edu/~satra/nipype-nightly/">Nightly</a></li>
5+
<li>Docs: <a href="http://nipy.org/nipype">Stable</a> · <a href="http://nipype.readthedocs.org/en/latest/">Dev</a></li>
66
<li>Code: <a href="http://github.com/nipy/nipype">Github</a> · <a href="http://github.com/nipy/nipype/issues">Bugs-Requests</a></li>
77
<li>Forum: <a href="http://neurostars.org/t/nipype">User</a> · <a href="http://projects.scipy.org/mailman/listinfo/nipy-devel">Developer</a></li>
88
<li><a href="http://nipy.org/software/license/index.html"><img src="https://img.shields.io/pypi/l/nipype.svg" alt="License"></a> · <a href="about.html#funding">Funding</a></li>

Diff for: nipype/pipeline/engine/utils.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -1269,11 +1269,7 @@ def write_workflow_prov(graph, filename=None, format='all'):
12691269
starter=processes[nodes.index(edgeinfo[0])])
12701270

12711271
# write provenance
1272-
if format in ['provn', 'all']:
1273-
with open(filename + '.provn', 'wt') as fp:
1274-
fp.writelines(ps.g.get_provn())
1275-
if format in ['json', 'all']:
1276-
ps.g.serialize(filename + '.json', format='json')
1272+
ps.write_provenance(filename, format=format)
12771273
return ps.g
12781274

12791275

Diff for: nipype/utils/provenance.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
from .. import get_info
2323
from .filemanip import (md5, hashlib, hash_infile)
24-
from .. import logging
24+
from .. import logging, __version__
2525
iflogger = logging.getLogger('interface')
2626

2727
foaf = pm.Namespace("foaf", "http://xmlns.com/foaf/0.1/")
@@ -185,7 +185,7 @@ def safe_encode(x, as_literal=True):
185185
return dumps(x)
186186
return pm.Literal(dumps(x), nipype_ns['pickle'])
187187
except TypeError as e:
188-
iflogger.info(e)
188+
iflogger.debug(e)
189189
value = "Could not encode: " + str(e)
190190
if not as_literal:
191191
return value
@@ -239,7 +239,7 @@ def prov_encode(graph, value, create_container=True):
239239
return entity
240240

241241

242-
def write_provenance(results, filename='provenance', format='turtle'):
242+
def write_provenance(results, filename='provenance', format='all'):
243243
ps = ProvStore()
244244
ps.add_results(results)
245245
return ps.write_provenance(filename=filename, format=format)
@@ -371,7 +371,8 @@ def add_results(self, results, keep_provenance=False):
371371
user_agent = self.g.agent(get_attr_id(user_attr), user_attr)
372372
agent_attr = {pm.PROV["type"]: pm.PROV["SoftwareAgent"],
373373
pm.PROV["label"]: "Nipype",
374-
foaf["name"]: safe_encode("Nipype")}
374+
foaf["name"]: safe_encode("Nipype"),
375+
nipype_ns["version"]: __version__}
375376
for key, value in list(get_info().items()):
376377
agent_attr.update({nipype_ns[key]: safe_encode(value)})
377378
software_agent = self.g.agent(get_attr_id(agent_attr), agent_attr)
@@ -384,6 +385,17 @@ def write_provenance(self, filename='provenance', format='all'):
384385
if format in ['provn', 'all']:
385386
with open(filename + '.provn', 'wt') as fp:
386387
fp.writelines(self.g.get_provn())
387-
if format in ['json', 'all']:
388-
g.serialize(filename + '.json', format='json')
388+
try:
389+
if format in ['rdf', 'all']:
390+
if len(self.g.bundles) == 0:
391+
rdf_format = 'turtle'
392+
ext = '.ttl'
393+
else:
394+
rdf_format = 'trig'
395+
ext = '.trig'
396+
self.g.serialize(filename + ext, format='rdf', rdf_format=rdf_format)
397+
if format in ['jsonld']:
398+
self.g.serialize(filename + '.jsonld', format='rdf', rdf_format='json-ld', indent=4)
399+
except pm.serializers.DoNotExist:
400+
pass
389401
return self.g

Diff for: nipype/utils/tests/test_filemanip.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from tempfile import mkstemp, mkdtemp
77
import warnings
88

9-
from nipype.testing import assert_equal, assert_true, assert_false, TempFATFS
10-
from nipype.utils.filemanip import (save_json, load_json,
9+
from ...testing import assert_equal, assert_true, assert_false, TempFATFS
10+
from ...utils.filemanip import (save_json, load_json,
1111
fname_presuffix, fnames_presuffix,
1212
hash_rename, check_forhash,
1313
copyfile, copyfiles,
@@ -176,7 +176,7 @@ def test_copyfallback():
176176
pth, hdrname = os.path.split(orig_hdr)
177177
try:
178178
fatfs = TempFATFS()
179-
except IOError:
179+
except (IOError, OSError):
180180
warnings.warn('Fuse mount failed. copyfile fallback tests skipped.')
181181
else:
182182
with fatfs as fatdir:

Diff for: nipype/utils/tests/test_provenance.py

+18-2
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
standard_library.install_aliases()
55
from builtins import str
66

7-
import sys
7+
import os
8+
from tempfile import mkdtemp
89

910
from ...testing import assert_equal, assert_true, assert_false
1011

1112
from ..provenance import ProvStore, safe_encode, text_type
1213

13-
1414
def test_provenance():
1515
ps = ProvStore()
1616
from ...interfaces.base import CommandLine
@@ -20,6 +20,22 @@ def test_provenance():
2020
prov_json = ps.g.serialize(format='json')
2121
yield assert_true, 'echo hello' in provn
2222

23+
def test_provenance_exists():
24+
tempdir = mkdtemp()
25+
cwd = os.getcwd()
26+
os.chdir(tempdir)
27+
from ...interfaces.base import CommandLine
28+
from ... import config
29+
provenance_state = config.get('execution', 'write_provenance')
30+
hash_state = config.get('execution', 'hash_method')
31+
config.enable_provenance()
32+
CommandLine('echo hello').run()
33+
config.set('execution', 'write_provenance', provenance_state)
34+
config.set('execution', 'hash_method', hash_state)
35+
provenance_exists = os.path.exists(os.path.join(tempdir, 'provenance.provn'))
36+
os.chdir(cwd)
37+
yield assert_true, provenance_exists
38+
2339
def test_safe_encode():
2440
a = '\xc3\xa9lg'
2541
out = safe_encode(a)

0 commit comments

Comments
 (0)