Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!["%% __init__.pynu[ from .error import * from .tokens import * from .events import * from .nodes import * from .loader import * from .dumper import * __version__ = '3.12' try: from .cyaml import * __with_libyaml__ = True except ImportError: __with_libyaml__ = False import io 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=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=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 safe_load(stream): """ Parse the first YAML document in a stream and produce the corresponding Python object. Resolve only basic YAML tags. """ 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. """ return load_all(stream, SafeLoader) 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=None, 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 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) 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=Loader, 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. """ Loader.add_implicit_resolver(tag, regexp, first) Dumper.add_implicit_resolver(tag, regexp, first) def add_path_resolver(tag, path, kind=None, Loader=Loader, 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. """ Loader.add_path_resolver(tag, path, kind) Dumper.add_path_resolver(tag, path, kind) def add_constructor(tag, constructor, Loader=Loader): """ 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. """ Loader.add_constructor(tag, constructor) def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): """ 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. """ 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: 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 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) PK! events.pynu[ # Abstract classes. class Event(object): def __init__(self, start_mark=None, end_mark=None): self.start_mark = start_mark self.end_mark = end_mark def __repr__(self): attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] if hasattr(self, key)] arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) for key in attributes]) return '%s(%s)' % (self.__class__.__name__, arguments) class NodeEvent(Event): def __init__(self, anchor, start_mark=None, end_mark=None): self.anchor = anchor self.start_mark = start_mark self.end_mark = end_mark class CollectionStartEvent(NodeEvent): def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, flow_style=None): self.anchor = anchor self.tag = tag self.implicit = implicit self.start_mark = start_mark self.end_mark = end_mark self.flow_style = flow_style class CollectionEndEvent(Event): pass # Implementations. class StreamStartEvent(Event): def __init__(self, start_mark=None, end_mark=None, encoding=None): self.start_mark = start_mark self.end_mark = end_mark self.encoding = encoding class StreamEndEvent(Event): pass class DocumentStartEvent(Event): def __init__(self, start_mark=None, end_mark=None, explicit=None, version=None, tags=None): self.start_mark = start_mark self.end_mark = end_mark self.explicit = explicit self.version = version self.tags = tags class DocumentEndEvent(Event): def __init__(self, start_mark=None, end_mark=None, explicit=None): self.start_mark = start_mark self.end_mark = end_mark self.explicit = explicit class AliasEvent(NodeEvent): pass class ScalarEvent(NodeEvent): def __init__(self, anchor, tag, implicit, value, start_mark=None, end_mark=None, style=None): self.anchor = anchor self.tag = tag self.implicit = implicit self.value = value self.start_mark = start_mark self.end_mark = end_mark self.style = style class SequenceStartEvent(CollectionStartEvent): pass class SequenceEndEvent(CollectionEndEvent): pass class MappingStartEvent(CollectionStartEvent): pass class MappingEndEvent(CollectionEndEvent): pass PK!ʧʧ emitter.pynu[ # Emitter expects events obeying the following grammar: # stream ::= STREAM-START document* STREAM-END # document ::= DOCUMENT-START node DOCUMENT-END # node ::= SCALAR | sequence | mapping # sequence ::= SEQUENCE-START node* SEQUENCE-END # mapping ::= MAPPING-START (node node)* MAPPING-END __all__ = ['Emitter', 'EmitterError'] from .error import YAMLError from .events import * class EmitterError(YAMLError): pass class ScalarAnalysis: def __init__(self, scalar, empty, multiline, allow_flow_plain, allow_block_plain, allow_single_quoted, allow_double_quoted, allow_block): self.scalar = scalar self.empty = empty self.multiline = multiline self.allow_flow_plain = allow_flow_plain self.allow_block_plain = allow_block_plain self.allow_single_quoted = allow_single_quoted self.allow_double_quoted = allow_double_quoted self.allow_block = allow_block class Emitter: DEFAULT_TAG_PREFIXES = { '!' : '!', 'tag:yaml.org,2002:' : '!!', } def __init__(self, stream, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None): # The stream should have the methods `write` and possibly `flush`. self.stream = stream # Encoding can be overriden by STREAM-START. self.encoding = None # Emitter is a state machine with a stack of states to handle nested # structures. self.states = [] self.state = self.expect_stream_start # Current event and the event queue. self.events = [] self.event = None # The current indentation level and the stack of previous indents. self.indents = [] self.indent = None # Flow level. self.flow_level = 0 # Contexts. self.root_context = False self.sequence_context = False self.mapping_context = False self.simple_key_context = False # Characteristics of the last emitted character: # - current position. # - is it a whitespace? # - is it an indention character # (indentation space, '-', '?', or ':')? self.line = 0 self.column = 0 self.whitespace = True self.indention = True # Whether the document requires an explicit document indicator self.open_ended = False # Formatting details. self.canonical = canonical self.allow_unicode = allow_unicode self.best_indent = 2 if indent and 1 < indent < 10: self.best_indent = indent self.best_width = 80 if width and width > self.best_indent*2: self.best_width = width self.best_line_break = '\n' if line_break in ['\r', '\n', '\r\n']: self.best_line_break = line_break # Tag prefixes. self.tag_prefixes = None # Prepared anchor and tag. self.prepared_anchor = None self.prepared_tag = None # Scalar analysis and style. self.analysis = None self.style = None def dispose(self): # Reset the state attributes (to clear self-references) self.states = [] self.state = None def emit(self, event): self.events.append(event) while not self.need_more_events(): self.event = self.events.pop(0) self.state() self.event = None # In some cases, we wait for a few next events before emitting. def need_more_events(self): if not self.events: return True event = self.events[0] if isinstance(event, DocumentStartEvent): return self.need_events(1) elif isinstance(event, SequenceStartEvent): return self.need_events(2) elif isinstance(event, MappingStartEvent): return self.need_events(3) else: return False def need_events(self, count): level = 0 for event in self.events[1:]: if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): level += 1 elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): level -= 1 elif isinstance(event, StreamEndEvent): level = -1 if level < 0: return False return (len(self.events) < count+1) def increase_indent(self, flow=False, indentless=False): self.indents.append(self.indent) if self.indent is None: if flow: self.indent = self.best_indent else: self.indent = 0 elif not indentless: self.indent += self.best_indent # States. # Stream handlers. def expect_stream_start(self): if isinstance(self.event, StreamStartEvent): if self.event.encoding and not hasattr(self.stream, 'encoding'): self.encoding = self.event.encoding self.write_stream_start() self.state = self.expect_first_document_start else: raise EmitterError("expected StreamStartEvent, but got %s" % self.event) def expect_nothing(self): raise EmitterError("expected nothing, but got %s" % self.event) # Document handlers. def expect_first_document_start(self): return self.expect_document_start(first=True) def expect_document_start(self, first=False): if isinstance(self.event, DocumentStartEvent): if (self.event.version or self.event.tags) and self.open_ended: self.write_indicator('...', True) self.write_indent() if self.event.version: version_text = self.prepare_version(self.event.version) self.write_version_directive(version_text) self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() if self.event.tags: handles = sorted(self.event.tags.keys()) for handle in handles: prefix = self.event.tags[handle] self.tag_prefixes[prefix] = handle handle_text = self.prepare_tag_handle(handle) prefix_text = self.prepare_tag_prefix(prefix) self.write_tag_directive(handle_text, prefix_text) implicit = (first and not self.event.explicit and not self.canonical and not self.event.version and not self.event.tags and not self.check_empty_document()) if not implicit: self.write_indent() self.write_indicator('---', True) if self.canonical: self.write_indent() self.state = self.expect_document_root elif isinstance(self.event, StreamEndEvent): if self.open_ended: self.write_indicator('...', True) self.write_indent() self.write_stream_end() self.state = self.expect_nothing else: raise EmitterError("expected DocumentStartEvent, but got %s" % self.event) def expect_document_end(self): if isinstance(self.event, DocumentEndEvent): self.write_indent() if self.event.explicit: self.write_indicator('...', True) self.write_indent() self.flush_stream() self.state = self.expect_document_start else: raise EmitterError("expected DocumentEndEvent, but got %s" % self.event) def expect_document_root(self): self.states.append(self.expect_document_end) self.expect_node(root=True) # Node handlers. def expect_node(self, root=False, sequence=False, mapping=False, simple_key=False): self.root_context = root self.sequence_context = sequence self.mapping_context = mapping self.simple_key_context = simple_key if isinstance(self.event, AliasEvent): self.expect_alias() elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): self.process_anchor('&') self.process_tag() if isinstance(self.event, ScalarEvent): self.expect_scalar() elif isinstance(self.event, SequenceStartEvent): if self.flow_level or self.canonical or self.event.flow_style \ or self.check_empty_sequence(): self.expect_flow_sequence() else: self.expect_block_sequence() elif isinstance(self.event, MappingStartEvent): if self.flow_level or self.canonical or self.event.flow_style \ or self.check_empty_mapping(): self.expect_flow_mapping() else: self.expect_block_mapping() else: raise EmitterError("expected NodeEvent, but got %s" % self.event) def expect_alias(self): if self.event.anchor is None: raise EmitterError("anchor is not specified for alias") self.process_anchor('*') self.state = self.states.pop() def expect_scalar(self): self.increase_indent(flow=True) self.process_scalar() self.indent = self.indents.pop() self.state = self.states.pop() # Flow sequence handlers. def expect_flow_sequence(self): self.write_indicator('[', True, whitespace=True) self.flow_level += 1 self.increase_indent(flow=True) self.state = self.expect_first_flow_sequence_item def expect_first_flow_sequence_item(self): if isinstance(self.event, SequenceEndEvent): self.indent = self.indents.pop() self.flow_level -= 1 self.write_indicator(']', False) self.state = self.states.pop() else: if self.canonical or self.column > self.best_width: self.write_indent() self.states.append(self.expect_flow_sequence_item) self.expect_node(sequence=True) def expect_flow_sequence_item(self): if isinstance(self.event, SequenceEndEvent): self.indent = self.indents.pop() self.flow_level -= 1 if self.canonical: self.write_indicator(',', False) self.write_indent() self.write_indicator(']', False) self.state = self.states.pop() else: self.write_indicator(',', False) if self.canonical or self.column > self.best_width: self.write_indent() self.states.append(self.expect_flow_sequence_item) self.expect_node(sequence=True) # Flow mapping handlers. def expect_flow_mapping(self): self.write_indicator('{', True, whitespace=True) self.flow_level += 1 self.increase_indent(flow=True) self.state = self.expect_first_flow_mapping_key def expect_first_flow_mapping_key(self): if isinstance(self.event, MappingEndEvent): self.indent = self.indents.pop() self.flow_level -= 1 self.write_indicator('}', False) self.state = self.states.pop() else: if self.canonical or self.column > self.best_width: self.write_indent() if not self.canonical and self.check_simple_key(): self.states.append(self.expect_flow_mapping_simple_value) self.expect_node(mapping=True, simple_key=True) else: self.write_indicator('?', True) self.states.append(self.expect_flow_mapping_value) self.expect_node(mapping=True) def expect_flow_mapping_key(self): if isinstance(self.event, MappingEndEvent): self.indent = self.indents.pop() self.flow_level -= 1 if self.canonical: self.write_indicator(',', False) self.write_indent() self.write_indicator('}', False) self.state = self.states.pop() else: self.write_indicator(',', False) if self.canonical or self.column > self.best_width: self.write_indent() if not self.canonical and self.check_simple_key(): self.states.append(self.expect_flow_mapping_simple_value) self.expect_node(mapping=True, simple_key=True) else: self.write_indicator('?', True) self.states.append(self.expect_flow_mapping_value) self.expect_node(mapping=True) def expect_flow_mapping_simple_value(self): self.write_indicator(':', False) self.states.append(self.expect_flow_mapping_key) self.expect_node(mapping=True) def expect_flow_mapping_value(self): if self.canonical or self.column > self.best_width: self.write_indent() self.write_indicator(':', True) self.states.append(self.expect_flow_mapping_key) self.expect_node(mapping=True) # Block sequence handlers. def expect_block_sequence(self): indentless = (self.mapping_context and not self.indention) self.increase_indent(flow=False, indentless=indentless) self.state = self.expect_first_block_sequence_item def expect_first_block_sequence_item(self): return self.expect_block_sequence_item(first=True) def expect_block_sequence_item(self, first=False): if not first and isinstance(self.event, SequenceEndEvent): self.indent = self.indents.pop() self.state = self.states.pop() else: self.write_indent() self.write_indicator('-', True, indention=True) self.states.append(self.expect_block_sequence_item) self.expect_node(sequence=True) # Block mapping handlers. def expect_block_mapping(self): self.increase_indent(flow=False) self.state = self.expect_first_block_mapping_key def expect_first_block_mapping_key(self): return self.expect_block_mapping_key(first=True) def expect_block_mapping_key(self, first=False): if not first and isinstance(self.event, MappingEndEvent): self.indent = self.indents.pop() self.state = self.states.pop() else: self.write_indent() if self.check_simple_key(): self.states.append(self.expect_block_mapping_simple_value) self.expect_node(mapping=True, simple_key=True) else: self.write_indicator('?', True, indention=True) self.states.append(self.expect_block_mapping_value) self.expect_node(mapping=True) def expect_block_mapping_simple_value(self): self.write_indicator(':', False) self.states.append(self.expect_block_mapping_key) self.expect_node(mapping=True) def expect_block_mapping_value(self): self.write_indent() self.write_indicator(':', True, indention=True) self.states.append(self.expect_block_mapping_key) self.expect_node(mapping=True) # Checkers. def check_empty_sequence(self): return (isinstance(self.event, SequenceStartEvent) and self.events and isinstance(self.events[0], SequenceEndEvent)) def check_empty_mapping(self): return (isinstance(self.event, MappingStartEvent) and self.events and isinstance(self.events[0], MappingEndEvent)) def check_empty_document(self): if not isinstance(self.event, DocumentStartEvent) or not self.events: return False event = self.events[0] return (isinstance(event, ScalarEvent) and event.anchor is None and event.tag is None and event.implicit and event.value == '') def check_simple_key(self): length = 0 if isinstance(self.event, NodeEvent) and self.event.anchor is not None: if self.prepared_anchor is None: self.prepared_anchor = self.prepare_anchor(self.event.anchor) length += len(self.prepared_anchor) if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ and self.event.tag is not None: if self.prepared_tag is None: self.prepared_tag = self.prepare_tag(self.event.tag) length += len(self.prepared_tag) if isinstance(self.event, ScalarEvent): if self.analysis is None: self.analysis = self.analyze_scalar(self.event.value) length += len(self.analysis.scalar) return (length < 128 and (isinstance(self.event, AliasEvent) or (isinstance(self.event, ScalarEvent) and not self.analysis.empty and not self.analysis.multiline) or self.check_empty_sequence() or self.check_empty_mapping())) # Anchor, Tag, and Scalar processors. def process_anchor(self, indicator): if self.event.anchor is None: self.prepared_anchor = None return if self.prepared_anchor is None: self.prepared_anchor = self.prepare_anchor(self.event.anchor) if self.prepared_anchor: self.write_indicator(indicator+self.prepared_anchor, True) self.prepared_anchor = None def process_tag(self): tag = self.event.tag if isinstance(self.event, ScalarEvent): if self.style is None: self.style = self.choose_scalar_style() if ((not self.canonical or tag is None) and ((self.style == '' and self.event.implicit[0]) or (self.style != '' and self.event.implicit[1]))): self.prepared_tag = None return if self.event.implicit[0] and tag is None: tag = '!' self.prepared_tag = None else: if (not self.canonical or tag is None) and self.event.implicit: self.prepared_tag = None return if tag is None: raise EmitterError("tag is not specified") if self.prepared_tag is None: self.prepared_tag = self.prepare_tag(tag) if self.prepared_tag: self.write_indicator(self.prepared_tag, True) self.prepared_tag = None def choose_scalar_style(self): if self.analysis is None: self.analysis = self.analyze_scalar(self.event.value) if self.event.style == '"' or self.canonical: return '"' if not self.event.style and self.event.implicit[0]: if (not (self.simple_key_context and (self.analysis.empty or self.analysis.multiline)) and (self.flow_level and self.analysis.allow_flow_plain or (not self.flow_level and self.analysis.allow_block_plain))): return '' if self.event.style and self.event.style in '|>': if (not self.flow_level and not self.simple_key_context and self.analysis.allow_block): return self.event.style if not self.event.style or self.event.style == '\'': if (self.analysis.allow_single_quoted and not (self.simple_key_context and self.analysis.multiline)): return '\'' return '"' def process_scalar(self): if self.analysis is None: self.analysis = self.analyze_scalar(self.event.value) if self.style is None: self.style = self.choose_scalar_style() split = (not self.simple_key_context) #if self.analysis.multiline and split \ # and (not self.style or self.style in '\'\"'): # self.write_indent() if self.style == '"': self.write_double_quoted(self.analysis.scalar, split) elif self.style == '\'': self.write_single_quoted(self.analysis.scalar, split) elif self.style == '>': self.write_folded(self.analysis.scalar) elif self.style == '|': self.write_literal(self.analysis.scalar) else: self.write_plain(self.analysis.scalar, split) self.analysis = None self.style = None # Analyzers. def prepare_version(self, version): major, minor = version if major != 1: raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) return '%d.%d' % (major, minor) def prepare_tag_handle(self, handle): if not handle: raise EmitterError("tag handle must not be empty") if handle[0] != '!' or handle[-1] != '!': raise EmitterError("tag handle must start and end with '!': %r" % handle) for ch in handle[1:-1]: if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-_'): raise EmitterError("invalid character %r in the tag handle: %r" % (ch, handle)) return handle def prepare_tag_prefix(self, prefix): if not prefix: raise EmitterError("tag prefix must not be empty") chunks = [] start = end = 0 if prefix[0] == '!': end = 1 while end < len(prefix): ch = prefix[end] if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-;/?!:@&=+$,_.~*\'()[]': end += 1 else: if start < end: chunks.append(prefix[start:end]) start = end = end+1 data = ch.encode('utf-8') for ch in data: chunks.append('%%%02X' % ord(ch)) if start < end: chunks.append(prefix[start:end]) return ''.join(chunks) def prepare_tag(self, tag): if not tag: raise EmitterError("tag must not be empty") if tag == '!': return tag handle = None suffix = tag prefixes = sorted(self.tag_prefixes.keys()) for prefix in prefixes: if tag.startswith(prefix) \ and (prefix == '!' or len(prefix) < len(tag)): handle = self.tag_prefixes[prefix] suffix = tag[len(prefix):] chunks = [] start = end = 0 while end < len(suffix): ch = suffix[end] if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-;/?:@&=+$,_.~*\'()[]' \ or (ch == '!' and handle != '!'): end += 1 else: if start < end: chunks.append(suffix[start:end]) start = end = end+1 data = ch.encode('utf-8') for ch in data: chunks.append('%%%02X' % ord(ch)) if start < end: chunks.append(suffix[start:end]) suffix_text = ''.join(chunks) if handle: return '%s%s' % (handle, suffix_text) else: return '!<%s>' % suffix_text def prepare_anchor(self, anchor): if not anchor: raise EmitterError("anchor must not be empty") for ch in anchor: if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-_'): raise EmitterError("invalid character %r in the anchor: %r" % (ch, anchor)) return anchor def analyze_scalar(self, scalar): # Empty scalar is a special case. if not scalar: return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, allow_flow_plain=False, allow_block_plain=True, allow_single_quoted=True, allow_double_quoted=True, allow_block=False) # Indicators and special characters. block_indicators = False flow_indicators = False line_breaks = False special_characters = False # Important whitespace combinations. leading_space = False leading_break = False trailing_space = False trailing_break = False break_space = False space_break = False # Check document indicators. if scalar.startswith('---') or scalar.startswith('...'): block_indicators = True flow_indicators = True # First character or preceded by a whitespace. preceeded_by_whitespace = True # Last character or followed by a whitespace. followed_by_whitespace = (len(scalar) == 1 or scalar[1] in '\0 \t\r\n\x85\u2028\u2029') # The previous character is a space. previous_space = False # The previous character is a break. previous_break = False index = 0 while index < len(scalar): ch = scalar[index] # Check for indicators. if index == 0: # Leading indicators are special characters. if ch in '#,[]{}&*!|>\'\"%@`': flow_indicators = True block_indicators = True if ch in '?:': flow_indicators = True if followed_by_whitespace: block_indicators = True if ch == '-' and followed_by_whitespace: flow_indicators = True block_indicators = True else: # Some indicators cannot appear within a scalar as well. if ch in ',?[]{}': flow_indicators = True if ch == ':': flow_indicators = True if followed_by_whitespace: block_indicators = True if ch == '#' and preceeded_by_whitespace: flow_indicators = True block_indicators = True # Check for line breaks, special, and unicode characters. if ch in '\n\x85\u2028\u2029': line_breaks = True if not (ch == '\n' or '\x20' <= ch <= '\x7E'): if (ch == '\x85' or '\xA0' <= ch <= '\uD7FF' or '\uE000' <= ch <= '\uFFFD') and ch != '\uFEFF': unicode_characters = True if not self.allow_unicode: special_characters = True else: special_characters = True # Detect important whitespace combinations. if ch == ' ': if index == 0: leading_space = True if index == len(scalar)-1: trailing_space = True if previous_break: break_space = True previous_space = True previous_break = False elif ch in '\n\x85\u2028\u2029': if index == 0: leading_break = True if index == len(scalar)-1: trailing_break = True if previous_space: space_break = True previous_space = False previous_break = True else: previous_space = False previous_break = False # Prepare for the next character. index += 1 preceeded_by_whitespace = (ch in '\0 \t\r\n\x85\u2028\u2029') followed_by_whitespace = (index+1 >= len(scalar) or scalar[index+1] in '\0 \t\r\n\x85\u2028\u2029') # Let's decide what styles are allowed. allow_flow_plain = True allow_block_plain = True allow_single_quoted = True allow_double_quoted = True allow_block = True # Leading and trailing whitespaces are bad for plain scalars. if (leading_space or leading_break or trailing_space or trailing_break): allow_flow_plain = allow_block_plain = False # We do not permit trailing spaces for block scalars. if trailing_space: allow_block = False # Spaces at the beginning of a new line are only acceptable for block # scalars. if break_space: allow_flow_plain = allow_block_plain = allow_single_quoted = False # Spaces followed by breaks, as well as special character are only # allowed for double quoted scalars. if space_break or special_characters: allow_flow_plain = allow_block_plain = \ allow_single_quoted = allow_block = False # Although the plain scalar writer supports breaks, we never emit # multiline plain scalars. if line_breaks: allow_flow_plain = allow_block_plain = False # Flow indicators are forbidden for flow plain scalars. if flow_indicators: allow_flow_plain = False # Block indicators are forbidden for block plain scalars. if block_indicators: allow_block_plain = False return ScalarAnalysis(scalar=scalar, empty=False, multiline=line_breaks, allow_flow_plain=allow_flow_plain, allow_block_plain=allow_block_plain, allow_single_quoted=allow_single_quoted, allow_double_quoted=allow_double_quoted, allow_block=allow_block) # Writers. def flush_stream(self): if hasattr(self.stream, 'flush'): self.stream.flush() def write_stream_start(self): # Write BOM if needed. if self.encoding and self.encoding.startswith('utf-16'): self.stream.write('\uFEFF'.encode(self.encoding)) def write_stream_end(self): self.flush_stream() def write_indicator(self, indicator, need_whitespace, whitespace=False, indention=False): if self.whitespace or not need_whitespace: data = indicator else: data = ' '+indicator self.whitespace = whitespace self.indention = self.indention and indention self.column += len(data) self.open_ended = False if self.encoding: data = data.encode(self.encoding) self.stream.write(data) def write_indent(self): indent = self.indent or 0 if not self.indention or self.column > indent \ or (self.column == indent and not self.whitespace): self.write_line_break() if self.column < indent: self.whitespace = True data = ' '*(indent-self.column) self.column = indent if self.encoding: data = data.encode(self.encoding) self.stream.write(data) def write_line_break(self, data=None): if data is None: data = self.best_line_break self.whitespace = True self.indention = True self.line += 1 self.column = 0 if self.encoding: data = data.encode(self.encoding) self.stream.write(data) def write_version_directive(self, version_text): data = '%%YAML %s' % version_text if self.encoding: data = data.encode(self.encoding) self.stream.write(data) self.write_line_break() def write_tag_directive(self, handle_text, prefix_text): data = '%%TAG %s %s' % (handle_text, prefix_text) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) self.write_line_break() # Scalar streams. def write_single_quoted(self, text, split=True): self.write_indicator('\'', True) spaces = False breaks = False start = end = 0 while end <= len(text): ch = None if end < len(text): ch = text[end] if spaces: if ch is None or ch != ' ': if start+1 == end and self.column > self.best_width and split \ and start != 0 and end != len(text): self.write_indent() else: data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end elif breaks: if ch is None or ch not in '\n\x85\u2028\u2029': if text[start] == '\n': self.write_line_break() for br in text[start:end]: if br == '\n': self.write_line_break() else: self.write_line_break(br) self.write_indent() start = end else: if ch is None or ch in ' \n\x85\u2028\u2029' or ch == '\'': if start < end: data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end if ch == '\'': data = '\'\'' self.column += 2 if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end + 1 if ch is not None: spaces = (ch == ' ') breaks = (ch in '\n\x85\u2028\u2029') end += 1 self.write_indicator('\'', False) ESCAPE_REPLACEMENTS = { '\0': '0', '\x07': 'a', '\x08': 'b', '\x09': 't', '\x0A': 'n', '\x0B': 'v', '\x0C': 'f', '\x0D': 'r', '\x1B': 'e', '\"': '\"', '\\': '\\', '\x85': 'N', '\xA0': '_', '\u2028': 'L', '\u2029': 'P', } def write_double_quoted(self, text, split=True): self.write_indicator('"', True) start = end = 0 while end <= len(text): ch = None if end < len(text): ch = text[end] if ch is None or ch in '"\\\x85\u2028\u2029\uFEFF' \ or not ('\x20' <= ch <= '\x7E' or (self.allow_unicode and ('\xA0' <= ch <= '\uD7FF' or '\uE000' <= ch <= '\uFFFD'))): if start < end: data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end if ch is not None: if ch in self.ESCAPE_REPLACEMENTS: data = '\\'+self.ESCAPE_REPLACEMENTS[ch] elif ch <= '\xFF': data = '\\x%02X' % ord(ch) elif ch <= '\uFFFF': data = '\\u%04X' % ord(ch) else: data = '\\U%08X' % ord(ch) self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end+1 if 0 < end < len(text)-1 and (ch == ' ' or start >= end) \ and self.column+(end-start) > self.best_width and split: data = text[start:end]+'\\' if start < end: start = end self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) self.write_indent() self.whitespace = False self.indention = False if text[start] == ' ': data = '\\' self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) end += 1 self.write_indicator('"', False) def determine_block_hints(self, text): hints = '' if text: if text[0] in ' \n\x85\u2028\u2029': hints += str(self.best_indent) if text[-1] not in '\n\x85\u2028\u2029': hints += '-' elif len(text) == 1 or text[-2] in '\n\x85\u2028\u2029': hints += '+' return hints def write_folded(self, text): hints = self.determine_block_hints(text) self.write_indicator('>'+hints, True) if hints[-1:] == '+': self.open_ended = True self.write_line_break() leading_space = True spaces = False breaks = True start = end = 0 while end <= len(text): ch = None if end < len(text): ch = text[end] if breaks: if ch is None or ch not in '\n\x85\u2028\u2029': if not leading_space and ch is not None and ch != ' ' \ and text[start] == '\n': self.write_line_break() leading_space = (ch == ' ') for br in text[start:end]: if br == '\n': self.write_line_break() else: self.write_line_break(br) if ch is not None: self.write_indent() start = end elif spaces: if ch != ' ': if start+1 == end and self.column > self.best_width: self.write_indent() else: data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end else: if ch is None or ch in ' \n\x85\u2028\u2029': data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) if ch is None: self.write_line_break() start = end if ch is not None: breaks = (ch in '\n\x85\u2028\u2029') spaces = (ch == ' ') end += 1 def write_literal(self, text): hints = self.determine_block_hints(text) self.write_indicator('|'+hints, True) if hints[-1:] == '+': self.open_ended = True self.write_line_break() breaks = True start = end = 0 while end <= len(text): ch = None if end < len(text): ch = text[end] if breaks: if ch is None or ch not in '\n\x85\u2028\u2029': for br in text[start:end]: if br == '\n': self.write_line_break() else: self.write_line_break(br) if ch is not None: self.write_indent() start = end else: if ch is None or ch in '\n\x85\u2028\u2029': data = text[start:end] if self.encoding: data = data.encode(self.encoding) self.stream.write(data) if ch is None: self.write_line_break() start = end if ch is not None: breaks = (ch in '\n\x85\u2028\u2029') end += 1 def write_plain(self, text, split=True): if self.root_context: self.open_ended = True if not text: return if not self.whitespace: data = ' ' self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) self.whitespace = False self.indention = False spaces = False breaks = False start = end = 0 while end <= len(text): ch = None if end < len(text): ch = text[end] if spaces: if ch != ' ': if start+1 == end and self.column > self.best_width and split: self.write_indent() self.whitespace = False self.indention = False else: data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end elif breaks: if ch not in '\n\x85\u2028\u2029': if text[start] == '\n': self.write_line_break() for br in text[start:end]: if br == '\n': self.write_line_break() else: self.write_line_break(br) self.write_indent() self.whitespace = False self.indention = False start = end else: if ch is None or ch in ' \n\x85\u2028\u2029': data = text[start:end] self.column += len(data) if self.encoding: data = data.encode(self.encoding) self.stream.write(data) start = end if ch is not None: spaces = (ch == ' ') breaks = (ch in '\n\x85\u2028\u2029') end += 1 PK!kC cyaml.pynu[ __all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', 'CBaseDumper', 'CSafeDumper', 'CDumper'] from _yaml import CParser, CEmitter from .constructor import * from .serializer import * from .representer import * from .resolver import * class CBaseLoader(CParser, BaseConstructor, BaseResolver): def __init__(self, stream): CParser.__init__(self, stream) BaseConstructor.__init__(self) BaseResolver.__init__(self) class CSafeLoader(CParser, SafeConstructor, Resolver): def __init__(self, stream): CParser.__init__(self, stream) SafeConstructor.__init__(self) Resolver.__init__(self) class CLoader(CParser, Constructor, Resolver): def __init__(self, stream): CParser.__init__(self, stream) Constructor.__init__(self) Resolver.__init__(self) class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): def __init__(self, stream, default_style=None, default_flow_style=None, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): CEmitter.__init__(self, stream, canonical=canonical, indent=indent, width=width, encoding=encoding, allow_unicode=allow_unicode, line_break=line_break, explicit_start=explicit_start, explicit_end=explicit_end, version=version, tags=tags) Representer.__init__(self, default_style=default_style, default_flow_style=default_flow_style) Resolver.__init__(self) class CSafeDumper(CEmitter, SafeRepresenter, Resolver): def __init__(self, stream, default_style=None, default_flow_style=None, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): CEmitter.__init__(self, stream, canonical=canonical, indent=indent, width=width, encoding=encoding, allow_unicode=allow_unicode, line_break=line_break, explicit_start=explicit_start, explicit_end=explicit_end, version=version, tags=tags) SafeRepresenter.__init__(self, default_style=default_style, default_flow_style=default_flow_style) Resolver.__init__(self) class CDumper(CEmitter, Serializer, Representer, Resolver): def __init__(self, stream, default_style=None, default_flow_style=None, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): CEmitter.__init__(self, stream, canonical=canonical, indent=indent, width=width, encoding=encoding, allow_unicode=allow_unicode, line_break=line_break, explicit_start=explicit_start, explicit_end=explicit_end, version=version, tags=tags) Representer.__init__(self, default_style=default_style, default_flow_style=default_flow_style) Resolver.__init__(self) PK!A tokens.pynu[ class Token(object): def __init__(self, start_mark, end_mark): self.start_mark = start_mark self.end_mark = end_mark def __repr__(self): attributes = [key for key in self.__dict__ if not key.endswith('_mark')] attributes.sort() arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) for key in attributes]) return '%s(%s)' % (self.__class__.__name__, arguments) #class BOMToken(Token): # id = '' class DirectiveToken(Token): id = '' def __init__(self, name, value, start_mark, end_mark): self.name = name self.value = value self.start_mark = start_mark self.end_mark = end_mark class DocumentStartToken(Token): id = '' class DocumentEndToken(Token): id = '' class StreamStartToken(Token): id = '' def __init__(self, start_mark=None, end_mark=None, encoding=None): self.start_mark = start_mark self.end_mark = end_mark self.encoding = encoding class StreamEndToken(Token): id = '' class BlockSequenceStartToken(Token): id = '' class BlockMappingStartToken(Token): id = '' class BlockEndToken(Token): id = '' class FlowSequenceStartToken(Token): id = '[' class FlowMappingStartToken(Token): id = '{' class FlowSequenceEndToken(Token): id = ']' class FlowMappingEndToken(Token): id = '}' class KeyToken(Token): id = '?' class ValueToken(Token): id = ':' class BlockEntryToken(Token): id = '-' class FlowEntryToken(Token): id = ',' class AliasToken(Token): id = '' def __init__(self, value, start_mark, end_mark): self.value = value self.start_mark = start_mark self.end_mark = end_mark class AnchorToken(Token): id = '' def __init__(self, value, start_mark, end_mark): self.value = value self.start_mark = start_mark self.end_mark = end_mark class TagToken(Token): id = '' def __init__(self, value, start_mark, end_mark): self.value = value self.start_mark = start_mark self.end_mark = end_mark class ScalarToken(Token): id = '' def __init__(self, value, plain, start_mark, end_mark, style=None): self.value = value self.plain = plain self.start_mark = start_mark self.end_mark = end_mark self.style = style PK!ߣ dumper.pynu[ __all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] from .emitter import * from .serializer import * from .representer import * from .resolver import * class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): def __init__(self, stream, default_style=None, default_flow_style=None, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): Emitter.__init__(self, stream, canonical=canonical, indent=indent, width=width, allow_unicode=allow_unicode, line_break=line_break) Serializer.__init__(self, encoding=encoding, explicit_start=explicit_start, explicit_end=explicit_end, version=version, tags=tags) Representer.__init__(self, default_style=default_style, default_flow_style=default_flow_style) Resolver.__init__(self) class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): def __init__(self, stream, default_style=None, default_flow_style=None, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): Emitter.__init__(self, stream, canonical=canonical, indent=indent, width=width, allow_unicode=allow_unicode, line_break=line_break) Serializer.__init__(self, encoding=encoding, explicit_start=explicit_start, explicit_end=explicit_end, version=version, tags=tags) SafeRepresenter.__init__(self, default_style=default_style, default_flow_style=default_flow_style) Resolver.__init__(self) class Dumper(Emitter, Serializer, Representer, Resolver): def __init__(self, stream, default_style=None, default_flow_style=None, canonical=None, indent=None, width=None, allow_unicode=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): Emitter.__init__(self, stream, canonical=canonical, indent=indent, width=width, allow_unicode=allow_unicode, line_break=line_break) Serializer.__init__(self, encoding=encoding, explicit_start=explicit_start, explicit_end=explicit_end, version=version, tags=tags) Representer.__init__(self, default_style=default_style, default_flow_style=default_flow_style) Resolver.__init__(self) PK!!q )__pycache__/composer.cpython-36.opt-1.pycnu[3 s  PK!v-22'__pycache__/tokens.cpython-36.opt-1.pycnu[3 sz"Token.__repr__..z, csg|]}d|t|fqS)z%s=%r)getattr)r r )rrrr sz%s(%s))__dict__sortjoin __class____name__)rZ attributesZ argumentsr)rr__repr__s  zToken.__repr__N)r __module__ __qualname__rrrrrrrsrc@seZdZdZddZdS)DirectiveTokenz cCs||_||_||_||_dS)N)namevaluerr)rrrrrrrrrszDirectiveToken.__init__N)rrridrrrrrrsrc@seZdZdZdS)DocumentStartTokenzN)rrrrrrrrrsrc@seZdZdZdS)DocumentEndTokenzN)rrrrrrrrrsrc@seZdZdZdddZdS)StreamStartTokenzNcCs||_||_||_dS)N)rrencoding)rrrrrrrr!szStreamStartToken.__init__)NNN)rrrrrrrrrrsrc@seZdZdZdS)StreamEndTokenz N)rrrrrrrrr'src@seZdZdZdS)BlockSequenceStartTokenzN)rrrrrrrrr*src@seZdZdZdS)BlockMappingStartTokenzN)rrrrrrrrr-src@seZdZdZdS) BlockEndTokenz N)rrrrrrrrr 0sr c@seZdZdZdS)FlowSequenceStartToken[N)rrrrrrrrr!3sr!c@seZdZdZdS)FlowMappingStartToken{N)rrrrrrrrr#6sr#c@seZdZdZdS)FlowSequenceEndToken]N)rrrrrrrrr%9sr%c@seZdZdZdS)FlowMappingEndToken}N)rrrrrrrrr'<sr'c@seZdZdZdS)KeyToken?N)rrrrrrrrr)?sr)c@seZdZdZdS) ValueToken:N)rrrrrrrrr+Bsr+c@seZdZdZdS)BlockEntryToken-N)rrrrrrrrr-Esr-c@seZdZdZdS)FlowEntryToken,N)rrrrrrrrr/Hsr/c@seZdZdZddZdS) AliasTokenzcCs||_||_||_dS)N)rrr)rrrrrrrrMszAliasToken.__init__N)rrrrrrrrrr1Ksr1c@seZdZdZddZdS) AnchorTokenzcCs||_||_||_dS)N)rrr)rrrrrrrrTszAnchorToken.__init__N)rrrrrrrrrr2Rsr2c@seZdZdZddZdS)TagTokenzcCs||_||_||_dS)N)rrr)rrrrrrrr[szTagToken.__init__N)rrrrrrrrrr3Ysr3c@seZdZdZdddZdS) ScalarTokenzNcCs"||_||_||_||_||_dS)N)rplainrrstyle)rrr5rrr6rrrrbs zScalarToken.__init__)N)rrrrrrrrrr4`sr4N)objectrrrrrrrrr r!r#r%r'r)r+r-r/r1r2r3r4rrrrs(PK!k8&__pycache__/error.cpython-36.opt-1.pycnu[3 s )PK!M..'__pycache__/parser.cpython-36.opt-1.pycnu[3 Z d?d@Z!dAdBZ"dCS)Gr!ztag:yaml.org,2002:)r z!!cCs*d|_d|_i|_g|_g|_|j|_dS)N) current_event yaml_version tag_handlesstatesmarksparse_stream_startstate)selfr r r __init__Qs zParser.__init__cCsg|_d|_dS)N)rr)rr r r disposeYszParser.disposecGsN|jdkr|jr|j|_|jdk rJ|s,dSx|D]}t|j|r2dSq2WdS)NTF)r r isinstance)rchoicesZchoicer r r check_event^s     zParser.check_eventcCs |jdkr|jr|j|_|jS)N)r r)rr r r peek_eventks  zParser.peek_eventcCs*|jdkr|jr|j|_|j}d|_|S)N)r r)rvaluer r r get_eventrs   zParser.get_eventcCs(|j}t|j|j|jd}|j|_|S)N)encoding) get_tokenZStreamStartEvent start_markend_markrparse_implicit_document_startr)rtokeneventr r r rs   zParser.parse_stream_startcCs\|jtttsP|j|_|j}|j}}t||dd}|j j |j |j |_ |S|jSdS)NF)explicit) check_tokenDirectiveTokenDocumentStartTokenStreamEndToken DEFAULT_TAGSr peek_tokenrDocumentStartEventrappendparse_document_endparse_block_noderparse_document_start)rr!rrr"r r r r s z$Parser.parse_implicit_document_startcCsx|jtr|jqW|jts|j}|j}|j\}}|jtsdtddd|jj |jj|j}|j }t ||d||d}|j j |j|j|_n|j}t|j|j }d|_|S)Nz)expected '', but found %rT)r#versiontags)r$DocumentEndTokenrr'r)rprocess_directivesr&ridrr*rr+r,parse_document_contentrZStreamEndEvent)rr!rr/r0rr"r r r r.s*         zParser.parse_document_startcCsL|j}|j}}d}|jtr2|j}|j}d}t|||d}|j|_|S)NFT)r#) r)rr$r1rrZDocumentEndEventr.r)rr!rrr#r"r r r r,s  zParser.parse_document_endcCs<|jttttr0|j|jj}|jj |_ |S|j SdS)N) r$r%r&r1r'process_empty_scalarr)rrpoprr-)rr"r r r r4s   zParser.parse_document_contentcCsd|_i|_x|jtr|j}|jdkrp|jdk rDtddd|j|j\}}|dkrftddd|j|j|_q|jdkr|j\}}||jkrtddd||j||j|<qW|jr|j|jj f}n |jdf}x(|j D]}||jkr|j ||j|<qW|S)NZYAMLzfound duplicate YAML directiverz:found incompatible YAML document (version 1.* is required)ZTAGzduplicate tag handle %r) r rr$r%rnamerrrcopyr()rr!majorminorhandleprefixrkeyr r r r2s8            zParser.process_directivescCs |jddS)NT)block) parse_node)rr r r r-szParser.parse_block_nodecCs|jS)N)r?)rr r r parse_flow_node szParser.parse_flow_nodecCs|jdddS)NT)r>indentless_sequence)r?)rr r r 'parse_block_node_or_indentless_sequencesz.Parser.parse_block_node_or_indentless_sequenceFc CsR|jtr4|j}t|j|j|j}|jj|_ nd}d}d}}} |jt r|j}|j}|j}|j}|jt r|j}|j} |j}|j}nF|jt r|j}|j}} |j}|j}|jt r|j}|j}|j}|dk r&|\} } | dk r"| |j krt d|d| | |j | | }n| }|dkr>|jj}}d}|dkpR|dk} |r|jtr|jj}t||| ||}|j|_ n|jtr|j}|j}|jr|dks|dkrd } n|dkrd} nd} t||| |j|||jd}|jj|_ nH|jtr<|jj}t||| ||dd}|j|_ n|jtrp|jj}t||| ||dd}|j|_ n|r|jtr|jj}t||| ||dd}|j|_ n|r|jtr|jj}t||| ||dd}|j|_ nj|dk s|dk rt||| dfd||}|jj|_ n2|r(d } nd } |j}t d | |d |j|j|S)Nzwhile parsing a nodezfound undefined tag handle %rr TF)style) flow_styler>Zflowzwhile parsing a %s nodez'expected the node content, but found %r)TF)FT)FF) r$Z AliasTokenrZ AliasEventrrrrr6rZ AnchorTokenZTagTokenrrr)BlockEntryTokenZSequenceStartEventparse_indentless_sequence_entryZ ScalarTokenZplain ScalarEventrCZFlowSequenceStartTokenparse_flow_sequence_first_entryZFlowMappingStartTokenMappingStartEventparse_flow_mapping_first_keyZBlockSequenceStartToken parse_block_sequence_first_entryZBlockMappingStartTokenparse_block_mapping_first_keyr3)rr>rAr!r"ZanchortagrrZtag_markr;suffixZimplicitZnoder r r r?s                               zParser.parse_nodecCs|j}|jj|j|jS)N)rrr+rparse_block_sequence_entry)rr!r r r rLxsz'Parser.parse_block_sequence_first_entrycCs|jtrH|j}|jtts4|jj|j|jS|j|_|j |j S|jtsv|j }t d|j dd|j|j|j}t|j|j }|jj|_|j j|S)Nz while parsing a block collectionrz"expected , but found %r)r$rFr BlockEndTokenrr+rPr-rr5rr)rrr3rSequenceEndEventr6)rr!r"r r r rP}s        z!Parser.parse_block_sequence_entrycCsr|jtrL|j}|jtttts8|jj|j|j S|j|_ |j |j S|j }t|j|j}|jj|_ |S)N)r$rFrKeyToken ValueTokenrRrr+rGr-rr5rr)rSrr6)rr!r"r r r rGs    z&Parser.parse_indentless_sequence_entrycCs|j}|jj|j|jS)N)rrr+rparse_block_mapping_key)rr!r r r rMsz$Parser.parse_block_mapping_first_keycCs|jtrJ|j}|jttts6|jj|j|jS|j|_ |j |j S|jtsx|j }t d|jdd|j|j|j}t|j|j }|jj|_ |jj|S)Nzwhile parsing a block mappingrz"expected , but found %rrQ)r$rTrrUrRrr+parse_block_mapping_valuerBrr5rr)rrr3rMappingEndEventr6)rr!r"r r r rVs       zParser.parse_block_mapping_keycCsl|jtrL|j}|jttts6|jj|j|jS|j|_ |j |j Sn|j|_ |j }|j |j SdS)N)r$rUrrTrRrr+rVrBrr5rr)r)rr!r r r rWs z Parser.parse_block_mapping_valuecCs"|j}|jj|j|jddS)NT)first)rrr+rparse_flow_sequence_entry)rr!r r r rIsz&Parser.parse_flow_sequence_first_entrycCs|jts|sF|jtr"|jn$|j}td|jdd|j|j|jt r||j}t ddd|j|j dd}|j |_ |S|jts|jj|j|jS|j}t|j|j }|jj|_ |jj|S)Nzwhile parsing a flow sequencerzexpected ',' or ']', but got %rT)rDrQ)r$FlowSequenceEndTokenFlowEntryTokenrr)rrr3rrTrJr%parse_flow_sequence_entry_mapping_keyrrr+rZr@rSr6)rrYr!r"r r r rZs,        z Parser.parse_flow_sequence_entrycCsD|j}|jttts,|jj|j|jS|j|_ |j |j SdS)N) rr$rUr\r[rr+'parse_flow_sequence_entry_mapping_valuer@rr5r)rr!r r r r]sz,Parser.parse_flow_sequence_entry_mapping_keycCsj|jtrJ|j}|jtts4|jj|j|jS|j|_ |j |j Sn|j|_ |j }|j |j SdS)N)r$rUrr\r[rr+%parse_flow_sequence_entry_mapping_endr@rr5rr)r)rr!r r r r^s  z.Parser.parse_flow_sequence_entry_mapping_valuecCs|j|_|j}t|j|jS)N)rZrr)rXr)rr!r r r r_sz,Parser.parse_flow_sequence_entry_mapping_endcCs"|j}|jj|j|jddS)NT)rY)rrr+rparse_flow_mapping_key)rr!r r r rKsz#Parser.parse_flow_mapping_first_keycCs|jts|sF|jtr"|jn$|j}td|jdd|j|j|jt r|j}|jt tts||j j |j |jS|j |_|j|jSn |jts|j j |j|jS|j}t|j|j}|j j|_|jj|S)Nzwhile parsing a flow mappingrzexpected ',' or '}', but got %rrQ)r$FlowMappingEndTokenr\rr)rrr3rrTrUrr+parse_flow_mapping_valuer@rr5rparse_flow_mapping_empty_valuerXr6)rrYr!r"r r r r`s.        zParser.parse_flow_mapping_keycCsj|jtrJ|j}|jtts4|jj|j|jS|j|_ |j |j Sn|j|_ |j }|j |j SdS)N)r$rUrr\rarr+r`r@rr5rr)r)rr!r r r rb9s  zParser.parse_flow_mapping_valuecCs|j|_|j|jjS)N)r`rr5r)r)rr r r rcGsz%Parser.parse_flow_mapping_empty_valuecCstdddd||S)NTFrE)TF)rH)rZmarkr r r r5KszParser.process_empty_scalarN)FF)F)F)#rrrr(rrrrrrr r.r,r4r2r-r@rBr?rLrPrGrMrVrWrIrZr]r^r_rKr`rbrcr5r r r r rHsB    / g    N)__all__errorrtokensZeventsscannerrrr r r r >s  PK!7$!__pycache__/dumper.cpython-36.pycnu[3 s PK!i('__pycache__/events.cpython-36.opt-1.pycnu[3 sz"Event.__repr__..anchortagimplicitvaluez, csg|]}d|t|fqS)z%s=%r)getattr)r r )rrrr sz%s(%s))r r rr)join __class____name__)rZ attributesZ argumentsr)rr__repr__s zEvent.__repr__)NN)r __module__ __qualname__rrrrrrrs rc@seZdZdddZdS) NodeEventNcCs||_||_||_dS)N)r rr)rr rrrrrrszNodeEvent.__init__)NN)rrrrrrrrrsrc@seZdZdddZdS)CollectionStartEventNcCs(||_||_||_||_||_||_dS)N)r r rrr flow_style)rr r rrrrrrrrs zCollectionStartEvent.__init__)NNN)rrrrrrrrrsrc@s eZdZdS)CollectionEndEventN)rrrrrrrrsrc@seZdZdddZdS)StreamStartEventNcCs||_||_||_dS)N)rrencoding)rrrrrrrr%szStreamStartEvent.__init__)NNN)rrrrrrrrr$src@s eZdZdS)StreamEndEventN)rrrrrrrr*src@seZdZdddZdS)DocumentStartEventNcCs"||_||_||_||_||_dS)N)rrexplicitversiontags)rrrrr r!rrrr.s zDocumentStartEvent.__init__)NNNNN)rrrrrrrrr-src@seZdZdddZdS)DocumentEndEventNcCs||_||_||_dS)N)rrr)rrrrrrrr7szDocumentEndEvent.__init__)NNN)rrrrrrrrr"6sr"c@s eZdZdS) AliasEventN)rrrrrrrr#=sr#c@seZdZdddZdS) ScalarEventNcCs.||_||_||_||_||_||_||_dS)N)r r rrrrstyle)rr r rrrrr%rrrrAszScalarEvent.__init__)NNN)rrrrrrrrr$@sr$c@s eZdZdS)SequenceStartEventN)rrrrrrrr&Ksr&c@s eZdZdS)SequenceEndEventN)rrrrrrrr'Nsr'c@s eZdZdS)MappingStartEventN)rrrrrrrr(Qsr(c@s eZdZdS)MappingEndEventN)rrrrrrrr)Tsr)N)objectrrrrrrrr"r#r$r&r'r(r)rrrrs    PK!0%**)__pycache__/resolver.cpython-36.opt-1.pycnu[3 rrr classmethodrr-r4r6r/r?r r r r r s  5c@s eZdZdS)rN)rrr r r r r rsztag:yaml.org,2002:boolzz^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF)$Z yYnNtTfFoOztag:yaml.org,2002:floatz^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? |\.[0-9_]+(?:[eE][-+][0-9]+)? |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* |[-+]?\.(?:inf|Inf|INF) |\.(?:nan|NaN|NAN))$z -+0123456789.ztag:yaml.org,2002:intz^(?:[-+]?0b[0-1_]+ |[-+]?0[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+ |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$z -+0123456789ztag:yaml.org,2002:mergez^(?:<<)$sX    PK!0%**#__pycache__/resolver.cpython-36.pycnu[3 rrr classmethodrr-r4r6r/r?r r r r r s  5c@s eZdZdS)rN)rrr r r r r rsztag:yaml.org,2002:boolzz^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF)$Z yYnNtTfFoOztag:yaml.org,2002:floatz^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? |\.[0-9_]+(?:[eE][-+][0-9]+)? |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* |[-+]?\.(?:inf|Inf|INF) |\.(?:nan|NaN|NAN))$z -+0123456789.ztag:yaml.org,2002:intz^(?:[-+]?0b[0-1_]+ |[-+]?0[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+ |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$z -+0123456789ztag:yaml.org,2002:mergez^(?:<<)$sX    PK!abb"__pycache__/emitter.cpython-36.pycnu[3 d?Z d@dAZ!dBdCZ"dDdEZ#dFdGZ$dHdIZ%dJdKZ&dLdMZ'dNdOZ(dPdQZ)dRdSZ*dTdUZ+dVdWZ,dXdYZ-dZd[Z.d\d]Z/d^d_Z0d`daZ1dbdcZ2dddeZ3ddfdgZ4dhdiZ5ddjdkZ6dldmZ7dndoZ8ddqdrZ9dsdtdudvdwdxdydzd{d|d}d~ddddZ:dddZ;ddZdddZ?dS)r!z!!)rztag:yaml.org,2002:NcCs||_d|_g|_|j|_g|_d|_g|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_||_||_d|_|rd|kodknr||_d|_|r||jdkr||_d|_|d kr||_d|_d|_d|_d|_d|_dS) NFTr P   )rrr)streamencodingstatesexpect_stream_startstateeventseventindentsindent flow_level root_contextsequence_contextmapping_contextsimple_key_contextlinecolumn whitespace indention open_ended canonical allow_unicode best_indent best_widthbest_line_break tag_prefixesprepared_anchor prepared_taganalysisstyle)rrr1r&widthr2Z line_breakr r r r&sDzEmitter.__init__cCsg|_d|_dS)N)r r")rr r r disposejszEmitter.disposecCs:|jj|x(|js4|jjd|_|jd|_qWdS)Nr)r#appendneed_more_eventspopr$r")rr$r r r emitos   z Emitter.emitcCsX|js dS|jd}t|tr(|jdSt|tr<|jdSt|trP|jdSdSdS)NTrrrF)r# isinstanceDocumentStartEvent need_eventsSequenceStartEventMappingStartEvent)rr$r r r r>xs       zEmitter.need_more_eventscCsxd}x`|jddD]N}t|ttfr0|d7}n&t|ttfrH|d8}nt|trVd}|dkrdSqWt|j|dkS)NrrF)r#rBrCCollectionStartEventDocumentEndEventZCollectionEndEventStreamEndEventlen)rcountlevelr$r r r rDs   zEmitter.need_eventsFcCsF|jj|j|jdkr.|r&|j|_qBd|_n|sB|j|j7_dS)Nr)r%r=r&r3)rflow indentlessr r r increase_indents  zEmitter.increase_indentcCsPt|jtr>|jjr,t|jd r,|jj|_|j|j|_nt d|jdS)Nrz%expected StreamStartEvent, but got %s) rBr$ZStreamStartEventrhasattrrwrite_stream_startexpect_first_document_startr"r)rr r r r!s   zEmitter.expect_stream_startcCstd|jdS)Nzexpected nothing, but got %s)rr$)rr r r expect_nothingszEmitter.expect_nothingcCs |jddS)NT)first)expect_document_start)rr r r rSsz#Emitter.expect_first_document_startc Csvt|jtr(|jjs|jjr8|jr8|jdd|j|jjrX|j|jj}|j ||j j |_ |jjrt |jjj}xB|D]:}|jj|}||j |<|j|}|j|}|j||qW|o|jj o|j o|jj o|jj o|j }|s|j|jdd|jr|j|j|_nJt|jtrd|jrR|jdd|j|j|j|_ntd|jdS)Nz...Tz---z'expected DocumentStartEvent, but got %s)rBr$rCversionZtagsr0write_indicator write_indentprepare_versionwrite_version_directiveDEFAULT_TAG_PREFIXEScopyr6sortedkeysprepare_tag_handleprepare_tag_prefixwrite_tag_directiveexplicitr1check_empty_documentexpect_document_rootr"rJwrite_stream_endrTr) rrU version_textZhandleshandleprefix handle_text prefix_textimplicitr r r rVsB             zEmitter.expect_document_startcCsTt|jtrB|j|jjr0|jdd|j|j|j|_nt d|jdS)Nz...Tz%expected DocumentEndEvent, but got %s) rBr$rIrYrcrX flush_streamrVr"r)rr r r expect_document_ends   zEmitter.expect_document_endcCs|jj|j|jdddS)NT)root)r r=rn expect_node)rr r r reszEmitter.expect_document_rootcCs||_||_||_||_t|jtr.|jnt|jtt fr|j d|j t|jtrf|j qt|jt r|js|js|jjs|jr|jq|jqt|jtr|js|js|jjs|jr|jq|jntd|jdS)N&zexpected NodeEvent, but got %s)r(r)r*r+rBr$ AliasEvent expect_alias ScalarEventrHprocess_anchor process_tag expect_scalarrEr'r1Z flow_stylecheck_empty_sequenceexpect_flow_sequenceexpect_block_sequencerFcheck_empty_mappingexpect_flow_mappingexpect_block_mappingr)rrosequencemapping simple_keyr r r rps,           zEmitter.expect_nodecCs.|jjdkrtd|jd|jj|_dS)Nz!anchor is not specified for aliasr)r$anchorrrur r?r")rr r r rss  zEmitter.expect_aliascCs0|jdd|j|jj|_|jj|_dS)NT)rN)rPprocess_scalarr%r?r&r r")rr r r rw s  zEmitter.expect_scalarcCs6|jdddd|jd7_|jdd|j|_dS)N[T)r.r)rN)rXr'rPexpect_first_flow_sequence_itemr")rr r r rys zEmitter.expect_flow_sequencecCsxt|jtr@|jj|_|jd8_|jdd|jj|_ n4|j sR|j |j krZ|j |jj|j|jdddS)Nr]FT)r~)rBr$SequenceEndEventr%r?r&r'rXr r"r1r-r4rYr=expect_flow_sequence_itemrp)rr r r rs   z'Emitter.expect_first_flow_sequence_itemcCst|jtrZ|jj|_|jd8_|jr@|jdd|j |jdd|j j|_ n@|jdd|jsx|j |j kr|j |j j|j|jdddS)Nr,FrT)r~)rBr$rr%r?r&r'r1rXrYr r"r-r4r=rrp)rr r r r$s     z!Emitter.expect_flow_sequence_itemcCs6|jdddd|jd7_|jdd|j|_dS)N{T)r.r)rN)rXr'rPexpect_first_flow_mapping_keyr")rr r r r|6s zEmitter.expect_flow_mappingcCst|jtr@|jj|_|jd8_|jdd|jj|_ nn|j sR|j |j krZ|j |j r|jr|jj|j|jdddn&|jdd|jj|j|jdddS)Nr}FT)rr?)r)rBr$MappingEndEventr%r?r&r'rXr r"r1r-r4rYcheck_simple_keyr= expect_flow_mapping_simple_valuerpexpect_flow_mapping_value)rr r r r<s    z%Emitter.expect_first_flow_mapping_keycCst|jtrZ|jj|_|jd8_|jr@|jdd|j |jdd|j j|_ nz|jdd|jsx|j |j kr|j |j r|jr|j j|j|jdddn&|jdd|j j|j|jdddS) NrrFrT)rrr)r)rBr$rr%r?r&r'r1rXrYr r"r-r4rr=rrpr)rr r r expect_flow_mapping_keyMs"      zEmitter.expect_flow_mapping_keycCs*|jdd|jj|j|jdddS)N:FT)r)rXr r=rrp)rr r r rbs z(Emitter.expect_flow_mapping_simple_valuecCsD|js|j|jkr|j|jdd|jj|j|jdddS)NrT)r) r1r-r4rYrXr r=rrp)rr r r rgs  z!Emitter.expect_flow_mapping_valuecCs(|jo |j }|jd|d|j|_dS)NF)rNrO)r*r/rP expect_first_block_sequence_itemr")rrOr r r rzpszEmitter.expect_block_sequencecCs |jddS)NT)rU)expect_block_sequence_item)rr r r rusz(Emitter.expect_first_block_sequence_itemcCsb| r,t|jtr,|jj|_|jj|_n2|j|j dddd|jj |j |j dddS)N-T)r/)r~) rBr$rr%r?r&r r"rYrXr=rrp)rrUr r r rxs z"Emitter.expect_block_sequence_itemcCs|jdd|j|_dS)NF)rN)rPexpect_first_block_mapping_keyr")rr r r r}s zEmitter.expect_block_mappingcCs |jddS)NT)rU)expect_block_mapping_key)rr r r rsz&Emitter.expect_first_block_mapping_keycCs| r,t|jtr,|jj|_|jj|_nX|j|j rZ|jj |j |j dddn*|j dddd|jj |j|j dddS)NT)rrr)r/)r)rBr$rr%r?r&r r"rYrr=!expect_block_mapping_simple_valuerprXexpect_block_mapping_value)rrUr r r rs z Emitter.expect_block_mapping_keycCs*|jdd|jj|j|jdddS)NrFT)r)rXr r=rrp)rr r r rs z)Emitter.expect_block_mapping_simple_valuecCs6|j|jdddd|jj|j|jdddS)NrT)r/)r)rYrXr r=rrp)rr r r rsz"Emitter.expect_block_mapping_valuecCs"t|jto |jo t|jdtS)Nr)rBr$rEr#r)rr r r rxszEmitter.check_empty_sequencecCs"t|jto |jo t|jdtS)Nr)rBr$rFr#r)rr r r r{szEmitter.check_empty_mappingcCsRt|jt s|j rdS|jd}t|toP|jdkoP|jdkoP|joP|jdkS)NFr) rBr$rCr#rtrtagrlvalue)rr$r r r rds  zEmitter.check_empty_documentcCs d}t|jtrD|jjdk rD|jdkr6|j|jj|_|t|j7}t|jttfr|jj dk r|j dkrz|j |jj |_ |t|j 7}t|jtr|j dkr|j |jj|_ |t|j j7}|dkot|jtpt|jtr|j j r|j j p|jp|jS)Nr)rBr$Z NodeEventrr7prepare_anchorrKrtrHrr8 prepare_tagr9analyze_scalarrr rrr rrxr{)rZlengthr r r rs$      zEmitter.check_simple_keycCsR|jjdkrd|_dS|jdkr0|j|jj|_|jrH|j||jdd|_dS)NT)r$rr7rrX)r indicatorr r r rus  zEmitter.process_anchorcCs|jj}t|jtr|jdkr(|j|_|j s8|dkrn|jdkrN|jjdsd|jdkrn|jjdrnd|_dS|jjdr|dkrd}d|_n"|j s|dkr|jjrd|_dS|dkrt d|jdkr|j ||_|jr|j |jdd|_dS)Nrrrrztag is not specifiedT) r$rrBrtr:choose_scalar_styler1rlr8rrrX)rrr r r rvs,     zEmitter.process_tagcCs|jdkr|j|jj|_|jjdks,|jr0dS|jj r|jjdr|joZ|jjpZ|jj r|j rl|jj s||j r|jj rdS|jjr|jjdkr|j r|j r|jj r|jjS|jj s|jjdkr|jjr|jo|jj rdSdS)N"rrz|>')r9rr$rr:r1rlr+r rr'rrrr)rr r r rs& zEmitter.choose_scalar_stylecCs|jdkr|j|jj|_|jdkr.|j|_|j }|jdkrR|j|jj|n`|jdkrn|j |jj|nD|jdkr|j |jjn*|jdkr|j |jjn|j |jj|d|_d|_dS)Nrr>|) r9rr$rr:rr+write_double_quotedr write_single_quoted write_folded write_literal write_plain)rsplitr r r rs        zEmitter.process_scalarcCs,|\}}|dkr td||fd||fS)Nrzunsupported YAML version: %d.%dz%d.%d)r)rrWmajorminorr r r rZszEmitter.prepare_versioncCs|s td|ddks$|ddkr0td|xt|ddD]d}d|koTdknpd|kold knpd |kod knp|d ks>td ||fq>W|S)Nztag handle must not be emptyrrrz*tag handle must start and end with '!': %r09AZazz-_z*invalid character %r in the tag handle: %rrGrG)r)rrhchr r r r`!s HzEmitter.prepare_tag_handlecCs|s tdg}d}}|ddkr(d}x|t|kr||}d|koPdknsd|kohdknsd |kod kns|d kr|d7}q*||kr|j||||d}}|jd }x|D]}|jd t|qWq*W||kr|j|||dj|S)Nztag prefix must not be emptyrrrrrrrrrz-;/?!:@&=+$,_.~*'()[]zutf-8z%%%02Xr)rrKr=encodeordjoin)rrichunksstartendrdatar r r ra-s( H     zEmitter.prepare_tag_prefixc Cs|s td|dkr|Sd}|}t|jj}xH|D]@}|j|r4|dksZt|t|kr4|j|}|t|d}q4Wg}d}}x|t|kr^||} d| kodknpd| kodknpd| kod knp| d kp| dko|dkr|d 7}q||kr$|j||||d }}| jd } x | D]} |jd t| q@WqW||kr||j|||dj |} |rd|| fSd| SdS)Nztag must not be emptyrrrrrrrrz-;/?:@&=+$,_.~*'()[]rzutf-8z%%%02Xrz%s%sz!<%s>) rr^r6r_ startswithrKr=rrr) rrrhsuffixprefixesrirrrrrZ suffix_textr r r rDs@   H        zEmitter.prepare_tagcCs~|s tdxl|D]d}d|ko(dknpdd|ko@dknpdd|koXdknpd|dkstd ||fqW|S) Nzanchor must not be emptyrrrrrrz-_z&invalid character %r in the anchor: %r)r)rrrr r r rhs HzEmitter.prepare_anchorc Cs|st|ddddddddSd}d}d}d}d}d}d}d} d} d} |jdsX|jdr`d}d}d} t|dkpz|ddk} d}d}d}x|t|krv||}|dkr|d krd}d}|d krd}| rd}|d kr| rd}d}n<|d krd}|d krd}| rd}|dkr | r d}d}|dkr.d}|dkpPd|koLdkns|dksd|kordknsd|kodknr|dkrd}|jsd}nd}|dkr|dkrd}|t|dkrd}|rd} d}d}nJ|dkr:|dkrd}|t|dkr&d} |r0d} d}d}nd}d}|d7}|dk} |dt|kpr||ddk} qWd}d}d}d}d}|s|s|s| rd}}|rd}| rd}}}| s|rd}}}}|rd}}|rd}|rd}t|d||||||dS)NTF)r r rrrrrrz---z...ru …

rz#,[]{}&*!|>'"%@`z?:rz,?[]{}r#u …

r ~… u퟿uu�u)r rrKr2)rr Zblock_indicatorsZflow_indicatorsZ line_breaksZspecial_characters leading_spaceZ leading_breakZtrailing_spaceZtrailing_breakZ break_spaceZ space_breakZpreceeded_by_whitespaceZfollowed_by_whitespaceZprevious_spaceZprevious_breakindexrZunicode_charactersrrrrrr r r rrs     &&&        zEmitter.analyze_scalarcCst|jdr|jjdS)Nflush)rQrr)rr r r rms zEmitter.flush_streamcCs*|jr&|jjdr&|jjdj|jdS)Nzutf-16u)rrrwriter)rr r r rRszEmitter.write_stream_startcCs |jdS)N)rm)rr r r rfszEmitter.write_stream_endcCsf|js | r|}nd|}||_|jo(||_|jt|7_d|_|jrV|j|j}|jj|dS)NrF) r.r/r-rKr0rrrr)rrZneed_whitespacer.r/rr r r rXs   zEmitter.write_indicatorcCs||jpd}|j s.|j|ks.|j|kr6|j r6|j|j|krxd|_d||j}||_|jrl|j|j}|jj|dS)NrTr) r&r/r-r.write_line_breakrrrr)rr&rr r r rY-s   zEmitter.write_indentcCsP|dkr|j}d|_d|_|jd7_d|_|jr@|j|j}|jj|dS)NTrr) r5r.r/r,r-rrrr)rrr r r r:s zEmitter.write_line_breakcCs2d|}|jr|j|j}|jj||jdS)Nz %%YAML %s)rrrrr)rrgrr r r r[Es   zEmitter.write_version_directivecCs6d||f}|jr|j|j}|jj||jdS)Nz %%TAG %s %s)rrrrr)rrjrkrr r r rbLs    zEmitter.write_tag_directiveTc Cs,|jddd}d}d}}x|t|krd}|t|krF||}|r|dksZ|dkr|d|kr|j|jkr|r|dkr|t|kr|jn<|||}|jt|7_|jr|j|j}|jj||}n|rH|dks|dkr||dkr|j x4|||D]$} | dkr*|j n |j | qW|j|}nj|dksf|d ksf|dkr||kr|||}|jt|7_|jr|j|j}|jj||}|dkrd }|jd 7_|jr|j|j}|jj||d}|dk r|dk}|dk}|d7}q W|jdddS) NrTFrrru …

ru …

z''r) rXrKr-r4rYrrrrr) rtextrspacesbreaksrrrrbrr r r rUsb                 zEmitter.write_single_quotedrrbtnvfrer\N_LP) r  rrrrru
u
cCs|jddd}}xt|t|krd}|t|kr>||}|dks|dksd|ko`dknp|jod|ko~dknpd |kod kn r||kr|||}|jt|7_|jr|j|j}|jj||}|dk r||jkrd |j|}n<|d kr&d t |}n$|dkr>dt |}n dt |}|jt|7_|jrp|j|j}|jj||d}d|kot|dknr|dks||kr|j|||j kr|r|||d }||kr|}|jt|7_|jr|j|j}|jj||j d|_ d|_ ||dkrd }|jt|7_|jrt|j|j}|jj||d7}qW|jdddS)NrTru "\…

rrru퟿uu�rÿz\x%02Xu￿z\u%04Xz\U%08XrF)rXrKr2r-rrrrESCAPE_REPLACEMENTSrr4rYr.r/)rrrrrrrr r r rsf            8      zEmitter.write_double_quotedcCs\d}|rX|ddkr"|t|j7}|d dkr8|d7}n t|dksP|d dkrX|d7}|S) Nrru …

ru …

rr+rG)strr3rK)rrhintsr r r determine_block_hintss   zEmitter.determine_block_hintsc Cs|j|}|jd|d|d ddkr0d|_|jd}d}d}d}}x|t|krd}|t|krv||}|r |dks|dkr| r|dk r|dkr||d kr|j|dk}x0|||D] } | d kr|jq|j| qW|dk r|j|}n|r|dkr|d|kr@|j|jkr@|jn>|||} |jt| 7_|jrr| j |j} |j j | |}nh|dks|d kr|||} |jt| 7_|jr| j |j} |j j | |dkr|j|}|dk r|dk}|dk}|d7}qPWdS) NrTrrFru …

rru …

rG) rrXr0rrKrYr-r4rrrr) rrrrrrrrrrrr r r rsb               zEmitter.write_foldedc Cs<|j|}|jd|d|dddkr0d|_|jd}d}}x|t|kr6d}|t|krl||}|r|dks|dkrx0|||D] }|dkr|jq|j|qW|dk r|j|}nR|dks|dkr|||}|jr|j|j}|jj ||dkr|j|}|dk r,|dk}|d7}qFWdS) NrTrrru …

rrG) rrXr0rrKrYrrrr) rrrrrrrrrr r r rs>        zEmitter.write_literalc Cs|jr d|_|sdS|jsNd}|jt|7_|jrB|j|j}|jj|d|_d|_ d}d}d}}x|t|kr d}|t|kr||}|r|dkr|d|kr|j|j kr|r|j d|_d|_ n>|||}|jt|7_|jr|j|j}|jj||}n|r|dkr||dkr@|j x4|||D]$} | dkrf|j n |j | qNW|j d|_d|_ |}nV|dks|dkr|||}|jt|7_|jr|j|j}|jj||}|dk r|dk}|dk}|d7}qnWdS) NTrFrru …

ru …

) r(r0r.r-rKrrrrr/r4rYr) rrrrrrrrrrr r r r7sl              zEmitter.write_plain)NNNNN)FF)F)FFFF)F)F)FF)N)T)T)T)@rrrr\rr<r@r>rDrPr!rTrSrVrnrerprsrwryrrr|rrrrrzrrr}rrrrrxr{rdrrurvrrrZr`rarrrrmrRrfrXrYrr[rbrrrrrrrr r r r rs C     $        $ "   7 6 6#N)__all__errorrr#rr rr r r r  s  PK!p r r __pycache__/cyaml.cpython-36.pycnu[3 s PK!&__pycache__/nodes.cpython-36.opt-1.pycnu[3 s  PK!7$'__pycache__/dumper.cpython-36.opt-1.pycnu[3 s PK!!q #__pycache__/composer.cpython-36.pycnu[3 s  PK!Ąm'__pycache__/loader.cpython-36.opt-1.pycnu[3 s   PK!F'F',__pycache__/representer.cpython-36.opt-1.pycnu[3 WddZ ddZ ddZ ddZddZddZdddZddZdS) rcCs>|dkr dSt|tr"|fkr"dSt|tttttfr:dSdS)NT)r-tupler bytesboolintfloat)rrr r r rs zSafeRepresenter.ignore_aliasescCs |jddS)Nztag:yaml.org,2002:nullZnull)r+)rrr r r represent_noneszSafeRepresenter.represent_nonecCs |jd|S)Nztag:yaml.org,2002:str)r+)rrr r r represent_strszSafeRepresenter.represent_strcCs<ttdrtj|jd}ntj|jd}|jd|ddS)N encodebytesasciiztag:yaml.org,2002:binary|)r()r2base64r@decodeZ encodestringr+)rrr r r represent_binarys z SafeRepresenter.represent_binarycCs|r d}nd}|jd|S)NtrueZfalseztag:yaml.org,2002:bool)r+)rrr*r r r represent_boolszSafeRepresenter.represent_boolcCs|jdt|S)Nztag:yaml.org,2002:int)r+r )rrr r r represent_intszSafeRepresenter.represent_intgu<7~cCsv||ks|dkr|dkrd}nL||jkr.d}n<||j kr@d}n*t|j}d|krjd|krj|jddd }|jd |S) Ngg?z.nanz.infz-.inf.ez.0erztag:yaml.org,2002:float) inf_valuereprlowerreplacer+)rrr*r r r represent_floats   zSafeRepresenter.represent_floatcCs |jd|S)Nztag:yaml.org,2002:seq)r0)rrr r r represent_listszSafeRepresenter.represent_listcCs |jd|S)Nztag:yaml.org,2002:map)r7)rrr r r represent_dictszSafeRepresenter.represent_dictcCs&i}x|D] }d||<q W|jd|S)Nztag:yaml.org,2002:set)r7)rrr*keyr r r represent_sets  zSafeRepresenter.represent_setcCs|j}|jd|S)Nztag:yaml.org,2002:timestamp) isoformatr+)rrr*r r r represent_dateszSafeRepresenter.represent_datecCs|jd}|jd|S)N ztag:yaml.org,2002:timestamp)rTr+)rrr*r r r represent_datetimes z"SafeRepresenter.represent_datetimeNcCs.t|dr|j}n |jj}|j|||dS)N __getstate__)r,)r2rXr"r#r7)rr)rr$r,stater r r represent_yaml_objects   z%SafeRepresenter.represent_yaml_objectcCstd|dS)Nzcannot represent an object: %s)r)rrr r r represent_undefinedsz#SafeRepresenter.represent_undefined)N)rr r rr>r?rErGrHrKrLrOrPrQrSrUrWrZr[r r r r rs"  c@s<eZdZddZddZddZddZd d Zd d Zd S)rcCsd|jdkrd|j}nB|jdkr,d|j}n,|jdkrHd|j|jf}nd|j|jf}|jd|S)Ngz%rz%rjrz%r+%rjz%r%rjz tag:yaml.org,2002:python/complex)imagrealr+)rrr r r represent_complexs     zRepresenter.represent_complexcCs |jd|S)Nztag:yaml.org,2002:python/tuple)r0)rrr r r represent_tupleszRepresenter.represent_tuplecCs d|j|jf}|jd|dS)Nz%s.%sztag:yaml.org,2002:python/name:)r rr+)rrnamer r r represent_nameszRepresenter.represent_namecCs|jd|jdS)Nz tag:yaml.org,2002:python/module:r`)r+r)rrr r r represent_module"szRepresenter.represent_modulec Cst|}|tjkr"tj||}n6t|dr8|jd}n t|drL|j}n td|t|dgddd}|\}}}}}t|}|dkri}|dk rt|}|dk rt|}|j dkr|d}|dd}d } d } nd } d } d |j |j f} | r.| r.| r.t |tr.| r.|j d| |S| rb| rbt |trb| rb|j | | |Si} |rt|| d<|st |t r|| d<|r|| d<|r|| d<|j | | | S)N __reduce_ex__ __reduce__zcannot represent object: %r __newobj__rrz$tag:yaml.org,2002:python/object/new:Tz&tag:yaml.org,2002:python/object/apply:Fz%s.%sz tag:yaml.org,2002:python/object:argsrY listitems dictitems)rcopyregdispatch_tabler2rdrfrr3dictrr r-r7r0) rrr$reduceZfunctionrirYrjrkr)ZnewobjZ function_namer*r r r represent_object&sT         zRepresenter.represent_objectcCs8t|}d|j|jf}dd|jD}|j||gS)Nz+tag:yaml.org,2002:python/object/apply:%s.%scSsg|]\}}||gqSr r ).0rRr*r r r isz6Representer.represent_ordered_dict..)rr rr1r0)rrr!r)r1r r r represent_ordered_dictds z"Representer.represent_ordered_dictN) rr r r^r_rbrcrprsr r r r rs  >)3__all__errorZnodesZdatetimesysrltypesrC collectionsZ YAMLErrorrrrr&rr>r r?r:rEr;rGr<rHr=rOr3rPr9rnrQsetrSZdaterUrWr[rcomplexr^r_rb OrderedDictrs FunctionTypeBuiltinFunctionType ModuleTypercr'objectrpr r r r sd0wc ^PK!˱eXIXI,__pycache__/constructor.cpython-36.opt-1.pycnu[3 tddd|jd|j|<d}d}|j|jkrj|j|j}nx|jD].}|jj|rr|jt |d}|j|}PqrWd|jkr|j}|jd}nRd|jkr|jd}nssz6BaseConstructor.construct_sequence..)r#r'rr2rr3)rrr/r )r/rr r(ns   z"BaseConstructor.construct_sequencecCs~t|ts tddd|j|ji}xT|jD]J\}}|j||d}t|tjs`td|jd|j|j||d}|||<q,W|S)Nz%expected a mapping node, but found %s)r/zwhile constructing a mappingzfound unhashable key) r#r)rr2rr3r collectionsHashable)rrr/mappingkey_node value_nodekeyr3r r r r*vs    z!BaseConstructor.construct_mappingcCsft|ts tddd|j|jg}x<|jD]2\}}|j||d}|j||d}|j||fq,W|S)Nz%expected a mapping node, but found %s)r/)r#r)rr2rr3rr.)rrr/pairsr9r:r;r3r r r construct_pairss zBaseConstructor.construct_pairscCs$d|jkr|jj|_||j|<dS)Nr)__dict__rcopy)clsrr0r r r add_constructors  zBaseConstructor.add_constructorcCs$d|jkr|jj|_||j|<dS)Nr )r>r r?)r@r1Zmulti_constructorr r r add_multi_constructors  z%BaseConstructor.add_multi_constructorN)F)F)F)F)rr r rr rrrrrrr&r(r*r= classmethodrArBr r r r r s 2   cseZdZfddZddZd(fdd Zdd Zd dd dd dd Zd d ZddZ dZ xe e e krpe e 9Z qZWe e Z ddZ ddZ ejdejZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'ZZS))rcs>t|tr2x&|jD]\}}|jdkr|j|SqWtj|S)Nztag:yaml.org,2002:value)r#r)r3rr&super)rrr9r:)r%r r r&s   z SafeConstructor.construct_scalarc Cs.g}d}x |t|jkr|j|\}}|jdkr|j|=t|tr^|j||j|jnt|trg}xF|jD]<}t|tstd|j d|j |j |j||j |jqtW|j x0|D]}|j|qWntd|j d|j |j q |jdkr d|_|d7}q |d7}q W|r*||j|_dS) Nrztag:yaml.org,2002:mergezwhile constructing a mappingz,expected a mapping for merging, but found %sz@expected a mapping or list of mappings for merging, but found %sztag:yaml.org,2002:valueztag:yaml.org,2002:strr) r"r3rr#r)flatten_mappingextendr'rrr2r.reverse) rrmergeindexr9r:Zsubmergesubnoder3r r r rEs>           zSafeConstructor.flatten_mappingFcs$t|tr|j|tj||dS)N)r/)r#r)rErDr*)rrr/)r%r r r*s  z!SafeConstructor.construct_mappingcCs|j|dS)N)r&)rrr r r construct_yaml_nulls z#SafeConstructor.construct_yaml_nullT)yesnotrueZfalseZonZoffcCs|j|}|j|jS)N)r& bool_valueslower)rrr3r r r construct_yaml_bools z#SafeConstructor.construct_yaml_boolcCs|j|}|jdd}d}|ddkr*d}|ddkrB|dd}|dkrNdS|jdrn|t|d dd S|jd r|t|d dd S|ddkr|t|d Sd |krdd|jd D}|jd}d}x |D]}|||7}|d9}qW||S|t|SdS)N_rr-z+-0Z0bZ0x:cSsg|] }t|qSr )int)r4partr r r r5sz6SafeConstructor.construct_yaml_int..<r)r&replacer!rZsplitrG)rrr3signdigitsbasedigitr r r construct_yaml_ints2            z"SafeConstructor.construct_yaml_intgu<7~cCs|j|}|jddj}d}|ddkr.d}|ddkrF|dd}|dkrX||jS|dkrf|jSd |krd d |jd D}|jd}d }x |D]}|||7}|d 9}qW||S|t|SdS)NrRrSrrrTz+-z.infz.nanrYcSsg|] }t|qSr )float)r4r[r r r r5 sz8SafeConstructor.construct_yaml_float..gr\rr])r&r^rP inf_value nan_valuer_rGre)rrr3r`rarbrcr r r construct_yaml_floats*        z$SafeConstructor.construct_yaml_floatcCsy|j|jd}Wn6tk rJ}ztddd||jWYdd}~XnXy"ttdrbtj|Stj|SWn8t j k r}ztddd||jWYdd}~XnXdS)Nasciiz,failed to convert base64 data into ascii: %s decodebytesz failed to decode base64 data: %s) r&encodeUnicodeEncodeErrorrrhasattrbase64rj decodestringbinasciiError)rrr3excr r r construct_yaml_binarys  z%SafeConstructor.construct_yaml_binarya^(?P[0-9][0-9][0-9][0-9]) -(?P[0-9][0-9]?) -(?P[0-9][0-9]?) (?:(?:[Tt]|[ \t]+) (?P[0-9][0-9]?) :(?P[0-9][0-9]) :(?P[0-9][0-9]) (?:\.(?P[0-9]*))? (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) (?::(?P[0-9][0-9]))?))?)?$cCs0|j|}|jj|j}|j}t|d}t|d}t|d}|dsZtj|||St|d}t|d} t|d} d} |dr|ddd } xt| d kr| d 7} qWt| } d} |d rt|d } t|d pd}tj | |d} |d dkr| } tj||||| | | }| r,|| 8}|S)NyearmonthdayhourminutesecondrfractionrUZtz_signtz_hour tz_minute)ZhoursZminutesrT) r&timestamp_regexpmatchr3 groupdictrZdatetimeZdater"Z timedelta)rrr3rvaluesrtrurvrwrxryrzZdeltar|r}rr r r construct_yaml_timestamp4s8          z(SafeConstructor.construct_yaml_timestampccsg}|Vt|ts,td|jd|j|jx|jD]}t|tsZtd|jd|j|jt|jdkrtd|jdt|j|j|jd\}}|j|}|j|}|j ||fq4WdS)Nz!while constructing an ordered mapz!expected a sequence, but found %sz,expected a mapping of length 1, but found %srz2expected a single mapping item, but found %d itemsr) r#r'rrr2r3r)r"rr.)rrZomaprJr9r:r;r3r r r construct_yaml_omapRs$      z#SafeConstructor.construct_yaml_omapccsg}|Vt|ts,td|jd|j|jx|jD]}t|tsZtd|jd|j|jt|jdkrtd|jdt|j|j|jd\}}|j|}|j|}|j ||fq4WdS)Nzwhile constructing pairsz!expected a sequence, but found %sz,expected a mapping of length 1, but found %srz2expected a single mapping item, but found %d itemsr) r#r'rrr2r3r)r"rr.)rrr<rJr9r:r;r3r r r construct_yaml_pairshs$      z$SafeConstructor.construct_yaml_pairsccs$t}|V|j|}|j|dS)N)setr*update)rrrr3r r r construct_yaml_set}s z"SafeConstructor.construct_yaml_setcCs |j|S)N)r&)rrr r r construct_yaml_strsz"SafeConstructor.construct_yaml_strccsg}|V|j|j|dS)N)rFr()rrrr r r construct_yaml_seqsz"SafeConstructor.construct_yaml_seqccs"i}|V|j|}|j|dS)N)r*r)rrrr3r r r construct_yaml_maps z"SafeConstructor.construct_yaml_mapccsN|j|}|Vt|dr4|j|dd}|j|n|j|}|jj|dS)N __setstate__T)r/)__new__rmr*rr>r)rrr@rstater r r construct_yaml_objects    z%SafeConstructor.construct_yaml_objectcCstddd|j|jdS)Nz0could not determine a constructor for the tag %r)rrr)rrr r r construct_undefinedsz#SafeConstructor.construct_undefined)F)rr r r&rEr*rKrOrQrdrfrgrhrsrecompileXr~rrrrrrrrr __classcell__r r )r%r rs: #    ztag:yaml.org,2002:nullztag:yaml.org,2002:boolztag:yaml.org,2002:intztag:yaml.org,2002:floatztag:yaml.org,2002:binaryztag:yaml.org,2002:timestampztag:yaml.org,2002:omapztag:yaml.org,2002:pairsztag:yaml.org,2002:setztag:yaml.org,2002:strztag:yaml.org,2002:seqztag:yaml.org,2002:mapc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ d!ddZ ddZddZd"ddZdd ZdS)#rcCs |j|S)N)r&)rrr r r construct_python_strsz Constructor.construct_python_strcCs |j|S)N)r&)rrr r r construct_python_unicodesz$Constructor.construct_python_unicodecCsy|j|jd}Wn6tk rJ}ztddd||jWYdd}~XnXy"ttdrbtj|Stj|SWn8t j k r}ztddd||jWYdd}~XnXdS)Nriz,failed to convert base64 data into ascii: %srjz failed to decode base64 data: %s) r&rkrlrrrmrnrjrorprq)rrr3rrr r r construct_python_bytess  z"Constructor.construct_python_bytescCs |j|S)N)rd)rrr r r construct_python_longsz!Constructor.construct_python_longcCst|j|S)N)complexr&)rrr r r construct_python_complexsz$Constructor.construct_python_complexcCst|j|S)N)tupler()rrr r r construct_python_tuplesz"Constructor.construct_python_tuplecCsb|std|d|y t|Wn8tk rV}ztd|d||f|WYdd}~XnXtj|S)Nz"while constructing a Python modulez+expected non-empty name appended to the tagzcannot find module %r (%s))r __import__ ImportErrorsysmodules)rnamemarkrrr r r find_python_modules "zConstructor.find_python_modulecCs|std|d|d|kr,|jdd\}}nd}|}y t|Wn8tk rx}ztd|d||f|WYdd}~XnXtj|}t||std|d||jf|t||S)Nz"while constructing a Python objectz+expected non-empty name appended to the tag.rbuiltinszcannot find module %r (%s)zcannot find %r in the module %r) rrsplitrrrrrmrgetattr)rrrZ module_nameZ object_namerrmoduler r r find_python_names$ "  zConstructor.find_python_namecCs2|j|}|r$td|jd||j|j||jS)Nz while constructing a Python namez&expected the empty value, but found %r)r&rrr)rsuffixrr3r r r construct_python_names  z!Constructor.construct_python_namecCs2|j|}|r$td|jd||j|j||jS)Nz"while constructing a Python modulez&expected the empty value, but found %r)r&rrr)rrrr3r r r construct_python_modules  z#Constructor.construct_python_moduleNFcCsL|sg}|si}|j||j}|r>t|tr>|j|f||S|||SdS)N)rrr#typer)rrrargskwdsnewobjr@r r r make_python_instance"sz Constructor.make_python_instancecCst|dr|j|nji}t|tr8t|dkr8|\}}t|drP|jj|n|r^|j|x |jD]\}}tt ||qhWdS)NrrVr>) rmrr#rr"r>ritemssetattrobject)rinstancerZ slotstater;r3r r r set_python_instance_state.s    z%Constructor.set_python_instance_stateccs>|j||dd}|Vt|d}|j||d}|j||dS)NT)rr)r/)rrmr*r)rrrrr/rr r r construct_python_object<s  z#Constructor.construct_python_objectc Cst|tr*|j|dd}i}i}g}i}nJ|j|dd} | jdg}| jdi}| jdi}| jdg}| jdi}|j|||||} |r|j| ||r| j||rx|D]} || | | <qW| S)NT)r/rrr listitems dictitems)r#r'r(r*getrrrF) rrrrrrrrrr3rr;r r r construct_python_object_applyEs*         z)Constructor.construct_python_object_applycCs|j||ddS)NT)r)r)rrrr r r construct_python_object_newhsz'Constructor.construct_python_object_new)NNF)F)rr r rrrrrrrrrrrrrrrr r r r rs   #ztag:yaml.org,2002:python/noneztag:yaml.org,2002:python/boolztag:yaml.org,2002:python/strz tag:yaml.org,2002:python/unicodeztag:yaml.org,2002:python/bytesztag:yaml.org,2002:python/intztag:yaml.org,2002:python/longztag:yaml.org,2002:python/floatz tag:yaml.org,2002:python/complexztag:yaml.org,2002:python/listztag:yaml.org,2002:python/tupleztag:yaml.org,2002:python/dictztag:yaml.org,2002:python/name:z tag:yaml.org,2002:python/module:z tag:yaml.org,2002:python/object:z&tag:yaml.org,2002:python/object/apply:z$tag:yaml.org,2002:python/object/new:))__all__errorZnodesr6rrnrprrr+ZMarkedYAMLErrorrrrrArKrQrdrhrsrrrrrrrrrrrrrrrrBrrrrrr r r r s8PK!p r r &__pycache__/cyaml.cpython-36.opt-1.pycnu[3 s PK!i(!__pycache__/events.cpython-36.pycnu[3 sz"Event.__repr__..anchortagimplicitvaluez, csg|]}d|t|fqS)z%s=%r)getattr)r r )rrrr sz%s(%s))r r rr)join __class____name__)rZ attributesZ argumentsr)rr__repr__s zEvent.__repr__)NN)r __module__ __qualname__rrrrrrrs rc@seZdZdddZdS) NodeEventNcCs||_||_||_dS)N)r rr)rr rrrrrrszNodeEvent.__init__)NN)rrrrrrrrrsrc@seZdZdddZdS)CollectionStartEventNcCs(||_||_||_||_||_||_dS)N)r r rrr flow_style)rr r rrrrrrrrs zCollectionStartEvent.__init__)NNN)rrrrrrrrrsrc@s eZdZdS)CollectionEndEventN)rrrrrrrrsrc@seZdZdddZdS)StreamStartEventNcCs||_||_||_dS)N)rrencoding)rrrrrrrr%szStreamStartEvent.__init__)NNN)rrrrrrrrr$src@s eZdZdS)StreamEndEventN)rrrrrrrr*src@seZdZdddZdS)DocumentStartEventNcCs"||_||_||_||_||_dS)N)rrexplicitversiontags)rrrrr r!rrrr.s zDocumentStartEvent.__init__)NNNNN)rrrrrrrrr-src@seZdZdddZdS)DocumentEndEventNcCs||_||_||_dS)N)rrr)rrrrrrrr7szDocumentEndEvent.__init__)NNN)rrrrrrrrr"6sr"c@s eZdZdS) AliasEventN)rrrrrrrr#=sr#c@seZdZdddZdS) ScalarEventNcCs.||_||_||_||_||_||_||_dS)N)r r rrrrstyle)rr r rrrrr%rrrrAszScalarEvent.__init__)NNN)rrrrrrrrr$@sr$c@s eZdZdS)SequenceStartEventN)rrrrrrrr&Ksr&c@s eZdZdS)SequenceEndEventN)rrrrrrrr'Nsr'c@s eZdZdS)MappingStartEventN)rrrrrrrr(Qsr(c@s eZdZdS)MappingEndEventN)rrrrrrrr)Tsr)N)objectrrrrrrrr"r#r$r&r'r(r)rrrrs    PK!Ąm!__pycache__/loader.cpython-36.pycnu[3 s   PK!F'F'&__pycache__/representer.cpython-36.pycnu[3 WddZ ddZ ddZ ddZddZddZdddZddZdS) rcCs>|dkr dSt|tr"|fkr"dSt|tttttfr:dSdS)NT)r-tupler bytesboolintfloat)rrr r r rs zSafeRepresenter.ignore_aliasescCs |jddS)Nztag:yaml.org,2002:nullZnull)r+)rrr r r represent_noneszSafeRepresenter.represent_nonecCs |jd|S)Nztag:yaml.org,2002:str)r+)rrr r r represent_strszSafeRepresenter.represent_strcCs<ttdrtj|jd}ntj|jd}|jd|ddS)N encodebytesasciiztag:yaml.org,2002:binary|)r()r2base64r@decodeZ encodestringr+)rrr r r represent_binarys z SafeRepresenter.represent_binarycCs|r d}nd}|jd|S)NtrueZfalseztag:yaml.org,2002:bool)r+)rrr*r r r represent_boolszSafeRepresenter.represent_boolcCs|jdt|S)Nztag:yaml.org,2002:int)r+r )rrr r r represent_intszSafeRepresenter.represent_intgu<7~cCsv||ks|dkr|dkrd}nL||jkr.d}n<||j kr@d}n*t|j}d|krjd|krj|jddd }|jd |S) Ngg?z.nanz.infz-.inf.ez.0erztag:yaml.org,2002:float) inf_valuereprlowerreplacer+)rrr*r r r represent_floats   zSafeRepresenter.represent_floatcCs |jd|S)Nztag:yaml.org,2002:seq)r0)rrr r r represent_listszSafeRepresenter.represent_listcCs |jd|S)Nztag:yaml.org,2002:map)r7)rrr r r represent_dictszSafeRepresenter.represent_dictcCs&i}x|D] }d||<q W|jd|S)Nztag:yaml.org,2002:set)r7)rrr*keyr r r represent_sets  zSafeRepresenter.represent_setcCs|j}|jd|S)Nztag:yaml.org,2002:timestamp) isoformatr+)rrr*r r r represent_dateszSafeRepresenter.represent_datecCs|jd}|jd|S)N ztag:yaml.org,2002:timestamp)rTr+)rrr*r r r represent_datetimes z"SafeRepresenter.represent_datetimeNcCs.t|dr|j}n |jj}|j|||dS)N __getstate__)r,)r2rXr"r#r7)rr)rr$r,stater r r represent_yaml_objects   z%SafeRepresenter.represent_yaml_objectcCstd|dS)Nzcannot represent an object: %s)r)rrr r r represent_undefinedsz#SafeRepresenter.represent_undefined)N)rr r rr>r?rErGrHrKrLrOrPrQrSrUrWrZr[r r r r rs"  c@s<eZdZddZddZddZddZd d Zd d Zd S)rcCsd|jdkrd|j}nB|jdkr,d|j}n,|jdkrHd|j|jf}nd|j|jf}|jd|S)Ngz%rz%rjrz%r+%rjz%r%rjz tag:yaml.org,2002:python/complex)imagrealr+)rrr r r represent_complexs     zRepresenter.represent_complexcCs |jd|S)Nztag:yaml.org,2002:python/tuple)r0)rrr r r represent_tupleszRepresenter.represent_tuplecCs d|j|jf}|jd|dS)Nz%s.%sztag:yaml.org,2002:python/name:)r rr+)rrnamer r r represent_nameszRepresenter.represent_namecCs|jd|jdS)Nz tag:yaml.org,2002:python/module:r`)r+r)rrr r r represent_module"szRepresenter.represent_modulec Cst|}|tjkr"tj||}n6t|dr8|jd}n t|drL|j}n td|t|dgddd}|\}}}}}t|}|dkri}|dk rt|}|dk rt|}|j dkr|d}|dd}d } d } nd } d } d |j |j f} | r.| r.| r.t |tr.| r.|j d| |S| rb| rbt |trb| rb|j | | |Si} |rt|| d<|st |t r|| d<|r|| d<|r|| d<|j | | | S)N __reduce_ex__ __reduce__zcannot represent object: %r __newobj__rrz$tag:yaml.org,2002:python/object/new:Tz&tag:yaml.org,2002:python/object/apply:Fz%s.%sz tag:yaml.org,2002:python/object:argsrY listitems dictitems)rcopyregdispatch_tabler2rdrfrr3dictrr r-r7r0) rrr$reduceZfunctionrirYrjrkr)ZnewobjZ function_namer*r r r represent_object&sT         zRepresenter.represent_objectcCs8t|}d|j|jf}dd|jD}|j||gS)Nz+tag:yaml.org,2002:python/object/apply:%s.%scSsg|]\}}||gqSr r ).0rRr*r r r isz6Representer.represent_ordered_dict..)rr rr1r0)rrr!r)r1r r r represent_ordered_dictds z"Representer.represent_ordered_dictN) rr r r^r_rbrcrprsr r r r rs  >)3__all__errorZnodesZdatetimesysrltypesrC collectionsZ YAMLErrorrrrr&rr>r r?r:rEr;rGr<rHr=rOr3rPr9rnrQsetrSZdaterUrWr[rcomplexr^r_rb OrderedDictrs FunctionTypeBuiltinFunctionType ModuleTypercr'objectrpr r r r sd0wc ^PK!Jeee(__pycache__/scanner.cpython-36.opt-1.pycnu[3 Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUdVZ-dWdXZ.dYdZZ/d[d\Z0d]d^Z1d_d`Z2dadbZ3dcddZ4dedfZ5dgdhZ6didjZ7dkdlZ8dmdnZ9dodpZ:dqdrZ;dsdtZdydzZ?d{d|Z@d}d~ddddddddddddddddZAddddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKdS)rcCs<d|_d|_g|_|jd|_d|_g|_d|_i|_dS)zInitialize the scanner.FrTN) done flow_leveltokensfetch_stream_start tokens_takenindentindentsallow_simple_keypossible_simple_keys)rr r r r0s zScanner.__init__cGsJx|jr|jqW|jrF|s$dSx |D]}t|jd|r*dSq*WdS)NTrF)need_more_tokensfetch_more_tokensr isinstance)rchoicesZchoicer r r check_tokenqs   zScanner.check_tokencCs*x|jr|jqW|jr&|jdSdS)Nr)rr r)rr r r peek_token}s  zScanner.peek_tokencCs:x|jr|jqW|jr6|jd7_|jjdSdS)Nrr)rr rrpop)rr r r get_tokens   zScanner.get_tokencCs2|jr dS|jsdS|j|j|jkr.dSdS)NFT)rrstale_possible_simple_keysnext_possible_simple_keyr)rr r r rszScanner.need_more_tokenscCs|j|j|j|j|j}|dkr4|jS|dkrL|jrL|jS|dkrd|jrd|j S|dkr||j r||j S|dkr|j S|dkr|j S|dkr|jS|dkr|jS|d kr|jS|dkr|jr|jS|d kr|jr|jS|d kr|jr|jS|d kr*|jS|d kr<|jS|dkrN|jS|dkrj|j rj|jS|dkr|j r|jS|dkr|jS|dkr|jS|jr|j St!ddd||j"dS)N%-.[{]},?:r&!|>'"z!while scanning for the next tokenz.found character %r that cannot start any token)#scan_to_next_tokenr' unwind_indentrpeekfetch_stream_endcheck_directivefetch_directivecheck_document_startfetch_document_startcheck_document_endfetch_document_endfetch_flow_sequence_startfetch_flow_mapping_startfetch_flow_sequence_endfetch_flow_mapping_endfetch_flow_entrycheck_block_entryfetch_block_entry check_key fetch_key check_value fetch_value fetch_alias fetch_anchor fetch_tagr fetch_literal fetch_folded fetch_single fetch_double check_plain fetch_plainrget_mark)rchr r r r s^        zScanner.fetch_more_tokenscCs:d}x0|jD]&}|j|}|dks,|j|kr |j}q W|S)N)rr )rZmin_token_numberlevelkeyr r r r(s    z Scanner.next_possible_simple_keycCs`xZt|jD]L}|j|}|j|jks6|j|jdkr |jrPtd|jd|j|j|=q WdS)Nizwhile scanning a simple keyzcould not find expected ':')listrrrr rrrX)rrZr[r r r r's   z"Scanner.stale_possible_simple_keyscCs^|j o|j|jk}|jrZ|j|jt|j}t|||j |j |j|j }||j |j<dS)N) rrrrremove_possible_simple_keyrlenrr rrrXr)rr r r[r r r save_possible_simple_key$sz Scanner.save_possible_simple_keycCs@|j|jkr<|j|j}|jr2td|jd|j|j|j=dS)Nzwhile scanning a simple keyzcould not find expected ':')rrr rrrX)rr[r r r r]5s    z"Scanner.remove_possible_simple_keycCsD|jr dSx4|j|kr>|j}|jj|_|jjt||q WdS)N)rrrXrr%rappendZ BlockEndToken)rrrr r r r;Bs   zScanner.unwind_indentcCs&|j|kr"|jj|j||_dSdS)NTF)rrr`)rrr r r add_indentZs  zScanner.add_indentcCs$|j}|jjt|||jddS)N)encoding)rXrr`ZStreamStartTokenrb)rrr r r rds zScanner.fetch_stream_startcCsB|jd|jd|_i|_|j}|jjt||d|_dS)NrFTr) r;r]rrrXrr`ZStreamEndTokenr)rrr r r r=ps zScanner.fetch_stream_endcCs,|jd|jd|_|jj|jdS)NrFr)r;r]rrr`scan_directive)rr r r r?s zScanner.fetch_directivecCs|jtdS)N)fetch_document_indicatorZDocumentStartToken)rr r r rAszScanner.fetch_document_startcCs|jtdS)N)rdZDocumentEndToken)rr r r rCszScanner.fetch_document_endcCsH|jd|jd|_|j}|jd|j}|jj|||dS)NrFr)r;r]rrXforwardrr`)r TokenClass start_markend_markr r r rds  z Scanner.fetch_document_indicatorcCs|jtdS)N)fetch_flow_collection_startZFlowSequenceStartToken)rr r r rDsz!Scanner.fetch_flow_sequence_startcCs|jtdS)N)rjZFlowMappingStartToken)rr r r rEsz Scanner.fetch_flow_mapping_startcCsJ|j|jd7_d|_|j}|j|j}|jj|||dS)NrT)r_rrrXrfrr`)rrgrhrir r r rjsz#Scanner.fetch_flow_collection_startcCs|jtdS)N)fetch_flow_collection_endZFlowSequenceEndToken)rr r r rFszScanner.fetch_flow_sequence_endcCs|jtdS)N)rkZFlowMappingEndToken)rr r r rGszScanner.fetch_flow_mapping_endcCsJ|j|jd8_d|_|j}|j|j}|jj|||dS)NrF)r]rrrXrfrr`)rrgrhrir r r rksz!Scanner.fetch_flow_collection_endcCs<d|_|j|j}|j|j}|jjt||dS)NT)rr]rXrfrr`ZFlowEntryToken)rrhrir r r rHs zScanner.fetch_flow_entrycCs|jsF|jstddd|j|j|jrF|j}|jjt||nd|_|j |j}|j |j}|jjt ||dS)Nz%sequence entries are not allowed hereT) rrrrXrarrr`ZBlockSequenceStartTokenr]rfZBlockEntryToken)rrrhrir r r rJs  zScanner.fetch_block_entrycCs|jsD|jstddd|j|j|jrD|j}|jjt|||j |_|j |j}|j |j}|jjt ||dS)Nz!mapping keys are not allowed here) rrrrXrarrr`BlockMappingStartTokenr]rfKeyToken)rrrhrir r r rLs   zScanner.fetch_keycCs|j|jkr||j|j}|j|j=|jj|j|jt|j|j|jst|j|j rt|jj|j|jt |j|jd|_ n\|js|j st ddd|j |js|j|j r|j }|jjt |||j |_ |j|j }|j|j }|jjt||dS)NFz#mapping values are not allowed here)rrrinsertr rrmrrarrlrrrXr`r]rfZ ValueToken)rr[rrhrir r r rNs2       zScanner.fetch_valuecCs$|jd|_|jj|jtdS)NF)r_rrr` scan_anchorZ AliasToken)rr r r rOVszScanner.fetch_aliascCs$|jd|_|jj|jtdS)NF)r_rrr`roZ AnchorToken)rr r r rPaszScanner.fetch_anchorcCs"|jd|_|jj|jdS)NF)r_rrr`scan_tag)rr r r rQlszScanner.fetch_tagcCs|jdddS)Nr6)style)fetch_block_scalar)rr r r rRwszScanner.fetch_literalcCs|jdddS)Nr7)rq)rr)rr r r rSzszScanner.fetch_foldedcCs$d|_|j|jj|j|dS)NT)rr]rr`scan_block_scalar)rrqr r r rr}szScanner.fetch_block_scalarcCs|jdddS)Nr8)rq)fetch_flow_scalar)rr r r rTszScanner.fetch_singlecCs|jdddS)Nr9)rq)rt)rr r r rUszScanner.fetch_doublecCs$|jd|_|jj|j|dS)NF)r_rrr`scan_flow_scalar)rrqr r r rtszScanner.fetch_flow_scalarcCs"|jd|_|jj|jdS)NF)r_rrr` scan_plain)rr r r rWszScanner.fetch_plaincCs|jdkrdSdS)NrT)r)rr r r r>s zScanner.check_directivecCs.|jdkr*|jddkr*|jddkr*dSdS)Nrrez---u …

T)rprefixr<)rr r r r@s zScanner.check_document_startcCs.|jdkr*|jddkr*|jddkr*dSdS)Nrrez...u …

T)rrwr<)rr r r rBs zScanner.check_document_endcCs|jddkS)Nru …

)r<)rr r r rIszScanner.check_block_entrycCs|jr dS|jddkSdS)NTru …

)rr<)rr r r rKszScanner.check_keycCs|jr dS|jddkSdS)NTru …

)rr<)rr r r rMszScanner.check_valuecCs6|j}|dkp4|jddko4|dkp4|j o4|dkS)Nu …

-?:,[]{}#&*!|>'"%@`ru …

r+z?:)r<r)rrYr r r rVszScanner.check_plaincCs|jdkr|jdkr|jd}xb|sx|jdkr@|jq*W|jdkrhx|jdkrf|jqPW|jr~|jsd|_q$d}q$WdS)NruF #u …

T)rr<rfscan_line_breakrr)rfoundr r r r:s   zScanner.scan_to_next_tokencCs|j}|j|j|}d}|dkr:|j|}|j}n>|dkrV|j|}|j}n"|j}x|jdkrv|jq`W|j|t||||S)NZYAMLZTAGu …

)rXrfscan_directive_namescan_yaml_directive_valuescan_tag_directive_valuer<scan_directive_ignored_lineZDirectiveToken)rrhnamevaluerir r r rcs       zScanner.scan_directivecCsd}|j|}xfd|ko"dkns`d|ko:dkns`d|koRdkns`|dkrt|d 7}|j|}qW|std |d ||j|j|}|j||j}|d krtd |d ||j|S) Nr09AZazz-_rzwhile scanning a directivez6expected alphabetic or numeric character, but found %ru …

)r<rrXrwrf)rrhlengthrYrr r r r|#s$ J  zScanner.scan_directive_namecCsx|jdkr|jqW|j|}|jdkrJtd|d|j|j|j|j|}|jdkrtd|d|j|j||fS)Nrxr,zwhile scanning a directivez%expected a digit or '.', but found %ru …

z%expected a digit or ' ', but found %r)r<rfscan_yaml_directive_numberrrX)rrhmajorminorr r r r}8s         z!Scanner.scan_yaml_directive_valuecCs|j}d|kodkns6td|d||jd}x*d|j|koTdknrd|d7}q|jq(W|j}|dkrftd|d||j|jdS)Nrxryu …

zwhile scanning a directivez0expected a comment or a line break, but found %r)r<rfrrXrz)rrhrYr r r rrs   z#Scanner.scan_directive_ignored_linec Cs|j}|j}|dkrd}nd}|jd}|j|}xfd|koLdknsd|koddknsd |ko|d kns|d kr|d 7}|j|}q:W|std ||d||j|j|}|j||j}|dkrtd ||d||j|j}||||S)NraliasZanchorrrrrrrrz-_rzwhile scanning an %sz6expected alphabetic or numeric character, but found %ru …

?:,]}%@`)rXr<rfrrw) rrgrhZ indicatorrrrYrrir r r ros2  J    zScanner.scan_anchorc Cs&|j}|jd}|dkrdd}|jd|jd|}|jdkrZtd|d|j|j|jn~|dkr~d}d }|jndd}d }x,|d kr|d krd }P|d7}|j|}qWd }|r|jd|}n d }|j|jd|}|j}|d kr td |d||j||f}|j}t|||S)Nr<tagr7zwhile parsing a tagzexpected '>', but found %ru …

r5Fu …

Tzwhile scanning a tagzexpected ' ', but found %r)rXr<rfrrrZTagToken) rrhrYrsuffixrZ use_handlerrir r r rpsH           zScanner.scan_tagcCs|dkrd}nd}g}|j}|j|j|\}}|j||jd}|dkrTd}|dkrv|j\}} } t|| } n||d} |j| \}} d} x|j| ko|j dkrt|j ||j dk} d}x|j |d kr|d7}qW|j |j ||j||j } |j| \}} |j| krp|j dkrp|rd| d krd| rd|j dkrd|sn|j d n |j | qPqW|dk r|j | |dkr|j |tdj|d|| |S) Nr7TFrr)z ru …

 rx)rXrfscan_block_scalar_indicatorsscan_block_scalar_ignored_linerscan_block_scalar_indentationmaxscan_block_scalar_breaksrr<extendr`rwrz ScalarTokenjoin)rrqZfoldedchunksrhchomping incrementZ min_indentbreaks max_indentrir line_breakZleading_non_spacerr r r rssP              zScanner.scan_block_scalarcCsd}d}|j}|dkrn|dkr&d}nd}|j|j}|dkrt|}|dkrdtd|d|j|jn\|dkrt|}|dkrtd|d|j|j|j}|dkr|dkrd}nd}|j|j}|d krtd|d ||j||fS) Nz+-+TF 0123456789rzwhile scanning a block scalarz|jq(W|j}|dkrftd|d||j|jdS)Nrxryu …

zwhile scanning a block scalarz0expected a comment or a line break, but found %r)r<rfrrXrz)rrhrYr r r rAs    z&Scanner.scan_block_scalar_ignored_linecCshg}d}|j}xL|jdkr\|jdkrB|j|j|j}q|j|j|kr|j}qW|||fS)Nru …

rx)rXr<r`rzrfr)rrrrir r r rOs    z%Scanner.scan_block_scalar_indentationcCsg}|j}x"|j|kr.|jdkr.|jqWxJ|jdkrz|j|j|j}x"|j|krv|jdkrv|jqVWq2W||fS)Nrxu …

)rXrr<rfr`rz)rrrrir r r r^s z Scanner.scan_block_scalar_breakscCs|dkrd}nd}g}|j}|j}|j|j|j||x4|j|krt|j|j|||j|j||qBW|j|j}tdj|d|||S)Nr9TFr)rXr<rfrscan_flow_scalar_non_spacesscan_flow_scalar_spacesrr)rrqdoublerrhZquoterir r r rukszScanner.scan_flow_scalarr) r   rxr9\… u
u
)rrbtrnvfrerxr9rN_LPr)xuUcCsg}xd}x|j|dkr&|d7}qW|rF|j|j||j||j}| r|dkr|jddkr|jd|jdq|r|dks| r|dkr|j||jq|o|dkr|j|j}||jkr|j|j||jn||jkr||j|}|jxBt|D]6}|j|dkrtd |d ||j|f|jqWt |j|d }|jt ||j|n<|d kr|j |j |j ||ntd |d ||jq|SqWdS)Nru'"\ …

rr8rz"\r0123456789ABCDEFabcdefz%while scanning a double-quoted scalarz?expected escape sequence of %d hexdecimal numbers, but found %ru …

z!found unknown escape character %r)r<r`rwrfESCAPE_REPLACEMENTS ESCAPE_CODESrangerrXrchrrzrscan_flow_scalar_breaks)rrrhrrrYkcoder r r rsL            z#Scanner.scan_flow_scalar_non_spacesc Csg}d}x|j|dkr"|d7}q W|j|}|j||j}|dkr\td|d|jnT|dkr|j}|j||}|dkr|j|n|s|jd |j|n |j||S) Nrz rr)zwhile scanning a quoted scalarzfound unexpected end of streamu …

rrx) r<rwrfrrXrzrr`r) rrrhrr whitespacesrYrrr r r rs(        zScanner.scan_flow_scalar_spacescCsg}xx|jd}|dks |dkr@|jddkr@td|d|jx|jdkrX|jqBW|jdkrv|j|jq|SqWdS) Nrez---z...u …

zwhile scanning a quoted scalarz#found unexpected document separatorz u …

)rwr<rrXrfr`rz)rrrhrrwr r r rs    zScanner.scan_flow_scalar_breakscCsNg}|j}|}|jd}g}xd}|jdkr4PxP|j|}|dksx|j rj|dkrj|j|ddksx|jrz|dkrzP|d7}q6W|jr|dkr|j|ddkr|j|td|d |jd |dkrPd |_|j||j|j ||j||j}|j ||}| s4|jdks4|j r"|j |kr"Pq"Wt d j |d ||S)Nrrryu …

r3z,:?[]{}u …

,[]{}zwhile scanning a plain scalarzfound unexpected ':'zGPlease check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.FrT)rXrr<rrfrrrr`rwscan_plain_spacesrrr)rrrhrirZspacesrrYr r r rvsF        zScanner.scan_plainc Cs.g}d}x|j|dkr"|d7}q W|j|}|j||j}|dkr|j}d|_|jd}|dksr|dkr|jdd krdSg} x`|jd kr|jdkr|jq| j|j|jd}|dks|dkr|jdd krdSqW|d kr|j|n| s|jd|j| n|r*|j||S) Nrrxru …

Trez---z...u …

u …

r)r<rwrfrzrr`r) rrrhrrrrYrrwrr r r r!s>            zScanner.scan_plain_spacescCs|j}|dkr*td||d||jd}|j|}|dkrxfd|koTdknsd|kold knsd |kod kns|d kr|d7}|j|}qBW|dkr|j|td||d||j|d7}|j|}|j||S) Nr5zwhile scanning a %szexpected '!', but found %rrrxrrrrrrz-_)r<rrXrfrw)rrrhrYrrr r r rFs&  J    zScanner.scan_tag_handlecCsg}d}|j|}xd|ko&dknsdd|ko>dknsdd|koVdknsd|dkr|d kr|j|j||j|d}|j|j||n|d 7}|j|}qW|r|j|j||j|d}|std ||d ||jd j|S)Nrrrrrrrz-;/?:@&=+$,_.!~*'()[]%r*rzwhile parsing a %szexpected URI, but found %rr)r<r`rwrfscan_uri_escapesrrXr)rrrhrrrYr r r r^s( J   zScanner.scan_tag_uricCsg}|j}xx|jdkr|jx>tdD]2}|j|dkr,td||d|j||jq,W|jt|jdd|jdqWyt|j d}Wn8t k r}ztd||t ||WYdd}~XnX|S)Nr*rrzwhile scanning a %szBexpected URI escape sequence of 2 hexdecimal numbers, but found %rrzutf-8) rXr<rfrrr`rrwbytesdecodeUnicodeDecodeErrorstr)rrrhZcodesrrrexcr r r rws  (zScanner.scan_uri_escapescCsN|j}|dkr6|jddkr*|jdn|jdS|dkrJ|j|SdS)Nu …rz ru

r)r<rwrf)rrYr r r rzs  zScanner.scan_line_breakN)Lrrrrr#r$r&rr r(r'r_r]r;rarr=r?rArCrdrDrErjrFrGrkrHrJrLrNrOrPrQrRrSrrrTrUrtrWr>r@rBrIrKrMrVr:rcr|r}rr~rrrrorprsrrrrrurrrrrrvrrrrrzr r r r r.sA   l    !8       #    $)L( +/%N)__all__errorrrrr rr r r r s   PK!D`i +__pycache__/serializer.cpython-36.opt-1.pycnu[3             zSerializer.serialize_node)NNNNN) rrrr)rrrr!rr"rr r r r r s   N)__all__errorrZeventsZnodesrrr r r r s  PK!k8 __pycache__/error.cpython-36.pycnu[3 s )PK!˱eXIXI&__pycache__/constructor.cpython-36.pycnu[3 tddd|jd|j|<d}d}|j|jkrj|j|j}nx|jD].}|jj|rr|jt |d}|j|}PqrWd|jkr|j}|jd}nRd|jkr|jd}nssz6BaseConstructor.construct_sequence..)r#r'rr2rr3)rrr/r )r/rr r(ns   z"BaseConstructor.construct_sequencecCs~t|ts tddd|j|ji}xT|jD]J\}}|j||d}t|tjs`td|jd|j|j||d}|||<q,W|S)Nz%expected a mapping node, but found %s)r/zwhile constructing a mappingzfound unhashable key) r#r)rr2rr3r collectionsHashable)rrr/mappingkey_node value_nodekeyr3r r r r*vs    z!BaseConstructor.construct_mappingcCsft|ts tddd|j|jg}x<|jD]2\}}|j||d}|j||d}|j||fq,W|S)Nz%expected a mapping node, but found %s)r/)r#r)rr2rr3rr.)rrr/pairsr9r:r;r3r r r construct_pairss zBaseConstructor.construct_pairscCs$d|jkr|jj|_||j|<dS)Nr)__dict__rcopy)clsrr0r r r add_constructors  zBaseConstructor.add_constructorcCs$d|jkr|jj|_||j|<dS)Nr )r>r r?)r@r1Zmulti_constructorr r r add_multi_constructors  z%BaseConstructor.add_multi_constructorN)F)F)F)F)rr r rr rrrrrrr&r(r*r= classmethodrArBr r r r r s 2   cseZdZfddZddZd(fdd Zdd Zd dd dd dd Zd d ZddZ dZ xe e e krpe e 9Z qZWe e Z ddZ ddZ ejdejZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'ZZS))rcs>t|tr2x&|jD]\}}|jdkr|j|SqWtj|S)Nztag:yaml.org,2002:value)r#r)r3rr&super)rrr9r:)r%r r r&s   z SafeConstructor.construct_scalarc Cs.g}d}x |t|jkr|j|\}}|jdkr|j|=t|tr^|j||j|jnt|trg}xF|jD]<}t|tstd|j d|j |j |j||j |jqtW|j x0|D]}|j|qWntd|j d|j |j q |jdkr d|_|d7}q |d7}q W|r*||j|_dS) Nrztag:yaml.org,2002:mergezwhile constructing a mappingz,expected a mapping for merging, but found %sz@expected a mapping or list of mappings for merging, but found %sztag:yaml.org,2002:valueztag:yaml.org,2002:strr) r"r3rr#r)flatten_mappingextendr'rrr2r.reverse) rrmergeindexr9r:Zsubmergesubnoder3r r r rEs>           zSafeConstructor.flatten_mappingFcs$t|tr|j|tj||dS)N)r/)r#r)rErDr*)rrr/)r%r r r*s  z!SafeConstructor.construct_mappingcCs|j|dS)N)r&)rrr r r construct_yaml_nulls z#SafeConstructor.construct_yaml_nullT)yesnotrueZfalseZonZoffcCs|j|}|j|jS)N)r& bool_valueslower)rrr3r r r construct_yaml_bools z#SafeConstructor.construct_yaml_boolcCs|j|}|jdd}d}|ddkr*d}|ddkrB|dd}|dkrNdS|jdrn|t|d dd S|jd r|t|d dd S|ddkr|t|d Sd |krdd|jd D}|jd}d}x |D]}|||7}|d9}qW||S|t|SdS)N_rr-z+-0Z0bZ0x:cSsg|] }t|qSr )int)r4partr r r r5sz6SafeConstructor.construct_yaml_int..<r)r&replacer!rZsplitrG)rrr3signdigitsbasedigitr r r construct_yaml_ints2            z"SafeConstructor.construct_yaml_intgu<7~cCs|j|}|jddj}d}|ddkr.d}|ddkrF|dd}|dkrX||jS|dkrf|jSd |krd d |jd D}|jd}d }x |D]}|||7}|d 9}qW||S|t|SdS)NrRrSrrrTz+-z.infz.nanrYcSsg|] }t|qSr )float)r4r[r r r r5 sz8SafeConstructor.construct_yaml_float..gr\rr])r&r^rP inf_value nan_valuer_rGre)rrr3r`rarbrcr r r construct_yaml_floats*        z$SafeConstructor.construct_yaml_floatcCsy|j|jd}Wn6tk rJ}ztddd||jWYdd}~XnXy"ttdrbtj|Stj|SWn8t j k r}ztddd||jWYdd}~XnXdS)Nasciiz,failed to convert base64 data into ascii: %s decodebytesz failed to decode base64 data: %s) r&encodeUnicodeEncodeErrorrrhasattrbase64rj decodestringbinasciiError)rrr3excr r r construct_yaml_binarys  z%SafeConstructor.construct_yaml_binarya^(?P[0-9][0-9][0-9][0-9]) -(?P[0-9][0-9]?) -(?P[0-9][0-9]?) (?:(?:[Tt]|[ \t]+) (?P[0-9][0-9]?) :(?P[0-9][0-9]) :(?P[0-9][0-9]) (?:\.(?P[0-9]*))? (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) (?::(?P[0-9][0-9]))?))?)?$cCs0|j|}|jj|j}|j}t|d}t|d}t|d}|dsZtj|||St|d}t|d} t|d} d} |dr|ddd } xt| d kr| d 7} qWt| } d} |d rt|d } t|d pd}tj | |d} |d dkr| } tj||||| | | }| r,|| 8}|S)NyearmonthdayhourminutesecondrfractionrUZtz_signtz_hour tz_minute)ZhoursZminutesrT) r&timestamp_regexpmatchr3 groupdictrZdatetimeZdater"Z timedelta)rrr3rvaluesrtrurvrwrxryrzZdeltar|r}rr r r construct_yaml_timestamp4s8          z(SafeConstructor.construct_yaml_timestampccsg}|Vt|ts,td|jd|j|jx|jD]}t|tsZtd|jd|j|jt|jdkrtd|jdt|j|j|jd\}}|j|}|j|}|j ||fq4WdS)Nz!while constructing an ordered mapz!expected a sequence, but found %sz,expected a mapping of length 1, but found %srz2expected a single mapping item, but found %d itemsr) r#r'rrr2r3r)r"rr.)rrZomaprJr9r:r;r3r r r construct_yaml_omapRs$      z#SafeConstructor.construct_yaml_omapccsg}|Vt|ts,td|jd|j|jx|jD]}t|tsZtd|jd|j|jt|jdkrtd|jdt|j|j|jd\}}|j|}|j|}|j ||fq4WdS)Nzwhile constructing pairsz!expected a sequence, but found %sz,expected a mapping of length 1, but found %srz2expected a single mapping item, but found %d itemsr) r#r'rrr2r3r)r"rr.)rrr<rJr9r:r;r3r r r construct_yaml_pairshs$      z$SafeConstructor.construct_yaml_pairsccs$t}|V|j|}|j|dS)N)setr*update)rrrr3r r r construct_yaml_set}s z"SafeConstructor.construct_yaml_setcCs |j|S)N)r&)rrr r r construct_yaml_strsz"SafeConstructor.construct_yaml_strccsg}|V|j|j|dS)N)rFr()rrrr r r construct_yaml_seqsz"SafeConstructor.construct_yaml_seqccs"i}|V|j|}|j|dS)N)r*r)rrrr3r r r construct_yaml_maps z"SafeConstructor.construct_yaml_mapccsN|j|}|Vt|dr4|j|dd}|j|n|j|}|jj|dS)N __setstate__T)r/)__new__rmr*rr>r)rrr@rstater r r construct_yaml_objects    z%SafeConstructor.construct_yaml_objectcCstddd|j|jdS)Nz0could not determine a constructor for the tag %r)rrr)rrr r r construct_undefinedsz#SafeConstructor.construct_undefined)F)rr r r&rEr*rKrOrQrdrfrgrhrsrecompileXr~rrrrrrrrr __classcell__r r )r%r rs: #    ztag:yaml.org,2002:nullztag:yaml.org,2002:boolztag:yaml.org,2002:intztag:yaml.org,2002:floatztag:yaml.org,2002:binaryztag:yaml.org,2002:timestampztag:yaml.org,2002:omapztag:yaml.org,2002:pairsztag:yaml.org,2002:setztag:yaml.org,2002:strztag:yaml.org,2002:seqztag:yaml.org,2002:mapc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ d!ddZ ddZddZd"ddZdd ZdS)#rcCs |j|S)N)r&)rrr r r construct_python_strsz Constructor.construct_python_strcCs |j|S)N)r&)rrr r r construct_python_unicodesz$Constructor.construct_python_unicodecCsy|j|jd}Wn6tk rJ}ztddd||jWYdd}~XnXy"ttdrbtj|Stj|SWn8t j k r}ztddd||jWYdd}~XnXdS)Nriz,failed to convert base64 data into ascii: %srjz failed to decode base64 data: %s) r&rkrlrrrmrnrjrorprq)rrr3rrr r r construct_python_bytess  z"Constructor.construct_python_bytescCs |j|S)N)rd)rrr r r construct_python_longsz!Constructor.construct_python_longcCst|j|S)N)complexr&)rrr r r construct_python_complexsz$Constructor.construct_python_complexcCst|j|S)N)tupler()rrr r r construct_python_tuplesz"Constructor.construct_python_tuplecCsb|std|d|y t|Wn8tk rV}ztd|d||f|WYdd}~XnXtj|S)Nz"while constructing a Python modulez+expected non-empty name appended to the tagzcannot find module %r (%s))r __import__ ImportErrorsysmodules)rnamemarkrrr r r find_python_modules "zConstructor.find_python_modulecCs|std|d|d|kr,|jdd\}}nd}|}y t|Wn8tk rx}ztd|d||f|WYdd}~XnXtj|}t||std|d||jf|t||S)Nz"while constructing a Python objectz+expected non-empty name appended to the tag.rbuiltinszcannot find module %r (%s)zcannot find %r in the module %r) rrsplitrrrrrmrgetattr)rrrZ module_nameZ object_namerrmoduler r r find_python_names$ "  zConstructor.find_python_namecCs2|j|}|r$td|jd||j|j||jS)Nz while constructing a Python namez&expected the empty value, but found %r)r&rrr)rsuffixrr3r r r construct_python_names  z!Constructor.construct_python_namecCs2|j|}|r$td|jd||j|j||jS)Nz"while constructing a Python modulez&expected the empty value, but found %r)r&rrr)rrrr3r r r construct_python_modules  z#Constructor.construct_python_moduleNFcCsL|sg}|si}|j||j}|r>t|tr>|j|f||S|||SdS)N)rrr#typer)rrrargskwdsnewobjr@r r r make_python_instance"sz Constructor.make_python_instancecCst|dr|j|nji}t|tr8t|dkr8|\}}t|drP|jj|n|r^|j|x |jD]\}}tt ||qhWdS)NrrVr>) rmrr#rr"r>ritemssetattrobject)rinstancerZ slotstater;r3r r r set_python_instance_state.s    z%Constructor.set_python_instance_stateccs>|j||dd}|Vt|d}|j||d}|j||dS)NT)rr)r/)rrmr*r)rrrrr/rr r r construct_python_object<s  z#Constructor.construct_python_objectc Cst|tr*|j|dd}i}i}g}i}nJ|j|dd} | jdg}| jdi}| jdi}| jdg}| jdi}|j|||||} |r|j| ||r| j||rx|D]} || | | <qW| S)NT)r/rrr listitems dictitems)r#r'r(r*getrrrF) rrrrrrrrrr3rr;r r r construct_python_object_applyEs*         z)Constructor.construct_python_object_applycCs|j||ddS)NT)r)r)rrrr r r construct_python_object_newhsz'Constructor.construct_python_object_new)NNF)F)rr r rrrrrrrrrrrrrrrr r r r rs   #ztag:yaml.org,2002:python/noneztag:yaml.org,2002:python/boolztag:yaml.org,2002:python/strz tag:yaml.org,2002:python/unicodeztag:yaml.org,2002:python/bytesztag:yaml.org,2002:python/intztag:yaml.org,2002:python/longztag:yaml.org,2002:python/floatz tag:yaml.org,2002:python/complexztag:yaml.org,2002:python/listztag:yaml.org,2002:python/tupleztag:yaml.org,2002:python/dictztag:yaml.org,2002:python/name:z tag:yaml.org,2002:python/module:z tag:yaml.org,2002:python/object:z&tag:yaml.org,2002:python/object/apply:z$tag:yaml.org,2002:python/object/new:))__all__errorZnodesr6rrnrprrr+ZMarkedYAMLErrorrrrrArKrQrdrhrsrrrrrrrrrrrrrrrrBrrrrrr r r r s8PK!@BKK'__pycache__/reader.cpython-36.opt-1.pycnu[3 '%s' codec can't decode byte #x%02x: %s in "%s", position %dz8unacceptable character #x%04x: %s in "%s", position %d) isinstancerbytesr ordr rr )r r r r__str__!s zReaderError.__str__N)__name__ __module__ __qualname__rrr r r rrsc@sfeZdZddZdddZdddZdd d Zd d Zd dZe j dZ ddZ ddZ dddZdS)rcCsd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ t |t rnd|_|j||d|_nHt |trd|_||_|jn(||_t|dd|_d |_d|_|jdS) NrTzz rzF)rstreamstream_pointereofbufferpointer raw_buffer raw_decoder indexlinecolumnrstrcheck_printablerdetermine_encodinggetattr)r rr r rr;s2     zReader.__init__rc CsDy|j|j|Stk r>|j|d|j|j|SXdS)Nr)rr IndexErrorupdate)r r r r rpeekWs z Reader.peekrcCs4|j|t|jkr|j||j|j|j|S)N)rlenrr()r lengthr r rprefix^s z Reader.prefixcCs|j|dt|jkr&|j|dx|r|j|j}|jd7_|jd7_|dkst|dkr|j|jdkr|jd7_d|_n|dkr|jd7_|d8}q(WdS)Nru …

  ru)rr*rr(r r!r")r r+Zchr r rforwardcs zReader.forwardcCsF|jdkr(t|j|j|j|j|j|jSt|j|j|j|jddSdS)N)rrrr r!r"rr)r r r rget_markrs   zReader.get_markcCsx,|j r,|jdks"t|jdkr,|jqWt|jtr|jjtjrXtj |_ d|_ n,|jjtj rvtj |_ d|_ ntj|_ d|_ |jddS)Nz utf-16-lez utf-16-bezutf-8r)rrr* update_rawrr startswithcodecs BOM_UTF16_LEutf_16_le_decoderr BOM_UTF16_BEutf_16_be_decode utf_8_decoder()r r r rr%zs"  zReader.determine_encodingu[^ -~… -퟿-�]cCsP|jj|}|rL|j}|jt|j|j|j}t|j |t |dddS)NZunicodez"special characters are not allowed) NON_PRINTABLEsearchgroupr r*rrstartrrr)r datamatchrr r r rr$s  zReader.check_printablecCs6|jdkrdS|j|jd|_d|_xt|j|kr0|jsH|j|jdk ry|j|jd|j\}}Wqtk r}zP|j|j}|j dk r|j t|j|j}n|j}t |j |||j |jWYdd}~XqXn|j}t|}|j||j|7_|j|d|_|jr*|jd7_d|_Pq*WdS)Nrstrictr)rrrr*rr2rUnicodeDecodeErrorr=rrrrr r r$)r r+r>Z convertedexcrr r r rr(s6       z Reader.updatecCsL|jj|}|jdkr||_n|j|7_|jt|7_|sHd|_dS)NT)rreadrrr*r)r sizer>r r rr2s  zReader.update_rawN)r)r)r)rC)rrrrr)r,r/r0r%recompiler:r$r(r2r r r rr-s    ) __all__errorrrr4rFrobjectrr r r rsPK!v-22!__pycache__/tokens.cpython-36.pycnu[3 sz"Token.__repr__..z, csg|]}d|t|fqS)z%s=%r)getattr)r r )rrrr sz%s(%s))__dict__sortjoin __class____name__)rZ attributesZ argumentsr)rr__repr__s  zToken.__repr__N)r __module__ __qualname__rrrrrrrsrc@seZdZdZddZdS)DirectiveTokenz cCs||_||_||_||_dS)N)namevaluerr)rrrrrrrrrszDirectiveToken.__init__N)rrridrrrrrrsrc@seZdZdZdS)DocumentStartTokenzN)rrrrrrrrrsrc@seZdZdZdS)DocumentEndTokenzN)rrrrrrrrrsrc@seZdZdZdddZdS)StreamStartTokenzNcCs||_||_||_dS)N)rrencoding)rrrrrrrr!szStreamStartToken.__init__)NNN)rrrrrrrrrrsrc@seZdZdZdS)StreamEndTokenz N)rrrrrrrrr'src@seZdZdZdS)BlockSequenceStartTokenzN)rrrrrrrrr*src@seZdZdZdS)BlockMappingStartTokenzN)rrrrrrrrr-src@seZdZdZdS) BlockEndTokenz N)rrrrrrrrr 0sr c@seZdZdZdS)FlowSequenceStartToken[N)rrrrrrrrr!3sr!c@seZdZdZdS)FlowMappingStartToken{N)rrrrrrrrr#6sr#c@seZdZdZdS)FlowSequenceEndToken]N)rrrrrrrrr%9sr%c@seZdZdZdS)FlowMappingEndToken}N)rrrrrrrrr'<sr'c@seZdZdZdS)KeyToken?N)rrrrrrrrr)?sr)c@seZdZdZdS) ValueToken:N)rrrrrrrrr+Bsr+c@seZdZdZdS)BlockEntryToken-N)rrrrrrrrr-Esr-c@seZdZdZdS)FlowEntryToken,N)rrrrrrrrr/Hsr/c@seZdZdZddZdS) AliasTokenzcCs||_||_||_dS)N)rrr)rrrrrrrrMszAliasToken.__init__N)rrrrrrrrrr1Ksr1c@seZdZdZddZdS) AnchorTokenzcCs||_||_||_dS)N)rrr)rrrrrrrrTszAnchorToken.__init__N)rrrrrrrrrr2Rsr2c@seZdZdZddZdS)TagTokenzcCs||_||_||_dS)N)rrr)rrrrrrrr[szTagToken.__init__N)rrrrrrrrrr3Ysr3c@seZdZdZdddZdS) ScalarTokenzNcCs"||_||_||_||_||_dS)N)rplainrrstyle)rrr5rrr6rrrrbs zScalarToken.__init__)N)rrrrrrrrrr4`sr4N)objectrrrrrrrrr r!r#r%r'r)r+r-r/r1r2r3r4rrrrs(PK!abb(__pycache__/emitter.cpython-36.opt-1.pycnu[3 d?Z d@dAZ!dBdCZ"dDdEZ#dFdGZ$dHdIZ%dJdKZ&dLdMZ'dNdOZ(dPdQZ)dRdSZ*dTdUZ+dVdWZ,dXdYZ-dZd[Z.d\d]Z/d^d_Z0d`daZ1dbdcZ2dddeZ3ddfdgZ4dhdiZ5ddjdkZ6dldmZ7dndoZ8ddqdrZ9dsdtdudvdwdxdydzd{d|d}d~ddddZ:dddZ;ddZdddZ?dS)r!z!!)rztag:yaml.org,2002:NcCs||_d|_g|_|j|_g|_d|_g|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_||_||_d|_|rd|kodknr||_d|_|r||jdkr||_d|_|d kr||_d|_d|_d|_d|_d|_dS) NFTr P   )rrr)streamencodingstatesexpect_stream_startstateeventseventindentsindent flow_level root_contextsequence_contextmapping_contextsimple_key_contextlinecolumn whitespace indention open_ended canonical allow_unicode best_indent best_widthbest_line_break tag_prefixesprepared_anchor prepared_taganalysisstyle)rrr1r&widthr2Z line_breakr r r r&sDzEmitter.__init__cCsg|_d|_dS)N)r r")rr r r disposejszEmitter.disposecCs:|jj|x(|js4|jjd|_|jd|_qWdS)Nr)r#appendneed_more_eventspopr$r")rr$r r r emitos   z Emitter.emitcCsX|js dS|jd}t|tr(|jdSt|tr<|jdSt|trP|jdSdSdS)NTrrrF)r# isinstanceDocumentStartEvent need_eventsSequenceStartEventMappingStartEvent)rr$r r r r>xs       zEmitter.need_more_eventscCsxd}x`|jddD]N}t|ttfr0|d7}n&t|ttfrH|d8}nt|trVd}|dkrdSqWt|j|dkS)NrrF)r#rBrCCollectionStartEventDocumentEndEventZCollectionEndEventStreamEndEventlen)rcountlevelr$r r r rDs   zEmitter.need_eventsFcCsF|jj|j|jdkr.|r&|j|_qBd|_n|sB|j|j7_dS)Nr)r%r=r&r3)rflow indentlessr r r increase_indents  zEmitter.increase_indentcCsPt|jtr>|jjr,t|jd r,|jj|_|j|j|_nt d|jdS)Nrz%expected StreamStartEvent, but got %s) rBr$ZStreamStartEventrhasattrrwrite_stream_startexpect_first_document_startr"r)rr r r r!s   zEmitter.expect_stream_startcCstd|jdS)Nzexpected nothing, but got %s)rr$)rr r r expect_nothingszEmitter.expect_nothingcCs |jddS)NT)first)expect_document_start)rr r r rSsz#Emitter.expect_first_document_startc Csvt|jtr(|jjs|jjr8|jr8|jdd|j|jjrX|j|jj}|j ||j j |_ |jjrt |jjj}xB|D]:}|jj|}||j |<|j|}|j|}|j||qW|o|jj o|j o|jj o|jj o|j }|s|j|jdd|jr|j|j|_nJt|jtrd|jrR|jdd|j|j|j|_ntd|jdS)Nz...Tz---z'expected DocumentStartEvent, but got %s)rBr$rCversionZtagsr0write_indicator write_indentprepare_versionwrite_version_directiveDEFAULT_TAG_PREFIXEScopyr6sortedkeysprepare_tag_handleprepare_tag_prefixwrite_tag_directiveexplicitr1check_empty_documentexpect_document_rootr"rJwrite_stream_endrTr) rrU version_textZhandleshandleprefix handle_text prefix_textimplicitr r r rVsB             zEmitter.expect_document_startcCsTt|jtrB|j|jjr0|jdd|j|j|j|_nt d|jdS)Nz...Tz%expected DocumentEndEvent, but got %s) rBr$rIrYrcrX flush_streamrVr"r)rr r r expect_document_ends   zEmitter.expect_document_endcCs|jj|j|jdddS)NT)root)r r=rn expect_node)rr r r reszEmitter.expect_document_rootcCs||_||_||_||_t|jtr.|jnt|jtt fr|j d|j t|jtrf|j qt|jt r|js|js|jjs|jr|jq|jqt|jtr|js|js|jjs|jr|jq|jntd|jdS)N&zexpected NodeEvent, but got %s)r(r)r*r+rBr$ AliasEvent expect_alias ScalarEventrHprocess_anchor process_tag expect_scalarrEr'r1Z flow_stylecheck_empty_sequenceexpect_flow_sequenceexpect_block_sequencerFcheck_empty_mappingexpect_flow_mappingexpect_block_mappingr)rrosequencemapping simple_keyr r r rps,           zEmitter.expect_nodecCs.|jjdkrtd|jd|jj|_dS)Nz!anchor is not specified for aliasr)r$anchorrrur r?r")rr r r rss  zEmitter.expect_aliascCs0|jdd|j|jj|_|jj|_dS)NT)rN)rPprocess_scalarr%r?r&r r")rr r r rw s  zEmitter.expect_scalarcCs6|jdddd|jd7_|jdd|j|_dS)N[T)r.r)rN)rXr'rPexpect_first_flow_sequence_itemr")rr r r rys zEmitter.expect_flow_sequencecCsxt|jtr@|jj|_|jd8_|jdd|jj|_ n4|j sR|j |j krZ|j |jj|j|jdddS)Nr]FT)r~)rBr$SequenceEndEventr%r?r&r'rXr r"r1r-r4rYr=expect_flow_sequence_itemrp)rr r r rs   z'Emitter.expect_first_flow_sequence_itemcCst|jtrZ|jj|_|jd8_|jr@|jdd|j |jdd|j j|_ n@|jdd|jsx|j |j kr|j |j j|j|jdddS)Nr,FrT)r~)rBr$rr%r?r&r'r1rXrYr r"r-r4r=rrp)rr r r r$s     z!Emitter.expect_flow_sequence_itemcCs6|jdddd|jd7_|jdd|j|_dS)N{T)r.r)rN)rXr'rPexpect_first_flow_mapping_keyr")rr r r r|6s zEmitter.expect_flow_mappingcCst|jtr@|jj|_|jd8_|jdd|jj|_ nn|j sR|j |j krZ|j |j r|jr|jj|j|jdddn&|jdd|jj|j|jdddS)Nr}FT)rr?)r)rBr$MappingEndEventr%r?r&r'rXr r"r1r-r4rYcheck_simple_keyr= expect_flow_mapping_simple_valuerpexpect_flow_mapping_value)rr r r r<s    z%Emitter.expect_first_flow_mapping_keycCst|jtrZ|jj|_|jd8_|jr@|jdd|j |jdd|j j|_ nz|jdd|jsx|j |j kr|j |j r|jr|j j|j|jdddn&|jdd|j j|j|jdddS) NrrFrT)rrr)r)rBr$rr%r?r&r'r1rXrYr r"r-r4rr=rrpr)rr r r expect_flow_mapping_keyMs"      zEmitter.expect_flow_mapping_keycCs*|jdd|jj|j|jdddS)N:FT)r)rXr r=rrp)rr r r rbs z(Emitter.expect_flow_mapping_simple_valuecCsD|js|j|jkr|j|jdd|jj|j|jdddS)NrT)r) r1r-r4rYrXr r=rrp)rr r r rgs  z!Emitter.expect_flow_mapping_valuecCs(|jo |j }|jd|d|j|_dS)NF)rNrO)r*r/rP expect_first_block_sequence_itemr")rrOr r r rzpszEmitter.expect_block_sequencecCs |jddS)NT)rU)expect_block_sequence_item)rr r r rusz(Emitter.expect_first_block_sequence_itemcCsb| r,t|jtr,|jj|_|jj|_n2|j|j dddd|jj |j |j dddS)N-T)r/)r~) rBr$rr%r?r&r r"rYrXr=rrp)rrUr r r rxs z"Emitter.expect_block_sequence_itemcCs|jdd|j|_dS)NF)rN)rPexpect_first_block_mapping_keyr")rr r r r}s zEmitter.expect_block_mappingcCs |jddS)NT)rU)expect_block_mapping_key)rr r r rsz&Emitter.expect_first_block_mapping_keycCs| r,t|jtr,|jj|_|jj|_nX|j|j rZ|jj |j |j dddn*|j dddd|jj |j|j dddS)NT)rrr)r/)r)rBr$rr%r?r&r r"rYrr=!expect_block_mapping_simple_valuerprXexpect_block_mapping_value)rrUr r r rs z Emitter.expect_block_mapping_keycCs*|jdd|jj|j|jdddS)NrFT)r)rXr r=rrp)rr r r rs z)Emitter.expect_block_mapping_simple_valuecCs6|j|jdddd|jj|j|jdddS)NrT)r/)r)rYrXr r=rrp)rr r r rsz"Emitter.expect_block_mapping_valuecCs"t|jto |jo t|jdtS)Nr)rBr$rEr#r)rr r r rxszEmitter.check_empty_sequencecCs"t|jto |jo t|jdtS)Nr)rBr$rFr#r)rr r r r{szEmitter.check_empty_mappingcCsRt|jt s|j rdS|jd}t|toP|jdkoP|jdkoP|joP|jdkS)NFr) rBr$rCr#rtrtagrlvalue)rr$r r r rds  zEmitter.check_empty_documentcCs d}t|jtrD|jjdk rD|jdkr6|j|jj|_|t|j7}t|jttfr|jj dk r|j dkrz|j |jj |_ |t|j 7}t|jtr|j dkr|j |jj|_ |t|j j7}|dkot|jtpt|jtr|j j r|j j p|jp|jS)Nr)rBr$Z NodeEventrr7prepare_anchorrKrtrHrr8 prepare_tagr9analyze_scalarrr rrr rrxr{)rZlengthr r r rs$      zEmitter.check_simple_keycCsR|jjdkrd|_dS|jdkr0|j|jj|_|jrH|j||jdd|_dS)NT)r$rr7rrX)r indicatorr r r rus  zEmitter.process_anchorcCs|jj}t|jtr|jdkr(|j|_|j s8|dkrn|jdkrN|jjdsd|jdkrn|jjdrnd|_dS|jjdr|dkrd}d|_n"|j s|dkr|jjrd|_dS|dkrt d|jdkr|j ||_|jr|j |jdd|_dS)Nrrrrztag is not specifiedT) r$rrBrtr:choose_scalar_styler1rlr8rrrX)rrr r r rvs,     zEmitter.process_tagcCs|jdkr|j|jj|_|jjdks,|jr0dS|jj r|jjdr|joZ|jjpZ|jj r|j rl|jj s||j r|jj rdS|jjr|jjdkr|j r|j r|jj r|jjS|jj s|jjdkr|jjr|jo|jj rdSdS)N"rrz|>')r9rr$rr:r1rlr+r rr'rrrr)rr r r rs& zEmitter.choose_scalar_stylecCs|jdkr|j|jj|_|jdkr.|j|_|j }|jdkrR|j|jj|n`|jdkrn|j |jj|nD|jdkr|j |jjn*|jdkr|j |jjn|j |jj|d|_d|_dS)Nrr>|) r9rr$rr:rr+write_double_quotedr write_single_quoted write_folded write_literal write_plain)rsplitr r r rs        zEmitter.process_scalarcCs,|\}}|dkr td||fd||fS)Nrzunsupported YAML version: %d.%dz%d.%d)r)rrWmajorminorr r r rZszEmitter.prepare_versioncCs|s td|ddks$|ddkr0td|xt|ddD]d}d|koTdknpd|kold knpd |kod knp|d ks>td ||fq>W|S)Nztag handle must not be emptyrrrz*tag handle must start and end with '!': %r09AZazz-_z*invalid character %r in the tag handle: %rrGrG)r)rrhchr r r r`!s HzEmitter.prepare_tag_handlecCs|s tdg}d}}|ddkr(d}x|t|kr||}d|koPdknsd|kohdknsd |kod kns|d kr|d7}q*||kr|j||||d}}|jd }x|D]}|jd t|qWq*W||kr|j|||dj|S)Nztag prefix must not be emptyrrrrrrrrrz-;/?!:@&=+$,_.~*'()[]zutf-8z%%%02Xr)rrKr=encodeordjoin)rrichunksstartendrdatar r r ra-s( H     zEmitter.prepare_tag_prefixc Cs|s td|dkr|Sd}|}t|jj}xH|D]@}|j|r4|dksZt|t|kr4|j|}|t|d}q4Wg}d}}x|t|kr^||} d| kodknpd| kodknpd| kod knp| d kp| dko|dkr|d 7}q||kr$|j||||d }}| jd } x | D]} |jd t| q@WqW||kr||j|||dj |} |rd|| fSd| SdS)Nztag must not be emptyrrrrrrrrz-;/?:@&=+$,_.~*'()[]rzutf-8z%%%02Xrz%s%sz!<%s>) rr^r6r_ startswithrKr=rrr) rrrhsuffixprefixesrirrrrrZ suffix_textr r r rDs@   H        zEmitter.prepare_tagcCs~|s tdxl|D]d}d|ko(dknpdd|ko@dknpdd|koXdknpd|dkstd ||fqW|S) Nzanchor must not be emptyrrrrrrz-_z&invalid character %r in the anchor: %r)r)rrrr r r rhs HzEmitter.prepare_anchorc Cs|st|ddddddddSd}d}d}d}d}d}d}d} d} d} |jdsX|jdr`d}d}d} t|dkpz|ddk} d}d}d}x|t|krv||}|dkr|d krd}d}|d krd}| rd}|d kr| rd}d}n<|d krd}|d krd}| rd}|dkr | r d}d}|dkr.d}|dkpPd|koLdkns|dksd|kordknsd|kodknr|dkrd}|jsd}nd}|dkr|dkrd}|t|dkrd}|rd} d}d}nJ|dkr:|dkrd}|t|dkr&d} |r0d} d}d}nd}d}|d7}|dk} |dt|kpr||ddk} qWd}d}d}d}d}|s|s|s| rd}}|rd}| rd}}}| s|rd}}}}|rd}}|rd}|rd}t|d||||||dS)NTF)r r rrrrrrz---z...ru …

rz#,[]{}&*!|>'"%@`z?:rz,?[]{}r#u …

r ~… u퟿uu�u)r rrKr2)rr Zblock_indicatorsZflow_indicatorsZ line_breaksZspecial_characters leading_spaceZ leading_breakZtrailing_spaceZtrailing_breakZ break_spaceZ space_breakZpreceeded_by_whitespaceZfollowed_by_whitespaceZprevious_spaceZprevious_breakindexrZunicode_charactersrrrrrr r r rrs     &&&        zEmitter.analyze_scalarcCst|jdr|jjdS)Nflush)rQrr)rr r r rms zEmitter.flush_streamcCs*|jr&|jjdr&|jjdj|jdS)Nzutf-16u)rrrwriter)rr r r rRszEmitter.write_stream_startcCs |jdS)N)rm)rr r r rfszEmitter.write_stream_endcCsf|js | r|}nd|}||_|jo(||_|jt|7_d|_|jrV|j|j}|jj|dS)NrF) r.r/r-rKr0rrrr)rrZneed_whitespacer.r/rr r r rXs   zEmitter.write_indicatorcCs||jpd}|j s.|j|ks.|j|kr6|j r6|j|j|krxd|_d||j}||_|jrl|j|j}|jj|dS)NrTr) r&r/r-r.write_line_breakrrrr)rr&rr r r rY-s   zEmitter.write_indentcCsP|dkr|j}d|_d|_|jd7_d|_|jr@|j|j}|jj|dS)NTrr) r5r.r/r,r-rrrr)rrr r r r:s zEmitter.write_line_breakcCs2d|}|jr|j|j}|jj||jdS)Nz %%YAML %s)rrrrr)rrgrr r r r[Es   zEmitter.write_version_directivecCs6d||f}|jr|j|j}|jj||jdS)Nz %%TAG %s %s)rrrrr)rrjrkrr r r rbLs    zEmitter.write_tag_directiveTc Cs,|jddd}d}d}}x|t|krd}|t|krF||}|r|dksZ|dkr|d|kr|j|jkr|r|dkr|t|kr|jn<|||}|jt|7_|jr|j|j}|jj||}n|rH|dks|dkr||dkr|j x4|||D]$} | dkr*|j n |j | qW|j|}nj|dksf|d ksf|dkr||kr|||}|jt|7_|jr|j|j}|jj||}|dkrd }|jd 7_|jr|j|j}|jj||d}|dk r|dk}|dk}|d7}q W|jdddS) NrTFrrru …

ru …

z''r) rXrKr-r4rYrrrrr) rtextrspacesbreaksrrrrbrr r r rUsb                 zEmitter.write_single_quotedrrbtnvfrer\N_LP) r  rrrrru
u
cCs|jddd}}xt|t|krd}|t|kr>||}|dks|dksd|ko`dknp|jod|ko~dknpd |kod kn r||kr|||}|jt|7_|jr|j|j}|jj||}|dk r||jkrd |j|}n<|d kr&d t |}n$|dkr>dt |}n dt |}|jt|7_|jrp|j|j}|jj||d}d|kot|dknr|dks||kr|j|||j kr|r|||d }||kr|}|jt|7_|jr|j|j}|jj||j d|_ d|_ ||dkrd }|jt|7_|jrt|j|j}|jj||d7}qW|jdddS)NrTru "\…

rrru퟿uu�rÿz\x%02Xu￿z\u%04Xz\U%08XrF)rXrKr2r-rrrrESCAPE_REPLACEMENTSrr4rYr.r/)rrrrrrrr r r rsf            8      zEmitter.write_double_quotedcCs\d}|rX|ddkr"|t|j7}|d dkr8|d7}n t|dksP|d dkrX|d7}|S) Nrru …

ru …

rr+rG)strr3rK)rrhintsr r r determine_block_hintss   zEmitter.determine_block_hintsc Cs|j|}|jd|d|d ddkr0d|_|jd}d}d}d}}x|t|krd}|t|krv||}|r |dks|dkr| r|dk r|dkr||d kr|j|dk}x0|||D] } | d kr|jq|j| qW|dk r|j|}n|r|dkr|d|kr@|j|jkr@|jn>|||} |jt| 7_|jrr| j |j} |j j | |}nh|dks|d kr|||} |jt| 7_|jr| j |j} |j j | |dkr|j|}|dk r|dk}|dk}|d7}qPWdS) NrTrrFru …

rru …

rG) rrXr0rrKrYr-r4rrrr) rrrrrrrrrrrr r r rsb               zEmitter.write_foldedc Cs<|j|}|jd|d|dddkr0d|_|jd}d}}x|t|kr6d}|t|krl||}|r|dks|dkrx0|||D] }|dkr|jq|j|qW|dk r|j|}nR|dks|dkr|||}|jr|j|j}|jj ||dkr|j|}|dk r,|dk}|d7}qFWdS) NrTrrru …

rrG) rrXr0rrKrYrrrr) rrrrrrrrrr r r rs>        zEmitter.write_literalc Cs|jr d|_|sdS|jsNd}|jt|7_|jrB|j|j}|jj|d|_d|_ d}d}d}}x|t|kr d}|t|kr||}|r|dkr|d|kr|j|j kr|r|j d|_d|_ n>|||}|jt|7_|jr|j|j}|jj||}n|r|dkr||dkr@|j x4|||D]$} | dkrf|j n |j | qNW|j d|_d|_ |}nV|dks|dkr|||}|jt|7_|jr|j|j}|jj||}|dk r|dk}|dk}|d7}qnWdS) NTrFrru …

ru …

) r(r0r.r-rKrrrrr/r4rYr) rrrrrrrrrrr r r r7sl              zEmitter.write_plain)NNNNN)FF)F)FFFF)F)F)FF)N)T)T)T)@rrrr\rr<r@r>rDrPr!rTrSrVrnrerprsrwryrrr|rrrrrzrrr}rrrrrxr{rdrrurvrrrZr`rarrrrmrRrfrXrYrr[rbrrrrrrrr r r r rs C     $        $ "   7 6 6#N)__all__errorrr#rr rr r r r  s  PK! __pycache__/nodes.cpython-36.pycnu[3 s  PK!D`i %__pycache__/serializer.cpython-36.pycnu[3             zSerializer.serialize_node)NNNNN) rrrr)rrrr!rr"rr r r r r s   N)__all__errorrZeventsZnodesrrr r r r s  PK!@BKK!__pycache__/reader.cpython-36.pycnu[3 '%s' codec can't decode byte #x%02x: %s in "%s", position %dz8unacceptable character #x%04x: %s in "%s", position %d) isinstancerbytesr ordr rr )r r r r__str__!s zReaderError.__str__N)__name__ __module__ __qualname__rrr r r rrsc@sfeZdZddZdddZdddZdd d Zd d Zd dZe j dZ ddZ ddZ dddZdS)rcCsd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ t |t rnd|_|j||d|_nHt |trd|_||_|jn(||_t|dd|_d |_d|_|jdS) NrTzz rzF)rstreamstream_pointereofbufferpointer raw_buffer raw_decoder indexlinecolumnrstrcheck_printablerdetermine_encodinggetattr)r rr r rr;s2     zReader.__init__rc CsDy|j|j|Stk r>|j|d|j|j|SXdS)Nr)rr IndexErrorupdate)r r r r rpeekWs z Reader.peekrcCs4|j|t|jkr|j||j|j|j|S)N)rlenrr()r lengthr r rprefix^s z Reader.prefixcCs|j|dt|jkr&|j|dx|r|j|j}|jd7_|jd7_|dkst|dkr|j|jdkr|jd7_d|_n|dkr|jd7_|d8}q(WdS)Nru …

  ru)rr*rr(r r!r")r r+Zchr r rforwardcs zReader.forwardcCsF|jdkr(t|j|j|j|j|j|jSt|j|j|j|jddSdS)N)rrrr r!r"rr)r r r rget_markrs   zReader.get_markcCsx,|j r,|jdks"t|jdkr,|jqWt|jtr|jjtjrXtj |_ d|_ n,|jjtj rvtj |_ d|_ ntj|_ d|_ |jddS)Nz utf-16-lez utf-16-bezutf-8r)rrr* update_rawrr startswithcodecs BOM_UTF16_LEutf_16_le_decoderr BOM_UTF16_BEutf_16_be_decode utf_8_decoder()r r r rr%zs"  zReader.determine_encodingu[^ -~… -퟿-�]cCsP|jj|}|rL|j}|jt|j|j|j}t|j |t |dddS)NZunicodez"special characters are not allowed) NON_PRINTABLEsearchgroupr r*rrstartrrr)r datamatchrr r r rr$s  zReader.check_printablecCs6|jdkrdS|j|jd|_d|_xt|j|kr0|jsH|j|jdk ry|j|jd|j\}}Wqtk r}zP|j|j}|j dk r|j t|j|j}n|j}t |j |||j |jWYdd}~XqXn|j}t|}|j||j|7_|j|d|_|jr*|jd7_d|_Pq*WdS)Nrstrictr)rrrr*rr2rUnicodeDecodeErrorr=rrrrr r r$)r r+r>Z convertedexcrr r r rr(s6       z Reader.updatecCsL|jj|}|jdkr||_n|j|7_|jt|7_|sHd|_dS)NT)rreadrrr*r)r sizer>r r rr2s  zReader.update_rawN)r)r)r)rC)rrrrr)r,r/r0r%recompiler:r$r(r2r r r rr-s    ) __all__errorrrr4rFrobjectrr r r rsPK!!F###__pycache__/__init__.cpython-36.pycnu[3 sr>cCs|j||dS)z 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. N)add_multi_representer)r?Zmulti_representerrrrr r@ sr@cs eZdZdZfddZZS)YAMLObjectMetaclassz' The metaclass for YAMLObject. csNtt|j|||d|krJ|ddk rJ|jj|j|j|jj||j dS)Nyaml_tag) superrA__init__ yaml_loaderr;rB from_yaml yaml_dumperr>to_yaml)clsnamebasesr,) __class__rr rDszYAMLObjectMetaclass.__init__)__name__ __module__ __qualname____doc__rD __classcell__rr)rLr rAsrAc@s<eZdZdZfZeZeZdZ dZ e ddZ e ddZ dS) YAMLObjectza An object that can dump itself to a YAML stream and load itself from a YAML stream. NcCs |j||S)zC Convert a representation node to a Python object. )Zconstruct_yaml_object)rIrr*rrr rF*szYAMLObject.from_yamlcCs|j|j|||jdS)zC Convert a Python object to a representation node. )Z flow_style)Zrepresent_yaml_objectrByaml_flow_style)rIrr0rrr rH1s zYAMLObject.to_yaml)rMrNrOrP __slots__rrErrGrBrS classmethodrFrHrrrr rRs rR) metaclass)N)N)%errortokensrr)rr __version__ZcyamlZ__with_libyaml__ ImportErrorrrr r r r rrrrrrr+r'r1r2r4r5r6r9r;r=r>r@typerArRrrrr s^        PK!!F##)__pycache__/__init__.cpython-36.opt-1.pycnu[3 sr>cCs|j||dS)z 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. N)add_multi_representer)r?Zmulti_representerrrrr r@ sr@cs eZdZdZfddZZS)YAMLObjectMetaclassz' The metaclass for YAMLObject. csNtt|j|||d|krJ|ddk rJ|jj|j|j|jj||j dS)Nyaml_tag) superrA__init__ yaml_loaderr;rB from_yaml yaml_dumperr>to_yaml)clsnamebasesr,) __class__rr rDszYAMLObjectMetaclass.__init__)__name__ __module__ __qualname____doc__rD __classcell__rr)rLr rAsrAc@s<eZdZdZfZeZeZdZ dZ e ddZ e ddZ dS) YAMLObjectza An object that can dump itself to a YAML stream and load itself from a YAML stream. NcCs |j||S)zC Convert a representation node to a Python object. )Zconstruct_yaml_object)rIrr*rrr rF*szYAMLObject.from_yamlcCs|j|j|||jdS)zC Convert a Python object to a representation node. )Z flow_style)Zrepresent_yaml_objectrByaml_flow_style)rIrr0rrr rH1s zYAMLObject.to_yaml)rMrNrOrP __slots__rrErrGrBrS classmethodrFrHrrrr rRs rR) metaclass)N)N)%errortokensrr)rr __version__ZcyamlZ__with_libyaml__ ImportErrorrrr r r r rrrrrrr+r'r1r2r4r5r6r9r;r=r>r@typerArRrrrr s^        PK!XG.G.!__pycache__/parser.cpython-36.pycnu[3 Z d?d@Z!dAdBZ"dCS)Gr!ztag:yaml.org,2002:)r z!!cCs*d|_d|_i|_g|_g|_|j|_dS)N) current_event yaml_version tag_handlesstatesmarksparse_stream_startstate)selfr r r __init__Qs zParser.__init__cCsg|_d|_dS)N)rr)rr r r disposeYszParser.disposecGsN|jdkr|jr|j|_|jdk rJ|s,dSx|D]}t|j|r2dSq2WdS)NTF)r r isinstance)rchoicesZchoicer r r check_event^s     zParser.check_eventcCs |jdkr|jr|j|_|jS)N)r r)rr r r peek_eventks  zParser.peek_eventcCs*|jdkr|jr|j|_|j}d|_|S)N)r r)rvaluer r r get_eventrs   zParser.get_eventcCs(|j}t|j|j|jd}|j|_|S)N)encoding) get_tokenZStreamStartEvent start_markend_markrparse_implicit_document_startr)rtokeneventr r r rs   zParser.parse_stream_startcCs\|jtttsP|j|_|j}|j}}t||dd}|j j |j |j |_ |S|jSdS)NF)explicit) check_tokenDirectiveTokenDocumentStartTokenStreamEndToken DEFAULT_TAGSr peek_tokenrDocumentStartEventrappendparse_document_endparse_block_noderparse_document_start)rr!rrr"r r r r s z$Parser.parse_implicit_document_startcCsx|jtr|jqW|jts|j}|j}|j\}}|jtsdtddd|jj |jj|j}|j }t ||d||d}|j j |j|j|_n4|j}t|j|j }|j st|j std|_|S)Nz)expected '', but found %rT)r#versiontags)r$DocumentEndTokenrr'r)rprocess_directivesr&ridrr*rr+r,parse_document_contentrZStreamEndEventAssertionErrorr)rr!rr/r0rr"r r r r.s.           zParser.parse_document_startcCsL|j}|j}}d}|jtr2|j}|j}d}t|||d}|j|_|S)NFT)r#) r)rr$r1rrZDocumentEndEventr.r)rr!rrr#r"r r r r,s  zParser.parse_document_endcCs<|jttttr0|j|jj}|jj |_ |S|j SdS)N) r$r%r&r1r'process_empty_scalarr)rrpoprr-)rr"r r r r4s   zParser.parse_document_contentcCsd|_i|_x|jtr|j}|jdkrp|jdk rDtddd|j|j\}}|dkrftddd|j|j|_q|jdkr|j\}}||jkrtddd||j||j|<qW|jr|j|jj f}n |jdf}x(|j D]}||jkr|j ||j|<qW|S)NZYAMLzfound duplicate YAML directiverz:found incompatible YAML document (version 1.* is required)ZTAGzduplicate tag handle %r) r rr$r%rnamerrrcopyr()rr!majorminorhandleprefixrkeyr r r r2s8            zParser.process_directivescCs |jddS)NT)block) parse_node)rr r r r-szParser.parse_block_nodecCs|jS)N)r@)rr r r parse_flow_node szParser.parse_flow_nodecCs|jdddS)NT)r?indentless_sequence)r@)rr r r 'parse_block_node_or_indentless_sequencesz.Parser.parse_block_node_or_indentless_sequenceFc CsR|jtr4|j}t|j|j|j}|jj|_ nd}d}d}}} |jt r|j}|j}|j}|j}|jt r|j}|j} |j}|j}nF|jt r|j}|j}} |j}|j}|jt r|j}|j}|j}|dk r&|\} } | dk r"| |j krt d|d| | |j | | }n| }|dkr>|jj}}d}|dkpR|dk} |r|jtr|jj}t||| ||}|j|_ n|jtr|j}|j}|jr|dks|dkrd } n|dkrd} nd} t||| |j|||jd}|jj|_ nH|jtr<|jj}t||| ||dd}|j|_ n|jtrp|jj}t||| ||dd}|j|_ n|r|jtr|jj}t||| ||dd}|j|_ n|r|jtr|jj}t||| ||dd}|j|_ nj|dk s|dk rt||| dfd||}|jj|_ n2|r(d } nd } |j}t d | |d |j|j|S)Nzwhile parsing a nodezfound undefined tag handle %rr TF)style) flow_styler?Zflowzwhile parsing a %s nodez'expected the node content, but found %r)TF)FT)FF) r$Z AliasTokenrZ AliasEventrrrrr7rZ AnchorTokenZTagTokenrrr)BlockEntryTokenZSequenceStartEventparse_indentless_sequence_entryZ ScalarTokenZplain ScalarEventrDZFlowSequenceStartTokenparse_flow_sequence_first_entryZFlowMappingStartTokenMappingStartEventparse_flow_mapping_first_keyZBlockSequenceStartToken parse_block_sequence_first_entryZBlockMappingStartTokenparse_block_mapping_first_keyr3)rr?rBr!r"ZanchortagrrZtag_markr<suffixZimplicitZnoder r r r@s                               zParser.parse_nodecCs|j}|jj|j|jS)N)rrr+rparse_block_sequence_entry)rr!r r r rMxsz'Parser.parse_block_sequence_first_entrycCs|jtrH|j}|jtts4|jj|j|jS|j|_|j |j S|jtsv|j }t d|j dd|j|j|j}t|j|j }|jj|_|j j|S)Nz while parsing a block collectionrz"expected , but found %r)r$rGr BlockEndTokenrr+rQr-rr6rr)rrr3rSequenceEndEventr7)rr!r"r r r rQ}s        z!Parser.parse_block_sequence_entrycCsr|jtrL|j}|jtttts8|jj|j|j S|j|_ |j |j S|j }t|j|j}|jj|_ |S)N)r$rGrKeyToken ValueTokenrSrr+rHr-rr6rr)rTrr7)rr!r"r r r rHs    z&Parser.parse_indentless_sequence_entrycCs|j}|jj|j|jS)N)rrr+rparse_block_mapping_key)rr!r r r rNsz$Parser.parse_block_mapping_first_keycCs|jtrJ|j}|jttts6|jj|j|jS|j|_ |j |j S|jtsx|j }t d|jdd|j|j|j}t|j|j }|jj|_ |jj|S)Nzwhile parsing a block mappingrz"expected , but found %rrR)r$rUrrVrSrr+parse_block_mapping_valuerCrr6rr)rrr3rMappingEndEventr7)rr!r"r r r rWs       zParser.parse_block_mapping_keycCsl|jtrL|j}|jttts6|jj|j|jS|j|_ |j |j Sn|j|_ |j }|j |j SdS)N)r$rVrrUrSrr+rWrCrr6rr)r)rr!r r r rXs z Parser.parse_block_mapping_valuecCs"|j}|jj|j|jddS)NT)first)rrr+rparse_flow_sequence_entry)rr!r r r rJsz&Parser.parse_flow_sequence_first_entrycCs|jts|sF|jtr"|jn$|j}td|jdd|j|j|jt r||j}t ddd|j|j dd}|j |_ |S|jts|jj|j|jS|j}t|j|j }|jj|_ |jj|S)Nzwhile parsing a flow sequencerzexpected ',' or ']', but got %rT)rErR)r$FlowSequenceEndTokenFlowEntryTokenrr)rrr3rrUrKr%parse_flow_sequence_entry_mapping_keyrrr+r[rArTr7)rrZr!r"r r r r[s,        z Parser.parse_flow_sequence_entrycCsD|j}|jttts,|jj|j|jS|j|_ |j |j SdS)N) rr$rVr]r\rr+'parse_flow_sequence_entry_mapping_valuerArr6r)rr!r r r r^sz,Parser.parse_flow_sequence_entry_mapping_keycCsj|jtrJ|j}|jtts4|jj|j|jS|j|_ |j |j Sn|j|_ |j }|j |j SdS)N)r$rVrr]r\rr+%parse_flow_sequence_entry_mapping_endrArr6rr)r)rr!r r r r_s  z.Parser.parse_flow_sequence_entry_mapping_valuecCs|j|_|j}t|j|jS)N)r[rr)rYr)rr!r r r r`sz,Parser.parse_flow_sequence_entry_mapping_endcCs"|j}|jj|j|jddS)NT)rZ)rrr+rparse_flow_mapping_key)rr!r r r rLsz#Parser.parse_flow_mapping_first_keycCs|jts|sF|jtr"|jn$|j}td|jdd|j|j|jt r|j}|jt tts||j j |j |jS|j |_|j|jSn |jts|j j |j|jS|j}t|j|j}|j j|_|jj|S)Nzwhile parsing a flow mappingrzexpected ',' or '}', but got %rrR)r$FlowMappingEndTokenr]rr)rrr3rrUrVrr+parse_flow_mapping_valuerArr6rparse_flow_mapping_empty_valuerYr7)rrZr!r"r r r ras.        zParser.parse_flow_mapping_keycCsj|jtrJ|j}|jtts4|jj|j|jS|j|_ |j |j Sn|j|_ |j }|j |j SdS)N)r$rVrr]rbrr+rarArr6rr)r)rr!r r r rc9s  zParser.parse_flow_mapping_valuecCs|j|_|j|jjS)N)rarr6r)r)rr r r rdGsz%Parser.parse_flow_mapping_empty_valuecCstdddd||S)NTFrF)TF)rI)rZmarkr r r r6KszParser.process_empty_scalarN)FF)F)F)#rrrr(rrrrrrr r.r,r4r2r-rArCr@rMrQrHrNrWrXrJr[r^r_r`rLrarcrdr6r r r r rHsB    / g    N)__all__errorrtokensZeventsscannerrrr r r r >s  PK!Jeee"__pycache__/scanner.cpython-36.pycnu[3 Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUdVZ-dWdXZ.dYdZZ/d[d\Z0d]d^Z1d_d`Z2dadbZ3dcddZ4dedfZ5dgdhZ6didjZ7dkdlZ8dmdnZ9dodpZ:dqdrZ;dsdtZdydzZ?d{d|Z@d}d~ddddddddddddddddZAddddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKdS)rcCs<d|_d|_g|_|jd|_d|_g|_d|_i|_dS)zInitialize the scanner.FrTN) done flow_leveltokensfetch_stream_start tokens_takenindentindentsallow_simple_keypossible_simple_keys)rr r r r0s zScanner.__init__cGsJx|jr|jqW|jrF|s$dSx |D]}t|jd|r*dSq*WdS)NTrF)need_more_tokensfetch_more_tokensr isinstance)rchoicesZchoicer r r check_tokenqs   zScanner.check_tokencCs*x|jr|jqW|jr&|jdSdS)Nr)rr r)rr r r peek_token}s  zScanner.peek_tokencCs:x|jr|jqW|jr6|jd7_|jjdSdS)Nrr)rr rrpop)rr r r get_tokens   zScanner.get_tokencCs2|jr dS|jsdS|j|j|jkr.dSdS)NFT)rrstale_possible_simple_keysnext_possible_simple_keyr)rr r r rszScanner.need_more_tokenscCs|j|j|j|j|j}|dkr4|jS|dkrL|jrL|jS|dkrd|jrd|j S|dkr||j r||j S|dkr|j S|dkr|j S|dkr|jS|dkr|jS|d kr|jS|dkr|jr|jS|d kr|jr|jS|d kr|jr|jS|d kr*|jS|d kr<|jS|dkrN|jS|dkrj|j rj|jS|dkr|j r|jS|dkr|jS|dkr|jS|jr|j St!ddd||j"dS)N%-.[{]},?:r&!|>'"z!while scanning for the next tokenz.found character %r that cannot start any token)#scan_to_next_tokenr' unwind_indentrpeekfetch_stream_endcheck_directivefetch_directivecheck_document_startfetch_document_startcheck_document_endfetch_document_endfetch_flow_sequence_startfetch_flow_mapping_startfetch_flow_sequence_endfetch_flow_mapping_endfetch_flow_entrycheck_block_entryfetch_block_entry check_key fetch_key check_value fetch_value fetch_alias fetch_anchor fetch_tagr fetch_literal fetch_folded fetch_single fetch_double check_plain fetch_plainrget_mark)rchr r r r s^        zScanner.fetch_more_tokenscCs:d}x0|jD]&}|j|}|dks,|j|kr |j}q W|S)N)rr )rZmin_token_numberlevelkeyr r r r(s    z Scanner.next_possible_simple_keycCs`xZt|jD]L}|j|}|j|jks6|j|jdkr |jrPtd|jd|j|j|=q WdS)Nizwhile scanning a simple keyzcould not find expected ':')listrrrr rrrX)rrZr[r r r r's   z"Scanner.stale_possible_simple_keyscCs^|j o|j|jk}|jrZ|j|jt|j}t|||j |j |j|j }||j |j<dS)N) rrrrremove_possible_simple_keyrlenrr rrrXr)rr r r[r r r save_possible_simple_key$sz Scanner.save_possible_simple_keycCs@|j|jkr<|j|j}|jr2td|jd|j|j|j=dS)Nzwhile scanning a simple keyzcould not find expected ':')rrr rrrX)rr[r r r r]5s    z"Scanner.remove_possible_simple_keycCsD|jr dSx4|j|kr>|j}|jj|_|jjt||q WdS)N)rrrXrr%rappendZ BlockEndToken)rrrr r r r;Bs   zScanner.unwind_indentcCs&|j|kr"|jj|j||_dSdS)NTF)rrr`)rrr r r add_indentZs  zScanner.add_indentcCs$|j}|jjt|||jddS)N)encoding)rXrr`ZStreamStartTokenrb)rrr r r rds zScanner.fetch_stream_startcCsB|jd|jd|_i|_|j}|jjt||d|_dS)NrFTr) r;r]rrrXrr`ZStreamEndTokenr)rrr r r r=ps zScanner.fetch_stream_endcCs,|jd|jd|_|jj|jdS)NrFr)r;r]rrr`scan_directive)rr r r r?s zScanner.fetch_directivecCs|jtdS)N)fetch_document_indicatorZDocumentStartToken)rr r r rAszScanner.fetch_document_startcCs|jtdS)N)rdZDocumentEndToken)rr r r rCszScanner.fetch_document_endcCsH|jd|jd|_|j}|jd|j}|jj|||dS)NrFr)r;r]rrXforwardrr`)r TokenClass start_markend_markr r r rds  z Scanner.fetch_document_indicatorcCs|jtdS)N)fetch_flow_collection_startZFlowSequenceStartToken)rr r r rDsz!Scanner.fetch_flow_sequence_startcCs|jtdS)N)rjZFlowMappingStartToken)rr r r rEsz Scanner.fetch_flow_mapping_startcCsJ|j|jd7_d|_|j}|j|j}|jj|||dS)NrT)r_rrrXrfrr`)rrgrhrir r r rjsz#Scanner.fetch_flow_collection_startcCs|jtdS)N)fetch_flow_collection_endZFlowSequenceEndToken)rr r r rFszScanner.fetch_flow_sequence_endcCs|jtdS)N)rkZFlowMappingEndToken)rr r r rGszScanner.fetch_flow_mapping_endcCsJ|j|jd8_d|_|j}|j|j}|jj|||dS)NrF)r]rrrXrfrr`)rrgrhrir r r rksz!Scanner.fetch_flow_collection_endcCs<d|_|j|j}|j|j}|jjt||dS)NT)rr]rXrfrr`ZFlowEntryToken)rrhrir r r rHs zScanner.fetch_flow_entrycCs|jsF|jstddd|j|j|jrF|j}|jjt||nd|_|j |j}|j |j}|jjt ||dS)Nz%sequence entries are not allowed hereT) rrrrXrarrr`ZBlockSequenceStartTokenr]rfZBlockEntryToken)rrrhrir r r rJs  zScanner.fetch_block_entrycCs|jsD|jstddd|j|j|jrD|j}|jjt|||j |_|j |j}|j |j}|jjt ||dS)Nz!mapping keys are not allowed here) rrrrXrarrr`BlockMappingStartTokenr]rfKeyToken)rrrhrir r r rLs   zScanner.fetch_keycCs|j|jkr||j|j}|j|j=|jj|j|jt|j|j|jst|j|j rt|jj|j|jt |j|jd|_ n\|js|j st ddd|j |js|j|j r|j }|jjt |||j |_ |j|j }|j|j }|jjt||dS)NFz#mapping values are not allowed here)rrrinsertr rrmrrarrlrrrXr`r]rfZ ValueToken)rr[rrhrir r r rNs2       zScanner.fetch_valuecCs$|jd|_|jj|jtdS)NF)r_rrr` scan_anchorZ AliasToken)rr r r rOVszScanner.fetch_aliascCs$|jd|_|jj|jtdS)NF)r_rrr`roZ AnchorToken)rr r r rPaszScanner.fetch_anchorcCs"|jd|_|jj|jdS)NF)r_rrr`scan_tag)rr r r rQlszScanner.fetch_tagcCs|jdddS)Nr6)style)fetch_block_scalar)rr r r rRwszScanner.fetch_literalcCs|jdddS)Nr7)rq)rr)rr r r rSzszScanner.fetch_foldedcCs$d|_|j|jj|j|dS)NT)rr]rr`scan_block_scalar)rrqr r r rr}szScanner.fetch_block_scalarcCs|jdddS)Nr8)rq)fetch_flow_scalar)rr r r rTszScanner.fetch_singlecCs|jdddS)Nr9)rq)rt)rr r r rUszScanner.fetch_doublecCs$|jd|_|jj|j|dS)NF)r_rrr`scan_flow_scalar)rrqr r r rtszScanner.fetch_flow_scalarcCs"|jd|_|jj|jdS)NF)r_rrr` scan_plain)rr r r rWszScanner.fetch_plaincCs|jdkrdSdS)NrT)r)rr r r r>s zScanner.check_directivecCs.|jdkr*|jddkr*|jddkr*dSdS)Nrrez---u …

T)rprefixr<)rr r r r@s zScanner.check_document_startcCs.|jdkr*|jddkr*|jddkr*dSdS)Nrrez...u …

T)rrwr<)rr r r rBs zScanner.check_document_endcCs|jddkS)Nru …

)r<)rr r r rIszScanner.check_block_entrycCs|jr dS|jddkSdS)NTru …

)rr<)rr r r rKszScanner.check_keycCs|jr dS|jddkSdS)NTru …

)rr<)rr r r rMszScanner.check_valuecCs6|j}|dkp4|jddko4|dkp4|j o4|dkS)Nu …

-?:,[]{}#&*!|>'"%@`ru …

r+z?:)r<r)rrYr r r rVszScanner.check_plaincCs|jdkr|jdkr|jd}xb|sx|jdkr@|jq*W|jdkrhx|jdkrf|jqPW|jr~|jsd|_q$d}q$WdS)NruF #u …

T)rr<rfscan_line_breakrr)rfoundr r r r:s   zScanner.scan_to_next_tokencCs|j}|j|j|}d}|dkr:|j|}|j}n>|dkrV|j|}|j}n"|j}x|jdkrv|jq`W|j|t||||S)NZYAMLZTAGu …

)rXrfscan_directive_namescan_yaml_directive_valuescan_tag_directive_valuer<scan_directive_ignored_lineZDirectiveToken)rrhnamevaluerir r r rcs       zScanner.scan_directivecCsd}|j|}xfd|ko"dkns`d|ko:dkns`d|koRdkns`|dkrt|d 7}|j|}qW|std |d ||j|j|}|j||j}|d krtd |d ||j|S) Nr09AZazz-_rzwhile scanning a directivez6expected alphabetic or numeric character, but found %ru …

)r<rrXrwrf)rrhlengthrYrr r r r|#s$ J  zScanner.scan_directive_namecCsx|jdkr|jqW|j|}|jdkrJtd|d|j|j|j|j|}|jdkrtd|d|j|j||fS)Nrxr,zwhile scanning a directivez%expected a digit or '.', but found %ru …

z%expected a digit or ' ', but found %r)r<rfscan_yaml_directive_numberrrX)rrhmajorminorr r r r}8s         z!Scanner.scan_yaml_directive_valuecCs|j}d|kodkns6td|d||jd}x*d|j|koTdknrd|d7}q|jq(W|j}|dkrftd|d||j|jdS)Nrxryu …

zwhile scanning a directivez0expected a comment or a line break, but found %r)r<rfrrXrz)rrhrYr r r rrs   z#Scanner.scan_directive_ignored_linec Cs|j}|j}|dkrd}nd}|jd}|j|}xfd|koLdknsd|koddknsd |ko|d kns|d kr|d 7}|j|}q:W|std ||d||j|j|}|j||j}|dkrtd ||d||j|j}||||S)NraliasZanchorrrrrrrrz-_rzwhile scanning an %sz6expected alphabetic or numeric character, but found %ru …

?:,]}%@`)rXr<rfrrw) rrgrhZ indicatorrrrYrrir r r ros2  J    zScanner.scan_anchorc Cs&|j}|jd}|dkrdd}|jd|jd|}|jdkrZtd|d|j|j|jn~|dkr~d}d }|jndd}d }x,|d kr|d krd }P|d7}|j|}qWd }|r|jd|}n d }|j|jd|}|j}|d kr td |d||j||f}|j}t|||S)Nr<tagr7zwhile parsing a tagzexpected '>', but found %ru …

r5Fu …

Tzwhile scanning a tagzexpected ' ', but found %r)rXr<rfrrrZTagToken) rrhrYrsuffixrZ use_handlerrir r r rpsH           zScanner.scan_tagcCs|dkrd}nd}g}|j}|j|j|\}}|j||jd}|dkrTd}|dkrv|j\}} } t|| } n||d} |j| \}} d} x|j| ko|j dkrt|j ||j dk} d}x|j |d kr|d7}qW|j |j ||j||j } |j| \}} |j| krp|j dkrp|rd| d krd| rd|j dkrd|sn|j d n |j | qPqW|dk r|j | |dkr|j |tdj|d|| |S) Nr7TFrr)z ru …

 rx)rXrfscan_block_scalar_indicatorsscan_block_scalar_ignored_linerscan_block_scalar_indentationmaxscan_block_scalar_breaksrr<extendr`rwrz ScalarTokenjoin)rrqZfoldedchunksrhchomping incrementZ min_indentbreaks max_indentrir line_breakZleading_non_spacerr r r rssP              zScanner.scan_block_scalarcCsd}d}|j}|dkrn|dkr&d}nd}|j|j}|dkrt|}|dkrdtd|d|j|jn\|dkrt|}|dkrtd|d|j|j|j}|dkr|dkrd}nd}|j|j}|d krtd|d ||j||fS) Nz+-+TF 0123456789rzwhile scanning a block scalarz|jq(W|j}|dkrftd|d||j|jdS)Nrxryu …

zwhile scanning a block scalarz0expected a comment or a line break, but found %r)r<rfrrXrz)rrhrYr r r rAs    z&Scanner.scan_block_scalar_ignored_linecCshg}d}|j}xL|jdkr\|jdkrB|j|j|j}q|j|j|kr|j}qW|||fS)Nru …

rx)rXr<r`rzrfr)rrrrir r r rOs    z%Scanner.scan_block_scalar_indentationcCsg}|j}x"|j|kr.|jdkr.|jqWxJ|jdkrz|j|j|j}x"|j|krv|jdkrv|jqVWq2W||fS)Nrxu …

)rXrr<rfr`rz)rrrrir r r r^s z Scanner.scan_block_scalar_breakscCs|dkrd}nd}g}|j}|j}|j|j|j||x4|j|krt|j|j|||j|j||qBW|j|j}tdj|d|||S)Nr9TFr)rXr<rfrscan_flow_scalar_non_spacesscan_flow_scalar_spacesrr)rrqdoublerrhZquoterir r r rukszScanner.scan_flow_scalarr) r   rxr9\… u
u
)rrbtrnvfrerxr9rN_LPr)xuUcCsg}xd}x|j|dkr&|d7}qW|rF|j|j||j||j}| r|dkr|jddkr|jd|jdq|r|dks| r|dkr|j||jq|o|dkr|j|j}||jkr|j|j||jn||jkr||j|}|jxBt|D]6}|j|dkrtd |d ||j|f|jqWt |j|d }|jt ||j|n<|d kr|j |j |j ||ntd |d ||jq|SqWdS)Nru'"\ …

rr8rz"\r0123456789ABCDEFabcdefz%while scanning a double-quoted scalarz?expected escape sequence of %d hexdecimal numbers, but found %ru …

z!found unknown escape character %r)r<r`rwrfESCAPE_REPLACEMENTS ESCAPE_CODESrangerrXrchrrzrscan_flow_scalar_breaks)rrrhrrrYkcoder r r rsL            z#Scanner.scan_flow_scalar_non_spacesc Csg}d}x|j|dkr"|d7}q W|j|}|j||j}|dkr\td|d|jnT|dkr|j}|j||}|dkr|j|n|s|jd |j|n |j||S) Nrz rr)zwhile scanning a quoted scalarzfound unexpected end of streamu …

rrx) r<rwrfrrXrzrr`r) rrrhrr whitespacesrYrrr r r rs(        zScanner.scan_flow_scalar_spacescCsg}xx|jd}|dks |dkr@|jddkr@td|d|jx|jdkrX|jqBW|jdkrv|j|jq|SqWdS) Nrez---z...u …

zwhile scanning a quoted scalarz#found unexpected document separatorz u …

)rwr<rrXrfr`rz)rrrhrrwr r r rs    zScanner.scan_flow_scalar_breakscCsNg}|j}|}|jd}g}xd}|jdkr4PxP|j|}|dksx|j rj|dkrj|j|ddksx|jrz|dkrzP|d7}q6W|jr|dkr|j|ddkr|j|td|d |jd |dkrPd |_|j||j|j ||j||j}|j ||}| s4|jdks4|j r"|j |kr"Pq"Wt d j |d ||S)Nrrryu …

r3z,:?[]{}u …

,[]{}zwhile scanning a plain scalarzfound unexpected ':'zGPlease check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.FrT)rXrr<rrfrrrr`rwscan_plain_spacesrrr)rrrhrirZspacesrrYr r r rvsF        zScanner.scan_plainc Cs.g}d}x|j|dkr"|d7}q W|j|}|j||j}|dkr|j}d|_|jd}|dksr|dkr|jdd krdSg} x`|jd kr|jdkr|jq| j|j|jd}|dks|dkr|jdd krdSqW|d kr|j|n| s|jd|j| n|r*|j||S) Nrrxru …

Trez---z...u …

u …

r)r<rwrfrzrr`r) rrrhrrrrYrrwrr r r r!s>            zScanner.scan_plain_spacescCs|j}|dkr*td||d||jd}|j|}|dkrxfd|koTdknsd|kold knsd |kod kns|d kr|d7}|j|}qBW|dkr|j|td||d||j|d7}|j|}|j||S) Nr5zwhile scanning a %szexpected '!', but found %rrrxrrrrrrz-_)r<rrXrfrw)rrrhrYrrr r r rFs&  J    zScanner.scan_tag_handlecCsg}d}|j|}xd|ko&dknsdd|ko>dknsdd|koVdknsd|dkr|d kr|j|j||j|d}|j|j||n|d 7}|j|}qW|r|j|j||j|d}|std ||d ||jd j|S)Nrrrrrrrz-;/?:@&=+$,_.!~*'()[]%r*rzwhile parsing a %szexpected URI, but found %rr)r<r`rwrfscan_uri_escapesrrXr)rrrhrrrYr r r r^s( J   zScanner.scan_tag_uricCsg}|j}xx|jdkr|jx>tdD]2}|j|dkr,td||d|j||jq,W|jt|jdd|jdqWyt|j d}Wn8t k r}ztd||t ||WYdd}~XnX|S)Nr*rrzwhile scanning a %szBexpected URI escape sequence of 2 hexdecimal numbers, but found %rrzutf-8) rXr<rfrrr`rrwbytesdecodeUnicodeDecodeErrorstr)rrrhZcodesrrrexcr r r rws  (zScanner.scan_uri_escapescCsN|j}|dkr6|jddkr*|jdn|jdS|dkrJ|j|SdS)Nu …rz ru

r)r<rwrf)rrYr r r rzs  zScanner.scan_line_breakN)Lrrrrr#r$r&rr r(r'r_r]r;rarr=r?rArCrdrDrErjrFrGrkrHrJrLrNrOrPrQrRrSrrrTrUrtrWr>r@rBrIrKrMrVr:rcr|r}rr~rrrrorprsrrrrrurrrrrrvrrrrrzr r r r r.sA   l    !8       #    $)L( +/%N)__all__errorrrrr rr r r r s   PK!HV error.pynu[ __all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] class Mark: def __init__(self, name, index, line, column, buffer, pointer): self.name = name self.index = index self.line = line self.column = column self.buffer = buffer self.pointer = pointer def get_snippet(self, indent=4, max_length=75): if self.buffer is None: return None head = '' start = self.pointer while start > 0 and self.buffer[start-1] not in '\0\r\n\x85\u2028\u2029': start -= 1 if self.pointer-start > max_length/2-1: head = ' ... ' start += 5 break tail = '' end = self.pointer while end < len(self.buffer) and self.buffer[end] not in '\0\r\n\x85\u2028\u2029': end += 1 if end-self.pointer > max_length/2-1: tail = ' ... ' end -= 5 break snippet = self.buffer[start:end] return ' '*indent + head + snippet + tail + '\n' \ + ' '*(indent+self.pointer-start+len(head)) + '^' def __str__(self): snippet = self.get_snippet() where = " in \"%s\", line %d, column %d" \ % (self.name, self.line+1, self.column+1) if snippet is not None: where += ":\n"+snippet return where class YAMLError(Exception): pass class MarkedYAMLError(YAMLError): def __init__(self, context=None, context_mark=None, problem=None, problem_mark=None, note=None): self.context = context self.context_mark = context_mark self.problem = problem self.problem_mark = problem_mark self.note = note def __str__(self): lines = [] if self.context is not None: lines.append(self.context) if self.context_mark is not None \ and (self.problem is None or self.problem_mark is None or self.context_mark.name != self.problem_mark.name or self.context_mark.line != self.problem_mark.line or self.context_mark.column != self.problem_mark.column): lines.append(str(self.context_mark)) if self.problem is not None: lines.append(self.problem) if self.problem_mark is not None: lines.append(str(self.problem_mark)) if self.note is not None: lines.append(self.note) return '\n'.join(lines) PK!j,\ composer.pynu[ __all__ = ['Composer', 'ComposerError'] from .error import MarkedYAMLError from .events import * from .nodes import * class ComposerError(MarkedYAMLError): pass class Composer: def __init__(self): self.anchors = {} def check_node(self): # Drop the STREAM-START event. if self.check_event(StreamStartEvent): self.get_event() # If there are more documents available? return not self.check_event(StreamEndEvent) def get_node(self): # Get the root node of the next document. if not self.check_event(StreamEndEvent): return self.compose_document() def get_single_node(self): # Drop the STREAM-START event. self.get_event() # Compose a document if the stream is not empty. document = None if not self.check_event(StreamEndEvent): document = self.compose_document() # Ensure that the stream contains no more documents. if not self.check_event(StreamEndEvent): event = self.get_event() raise ComposerError("expected a single document in the stream", document.start_mark, "but found another document", event.start_mark) # Drop the STREAM-END event. self.get_event() return document def compose_document(self): # Drop the DOCUMENT-START event. self.get_event() # Compose the root node. node = self.compose_node(None, None) # Drop the DOCUMENT-END event. self.get_event() self.anchors = {} return node def compose_node(self, parent, index): if self.check_event(AliasEvent): event = self.get_event() anchor = event.anchor if anchor not in self.anchors: raise ComposerError(None, None, "found undefined alias %r" % anchor, event.start_mark) return self.anchors[anchor] event = self.peek_event() anchor = event.anchor if anchor is not None: if anchor in self.anchors: raise ComposerError("found duplicate anchor %r; first occurence" % anchor, self.anchors[anchor].start_mark, "second occurence", event.start_mark) self.descend_resolver(parent, index) if self.check_event(ScalarEvent): node = self.compose_scalar_node(anchor) elif self.check_event(SequenceStartEvent): node = self.compose_sequence_node(anchor) elif self.check_event(MappingStartEvent): node = self.compose_mapping_node(anchor) self.ascend_resolver() return node def compose_scalar_node(self, anchor): event = self.get_event() tag = event.tag if tag is None or tag == '!': tag = self.resolve(ScalarNode, event.value, event.implicit) node = ScalarNode(tag, event.value, event.start_mark, event.end_mark, style=event.style) if anchor is not None: self.anchors[anchor] = node return node def compose_sequence_node(self, anchor): start_event = self.get_event() tag = start_event.tag if tag is None or tag == '!': tag = self.resolve(SequenceNode, None, start_event.implicit) node = SequenceNode(tag, [], start_event.start_mark, None, flow_style=start_event.flow_style) if anchor is not None: self.anchors[anchor] = node index = 0 while not self.check_event(SequenceEndEvent): node.value.append(self.compose_node(node, index)) index += 1 end_event = self.get_event() node.end_mark = end_event.end_mark return node def compose_mapping_node(self, anchor): start_event = self.get_event() tag = start_event.tag if tag is None or tag == '!': tag = self.resolve(MappingNode, None, start_event.implicit) node = MappingNode(tag, [], start_event.start_mark, None, flow_style=start_event.flow_style) if anchor is not None: self.anchors[anchor] = node while not self.check_event(MappingEndEvent): #key_event = self.peek_event() item_key = self.compose_node(node, None) #if item_key in node.value: # raise ComposerError("while composing a mapping", start_event.start_mark, # "found duplicate key", key_event.start_mark) item_value = self.compose_node(node, item_key) #node.value[item_key] = item_value node.value.append((item_key, item_value)) end_event = self.get_event() node.end_mark = end_event.end_mark return node PK!`լrr loader.pynu[ __all__ = ['BaseLoader', 'SafeLoader', 'Loader'] from .reader import * from .scanner import * from .parser import * from .composer import * from .constructor import * from .resolver import * class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): def __init__(self, stream): Reader.__init__(self, stream) Scanner.__init__(self) Parser.__init__(self) Composer.__init__(self) BaseConstructor.__init__(self) BaseResolver.__init__(self) class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): def __init__(self, stream): Reader.__init__(self, stream) Scanner.__init__(self) Parser.__init__(self) Composer.__init__(self) SafeConstructor.__init__(self) Resolver.__init__(self) class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): def __init__(self, stream): Reader.__init__(self, stream) Scanner.__init__(self) Parser.__init__(self) Composer.__init__(self) Constructor.__init__(self) Resolver.__init__(self) PK!I@cc parser.pynu[ # The following YAML grammar is LL(1) and is parsed by a recursive descent # parser. # # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END # implicit_document ::= block_node DOCUMENT-END* # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* # block_node_or_indentless_sequence ::= # ALIAS # | properties (block_content | indentless_block_sequence)? # | block_content # | indentless_block_sequence # block_node ::= ALIAS # | properties block_content? # | block_content # flow_node ::= ALIAS # | properties flow_content? # | flow_content # properties ::= TAG ANCHOR? | ANCHOR TAG? # block_content ::= block_collection | flow_collection | SCALAR # flow_content ::= flow_collection | SCALAR # block_collection ::= block_sequence | block_mapping # flow_collection ::= flow_sequence | flow_mapping # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ # block_mapping ::= BLOCK-MAPPING_START # ((KEY block_node_or_indentless_sequence?)? # (VALUE block_node_or_indentless_sequence?)?)* # BLOCK-END # flow_sequence ::= FLOW-SEQUENCE-START # (flow_sequence_entry FLOW-ENTRY)* # flow_sequence_entry? # FLOW-SEQUENCE-END # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? # flow_mapping ::= FLOW-MAPPING-START # (flow_mapping_entry FLOW-ENTRY)* # flow_mapping_entry? # FLOW-MAPPING-END # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? # # FIRST sets: # # stream: { STREAM-START } # explicit_document: { DIRECTIVE DOCUMENT-START } # implicit_document: FIRST(block_node) # block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } # flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } # block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } # flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } # block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } # flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } # block_sequence: { BLOCK-SEQUENCE-START } # block_mapping: { BLOCK-MAPPING-START } # block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } # indentless_sequence: { ENTRY } # flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } # flow_sequence: { FLOW-SEQUENCE-START } # flow_mapping: { FLOW-MAPPING-START } # flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } # flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } __all__ = ['Parser', 'ParserError'] from .error import MarkedYAMLError from .tokens import * from .events import * from .scanner import * class ParserError(MarkedYAMLError): pass class Parser: # Since writing a recursive-descendant parser is a straightforward task, we # do not give many comments here. DEFAULT_TAGS = { '!': '!', '!!': 'tag:yaml.org,2002:', } def __init__(self): self.current_event = None self.yaml_version = None self.tag_handles = {} self.states = [] self.marks = [] self.state = self.parse_stream_start def dispose(self): # Reset the state attributes (to clear self-references) self.states = [] self.state = None def check_event(self, *choices): # Check the type of the next event. if self.current_event is None: if self.state: self.current_event = self.state() if self.current_event is not None: if not choices: return True for choice in choices: if isinstance(self.current_event, choice): return True return False def peek_event(self): # Get the next event. if self.current_event is None: if self.state: self.current_event = self.state() return self.current_event def get_event(self): # Get the next event and proceed further. if self.current_event is None: if self.state: self.current_event = self.state() value = self.current_event self.current_event = None return value # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END # implicit_document ::= block_node DOCUMENT-END* # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* def parse_stream_start(self): # Parse the stream start. token = self.get_token() event = StreamStartEvent(token.start_mark, token.end_mark, encoding=token.encoding) # Prepare the next state. self.state = self.parse_implicit_document_start return event def parse_implicit_document_start(self): # Parse an implicit document. if not self.check_token(DirectiveToken, DocumentStartToken, StreamEndToken): self.tag_handles = self.DEFAULT_TAGS token = self.peek_token() start_mark = end_mark = token.start_mark event = DocumentStartEvent(start_mark, end_mark, explicit=False) # Prepare the next state. self.states.append(self.parse_document_end) self.state = self.parse_block_node return event else: return self.parse_document_start() def parse_document_start(self): # Parse any extra document end indicators. while self.check_token(DocumentEndToken): self.get_token() # Parse an explicit document. if not self.check_token(StreamEndToken): token = self.peek_token() start_mark = token.start_mark version, tags = self.process_directives() if not self.check_token(DocumentStartToken): raise ParserError(None, None, "expected '', but found %r" % self.peek_token().id, self.peek_token().start_mark) token = self.get_token() end_mark = token.end_mark event = DocumentStartEvent(start_mark, end_mark, explicit=True, version=version, tags=tags) self.states.append(self.parse_document_end) self.state = self.parse_document_content else: # Parse the end of the stream. token = self.get_token() event = StreamEndEvent(token.start_mark, token.end_mark) assert not self.states assert not self.marks self.state = None return event def parse_document_end(self): # Parse the document end. token = self.peek_token() start_mark = end_mark = token.start_mark explicit = False if self.check_token(DocumentEndToken): token = self.get_token() end_mark = token.end_mark explicit = True event = DocumentEndEvent(start_mark, end_mark, explicit=explicit) # Prepare the next state. self.state = self.parse_document_start return event def parse_document_content(self): if self.check_token(DirectiveToken, DocumentStartToken, DocumentEndToken, StreamEndToken): event = self.process_empty_scalar(self.peek_token().start_mark) self.state = self.states.pop() return event else: return self.parse_block_node() def process_directives(self): self.yaml_version = None self.tag_handles = {} while self.check_token(DirectiveToken): token = self.get_token() if token.name == 'YAML': if self.yaml_version is not None: raise ParserError(None, None, "found duplicate YAML directive", token.start_mark) major, minor = token.value if major != 1: raise ParserError(None, None, "found incompatible YAML document (version 1.* is required)", token.start_mark) self.yaml_version = token.value elif token.name == 'TAG': handle, prefix = token.value if handle in self.tag_handles: raise ParserError(None, None, "duplicate tag handle %r" % handle, token.start_mark) self.tag_handles[handle] = prefix if self.tag_handles: value = self.yaml_version, self.tag_handles.copy() else: value = self.yaml_version, None for key in self.DEFAULT_TAGS: if key not in self.tag_handles: self.tag_handles[key] = self.DEFAULT_TAGS[key] return value # block_node_or_indentless_sequence ::= ALIAS # | properties (block_content | indentless_block_sequence)? # | block_content # | indentless_block_sequence # block_node ::= ALIAS # | properties block_content? # | block_content # flow_node ::= ALIAS # | properties flow_content? # | flow_content # properties ::= TAG ANCHOR? | ANCHOR TAG? # block_content ::= block_collection | flow_collection | SCALAR # flow_content ::= flow_collection | SCALAR # block_collection ::= block_sequence | block_mapping # flow_collection ::= flow_sequence | flow_mapping def parse_block_node(self): return self.parse_node(block=True) def parse_flow_node(self): return self.parse_node() def parse_block_node_or_indentless_sequence(self): return self.parse_node(block=True, indentless_sequence=True) def parse_node(self, block=False, indentless_sequence=False): if self.check_token(AliasToken): token = self.get_token() event = AliasEvent(token.value, token.start_mark, token.end_mark) self.state = self.states.pop() else: anchor = None tag = None start_mark = end_mark = tag_mark = None if self.check_token(AnchorToken): token = self.get_token() start_mark = token.start_mark end_mark = token.end_mark anchor = token.value if self.check_token(TagToken): token = self.get_token() tag_mark = token.start_mark end_mark = token.end_mark tag = token.value elif self.check_token(TagToken): token = self.get_token() start_mark = tag_mark = token.start_mark end_mark = token.end_mark tag = token.value if self.check_token(AnchorToken): token = self.get_token() end_mark = token.end_mark anchor = token.value if tag is not None: handle, suffix = tag if handle is not None: if handle not in self.tag_handles: raise ParserError("while parsing a node", start_mark, "found undefined tag handle %r" % handle, tag_mark) tag = self.tag_handles[handle]+suffix else: tag = suffix #if tag == '!': # raise ParserError("while parsing a node", start_mark, # "found non-specific tag '!'", tag_mark, # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") if start_mark is None: start_mark = end_mark = self.peek_token().start_mark event = None implicit = (tag is None or tag == '!') if indentless_sequence and self.check_token(BlockEntryToken): end_mark = self.peek_token().end_mark event = SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark) self.state = self.parse_indentless_sequence_entry else: if self.check_token(ScalarToken): token = self.get_token() end_mark = token.end_mark if (token.plain and tag is None) or tag == '!': implicit = (True, False) elif tag is None: implicit = (False, True) else: implicit = (False, False) event = ScalarEvent(anchor, tag, implicit, token.value, start_mark, end_mark, style=token.style) self.state = self.states.pop() elif self.check_token(FlowSequenceStartToken): end_mark = self.peek_token().end_mark event = SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark, flow_style=True) self.state = self.parse_flow_sequence_first_entry elif self.check_token(FlowMappingStartToken): end_mark = self.peek_token().end_mark event = MappingStartEvent(anchor, tag, implicit, start_mark, end_mark, flow_style=True) self.state = self.parse_flow_mapping_first_key elif block and self.check_token(BlockSequenceStartToken): end_mark = self.peek_token().start_mark event = SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark, flow_style=False) self.state = self.parse_block_sequence_first_entry elif block and self.check_token(BlockMappingStartToken): end_mark = self.peek_token().start_mark event = MappingStartEvent(anchor, tag, implicit, start_mark, end_mark, flow_style=False) self.state = self.parse_block_mapping_first_key elif anchor is not None or tag is not None: # Empty scalars are allowed even if a tag or an anchor is # specified. event = ScalarEvent(anchor, tag, (implicit, False), '', start_mark, end_mark) self.state = self.states.pop() else: if block: node = 'block' else: node = 'flow' token = self.peek_token() raise ParserError("while parsing a %s node" % node, start_mark, "expected the node content, but found %r" % token.id, token.start_mark) return event # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END def parse_block_sequence_first_entry(self): token = self.get_token() self.marks.append(token.start_mark) return self.parse_block_sequence_entry() def parse_block_sequence_entry(self): if self.check_token(BlockEntryToken): token = self.get_token() if not self.check_token(BlockEntryToken, BlockEndToken): self.states.append(self.parse_block_sequence_entry) return self.parse_block_node() else: self.state = self.parse_block_sequence_entry return self.process_empty_scalar(token.end_mark) if not self.check_token(BlockEndToken): token = self.peek_token() raise ParserError("while parsing a block collection", self.marks[-1], "expected , but found %r" % token.id, token.start_mark) token = self.get_token() event = SequenceEndEvent(token.start_mark, token.end_mark) self.state = self.states.pop() self.marks.pop() return event # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ def parse_indentless_sequence_entry(self): if self.check_token(BlockEntryToken): token = self.get_token() if not self.check_token(BlockEntryToken, KeyToken, ValueToken, BlockEndToken): self.states.append(self.parse_indentless_sequence_entry) return self.parse_block_node() else: self.state = self.parse_indentless_sequence_entry return self.process_empty_scalar(token.end_mark) token = self.peek_token() event = SequenceEndEvent(token.start_mark, token.start_mark) self.state = self.states.pop() return event # block_mapping ::= BLOCK-MAPPING_START # ((KEY block_node_or_indentless_sequence?)? # (VALUE block_node_or_indentless_sequence?)?)* # BLOCK-END def parse_block_mapping_first_key(self): token = self.get_token() self.marks.append(token.start_mark) return self.parse_block_mapping_key() def parse_block_mapping_key(self): if self.check_token(KeyToken): token = self.get_token() if not self.check_token(KeyToken, ValueToken, BlockEndToken): self.states.append(self.parse_block_mapping_value) return self.parse_block_node_or_indentless_sequence() else: self.state = self.parse_block_mapping_value return self.process_empty_scalar(token.end_mark) if not self.check_token(BlockEndToken): token = self.peek_token() raise ParserError("while parsing a block mapping", self.marks[-1], "expected , but found %r" % token.id, token.start_mark) token = self.get_token() event = MappingEndEvent(token.start_mark, token.end_mark) self.state = self.states.pop() self.marks.pop() return event def parse_block_mapping_value(self): if self.check_token(ValueToken): token = self.get_token() if not self.check_token(KeyToken, ValueToken, BlockEndToken): self.states.append(self.parse_block_mapping_key) return self.parse_block_node_or_indentless_sequence() else: self.state = self.parse_block_mapping_key return self.process_empty_scalar(token.end_mark) else: self.state = self.parse_block_mapping_key token = self.peek_token() return self.process_empty_scalar(token.start_mark) # flow_sequence ::= FLOW-SEQUENCE-START # (flow_sequence_entry FLOW-ENTRY)* # flow_sequence_entry? # FLOW-SEQUENCE-END # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? # # Note that while production rules for both flow_sequence_entry and # flow_mapping_entry are equal, their interpretations are different. # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` # generate an inline mapping (set syntax). def parse_flow_sequence_first_entry(self): token = self.get_token() self.marks.append(token.start_mark) return self.parse_flow_sequence_entry(first=True) def parse_flow_sequence_entry(self, first=False): if not self.check_token(FlowSequenceEndToken): if not first: if self.check_token(FlowEntryToken): self.get_token() else: token = self.peek_token() raise ParserError("while parsing a flow sequence", self.marks[-1], "expected ',' or ']', but got %r" % token.id, token.start_mark) if self.check_token(KeyToken): token = self.peek_token() event = MappingStartEvent(None, None, True, token.start_mark, token.end_mark, flow_style=True) self.state = self.parse_flow_sequence_entry_mapping_key return event elif not self.check_token(FlowSequenceEndToken): self.states.append(self.parse_flow_sequence_entry) return self.parse_flow_node() token = self.get_token() event = SequenceEndEvent(token.start_mark, token.end_mark) self.state = self.states.pop() self.marks.pop() return event def parse_flow_sequence_entry_mapping_key(self): token = self.get_token() if not self.check_token(ValueToken, FlowEntryToken, FlowSequenceEndToken): self.states.append(self.parse_flow_sequence_entry_mapping_value) return self.parse_flow_node() else: self.state = self.parse_flow_sequence_entry_mapping_value return self.process_empty_scalar(token.end_mark) def parse_flow_sequence_entry_mapping_value(self): if self.check_token(ValueToken): token = self.get_token() if not self.check_token(FlowEntryToken, FlowSequenceEndToken): self.states.append(self.parse_flow_sequence_entry_mapping_end) return self.parse_flow_node() else: self.state = self.parse_flow_sequence_entry_mapping_end return self.process_empty_scalar(token.end_mark) else: self.state = self.parse_flow_sequence_entry_mapping_end token = self.peek_token() return self.process_empty_scalar(token.start_mark) def parse_flow_sequence_entry_mapping_end(self): self.state = self.parse_flow_sequence_entry token = self.peek_token() return MappingEndEvent(token.start_mark, token.start_mark) # flow_mapping ::= FLOW-MAPPING-START # (flow_mapping_entry FLOW-ENTRY)* # flow_mapping_entry? # FLOW-MAPPING-END # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? def parse_flow_mapping_first_key(self): token = self.get_token() self.marks.append(token.start_mark) return self.parse_flow_mapping_key(first=True) def parse_flow_mapping_key(self, first=False): if not self.check_token(FlowMappingEndToken): if not first: if self.check_token(FlowEntryToken): self.get_token() else: token = self.peek_token() raise ParserError("while parsing a flow mapping", self.marks[-1], "expected ',' or '}', but got %r" % token.id, token.start_mark) if self.check_token(KeyToken): token = self.get_token() if not self.check_token(ValueToken, FlowEntryToken, FlowMappingEndToken): self.states.append(self.parse_flow_mapping_value) return self.parse_flow_node() else: self.state = self.parse_flow_mapping_value return self.process_empty_scalar(token.end_mark) elif not self.check_token(FlowMappingEndToken): self.states.append(self.parse_flow_mapping_empty_value) return self.parse_flow_node() token = self.get_token() event = MappingEndEvent(token.start_mark, token.end_mark) self.state = self.states.pop() self.marks.pop() return event def parse_flow_mapping_value(self): if self.check_token(ValueToken): token = self.get_token() if not self.check_token(FlowEntryToken, FlowMappingEndToken): self.states.append(self.parse_flow_mapping_key) return self.parse_flow_node() else: self.state = self.parse_flow_mapping_key return self.process_empty_scalar(token.end_mark) else: self.state = self.parse_flow_mapping_key token = self.peek_token() return self.process_empty_scalar(token.start_mark) def parse_flow_mapping_empty_value(self): self.state = self.parse_flow_mapping_key return self.process_empty_scalar(self.peek_token().start_mark) def process_empty_scalar(self, mark): return ScalarEvent(None, None, (True, False), '', mark, mark) PK! sM reader.pynu[# This module contains abstractions for the input stream. You don't have to # looks further, there are no pretty code. # # We define two classes here. # # Mark(source, line, column) # It's just a record and its only use is producing nice error messages. # Parser does not use it for any other purposes. # # Reader(source, data) # Reader determines the encoding of `data` and converts it to unicode. # Reader provides the following methods and attributes: # reader.peek(length=1) - return the next `length` characters # reader.forward(length=1) - move the current position to `length` characters. # reader.index - the number of the current character. # reader.line, stream.column - the line and the column of the current character. __all__ = ['Reader', 'ReaderError'] from .error import YAMLError, Mark import codecs, re class ReaderError(YAMLError): def __init__(self, name, position, character, encoding, reason): self.name = name self.character = character self.position = position self.encoding = encoding self.reason = reason def __str__(self): if isinstance(self.character, bytes): return "'%s' codec can't decode byte #x%02x: %s\n" \ " in \"%s\", position %d" \ % (self.encoding, ord(self.character), self.reason, self.name, self.position) else: return "unacceptable character #x%04x: %s\n" \ " in \"%s\", position %d" \ % (self.character, self.reason, self.name, self.position) class Reader(object): # Reader: # - determines the data encoding and converts it to a unicode string, # - checks if characters are in allowed range, # - adds '\0' to the end. # Reader accepts # - a `bytes` object, # - a `str` object, # - a file-like object with its `read` method returning `str`, # - a file-like object with its `read` method returning `unicode`. # Yeah, it's ugly and slow. def __init__(self, stream): self.name = None self.stream = None self.stream_pointer = 0 self.eof = True self.buffer = '' self.pointer = 0 self.raw_buffer = None self.raw_decode = None self.encoding = None self.index = 0 self.line = 0 self.column = 0 if isinstance(stream, str): self.name = "" self.check_printable(stream) self.buffer = stream+'\0' elif isinstance(stream, bytes): self.name = "" self.raw_buffer = stream self.determine_encoding() else: self.stream = stream self.name = getattr(stream, 'name', "") self.eof = False self.raw_buffer = None self.determine_encoding() def peek(self, index=0): try: return self.buffer[self.pointer+index] except IndexError: self.update(index+1) return self.buffer[self.pointer+index] def prefix(self, length=1): if self.pointer+length >= len(self.buffer): self.update(length) return self.buffer[self.pointer:self.pointer+length] def forward(self, length=1): if self.pointer+length+1 >= len(self.buffer): self.update(length+1) while length: ch = self.buffer[self.pointer] self.pointer += 1 self.index += 1 if ch in '\n\x85\u2028\u2029' \ or (ch == '\r' and self.buffer[self.pointer] != '\n'): self.line += 1 self.column = 0 elif ch != '\uFEFF': self.column += 1 length -= 1 def get_mark(self): if self.stream is None: return Mark(self.name, self.index, self.line, self.column, self.buffer, self.pointer) else: return Mark(self.name, self.index, self.line, self.column, None, None) def determine_encoding(self): while not self.eof and (self.raw_buffer is None or len(self.raw_buffer) < 2): self.update_raw() if isinstance(self.raw_buffer, bytes): if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): self.raw_decode = codecs.utf_16_le_decode self.encoding = 'utf-16-le' elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): self.raw_decode = codecs.utf_16_be_decode self.encoding = 'utf-16-be' else: self.raw_decode = codecs.utf_8_decode self.encoding = 'utf-8' self.update(1) NON_PRINTABLE = re.compile('[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') def check_printable(self, data): match = self.NON_PRINTABLE.search(data) if match: character = match.group() position = self.index+(len(self.buffer)-self.pointer)+match.start() raise ReaderError(self.name, position, ord(character), 'unicode', "special characters are not allowed") def update(self, length): if self.raw_buffer is None: return self.buffer = self.buffer[self.pointer:] self.pointer = 0 while len(self.buffer) < length: if not self.eof: self.update_raw() if self.raw_decode is not None: try: data, converted = self.raw_decode(self.raw_buffer, 'strict', self.eof) except UnicodeDecodeError as exc: character = self.raw_buffer[exc.start] if self.stream is not None: position = self.stream_pointer-len(self.raw_buffer)+exc.start else: position = exc.start raise ReaderError(self.name, position, character, exc.encoding, exc.reason) else: data = self.raw_buffer converted = len(data) self.check_printable(data) self.buffer += data self.raw_buffer = self.raw_buffer[converted:] if self.eof: self.buffer += '\0' self.raw_buffer = None break def update_raw(self, size=4096): data = self.stream.read(size) if self.raw_buffer is None: self.raw_buffer = data else: self.raw_buffer += data self.stream_pointer += len(data) if not data: self.eof = True #try: # import psyco # psyco.bind(Reader) #except ImportError: # pass PK! Ve77representer.pynu[ __all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', 'RepresenterError'] from .error import * from .nodes import * import datetime, sys, copyreg, types, base64, collections class RepresenterError(YAMLError): pass class BaseRepresenter: yaml_representers = {} yaml_multi_representers = {} def __init__(self, default_style=None, default_flow_style=None): self.default_style = default_style self.default_flow_style = default_flow_style self.represented_objects = {} self.object_keeper = [] self.alias_key = None def represent(self, data): node = self.represent_data(data) self.serialize(node) self.represented_objects = {} self.object_keeper = [] self.alias_key = None def represent_data(self, data): if self.ignore_aliases(data): self.alias_key = None else: self.alias_key = id(data) if self.alias_key is not None: if self.alias_key in self.represented_objects: node = self.represented_objects[self.alias_key] #if node is None: # raise RepresenterError("recursive objects are not allowed: %r" % data) return node #self.represented_objects[alias_key] = None self.object_keeper.append(data) data_types = type(data).__mro__ if data_types[0] in self.yaml_representers: node = self.yaml_representers[data_types[0]](self, data) else: for data_type in data_types: if data_type in self.yaml_multi_representers: node = self.yaml_multi_representers[data_type](self, data) break else: if None in self.yaml_multi_representers: node = self.yaml_multi_representers[None](self, data) elif None in self.yaml_representers: node = self.yaml_representers[None](self, data) else: node = ScalarNode(None, str(data)) #if alias_key is not None: # self.represented_objects[alias_key] = node return node @classmethod def add_representer(cls, data_type, representer): if not 'yaml_representers' in cls.__dict__: cls.yaml_representers = cls.yaml_representers.copy() cls.yaml_representers[data_type] = representer @classmethod def add_multi_representer(cls, data_type, representer): if not 'yaml_multi_representers' in cls.__dict__: cls.yaml_multi_representers = cls.yaml_multi_representers.copy() cls.yaml_multi_representers[data_type] = representer def represent_scalar(self, tag, value, style=None): if style is None: style = self.default_style node = ScalarNode(tag, value, style=style) if self.alias_key is not None: self.represented_objects[self.alias_key] = node return node def represent_sequence(self, tag, sequence, flow_style=None): value = [] node = SequenceNode(tag, value, flow_style=flow_style) if self.alias_key is not None: self.represented_objects[self.alias_key] = node best_style = True for item in sequence: node_item = self.represent_data(item) if not (isinstance(node_item, ScalarNode) and not node_item.style): best_style = False value.append(node_item) if flow_style is None: if self.default_flow_style is not None: node.flow_style = self.default_flow_style else: node.flow_style = best_style return node def represent_mapping(self, tag, mapping, flow_style=None): value = [] node = MappingNode(tag, value, flow_style=flow_style) if self.alias_key is not None: self.represented_objects[self.alias_key] = node best_style = True if hasattr(mapping, 'items'): mapping = list(mapping.items()) try: mapping = sorted(mapping) except TypeError: pass for item_key, item_value in mapping: node_key = self.represent_data(item_key) node_value = self.represent_data(item_value) if not (isinstance(node_key, ScalarNode) and not node_key.style): best_style = False if not (isinstance(node_value, ScalarNode) and not node_value.style): best_style = False value.append((node_key, node_value)) if flow_style is None: if self.default_flow_style is not None: node.flow_style = self.default_flow_style else: node.flow_style = best_style return node def ignore_aliases(self, data): return False class SafeRepresenter(BaseRepresenter): def ignore_aliases(self, data): if data is None: return True if isinstance(data, tuple) and data == (): return True if isinstance(data, (str, bytes, bool, int, float)): return True def represent_none(self, data): return self.represent_scalar('tag:yaml.org,2002:null', 'null') def represent_str(self, data): return self.represent_scalar('tag:yaml.org,2002:str', data) def represent_binary(self, data): if hasattr(base64, 'encodebytes'): data = base64.encodebytes(data).decode('ascii') else: data = base64.encodestring(data).decode('ascii') return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') def represent_bool(self, data): if data: value = 'true' else: value = 'false' return self.represent_scalar('tag:yaml.org,2002:bool', value) def represent_int(self, data): return self.represent_scalar('tag:yaml.org,2002:int', str(data)) inf_value = 1e300 while repr(inf_value) != repr(inf_value*inf_value): inf_value *= inf_value def represent_float(self, data): if data != data or (data == 0.0 and data == 1.0): value = '.nan' elif data == self.inf_value: value = '.inf' elif data == -self.inf_value: value = '-.inf' else: value = repr(data).lower() # Note that in some cases `repr(data)` represents a float number # without the decimal parts. For instance: # >>> repr(1e17) # '1e17' # Unfortunately, this is not a valid float representation according # to the definition of the `!!float` tag. We fix this by adding # '.0' before the 'e' symbol. if '.' not in value and 'e' in value: value = value.replace('e', '.0e', 1) return self.represent_scalar('tag:yaml.org,2002:float', value) def represent_list(self, data): #pairs = (len(data) > 0 and isinstance(data, list)) #if pairs: # for item in data: # if not isinstance(item, tuple) or len(item) != 2: # pairs = False # break #if not pairs: return self.represent_sequence('tag:yaml.org,2002:seq', data) #value = [] #for item_key, item_value in data: # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', # [(item_key, item_value)])) #return SequenceNode(u'tag:yaml.org,2002:pairs', value) def represent_dict(self, data): return self.represent_mapping('tag:yaml.org,2002:map', data) def represent_set(self, data): value = {} for key in data: value[key] = None return self.represent_mapping('tag:yaml.org,2002:set', value) def represent_date(self, data): value = data.isoformat() return self.represent_scalar('tag:yaml.org,2002:timestamp', value) def represent_datetime(self, data): value = data.isoformat(' ') return self.represent_scalar('tag:yaml.org,2002:timestamp', value) def represent_yaml_object(self, tag, data, cls, flow_style=None): if hasattr(data, '__getstate__'): state = data.__getstate__() else: state = data.__dict__.copy() return self.represent_mapping(tag, state, flow_style=flow_style) def represent_undefined(self, data): raise RepresenterError("cannot represent an object: %s" % data) SafeRepresenter.add_representer(type(None), SafeRepresenter.represent_none) SafeRepresenter.add_representer(str, SafeRepresenter.represent_str) SafeRepresenter.add_representer(bytes, SafeRepresenter.represent_binary) SafeRepresenter.add_representer(bool, SafeRepresenter.represent_bool) SafeRepresenter.add_representer(int, SafeRepresenter.represent_int) SafeRepresenter.add_representer(float, SafeRepresenter.represent_float) SafeRepresenter.add_representer(list, SafeRepresenter.represent_list) SafeRepresenter.add_representer(tuple, SafeRepresenter.represent_list) SafeRepresenter.add_representer(dict, SafeRepresenter.represent_dict) SafeRepresenter.add_representer(set, SafeRepresenter.represent_set) SafeRepresenter.add_representer(datetime.date, SafeRepresenter.represent_date) SafeRepresenter.add_representer(datetime.datetime, SafeRepresenter.represent_datetime) SafeRepresenter.add_representer(None, SafeRepresenter.represent_undefined) class Representer(SafeRepresenter): def represent_complex(self, data): if data.imag == 0.0: data = '%r' % data.real elif data.real == 0.0: data = '%rj' % data.imag elif data.imag > 0: data = '%r+%rj' % (data.real, data.imag) else: data = '%r%rj' % (data.real, data.imag) return self.represent_scalar('tag:yaml.org,2002:python/complex', data) def represent_tuple(self, data): return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) def represent_name(self, data): name = '%s.%s' % (data.__module__, data.__name__) return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') def represent_module(self, data): return self.represent_scalar( 'tag:yaml.org,2002:python/module:'+data.__name__, '') def represent_object(self, data): # We use __reduce__ API to save the data. data.__reduce__ returns # a tuple of length 2-5: # (function, args, state, listitems, dictitems) # For reconstructing, we calls function(*args), then set its state, # listitems, and dictitems if they are not None. # A special case is when function.__name__ == '__newobj__'. In this # case we create the object with args[0].__new__(*args). # Another special case is when __reduce__ returns a string - we don't # support it. # We produce a !!python/object, !!python/object/new or # !!python/object/apply node. cls = type(data) if cls in copyreg.dispatch_table: reduce = copyreg.dispatch_table[cls](data) elif hasattr(data, '__reduce_ex__'): reduce = data.__reduce_ex__(2) elif hasattr(data, '__reduce__'): reduce = data.__reduce__() else: raise RepresenterError("cannot represent object: %r" % data) reduce = (list(reduce)+[None]*5)[:5] function, args, state, listitems, dictitems = reduce args = list(args) if state is None: state = {} if listitems is not None: listitems = list(listitems) if dictitems is not None: dictitems = dict(dictitems) if function.__name__ == '__newobj__': function = args[0] args = args[1:] tag = 'tag:yaml.org,2002:python/object/new:' newobj = True else: tag = 'tag:yaml.org,2002:python/object/apply:' newobj = False function_name = '%s.%s' % (function.__module__, function.__name__) if not args and not listitems and not dictitems \ and isinstance(state, dict) and newobj: return self.represent_mapping( 'tag:yaml.org,2002:python/object:'+function_name, state) if not listitems and not dictitems \ and isinstance(state, dict) and not state: return self.represent_sequence(tag+function_name, args) value = {} if args: value['args'] = args if state or not isinstance(state, dict): value['state'] = state if listitems: value['listitems'] = listitems if dictitems: value['dictitems'] = dictitems return self.represent_mapping(tag+function_name, value) def represent_ordered_dict(self, data): # Provide uniform representation across different Python versions. data_type = type(data) tag = 'tag:yaml.org,2002:python/object/apply:%s.%s' \ % (data_type.__module__, data_type.__name__) items = [[key, value] for key, value in data.items()] return self.represent_sequence(tag, [items]) Representer.add_representer(complex, Representer.represent_complex) Representer.add_representer(tuple, Representer.represent_tuple) Representer.add_representer(type, Representer.represent_name) Representer.add_representer(collections.OrderedDict, Representer.represent_ordered_dict) Representer.add_representer(types.FunctionType, Representer.represent_name) Representer.add_representer(types.BuiltinFunctionType, Representer.represent_name) Representer.add_representer(types.ModuleType, Representer.represent_module) Representer.add_multi_representer(object, Representer.represent_object) PK!_[0-9][0-9][0-9][0-9]) -(?P[0-9][0-9]?) -(?P[0-9][0-9]?) (?:(?:[Tt]|[ \t]+) (?P[0-9][0-9]?) :(?P[0-9][0-9]) :(?P[0-9][0-9]) (?:\.(?P[0-9]*))? (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) (?::(?P[0-9][0-9]))?))?)?$''', re.X) def construct_yaml_timestamp(self, node): value = self.construct_scalar(node) match = self.timestamp_regexp.match(node.value) values = match.groupdict() year = int(values['year']) month = int(values['month']) day = int(values['day']) if not values['hour']: return datetime.date(year, month, day) hour = int(values['hour']) minute = int(values['minute']) second = int(values['second']) fraction = 0 if values['fraction']: fraction = values['fraction'][:6] while len(fraction) < 6: fraction += '0' fraction = int(fraction) delta = None if values['tz_sign']: tz_hour = int(values['tz_hour']) tz_minute = int(values['tz_minute'] or 0) delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) if values['tz_sign'] == '-': delta = -delta data = datetime.datetime(year, month, day, hour, minute, second, fraction) if delta: data -= delta return data def construct_yaml_omap(self, node): # Note: we do not check for duplicate keys, because it's too # CPU-expensive. omap = [] yield omap if not isinstance(node, SequenceNode): raise ConstructorError("while constructing an ordered map", node.start_mark, "expected a sequence, but found %s" % node.id, node.start_mark) for subnode in node.value: if not isinstance(subnode, MappingNode): raise ConstructorError("while constructing an ordered map", node.start_mark, "expected a mapping of length 1, but found %s" % subnode.id, subnode.start_mark) if len(subnode.value) != 1: raise ConstructorError("while constructing an ordered map", node.start_mark, "expected a single mapping item, but found %d items" % len(subnode.value), subnode.start_mark) key_node, value_node = subnode.value[0] key = self.construct_object(key_node) value = self.construct_object(value_node) omap.append((key, value)) def construct_yaml_pairs(self, node): # Note: the same code as `construct_yaml_omap`. pairs = [] yield pairs if not isinstance(node, SequenceNode): raise ConstructorError("while constructing pairs", node.start_mark, "expected a sequence, but found %s" % node.id, node.start_mark) for subnode in node.value: if not isinstance(subnode, MappingNode): raise ConstructorError("while constructing pairs", node.start_mark, "expected a mapping of length 1, but found %s" % subnode.id, subnode.start_mark) if len(subnode.value) != 1: raise ConstructorError("while constructing pairs", node.start_mark, "expected a single mapping item, but found %d items" % len(subnode.value), subnode.start_mark) key_node, value_node = subnode.value[0] key = self.construct_object(key_node) value = self.construct_object(value_node) pairs.append((key, value)) def construct_yaml_set(self, node): data = set() yield data value = self.construct_mapping(node) data.update(value) def construct_yaml_str(self, node): return self.construct_scalar(node) def construct_yaml_seq(self, node): data = [] yield data data.extend(self.construct_sequence(node)) def construct_yaml_map(self, node): data = {} yield data value = self.construct_mapping(node) data.update(value) def construct_yaml_object(self, node, cls): data = cls.__new__(cls) yield data if hasattr(data, '__setstate__'): state = self.construct_mapping(node, deep=True) data.__setstate__(state) else: state = self.construct_mapping(node) data.__dict__.update(state) def construct_undefined(self, node): raise ConstructorError(None, None, "could not determine a constructor for the tag %r" % node.tag, node.start_mark) SafeConstructor.add_constructor( 'tag:yaml.org,2002:null', SafeConstructor.construct_yaml_null) SafeConstructor.add_constructor( 'tag:yaml.org,2002:bool', SafeConstructor.construct_yaml_bool) SafeConstructor.add_constructor( 'tag:yaml.org,2002:int', SafeConstructor.construct_yaml_int) SafeConstructor.add_constructor( 'tag:yaml.org,2002:float', SafeConstructor.construct_yaml_float) SafeConstructor.add_constructor( 'tag:yaml.org,2002:binary', SafeConstructor.construct_yaml_binary) SafeConstructor.add_constructor( 'tag:yaml.org,2002:timestamp', SafeConstructor.construct_yaml_timestamp) SafeConstructor.add_constructor( 'tag:yaml.org,2002:omap', SafeConstructor.construct_yaml_omap) SafeConstructor.add_constructor( 'tag:yaml.org,2002:pairs', SafeConstructor.construct_yaml_pairs) SafeConstructor.add_constructor( 'tag:yaml.org,2002:set', SafeConstructor.construct_yaml_set) SafeConstructor.add_constructor( 'tag:yaml.org,2002:str', SafeConstructor.construct_yaml_str) SafeConstructor.add_constructor( 'tag:yaml.org,2002:seq', SafeConstructor.construct_yaml_seq) SafeConstructor.add_constructor( 'tag:yaml.org,2002:map', SafeConstructor.construct_yaml_map) SafeConstructor.add_constructor(None, SafeConstructor.construct_undefined) class Constructor(SafeConstructor): def construct_python_str(self, node): return self.construct_scalar(node) def construct_python_unicode(self, node): return self.construct_scalar(node) def construct_python_bytes(self, node): try: value = self.construct_scalar(node).encode('ascii') except UnicodeEncodeError as exc: raise ConstructorError(None, None, "failed to convert base64 data into ascii: %s" % exc, node.start_mark) try: if hasattr(base64, 'decodebytes'): return base64.decodebytes(value) else: return base64.decodestring(value) except binascii.Error as exc: raise ConstructorError(None, None, "failed to decode base64 data: %s" % exc, node.start_mark) def construct_python_long(self, node): return self.construct_yaml_int(node) def construct_python_complex(self, node): return complex(self.construct_scalar(node)) def construct_python_tuple(self, node): return tuple(self.construct_sequence(node)) def find_python_module(self, name, mark): if not name: raise ConstructorError("while constructing a Python module", mark, "expected non-empty name appended to the tag", mark) try: __import__(name) except ImportError as exc: raise ConstructorError("while constructing a Python module", mark, "cannot find module %r (%s)" % (name, exc), mark) return sys.modules[name] def find_python_name(self, name, mark): if not name: raise ConstructorError("while constructing a Python object", mark, "expected non-empty name appended to the tag", mark) if '.' in name: module_name, object_name = name.rsplit('.', 1) else: module_name = 'builtins' object_name = name try: __import__(module_name) except ImportError as exc: raise ConstructorError("while constructing a Python object", mark, "cannot find module %r (%s)" % (module_name, exc), mark) module = sys.modules[module_name] if not hasattr(module, object_name): raise ConstructorError("while constructing a Python object", mark, "cannot find %r in the module %r" % (object_name, module.__name__), mark) return getattr(module, object_name) def construct_python_name(self, suffix, node): value = self.construct_scalar(node) if value: raise ConstructorError("while constructing a Python name", node.start_mark, "expected the empty value, but found %r" % value, node.start_mark) return self.find_python_name(suffix, node.start_mark) def construct_python_module(self, suffix, node): value = self.construct_scalar(node) if value: raise ConstructorError("while constructing a Python module", node.start_mark, "expected the empty value, but found %r" % value, node.start_mark) return self.find_python_module(suffix, node.start_mark) def make_python_instance(self, suffix, node, args=None, kwds=None, newobj=False): if not args: args = [] if not kwds: kwds = {} cls = self.find_python_name(suffix, node.start_mark) if newobj and isinstance(cls, type): return cls.__new__(cls, *args, **kwds) else: return cls(*args, **kwds) def set_python_instance_state(self, instance, state): if hasattr(instance, '__setstate__'): instance.__setstate__(state) else: slotstate = {} if isinstance(state, tuple) and len(state) == 2: state, slotstate = state if hasattr(instance, '__dict__'): instance.__dict__.update(state) elif state: slotstate.update(state) for key, value in slotstate.items(): setattr(object, key, value) def construct_python_object(self, suffix, node): # Format: # !!python/object:module.name { ... state ... } instance = self.make_python_instance(suffix, node, newobj=True) yield instance deep = hasattr(instance, '__setstate__') state = self.construct_mapping(node, deep=deep) self.set_python_instance_state(instance, state) def construct_python_object_apply(self, suffix, node, newobj=False): # Format: # !!python/object/apply # (or !!python/object/new) # args: [ ... arguments ... ] # kwds: { ... keywords ... } # state: ... state ... # listitems: [ ... listitems ... ] # dictitems: { ... dictitems ... } # or short format: # !!python/object/apply [ ... arguments ... ] # The difference between !!python/object/apply and !!python/object/new # is how an object is created, check make_python_instance for details. if isinstance(node, SequenceNode): args = self.construct_sequence(node, deep=True) kwds = {} state = {} listitems = [] dictitems = {} else: value = self.construct_mapping(node, deep=True) args = value.get('args', []) kwds = value.get('kwds', {}) state = value.get('state', {}) listitems = value.get('listitems', []) dictitems = value.get('dictitems', {}) instance = self.make_python_instance(suffix, node, args, kwds, newobj) if state: self.set_python_instance_state(instance, state) if listitems: instance.extend(listitems) if dictitems: for key in dictitems: instance[key] = dictitems[key] return instance def construct_python_object_new(self, suffix, node): return self.construct_python_object_apply(suffix, node, newobj=True) Constructor.add_constructor( 'tag:yaml.org,2002:python/none', Constructor.construct_yaml_null) Constructor.add_constructor( 'tag:yaml.org,2002:python/bool', Constructor.construct_yaml_bool) Constructor.add_constructor( 'tag:yaml.org,2002:python/str', Constructor.construct_python_str) Constructor.add_constructor( 'tag:yaml.org,2002:python/unicode', Constructor.construct_python_unicode) Constructor.add_constructor( 'tag:yaml.org,2002:python/bytes', Constructor.construct_python_bytes) Constructor.add_constructor( 'tag:yaml.org,2002:python/int', Constructor.construct_yaml_int) Constructor.add_constructor( 'tag:yaml.org,2002:python/long', Constructor.construct_python_long) Constructor.add_constructor( 'tag:yaml.org,2002:python/float', Constructor.construct_yaml_float) Constructor.add_constructor( 'tag:yaml.org,2002:python/complex', Constructor.construct_python_complex) Constructor.add_constructor( 'tag:yaml.org,2002:python/list', Constructor.construct_yaml_seq) Constructor.add_constructor( 'tag:yaml.org,2002:python/tuple', Constructor.construct_python_tuple) Constructor.add_constructor( 'tag:yaml.org,2002:python/dict', Constructor.construct_yaml_map) Constructor.add_multi_constructor( 'tag:yaml.org,2002:python/name:', Constructor.construct_python_name) Constructor.add_multi_constructor( 'tag:yaml.org,2002:python/module:', Constructor.construct_python_module) Constructor.add_multi_constructor( 'tag:yaml.org,2002:python/object:', Constructor.construct_python_object) Constructor.add_multi_constructor( 'tag:yaml.org,2002:python/object/apply:', Constructor.construct_python_object_apply) Constructor.add_multi_constructor( 'tag:yaml.org,2002:python/object/new:', Constructor.construct_python_object_new) PK!݊ scanner.pynu[ # Scanner produces tokens of the following types: # STREAM-START # STREAM-END # DIRECTIVE(name, value) # DOCUMENT-START # DOCUMENT-END # BLOCK-SEQUENCE-START # BLOCK-MAPPING-START # BLOCK-END # FLOW-SEQUENCE-START # FLOW-MAPPING-START # FLOW-SEQUENCE-END # FLOW-MAPPING-END # BLOCK-ENTRY # FLOW-ENTRY # KEY # VALUE # ALIAS(value) # ANCHOR(value) # TAG(value) # SCALAR(value, plain, style) # # Read comments in the Scanner code for more details. # __all__ = ['Scanner', 'ScannerError'] from .error import MarkedYAMLError from .tokens import * class ScannerError(MarkedYAMLError): pass class SimpleKey: # See below simple keys treatment. def __init__(self, token_number, required, index, line, column, mark): self.token_number = token_number self.required = required self.index = index self.line = line self.column = column self.mark = mark class Scanner: def __init__(self): """Initialize the scanner.""" # It is assumed that Scanner and Reader will have a common descendant. # Reader do the dirty work of checking for BOM and converting the # input data to Unicode. It also adds NUL to the end. # # Reader supports the following methods # self.peek(i=0) # peek the next i-th character # self.prefix(l=1) # peek the next l characters # self.forward(l=1) # read the next l characters and move the pointer. # Had we reached the end of the stream? self.done = False # The number of unclosed '{' and '['. `flow_level == 0` means block # context. self.flow_level = 0 # List of processed tokens that are not yet emitted. self.tokens = [] # Add the STREAM-START token. self.fetch_stream_start() # Number of tokens that were emitted through the `get_token` method. self.tokens_taken = 0 # The current indentation level. self.indent = -1 # Past indentation levels. self.indents = [] # Variables related to simple keys treatment. # A simple key is a key that is not denoted by the '?' indicator. # Example of simple keys: # --- # block simple key: value # ? not a simple key: # : { flow simple key: value } # We emit the KEY token before all keys, so when we find a potential # simple key, we try to locate the corresponding ':' indicator. # Simple keys should be limited to a single line and 1024 characters. # Can a simple key start at the current position? A simple key may # start: # - at the beginning of the line, not counting indentation spaces # (in block context), # - after '{', '[', ',' (in the flow context), # - after '?', ':', '-' (in the block context). # In the block context, this flag also signifies if a block collection # may start at the current position. self.allow_simple_key = True # Keep track of possible simple keys. This is a dictionary. The key # is `flow_level`; there can be no more that one possible simple key # for each level. The value is a SimpleKey record: # (token_number, required, index, line, column, mark) # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), # '[', or '{' tokens. self.possible_simple_keys = {} # Public methods. def check_token(self, *choices): # Check if the next token is one of the given types. while self.need_more_tokens(): self.fetch_more_tokens() if self.tokens: if not choices: return True for choice in choices: if isinstance(self.tokens[0], choice): return True return False def peek_token(self): # Return the next token, but do not delete if from the queue. while self.need_more_tokens(): self.fetch_more_tokens() if self.tokens: return self.tokens[0] def get_token(self): # Return the next token. while self.need_more_tokens(): self.fetch_more_tokens() if self.tokens: self.tokens_taken += 1 return self.tokens.pop(0) # Private methods. def need_more_tokens(self): if self.done: return False if not self.tokens: return True # The current token may be a potential simple key, so we # need to look further. self.stale_possible_simple_keys() if self.next_possible_simple_key() == self.tokens_taken: return True def fetch_more_tokens(self): # Eat whitespaces and comments until we reach the next token. self.scan_to_next_token() # Remove obsolete possible simple keys. self.stale_possible_simple_keys() # Compare the current indentation and column. It may add some tokens # and decrease the current indentation level. self.unwind_indent(self.column) # Peek the next character. ch = self.peek() # Is it the end of stream? if ch == '\0': return self.fetch_stream_end() # Is it a directive? if ch == '%' and self.check_directive(): return self.fetch_directive() # Is it the document start? if ch == '-' and self.check_document_start(): return self.fetch_document_start() # Is it the document end? if ch == '.' and self.check_document_end(): return self.fetch_document_end() # TODO: support for BOM within a stream. #if ch == '\uFEFF': # return self.fetch_bom() <-- issue BOMToken # Note: the order of the following checks is NOT significant. # Is it the flow sequence start indicator? if ch == '[': return self.fetch_flow_sequence_start() # Is it the flow mapping start indicator? if ch == '{': return self.fetch_flow_mapping_start() # Is it the flow sequence end indicator? if ch == ']': return self.fetch_flow_sequence_end() # Is it the flow mapping end indicator? if ch == '}': return self.fetch_flow_mapping_end() # Is it the flow entry indicator? if ch == ',': return self.fetch_flow_entry() # Is it the block entry indicator? if ch == '-' and self.check_block_entry(): return self.fetch_block_entry() # Is it the key indicator? if ch == '?' and self.check_key(): return self.fetch_key() # Is it the value indicator? if ch == ':' and self.check_value(): return self.fetch_value() # Is it an alias? if ch == '*': return self.fetch_alias() # Is it an anchor? if ch == '&': return self.fetch_anchor() # Is it a tag? if ch == '!': return self.fetch_tag() # Is it a literal scalar? if ch == '|' and not self.flow_level: return self.fetch_literal() # Is it a folded scalar? if ch == '>' and not self.flow_level: return self.fetch_folded() # Is it a single quoted scalar? if ch == '\'': return self.fetch_single() # Is it a double quoted scalar? if ch == '\"': return self.fetch_double() # It must be a plain scalar then. if self.check_plain(): return self.fetch_plain() # No? It's an error. Let's produce a nice error message. raise ScannerError("while scanning for the next token", None, "found character %r that cannot start any token" % ch, self.get_mark()) # Simple keys treatment. def next_possible_simple_key(self): # Return the number of the nearest possible simple key. Actually we # don't need to loop through the whole dictionary. We may replace it # with the following code: # if not self.possible_simple_keys: # return None # return self.possible_simple_keys[ # min(self.possible_simple_keys.keys())].token_number min_token_number = None for level in self.possible_simple_keys: key = self.possible_simple_keys[level] if min_token_number is None or key.token_number < min_token_number: min_token_number = key.token_number return min_token_number def stale_possible_simple_keys(self): # Remove entries that are no longer possible simple keys. According to # the YAML specification, simple keys # - should be limited to a single line, # - should be no longer than 1024 characters. # Disabling this procedure will allow simple keys of any length and # height (may cause problems if indentation is broken though). for level in list(self.possible_simple_keys): key = self.possible_simple_keys[level] if key.line != self.line \ or self.index-key.index > 1024: if key.required: raise ScannerError("while scanning a simple key", key.mark, "could not find expected ':'", self.get_mark()) del self.possible_simple_keys[level] def save_possible_simple_key(self): # The next token may start a simple key. We check if it's possible # and save its position. This function is called for # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. # Check if a simple key is required at the current position. required = not self.flow_level and self.indent == self.column # The next token might be a simple key. Let's save it's number and # position. if self.allow_simple_key: self.remove_possible_simple_key() token_number = self.tokens_taken+len(self.tokens) key = SimpleKey(token_number, required, self.index, self.line, self.column, self.get_mark()) self.possible_simple_keys[self.flow_level] = key def remove_possible_simple_key(self): # Remove the saved possible key position at the current flow level. if self.flow_level in self.possible_simple_keys: key = self.possible_simple_keys[self.flow_level] if key.required: raise ScannerError("while scanning a simple key", key.mark, "could not find expected ':'", self.get_mark()) del self.possible_simple_keys[self.flow_level] # Indentation functions. def unwind_indent(self, column): ## In flow context, tokens should respect indentation. ## Actually the condition should be `self.indent >= column` according to ## the spec. But this condition will prohibit intuitively correct ## constructions such as ## key : { ## } #if self.flow_level and self.indent > column: # raise ScannerError(None, None, # "invalid intendation or unclosed '[' or '{'", # self.get_mark()) # In the flow context, indentation is ignored. We make the scanner less # restrictive then specification requires. if self.flow_level: return # In block context, we may need to issue the BLOCK-END tokens. while self.indent > column: mark = self.get_mark() self.indent = self.indents.pop() self.tokens.append(BlockEndToken(mark, mark)) def add_indent(self, column): # Check if we need to increase indentation. if self.indent < column: self.indents.append(self.indent) self.indent = column return True return False # Fetchers. def fetch_stream_start(self): # We always add STREAM-START as the first token and STREAM-END as the # last token. # Read the token. mark = self.get_mark() # Add STREAM-START. self.tokens.append(StreamStartToken(mark, mark, encoding=self.encoding)) def fetch_stream_end(self): # Set the current intendation to -1. self.unwind_indent(-1) # Reset simple keys. self.remove_possible_simple_key() self.allow_simple_key = False self.possible_simple_keys = {} # Read the token. mark = self.get_mark() # Add STREAM-END. self.tokens.append(StreamEndToken(mark, mark)) # The steam is finished. self.done = True def fetch_directive(self): # Set the current intendation to -1. self.unwind_indent(-1) # Reset simple keys. self.remove_possible_simple_key() self.allow_simple_key = False # Scan and add DIRECTIVE. self.tokens.append(self.scan_directive()) def fetch_document_start(self): self.fetch_document_indicator(DocumentStartToken) def fetch_document_end(self): self.fetch_document_indicator(DocumentEndToken) def fetch_document_indicator(self, TokenClass): # Set the current intendation to -1. self.unwind_indent(-1) # Reset simple keys. Note that there could not be a block collection # after '---'. self.remove_possible_simple_key() self.allow_simple_key = False # Add DOCUMENT-START or DOCUMENT-END. start_mark = self.get_mark() self.forward(3) end_mark = self.get_mark() self.tokens.append(TokenClass(start_mark, end_mark)) def fetch_flow_sequence_start(self): self.fetch_flow_collection_start(FlowSequenceStartToken) def fetch_flow_mapping_start(self): self.fetch_flow_collection_start(FlowMappingStartToken) def fetch_flow_collection_start(self, TokenClass): # '[' and '{' may start a simple key. self.save_possible_simple_key() # Increase the flow level. self.flow_level += 1 # Simple keys are allowed after '[' and '{'. self.allow_simple_key = True # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. start_mark = self.get_mark() self.forward() end_mark = self.get_mark() self.tokens.append(TokenClass(start_mark, end_mark)) def fetch_flow_sequence_end(self): self.fetch_flow_collection_end(FlowSequenceEndToken) def fetch_flow_mapping_end(self): self.fetch_flow_collection_end(FlowMappingEndToken) def fetch_flow_collection_end(self, TokenClass): # Reset possible simple key on the current level. self.remove_possible_simple_key() # Decrease the flow level. self.flow_level -= 1 # No simple keys after ']' or '}'. self.allow_simple_key = False # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. start_mark = self.get_mark() self.forward() end_mark = self.get_mark() self.tokens.append(TokenClass(start_mark, end_mark)) def fetch_flow_entry(self): # Simple keys are allowed after ','. self.allow_simple_key = True # Reset possible simple key on the current level. self.remove_possible_simple_key() # Add FLOW-ENTRY. start_mark = self.get_mark() self.forward() end_mark = self.get_mark() self.tokens.append(FlowEntryToken(start_mark, end_mark)) def fetch_block_entry(self): # Block context needs additional checks. if not self.flow_level: # Are we allowed to start a new entry? if not self.allow_simple_key: raise ScannerError(None, None, "sequence entries are not allowed here", self.get_mark()) # We may need to add BLOCK-SEQUENCE-START. if self.add_indent(self.column): mark = self.get_mark() self.tokens.append(BlockSequenceStartToken(mark, mark)) # It's an error for the block entry to occur in the flow context, # but we let the parser detect this. else: pass # Simple keys are allowed after '-'. self.allow_simple_key = True # Reset possible simple key on the current level. self.remove_possible_simple_key() # Add BLOCK-ENTRY. start_mark = self.get_mark() self.forward() end_mark = self.get_mark() self.tokens.append(BlockEntryToken(start_mark, end_mark)) def fetch_key(self): # Block context needs additional checks. if not self.flow_level: # Are we allowed to start a key (not nessesary a simple)? if not self.allow_simple_key: raise ScannerError(None, None, "mapping keys are not allowed here", self.get_mark()) # We may need to add BLOCK-MAPPING-START. if self.add_indent(self.column): mark = self.get_mark() self.tokens.append(BlockMappingStartToken(mark, mark)) # Simple keys are allowed after '?' in the block context. self.allow_simple_key = not self.flow_level # Reset possible simple key on the current level. self.remove_possible_simple_key() # Add KEY. start_mark = self.get_mark() self.forward() end_mark = self.get_mark() self.tokens.append(KeyToken(start_mark, end_mark)) def fetch_value(self): # Do we determine a simple key? if self.flow_level in self.possible_simple_keys: # Add KEY. key = self.possible_simple_keys[self.flow_level] del self.possible_simple_keys[self.flow_level] self.tokens.insert(key.token_number-self.tokens_taken, KeyToken(key.mark, key.mark)) # If this key starts a new block mapping, we need to add # BLOCK-MAPPING-START. if not self.flow_level: if self.add_indent(key.column): self.tokens.insert(key.token_number-self.tokens_taken, BlockMappingStartToken(key.mark, key.mark)) # There cannot be two simple keys one after another. self.allow_simple_key = False # It must be a part of a complex key. else: # Block context needs additional checks. # (Do we really need them? They will be catched by the parser # anyway.) if not self.flow_level: # We are allowed to start a complex value if and only if # we can start a simple key. if not self.allow_simple_key: raise ScannerError(None, None, "mapping values are not allowed here", self.get_mark()) # If this value starts a new block mapping, we need to add # BLOCK-MAPPING-START. It will be detected as an error later by # the parser. if not self.flow_level: if self.add_indent(self.column): mark = self.get_mark() self.tokens.append(BlockMappingStartToken(mark, mark)) # Simple keys are allowed after ':' in the block context. self.allow_simple_key = not self.flow_level # Reset possible simple key on the current level. self.remove_possible_simple_key() # Add VALUE. start_mark = self.get_mark() self.forward() end_mark = self.get_mark() self.tokens.append(ValueToken(start_mark, end_mark)) def fetch_alias(self): # ALIAS could be a simple key. self.save_possible_simple_key() # No simple keys after ALIAS. self.allow_simple_key = False # Scan and add ALIAS. self.tokens.append(self.scan_anchor(AliasToken)) def fetch_anchor(self): # ANCHOR could start a simple key. self.save_possible_simple_key() # No simple keys after ANCHOR. self.allow_simple_key = False # Scan and add ANCHOR. self.tokens.append(self.scan_anchor(AnchorToken)) def fetch_tag(self): # TAG could start a simple key. self.save_possible_simple_key() # No simple keys after TAG. self.allow_simple_key = False # Scan and add TAG. self.tokens.append(self.scan_tag()) def fetch_literal(self): self.fetch_block_scalar(style='|') def fetch_folded(self): self.fetch_block_scalar(style='>') def fetch_block_scalar(self, style): # A simple key may follow a block scalar. self.allow_simple_key = True # Reset possible simple key on the current level. self.remove_possible_simple_key() # Scan and add SCALAR. self.tokens.append(self.scan_block_scalar(style)) def fetch_single(self): self.fetch_flow_scalar(style='\'') def fetch_double(self): self.fetch_flow_scalar(style='"') def fetch_flow_scalar(self, style): # A flow scalar could be a simple key. self.save_possible_simple_key() # No simple keys after flow scalars. self.allow_simple_key = False # Scan and add SCALAR. self.tokens.append(self.scan_flow_scalar(style)) def fetch_plain(self): # A plain scalar could be a simple key. self.save_possible_simple_key() # No simple keys after plain scalars. But note that `scan_plain` will # change this flag if the scan is finished at the beginning of the # line. self.allow_simple_key = False # Scan and add SCALAR. May change `allow_simple_key`. self.tokens.append(self.scan_plain()) # Checkers. def check_directive(self): # DIRECTIVE: ^ '%' ... # The '%' indicator is already checked. if self.column == 0: return True def check_document_start(self): # DOCUMENT-START: ^ '---' (' '|'\n') if self.column == 0: if self.prefix(3) == '---' \ and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': return True def check_document_end(self): # DOCUMENT-END: ^ '...' (' '|'\n') if self.column == 0: if self.prefix(3) == '...' \ and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': return True def check_block_entry(self): # BLOCK-ENTRY: '-' (' '|'\n') return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' def check_key(self): # KEY(flow context): '?' if self.flow_level: return True # KEY(block context): '?' (' '|'\n') else: return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' def check_value(self): # VALUE(flow context): ':' if self.flow_level: return True # VALUE(block context): ':' (' '|'\n') else: return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' def check_plain(self): # A plain scalar may start with any non-space character except: # '-', '?', ':', ',', '[', ']', '{', '}', # '#', '&', '*', '!', '|', '>', '\'', '\"', # '%', '@', '`'. # # It may also start with # '-', '?', ':' # if it is followed by a non-space character. # # Note that we limit the last rule to the block context (except the # '-' character) because we want the flow context to be space # independent. ch = self.peek() return ch not in '\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ or (self.peek(1) not in '\0 \t\r\n\x85\u2028\u2029' and (ch == '-' or (not self.flow_level and ch in '?:'))) # Scanners. def scan_to_next_token(self): # We ignore spaces, line breaks and comments. # If we find a line break in the block context, we set the flag # `allow_simple_key` on. # The byte order mark is stripped if it's the first character in the # stream. We do not yet support BOM inside the stream as the # specification requires. Any such mark will be considered as a part # of the document. # # TODO: We need to make tab handling rules more sane. A good rule is # Tabs cannot precede tokens # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, # KEY(block), VALUE(block), BLOCK-ENTRY # So the checking code is # if : # self.allow_simple_keys = False # We also need to add the check for `allow_simple_keys == True` to # `unwind_indent` before issuing BLOCK-END. # Scanners for block, flow, and plain scalars need to be modified. if self.index == 0 and self.peek() == '\uFEFF': self.forward() found = False while not found: while self.peek() == ' ': self.forward() if self.peek() == '#': while self.peek() not in '\0\r\n\x85\u2028\u2029': self.forward() if self.scan_line_break(): if not self.flow_level: self.allow_simple_key = True else: found = True def scan_directive(self): # See the specification for details. start_mark = self.get_mark() self.forward() name = self.scan_directive_name(start_mark) value = None if name == 'YAML': value = self.scan_yaml_directive_value(start_mark) end_mark = self.get_mark() elif name == 'TAG': value = self.scan_tag_directive_value(start_mark) end_mark = self.get_mark() else: end_mark = self.get_mark() while self.peek() not in '\0\r\n\x85\u2028\u2029': self.forward() self.scan_directive_ignored_line(start_mark) return DirectiveToken(name, value, start_mark, end_mark) def scan_directive_name(self, start_mark): # See the specification for details. length = 0 ch = self.peek(length) while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-_': length += 1 ch = self.peek(length) if not length: raise ScannerError("while scanning a directive", start_mark, "expected alphabetic or numeric character, but found %r" % ch, self.get_mark()) value = self.prefix(length) self.forward(length) ch = self.peek() if ch not in '\0 \r\n\x85\u2028\u2029': raise ScannerError("while scanning a directive", start_mark, "expected alphabetic or numeric character, but found %r" % ch, self.get_mark()) return value def scan_yaml_directive_value(self, start_mark): # See the specification for details. while self.peek() == ' ': self.forward() major = self.scan_yaml_directive_number(start_mark) if self.peek() != '.': raise ScannerError("while scanning a directive", start_mark, "expected a digit or '.', but found %r" % self.peek(), self.get_mark()) self.forward() minor = self.scan_yaml_directive_number(start_mark) if self.peek() not in '\0 \r\n\x85\u2028\u2029': raise ScannerError("while scanning a directive", start_mark, "expected a digit or ' ', but found %r" % self.peek(), self.get_mark()) return (major, minor) def scan_yaml_directive_number(self, start_mark): # See the specification for details. ch = self.peek() if not ('0' <= ch <= '9'): raise ScannerError("while scanning a directive", start_mark, "expected a digit, but found %r" % ch, self.get_mark()) length = 0 while '0' <= self.peek(length) <= '9': length += 1 value = int(self.prefix(length)) self.forward(length) return value def scan_tag_directive_value(self, start_mark): # See the specification for details. while self.peek() == ' ': self.forward() handle = self.scan_tag_directive_handle(start_mark) while self.peek() == ' ': self.forward() prefix = self.scan_tag_directive_prefix(start_mark) return (handle, prefix) def scan_tag_directive_handle(self, start_mark): # See the specification for details. value = self.scan_tag_handle('directive', start_mark) ch = self.peek() if ch != ' ': raise ScannerError("while scanning a directive", start_mark, "expected ' ', but found %r" % ch, self.get_mark()) return value def scan_tag_directive_prefix(self, start_mark): # See the specification for details. value = self.scan_tag_uri('directive', start_mark) ch = self.peek() if ch not in '\0 \r\n\x85\u2028\u2029': raise ScannerError("while scanning a directive", start_mark, "expected ' ', but found %r" % ch, self.get_mark()) return value def scan_directive_ignored_line(self, start_mark): # See the specification for details. while self.peek() == ' ': self.forward() if self.peek() == '#': while self.peek() not in '\0\r\n\x85\u2028\u2029': self.forward() ch = self.peek() if ch not in '\0\r\n\x85\u2028\u2029': raise ScannerError("while scanning a directive", start_mark, "expected a comment or a line break, but found %r" % ch, self.get_mark()) self.scan_line_break() def scan_anchor(self, TokenClass): # The specification does not restrict characters for anchors and # aliases. This may lead to problems, for instance, the document: # [ *alias, value ] # can be interpteted in two ways, as # [ "value" ] # and # [ *alias , "value" ] # Therefore we restrict aliases to numbers and ASCII letters. start_mark = self.get_mark() indicator = self.peek() if indicator == '*': name = 'alias' else: name = 'anchor' self.forward() length = 0 ch = self.peek(length) while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-_': length += 1 ch = self.peek(length) if not length: raise ScannerError("while scanning an %s" % name, start_mark, "expected alphabetic or numeric character, but found %r" % ch, self.get_mark()) value = self.prefix(length) self.forward(length) ch = self.peek() if ch not in '\0 \t\r\n\x85\u2028\u2029?:,]}%@`': raise ScannerError("while scanning an %s" % name, start_mark, "expected alphabetic or numeric character, but found %r" % ch, self.get_mark()) end_mark = self.get_mark() return TokenClass(value, start_mark, end_mark) def scan_tag(self): # See the specification for details. start_mark = self.get_mark() ch = self.peek(1) if ch == '<': handle = None self.forward(2) suffix = self.scan_tag_uri('tag', start_mark) if self.peek() != '>': raise ScannerError("while parsing a tag", start_mark, "expected '>', but found %r" % self.peek(), self.get_mark()) self.forward() elif ch in '\0 \t\r\n\x85\u2028\u2029': handle = None suffix = '!' self.forward() else: length = 1 use_handle = False while ch not in '\0 \r\n\x85\u2028\u2029': if ch == '!': use_handle = True break length += 1 ch = self.peek(length) handle = '!' if use_handle: handle = self.scan_tag_handle('tag', start_mark) else: handle = '!' self.forward() suffix = self.scan_tag_uri('tag', start_mark) ch = self.peek() if ch not in '\0 \r\n\x85\u2028\u2029': raise ScannerError("while scanning a tag", start_mark, "expected ' ', but found %r" % ch, self.get_mark()) value = (handle, suffix) end_mark = self.get_mark() return TagToken(value, start_mark, end_mark) def scan_block_scalar(self, style): # See the specification for details. if style == '>': folded = True else: folded = False chunks = [] start_mark = self.get_mark() # Scan the header. self.forward() chomping, increment = self.scan_block_scalar_indicators(start_mark) self.scan_block_scalar_ignored_line(start_mark) # Determine the indentation level and go to the first non-empty line. min_indent = self.indent+1 if min_indent < 1: min_indent = 1 if increment is None: breaks, max_indent, end_mark = self.scan_block_scalar_indentation() indent = max(min_indent, max_indent) else: indent = min_indent+increment-1 breaks, end_mark = self.scan_block_scalar_breaks(indent) line_break = '' # Scan the inner part of the block scalar. while self.column == indent and self.peek() != '\0': chunks.extend(breaks) leading_non_space = self.peek() not in ' \t' length = 0 while self.peek(length) not in '\0\r\n\x85\u2028\u2029': length += 1 chunks.append(self.prefix(length)) self.forward(length) line_break = self.scan_line_break() breaks, end_mark = self.scan_block_scalar_breaks(indent) if self.column == indent and self.peek() != '\0': # Unfortunately, folding rules are ambiguous. # # This is the folding according to the specification: if folded and line_break == '\n' \ and leading_non_space and self.peek() not in ' \t': if not breaks: chunks.append(' ') else: chunks.append(line_break) # This is Clark Evans's interpretation (also in the spec # examples): # #if folded and line_break == '\n': # if not breaks: # if self.peek() not in ' \t': # chunks.append(' ') # else: # chunks.append(line_break) #else: # chunks.append(line_break) else: break # Chomp the tail. if chomping is not False: chunks.append(line_break) if chomping is True: chunks.extend(breaks) # We are done. return ScalarToken(''.join(chunks), False, start_mark, end_mark, style) def scan_block_scalar_indicators(self, start_mark): # See the specification for details. chomping = None increment = None ch = self.peek() if ch in '+-': if ch == '+': chomping = True else: chomping = False self.forward() ch = self.peek() if ch in '0123456789': increment = int(ch) if increment == 0: raise ScannerError("while scanning a block scalar", start_mark, "expected indentation indicator in the range 1-9, but found 0", self.get_mark()) self.forward() elif ch in '0123456789': increment = int(ch) if increment == 0: raise ScannerError("while scanning a block scalar", start_mark, "expected indentation indicator in the range 1-9, but found 0", self.get_mark()) self.forward() ch = self.peek() if ch in '+-': if ch == '+': chomping = True else: chomping = False self.forward() ch = self.peek() if ch not in '\0 \r\n\x85\u2028\u2029': raise ScannerError("while scanning a block scalar", start_mark, "expected chomping or indentation indicators, but found %r" % ch, self.get_mark()) return chomping, increment def scan_block_scalar_ignored_line(self, start_mark): # See the specification for details. while self.peek() == ' ': self.forward() if self.peek() == '#': while self.peek() not in '\0\r\n\x85\u2028\u2029': self.forward() ch = self.peek() if ch not in '\0\r\n\x85\u2028\u2029': raise ScannerError("while scanning a block scalar", start_mark, "expected a comment or a line break, but found %r" % ch, self.get_mark()) self.scan_line_break() def scan_block_scalar_indentation(self): # See the specification for details. chunks = [] max_indent = 0 end_mark = self.get_mark() while self.peek() in ' \r\n\x85\u2028\u2029': if self.peek() != ' ': chunks.append(self.scan_line_break()) end_mark = self.get_mark() else: self.forward() if self.column > max_indent: max_indent = self.column return chunks, max_indent, end_mark def scan_block_scalar_breaks(self, indent): # See the specification for details. chunks = [] end_mark = self.get_mark() while self.column < indent and self.peek() == ' ': self.forward() while self.peek() in '\r\n\x85\u2028\u2029': chunks.append(self.scan_line_break()) end_mark = self.get_mark() while self.column < indent and self.peek() == ' ': self.forward() return chunks, end_mark def scan_flow_scalar(self, style): # See the specification for details. # Note that we loose indentation rules for quoted scalars. Quoted # scalars don't need to adhere indentation because " and ' clearly # mark the beginning and the end of them. Therefore we are less # restrictive then the specification requires. We only need to check # that document separators are not included in scalars. if style == '"': double = True else: double = False chunks = [] start_mark = self.get_mark() quote = self.peek() self.forward() chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) while self.peek() != quote: chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) self.forward() end_mark = self.get_mark() return ScalarToken(''.join(chunks), False, start_mark, end_mark, style) ESCAPE_REPLACEMENTS = { '0': '\0', 'a': '\x07', 'b': '\x08', 't': '\x09', '\t': '\x09', 'n': '\x0A', 'v': '\x0B', 'f': '\x0C', 'r': '\x0D', 'e': '\x1B', ' ': '\x20', '\"': '\"', '\\': '\\', 'N': '\x85', '_': '\xA0', 'L': '\u2028', 'P': '\u2029', } ESCAPE_CODES = { 'x': 2, 'u': 4, 'U': 8, } def scan_flow_scalar_non_spaces(self, double, start_mark): # See the specification for details. chunks = [] while True: length = 0 while self.peek(length) not in '\'\"\\\0 \t\r\n\x85\u2028\u2029': length += 1 if length: chunks.append(self.prefix(length)) self.forward(length) ch = self.peek() if not double and ch == '\'' and self.peek(1) == '\'': chunks.append('\'') self.forward(2) elif (double and ch == '\'') or (not double and ch in '\"\\'): chunks.append(ch) self.forward() elif double and ch == '\\': self.forward() ch = self.peek() if ch in self.ESCAPE_REPLACEMENTS: chunks.append(self.ESCAPE_REPLACEMENTS[ch]) self.forward() elif ch in self.ESCAPE_CODES: length = self.ESCAPE_CODES[ch] self.forward() for k in range(length): if self.peek(k) not in '0123456789ABCDEFabcdef': raise ScannerError("while scanning a double-quoted scalar", start_mark, "expected escape sequence of %d hexdecimal numbers, but found %r" % (length, self.peek(k)), self.get_mark()) code = int(self.prefix(length), 16) chunks.append(chr(code)) self.forward(length) elif ch in '\r\n\x85\u2028\u2029': self.scan_line_break() chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) else: raise ScannerError("while scanning a double-quoted scalar", start_mark, "found unknown escape character %r" % ch, self.get_mark()) else: return chunks def scan_flow_scalar_spaces(self, double, start_mark): # See the specification for details. chunks = [] length = 0 while self.peek(length) in ' \t': length += 1 whitespaces = self.prefix(length) self.forward(length) ch = self.peek() if ch == '\0': raise ScannerError("while scanning a quoted scalar", start_mark, "found unexpected end of stream", self.get_mark()) elif ch in '\r\n\x85\u2028\u2029': line_break = self.scan_line_break() breaks = self.scan_flow_scalar_breaks(double, start_mark) if line_break != '\n': chunks.append(line_break) elif not breaks: chunks.append(' ') chunks.extend(breaks) else: chunks.append(whitespaces) return chunks def scan_flow_scalar_breaks(self, double, start_mark): # See the specification for details. chunks = [] while True: # Instead of checking indentation, we check for document # separators. prefix = self.prefix(3) if (prefix == '---' or prefix == '...') \ and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': raise ScannerError("while scanning a quoted scalar", start_mark, "found unexpected document separator", self.get_mark()) while self.peek() in ' \t': self.forward() if self.peek() in '\r\n\x85\u2028\u2029': chunks.append(self.scan_line_break()) else: return chunks def scan_plain(self): # See the specification for details. # We add an additional restriction for the flow context: # plain scalars in the flow context cannot contain ',', ':' and '?'. # We also keep track of the `allow_simple_key` flag here. # Indentation rules are loosed for the flow context. chunks = [] start_mark = self.get_mark() end_mark = start_mark indent = self.indent+1 # We allow zero indentation for scalars, but then we need to check for # document separators at the beginning of the line. #if indent == 0: # indent = 1 spaces = [] while True: length = 0 if self.peek() == '#': break while True: ch = self.peek(length) if ch in '\0 \t\r\n\x85\u2028\u2029' \ or (not self.flow_level and ch == ':' and self.peek(length+1) in '\0 \t\r\n\x85\u2028\u2029') \ or (self.flow_level and ch in ',:?[]{}'): break length += 1 # It's not clear what we should do with ':' in the flow context. if (self.flow_level and ch == ':' and self.peek(length+1) not in '\0 \t\r\n\x85\u2028\u2029,[]{}'): self.forward(length) raise ScannerError("while scanning a plain scalar", start_mark, "found unexpected ':'", self.get_mark(), "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") if length == 0: break self.allow_simple_key = False chunks.extend(spaces) chunks.append(self.prefix(length)) self.forward(length) end_mark = self.get_mark() spaces = self.scan_plain_spaces(indent, start_mark) if not spaces or self.peek() == '#' \ or (not self.flow_level and self.column < indent): break return ScalarToken(''.join(chunks), True, start_mark, end_mark) def scan_plain_spaces(self, indent, start_mark): # See the specification for details. # The specification is really confusing about tabs in plain scalars. # We just forbid them completely. Do not use tabs in YAML! chunks = [] length = 0 while self.peek(length) in ' ': length += 1 whitespaces = self.prefix(length) self.forward(length) ch = self.peek() if ch in '\r\n\x85\u2028\u2029': line_break = self.scan_line_break() self.allow_simple_key = True prefix = self.prefix(3) if (prefix == '---' or prefix == '...') \ and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': return breaks = [] while self.peek() in ' \r\n\x85\u2028\u2029': if self.peek() == ' ': self.forward() else: breaks.append(self.scan_line_break()) prefix = self.prefix(3) if (prefix == '---' or prefix == '...') \ and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': return if line_break != '\n': chunks.append(line_break) elif not breaks: chunks.append(' ') chunks.extend(breaks) elif whitespaces: chunks.append(whitespaces) return chunks def scan_tag_handle(self, name, start_mark): # See the specification for details. # For some strange reasons, the specification does not allow '_' in # tag handles. I have allowed it anyway. ch = self.peek() if ch != '!': raise ScannerError("while scanning a %s" % name, start_mark, "expected '!', but found %r" % ch, self.get_mark()) length = 1 ch = self.peek(length) if ch != ' ': while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-_': length += 1 ch = self.peek(length) if ch != '!': self.forward(length) raise ScannerError("while scanning a %s" % name, start_mark, "expected '!', but found %r" % ch, self.get_mark()) length += 1 value = self.prefix(length) self.forward(length) return value def scan_tag_uri(self, name, start_mark): # See the specification for details. # Note: we do not check if URI is well-formed. chunks = [] length = 0 ch = self.peek(length) while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ or ch in '-;/?:@&=+$,_.!~*\'()[]%': if ch == '%': chunks.append(self.prefix(length)) self.forward(length) length = 0 chunks.append(self.scan_uri_escapes(name, start_mark)) else: length += 1 ch = self.peek(length) if length: chunks.append(self.prefix(length)) self.forward(length) length = 0 if not chunks: raise ScannerError("while parsing a %s" % name, start_mark, "expected URI, but found %r" % ch, self.get_mark()) return ''.join(chunks) def scan_uri_escapes(self, name, start_mark): # See the specification for details. codes = [] mark = self.get_mark() while self.peek() == '%': self.forward() for k in range(2): if self.peek(k) not in '0123456789ABCDEFabcdef': raise ScannerError("while scanning a %s" % name, start_mark, "expected URI escape sequence of 2 hexdecimal numbers, but found %r" % self.peek(k), self.get_mark()) codes.append(int(self.prefix(2), 16)) self.forward(2) try: value = bytes(codes).decode('utf-8') except UnicodeDecodeError as exc: raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) return value def scan_line_break(self): # Transforms: # '\r\n' : '\n' # '\r' : '\n' # '\n' : '\n' # '\x85' : '\n' # '\u2028' : '\u2028' # '\u2029 : '\u2029' # default : '' ch = self.peek() if ch in '\r\n\x85': if self.prefix(2) == '\r\n': self.forward(2) else: self.forward() return '\n' elif ch in '\u2028\u2029': self.forward() return ch return '' #try: # import psyco # psyco.bind(Scanner) #except ImportError: # pass PK! nodes.pynu[ class Node(object): def __init__(self, tag, value, start_mark, end_mark): self.tag = tag self.value = value self.start_mark = start_mark self.end_mark = end_mark def __repr__(self): value = self.value #if isinstance(value, list): # if len(value) == 0: # value = '' # elif len(value) == 1: # value = '<1 item>' # else: # value = '<%d items>' % len(value) #else: # if len(value) > 75: # value = repr(value[:70]+u' ... ') # else: # value = repr(value) value = repr(value) return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) class ScalarNode(Node): id = 'scalar' def __init__(self, tag, value, start_mark=None, end_mark=None, style=None): self.tag = tag self.value = value self.start_mark = start_mark self.end_mark = end_mark self.style = style class CollectionNode(Node): def __init__(self, tag, value, start_mark=None, end_mark=None, flow_style=None): self.tag = tag self.value = value self.start_mark = start_mark self.end_mark = end_mark self.flow_style = flow_style class SequenceNode(CollectionNode): id = 'sequence' class MappingNode(CollectionNode): id = 'mapping' PK!t # # resolver.pynu[ __all__ = ['BaseResolver', 'Resolver'] from .error import * from .nodes import * import re class ResolverError(YAMLError): pass class BaseResolver: DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' yaml_implicit_resolvers = {} yaml_path_resolvers = {} def __init__(self): self.resolver_exact_paths = [] self.resolver_prefix_paths = [] @classmethod def add_implicit_resolver(cls, tag, regexp, first): if not 'yaml_implicit_resolvers' in cls.__dict__: implicit_resolvers = {} for key in cls.yaml_implicit_resolvers: implicit_resolvers[key] = cls.yaml_implicit_resolvers[key][:] cls.yaml_implicit_resolvers = implicit_resolvers if first is None: first = [None] for ch in first: cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) @classmethod def add_path_resolver(cls, tag, path, kind=None): # Note: `add_path_resolver` is experimental. The API could be changed. # `new_path` is a pattern that is matched against the path from the # root to the node that is being considered. `node_path` elements are # tuples `(node_check, index_check)`. `node_check` is a node class: # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` # matches any kind of a node. `index_check` could be `None`, a boolean # value, a string value, or a number. `None` and `False` match against # any _value_ of sequence and mapping nodes. `True` matches against # any _key_ of a mapping node. A string `index_check` matches against # a mapping value that corresponds to a scalar key which content is # equal to the `index_check` value. An integer `index_check` matches # against a sequence value with the index equal to `index_check`. if not 'yaml_path_resolvers' in cls.__dict__: cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() new_path = [] for element in path: if isinstance(element, (list, tuple)): if len(element) == 2: node_check, index_check = element elif len(element) == 1: node_check = element[0] index_check = True else: raise ResolverError("Invalid path element: %s" % element) else: node_check = None index_check = element if node_check is str: node_check = ScalarNode elif node_check is list: node_check = SequenceNode elif node_check is dict: node_check = MappingNode elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ and not isinstance(node_check, str) \ and node_check is not None: raise ResolverError("Invalid node checker: %s" % node_check) if not isinstance(index_check, (str, int)) \ and index_check is not None: raise ResolverError("Invalid index checker: %s" % index_check) new_path.append((node_check, index_check)) if kind is str: kind = ScalarNode elif kind is list: kind = SequenceNode elif kind is dict: kind = MappingNode elif kind not in [ScalarNode, SequenceNode, MappingNode] \ and kind is not None: raise ResolverError("Invalid node kind: %s" % kind) cls.yaml_path_resolvers[tuple(new_path), kind] = tag def descend_resolver(self, current_node, current_index): if not self.yaml_path_resolvers: return exact_paths = {} prefix_paths = [] if current_node: depth = len(self.resolver_prefix_paths) for path, kind in self.resolver_prefix_paths[-1]: if self.check_resolver_prefix(depth, path, kind, current_node, current_index): if len(path) > depth: prefix_paths.append((path, kind)) else: exact_paths[kind] = self.yaml_path_resolvers[path, kind] else: for path, kind in self.yaml_path_resolvers: if not path: exact_paths[kind] = self.yaml_path_resolvers[path, kind] else: prefix_paths.append((path, kind)) self.resolver_exact_paths.append(exact_paths) self.resolver_prefix_paths.append(prefix_paths) def ascend_resolver(self): if not self.yaml_path_resolvers: return self.resolver_exact_paths.pop() self.resolver_prefix_paths.pop() def check_resolver_prefix(self, depth, path, kind, current_node, current_index): node_check, index_check = path[depth-1] if isinstance(node_check, str): if current_node.tag != node_check: return elif node_check is not None: if not isinstance(current_node, node_check): return if index_check is True and current_index is not None: return if (index_check is False or index_check is None) \ and current_index is None: return if isinstance(index_check, str): if not (isinstance(current_index, ScalarNode) and index_check == current_index.value): return elif isinstance(index_check, int) and not isinstance(index_check, bool): if index_check != current_index: return return True def resolve(self, kind, value, implicit): if kind is ScalarNode and implicit[0]: if value == '': resolvers = self.yaml_implicit_resolvers.get('', []) else: resolvers = self.yaml_implicit_resolvers.get(value[0], []) resolvers += self.yaml_implicit_resolvers.get(None, []) for tag, regexp in resolvers: if regexp.match(value): return tag implicit = implicit[1] if self.yaml_path_resolvers: exact_paths = self.resolver_exact_paths[-1] if kind in exact_paths: return exact_paths[kind] if None in exact_paths: return exact_paths[None] if kind is ScalarNode: return self.DEFAULT_SCALAR_TAG elif kind is SequenceNode: return self.DEFAULT_SEQUENCE_TAG elif kind is MappingNode: return self.DEFAULT_MAPPING_TAG class Resolver(BaseResolver): pass Resolver.add_implicit_resolver( 'tag:yaml.org,2002:bool', re.compile(r'''^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF)$''', re.X), list('yYnNtTfFoO')) Resolver.add_implicit_resolver( 'tag:yaml.org,2002:float', re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? |\.[0-9_]+(?:[eE][-+][0-9]+)? |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* |[-+]?\.(?:inf|Inf|INF) |\.(?:nan|NaN|NAN))$''', re.X), list('-+0123456789.')) Resolver.add_implicit_resolver( 'tag:yaml.org,2002:int', re.compile(r'''^(?:[-+]?0b[0-1_]+ |[-+]?0[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+ |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), list('-+0123456789')) Resolver.add_implicit_resolver( 'tag:yaml.org,2002:merge', re.compile(r'^(?:<<)$'), ['<']) Resolver.add_implicit_resolver( 'tag:yaml.org,2002:null', re.compile(r'''^(?: ~ |null|Null|NULL | )$''', re.X), ['~', 'n', 'N', '']) Resolver.add_implicit_resolver( 'tag:yaml.org,2002:timestamp', re.compile(r'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? (?:[Tt]|[ \t]+)[0-9][0-9]? :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), list('0123456789')) Resolver.add_implicit_resolver( 'tag:yaml.org,2002:value', re.compile(r'^(?:=)$'), ['=']) # The following resolver is only for documentation purposes. It cannot work # because plain scalars cannot start with '!', '&', or '*'. Resolver.add_implicit_resolver( 'tag:yaml.org,2002:yaml', re.compile(r'^(?:!|&|\*)$'), list('!&*')) PK!["%% __init__.pynu[PK! %events.pynu[PK!ʧʧ /emitter.pynu[PK!kC cyaml.pynu[PK!A tokens.pynu[PK!ߣ dumper.pynu[PK!!q )__pycache__/composer.cpython-36.opt-1.pycnu[PK!v-22'__pycache__/tokens.cpython-36.opt-1.pycnu[PK!k8&8__pycache__/error.cpython-36.opt-1.pycnu[PK!M..'A%__pycache__/parser.cpython-36.opt-1.pycnu[PK!7$!S__pycache__/dumper.cpython-36.pycnu[PK!i('[__pycache__/events.cpython-36.opt-1.pycnu[PK!0%**)k__pycache__/resolver.cpython-36.opt-1.pycnu[PK!0%**#3__pycache__/resolver.cpython-36.pycnu[PK!abb"__pycache__/emitter.cpython-36.pycnu[PK!p r r __pycache__/cyaml.cpython-36.pycnu[PK!&__pycache__/nodes.cpython-36.opt-1.pycnu[PK!7$' __pycache__/dumper.cpython-36.opt-1.pycnu[PK!!q #__pycache__/composer.cpython-36.pycnu[PK!Ąm'r"__pycache__/loader.cpython-36.opt-1.pycnu[PK!F'F',(__pycache__/representer.cpython-36.opt-1.pycnu[PK!˱eXIXI,-P__pycache__/constructor.cpython-36.opt-1.pycnu[PK!p r r &__pycache__/cyaml.cpython-36.opt-1.pycnu[PK!i(!__pycache__/events.cpython-36.pycnu[PK!Ąm!__pycache__/loader.cpython-36.pycnu[PK!F'F'&__pycache__/representer.cpython-36.pycnu[PK!Jeee(V__pycache__/scanner.cpython-36.opt-1.pycnu[PK!D`i +UI__pycache__/serializer.cpython-36.opt-1.pycnu[PK!k8 V__pycache__/error.cpython-36.pycnu[PK!˱eXIXI&___pycache__/constructor.cpython-36.pycnu[PK!@BKK'L__pycache__/reader.cpython-36.opt-1.pycnu[PK!v-22!__pycache__/tokens.cpython-36.pycnu[PK!abb(q__pycache__/emitter.cpython-36.opt-1.pycnu[PK! 2__pycache__/nodes.cpython-36.pycnu[PK!D`i %9__pycache__/serializer.cpython-36.pycnu[PK!@BKK!F__pycache__/reader.cpython-36.pycnu[PK!!F###dX__pycache__/__init__.cpython-36.pycnu[PK!!F##)j|__pycache__/__init__.cpython-36.opt-1.pycnu[PK!XG.G.!v__pycache__/parser.cpython-36.pycnu[PK!Jeee"__pycache__/scanner.cpython-36.pycnu[PK!HV 5error.pynu[PK!j,\ $?composer.pynu[PK!`լrr pRloader.pynu[PK!I@cc Wparser.pynu[PK! sM reader.pynu[PK! Ve77representer.pynu[PK!_