From 2c8e6ca0cda9694c039e9ae0b907e76d267e6fc7 Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Wed, 13 Sep 2023 02:57:01 -0400 Subject: [PATCH] Switch from ruamel.yaml to pyyaml (#4555) * Switch from ruamel.yaml to pyyaml * Use CLoader and CDumper when available --- .github/workflows/builder.yml | 2 +- Dockerfile | 1 + requirements.txt | 2 +- supervisor/utils/yaml.py | 15 +++++++++------ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml index ad7b1db10..01748ed8d 100644 --- a/.github/workflows/builder.yml +++ b/.github/workflows/builder.yml @@ -112,7 +112,7 @@ jobs: tag: musllinux_1_2 arch: ${{ matrix.arch }} wheels-key: ${{ secrets.WHEELS_KEY }} - apk: "libffi-dev;openssl-dev" + apk: "libffi-dev;openssl-dev;yaml-dev" skip-binary: aiohttp env-file: true requirements: "requirements.txt" diff --git a/Dockerfile b/Dockerfile index 880ccc4c8..c81db74df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,7 @@ RUN \ libpulse \ musl \ openssl \ + yaml \ \ && curl -Lso /usr/bin/cosign "https://github.com/home-assistant/cosign/releases/download/${COSIGN_VERSION}/cosign_${BUILD_ARCH}" \ && chmod a+x /usr/bin/cosign diff --git a/requirements.txt b/requirements.txt index 99e6255f5..de002ecbb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,7 @@ gitpython==3.1.36 jinja2==3.1.2 pulsectl==23.5.2 pyudev==0.24.1 -ruamel.yaml==0.17.21 +PyYAML==6.0.1 securetar==2023.3.0 sentry-sdk==1.30.0 voluptuous==0.13.1 diff --git a/supervisor/utils/yaml.py b/supervisor/utils/yaml.py index 9a9871ce2..eac183777 100644 --- a/supervisor/utils/yaml.py +++ b/supervisor/utils/yaml.py @@ -3,20 +3,23 @@ import logging from pathlib import Path from atomicwrites import atomic_write -from ruamel.yaml import YAML, YAMLError +from yaml import YAMLError, dump, load + +try: + from yaml import CDumper as Dumper, CSafeLoader as SafeLoader +except ImportError: + from yaml import SafeLoader, Dumper from ..exceptions import YamlFileError -_YAML = YAML(typ="safe") -_YAML.allow_duplicate_keys = True - _LOGGER: logging.Logger = logging.getLogger(__name__) def read_yaml_file(path: Path) -> dict: """Read YAML file from path.""" try: - return _YAML.load(path) or {} + with open(path, encoding="utf-8") as yaml_file: + return load(yaml_file, Loader=SafeLoader) or {} except (YAMLError, AttributeError, OSError) as err: raise YamlFileError( @@ -28,7 +31,7 @@ def write_yaml_file(path: Path, data: dict) -> None: """Write a YAML file.""" try: with atomic_write(path, overwrite=True) as fp: - _YAML.dump(data, fp) + dump(data, fp, Dumper=Dumper) path.chmod(0o600) except (YAMLError, OSError, ValueError, TypeError) as err: raise YamlFileError(f"Can't write {path!s}: {err!s}", _LOGGER.error) from err