def test_datasets_basic(tmpdir, monkeypatch): """Test simple dataset functions.""" # XXX 'hf_sef' and 'misc' do not conform to these standards for dname in ('sample', 'somato', 'spm_face', 'testing', 'opm', 'bst_raw', 'bst_auditory', 'bst_resting', 'multimodal', 'bst_phantom_ctf', 'bst_phantom_elekta', 'kiloword', 'mtrf', 'phantom_4dbti', 'visual_92_categories', 'fieldtrip_cmc'): if dname.startswith('bst'): dataset = getattr(datasets.brainstorm, dname) else: dataset = getattr(datasets, dname) if dataset.data_path(download=False) != '': assert isinstance(dataset.get_version(), str) assert datasets.has_dataset(dname) else: assert dataset.get_version() is None assert not datasets.has_dataset(dname) print('%s: %s' % (dname, datasets.has_dataset(dname))) tempdir = str(tmpdir) # don't let it read from the config file to get the directory, # force it to look for the default monkeypatch.setenv('_MNE_FAKE_HOME_DIR', tempdir) monkeypatch.delenv('SUBJECTS_DIR', raising=False) assert (datasets.utils._get_path(None, 'foo', 'bar') == op.join(tempdir, 'mne_data')) assert get_subjects_dir(None) is None _set_montage_coreg_path() sd = get_subjects_dir() assert sd.endswith('MNE-fsaverage-data') monkeypatch.setenv('MNE_DATA', str(tmpdir.join('foo'))) with pytest.raises(FileNotFoundError, match='as specified by MNE_DAT'): testing.data_path(download=False)
def test_downloads(tmp_path, monkeypatch, capsys): """Test dataset URL and version handling.""" # Try actually downloading a dataset kwargs = dict(path=str(tmp_path), verbose=True) # XXX we shouldn't need to disable capsys here, but there's a pytest bug # that we're hitting (https://github.com/pytest-dev/pytest/issues/5997) # now that we use pooch with capsys.disabled(): path = datasets._fake.data_path(update_path=False, **kwargs) assert op.isdir(path) assert op.isfile(op.join(path, 'bar')) assert not datasets.has_dataset('fake') # not in the desired path assert datasets._fake.get_version() is None assert datasets.utils._get_version('fake') is None monkeypatch.setenv('_MNE_FAKE_HOME_DIR', str(tmp_path)) with pytest.warns(RuntimeWarning, match='non-standard config'): new_path = datasets._fake.data_path(update_path=True, **kwargs) assert path == new_path out, _ = capsys.readouterr() assert 'Downloading' not in out # No version: shown as existing but unknown version assert datasets.has_dataset('fake') # XXX logic bug, should be "unknown" assert datasets._fake.get_version() == '0.0' # With a version but no required one: shown as existing and gives version fname = tmp_path / 'foo' / 'version.txt' with open(fname, 'w') as fid: fid.write('0.1') assert datasets.has_dataset('fake') assert datasets._fake.get_version() == '0.1' datasets._fake.data_path(download=False, **kwargs) out, _ = capsys.readouterr() assert 'out of date' not in out # With the required version: shown as existing with the required version monkeypatch.setattr(datasets._fetch, '_FAKE_VERSION', '0.1') assert datasets.has_dataset('fake') assert datasets._fake.get_version() == '0.1' datasets._fake.data_path(download=False, **kwargs) out, _ = capsys.readouterr() assert 'out of date' not in out monkeypatch.setattr(datasets._fetch, '_FAKE_VERSION', '0.2') # With an older version: # 1. Marked as not actually being present assert not datasets.has_dataset('fake') # 2. Will try to update when `data_path` gets called, with logged message want_msg = 'Correctly trying to download newer version' def _error_download(self, fname, downloader, processor): url = self.get_url(fname) full_path = self.abspath / fname assert 'foo.tgz' in url assert str(tmp_path) in str(full_path) raise RuntimeError(want_msg) monkeypatch.setattr(pooch.Pooch, 'fetch', _error_download) with pytest.raises(RuntimeError, match=want_msg): datasets._fake.data_path(**kwargs) out, _ = capsys.readouterr() assert re.match(r'.* 0\.1 .*out of date.* 0\.2.*', out, re.MULTILINE), out