summaryrefslogtreecommitdiff
path: root/ext/_ruamel_yaml.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'ext/_ruamel_yaml.pyx')
-rw-r--r--ext/_ruamel_yaml.pyx1526
1 files changed, 0 insertions, 1526 deletions
diff --git a/ext/_ruamel_yaml.pyx b/ext/_ruamel_yaml.pyx
deleted file mode 100644
index cf0204a..0000000
--- a/ext/_ruamel_yaml.pyx
+++ /dev/null
@@ -1,1526 +0,0 @@
-
-
-def get_version_string():
- cdef char *value
- value = yaml_get_version_string()
- if PY_MAJOR_VERSION < 3:
- return value
- else:
- return PyUnicode_FromString(value)
-
-def get_version():
- cdef int major, minor, patch
- yaml_get_version(&major, &minor, &patch)
- return (major, minor, patch)
-
-#Mark = yaml.error.Mark
-from ruamel.yaml.error import YAMLError
-from ruamel.yaml.reader import ReaderError
-from ruamel.yaml.scanner import ScannerError
-from ruamel.yaml.parser import ParserError
-from ruamel.yaml.composer import ComposerError
-from ruamel.yaml.constructor import ConstructorError
-from ruamel.yaml.emitter import EmitterError
-from ruamel.yaml.serializer import SerializerError
-from ruamel.yaml.representer import RepresenterError
-
-from ruamel.yaml.tokens import StreamStartToken
-from ruamel.yaml.tokens import StreamEndToken
-from ruamel.yaml.tokens import DirectiveToken
-from ruamel.yaml.tokens import DocumentStartToken
-from ruamel.yaml.tokens import DocumentEndToken
-from ruamel.yaml.tokens import BlockSequenceStartToken
-from ruamel.yaml.tokens import BlockMappingStartToken
-from ruamel.yaml.tokens import BlockEndToken
-from ruamel.yaml.tokens import FlowSequenceStartToken
-from ruamel.yaml.tokens import FlowMappingStartToken
-from ruamel.yaml.tokens import FlowSequenceEndToken
-from ruamel.yaml.tokens import FlowMappingEndToken
-from ruamel.yaml.tokens import KeyToken
-from ruamel.yaml.tokens import ValueToken
-from ruamel.yaml.tokens import BlockEntryToken
-from ruamel.yaml.tokens import FlowEntryToken
-from ruamel.yaml.tokens import AliasToken
-from ruamel.yaml.tokens import AnchorToken
-from ruamel.yaml.tokens import TagToken
-from ruamel.yaml.tokens import ScalarToken
-
-from ruamel.yaml.events import StreamStartEvent
-from ruamel.yaml.events import StreamEndEvent
-from ruamel.yaml.events import DocumentStartEvent
-from ruamel.yaml.events import DocumentEndEvent
-from ruamel.yaml.events import AliasEvent
-from ruamel.yaml.events import ScalarEvent
-from ruamel.yaml.events import SequenceStartEvent
-from ruamel.yaml.events import SequenceEndEvent
-from ruamel.yaml.events import MappingStartEvent
-from ruamel.yaml.events import MappingEndEvent
-
-from ruamel.yaml.nodes import ScalarNode
-from ruamel.yaml.nodes import SequenceNode
-from ruamel.yaml.nodes import MappingNode
-
-cdef class Mark:
- cdef readonly object name
- cdef readonly int index
- cdef readonly int line
- cdef readonly int column
- cdef readonly buffer
- cdef readonly pointer
-
- def __init__(self, object name, int index, int line, int column,
- object buffer, object pointer):
- self.name = name
- self.index = index
- self.line = line
- self.column = column
- self.buffer = buffer
- self.pointer = pointer
-
- def get_snippet(self):
- return None
-
- def __str__(self):
- where = " in \"%s\", line %d, column %d" \
- % (self.name, self.line+1, self.column+1)
- 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)
-#
-#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, str):
-# 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" \
-# % (ord(self.character), self.reason,
-# self.name, self.position)
-#
-#class ScannerError(MarkedYAMLError):
-# pass
-#
-#class ParserError(MarkedYAMLError):
-# pass
-#
-#class EmitterError(YAMLError):
-# pass
-#
-#cdef class Token:
-# cdef readonly Mark start_mark
-# cdef readonly Mark end_mark
-# def __init__(self, Mark start_mark, Mark end_mark):
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-#
-#cdef class StreamStartToken(Token):
-# cdef readonly object encoding
-# def __init__(self, Mark start_mark, Mark end_mark, encoding):
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-# self.encoding = encoding
-#
-#cdef class StreamEndToken(Token):
-# pass
-#
-#cdef class DirectiveToken(Token):
-# cdef readonly object name
-# cdef readonly object value
-# def __init__(self, name, value, Mark start_mark, Mark end_mark):
-# self.name = name
-# self.value = value
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-#
-#cdef class DocumentStartToken(Token):
-# pass
-#
-#cdef class DocumentEndToken(Token):
-# pass
-#
-#cdef class BlockSequenceStartToken(Token):
-# pass
-#
-#cdef class BlockMappingStartToken(Token):
-# pass
-#
-#cdef class BlockEndToken(Token):
-# pass
-#
-#cdef class FlowSequenceStartToken(Token):
-# pass
-#
-#cdef class FlowMappingStartToken(Token):
-# pass
-#
-#cdef class FlowSequenceEndToken(Token):
-# pass
-#
-#cdef class FlowMappingEndToken(Token):
-# pass
-#
-#cdef class KeyToken(Token):
-# pass
-#
-#cdef class ValueToken(Token):
-# pass
-#
-#cdef class BlockEntryToken(Token):
-# pass
-#
-#cdef class FlowEntryToken(Token):
-# pass
-#
-#cdef class AliasToken(Token):
-# cdef readonly object value
-# def __init__(self, value, Mark start_mark, Mark end_mark):
-# self.value = value
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-#
-#cdef class AnchorToken(Token):
-# cdef readonly object value
-# def __init__(self, value, Mark start_mark, Mark end_mark):
-# self.value = value
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-#
-#cdef class TagToken(Token):
-# cdef readonly object value
-# def __init__(self, value, Mark start_mark, Mark end_mark):
-# self.value = value
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-#
-#cdef class ScalarToken(Token):
-# cdef readonly object value
-# cdef readonly object plain
-# cdef readonly object style
-# def __init__(self, value, plain, Mark start_mark, Mark end_mark, style=None):
-# self.value = value
-# self.plain = plain
-# self.start_mark = start_mark
-# self.end_mark = end_mark
-# self.style = style
-
-cdef class CParser:
-
- cdef yaml_parser_t parser
- cdef yaml_event_t parsed_event
-
- cdef object stream
- cdef object stream_name
- cdef object current_token
- cdef object current_event
- cdef object anchors
- cdef object stream_cache
- cdef int stream_cache_len
- cdef int stream_cache_pos
- cdef int unicode_source
-
- def __init__(self, stream):
- cdef is_readable
- if yaml_parser_initialize(&self.parser) == 0:
- raise MemoryError
- self.parsed_event.type = YAML_NO_EVENT
- is_readable = 1
- try:
- stream.read
- except AttributeError:
- is_readable = 0
- self.unicode_source = 0
- if is_readable:
- self.stream = stream
- try:
- self.stream_name = stream.name
- except AttributeError:
- if PY_MAJOR_VERSION < 3:
- self.stream_name = '<file>'
- else:
- self.stream_name = u'<file>'
- self.stream_cache = None
- self.stream_cache_len = 0
- self.stream_cache_pos = 0
- yaml_parser_set_input(&self.parser, input_handler, <void *>self)
- else:
- if PyUnicode_CheckExact(stream) != 0:
- stream = PyUnicode_AsUTF8String(stream)
- if PY_MAJOR_VERSION < 3:
- self.stream_name = '<unicode string>'
- else:
- self.stream_name = u'<unicode string>'
- self.unicode_source = 1
- else:
- if PY_MAJOR_VERSION < 3:
- self.stream_name = '<byte string>'
- else:
- self.stream_name = u'<byte string>'
- if PyString_CheckExact(stream) == 0:
- if PY_MAJOR_VERSION < 3:
- raise TypeError("a string or stream input is required")
- else:
- raise TypeError(u"a string or stream input is required")
- self.stream = stream
- yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream))
- self.current_token = None
- self.current_event = None
- self.anchors = {}
-
- def __dealloc__(self):
- yaml_parser_delete(&self.parser)
- yaml_event_delete(&self.parsed_event)
-
- def dispose(self):
- pass
-
- cdef object _parser_error(self):
- if self.parser.error == YAML_MEMORY_ERROR:
- return MemoryError
- elif self.parser.error == YAML_READER_ERROR:
- if PY_MAJOR_VERSION < 3:
- return ReaderError(self.stream_name, self.parser.problem_offset,
- self.parser.problem_value, '?', self.parser.problem)
- else:
- return ReaderError(self.stream_name, self.parser.problem_offset,
- self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem))
- elif self.parser.error == YAML_SCANNER_ERROR \
- or self.parser.error == YAML_PARSER_ERROR:
- context_mark = None
- problem_mark = None
- if self.parser.context != NULL:
- context_mark = Mark(self.stream_name,
- self.parser.context_mark.index,
- self.parser.context_mark.line,
- self.parser.context_mark.column, None, None)
- if self.parser.problem != NULL:
- problem_mark = Mark(self.stream_name,
- self.parser.problem_mark.index,
- self.parser.problem_mark.line,
- self.parser.problem_mark.column, None, None)
- context = None
- if self.parser.context != NULL:
- if PY_MAJOR_VERSION < 3:
- context = self.parser.context
- else:
- context = PyUnicode_FromString(self.parser.context)
- if PY_MAJOR_VERSION < 3:
- problem = self.parser.problem
- else:
- problem = PyUnicode_FromString(self.parser.problem)
- if self.parser.error == YAML_SCANNER_ERROR:
- return ScannerError(context, context_mark, problem, problem_mark)
- else:
- return ParserError(context, context_mark, problem, problem_mark)
- if PY_MAJOR_VERSION < 3:
- raise ValueError("no parser error")
- else:
- raise ValueError(u"no parser error")
-
- def raw_scan(self):
- cdef yaml_token_t token
- cdef int done
- cdef int count
- count = 0
- done = 0
- while done == 0:
- if yaml_parser_scan(&self.parser, &token) == 0:
- error = self._parser_error()
- raise error
- if token.type == YAML_NO_TOKEN:
- done = 1
- else:
- count = count+1
- yaml_token_delete(&token)
- return count
-
- cdef object _scan(self):
- cdef yaml_token_t token
- if yaml_parser_scan(&self.parser, &token) == 0:
- error = self._parser_error()
- raise error
- token_object = self._token_to_object(&token)
- yaml_token_delete(&token)
- return token_object
-
- cdef object _token_to_object(self, yaml_token_t *token):
- start_mark = Mark(self.stream_name,
- token.start_mark.index,
- token.start_mark.line,
- token.start_mark.column,
- None, None)
- end_mark = Mark(self.stream_name,
- token.end_mark.index,
- token.end_mark.line,
- token.end_mark.column,
- None, None)
- if token.type == YAML_NO_TOKEN:
- return None
- elif token.type == YAML_STREAM_START_TOKEN:
- encoding = None
- if token.data.stream_start.encoding == YAML_UTF8_ENCODING:
- if self.unicode_source == 0:
- encoding = u"utf-8"
- elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING:
- encoding = u"utf-16-le"
- elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING:
- encoding = u"utf-16-be"
- return StreamStartToken(start_mark, end_mark, encoding)
- elif token.type == YAML_STREAM_END_TOKEN:
- return StreamEndToken(start_mark, end_mark)
- elif token.type == YAML_VERSION_DIRECTIVE_TOKEN:
- return DirectiveToken(u"YAML",
- (token.data.version_directive.major,
- token.data.version_directive.minor),
- start_mark, end_mark)
- elif token.type == YAML_TAG_DIRECTIVE_TOKEN:
- handle = PyUnicode_FromString(token.data.tag_directive.handle)
- prefix = PyUnicode_FromString(token.data.tag_directive.prefix)
- return DirectiveToken(u"TAG", (handle, prefix),
- start_mark, end_mark)
- elif token.type == YAML_DOCUMENT_START_TOKEN:
- return DocumentStartToken(start_mark, end_mark)
- elif token.type == YAML_DOCUMENT_END_TOKEN:
- return DocumentEndToken(start_mark, end_mark)
- elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN:
- return BlockSequenceStartToken(start_mark, end_mark)
- elif token.type == YAML_BLOCK_MAPPING_START_TOKEN:
- return BlockMappingStartToken(start_mark, end_mark)
- elif token.type == YAML_BLOCK_END_TOKEN:
- return BlockEndToken(start_mark, end_mark)
- elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN:
- return FlowSequenceStartToken(start_mark, end_mark)
- elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN:
- return FlowSequenceEndToken(start_mark, end_mark)
- elif token.type == YAML_FLOW_MAPPING_START_TOKEN:
- return FlowMappingStartToken(start_mark, end_mark)
- elif token.type == YAML_FLOW_MAPPING_END_TOKEN:
- return FlowMappingEndToken(start_mark, end_mark)
- elif token.type == YAML_BLOCK_ENTRY_TOKEN:
- return BlockEntryToken(start_mark, end_mark)
- elif token.type == YAML_FLOW_ENTRY_TOKEN:
- return FlowEntryToken(start_mark, end_mark)
- elif token.type == YAML_KEY_TOKEN:
- return KeyToken(start_mark, end_mark)
- elif token.type == YAML_VALUE_TOKEN:
- return ValueToken(start_mark, end_mark)
- elif token.type == YAML_ALIAS_TOKEN:
- value = PyUnicode_FromString(token.data.alias.value)
- return AliasToken(value, start_mark, end_mark)
- elif token.type == YAML_ANCHOR_TOKEN:
- value = PyUnicode_FromString(token.data.anchor.value)
- return AnchorToken(value, start_mark, end_mark)
- elif token.type == YAML_TAG_TOKEN:
- handle = PyUnicode_FromString(token.data.tag.handle)
- suffix = PyUnicode_FromString(token.data.tag.suffix)
- if not handle:
- handle = None
- return TagToken((handle, suffix), start_mark, end_mark)
- elif token.type == YAML_SCALAR_TOKEN:
- value = PyUnicode_DecodeUTF8(token.data.scalar.value,
- token.data.scalar.length, 'strict')
- plain = False
- style = None
- if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE:
- plain = True
- style = u''
- elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE:
- style = u'\''
- elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE:
- style = u'"'
- elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE:
- style = u'|'
- elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE:
- style = u'>'
- return ScalarToken(value, plain,
- start_mark, end_mark, style)
- else:
- if PY_MAJOR_VERSION < 3:
- raise ValueError("unknown token type")
- else:
- raise ValueError(u"unknown token type")
-
- def get_token(self):
- if self.current_token is not None:
- value = self.current_token
- self.current_token = None
- else:
- value = self._scan()
- return value
-
- def peek_token(self):
- if self.current_token is None:
- self.current_token = self._scan()
- return self.current_token
-
- def check_token(self, *choices):
- if self.current_token is None:
- self.current_token = self._scan()
- if self.current_token is None:
- return False
- if not choices:
- return True
- token_class = self.current_token.__class__
- for choice in choices:
- if token_class is choice:
- return True
- return False
-
- def raw_parse(self):
- cdef yaml_event_t event
- cdef int done
- cdef int count
- count = 0
- done = 0
- while done == 0:
- if yaml_parser_parse(&self.parser, &event) == 0:
- error = self._parser_error()
- raise error
- if event.type == YAML_NO_EVENT:
- done = 1
- else:
- count = count+1
- yaml_event_delete(&event)
- return count
-
- cdef object _parse(self):
- cdef yaml_event_t event
- if yaml_parser_parse(&self.parser, &event) == 0:
- error = self._parser_error()
- raise error
- event_object = self._event_to_object(&event)
- yaml_event_delete(&event)
- return event_object
-
- cdef object _event_to_object(self, yaml_event_t *event):
- cdef yaml_tag_directive_t *tag_directive
- start_mark = Mark(self.stream_name,
- event.start_mark.index,
- event.start_mark.line,
- event.start_mark.column,
- None, None)
- end_mark = Mark(self.stream_name,
- event.end_mark.index,
- event.end_mark.line,
- event.end_mark.column,
- None, None)
- if event.type == YAML_NO_EVENT:
- return None
- elif event.type == YAML_STREAM_START_EVENT:
- encoding = None
- if event.data.stream_start.encoding == YAML_UTF8_ENCODING:
- if self.unicode_source == 0:
- encoding = u"utf-8"
- elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING:
- encoding = u"utf-16-le"
- elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING:
- encoding = u"utf-16-be"
- return StreamStartEvent(start_mark, end_mark, encoding)
- elif event.type == YAML_STREAM_END_EVENT:
- return StreamEndEvent(start_mark, end_mark)
- elif event.type == YAML_DOCUMENT_START_EVENT:
- explicit = False
- if event.data.document_start.implicit == 0:
- explicit = True
- version = None
- if event.data.document_start.version_directive != NULL:
- version = (event.data.document_start.version_directive.major,
- event.data.document_start.version_directive.minor)
- tags = None
- if event.data.document_start.tag_directives.start != NULL:
- tags = {}
- tag_directive = event.data.document_start.tag_directives.start
- while tag_directive != event.data.document_start.tag_directives.end:
- handle = PyUnicode_FromString(tag_directive.handle)
- prefix = PyUnicode_FromString(tag_directive.prefix)
- tags[handle] = prefix
- tag_directive = tag_directive+1
- return DocumentStartEvent(start_mark, end_mark,
- explicit, version, tags)
- elif event.type == YAML_DOCUMENT_END_EVENT:
- explicit = False
- if event.data.document_end.implicit == 0:
- explicit = True
- return DocumentEndEvent(start_mark, end_mark, explicit)
- elif event.type == YAML_ALIAS_EVENT:
- anchor = PyUnicode_FromString(event.data.alias.anchor)
- return AliasEvent(anchor, start_mark, end_mark)
- elif event.type == YAML_SCALAR_EVENT:
- anchor = None
- if event.data.scalar.anchor != NULL:
- anchor = PyUnicode_FromString(event.data.scalar.anchor)
- tag = None
- if event.data.scalar.tag != NULL:
- tag = PyUnicode_FromString(event.data.scalar.tag)
- value = PyUnicode_DecodeUTF8(event.data.scalar.value,
- event.data.scalar.length, 'strict')
- plain_implicit = False
- if event.data.scalar.plain_implicit == 1:
- plain_implicit = True
- quoted_implicit = False
- if event.data.scalar.quoted_implicit == 1:
- quoted_implicit = True
- style = None
- if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE:
- style = u''
- elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE:
- style = u'\''
- elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE:
- style = u'"'
- elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE:
- style = u'|'
- elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE:
- style = u'>'
- return ScalarEvent(anchor, tag,
- (plain_implicit, quoted_implicit),
- value, start_mark, end_mark, style)
- elif event.type == YAML_SEQUENCE_START_EVENT:
- anchor = None
- if event.data.sequence_start.anchor != NULL:
- anchor = PyUnicode_FromString(event.data.sequence_start.anchor)
- tag = None
- if event.data.sequence_start.tag != NULL:
- tag = PyUnicode_FromString(event.data.sequence_start.tag)
- implicit = False
- if event.data.sequence_start.implicit == 1:
- implicit = True
- flow_style = None
- if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE:
- flow_style = True
- elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE:
- flow_style = False
- return SequenceStartEvent(anchor, tag, implicit,
- start_mark, end_mark, flow_style)
- elif event.type == YAML_MAPPING_START_EVENT:
- anchor = None
- if event.data.mapping_start.anchor != NULL:
- anchor = PyUnicode_FromString(event.data.mapping_start.anchor)
- tag = None
- if event.data.mapping_start.tag != NULL:
- tag = PyUnicode_FromString(event.data.mapping_start.tag)
- implicit = False
- if event.data.mapping_start.implicit == 1:
- implicit = True
- flow_style = None
- if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE:
- flow_style = True
- elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE:
- flow_style = False
- return MappingStartEvent(anchor, tag, implicit,
- start_mark, end_mark, flow_style)
- elif event.type == YAML_SEQUENCE_END_EVENT:
- return SequenceEndEvent(start_mark, end_mark)
- elif event.type == YAML_MAPPING_END_EVENT:
- return MappingEndEvent(start_mark, end_mark)
- else:
- if PY_MAJOR_VERSION < 3:
- raise ValueError("unknown event type")
- else:
- raise ValueError(u"unknown event type")
-
- def get_event(self):
- if self.current_event is not None:
- value = self.current_event
- self.current_event = None
- else:
- value = self._parse()
- return value
-
- def peek_event(self):
- if self.current_event is None:
- self.current_event = self._parse()
- return self.current_event
-
- def check_event(self, *choices):
- if self.current_event is None:
- self.current_event = self._parse()
- if self.current_event is None:
- return False
- if not choices:
- return True
- event_class = self.current_event.__class__
- for choice in choices:
- if event_class is choice:
- return True
- return False
-
- def check_node(self):
- self._parse_next_event()
- if self.parsed_event.type == YAML_STREAM_START_EVENT:
- yaml_event_delete(&self.parsed_event)
- self._parse_next_event()
- if self.parsed_event.type != YAML_STREAM_END_EVENT:
- return True
- return False
-
- def get_node(self):
- self._parse_next_event()
- if self.parsed_event.type != YAML_STREAM_END_EVENT:
- return self._compose_document()
-
- def get_single_node(self):
- self._parse_next_event()
- yaml_event_delete(&self.parsed_event)
- self._parse_next_event()
- document = None
- if self.parsed_event.type != YAML_STREAM_END_EVENT:
- document = self._compose_document()
- self._parse_next_event()
- if self.parsed_event.type != YAML_STREAM_END_EVENT:
- mark = Mark(self.stream_name,
- self.parsed_event.start_mark.index,
- self.parsed_event.start_mark.line,
- self.parsed_event.start_mark.column,
- None, None)
- if PY_MAJOR_VERSION < 3:
- raise ComposerError("expected a single document in the stream",
- document.start_mark, "but found another document", mark)
- else:
- raise ComposerError(u"expected a single document in the stream",
- document.start_mark, u"but found another document", mark)
- return document
-
- cdef object _compose_document(self):
- yaml_event_delete(&self.parsed_event)
- node = self._compose_node(None, None)
- self._parse_next_event()
- yaml_event_delete(&self.parsed_event)
- self.anchors = {}
- return node
-
- cdef object _compose_node(self, object parent, object index):
- self._parse_next_event()
- if self.parsed_event.type == YAML_ALIAS_EVENT:
- anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor)
- if anchor not in self.anchors:
- mark = Mark(self.stream_name,
- self.parsed_event.start_mark.index,
- self.parsed_event.start_mark.line,
- self.parsed_event.start_mark.column,
- None, None)
- if PY_MAJOR_VERSION < 3:
- raise ComposerError(None, None, "found undefined alias", mark)
- else:
- raise ComposerError(None, None, u"found undefined alias", mark)
- yaml_event_delete(&self.parsed_event)
- return self.anchors[anchor]
- anchor = None
- if self.parsed_event.type == YAML_SCALAR_EVENT \
- and self.parsed_event.data.scalar.anchor != NULL:
- anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor)
- elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \
- and self.parsed_event.data.sequence_start.anchor != NULL:
- anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor)
- elif self.parsed_event.type == YAML_MAPPING_START_EVENT \
- and self.parsed_event.data.mapping_start.anchor != NULL:
- anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor)
- if anchor is not None:
- if anchor in self.anchors:
- mark = Mark(self.stream_name,
- self.parsed_event.start_mark.index,
- self.parsed_event.start_mark.line,
- self.parsed_event.start_mark.column,
- None, None)
- if PY_MAJOR_VERSION < 3:
- raise ComposerError("found duplicate anchor; first occurrence",
- self.anchors[anchor].start_mark, "second occurrence", mark)
- else:
- raise ComposerError(u"found duplicate anchor; first occurrence",
- self.anchors[anchor].start_mark, u"second occurrence", mark)
- self.descend_resolver(parent, index)
- if self.parsed_event.type == YAML_SCALAR_EVENT:
- node = self._compose_scalar_node(anchor)
- elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT:
- node = self._compose_sequence_node(anchor)
- elif self.parsed_event.type == YAML_MAPPING_START_EVENT:
- node = self._compose_mapping_node(anchor)
- self.ascend_resolver()
- return node
-
- cdef _compose_scalar_node(self, object anchor):
- start_mark = Mark(self.stream_name,
- self.parsed_event.start_mark.index,
- self.parsed_event.start_mark.line,
- self.parsed_event.start_mark.column,
- None, None)
- end_mark = Mark(self.stream_name,
- self.parsed_event.end_mark.index,
- self.parsed_event.end_mark.line,
- self.parsed_event.end_mark.column,
- None, None)
- value = PyUnicode_DecodeUTF8(self.parsed_event.data.scalar.value,
- self.parsed_event.data.scalar.length, 'strict')
- plain_implicit = False
- if self.parsed_event.data.scalar.plain_implicit == 1:
- plain_implicit = True
- quoted_implicit = False
- if self.parsed_event.data.scalar.quoted_implicit == 1:
- quoted_implicit = True
- if self.parsed_event.data.scalar.tag == NULL \
- or (self.parsed_event.data.scalar.tag[0] == c'!'
- and self.parsed_event.data.scalar.tag[1] == c'\0'):
- tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit))
- else:
- tag = PyUnicode_FromString(self.parsed_event.data.scalar.tag)
- style = None
- if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE:
- style = u''
- elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE:
- style = u'\''
- elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE:
- style = u'"'
- elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE:
- style = u'|'
- elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE:
- style = u'>'
- node = ScalarNode(tag, value, start_mark, end_mark, style)
- if anchor is not None:
- self.anchors[anchor] = node
- yaml_event_delete(&self.parsed_event)
- return node
-
- cdef _compose_sequence_node(self, object anchor):
- cdef int index
- start_mark = Mark(self.stream_name,
- self.parsed_event.start_mark.index,
- self.parsed_event.start_mark.line,
- self.parsed_event.start_mark.column,
- None, None)
- implicit = False
- if self.parsed_event.data.sequence_start.implicit == 1:
- implicit = True
- if self.parsed_event.data.sequence_start.tag == NULL \
- or (self.parsed_event.data.sequence_start.tag[0] == c'!'
- and self.parsed_event.data.sequence_start.tag[1] == c'\0'):
- tag = self.resolve(SequenceNode, None, implicit)
- else:
- tag = PyUnicode_FromString(self.parsed_event.data.sequence_start.tag)
- flow_style = None
- if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE:
- flow_style = True
- elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE:
- flow_style = False
- value = []
- node = SequenceNode(tag, value, start_mark, None, flow_style)
- if anchor is not None:
- self.anchors[anchor] = node
- yaml_event_delete(&self.parsed_event)
- index = 0
- self._parse_next_event()
- while self.parsed_event.type != YAML_SEQUENCE_END_EVENT:
- value.append(self._compose_node(node, index))
- index = index+1
- self._parse_next_event()
- node.end_mark = Mark(self.stream_name,
- self.parsed_event.end_mark.index,
- self.parsed_event.end_mark.line,
- self.parsed_event.end_mark.column,
- None, None)
- yaml_event_delete(&self.parsed_event)
- return node
-
- cdef _compose_mapping_node(self, object anchor):
- start_mark = Mark(self.stream_name,
- self.parsed_event.start_mark.index,
- self.parsed_event.start_mark.line,
- self.parsed_event.start_mark.column,
- None, None)
- implicit = False
- if self.parsed_event.data.mapping_start.implicit == 1:
- implicit = True
- if self.parsed_event.data.mapping_start.tag == NULL \
- or (self.parsed_event.data.mapping_start.tag[0] == c'!'
- and self.parsed_event.data.mapping_start.tag[1] == c'\0'):
- tag = self.resolve(MappingNode, None, implicit)
- else:
- tag = PyUnicode_FromString(self.parsed_event.data.mapping_start.tag)
- flow_style = None
- if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE:
- flow_style = True
- elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE:
- flow_style = False
- value = []
- node = MappingNode(tag, value, start_mark, None, flow_style)
- if anchor is not None:
- self.anchors[anchor] = node
- yaml_event_delete(&self.parsed_event)
- self._parse_next_event()
- while self.parsed_event.type != YAML_MAPPING_END_EVENT:
- item_key = self._compose_node(node, None)
- item_value = self._compose_node(node, item_key)
- value.append((item_key, item_value))
- self._parse_next_event()
- node.end_mark = Mark(self.stream_name,
- self.parsed_event.end_mark.index,
- self.parsed_event.end_mark.line,
- self.parsed_event.end_mark.column,
- None, None)
- yaml_event_delete(&self.parsed_event)
- return node
-
- cdef int _parse_next_event(self) except 0:
- if self.parsed_event.type == YAML_NO_EVENT:
- if yaml_parser_parse(&self.parser, &self.parsed_event) == 0:
- error = self._parser_error()
- raise error
- return 1
-
-cdef int input_handler(void *data, char *buffer, int size, int *read) except 0:
- cdef CParser parser
- parser = <CParser>data
- if parser.stream_cache is None:
- value = parser.stream.read(size)
- if PyUnicode_CheckExact(value) != 0:
- value = PyUnicode_AsUTF8String(value)
- parser.unicode_source = 1
- if PyString_CheckExact(value) == 0:
- if PY_MAJOR_VERSION < 3:
- raise TypeError("a string value is expected")
- else:
- raise TypeError(u"a string value is expected")
- parser.stream_cache = value
- parser.stream_cache_pos = 0
- parser.stream_cache_len = PyString_GET_SIZE(value)
- if (parser.stream_cache_len - parser.stream_cache_pos) < size:
- size = parser.stream_cache_len - parser.stream_cache_pos
- if size > 0:
- memcpy(buffer, PyString_AS_STRING(parser.stream_cache)
- + parser.stream_cache_pos, size)
- read[0] = size
- parser.stream_cache_pos += size
- if parser.stream_cache_pos == parser.stream_cache_len:
- parser.stream_cache = None
- return 1
-
-cdef class CEmitter:
-
- cdef yaml_emitter_t emitter
-
- cdef object stream
-
- cdef int document_start_implicit
- cdef int document_end_implicit
- cdef object use_version
- cdef object use_tags
-
- cdef object serialized_nodes
- cdef object anchors
- cdef int last_alias_id
- cdef int closed
- cdef int dump_unicode
- cdef object use_encoding
-
- def __init__(self, stream, canonical=None, indent=None, width=None,
- allow_unicode=None, line_break=None, encoding=None,
- explicit_start=None, explicit_end=None, version=None, tags=None):
- if yaml_emitter_initialize(&self.emitter) == 0:
- raise MemoryError
- self.stream = stream
- self.dump_unicode = 0
- if PY_MAJOR_VERSION < 3:
- if getattr3(stream, 'encoding', None):
- self.dump_unicode = 1
- else:
- if hasattr(stream, u'encoding'):
- self.dump_unicode = 1
- self.use_encoding = encoding
- yaml_emitter_set_output(&self.emitter, output_handler, <void *>self)
- if canonical:
- yaml_emitter_set_canonical(&self.emitter, 1)
- if indent is not None:
- yaml_emitter_set_indent(&self.emitter, indent)
- if width is not None:
- yaml_emitter_set_width(&self.emitter, width)
- if allow_unicode:
- yaml_emitter_set_unicode(&self.emitter, 1)
- if line_break is not None:
- if line_break == '\r':
- yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK)
- elif line_break == '\n':
- yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK)
- elif line_break == '\r\n':
- yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK)
- self.document_start_implicit = 1
- if explicit_start:
- self.document_start_implicit = 0
- self.document_end_implicit = 1
- if explicit_end:
- self.document_end_implicit = 0
- self.use_version = version
- self.use_tags = tags
- self.serialized_nodes = {}
- self.anchors = {}
- self.last_alias_id = 0
- self.closed = -1
-
- def __dealloc__(self):
- yaml_emitter_delete(&self.emitter)
-
- def dispose(self):
- pass
-
- cdef object _emitter_error(self):
- if self.emitter.error == YAML_MEMORY_ERROR:
- return MemoryError
- elif self.emitter.error == YAML_EMITTER_ERROR:
- if PY_MAJOR_VERSION < 3:
- problem = self.emitter.problem
- else:
- problem = PyUnicode_FromString(self.emitter.problem)
- return EmitterError(problem)
- if PY_MAJOR_VERSION < 3:
- raise ValueError("no emitter error")
- else:
- raise ValueError(u"no emitter error")
-
- cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0:
- cdef yaml_encoding_t encoding
- cdef yaml_version_directive_t version_directive_value
- cdef yaml_version_directive_t *version_directive
- cdef yaml_tag_directive_t tag_directives_value[128]
- cdef yaml_tag_directive_t *tag_directives_start
- cdef yaml_tag_directive_t *tag_directives_end
- cdef int implicit
- cdef int plain_implicit
- cdef int quoted_implicit
- cdef char *anchor
- cdef char *tag
- cdef char *value
- cdef int length
- cdef yaml_scalar_style_t scalar_style
- cdef yaml_sequence_style_t sequence_style
- cdef yaml_mapping_style_t mapping_style
- event_class = event_object.__class__
- if event_class is StreamStartEvent:
- encoding = YAML_UTF8_ENCODING
- if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le':
- encoding = YAML_UTF16LE_ENCODING
- elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be':
- encoding = YAML_UTF16BE_ENCODING
- if event_object.encoding is None:
- self.dump_unicode = 1
- if self.dump_unicode == 1:
- encoding = YAML_UTF8_ENCODING
- yaml_stream_start_event_initialize(event, encoding)
- elif event_class is StreamEndEvent:
- yaml_stream_end_event_initialize(event)
- elif event_class is DocumentStartEvent:
- version_directive = NULL
- if event_object.version:
- version_directive_value.major = event_object.version[0]
- version_directive_value.minor = event_object.version[1]
- version_directive = &version_directive_value
- tag_directives_start = NULL
- tag_directives_end = NULL
- if event_object.tags:
- if len(event_object.tags) > 128:
- if PY_MAJOR_VERSION < 3:
- raise ValueError("too many tags")
- else:
- raise ValueError(u"too many tags")
- tag_directives_start = tag_directives_value
- tag_directives_end = tag_directives_value
- cache = []
- for handle in event_object.tags:
- prefix = event_object.tags[handle]
- if PyUnicode_CheckExact(handle):
- handle = PyUnicode_AsUTF8String(handle)
- cache.append(handle)
- if not PyString_CheckExact(handle):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag handle must be a string")
- else:
- raise TypeError(u"tag handle must be a string")
- tag_directives_end.handle = PyString_AS_STRING(handle)
- if PyUnicode_CheckExact(prefix):
- prefix = PyUnicode_AsUTF8String(prefix)
- cache.append(prefix)
- if not PyString_CheckExact(prefix):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag prefix must be a string")
- else:
- raise TypeError(u"tag prefix must be a string")
- tag_directives_end.prefix = PyString_AS_STRING(prefix)
- tag_directives_end = tag_directives_end+1
- implicit = 1
- if event_object.explicit:
- implicit = 0
- if yaml_document_start_event_initialize(event, version_directive,
- tag_directives_start, tag_directives_end, implicit) == 0:
- raise MemoryError
- elif event_class is DocumentEndEvent:
- implicit = 1
- if event_object.explicit:
- implicit = 0
- yaml_document_end_event_initialize(event, implicit)
- elif event_class is AliasEvent:
- anchor = NULL
- anchor_object = event_object.anchor
- if PyUnicode_CheckExact(anchor_object):
- anchor_object = PyUnicode_AsUTF8String(anchor_object)
- if not PyString_CheckExact(anchor_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("anchor must be a string")
- else:
- raise TypeError(u"anchor must be a string")
- anchor = PyString_AS_STRING(anchor_object)
- if yaml_alias_event_initialize(event, anchor) == 0:
- raise MemoryError
- elif event_class is ScalarEvent:
- anchor = NULL
- anchor_object = event_object.anchor
- if anchor_object is not None:
- if PyUnicode_CheckExact(anchor_object):
- anchor_object = PyUnicode_AsUTF8String(anchor_object)
- if not PyString_CheckExact(anchor_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("anchor must be a string")
- else:
- raise TypeError(u"anchor must be a string")
- anchor = PyString_AS_STRING(anchor_object)
- tag = NULL
- tag_object = event_object.tag
- if tag_object is not None:
- if PyUnicode_CheckExact(tag_object):
- tag_object = PyUnicode_AsUTF8String(tag_object)
- if not PyString_CheckExact(tag_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag must be a string")
- else:
- raise TypeError(u"tag must be a string")
- tag = PyString_AS_STRING(tag_object)
- value_object = event_object.value
- if PyUnicode_CheckExact(value_object):
- value_object = PyUnicode_AsUTF8String(value_object)
- if not PyString_CheckExact(value_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("value must be a string")
- else:
- raise TypeError(u"value must be a string")
- value = PyString_AS_STRING(value_object)
- length = PyString_GET_SIZE(value_object)
- plain_implicit = 0
- quoted_implicit = 0
- if event_object.implicit is not None:
- plain_implicit = event_object.implicit[0]
- quoted_implicit = event_object.implicit[1]
- style_object = event_object.style
- scalar_style = YAML_PLAIN_SCALAR_STYLE
- if style_object == "'" or style_object == u"'":
- scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE
- elif style_object == "\"" or style_object == u"\"":
- scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE
- elif style_object == "|" or style_object == u"|":
- scalar_style = YAML_LITERAL_SCALAR_STYLE
- elif style_object == ">" or style_object == u">":
- scalar_style = YAML_FOLDED_SCALAR_STYLE
- if yaml_scalar_event_initialize(event, anchor, tag, value, length,
- plain_implicit, quoted_implicit, scalar_style) == 0:
- raise MemoryError
- elif event_class is SequenceStartEvent:
- anchor = NULL
- anchor_object = event_object.anchor
- if anchor_object is not None:
- if PyUnicode_CheckExact(anchor_object):
- anchor_object = PyUnicode_AsUTF8String(anchor_object)
- if not PyString_CheckExact(anchor_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("anchor must be a string")
- else:
- raise TypeError(u"anchor must be a string")
- anchor = PyString_AS_STRING(anchor_object)
- tag = NULL
- tag_object = event_object.tag
- if tag_object is not None:
- if PyUnicode_CheckExact(tag_object):
- tag_object = PyUnicode_AsUTF8String(tag_object)
- if not PyString_CheckExact(tag_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag must be a string")
- else:
- raise TypeError(u"tag must be a string")
- tag = PyString_AS_STRING(tag_object)
- implicit = 0
- if event_object.implicit:
- implicit = 1
- sequence_style = YAML_BLOCK_SEQUENCE_STYLE
- if event_object.flow_style:
- sequence_style = YAML_FLOW_SEQUENCE_STYLE
- if yaml_sequence_start_event_initialize(event, anchor, tag,
- implicit, sequence_style) == 0:
- raise MemoryError
- elif event_class is MappingStartEvent:
- anchor = NULL
- anchor_object = event_object.anchor
- if anchor_object is not None:
- if PyUnicode_CheckExact(anchor_object):
- anchor_object = PyUnicode_AsUTF8String(anchor_object)
- if not PyString_CheckExact(anchor_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("anchor must be a string")
- else:
- raise TypeError(u"anchor must be a string")
- anchor = PyString_AS_STRING(anchor_object)
- tag = NULL
- tag_object = event_object.tag
- if tag_object is not None:
- if PyUnicode_CheckExact(tag_object):
- tag_object = PyUnicode_AsUTF8String(tag_object)
- if not PyString_CheckExact(tag_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag must be a string")
- else:
- raise TypeError(u"tag must be a string")
- tag = PyString_AS_STRING(tag_object)
- implicit = 0
- if event_object.implicit:
- implicit = 1
- mapping_style = YAML_BLOCK_MAPPING_STYLE
- if event_object.flow_style:
- mapping_style = YAML_FLOW_MAPPING_STYLE
- if yaml_mapping_start_event_initialize(event, anchor, tag,
- implicit, mapping_style) == 0:
- raise MemoryError
- elif event_class is SequenceEndEvent:
- yaml_sequence_end_event_initialize(event)
- elif event_class is MappingEndEvent:
- yaml_mapping_end_event_initialize(event)
- else:
- if PY_MAJOR_VERSION < 3:
- raise TypeError("invalid event %s" % event_object)
- else:
- raise TypeError(u"invalid event %s" % event_object)
- return 1
-
- def emit(self, event_object):
- cdef yaml_event_t event
- self._object_to_event(event_object, &event)
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
-
- def open(self):
- cdef yaml_event_t event
- cdef yaml_encoding_t encoding
- if self.closed == -1:
- if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le':
- encoding = YAML_UTF16LE_ENCODING
- elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be':
- encoding = YAML_UTF16BE_ENCODING
- else:
- encoding = YAML_UTF8_ENCODING
- if self.use_encoding is None:
- self.dump_unicode = 1
- if self.dump_unicode == 1:
- encoding = YAML_UTF8_ENCODING
- yaml_stream_start_event_initialize(&event, encoding)
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- self.closed = 0
- elif self.closed == 1:
- if PY_MAJOR_VERSION < 3:
- raise SerializerError("serializer is closed")
- else:
- raise SerializerError(u"serializer is closed")
- else:
- if PY_MAJOR_VERSION < 3:
- raise SerializerError("serializer is already opened")
- else:
- raise SerializerError(u"serializer is already opened")
-
- def close(self):
- cdef yaml_event_t event
- if self.closed == -1:
- if PY_MAJOR_VERSION < 3:
- raise SerializerError("serializer is not opened")
- else:
- raise SerializerError(u"serializer is not opened")
- elif self.closed == 0:
- yaml_stream_end_event_initialize(&event)
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- self.closed = 1
-
- def serialize(self, node):
- cdef yaml_event_t event
- cdef yaml_version_directive_t version_directive_value
- cdef yaml_version_directive_t *version_directive
- cdef yaml_tag_directive_t tag_directives_value[128]
- cdef yaml_tag_directive_t *tag_directives_start
- cdef yaml_tag_directive_t *tag_directives_end
- if self.closed == -1:
- if PY_MAJOR_VERSION < 3:
- raise SerializerError("serializer is not opened")
- else:
- raise SerializerError(u"serializer is not opened")
- elif self.closed == 1:
- if PY_MAJOR_VERSION < 3:
- raise SerializerError("serializer is closed")
- else:
- raise SerializerError(u"serializer is closed")
- cache = []
- version_directive = NULL
- if self.use_version:
- version_directive_value.major = self.use_version[0]
- version_directive_value.minor = self.use_version[1]
- version_directive = &version_directive_value
- tag_directives_start = NULL
- tag_directives_end = NULL
- if self.use_tags:
- if len(self.use_tags) > 128:
- if PY_MAJOR_VERSION < 3:
- raise ValueError("too many tags")
- else:
- raise ValueError(u"too many tags")
- tag_directives_start = tag_directives_value
- tag_directives_end = tag_directives_value
- for handle in self.use_tags:
- prefix = self.use_tags[handle]
- if PyUnicode_CheckExact(handle):
- handle = PyUnicode_AsUTF8String(handle)
- cache.append(handle)
- if not PyString_CheckExact(handle):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag handle must be a string")
- else:
- raise TypeError(u"tag handle must be a string")
- tag_directives_end.handle = PyString_AS_STRING(handle)
- if PyUnicode_CheckExact(prefix):
- prefix = PyUnicode_AsUTF8String(prefix)
- cache.append(prefix)
- if not PyString_CheckExact(prefix):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag prefix must be a string")
- else:
- raise TypeError(u"tag prefix must be a string")
- tag_directives_end.prefix = PyString_AS_STRING(prefix)
- tag_directives_end = tag_directives_end+1
- if yaml_document_start_event_initialize(&event, version_directive,
- tag_directives_start, tag_directives_end,
- self.document_start_implicit) == 0:
- raise MemoryError
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- self._anchor_node(node)
- self._serialize_node(node, None, None)
- yaml_document_end_event_initialize(&event, self.document_end_implicit)
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- self.serialized_nodes = {}
- self.anchors = {}
- self.last_alias_id = 0
-
- cdef int _anchor_node(self, object node) except 0:
- if node in self.anchors:
- if self.anchors[node] is None:
- self.last_alias_id = self.last_alias_id+1
- self.anchors[node] = u"id%03d" % self.last_alias_id
- else:
- self.anchors[node] = None
- node_class = node.__class__
- if node_class is SequenceNode:
- for item in node.value:
- self._anchor_node(item)
- elif node_class is MappingNode:
- for key, value in node.value:
- self._anchor_node(key)
- self._anchor_node(value)
- return 1
-
- cdef int _serialize_node(self, object node, object parent, object index) except 0:
- cdef yaml_event_t event
- cdef int implicit
- cdef int plain_implicit
- cdef int quoted_implicit
- cdef char *anchor
- cdef char *tag
- cdef char *value
- cdef int length
- cdef int item_index
- cdef yaml_scalar_style_t scalar_style
- cdef yaml_sequence_style_t sequence_style
- cdef yaml_mapping_style_t mapping_style
- anchor_object = self.anchors[node]
- anchor = NULL
- if anchor_object is not None:
- if PyUnicode_CheckExact(anchor_object):
- anchor_object = PyUnicode_AsUTF8String(anchor_object)
- if not PyString_CheckExact(anchor_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("anchor must be a string")
- else:
- raise TypeError(u"anchor must be a string")
- anchor = PyString_AS_STRING(anchor_object)
- if node in self.serialized_nodes:
- if yaml_alias_event_initialize(&event, anchor) == 0:
- raise MemoryError
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- else:
- node_class = node.__class__
- self.serialized_nodes[node] = True
- self.descend_resolver(parent, index)
- if node_class is ScalarNode:
- plain_implicit = 0
- quoted_implicit = 0
- tag_object = node.tag
- if self.resolve(ScalarNode, node.value, (True, False)) == tag_object:
- plain_implicit = 1
- if self.resolve(ScalarNode, node.value, (False, True)) == tag_object:
- quoted_implicit = 1
- tag = NULL
- if tag_object is not None:
- if PyUnicode_CheckExact(tag_object):
- tag_object = PyUnicode_AsUTF8String(tag_object)
- if not PyString_CheckExact(tag_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag must be a string")
- else:
- raise TypeError(u"tag must be a string")
- tag = PyString_AS_STRING(tag_object)
- value_object = node.value
- if PyUnicode_CheckExact(value_object):
- value_object = PyUnicode_AsUTF8String(value_object)
- if not PyString_CheckExact(value_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("value must be a string")
- else:
- raise TypeError(u"value must be a string")
- value = PyString_AS_STRING(value_object)
- length = PyString_GET_SIZE(value_object)
- style_object = node.style
- scalar_style = YAML_PLAIN_SCALAR_STYLE
- if style_object == "'" or style_object == u"'":
- scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE
- elif style_object == "\"" or style_object == u"\"":
- scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE
- elif style_object == "|" or style_object == u"|":
- scalar_style = YAML_LITERAL_SCALAR_STYLE
- elif style_object == ">" or style_object == u">":
- scalar_style = YAML_FOLDED_SCALAR_STYLE
- if yaml_scalar_event_initialize(&event, anchor, tag, value, length,
- plain_implicit, quoted_implicit, scalar_style) == 0:
- raise MemoryError
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- elif node_class is SequenceNode:
- implicit = 0
- tag_object = node.tag
- if self.resolve(SequenceNode, node.value, True) == tag_object:
- implicit = 1
- tag = NULL
- if tag_object is not None:
- if PyUnicode_CheckExact(tag_object):
- tag_object = PyUnicode_AsUTF8String(tag_object)
- if not PyString_CheckExact(tag_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag must be a string")
- else:
- raise TypeError(u"tag must be a string")
- tag = PyString_AS_STRING(tag_object)
- sequence_style = YAML_BLOCK_SEQUENCE_STYLE
- if node.flow_style:
- sequence_style = YAML_FLOW_SEQUENCE_STYLE
- if yaml_sequence_start_event_initialize(&event, anchor, tag,
- implicit, sequence_style) == 0:
- raise MemoryError
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- item_index = 0
- for item in node.value:
- self._serialize_node(item, node, item_index)
- item_index = item_index+1
- yaml_sequence_end_event_initialize(&event)
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- elif node_class is MappingNode:
- implicit = 0
- tag_object = node.tag
- if self.resolve(MappingNode, node.value, True) == tag_object:
- implicit = 1
- tag = NULL
- if tag_object is not None:
- if PyUnicode_CheckExact(tag_object):
- tag_object = PyUnicode_AsUTF8String(tag_object)
- if not PyString_CheckExact(tag_object):
- if PY_MAJOR_VERSION < 3:
- raise TypeError("tag must be a string")
- else:
- raise TypeError(u"tag must be a string")
- tag = PyString_AS_STRING(tag_object)
- mapping_style = YAML_BLOCK_MAPPING_STYLE
- if node.flow_style:
- mapping_style = YAML_FLOW_MAPPING_STYLE
- if yaml_mapping_start_event_initialize(&event, anchor, tag,
- implicit, mapping_style) == 0:
- raise MemoryError
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- for item_key, item_value in node.value:
- self._serialize_node(item_key, node, None)
- self._serialize_node(item_value, node, item_key)
- yaml_mapping_end_event_initialize(&event)
- if yaml_emitter_emit(&self.emitter, &event) == 0:
- error = self._emitter_error()
- raise error
- self.ascend_resolver()
- return 1
-
-cdef int output_handler(void *data, char *buffer, int size) except 0:
- cdef CEmitter emitter
- emitter = <CEmitter>data
- if emitter.dump_unicode == 0:
- value = PyString_FromStringAndSize(buffer, size)
- else:
- value = PyUnicode_DecodeUTF8(buffer, size, 'strict')
- emitter.stream.write(value)
- return 1
-