Skip to content

Commit 9875e1c

Browse files
author
Ben Cipollini
committed
Allow classes to register extensions with opener functions; use this for .mgz. Remove .mgz-specific logic from BinOpener, and deprecate.
1 parent 6e4a144 commit 9875e1c

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

nibabel/freesurfer/mghformat.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from ..fileholders import FileHolder, copy_file_map
1919
from ..arrayproxy import ArrayProxy
2020
from ..keywordonly import kw_only_meth
21+
from ..openers import Opener
2122

2223
# mgh header
2324
# See https://surfer.nmr.mgh.harvard.edu/fswiki/FsTutorial/MghFormat
@@ -453,6 +454,7 @@ def writeftr_to(self, fileobj):
453454
fileobj.write(ftr_nd.tostring())
454455

455456

457+
@Opener.register_extension('.mgz', Opener.gz_def)
456458
class MGHImage(SpatialImage):
457459
""" Class for MGH format image
458460
"""

nibabel/openers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,13 @@ def __enter__(self):
146146

147147
def __exit__(self, exc_type, exc_val, exc_tb):
148148
self.close_if_mine()
149+
150+
@classmethod
151+
def register_extension(opener_klass, ext, func):
152+
"""Decorator"""
153+
def decorate(klass):
154+
assert ext not in opener_klass.compress_ext_map, \
155+
"Cannot redefine extension-function mappings."
156+
opener_klass.compress_ext_map[ext] = func
157+
return klass
158+
return decorate

nibabel/volumeutils.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,10 +1537,16 @@ def rec2dict(rec):
15371537

15381538

15391539
class BinOpener(Opener):
1540-
# Adds .mgz as gzipped file name type
1540+
""" Deprecated class that used to handle .mgz
1541+
through specialized logic."""
15411542
__doc__ = Opener.__doc__
1542-
compress_ext_map = Opener.compress_ext_map.copy()
1543-
compress_ext_map['.mgz'] = Opener.gz_def
1543+
1544+
def __init__(self, *args, **kwargs):
1545+
warnings.warn("Please use %s class instead of %s" % (
1546+
Opener.__class__.__name__,
1547+
self.__class__.__name__),
1548+
DeprecationWarning, stacklevel=2)
1549+
return super(BinOpener, self).__init__(*args, **kwargs)
15441550

15451551

15461552
def fname_ext_ul_case(fname):

0 commit comments

Comments
 (0)