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