123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- # Licensed to the Apache Software Foundation (ASF) under one
- # or more contributor license agreements. See the NOTICE file
- # distributed with this work for additional information
- # regarding copyright ownership. The ASF licenses this file
- # to you under the Apache License, Version 2.0 (the
- # "License"); you may not use this file except in compliance
- # with the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing,
- # software distributed under the License is distributed on an
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- # KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations
- # under the License.
- """
- Use libyaml for YAML dump/load operations where possible.
- If libyaml is available we will use it -- it is significantly faster.
- This module delegates all other properties to the yaml module, so it can be used as:
- .. code-block:: python
- import airflow.utils.yaml as yaml
- And then be used directly in place of the normal python module.
- """
- from __future__ import annotations
- from typing import TYPE_CHECKING, Any, BinaryIO, TextIO, cast
- if TYPE_CHECKING:
- from yaml.error import MarkedYAMLError, YAMLError # noqa: F401
- def safe_load(stream: bytes | str | BinaryIO | TextIO) -> Any:
- """Like yaml.safe_load, but use the C libyaml for speed where we can."""
- # delay import until use.
- from yaml import load as orig
- try:
- from yaml import CSafeLoader as SafeLoader
- except ImportError:
- from yaml import SafeLoader # type: ignore[assignment, no-redef]
- return orig(stream, SafeLoader)
- def dump(data: Any, **kwargs) -> str:
- """Like yaml.safe_dump, but use the C libyaml for speed where we can."""
- # delay import until use.
- from yaml import dump as orig
- try:
- from yaml import CSafeDumper as SafeDumper
- except ImportError:
- from yaml import SafeDumper # type: ignore[assignment, no-redef]
- return cast(str, orig(data, Dumper=SafeDumper, **kwargs))
- def __getattr__(name):
- # Delegate anything else to the yaml module
- import yaml
- if name == "FullLoader":
- # Try to use CFullLoader by default
- getattr(yaml, "CFullLoader", yaml.FullLoader)
- return getattr(yaml, name)
|