1import runpy 2 3import medikit 4from medikit.compat import deprecated_feature 5from medikit.config.defaults import setup_default_pipelines 6from medikit.config.registry import ConfigurationRegistry 7from medikit.settings import DEFAULT_FEATURES 8from medikit.utils import format_file_content 9 10 11def read_configuration(dispatcher, filename, variables, features, files): 12 config = ConfigurationRegistry(dispatcher) 13 setup_default_pipelines(config) 14 default_context = {"listen": dispatcher.listen} 15 16 # monkey patch placeholders 17 _listen, _pipeline, _require = medikit.listen, medikit.pipeline, medikit.require 18 try: 19 medikit.listen, medikit.pipeline, medikit.require = dispatcher.listen, config.pipeline, config.require 20 context = runpy.run_path(filename, init_globals=default_context) 21 finally: 22 # restore old values 23 medikit.listen, medikit.pipeline, medikit.require = _listen, _pipeline, _require 24 25 # Deprecated, but can be used for non-python projects (PACKAGE=...) 26 variables = {k: context.get(k, v) for k, v in variables.items()} 27 config.set_vars(**variables) 28 29 for feature in DEFAULT_FEATURES: 30 config.require(feature) 31 32 # Deprecated: enabled and disabled features. 33 enable_features, disable_features = context.pop("enable_features", ()), context.pop("disable_features", ()) 34 if len(enable_features) or len(disable_features): 35 with deprecated_feature("0.5.0", "0.6.0", 'Using "enable_features" and "disable_features"', "require()"): 36 for feature in set(enable_features) - set(disable_features): 37 config.require(feature) 38 39 # Better: required features. 40 features = features | set(config.keys()) 41 42 for k in files.keys(): 43 if k in context: 44 files[k] = format_file_content(context[k]) 45 46 return variables, features, files, config 47