Skip to content
Snippets Groups Projects
Commit fc2ccabf authored by Paul McCarthy's avatar Paul McCarthy :mountain_bicyclist:
Browse files

RF: Require at least one entity in a BIDS file name. Do not use realpath on

metadata file name, as files within a BIDS data set may be sym-linked from
another file/directory structure (e.g. datalad/git-annex)
parent 33f85a0a
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
All of the other functions in this module should not be considered part of the All of the other functions in this module should not be considered part of the
public API. public API.
.. see:: https://bids-specification.readthedocs.io/en/stable/
.. note:: The `pybids <https://bids-standard.github.io/pybids/>`_ library is .. note:: The `pybids <https://bids-standard.github.io/pybids/>`_ library is
a more suitable choice if you are after a more robust and featured a more suitable choice if you are after a more robust and featured
...@@ -36,8 +37,8 @@ import fsl.utils.path as fslpath ...@@ -36,8 +37,8 @@ import fsl.utils.path as fslpath
class BIDSFile(object): class BIDSFile(object):
"""The ``BIDSFile`` class parses and stores the entities and suffix contained """The ``BIDSFile`` class parses and stores the entities and suffix
in a BIDS file. See the :func:`parseFilename` function. contained in a BIDS file. See the :func:`parseFilename` function.
The :meth:`match` method can be used to compare two ``BIDSFile`` instances. The :meth:`match` method can be used to compare two ``BIDSFile`` instances.
...@@ -91,15 +92,9 @@ class BIDSFile(object): ...@@ -91,15 +92,9 @@ class BIDSFile(object):
def parseFilename(filename): def parseFilename(filename):
"""Parses a BIDS-like file name. The file name must consist of zero or more """Parses a BIDS-like file name, returning the entities and suffix encoded
"entities" (alpha-numeric ``name-value`` pairs), a "suffix", all separated in the name. See the :func:`isBIDSFile` function for an explanation of
by underscores, and a regular file extension. For example, the following what is considered to be a valid BIDS file name.
file::
sub-01_ses-01_task-stim_bold.nii.gz
has suffix ``bold``, entities ``sub=01``, ``ses=01`` and ``task=stim``, and
extension ``.nii.gz``.
.. note:: This function assumes that no period (``.``) characters occur in .. note:: This function assumes that no period (``.``) characters occur in
the body of a BIDS filename. the body of a BIDS filename.
...@@ -161,13 +156,22 @@ def inBIDSDir(filename): ...@@ -161,13 +156,22 @@ def inBIDSDir(filename):
def isBIDSFile(filename, strict=True): def isBIDSFile(filename, strict=True):
"""Returns ``True`` if ``filename`` looks like a BIDS image or JSON file. """Returns ``True`` if ``filename`` looks like a BIDS image or JSON file.
A BIDS file name must consist of one or more "entities" (alpha-numeric
``name-value`` pairs), a "suffix", all separated by underscores, and a
regular file extension. For example, the following file::
sub-01_ses-01_task-stim_bold.nii.gz
has suffix ``bold``, entities ``sub=01``, ``ses=01`` and ``task=stim``, and
extension ``.nii.gz``.
:arg filename: Name of file to check :arg filename: Name of file to check
:arg strict: If ``True`` (the default), the file must be within a BIDS :arg strict: If ``True`` (the default), the file must be within a BIDS
dataset directory, as defined by :func:`inBIDSDir`. dataset directory, as defined by :func:`inBIDSDir`.
""" """
name = op.basename(filename) name = op.basename(filename)
pattern = r'([a-z0-9]+-[a-z0-9]+_)*([a-z0-9])+\.(.+)' pattern = r'([a-z0-9]+-[a-z0-9]+_)+([a-z0-9])+\.(.+)'
flags = re.ASCII | re.IGNORECASE flags = re.ASCII | re.IGNORECASE
match = re.fullmatch(pattern, name, flags) is not None match = re.fullmatch(pattern, name, flags) is not None
...@@ -189,7 +193,7 @@ def loadMetadata(filename): ...@@ -189,7 +193,7 @@ def loadMetadata(filename):
``filename`` ``filename``
""" """
filename = op.realpath(op.abspath(filename)) filename = op.abspath(filename)
bfile = BIDSFile(filename) bfile = BIDSFile(filename)
dirname = op.dirname(filename) dirname = op.dirname(filename)
prevdir = filename prevdir = filename
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment