Skip to content

Commit e7ac0ec

Browse files
larsonercbrnr
authored andcommitted
MRG, MAINT: Better downloading for testing and misc (mne-tools#8696)
* MAINT: Better downloading for testing and misc * STY: Missed [circle front] * FIX: Misc [circle front] * FIX: Version [circle full] * FIX: Version [circle full]
1 parent 13a91b8 commit e7ac0ec

File tree

2 files changed

+67
-14
lines changed

2 files changed

+67
-14
lines changed

mne/datasets/tests/test_datasets.py

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
from os import path as op
3+
import re
34
import shutil
45
import zipfile
56
import sys
@@ -11,7 +12,7 @@
1112
from mne.datasets._fsaverage.base import _set_montage_coreg_path
1213
from mne.datasets.utils import _manifest_check_download
1314

14-
from mne.utils import (run_tests_if_main, requires_good_network, modified_env,
15+
from mne.utils import (requires_good_network, modified_env,
1516
get_subjects_dir, ArgvSetter, _pl, use_log_level,
1617
catch_logging, hashfunc)
1718

@@ -52,18 +53,62 @@ def test_datasets_basic(tmpdir):
5253
assert sd.endswith('MNE-fsaverage-data')
5354

5455

55-
def _fake_fetch_file(url, destination, print_destination=False):
56-
with open(destination, 'w') as fid:
57-
fid.write(url)
58-
59-
6056
@requires_good_network
61-
def test_downloads(tmpdir):
62-
"""Test dataset URL handling."""
57+
def test_downloads(tmpdir, monkeypatch, capsys):
58+
"""Test dataset URL and version handling."""
6359
# Try actually downloading a dataset
64-
path = datasets._fake.data_path(path=str(tmpdir), update_path=False)
60+
kwargs = dict(path=str(tmpdir), verbose=True)
61+
path = datasets._fake.data_path(update_path=False, **kwargs)
62+
out, _ = capsys.readouterr()
63+
assert 'Downloading' in out
64+
assert op.isdir(path)
6565
assert op.isfile(op.join(path, 'bar'))
66+
assert not datasets.utils.has_dataset('fake') # not in the desired path
6667
assert datasets._fake.get_version() is None
68+
assert datasets.utils._get_version('fake') is None
69+
monkeypatch.setenv('_MNE_FAKE_HOME_DIR', str(tmpdir))
70+
with pytest.warns(RuntimeWarning, match='non-standard config'):
71+
new_path = datasets._fake.data_path(update_path=True, **kwargs)
72+
assert path == new_path
73+
out, _ = capsys.readouterr()
74+
assert 'Downloading' not in out
75+
# No version: shown as existing but unknown version
76+
assert datasets.utils.has_dataset('fake')
77+
# XXX logic bug, should be "unknown"
78+
assert datasets._fake.get_version() == '0.7'
79+
# With a version but no required one: shown as existing and gives version
80+
fname = tmpdir / 'foo' / 'version.txt'
81+
with open(fname, 'w') as fid:
82+
fid.write('0.1')
83+
assert datasets.utils.has_dataset('fake')
84+
assert datasets._fake.get_version() == '0.1'
85+
datasets._fake.data_path(download=False, **kwargs)
86+
out, _ = capsys.readouterr()
87+
assert 'out of date' not in out
88+
# With the required version: shown as existing with the required version
89+
monkeypatch.setattr(datasets.utils, '_FAKE_VERSION', '0.1')
90+
assert datasets.utils.has_dataset('fake')
91+
assert datasets._fake.get_version() == '0.1'
92+
datasets._fake.data_path(download=False, **kwargs)
93+
out, _ = capsys.readouterr()
94+
assert 'out of date' not in out
95+
monkeypatch.setattr(datasets.utils, '_FAKE_VERSION', '0.2')
96+
# With an older version:
97+
# 1. Marked as not actually being present
98+
assert not datasets.utils.has_dataset('fake')
99+
# 2. Will try to update when `data_path` gets called, with logged message
100+
want_msg = 'Correctly trying to download newer version'
101+
102+
def _error_download(url, full_name, print_destination, hash_, hash_type):
103+
assert 'foo.tgz' in url
104+
assert str(tmpdir) in full_name
105+
raise RuntimeError(want_msg)
106+
107+
monkeypatch.setattr(datasets.utils, '_fetch_file', _error_download)
108+
with pytest.raises(RuntimeError, match=want_msg):
109+
datasets._fake.data_path(**kwargs)
110+
out, _ = capsys.readouterr()
111+
assert re.match(r'.* 0\.1 .*out of date.* 0\.2.*', out, re.MULTILINE), out
67112

68113

69114
@pytest.mark.slowtest
@@ -151,6 +196,3 @@ def test_manifest_check_download(tmpdir, n_have, monkeypatch):
151196
assert op.isdir(destination)
152197
for fname in _zip_fnames:
153198
assert op.isfile(op.join(destination, fname))
154-
155-
156-
run_tests_if_main()

mne/datasets/utils.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
from ..externals.doccer import docformat
2828

2929

30+
_FAKE_VERSION = None # used for monkeypatching while testing versioning
31+
3032
_data_path_doc = """Get path to local copy of {name} dataset.
3133
3234
Parameters
@@ -245,7 +247,7 @@ def _data_path(path=None, force_update=False, update_path=True, download=True,
245247
path = _get_path(path, key, name)
246248
# To update the testing or misc dataset, push commits, then make a new
247249
# release on GitHub. Then update the "releases" variable:
248-
releases = dict(testing='0.112', misc='0.7')
250+
releases = dict(testing='0.112', misc='0.8')
249251
# And also update the "md5_hashes['testing']" variable below.
250252
# To update any other dataset, update the data archive itself (upload
251253
# an updated version) and update the md5 hash.
@@ -327,7 +329,7 @@ def _data_path(path=None, force_update=False, update_path=True, download=True,
327329
bst_raw='fa2efaaec3f3d462b319bc24898f440c',
328330
bst_resting='70fc7bf9c3b97c4f2eab6260ee4a0430'),
329331
fake='3194e9f7b46039bb050a74f3e1ae9908',
330-
misc='2b2f2fec9d1197ed459117db1c6341ee',
332+
misc='0f88194266121dd9409be94184231f25',
331333
sample='12b75d1cb7df9dfb4ad73ed82f61094f',
332334
somato='32fd2f6c8c7eb0784a1de6435273c48b',
333335
spm='9f43f67150e3b694b523a21eb929ea75',
@@ -377,6 +379,15 @@ def _data_path(path=None, force_update=False, update_path=True, download=True,
377379
logger.debug('folder_path: %s' % (folder_path,))
378380

379381
need_download = any(not op.exists(f) for f in folder_path)
382+
# additional condition: check for version.txt and parse it
383+
want_version = releases.get(name, None)
384+
want_version = _FAKE_VERSION if name == 'fake' else want_version
385+
if not need_download and want_version is not None:
386+
data_version = _dataset_version(folder_path[0], name)
387+
need_download = data_version != want_version
388+
if need_download:
389+
logger.info(f'Dataset {name} version {data_version} out of date, '
390+
f'latest version is {want_version}')
380391
if need_download and not download:
381392
return ''
382393

0 commit comments

Comments
 (0)