Repository: nipy/nipype

Issue:
Release of current version
@chrisfilo @satra 
Hi Developers! Might it be an idea to release a new version of Nipype? The current version at the time of writing is nipype 0.13.1, from May 2017. Specifically, many examples that we made for [Porcupine](https://timvanmourik.github.io/Porcupine) leverage the master version of the S3DataGrabber, in order to automatically pull [openneuro](https://openneuro.org) buckets from Amazon. It would be a great help if this becomes available in the 'pip install nipype' version.


Discussion:
Sounds good to me but @satra is more on top of things.
i'm thinking a 0.14 release rather than 1.0 - i would like to see traitlets in 1.0.

a few pending things:

- [ ] fix prov issue with nipype
- [ ] review recent PRs and make sure they are included in the release.

but we could do a pre-release like an rc1 and then people should be able to install with `pip install --pre nipype` - note that this will install pre releases of all dependencies as well.

let's aim for a formal release in two weeks. @mgxd - could you please take the lead on this?
:+1: on 0.14

As a policy, could we set a 2 month feature release cycle, such that if traitlets isn't ready by December, we do 0.15 then?
@satra, could you link to the specific issues you have in your list for those pending things before 0.14?

Resolving patch:
diff --git a/doc/conf.py b/doc/conf.py
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -82,7 +82,7 @@
 # The short X.Y version.
 version = nipype.__version__
 # The full version, including alpha/beta/rc tags.
-release = "0.13.1"
+release = "0.14.0-rc1"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/nipype/info.py b/nipype/info.py
--- a/nipype/info.py
+++ b/nipype/info.py
@@ -10,7 +10,7 @@
 # full release.  '.dev' as a version_extra string means this is a development
 # version
 # Remove -dev for release
-__version__ = '1.0.0-dev'
+__version__ = '0.14.0-rc1'
 
 
 def get_nipype_gitversion():
diff --git a/nipype/interfaces/niftyfit/asl.py b/nipype/interfaces/niftyfit/asl.py
--- a/nipype/interfaces/niftyfit/asl.py
+++ b/nipype/interfaces/niftyfit/asl.py
@@ -147,7 +147,7 @@ class FitAsl(NiftyFitCommand):
     >>> from nipype.interfaces import niftyfit
     >>> node = niftyfit.FitAsl()
     >>> node.inputs.source_file = 'asl.nii.gz'
-    >>> node.cmdline  
+    >>> node.cmdline
     'fit_asl -source asl.nii.gz -cbf asl_cbf.nii.gz -error asl_error.nii.gz \
 -syn asl_syn.nii.gz'
 


Test patch:
diff --git a/nipype/algorithms/tests/test_mesh_ops.py b/nipype/algorithms/tests/test_mesh_ops.py
--- a/nipype/algorithms/tests/test_mesh_ops.py
+++ b/nipype/algorithms/tests/test_mesh_ops.py
@@ -15,7 +15,7 @@
 
 @pytest.mark.skipif(VTKInfo.no_tvtk(), reason="tvtk is not installed")
 def test_ident_distances(tmpdir):
-    tmpdir.chdir() 
+    tmpdir.chdir()
 
     in_surf = example_data('surf01.vtk')
     dist_ident = m.ComputeMeshWarp()
diff --git a/nipype/interfaces/afni/tests/test_auto_TCatSubBrick.py b/nipype/interfaces/afni/tests/test_auto_TCatSubBrick.py
new file mode 100644
--- /dev/null
+++ b/nipype/interfaces/afni/tests/test_auto_TCatSubBrick.py
@@ -0,0 +1,48 @@
+# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
+from __future__ import unicode_literals
+from ..utils import TCatSubBrick
+
+
+def test_TCatSubBrick_inputs():
+    input_map = dict(args=dict(argstr='%s',
+    ),
+    environ=dict(nohash=True,
+    usedefault=True,
+    ),
+    ignore_exception=dict(nohash=True,
+    usedefault=True,
+    ),
+    in_files=dict(argstr='%s%s ...',
+    copyfile=False,
+    mandatory=True,
+    position=-1,
+    ),
+    num_threads=dict(nohash=True,
+    usedefault=True,
+    ),
+    out_file=dict(argstr='-prefix %s',
+    genfile=True,
+    ),
+    outputtype=dict(),
+    rlt=dict(argstr='-rlt%s',
+    position=1,
+    ),
+    terminal_output=dict(deprecated='1.0.0',
+    nohash=True,
+    ),
+    )
+    inputs = TCatSubBrick.input_spec()
+
+    for key, metadata in list(input_map.items()):
+        for metakey, value in list(metadata.items()):
+            assert getattr(inputs.traits()[key], metakey) == value
+
+
+def test_TCatSubBrick_outputs():
+    output_map = dict(out_file=dict(),
+    )
+    outputs = TCatSubBrick.output_spec()
+
+    for key, metadata in list(output_map.items()):
+        for metakey, value in list(metadata.items()):
+            assert getattr(outputs.traits()[key], metakey) == value
diff --git a/nipype/interfaces/ants/tests/test_resampling.py b/nipype/interfaces/ants/tests/test_resampling.py
--- a/nipype/interfaces/ants/tests/test_resampling.py
+++ b/nipype/interfaces/ants/tests/test_resampling.py
@@ -1,5 +1,5 @@
 # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
-# vi: set ft=python sts=4 ts=4 sw=4 et:                                                                                                                 
+# vi: set ft=python sts=4 ts=4 sw=4 et:
 
 from nipype.interfaces.ants import WarpImageMultiTransform, WarpTimeSeriesImageMultiTransform
 import os
@@ -66,7 +66,7 @@ def create_wtsimt():
 def test_WarpTimeSeriesImageMultiTransform(change_dir, create_wtsimt):
    wtsimt = create_wtsimt
    assert wtsimt.cmdline == 'WarpTimeSeriesImageMultiTransform 4 resting.nii resting_wtsimt.nii \
--R ants_deformed.nii.gz ants_Warp.nii.gz ants_Affine.txt'                                                                                            
+-R ants_deformed.nii.gz ants_Warp.nii.gz ants_Affine.txt'
 
 
 def test_WarpTimeSeriesImageMultiTransform_invaffine(change_dir, create_wtsimt):
diff --git a/nipype/interfaces/cmtk/tests/test_nbs.py b/nipype/interfaces/cmtk/tests/test_nbs.py
--- a/nipype/interfaces/cmtk/tests/test_nbs.py
+++ b/nipype/interfaces/cmtk/tests/test_nbs.py
@@ -31,12 +31,12 @@ def test_importerror(creating_graphs, tmpdir):
     graphlist = creating_graphs
     group1 = graphlist[:3]
     group2 = graphlist[3:]
-    
+
     nbs = NetworkBasedStatistic()
     nbs.inputs.in_group1 = group1
     nbs.inputs.in_group2 = group2
     nbs.inputs.edge_key = "weight"
-    
+
     with pytest.raises(ImportError) as e:
         nbs.run()
     assert "cviewer library is not available" == str(e.value)
diff --git a/nipype/interfaces/tests/test_auto_SimpleInterface.py b/nipype/interfaces/tests/test_auto_SimpleInterface.py
new file mode 100644
--- /dev/null
+++ b/nipype/interfaces/tests/test_auto_SimpleInterface.py
@@ -0,0 +1,16 @@
+# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
+from __future__ import unicode_literals
+from ..base import SimpleInterface
+
+
+def test_SimpleInterface_inputs():
+    input_map = dict(ignore_exception=dict(nohash=True,
+    usedefault=True,
+    ),
+    )
+    inputs = SimpleInterface.input_spec()
+
+    for key, metadata in list(input_map.items()):
+        for metakey, value in list(metadata.items()):
+            assert getattr(inputs.traits()[key], metakey) == value
+
diff --git a/nipype/pipeline/engine/tests/test_utils.py b/nipype/pipeline/engine/tests/test_utils.py
--- a/nipype/pipeline/engine/tests/test_utils.py
+++ b/nipype/pipeline/engine/tests/test_utils.py
@@ -23,7 +23,7 @@ def test_identitynode_removal(tmpdir):
     def test_function(arg1, arg2, arg3):
         import numpy as np
         return (np.array(arg1) + arg2 + arg3).tolist()
-    
+
 
     wf = pe.Workflow(name="testidentity", base_dir=tmpdir.strpath)