3 from lib.utils import ConfigAST
4 from .common import NodeProperty, NodeDependency
5 from .nodes import GroupNode, TermNode
8 class ConfigEnvironment:
10 self.__node_table = {}
14 "env": lambda x: os.environ.get(x)
17 def check_dependency(self, node) -> bool:
18 dep = NodeProperty.Dependency[node]
20 if not isinstance(dep, NodeDependency):
24 for name in dep._names:
25 if name not in self.__node_table:
26 raise node.config_error(f"config: '{name}' does not exists")
28 n = self.__node_table[name]
29 value_map[name] = self.check_dependency(n)
31 return node.enabled() and dep.evaluate(value_map)
33 def register_node(self, cfg_node):
35 if name in self.__node_table:
36 raise cfg_node.config_error(f"redefinition of '{name}'")
38 self.__node_table[name] = cfg_node
40 def get_node(self, name):
41 return self.__node_table.get(name)
43 def relocate_children(self):
44 for node in self.__node_table.values():
45 parent = NodeProperty.Parent[node]
49 if not isinstance(parent, str):
52 if parent not in self.__node_table:
53 raise Exception(node, "unknow parent: %s"%(parent))
55 parent_node = self.__node_table[parent]
56 if not isinstance(parent_node, GroupNode):
57 raise Exception(node, "not a valid parent: %s"%(parent))
59 parent_node.add_child(node)
61 def set_exec_context(self, astns):
64 if isinstance(x, ConfigAST.EnterFileMarker):
66 if isinstance(x, ConfigAST.LeaveFileMarker):
70 module = ast.Module(filtered, type_ignores=[])
71 module = ast.fix_missing_locations(module)
73 self.__exec = compile(module, "", mode='exec')
75 def __update_globals(self):
91 self.__update_globals()
93 for name, node in self.__node_table.items():
96 for name, node in self.__node_table.items():
98 NodeProperty.Enabled[node] = self.check_dependency(node)
101 self.__node_table.clear()
104 for node in self.__node_table.values():
107 def top_levels(self):
108 for node in self.__node_table.values():
109 if NodeProperty.Parent[node] is None:
113 for node in self.__node_table.values():
114 if isinstance(node, TermNode):
118 return self.__exec is not None