Source code for mllaunchpad.yaml_loader
# Stdlib imports
import os
# Third-party imports
import yaml
[docs]class SafeIncludeLoader(yaml.SafeLoader):
"""A subclass of SafeLoader which supports !include file references."""
def __init__(self, stream):
if isinstance(stream, str) or isinstance(stream, bytes):
# Loading config from string
self._root = "."
else:
# Loading config from file
self._root = os.path.split(stream.name)[0]
super().__init__(stream)
[docs] def include(self, node):
filename = os.path.join(self._root, self.construct_scalar(node))
with open(filename, "r", encoding="utf-8") as f:
# Normally, one should use safe_load(), but our Loader
# is a subclass of yaml.SafeLoader
return yaml.load(f, Loader=SafeIncludeLoader) # nosec
SafeIncludeLoader.add_constructor("!include", SafeIncludeLoader.include)