You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			391 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			391 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
 | 
						|
from .error import *
 | 
						|
 | 
						|
from .tokens import *
 | 
						|
from .events import *
 | 
						|
from .nodes import *
 | 
						|
 | 
						|
from .loader import *
 | 
						|
from .dumper import *
 | 
						|
 | 
						|
__version__ = '6.0.3'
 | 
						|
try:
 | 
						|
    from .cyaml import *
 | 
						|
    __with_libyaml__ = True
 | 
						|
except ImportError:
 | 
						|
    __with_libyaml__ = False
 | 
						|
 | 
						|
import io
 | 
						|
 | 
						|
#------------------------------------------------------------------------------
 | 
						|
# XXX "Warnings control" is now deprecated. Leaving in the API function to not
 | 
						|
# break code that uses it.
 | 
						|
#------------------------------------------------------------------------------
 | 
						|
def warnings(settings=None):
 | 
						|
    if settings is None:
 | 
						|
        return {}
 | 
						|
 | 
						|
#------------------------------------------------------------------------------
 | 
						|
def scan(stream, Loader=Loader):
 | 
						|
    """
 | 
						|
    Scan a YAML stream and produce scanning tokens.
 | 
						|
    """
 | 
						|
    loader = Loader(stream)
 | 
						|
    try:
 | 
						|
        while loader.check_token():
 | 
						|
            yield loader.get_token()
 | 
						|
    finally:
 | 
						|
        loader.dispose()
 | 
						|
 | 
						|
def parse(stream, Loader=Loader):
 | 
						|
    """
 | 
						|
    Parse a YAML stream and produce parsing events.
 | 
						|
    """
 | 
						|
    loader = Loader(stream)
 | 
						|
    try:
 | 
						|
        while loader.check_event():
 | 
						|
            yield loader.get_event()
 | 
						|
    finally:
 | 
						|
        loader.dispose()
 | 
						|
 | 
						|
def compose(stream, Loader=Loader):
 | 
						|
    """
 | 
						|
    Parse the first YAML document in a stream
 | 
						|
    and produce the corresponding representation tree.
 | 
						|
    """
 | 
						|
    loader = Loader(stream)
 | 
						|
    try:
 | 
						|
        return loader.get_single_node()
 | 
						|
    finally:
 | 
						|
        loader.dispose()
 | 
						|
 | 
						|
def compose_all(stream, Loader=Loader):
 | 
						|
    """
 | 
						|
    Parse all YAML documents in a stream
 | 
						|
    and produce corresponding representation trees.
 | 
						|
    """
 | 
						|
    loader = Loader(stream)
 | 
						|
    try:
 | 
						|
        while loader.check_node():
 | 
						|
            yield loader.get_node()
 | 
						|
    finally:
 | 
						|
        loader.dispose()
 | 
						|
 | 
						|
def load(stream, Loader):
 | 
						|
    """
 | 
						|
    Parse the first YAML document in a stream
 | 
						|
    and produce the corresponding Python object.
 | 
						|
    """
 | 
						|
    loader = Loader(stream)
 | 
						|
    try:
 | 
						|
        return loader.get_single_data()
 | 
						|
    finally:
 | 
						|
        loader.dispose()
 | 
						|
 | 
						|
def load_all(stream, Loader):
 | 
						|
    """
 | 
						|
    Parse all YAML documents in a stream
 | 
						|
    and produce corresponding Python objects.
 | 
						|
    """
 | 
						|
    loader = Loader(stream)
 | 
						|
    try:
 | 
						|
        while loader.check_data():
 | 
						|
            yield loader.get_data()
 | 
						|
    finally:
 | 
						|
        loader.dispose()
 | 
						|
 | 
						|
def full_load(stream):
 | 
						|
    """
 | 
						|
    Parse the first YAML document in a stream
 | 
						|
    and produce the corresponding Python object.
 | 
						|
 | 
						|
    Resolve all tags except those known to be
 | 
						|
    unsafe on untrusted input.
 | 
						|
    """
 | 
						|
    return load(stream, FullLoader)
 | 
						|
 | 
						|
def full_load_all(stream):
 | 
						|
    """
 | 
						|
    Parse all YAML documents in a stream
 | 
						|
    and produce corresponding Python objects.
 | 
						|
 | 
						|
    Resolve all tags except those known to be
 | 
						|
    unsafe on untrusted input.
 | 
						|
    """
 | 
						|
    return load_all(stream, FullLoader)
 | 
						|
 | 
						|
def safe_load(stream):
 | 
						|
    """
 | 
						|
    Parse the first YAML document in a stream
 | 
						|
    and produce the corresponding Python object.
 | 
						|
 | 
						|
    Resolve only basic YAML tags. This is known
 | 
						|
    to be safe for untrusted input.
 | 
						|
    """
 | 
						|
    return load(stream, SafeLoader)
 | 
						|
 | 
						|
def safe_load_all(stream):
 | 
						|
    """
 | 
						|
    Parse all YAML documents in a stream
 | 
						|
    and produce corresponding Python objects.
 | 
						|
 | 
						|
    Resolve only basic YAML tags. This is known
 | 
						|
    to be safe for untrusted input.
 | 
						|
    """
 | 
						|
    return load_all(stream, SafeLoader)
 | 
						|
 | 
						|
def unsafe_load(stream):
 | 
						|
    """
 | 
						|
    Parse the first YAML document in a stream
 | 
						|
    and produce the corresponding Python object.
 | 
						|
 | 
						|
    Resolve all tags, even those known to be
 | 
						|
    unsafe on untrusted input.
 | 
						|
    """
 | 
						|
    return load(stream, UnsafeLoader)
 | 
						|
 | 
						|
def unsafe_load_all(stream):
 | 
						|
    """
 | 
						|
    Parse all YAML documents in a stream
 | 
						|
    and produce corresponding Python objects.
 | 
						|
 | 
						|
    Resolve all tags, even those known to be
 | 
						|
    unsafe on untrusted input.
 | 
						|
    """
 | 
						|
    return load_all(stream, UnsafeLoader)
 | 
						|
 | 
						|
def emit(events, stream=None, Dumper=Dumper,
 | 
						|
        canonical=None, indent=None, width=None,
 | 
						|
        allow_unicode=None, line_break=None):
 | 
						|
    """
 | 
						|
    Emit YAML parsing events into a stream.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    getvalue = None
 | 
						|
    if stream is None:
 | 
						|
        stream = io.StringIO()
 | 
						|
        getvalue = stream.getvalue
 | 
						|
    dumper = Dumper(stream, canonical=canonical, indent=indent, width=width,
 | 
						|
            allow_unicode=allow_unicode, line_break=line_break)
 | 
						|
    try:
 | 
						|
        for event in events:
 | 
						|
            dumper.emit(event)
 | 
						|
    finally:
 | 
						|
        dumper.dispose()
 | 
						|
    if getvalue:
 | 
						|
        return getvalue()
 | 
						|
 | 
						|
def serialize_all(nodes, stream=None, Dumper=Dumper,
 | 
						|
        canonical=None, indent=None, width=None,
 | 
						|
        allow_unicode=None, line_break=None,
 | 
						|
        encoding=None, explicit_start=None, explicit_end=None,
 | 
						|
        version=None, tags=None):
 | 
						|
    """
 | 
						|
    Serialize a sequence of representation trees into a YAML stream.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    getvalue = None
 | 
						|
    if stream is None:
 | 
						|
        if encoding is None:
 | 
						|
            stream = io.StringIO()
 | 
						|
        else:
 | 
						|
            stream = io.BytesIO()
 | 
						|
        getvalue = stream.getvalue
 | 
						|
    dumper = Dumper(stream, canonical=canonical, indent=indent, width=width,
 | 
						|
            allow_unicode=allow_unicode, line_break=line_break,
 | 
						|
            encoding=encoding, version=version, tags=tags,
 | 
						|
            explicit_start=explicit_start, explicit_end=explicit_end)
 | 
						|
    try:
 | 
						|
        dumper.open()
 | 
						|
        for node in nodes:
 | 
						|
            dumper.serialize(node)
 | 
						|
        dumper.close()
 | 
						|
    finally:
 | 
						|
        dumper.dispose()
 | 
						|
    if getvalue:
 | 
						|
        return getvalue()
 | 
						|
 | 
						|
def serialize(node, stream=None, Dumper=Dumper, **kwds):
 | 
						|
    """
 | 
						|
    Serialize a representation tree into a YAML stream.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    return serialize_all([node], stream, Dumper=Dumper, **kwds)
 | 
						|
 | 
						|
def dump_all(documents, stream=None, Dumper=Dumper,
 | 
						|
        default_style=None, default_flow_style=False,
 | 
						|
        canonical=None, indent=None, width=None,
 | 
						|
        allow_unicode=None, line_break=None,
 | 
						|
        encoding=None, explicit_start=None, explicit_end=None,
 | 
						|
        version=None, tags=None, sort_keys=True):
 | 
						|
    """
 | 
						|
    Serialize a sequence of Python objects into a YAML stream.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    getvalue = None
 | 
						|
    if stream is None:
 | 
						|
        if encoding is None:
 | 
						|
            stream = io.StringIO()
 | 
						|
        else:
 | 
						|
            stream = io.BytesIO()
 | 
						|
        getvalue = stream.getvalue
 | 
						|
    dumper = Dumper(stream, default_style=default_style,
 | 
						|
            default_flow_style=default_flow_style,
 | 
						|
            canonical=canonical, indent=indent, width=width,
 | 
						|
            allow_unicode=allow_unicode, line_break=line_break,
 | 
						|
            encoding=encoding, version=version, tags=tags,
 | 
						|
            explicit_start=explicit_start, explicit_end=explicit_end, sort_keys=sort_keys)
 | 
						|
    try:
 | 
						|
        dumper.open()
 | 
						|
        for data in documents:
 | 
						|
            dumper.represent(data)
 | 
						|
        dumper.close()
 | 
						|
    finally:
 | 
						|
        dumper.dispose()
 | 
						|
    if getvalue:
 | 
						|
        return getvalue()
 | 
						|
 | 
						|
def dump(data, stream=None, Dumper=Dumper, **kwds):
 | 
						|
    """
 | 
						|
    Serialize a Python object into a YAML stream.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    return dump_all([data], stream, Dumper=Dumper, **kwds)
 | 
						|
 | 
						|
def safe_dump_all(documents, stream=None, **kwds):
 | 
						|
    """
 | 
						|
    Serialize a sequence of Python objects into a YAML stream.
 | 
						|
    Produce only basic YAML tags.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    return dump_all(documents, stream, Dumper=SafeDumper, **kwds)
 | 
						|
 | 
						|
def safe_dump(data, stream=None, **kwds):
 | 
						|
    """
 | 
						|
    Serialize a Python object into a YAML stream.
 | 
						|
    Produce only basic YAML tags.
 | 
						|
    If stream is None, return the produced string instead.
 | 
						|
    """
 | 
						|
    return dump_all([data], stream, Dumper=SafeDumper, **kwds)
 | 
						|
 | 
						|
def add_implicit_resolver(tag, regexp, first=None,
 | 
						|
        Loader=None, Dumper=Dumper):
 | 
						|
    """
 | 
						|
    Add an implicit scalar detector.
 | 
						|
    If an implicit scalar value matches the given regexp,
 | 
						|
    the corresponding tag is assigned to the scalar.
 | 
						|
    first is a sequence of possible initial characters or None.
 | 
						|
    """
 | 
						|
    if Loader is None:
 | 
						|
        loader.Loader.add_implicit_resolver(tag, regexp, first)
 | 
						|
        loader.FullLoader.add_implicit_resolver(tag, regexp, first)
 | 
						|
        loader.UnsafeLoader.add_implicit_resolver(tag, regexp, first)
 | 
						|
    else:
 | 
						|
        Loader.add_implicit_resolver(tag, regexp, first)
 | 
						|
    Dumper.add_implicit_resolver(tag, regexp, first)
 | 
						|
 | 
						|
def add_path_resolver(tag, path, kind=None, Loader=None, Dumper=Dumper):
 | 
						|
    """
 | 
						|
    Add a path based resolver for the given tag.
 | 
						|
    A path is a list of keys that forms a path
 | 
						|
    to a node in the representation tree.
 | 
						|
    Keys can be string values, integers, or None.
 | 
						|
    """
 | 
						|
    if Loader is None:
 | 
						|
        loader.Loader.add_path_resolver(tag, path, kind)
 | 
						|
        loader.FullLoader.add_path_resolver(tag, path, kind)
 | 
						|
        loader.UnsafeLoader.add_path_resolver(tag, path, kind)
 | 
						|
    else:
 | 
						|
        Loader.add_path_resolver(tag, path, kind)
 | 
						|
    Dumper.add_path_resolver(tag, path, kind)
 | 
						|
 | 
						|
def add_constructor(tag, constructor, Loader=None):
 | 
						|
    """
 | 
						|
    Add a constructor for the given tag.
 | 
						|
    Constructor is a function that accepts a Loader instance
 | 
						|
    and a node object and produces the corresponding Python object.
 | 
						|
    """
 | 
						|
    if Loader is None:
 | 
						|
        loader.Loader.add_constructor(tag, constructor)
 | 
						|
        loader.FullLoader.add_constructor(tag, constructor)
 | 
						|
        loader.UnsafeLoader.add_constructor(tag, constructor)
 | 
						|
    else:
 | 
						|
        Loader.add_constructor(tag, constructor)
 | 
						|
 | 
						|
def add_multi_constructor(tag_prefix, multi_constructor, Loader=None):
 | 
						|
    """
 | 
						|
    Add a multi-constructor for the given tag prefix.
 | 
						|
    Multi-constructor is called for a node if its tag starts with tag_prefix.
 | 
						|
    Multi-constructor accepts a Loader instance, a tag suffix,
 | 
						|
    and a node object and produces the corresponding Python object.
 | 
						|
    """
 | 
						|
    if Loader is None:
 | 
						|
        loader.Loader.add_multi_constructor(tag_prefix, multi_constructor)
 | 
						|
        loader.FullLoader.add_multi_constructor(tag_prefix, multi_constructor)
 | 
						|
        loader.UnsafeLoader.add_multi_constructor(tag_prefix, multi_constructor)
 | 
						|
    else:
 | 
						|
        Loader.add_multi_constructor(tag_prefix, multi_constructor)
 | 
						|
 | 
						|
def add_representer(data_type, representer, Dumper=Dumper):
 | 
						|
    """
 | 
						|
    Add a representer for the given type.
 | 
						|
    Representer is a function accepting a Dumper instance
 | 
						|
    and an instance of the given data type
 | 
						|
    and producing the corresponding representation node.
 | 
						|
    """
 | 
						|
    Dumper.add_representer(data_type, representer)
 | 
						|
 | 
						|
def add_multi_representer(data_type, multi_representer, Dumper=Dumper):
 | 
						|
    """
 | 
						|
    Add a representer for the given type.
 | 
						|
    Multi-representer is a function accepting a Dumper instance
 | 
						|
    and an instance of the given data type or subtype
 | 
						|
    and producing the corresponding representation node.
 | 
						|
    """
 | 
						|
    Dumper.add_multi_representer(data_type, multi_representer)
 | 
						|
 | 
						|
class YAMLObjectMetaclass(type):
 | 
						|
    """
 | 
						|
    The metaclass for YAMLObject.
 | 
						|
    """
 | 
						|
    def __init__(cls, name, bases, kwds):
 | 
						|
        super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds)
 | 
						|
        if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None:
 | 
						|
            if isinstance(cls.yaml_loader, list):
 | 
						|
                for loader in cls.yaml_loader:
 | 
						|
                    loader.add_constructor(cls.yaml_tag, cls.from_yaml)
 | 
						|
            else:
 | 
						|
                cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
 | 
						|
 | 
						|
            cls.yaml_dumper.add_representer(cls, cls.to_yaml)
 | 
						|
 | 
						|
class YAMLObject(metaclass=YAMLObjectMetaclass):
 | 
						|
    """
 | 
						|
    An object that can dump itself to a YAML stream
 | 
						|
    and load itself from a YAML stream.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()  # no direct instantiation, so allow immutable subclasses
 | 
						|
 | 
						|
    yaml_loader = [Loader, FullLoader, UnsafeLoader]
 | 
						|
    yaml_dumper = Dumper
 | 
						|
 | 
						|
    yaml_tag = None
 | 
						|
    yaml_flow_style = None
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def from_yaml(cls, loader, node):
 | 
						|
        """
 | 
						|
        Convert a representation node to a Python object.
 | 
						|
        """
 | 
						|
        return loader.construct_yaml_object(node, cls)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def to_yaml(cls, dumper, data):
 | 
						|
        """
 | 
						|
        Convert a Python object to a representation node.
 | 
						|
        """
 | 
						|
        return dumper.represent_yaml_object(cls.yaml_tag, data, cls,
 | 
						|
                flow_style=cls.yaml_flow_style)
 | 
						|
 |