Open
Show file tree
Hide file tree
Changes from all commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Failed to load files.
Original file line numberDiff line numberDiff line change
Expand Up@@ -119,10 +119,10 @@
See :mod:`nibabel.minc1`, :mod:`nibabel.ecat` and :mod:`nibabel.parrec` for
examples.
"""

_default_order = 'F'

def __init__(self, file_like, spec, *, mmap=True, order=None, keep_file_open=None):
def __init__(self, file_like, spec, *,
mmap=True, order=None, keep_file_open=None, compression=None):
"""Initialize array proxy instance

Parameters
Expand DownExpand Up@@ -166,6 +166,7 @@
If ``file_like`` is an open file handle, this setting has no
effect. The default value (``None``) will result in the value of
``KEEP_FILE_OPEN_DEFAULT`` being used.
compression : { None, "gz", "bz2", "zst" }, optional, keyword only
"""
if mmap not in (True, False, 'c', 'r'):
raise ValueError("mmap should be one of {True, False, 'c', 'r'}")
Expand DownExpand Up@@ -209,9 +210,11 @@
if order is None:
order = self._default_order
self.order = order
self._compression = compression
# Flags to keep track of whether a single ImageOpener is created, and
# whether a single underlying file handle is created.
self._keep_file_open, self._persist_opener = self._should_keep_file_open(keep_file_open)
self._keep_file_open, self._persist_opener = \
self._should_keep_file_open(keep_file_open, compression)
self._lock = RLock()

def _has_fh(self) -> bool:
Expand DownExpand Up@@ -254,7 +257,7 @@
self.__dict__.update(state)
self._lock = RLock()

def _should_keep_file_open(self, keep_file_open):
def _should_keep_file_open(self, keep_file_open, compression):
"""Called by ``__init__``.

This method determines how to manage ``ImageOpener`` instances,
Expand DownExpand Up@@ -330,7 +333,8 @@
if self._has_fh():
return False, False
# if the file is a gzip file, and we have_indexed_gzip,
have_igzip = openers.HAVE_INDEXED_GZIP and self.file_like.endswith('.gz')
have_igzip = openers.HAVE_INDEXED_GZIP and (compression in ("gz", ".gz") or
file_like.endswith('.gz'))

persist_opener = keep_file_open or have_igzip
return keep_file_open, persist_opener
Expand DownExpand Up@@ -378,10 +382,18 @@
"""
if self._persist_opener:
if not hasattr(self, '_opener'):
self._opener = openers.ImageOpener(self.file_like, keep_open=self._keep_file_open)
self._opener = openers.ImageOpener(

Check warning on line 385 in nibabel/arrayproxy.py

View check run for this annotation

Codecov / codecov/

nibabel/arrayproxy.py#L385

Added line #L385 was not covered by tests
self.file_like,
keep_open=self._keep_file_open,
compression=self._compression,
)
yield self._opener
else:
with openers.ImageOpener(self.file_like, keep_open=False) as opener:
with openers.ImageOpener(
self.file_like,
keep_open=False,
compression=self._compression,
) as opener:
yield opener

def _get_unscaled(self, slicer):
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@
specified, is `rb`. ``compresslevel``, if relevant, and not specified,
is set from class variable ``default_compresslevel``. ``keep_open``, if
relevant, and not specified, is ``False``.
compression : { None, "gz", "bz2", "zst" }, optional, keyworld only
\*\*kwargs : keyword arguments
passed to opening method when `fileish` is str. Change of defaults as
for \*args
Expand DownExpand Up@@ -153,13 +154,13 @@

fobj: io.IOBase

def __init__(self, fileish: str | io.IOBase, *args, **kwargs):
def __init__(self, fileish: str | io.IOBase, *args, compression: str | None = None, **kwargs):
if isinstance(fileish, (io.IOBase, Fileish)):
self.fobj = fileish
self.me_opened = False
self._name = getattr(fileish, 'name', None)
return
opener, arg_names = self._get_opener_argnames(fileish)
opener, arg_names = self._get_opener_argnames(fileish, compression)
# Get full arguments to check for mode and compresslevel
full_kwargs = {**kwargs, **dict(zip(arg_names, args))}
# Set default mode
Expand All@@ -183,7 +184,11 @@
self._name = fileish
self.me_opened = True

def _get_opener_argnames(self, fileish: str) -> OpenerDef:
def _get_opener_argnames(self, fileish: str, compression: str | None) -> OpenerDef:
if compression is not None:
if compression[0] != '.':
compression = f'.{compression}'
return self.compress_ext_map[compression]

Check warning on line 191 in nibabel/openers.py

View check run for this annotation

Codecov / codecov/

nibabel/openers.py#L190-L191

Added lines #L190 - L191 were not covered by tests
_, ext = splitext(fileish)
if self.compress_ext_icase:
ext = ext.lower()
Expand Down
Loading