Source code for ndmapper.libutils
# Copyright(c) 2015-2016 Association of Universities for Research in Astronomy, Inc.
# by James E.H. Turner.
"""
Some lower-level utility functions (with minimal dependencies) that are used
internally and are also made available as part of the public API.
"""
import os, os.path
import tempfile
[docs]def splitext(path):
"""
A version of splitext that splits at the first separator rather than the
last one (so 'file.fits.gz' gives 'file' & 'fits.gz'). It also returns
None for the extension value where there isn't one (instead of ''), just
to avoid incorrect reconstruction of 'file.' as 'file' or vice versa.
"""
components = os.path.basename(path).split(os.extsep, 1) # len always 1->2
ext = None if len(components) == 1 else components[1]
root = path if ext is None else path[:-len(os.extsep+ext)]
return root, ext
[docs]def addext(path, ext):
"""
Reconstruct a filename from a (root, extension) tuple of the type
produced by splitext().
"""
return path + ('' if ext is None else os.extsep + ext)
[docs]def new_filename(purpose='tmp', base='', ext='', full_path=False):
"""
Generate a new filename string that is not already used in the current
directory (beginning with 'tmp' by default, for use as a temporary file).
Unlike Python's tempfile module, this function does not actually open the
file, making the result suitable for passing to external programs, but as
a result, a race condition may occur if the file is not created
immediately, which is the user's responsibility.
Parameters
----------
purpose : str, optional
Starting string, used to indicate the file's purpose (default 'tmp').
base : convertible to str, optional
A base name to add between "tmp_" and the last few, randomized
characters, to help distinguish temporary filenames, eg. for
troubleshooting purposes.
ext : convertible to str, optional
An file extension name to use (eg 'fits'). The leading dot is optional
and will be added if needed.
full_path : bool
Return the full path to the file, rather than a (relative) filename in
the current working directory (default False)?
Returns
-------
str
A filename that doesn't already exist in the current working directory.
"""
base = str(base)
ext = str(ext)
# Add the leading dot to any specified file extension, if necessary
# (checking type to produce a less obscure error below if not a string):
if ext and not ext.startswith(os.extsep):
ext = os.extsep + ext
# Python doesn't provide a (non-deprecated) way to produce a temporary
# filename without actually creating and opening the file (to avoid
# possible race conditions & exploits). One can, however, let Python close
# the file again and then recycle its name, saving the corresponding
# DataFile immediately to avoid possible collisions.
with tempfile.NamedTemporaryFile(
prefix='{0}_{1}{2}'.format(purpose, base, '_' if base else ''),
suffix=ext, dir='') as tmpfile:
tmpname = tmpfile.name
return tmpname if full_path else os.path.basename(tmpname)
[docs]def map_API_enum(name, value, map_dict):
"""
Convert an enumerable parameter value from the Python API to its equivalent
IRAF value in the supplied dictionary (where such a mapping exists),
raising an appropriate exception if it's not recognized.
"""
try:
return map_dict[value]
except KeyError:
raise ValueError('unrecognized value for \'{0}\''.format(name))