Skip to content

Commit 80ed64d

Browse files
authored
Merge pull request #2831 from effigies/dev/2/min_version
RF: Drop various remaining compatibilities for Python < 3.5
2 parents e057971 + dc89681 commit 80ed64d

File tree

13 files changed

+42
-183
lines changed

13 files changed

+42
-183
lines changed

nipype/info.py

-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
settings in setup.py, the nipy top-level docstring, and for building the
33
docs. In setup.py in particular, we exec this file, so it cannot import nipy
44
"""
5-
import sys
65

76
# nipype version information. An empty version_extra corresponds to a
87
# full release. '.dev' as a version_extra string means this is a development
@@ -152,9 +151,6 @@ def get_nipype_gitversion():
152151
'futures; python_version == "2.7"',
153152
]
154153

155-
if sys.version_info <= (3, 4):
156-
REQUIRES.append('configparser')
157-
158154
TESTS_REQUIRES = ['pytest-cov', 'codecov', 'pytest-env', 'coverage<5']
159155

160156
EXTRA_REQUIRES = {

nipype/interfaces/base/specs.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from warnings import warn
1616
from packaging.version import Version
1717

18-
from ...utils.filemanip import md5, hash_infile, hash_timestamp, to_str
18+
from ...utils.filemanip import md5, hash_infile, hash_timestamp
1919
from .traits_extension import (
2020
traits,
2121
Undefined,
@@ -251,7 +251,7 @@ def get_hashval(self, hash_method=None):
251251
True,
252252
hash_method=hash_method,
253253
hash_files=hash_files)))
254-
return list_withhash, md5(to_str(list_nofilename).encode()).hexdigest()
254+
return list_withhash, md5(str(list_nofilename).encode()).hexdigest()
255255

256256
def _get_sorteddict(self,
257257
objekt,

nipype/interfaces/base/support.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from ... import logging
1616
from ...utils.misc import is_container
17-
from ...utils.filemanip import md5, to_str, hash_infile
17+
from ...utils.filemanip import md5, hash_infile
1818
iflogger = logging.getLogger('nipype.interface')
1919

2020
HELP_LINEWIDTH = 70
@@ -161,7 +161,7 @@ def _get_bunch_hash(self):
161161
# Sort the items of the dictionary, before hashing the string
162162
# representation so we get a predictable order of the
163163
# dictionary.
164-
sorted_dict = to_str(sorted(dict_nofilename.items()))
164+
sorted_dict = str(sorted(dict_nofilename.items()))
165165
return dict_withhash, md5(sorted_dict.encode()).hexdigest()
166166

167167
def _repr_pretty_(self, p, cycle):

nipype/interfaces/tests/test_io.py

-8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
import copy
66
import simplejson
77
import glob
8-
import shutil
98
import os.path as op
10-
import sys
119
from subprocess import Popen
1210
import hashlib
1311
from collections import namedtuple
@@ -577,8 +575,6 @@ def test_jsonsink(tmpdir, inputs_attributes):
577575
# There are three reasons these tests will be skipped:
578576
@pytest.mark.skipif(not have_pybids,
579577
reason="Pybids is not installed")
580-
@pytest.mark.skipif(sys.version_info < (3, 0),
581-
reason="Pybids no longer supports Python 2")
582578
@pytest.mark.skipif(not dist_is_editable('pybids'),
583579
reason="Pybids is not installed in editable mode")
584580
def test_bids_grabber(tmpdir):
@@ -594,8 +590,6 @@ def test_bids_grabber(tmpdir):
594590

595591
@pytest.mark.skipif(not have_pybids,
596592
reason="Pybids is not installed")
597-
@pytest.mark.skipif(sys.version_info < (3, 0),
598-
reason="Pybids no longer supports Python 2")
599593
@pytest.mark.skipif(not dist_is_editable('pybids'),
600594
reason="Pybids is not installed in editable mode")
601595
def test_bids_fields(tmpdir):
@@ -610,8 +604,6 @@ def test_bids_fields(tmpdir):
610604

611605
@pytest.mark.skipif(not have_pybids,
612606
reason="Pybids is not installed")
613-
@pytest.mark.skipif(sys.version_info < (3, 0),
614-
reason="Pybids no longer supports Python 2")
615607
@pytest.mark.skipif(not dist_is_editable('pybids'),
616608
reason="Pybids is not installed in editable mode")
617609
def test_bids_infields_outfields(tmpdir):

nipype/pipeline/engine/nodes.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
from ...utils.misc import flatten, unflatten, str2bool, dict_diff
2222
from ...utils.filemanip import (md5, FileNotFoundError, ensure_list,
2323
simplify_list, copyfiles, fnames_presuffix,
24-
loadpkl, split_filename, load_json, makedirs,
25-
emptydirs, savepkl, to_str, indirectory)
24+
loadpkl, split_filename, load_json,
25+
emptydirs, savepkl, indirectory)
2626

2727
from ...interfaces.base import (traits, InputMultiPath, CommandLine, Undefined,
2828
DynamicTraitedSpec, Bunch, InterfaceResult,
@@ -267,7 +267,7 @@ def output_dir(self):
267267
def set_input(self, parameter, val):
268268
"""Set interface input value"""
269269
logger.debug('[Node] %s - setting input %s = %s', self.name, parameter,
270-
to_str(val))
270+
str(val))
271271
setattr(self.inputs, parameter, deepcopy(val))
272272

273273
def get_output(self, parameter):
@@ -453,7 +453,7 @@ def run(self, updatehash=False):
453453
os.remove(filename)
454454

455455
# Make sure outdir is created
456-
makedirs(outdir, exist_ok=True)
456+
os.makedirs(outdir, exist_ok=True)
457457

458458
# Store runtime-hashfile, pre-execution report, the node and the inputs set.
459459
_save_hashfile(hashfile_unfinished, self._hashed_inputs)
@@ -663,7 +663,7 @@ def _copyfiles_to_wd(self, execute=True, linksonly=False):
663663
if execute and linksonly:
664664
olddir = outdir
665665
outdir = op.join(outdir, '_tempinput')
666-
makedirs(outdir, exist_ok=True)
666+
os.makedirs(outdir, exist_ok=True)
667667

668668
for info in filecopy_info:
669669
files = self.inputs.trait_get().get(info['key'])
@@ -1019,13 +1019,13 @@ def set_input(self, parameter, val):
10191019
Set interface input value or nodewrapper attribute
10201020
Priority goes to interface.
10211021
"""
1022-
logger.debug('setting nodelevel(%s) input %s = %s', to_str(self),
1023-
parameter, to_str(val))
1022+
logger.debug('setting nodelevel(%s) input %s = %s', str(self),
1023+
parameter, str(val))
10241024
self._set_mapnode_input(parameter, deepcopy(val))
10251025

10261026
def _set_mapnode_input(self, name, newvalue):
1027-
logger.debug('setting mapnode(%s) input: %s -> %s', to_str(self), name,
1028-
to_str(newvalue))
1027+
logger.debug('setting mapnode(%s) input: %s -> %s', str(self), name,
1028+
str(newvalue))
10291029
if name in self.iterfield:
10301030
setattr(self._inputs, name, newvalue)
10311031
else:

nipype/pipeline/engine/tests/test_utils.py

-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"""Tests for the engine utils module
55
"""
66
import os
7-
import sys
87
from copy import deepcopy
98
import pytest
109

@@ -159,8 +158,6 @@ def dummy_func(value):
159158
return value + 1
160159

161160

162-
@pytest.mark.skipif(
163-
sys.version_info < (3, 0), reason="the famous segfault #1788")
164161
def test_mapnode_crash(tmpdir):
165162
"""Test mapnode crash when stop_on_first_crash is True"""
166163
cwd = os.getcwd()
@@ -180,8 +177,6 @@ def test_mapnode_crash(tmpdir):
180177
os.chdir(cwd)
181178

182179

183-
@pytest.mark.skipif(
184-
sys.version_info < (3, 0), reason="the famous segfault #1788")
185180
def test_mapnode_crash2(tmpdir):
186181
"""Test mapnode crash when stop_on_first_crash is False"""
187182
cwd = os.getcwd()
@@ -200,8 +195,6 @@ def test_mapnode_crash2(tmpdir):
200195
os.chdir(cwd)
201196

202197

203-
@pytest.mark.skipif(
204-
sys.version_info < (3, 0), reason="the famous segfault #1788")
205198
def test_mapnode_crash3(tmpdir):
206199
"""Test mapnode crash when mapnode is embedded in a workflow"""
207200
tmpdir.chdir()

nipype/pipeline/engine/utils.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
from ... import logging, config, LooseVersion
2222
from ...utils.filemanip import (
2323
relpath,
24-
makedirs,
2524
fname_presuffix,
26-
to_str,
2725
ensure_list,
2826
get_related_files,
2927
FileNotFoundError,
@@ -117,7 +115,7 @@ def write_report(node, report_type=None, is_mapnode=False):
117115
cwd = node.output_dir()
118116
report_dir = os.path.join(cwd, '_report')
119117
report_file = os.path.join(report_dir, 'report.rst')
120-
makedirs(report_dir, exist_ok=True)
118+
os.makedirs(report_dir, exist_ok=True)
121119

122120
logger.debug('[Node] Writing %s-exec report to "%s"', report_type[:-4],
123121
report_file)
@@ -627,7 +625,7 @@ def _get_valid_pathstr(pathstr):
627625
Replaces: ',' -> '.'
628626
"""
629627
if not isinstance(pathstr, (str, bytes)):
630-
pathstr = to_str(pathstr)
628+
pathstr = str(pathstr)
631629
pathstr = pathstr.replace(os.sep, '..')
632630
pathstr = re.sub(r'''[][ (){}?:<>#!|"';]''', '', pathstr)
633631
pathstr = pathstr.replace(',', '.')
@@ -1355,7 +1353,7 @@ def export_graph(graph_in,
13551353
if base_dir is None:
13561354
base_dir = os.getcwd()
13571355

1358-
makedirs(base_dir, exist_ok=True)
1356+
os.makedirs(base_dir, exist_ok=True)
13591357
out_dot = fname_presuffix(
13601358
dotfilename, suffix='_detailed.dot', use_ext=False, newpath=base_dir)
13611359
_write_detailed_dot(graph, out_dot)

nipype/pipeline/engine/workflows.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from ...interfaces.base import (traits, TraitedSpec, TraitDictObject,
2424
TraitListObject)
25-
from ...utils.filemanip import save_json, makedirs, to_str
25+
from ...utils.filemanip import save_json
2626
from .utils import (generate_expanded_graph, export_graph, write_workflow_prov,
2727
write_workflow_resources, format_dot, topological_sort,
2828
get_print_name, merge_dict, format_node)
@@ -218,12 +218,12 @@ def connect(self, *args, **kwargs):
218218
edge_data = self._graph.get_edge_data(srcnode, destnode, None)
219219
if edge_data:
220220
logger.debug('(%s, %s): Edge data exists: %s', srcnode,
221-
destnode, to_str(edge_data))
221+
destnode, str(edge_data))
222222
for data in connects:
223223
if data not in edge_data['connect']:
224224
edge_data['connect'].append(data)
225225
if disconnect:
226-
logger.debug('Removing connection: %s', to_str(data))
226+
logger.debug('Removing connection: %s', str(data))
227227
edge_data['connect'].remove(data)
228228
if edge_data['connect']:
229229
self._graph.add_edges_from([(srcnode, destnode,
@@ -240,7 +240,7 @@ def connect(self, *args, **kwargs):
240240
})])
241241
edge_data = self._graph.get_edge_data(srcnode, destnode)
242242
logger.debug('(%s, %s): new edge data: %s', srcnode, destnode,
243-
to_str(edge_data))
243+
str(edge_data))
244244

245245
def disconnect(self, *args):
246246
"""Disconnect nodes
@@ -256,7 +256,7 @@ def disconnect(self, *args):
256256

257257
for srcnode, dstnode, conn in connection_list:
258258
logger.debug('disconnect(): %s->%s %s', srcnode, dstnode,
259-
to_str(conn))
259+
str(conn))
260260
if self in [srcnode, dstnode]:
261261
raise IOError(
262262
'Workflow connect cannot contain itself as node: src[%s] '
@@ -277,10 +277,10 @@ def disconnect(self, *args):
277277
# idx = ed_conns.index(edge)
278278
remove.append((edge[0], edge[1]))
279279

280-
logger.debug('disconnect(): remove list %s', to_str(remove))
280+
logger.debug('disconnect(): remove list %s', str(remove))
281281
for el in remove:
282282
edge_data['connect'].remove(el)
283-
logger.debug('disconnect(): removed connection %s', to_str(el))
283+
logger.debug('disconnect(): removed connection %s', str(el))
284284

285285
if not edge_data['connect']:
286286
self._graph.remove_edge(srcnode, dstnode)
@@ -410,7 +410,7 @@ def write_graph(self,
410410
base_dir = op.join(base_dir, self.name)
411411
else:
412412
base_dir = os.getcwd()
413-
base_dir = makedirs(base_dir, exist_ok=True)
413+
os.makedirs(base_dir, exist_ok=True)
414414
if graph2use in ['hierarchical', 'colored']:
415415
if self.name[:1].isdigit(): # these graphs break if int
416416
raise ValueError('{} graph failed, workflow name cannot begin '
@@ -576,7 +576,7 @@ def run(self, plugin=None, plugin_args=None, updatehash=False):
576576
flatgraph = self._create_flat_graph()
577577
self.config = merge_dict(deepcopy(config._sections), self.config)
578578
logger.info('Workflow %s settings: %s', self.name,
579-
to_str(sorted(self.config)))
579+
str(sorted(self.config)))
580580
self._set_needed_outputs(flatgraph)
581581
execgraph = generate_expanded_graph(deepcopy(flatgraph))
582582
for index, node in enumerate(execgraph.nodes()):
@@ -609,7 +609,7 @@ def _write_report_info(self, workingdir, name, graph):
609609
if workingdir is None:
610610
workingdir = os.getcwd()
611611
report_dir = op.join(workingdir, name)
612-
makedirs(report_dir, exist_ok=True)
612+
os.makedirs(report_dir, exist_ok=True)
613613
shutil.copyfile(
614614
op.join(op.dirname(__file__), 'report_template.html'),
615615
op.join(report_dir, 'index.html'))
@@ -821,7 +821,7 @@ def _set_node_input(self, node, param, source, sourceinfo):
821821
newval = dict(val)
822822
if isinstance(val, TraitListObject):
823823
newval = val[:]
824-
logger.debug('setting node input: %s->%s', param, to_str(newval))
824+
logger.debug('setting node input: %s->%s', param, str(newval))
825825
node.set_input(param, deepcopy(newval))
826826

827827
def _get_all_nodes(self):
@@ -881,9 +881,9 @@ def _generate_flatgraph(self):
881881
# dj: added list() for networkx ver.2
882882
for u, _, d in list(
883883
self._graph.in_edges(nbunch=node, data=True)):
884-
logger.debug('in: connections-> %s', to_str(d['connect']))
884+
logger.debug('in: connections-> %s', str(d['connect']))
885885
for cd in deepcopy(d['connect']):
886-
logger.debug("in: %s", to_str(cd))
886+
logger.debug("in: %s", str(cd))
887887
dstnode = node._get_parameter_node(cd[1], subtype='in')
888888
srcnode = u
889889
srcout = cd[0]
@@ -896,9 +896,9 @@ def _generate_flatgraph(self):
896896
# dj: for ver 2 use list(out_edges)
897897
for _, v, d in list(
898898
self._graph.out_edges(nbunch=node, data=True)):
899-
logger.debug('out: connections-> %s', to_str(d['connect']))
899+
logger.debug('out: connections-> %s', str(d['connect']))
900900
for cd in deepcopy(d['connect']):
901-
logger.debug("out: %s", to_str(cd))
901+
logger.debug("out: %s", str(cd))
902902
dstnode = v
903903
if isinstance(cd[0], tuple):
904904
parameter = cd[0][0]

nipype/pipeline/plugins/tools.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from traceback import format_exception
1313

1414
from ... import logging
15-
from ...utils.filemanip import savepkl, crash2txt, makedirs
15+
from ...utils.filemanip import savepkl, crash2txt
1616

1717
logger = logging.getLogger('nipype.workflow')
1818

@@ -42,7 +42,7 @@ def report_crash(node, traceback=None, hostname=None):
4242
str(uuid.uuid4()))
4343
crashdir = node.config['execution'].get('crashdump_dir', os.getcwd())
4444

45-
makedirs(crashdir, exist_ok=True)
45+
os.makedirs(crashdir, exist_ok=True)
4646
crashfile = os.path.join(crashdir, crashfile)
4747

4848
if node.config['execution']['crashfile_format'].lower() in ['text', 'txt']:
@@ -115,8 +115,7 @@ def create_pyscript(node, updatehash=False, store_exception=True):
115115
batchdir = '%s'
116116
from nipype.utils.filemanip import loadpkl, savepkl
117117
try:
118-
if not sys.version_info < (2, 7):
119-
from collections import OrderedDict
118+
from collections import OrderedDict
120119
config_dict=%s
121120
config.update_config(config_dict)
122121
## Only configure matplotlib if it was successfully imported,

nipype/sphinxext/plot_workflow.py

+1-18
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,6 @@ def format_template(template, **kw):
144144

145145

146146

147-
def _mkdirp(folder):
148-
"""
149-
Equivalent to bash's mkdir -p
150-
"""
151-
if sys.version_info > (3, 4, 1):
152-
os.makedirs(folder, exist_ok=True)
153-
return folder
154-
155-
try:
156-
os.makedirs(folder)
157-
except OSError as exc:
158-
if exc.errno != EEXIST or not os.path.isdir(folder):
159-
raise
160-
161-
return folder
162-
163-
164147
def wf_directive(name, arguments, options, content, lineno, content_offset,
165148
block_text, state, state_machine):
166149
if len(missing_imports) == 0:
@@ -737,7 +720,7 @@ def run(arguments, content, options, state_machine, state, lineno):
737720
state_machine.insert_input(total_lines, source=source_file_name)
738721

739722
# copy image files to builder's output directory, if necessary
740-
_mkdirp(dest_dir)
723+
os.makedirs(dest_dir, exist_ok=True)
741724
for code_piece, images in results:
742725
for img in images:
743726
for fn in img.filenames():

0 commit comments

Comments
 (0)