import pyomo.common.config
import logging.config
import toml
import os
import importlib
_log = logging.getLogger(__name__)
default_config = """
default_binary_url = "https://github.com/IDAES/idaes-ext/releases/download/1.0.1/"
use_idaes_solvers = true
[plugins]
required = ["idaes"]
optional = []
[logging]
version = 1
disable_existing_loggers = false
[logging.formatters.f1]
format = "%(asctime)s - %(levelname)s - %(name)s - %(message)s"
datefmt = "%Y-%m-%d %H:%M:%S"
[logging.handlers.console]
class = "logging.StreamHandler"
formatter = "f1"
stream = "ext://sys.stdout"
[logging.loggers.idaes]
level = "INFO"
propagate = true
handlers = ["console"]
[logging.loggers."idaes.init"]
level = 5
propagate = false
handlers = ["console"]
[logging.loggers."idaes.model"]
level = "INFO"
propagate = false
handlers = ["console"]
"""
def new_idaes_config_block():
_config = pyomo.common.config.ConfigBlock("idaes", implicit=False)
_config.declare(
"logging",
pyomo.common.config.ConfigBlock(
implicit=True,
description="Logging configuration dictionary",
doc="This stores the logging configuration. See the Python "
"logging.config.dictConfig() documentation for details.",
),
)
_config.declare(
"plugins",
pyomo.common.config.ConfigBlock(
implicit=False,
description="Plugin search configuration",
doc="Plugin search configuration",
),
)
_config.plugins.declare(
"required",
pyomo.common.config.ConfigValue(
default=[],
description="Modules with required plugins",
doc="This is a string list of modules from which to load plugins. "
"This will look in {module}.plugins for things to load. Exceptions"
"raised while attempting to load these plugins are considered fatal. "
"This is used for core plugins.",
),
)
_config.plugins.declare(
"optional",
pyomo.common.config.ConfigValue(
default=[],
description="Modules with optional plugins to load",
doc="This is a string list of modules from which to load plugins. "
"This will look in {module}.plugins for things to load. Exceptions "
"raised while attempting to load these plugins will be logged but "
"are nonfatal. This is used for contrib plugins.",
),
)
_config.declare(
"use_idaes_solvers",
pyomo.common.config.ConfigValue(
default=True,
description="Add the IDAES bin directory to the path.",
doc="Add the IDAES bin directory to the path such that solvers provided "
"by IDAES will be used in preference to previously installed solvers.",
),
)
_config.declare(
"default_binary_url",
pyomo.common.config.ConfigValue(
default=None,
description="URL from which to download binaries by default",
),
)
return _config
[docs]def read_config(read_config, write_config):
"""Read either a TOML formatted config file or a configuration dictionary.
Args:
config: A config file path or dict
Returns:
None
"""
config_file = None
if read_config is None:
return
elif isinstance(read_config, dict):
pass # don't worry this catches ConfigBlock too it seems
else:
config_file = read_config
try:
with open(config_file, "r") as f:
write_config = toml.load(f)
except IOError: # don't require config file
_log.debug("Config file {} not found (this is okay)".format(read_config))
return
write_config.set_value(read_config)
logging.config.dictConfig(write_config["logging"])
if config_file is not None:
_log.debug("Read config {}".format(config_file))
[docs]def create_dir(d):
"""Create a directory if it doesn't exist.
Args:
d(str): directory path to create
Retruns:
None
"""
if os.path.exists(d):
return
else:
os.mkdir(d)
[docs]def import_packages(packages, optional=True):
"""Import plugin package, condensed from pyomo.environ.__init__.py
Args:
packages: list of packages in which to look for plugins
optional: true, log ImportError but continue; false, raise if ImportError
Returns:
None
"""
for name in packages:
pname = name + '.plugins' # look in plugins sub-package
try:
pkg = importlib.import_module(pname)
except ImportError as e:
_log.exception("failed to import plugin: {}".format(pname))
if not optional:
raise e
if hasattr(pkg, 'load'): # run load function for a module if it exists
pkg.load()