Ben Nemec 448807a706 Explicitly set default_flow_style to False
In PyYAML 5.1 they changed this default in the library. Because
we weren't explicitly setting it, this broke our unit tests.
Since default_flow_style=False is usually what you want (hence why
PyYAML changed it), let's set it explicitly.

Also note that this was already being set for dump, but not for
dumps. This is also more consistent.

Change-Id: I3f7dfce5ceb5d3b802878c410406994cbb0988b6
2019-05-02 17:05:24 +00:00

87 lines
3.2 KiB
Python

# Licensed 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.
"""YAML related utilities.
The main goal of this module is to standardize yaml management inside
openstack. This module reduce technical debt by avoiding re-implementations
of yaml manager in all the openstack projects.
Use this module inside openstack projects to handle yaml securely and properly.
"""
import yaml
def load(stream, is_safe=True):
"""Converts a YAML document to a Python object.
:param stream: the YAML document to convert into a Python object. Accepts
a byte string, a Unicode string, an open binary file object,
or an open text file object.
:param is_safe: Turn off safe loading. True by default and only load
standard YAML. This option can be turned off by
passing ``is_safe=False`` if you need to load not only
standard YAML tags or if you need to construct an
arbitrary python object.
Stream specifications:
* An empty stream contains no documents.
* Documents are separated with ``---``.
* Documents may optionally end with ``...``.
* A single document may or may not be marked with ``---``.
Parses the given stream and returns a Python object constructed
from the first document in the stream. If there are no documents
in the stream, it returns None.
"""
yaml_loader = yaml.Loader
if is_safe:
if hasattr(yaml, 'CSafeLoader'):
yaml_loader = yaml.CSafeLoader
else:
yaml_loader = yaml.SafeLoader
return yaml.load(stream, yaml_loader) # nosec B506
def dumps(obj, is_safe=True):
"""Converts a Python object to a YAML document.
:param obj: python object to convert into YAML representation.
:param is_safe: Turn off safe dumping.
Serializes the given Python object to a string and returns that string.
"""
yaml_dumper = yaml.Dumper
if is_safe:
if hasattr(yaml, 'CSafeDumper'):
yaml_dumper = yaml.CSafeDumper
else:
yaml_dumper = yaml.SafeDumper
return yaml.dump(obj, default_flow_style=False, Dumper=yaml_dumper)
def dump(obj, fp, is_safe=True):
"""Converts a Python object as a YAML document to ``fp``.
:param obj: python object to convert into YAML representation.
:param fp: a ``.write()``-supporting file-like object
:param is_safe: Turn off safe dumping.
"""
yaml_dumper = yaml.Dumper
if is_safe:
if hasattr(yaml, 'CSafeDumper'):
yaml_dumper = yaml.CSafeDumper
else:
yaml_dumper = yaml.SafeDumper
return yaml.dump(obj, fp, default_flow_style=False, Dumper=yaml_dumper)