implement support for yaml !Env tag

This way environment variables van be referenced in the
.pre-commit-config.yaml, e.g.

  cfg: !Env "${PRE_COMMIT_CONFIG_PATH}/.oelint-adv.yaml"
This commit is contained in:
Christian Taedcke 2024-11-29 13:19:53 +01:00
parent bc89707d15
commit 5d938325c4

View file

@ -1,11 +1,26 @@
from __future__ import annotations
import functools
import os
import re
from typing import Any
import yaml
def env_constructor(loader: yaml.Loader, node: yaml.ScalarNode) -> str:
"""Load !Env tag"""
value = str(loader.construct_scalar(node))
match = re.compile('.*?\\${(\\w+)}.*?').findall(value)
if match:
for key in match:
value = value.replace(f'${{{key}}}', os.getenv(key, ''))
return value
Loader = getattr(yaml, 'CSafeLoader', yaml.SafeLoader)
Loader.add_constructor(tag='!Env', constructor=env_constructor)
yaml_compose = functools.partial(yaml.compose, Loader=Loader)
yaml_load = functools.partial(yaml.load, Loader=Loader)
Dumper = getattr(yaml, 'CSafeDumper', yaml.SafeDumper)