Skip to content

Commit 7107494

Browse files
committed
Merge pull request #61 from matthew-brett/dft-windows-fixes
BF - avoid test failures from DFT on Windows
2 parents 5ae4d03 + 8983fc7 commit 7107494

File tree

2 files changed

+51
-30
lines changed

2 files changed

+51
-30
lines changed

nibabel/dft.py

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
# Copyright (C) 2011 Christian Haselgrove
1010

1111
import os
12+
from os.path import join as pjoin
1213
import tempfile
1314
import StringIO
15+
import getpass
16+
import warnings
1417
import sqlite3
1518

1619
import numpy
@@ -226,29 +229,29 @@ class _db_nochange:
226229
"""context guard for read-only database access"""
227230

228231
def __enter__(self):
229-
self.c = _db.cursor()
232+
self.c = DB.cursor()
230233
return self.c
231234

232235
def __exit__(self, type, value, traceback):
233236
if type is None:
234237
self.c.close()
235-
_db.rollback()
238+
DB.rollback()
236239
return
237240

238241
class _db_change:
239242

240243
"""context guard for database access requiring a commit"""
241244

242245
def __enter__(self):
243-
self.c = _db.cursor()
246+
self.c = DB.cursor()
244247
return self.c
245248

246249
def __exit__(self, type, value, traceback):
247250
if type is None:
248251
self.c.close()
249-
_db.commit()
252+
DB.commit()
250253
else:
251-
_db.rollback()
254+
DB.rollback()
252255
return
253256

254257
def _get_subdirs(base_dir, files_dict=None):
@@ -427,44 +430,54 @@ def clear_cache():
427430
c.execute("DELETE FROM study")
428431
return
429432

430-
_create_queries = (
433+
434+
CREATE_QUERIES = (
431435
"""CREATE TABLE study (uid TEXT NOT NULL PRIMARY KEY,
432436
date TEXT NOT NULL,
433437
time TEXT NOT NULL,
434438
comments TEXT NOT NULL,
435439
patient_name TEXT NOT NULL,
436440
patient_id TEXT NOT NULL,
437441
patient_birth_date TEXT NOT NULL,
438-
patient_sex TEXT NOT NULL)""",
442+
patient_sex TEXT NOT NULL)""",
439443
"""CREATE TABLE series (uid TEXT NOT NULL PRIMARY KEY,
440-
study TEXT NOT NULL REFERENCES study,
444+
study TEXT NOT NULL REFERENCES study,
441445
number TEXT NOT NULL,
442446
description TEXT NOT NULL,
443447
rows INTEGER NOT NULL,
444448
columns INTEGER NOT NULL,
445449
bits_allocated INTEGER NOT NULL,
446-
bits_stored INTEGER NOT NULL)""",
450+
bits_stored INTEGER NOT NULL)""",
447451
"""CREATE TABLE storage_instance (uid TEXT NOT NULL PRIMARY KEY,
448452
instance_number INTEGER NOT NULL,
449-
series TEXT NOT NULL references series)""",
450-
"""CREATE TABLE directory (path TEXT NOT NULL PRIMARY KEY,
451-
mtime INTEGER NOT NULL)""",
452-
"""CREATE TABLE file (directory TEXT NOT NULL REFERENCES directory,
453-
name TEXT NOT NULL,
454-
mtime INTEGER NOT NULL,
455-
storage_instance TEXT DEFAULT NULL REFERENCES storage_instance,
456-
PRIMARY KEY (directory, name))"""
457-
)
458-
459-
_db_fname = '%s/dft.%d.sqlite' % (tempfile.gettempdir(), os.getuid())
460-
print 'db is %s' % _db_fname
461-
_db = sqlite3.connect(_db_fname, check_same_thread=False)
462-
463-
with _db_change() as c:
464-
c.execute("SELECT COUNT(*) FROM sqlite_master WHERE type = 'table'")
465-
if c.fetchone()[0] == 0:
466-
print 'create'
467-
for q in _create_queries:
468-
c.execute(q)
453+
series TEXT NOT NULL references series)""",
454+
"""CREATE TABLE directory (path TEXT NOT NULL PRIMARY KEY,
455+
mtime INTEGER NOT NULL)""",
456+
"""CREATE TABLE file (directory TEXT NOT NULL REFERENCES directory,
457+
name TEXT NOT NULL,
458+
mtime INTEGER NOT NULL,
459+
storage_instance TEXT DEFAULT NULL REFERENCES storage_instance,
460+
PRIMARY KEY (directory, name))""")
461+
DB_FNAME = pjoin(tempfile.gettempdir(), 'dft.%s.sqlite' % getpass.getuser())
462+
DB = None
463+
464+
465+
def _init_db(verbose=True):
466+
""" Initialize database """
467+
if verbose:
468+
print 'db filename: ' + DB_FNAME
469+
global DB
470+
DB = sqlite3.connect(DB_FNAME, check_same_thread=False)
471+
with _db_change() as c:
472+
c.execute("SELECT COUNT(*) FROM sqlite_master WHERE type = 'table'")
473+
if c.fetchone()[0] == 0:
474+
print 'create'
475+
for q in CREATE_QUERIES:
476+
c.execute(q)
477+
469478

479+
if os.name == 'nt':
480+
warnings.warn('dft needs FUSE which is not available for windows')
481+
else:
482+
_init_db()
470483
# eof

nibabel/tests/test_dft.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" Testing dft
22
"""
33

4+
import os
45
from os.path import join as pjoin, dirname
56
import StringIO
67

@@ -9,17 +10,24 @@
910
from .. import dft
1011
from .. import nifti1
1112

13+
from nose import SkipTest
1214
from nose.tools import (assert_true, assert_false, assert_equal, assert_raises)
1315

1416
# Shield optional package imports
1517
from ..optpkg import optional_package
1618
# setup_module will raise SkipTest if no dicom to import
17-
dicom, have_dicom, setup_module = optional_package('dicom')
19+
dicom, have_dicom, _ = optional_package('dicom')
1820
PImage, have_pil, _ = optional_package('PIL.Image')
1921
pil_test = np.testing.dec.skipif(not have_pil, 'could not import PIL.Image')
2022

2123
data_dir = pjoin(dirname(__file__), 'data')
2224

25+
def setup_module():
26+
if os.name == 'nt':
27+
raise SkipTest('FUSE not available for windows, skipping dft tests')
28+
if not have_dicom:
29+
raise SkipTest('Need pydicom for dft tests, skipping')
30+
2331

2432
def test_init():
2533
dft.clear_cache()

0 commit comments

Comments
 (0)