Source code for pymt.babel
#! /usr/bin/env python
"""Utility functions for working with babel projects."""
import logging
import os
import shlex
import subprocess # nosec
from string import Template
[docs]class BabelConfigError(Exception):
def __init__(self, prog):
self._prog = prog
def __str__(self):
return self._prog
[docs]def prepend_env_path(var, path, sep=os.pathsep):
"""Prepend a path to an environment variable."""
try:
os.environ[var] = sep.join([path, os.environ[var]])
except KeyError:
os.environ[var] = path
return path
[docs]def contains_identifiers(template):
try:
Template(template).substitute()
except KeyError:
return True
else:
return False
[docs]def recursive_substitute(template, **kwds):
while contains_identifiers(template):
try:
template = Template(template).substitute(**kwds)
except KeyError:
break
return template
[docs]def query_config_all(config="csdms-config"):
try:
contents = subprocess.check_output([config, "--dump"]) # nosec
except subprocess.CalledProcessError:
logging.info("Error running {prog}.".format(prog=config))
except OSError:
logging.info("Unable to run {prog} program.".format(prog=config))
vars_ = {}
for line in shlex.split(contents):
try:
(key, var) = line.split("=", 1)
except ValueError:
pass
else:
vars_[key] = var
return vars_
[docs]def query_config_var(var, config="csdms-config", interpolate=True):
"""Get a configuration variable from a babel project."""
value = None
try:
value = subprocess.check_output([config, "--var", var]).strip() # nosec
except subprocess.CalledProcessError:
logging.info("Error running {prog}.".format(prog=config))
except OSError:
logging.info("Unable to run {prog} program.".format(prog=config))
if value is None:
raise BabelConfigError(config)
if interpolate:
vars_ = query_config_all(config=config)
value = recursive_substitute(value, **vars_)
return value
[docs]def setup_babel_environ():
"""Set up environment variables to load babelized components."""
try:
prefix = query_config_var("prefix", config="csdms-config")
ccaspec_babel_libs = query_config_var(
"CCASPEC_BABEL_LIBS", config="cca-spec-babel-config"
)
except BabelConfigError:
logging.info("Unable to configure for babel. Not loading components.")
else:
prepend_env_path("SIDL_DLL_PATH", os.path.join(prefix, "share", "cca"), sep=";")
prepend_env_path("LD_LIBRARY_PATH", ccaspec_babel_libs)