"""
Uncategorised functions which may come handy at several places.
"""
import os
import sys
import ost
[docs]def MsgErrorAndExit(msg, exit_status):
'''
Send a messages to the |ost_s| :ost_docs:`error log <base/logging/>` and
exit the Python interpreter.
:param msg: The message.
:type msg: :class:`str`
:param exit_status: Exit code, ends up in ``$?`` in the shell. ``0`` is
traditionally reserved to successful commands.
:type exit_status: :class:`int`
:returns: No return value, exits script with value ``exit_status``.
'''
ost.LogError(msg)
sys.exit(exit_status)
[docs]def FileExists(prefix, exit_status, filename):
'''
Checks if a file exists, terminates if not. The error message displayed is
fixed and only needs a *prefix* describing the specimen of file.
:param prefix: String to put in front of the failure-message
"file does not exist: ``file``".
:type prefix: :class:`str`
:param exit_status: Exit code on missing file, ends up in ``$?`` in the
shell. ``0`` is traditionally reserved to successful commands.
:type exit_status: :class:`int`
:param file: Path including file name to be checked.
:type file: :class:`str`
:returns: No return value, exits script with value ``exit_status`` if file
is missing.
'''
if not os.path.exists(filename):
MsgErrorAndExit('%s file does not exist: %s\n' % (prefix, filename),
exit_status)
[docs]def FileGzip(prefix, exit_status, filename, allowed=True):
'''
See if a file is gzipped or not. This is basically done by checking for a
"gz" suffix. May also be used to verify that a file is not compressed where
it does not apply. That is where *allowed* comes in. If "gz" is not allowed,
terminates the script on gzip files.
:param prefix: String to put in front of the failure-message where gzip
files are not allowed.
:type prefix: :class:`str`
:param exit_status: Exit code on gzip files to be avoided, ends up in
``$?`` in the shell. ``0`` is traditionally reserved to
successful commands.
:type exit_status: :class:`int`
:param filename: Path including file name to be checked.
:type filename: :class:`str`
:param allowed: Set to ``False`` if gzipped files are not allowed. Then the
script will terminate if a gzip file is found.
:type allowed: :class:`bool`
:returns: Flag to indicate if file is gzipped (:class:`bool`).
'''
_, fileext = os.path.splitext(filename)
is_gz = False
if fileext.lower() == '.gz':
is_gz = True
if not allowed:
MsgErrorAndExit('%s file in Gzip not supported: %s. ' % (prefix,
filename),
exit_status)
return is_gz
[docs]def FileExtension(prefix, exit_status, filename, extensions, gzip=False):
'''
Checks a file to carry a known extension given by a list of strings. Since
files are very often compressed these days, an additional "gz" suffix can be
tracked automatically by this function. Thus, the list of *extensions* only
needs to contain what you are really looking for, e.g. ("pdb") instead of
("pdb", "pdb.gz"). The *gzip* flag also determines the output of this
function. If enabled, a triple is returned: name of the file without
extension, its extension and a Boolean to tell whether the file carries the
gzip extension or not. If *gzip* detection is turned of, only a tuple is
returned: file name and extension. If the tested file name has an
unrecognised extension, this function terminates the script.
:param prefix: String to put in front of the failure-message
"file extension not supported: ``filename``".
:type prefix: :class:`str`
:param exit_status: Exit code on missing file, ends up in ``$?`` in the
shell. ``0`` is traditionally reserved to successful commands.
:type exit_status: :class:`int`
:param filename: Path including file name to be checked.
:type filename: :class:`str`
:param extensions: List of strings without a leading ".".
:type extensions: :class:`list`
:param gzip: Indicates whether to check for an additional "gz" extension.
:type gzip: :class:`bool`
:returns: (base name of ``filename`` (:class:`str`), extension of file
without a ".gz" (:class:`str`), flag to indicate an additional
".gz" (:class:`bool`)) **if** ``gzip`` is set, (base name of
``filename`` (:class:`str`), extension of file) **if not**.
'''
pfilename, fileext = os.path.splitext(filename)
is_gz = False
if fileext.lower() == '.gz':
is_gz = True
pfilename, fileext = os.path.splitext(pfilename)
if not gzip:
extension_string = ', '.join(extensions)
MsgErrorAndExit('%s file extension not supported: %s. ' %(prefix,
filename)+
'Allowed extensions are: %s\n' % extension_string,
exit_status)
if fileext == '':
extension_string = ', '.join(extensions)
if gzip:
extension_string += ', ' + '.gz, '.join(extensions) + '.gz'
MsgErrorAndExit('%s file extension not supported: %s. ' %(prefix,
filename)+
'Allowed extensions are: %s\n' % extension_string,
exit_status)
fileext = fileext[1:].lower()
for ext in extensions:
if fileext == ext.lower():
if gzip:
return os.path.basename(pfilename), fileext, is_gz
else:
return os.path.basename(pfilename), fileext
extension_string = ', '.join(extensions)
if gzip:
extension_string += ', ' + '.gz, '.join(extensions) + '.gz'
MsgErrorAndExit('%s file extension not supported: %s. ' % (prefix,
filename)+
'Allowed extensions are: %s\n' % extension_string,
exit_status)
__all__ = (
'MsgErrorAndExit',
'FileExists',
'FileExtension',
)
# LocalWords: gzipped gz param str gzip bool