mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 17:20:30 +08:00
yaml supports include dirs
This commit is contained in:
parent
10e6e53006
commit
d084110481
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
from typing import Dict
|
||||||
from typing import IO
|
from typing import IO
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
@ -49,9 +51,31 @@ class _YamlLoader(yaml.SafeLoader):
|
|||||||
super().__init__(yaml_file)
|
super().__init__(yaml_file)
|
||||||
self.__root = os.path.dirname(yaml_file.name)
|
self.__root = os.path.dirname(yaml_file.name)
|
||||||
|
|
||||||
def include(self, node: yaml.nodes.ScalarNode) -> Any:
|
def include(self, node: yaml.nodes.Node) -> Any:
|
||||||
path = os.path.join(self.__root, str(self.construct_scalar(node)))
|
incs: List[str]
|
||||||
return load_yaml_file(path)
|
if isinstance(node, yaml.nodes.SequenceNode):
|
||||||
|
incs = [
|
||||||
|
str(child)
|
||||||
|
for child in self.construct_sequence(node)
|
||||||
|
if isinstance(child, (int, float, str))
|
||||||
|
]
|
||||||
|
else: # Trying scalar for the fallback
|
||||||
|
incs = [str(self.construct_scalar(node))] # type: ignore
|
||||||
|
return self.__inner_include(list(filter(None, incs)))
|
||||||
|
|
||||||
|
def __inner_include(self, incs: List[str]) -> Any:
|
||||||
|
tree: Dict = {}
|
||||||
|
for inc in filter(None, incs):
|
||||||
|
assert inc, inc
|
||||||
|
inc_path = os.path.join(self.__root, inc)
|
||||||
|
if os.path.isdir(inc_path):
|
||||||
|
for child in sorted(os.listdir(inc_path)):
|
||||||
|
child_path = os.path.join(inc_path, child)
|
||||||
|
if os.path.isfile(child_path) or os.path.islink(child_path):
|
||||||
|
tools.merge(tree, (load_yaml_file(child_path) or {}))
|
||||||
|
else: # Try file
|
||||||
|
tools.merge(tree, (load_yaml_file(inc_path) or {}))
|
||||||
|
return tree
|
||||||
|
|
||||||
|
|
||||||
_YamlLoader.add_constructor("!include", _YamlLoader.include)
|
_YamlLoader.add_constructor("!include", _YamlLoader.include)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user