Source code for bioscons.utils

from os.path import join
import os.path

try:
    from SCons.Script import PathVariable
except ImportError:
    # we expect this to fail unless imported from within SConstruct
    pass

[docs]class verbose(object): """ Decorator class to provide more verbose progress messages. """ def __init__(self, f): self.f = f def __call__(self, *args, **kwargs): print("entering", self.f.__name__, 'called with arguments', args, kwargs) self.f(*args, **kwargs) print("exiting", self.f.__name__)
[docs]def getvars(config, secnames, indir=None, outdir=None, fmt_in='%(sec)s-infiles', fmt_out='%(sec)s-outfiles', fmt_params='%(sec)s-params'): """ Return a tuple of configuration variables that may be passed to vars.AddVariables(). * config - an instance of ConfigParser.SafeConfigParser() * secnames - a list of section names from which to import variables * indir - path to a directory to prepend to filenames if not found in cwd * outdir - path to a directory to prepend to output files. * fmt_* - formatting string defining sections corresponding to infiles, outfiles, and params for each section Example:: vars = Variables() varlist = utils.getvars(config, ['ncbi','placefiles'], indir=output, outdir=output) vars.AddVariables(*varlist) """ vars = [] # values from defaults section defaults = [k for k,v in config.items('DEFAULT')] for varname, val in config.items('DEFAULT'): if os.path.isdir(val): vars.append(PathVariable( varname, '%s (DEFAULT)' % varname, val, PathVariable.PathIsDir)) if os.path.isfile(val): vars.append( PathVariable(varname, '%s (DEFAULT)' % varname, val, PathVariable.PathIsFile)) else: vars.append((varname, val, val)) for sec in secnames: # input files and directories for varname,pth in config.items(fmt_in % locals()): if varname in defaults: continue elif os.path.exists(pth): pth = os.path.abspath(pth) elif indir: pth = join(indir, pth) else: raise OSError( 'Error in [%(sec)s] %(varname)s = %(pth)s: specify either an existing path or provide a default input directory using `indir`' % \ locals()) vars.append(PathVariable(varname, '', pth)) # output files and directories for varname,pth in config.items(fmt_out % locals()): if varname in defaults: continue elif outdir and not (pth.startswith(outdir) or pth.startswith('.')): pth = join(outdir, pth) else: pth = os.path.abspath(pth) # TODO: document this behavior (assume var is a directory if ends with 'dir') if varname.endswith('dir') or os.path.isdir(pth): pvar = PathVariable.PathIsDirCreate else: pvar = PathVariable.PathAccept vars.append(PathVariable(varname, '', pth, pvar)) # ordinary variables; no path checking or directory creation params = fmt_params % locals() for varname, val in config.items(params): if varname in defaults: continue vars.append( (varname, '%(varname)s: defined in [%(params)s]' % locals(), val)) return tuple(vars)