diff options
author | xi <xi@18f92427-320e-0410-9341-c67f048884a3> | 2006-02-20 17:41:45 +0000 |
---|---|---|
committer | xi <xi@18f92427-320e-0410-9341-c67f048884a3> | 2006-02-20 17:41:45 +0000 |
commit | ab545668480793a64dcc6e71c16af09068ed91b9 (patch) | |
tree | 5cdfcd8b4497e29462b9b0b5f2010dba89793fd9 | |
parent | 282bbe171b1c36ce94185dbb95fbd9d5b971d21f (diff) | |
download | pyyaml-ab545668480793a64dcc6e71c16af09068ed91b9.tar.gz |
Cleanup error messages.
git-svn-id: http://svn.pyyaml.org/branches/pyyaml3000@52 18f92427-320e-0410-9341-c67f048884a3
41 files changed, 245 insertions, 119 deletions
diff --git a/lib/yaml/error.py b/lib/yaml/error.py index 536adad..2fae3eb 100644 --- a/lib/yaml/error.py +++ b/lib/yaml/error.py @@ -1,4 +1,79 @@ +__all__ = ['Marker', 'YAMLError', 'MarkedYAMLError'] + +class Marker: + + def __init__(self, name, line, column, buffer, pointer): + self.name = name + 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 u'\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 u'\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].encode('utf-8') + 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_marker=None, + problem=None, problem_marker=None): + self.context = context + self.context_marker = context_marker + self.problem = problem + self.problem_marker = problem_marker + + def __str__(self): + lines = [] + #for (place, marker) in [(self.context, self.context_marker), + # (self.problem, self.problem_marker)]: + # if place is not None: + # lines.append(place) + # if marker is not None: + # lines.append(str(marker)) + if self.context is not None: + lines.append(self.context) + if self.context_marker is not None \ + and (self.problem is None or self.problem_marker is None + or self.context_marker.name != self.problem_marker.name + or self.context_marker.line != self.problem_marker.line + or self.context_marker.column != self.problem_marker.column): + lines.append(str(self.context_marker)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_marker is not None: + lines.append(str(self.problem_marker)) + return '\n'.join(lines) + + + diff --git a/lib/yaml/parser.py b/lib/yaml/parser.py index 858d906..d5dcd6d 100644 --- a/lib/yaml/parser.py +++ b/lib/yaml/parser.py @@ -20,7 +20,10 @@ # flow_mapping ::= FLOW-MAPPING-START (flow_mapping_entry FLOW-ENTRY)* flow_mapping_entry? FLOW-MAPPING-END # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -# + +# TODO: support for BOM within a stream. +# stream ::= (BOM? implicit_document)? (BOM? explicit_document)* STREAM-END + # Note that there is a slight deviation from the specification. We require a # non-empty node content if ANCHOR or TAG is specified. This disallow such # documents as @@ -58,28 +61,12 @@ # 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 } -from error import YAMLError +from error import MarkedYAMLError from tokens import * from events import * -class ParserError(YAMLError): - - def __init__(self, context=None, context_marker=None, - problem=None, problem_marker=None): - self.context = context - self.context_marker = context_marker - self.problem = problem - self.problem_marker = problem_marker - - def __str__(self): - lines = [] - for (place, marker) in [(self.context, self.context_marker), - (self.problem, self.problem_marker)]: - if place is not None: - lines.append(place) - if marker is not None: - lines.append(str(marker)) - return '\n'.join(lines) +class ParserError(MarkedYAMLError): + pass class Parser: # Since writing an LL(1) parser is a straightforward task, we do not give @@ -168,19 +155,19 @@ class Parser: if token.name == u'YAML': if self.yaml_version is not None: raise ParserError(None, None, - "found duplicate YAML directive", token.start_marker()) + "found duplicate YAML directive", token.start_marker) major, minor = token.value if major != 1: raise ParserError(None, None, "found incompatible YAML document (version 1.* is required)", - token.start_marker()) + token.start_marker) self.yaml_version = token.value elif token.name == u'TAG': handle, prefix = token.value if handle in self.tag_handles: raise ParserError(None, None, "duplicate tag handle %r" % handle.encode('utf-8'), - token.start_marker()) + token.start_marker) self.tag_handles[handle] = prefix for key in self.DEFAULT_TAGS: if key not in self.tag_handles: @@ -393,10 +380,6 @@ class Parser: "expected ',' or ']', but got %r" % token.id, token.start_marker) if self.scanner.check(FlowEntryToken): self.scanner.get() - if not self.scanner.check(FlowSequenceEndToken): - token = self.scanner.peek() - raise ParserError("while scanning a flow sequence", start_marker, - "expected ']', but found %r" % token.id, token.start_marker) token = self.scanner.get() yield CollectionEndEvent(token.start_marker, token.end_marker) diff --git a/lib/yaml/reader.py b/lib/yaml/reader.py index 73838ee..a4d0299 100644 --- a/lib/yaml/reader.py +++ b/lib/yaml/reader.py @@ -15,9 +15,9 @@ # reader.index - the number of the current character. # reader.line, stream.column - the line and the column of the current character. -__all__ = ['Marker', 'Reader', 'ReaderError'] +__all__ = ['Reader', 'ReaderError'] -from error import YAMLError +from error import YAMLError, Marker import codecs, re @@ -56,46 +56,6 @@ except TypeError: data = data[:-count-1] return codecs.utf_8_decode(data, errors) -class Marker: - - def __init__(self, name, line, column, buffer, pointer): - self.name = name - 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 u'\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 u'\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].encode('utf-8') - 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 ReaderError(YAMLError): def __init__(self, name, position, character, encoding, reason): diff --git a/lib/yaml/scanner.py b/lib/yaml/scanner.py index 220a99b..2f47044 100644 --- a/lib/yaml/scanner.py +++ b/lib/yaml/scanner.py @@ -10,35 +10,11 @@ __all__ = ['Scanner', 'ScannerError'] -from error import YAMLError +from error import MarkedYAMLError from tokens import * -class ScannerError(YAMLError): - # ScannerError: while reading a quoted string - # in '...', line 5, column 10: - # key: "valu\?e" - # ^ - # got unknown quote character '?' - # in '...', line 5, column 15: - # key: "valu\?e" - # ^ - - def __init__(self, context=None, context_marker=None, - problem=None, problem_marker=None): - self.context = context - self.context_marker = context_marker - self.problem = problem - self.problem_marker = problem_marker - - def __str__(self): - lines = [] - for (place, marker) in [(self.context, self.context_marker), - (self.problem, self.problem_marker)]: - if place is not None: - lines.append(place) - if marker is not None: - lines.append(str(marker)) - return '\n'.join(lines) +class ScannerError(MarkedYAMLError): + pass class SimpleKey: # See below simple keys treatment. @@ -197,6 +173,10 @@ class Scanner: if ch == u'.' and self.check_document_end(): return self.fetch_document_end() + # TODO: support for BOM within a stream. + #if ch == u'\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + # Note: the order of the following checks is NOT significant. # Is it the flow sequence start indicator? @@ -749,6 +729,18 @@ class Scanner: # 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 <TAB>: + # 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.reader.index == 0 and self.reader.peek() == u'\uFEFF': self.reader.forward() found = False @@ -793,13 +785,13 @@ class Scanner: ch = self.reader.peek(length) if not length: raise ScannerError("while scanning a directive", start_marker, - "expected directive name, but found %r" % ch.encode('utf-8'), - self.reader.get_marker()) + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.reader.get_marker()) value = self.reader.prefix(length) self.reader.forward(length) ch = self.reader.peek() if ch not in u'\0 \r\n\x85\u2028\u2029': - raise ScannerError("while scanning a directive" % name, start_marker, + raise ScannerError("while scanning a directive", start_marker, "expected alphabetic or numeric character, but found %r" % ch.encode('utf-8'), self.reader.get_marker()) return value @@ -811,13 +803,15 @@ class Scanner: major = self.scan_yaml_directive_number(start_marker) if self.reader.peek() != '.': raise ScannerError("while scanning a directive", start_marker, - "expected a digit or '.', but found %r" % ch.encode('utf-8'), + "expected a digit or '.', but found %r" + % self.reader.peek().encode('utf-8'), self.reader.get_marker()) self.reader.forward() minor = self.scan_yaml_directive_number(start_marker) if self.reader.peek() not in u'\0 \r\n\x85\u2028\u2029': raise ScannerError("while scanning a directive", start_marker, - "expected a digit or ' ', but found %r" % ch.encode('utf-8'), + "expected a digit or ' ', but found %r" + % self.reader.peek().encode('utf-8'), self.reader.get_marker()) return (major, minor) @@ -848,7 +842,8 @@ class Scanner: def scan_tag_directive_handle(self, start_marker): # See the specification for details. value = self.scan_tag_handle('directive', start_marker) - if self.reader.peek() != u' ': + ch = self.reader.peek() + if ch != u' ': raise ScannerError("while scanning a directive", start_marker, "expected ' ', but found %r" % ch.encode('utf-8'), self.reader.get_marker()) @@ -902,8 +897,8 @@ class Scanner: ch = self.reader.peek(length) if not length: raise ScannerError("while scanning an %s" % name, start_marker, - "expected anchor name, but found %r" % ch.encode('utf-8'), - self.reader.get_marker()) + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.reader.get_marker()) value = self.reader.prefix(length) self.reader.forward(length) ch = self.reader.peek() @@ -923,8 +918,8 @@ class Scanner: self.reader.forward(2) suffix = self.scan_tag_uri('tag', start_marker) if self.reader.peek() != u'>': - raise ScannerError("while parsing a tag", start_marking, - "expected '>', but got %r" % self.reader.peek().encode('utf-8'), + raise ScannerError("while parsing a tag", start_marker, + "expected '>', but found %r" % self.reader.peek().encode('utf-8'), self.reader.get_marker()) self.reader.forward() elif ch in u'\0 \t\r\n\x85\u2028\u2029': @@ -1309,7 +1304,8 @@ class Scanner: # See the specification for details. # For some strange reasons, the specification does not allow '_' in # tag handles. I have allowed it anyway. - if self.reader.peek() != u'!': + ch = self.reader.peek() + if ch != u'!': raise ScannerError("while scanning a %s" % name, start_marker, "expected '!', but found %r" % ch.encode('utf-8'), self.reader.get_marker()) diff --git a/lib/yaml/tokens.py b/lib/yaml/tokens.py index 637ec87..863bb44 100644 --- a/lib/yaml/tokens.py +++ b/lib/yaml/tokens.py @@ -35,7 +35,7 @@ class BlockSequenceStartToken(Token): id = '<block sequence start>' class BlockMappingStartToken(Token): - id = '<block mapping end>' + id = '<block mapping start>' class BlockEndToken(Token): id = '<block end>' diff --git a/tests/data/duplicate-tag-directive.error-message b/tests/data/duplicate-tag-directive.error-message new file mode 100644 index 0000000..50c81a0 --- /dev/null +++ b/tests/data/duplicate-tag-directive.error-message @@ -0,0 +1,3 @@ +%TAG !foo! bar +%TAG !foo! baz +--- foo diff --git a/tests/data/duplicate-yaml-directive.error-message b/tests/data/duplicate-yaml-directive.error-message new file mode 100644 index 0000000..9b72390 --- /dev/null +++ b/tests/data/duplicate-yaml-directive.error-message @@ -0,0 +1,3 @@ +%YAML 1.1 +%YAML 1.1 +--- foo diff --git a/tests/data/invalid-anchor-1.error-message b/tests/data/invalid-anchor-1.error-message new file mode 100644 index 0000000..fcf7d0f --- /dev/null +++ b/tests/data/invalid-anchor-1.error-message @@ -0,0 +1 @@ +--- &? foo # we allow only ascii and numeric characters in anchor names. diff --git a/tests/data/invalid-anchor-2.error-message b/tests/data/invalid-anchor-2.error-message new file mode 100644 index 0000000..bfc4ff0 --- /dev/null +++ b/tests/data/invalid-anchor-2.error-message @@ -0,0 +1,8 @@ +--- +- [ + &correct foo, + *correct, + *correct] # still correct +- *correct: still correct +- &correct-or-not[foo, bar] + diff --git a/tests/data/invalid-directive-line.error-message b/tests/data/invalid-directive-line.error-message new file mode 100644 index 0000000..0892eb6 --- /dev/null +++ b/tests/data/invalid-directive-line.error-message @@ -0,0 +1,2 @@ +%YAML 1.1 ? # extra symbol +--- diff --git a/tests/data/invalid-directive-name-1.error-message b/tests/data/invalid-directive-name-1.error-message new file mode 100644 index 0000000..153fd88 --- /dev/null +++ b/tests/data/invalid-directive-name-1.error-message @@ -0,0 +1,2 @@ +% # no name at all +--- diff --git a/tests/data/invalid-directive-name-2.error-message b/tests/data/invalid-directive-name-2.error-message new file mode 100644 index 0000000..3732a06 --- /dev/null +++ b/tests/data/invalid-directive-name-2.error-message @@ -0,0 +1,2 @@ +%invalid-characters:in-directive name +--- diff --git a/tests/data/invalid-tag-1.error-message b/tests/data/invalid-tag-1.error-message new file mode 100644 index 0000000..a68cd38 --- /dev/null +++ b/tests/data/invalid-tag-1.error-message @@ -0,0 +1 @@ +- !<foo#bar> baz diff --git a/tests/data/invalid-tag-2.error-message b/tests/data/invalid-tag-2.error-message new file mode 100644 index 0000000..3a36700 --- /dev/null +++ b/tests/data/invalid-tag-2.error-message @@ -0,0 +1 @@ +- !prefix!foo#bar baz diff --git a/tests/data/invalid-tag-directive-handle.error-message b/tests/data/invalid-tag-directive-handle.error-message new file mode 100644 index 0000000..42b5d7e --- /dev/null +++ b/tests/data/invalid-tag-directive-handle.error-message @@ -0,0 +1,2 @@ +%TAG !!! !!! +--- diff --git a/tests/data/invalid-tag-directive-prefix.error-message b/tests/data/invalid-tag-directive-prefix.error-message new file mode 100644 index 0000000..0cb482c --- /dev/null +++ b/tests/data/invalid-tag-directive-prefix.error-message @@ -0,0 +1,2 @@ +%TAG ! tag:zz.com/foo#bar # '#' is not allowed in URLs +--- diff --git a/tests/data/invalid-tag-handle-1.error-message b/tests/data/invalid-tag-handle-1.error-message new file mode 100644 index 0000000..ef0d143 --- /dev/null +++ b/tests/data/invalid-tag-handle-1.error-message @@ -0,0 +1,2 @@ +%TAG foo bar +--- diff --git a/tests/data/invalid-tag-handle-2.error-message b/tests/data/invalid-tag-handle-2.error-message new file mode 100644 index 0000000..06c7f0e --- /dev/null +++ b/tests/data/invalid-tag-handle-2.error-message @@ -0,0 +1,2 @@ +%TAG !foo bar +--- diff --git a/tests/data/invalid-uri-escapes-1.error-message b/tests/data/invalid-uri-escapes-1.error-message new file mode 100644 index 0000000..a6ecb36 --- /dev/null +++ b/tests/data/invalid-uri-escapes-1.error-message @@ -0,0 +1 @@ +--- !<tag:%x?y> foo diff --git a/tests/data/invalid-uri-escapes-2.error-message b/tests/data/invalid-uri-escapes-2.error-message new file mode 100644 index 0000000..b89e8f6 --- /dev/null +++ b/tests/data/invalid-uri-escapes-2.error-message @@ -0,0 +1 @@ +--- !<%FF> foo diff --git a/tests/data/invalid-uri-escapes-3.error-message b/tests/data/invalid-uri-escapes-3.error-message new file mode 100644 index 0000000..f2e4cb8 --- /dev/null +++ b/tests/data/invalid-uri-escapes-3.error-message @@ -0,0 +1 @@ +--- !<foo%d0%af%d0%af%d0bar> baz diff --git a/tests/data/invalid-uri.error-message b/tests/data/invalid-uri.error-message new file mode 100644 index 0000000..06307e0 --- /dev/null +++ b/tests/data/invalid-uri.error-message @@ -0,0 +1 @@ +--- !foo! bar diff --git a/tests/data/invalid-yaml-directive-version-1.error-message b/tests/data/invalid-yaml-directive-version-1.error-message new file mode 100644 index 0000000..e9b4e3a --- /dev/null +++ b/tests/data/invalid-yaml-directive-version-1.error-message @@ -0,0 +1,3 @@ +# No version at all. +%YAML +--- diff --git a/tests/data/invalid-yaml-directive-version-2.error-message b/tests/data/invalid-yaml-directive-version-2.error-message new file mode 100644 index 0000000..6aa7740 --- /dev/null +++ b/tests/data/invalid-yaml-directive-version-2.error-message @@ -0,0 +1,2 @@ +%YAML 1e-5 +--- diff --git a/tests/data/invalid-yaml-directive-version-3.error-message b/tests/data/invalid-yaml-directive-version-3.error-message new file mode 100644 index 0000000..345e784 --- /dev/null +++ b/tests/data/invalid-yaml-directive-version-3.error-message @@ -0,0 +1,2 @@ +%YAML 1. +--- diff --git a/tests/data/invalid-yaml-directive-version-4.error-message b/tests/data/invalid-yaml-directive-version-4.error-message new file mode 100644 index 0000000..b35ca82 --- /dev/null +++ b/tests/data/invalid-yaml-directive-version-4.error-message @@ -0,0 +1,2 @@ +%YAML 1.132.435 +--- diff --git a/tests/data/invalid-yaml-directive-version-5.error-message b/tests/data/invalid-yaml-directive-version-5.error-message new file mode 100644 index 0000000..7c2b49f --- /dev/null +++ b/tests/data/invalid-yaml-directive-version-5.error-message @@ -0,0 +1,2 @@ +%YAML A.0 +--- diff --git a/tests/data/invalid-yaml-directive-version-6.error-message b/tests/data/invalid-yaml-directive-version-6.error-message new file mode 100644 index 0000000..bae714f --- /dev/null +++ b/tests/data/invalid-yaml-directive-version-6.error-message @@ -0,0 +1,2 @@ +%YAML 123.C +--- diff --git a/tests/data/invalid-yaml-version.error-message b/tests/data/invalid-yaml-version.error-message new file mode 100644 index 0000000..dd01948 --- /dev/null +++ b/tests/data/invalid-yaml-version.error-message @@ -0,0 +1,2 @@ +%YAML 2.0 +--- foo diff --git a/tests/data/no-block-collection-end.error-message b/tests/data/no-block-collection-end.error-message new file mode 100644 index 0000000..02d4d37 --- /dev/null +++ b/tests/data/no-block-collection-end.error-message @@ -0,0 +1,3 @@ +- foo +- bar +baz: bar diff --git a/tests/data/no-block-mapping-end.error-message b/tests/data/no-block-mapping-end.error-message new file mode 100644 index 0000000..1ea921c --- /dev/null +++ b/tests/data/no-block-mapping-end.error-message @@ -0,0 +1 @@ +foo: "bar" "baz" diff --git a/tests/data/no-document-start.error-message b/tests/data/no-document-start.error-message new file mode 100644 index 0000000..c725ec8 --- /dev/null +++ b/tests/data/no-document-start.error-message @@ -0,0 +1,3 @@ +%YAML 1.1 +# no --- +foo: bar diff --git a/tests/data/no-flow-mapping-end.error-message b/tests/data/no-flow-mapping-end.error-message new file mode 100644 index 0000000..8bd1403 --- /dev/null +++ b/tests/data/no-flow-mapping-end.error-message @@ -0,0 +1 @@ +{ foo: bar ] diff --git a/tests/data/no-flow-sequence-end.error-message b/tests/data/no-flow-sequence-end.error-message new file mode 100644 index 0000000..750d973 --- /dev/null +++ b/tests/data/no-flow-sequence-end.error-message @@ -0,0 +1 @@ +[foo, bar} diff --git a/tests/data/no-node-1.error-message b/tests/data/no-node-1.error-message new file mode 100644 index 0000000..07b1500 --- /dev/null +++ b/tests/data/no-node-1.error-message @@ -0,0 +1 @@ +- !foo ] diff --git a/tests/data/no-node-2.error-message b/tests/data/no-node-2.error-message new file mode 100644 index 0000000..563e3b3 --- /dev/null +++ b/tests/data/no-node-2.error-message @@ -0,0 +1 @@ +- [ !foo } ] diff --git a/tests/data/unclosed-bracket.error-message b/tests/data/unclosed-bracket.error-message index 1d07a46..8c82077 100644 --- a/tests/data/unclosed-bracket.error-message +++ b/tests/data/unclosed-bracket.error-message @@ -1,5 +1,6 @@ test: - [ foo: bar - - baz -"we could have detected the unclosed bracket on the above line, but this would forbid such syntax as": { -} +# comment the rest of the stream to let the scanner detect the problem. +# - baz +#"we could have detected the unclosed bracket on the above line, but this would forbid such syntax as": { +#} diff --git a/tests/data/undefined-tag-handle.error-message b/tests/data/undefined-tag-handle.error-message new file mode 100644 index 0000000..82ba335 --- /dev/null +++ b/tests/data/undefined-tag-handle.error-message @@ -0,0 +1 @@ +--- !foo!bar baz diff --git a/tests/test_errors.py b/tests/test_errors.py index 431258b..cf229a4 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -2,8 +2,9 @@ import test_appliance from yaml.error import YAMLError -from yaml.reader import Reader -from yaml.scanner import Scanner +from yaml.reader import * +from yaml.scanner import * +from yaml.parser import * class TestErrors(test_appliance.TestAppliance): @@ -16,14 +17,31 @@ class TestErrors(test_appliance.TestAppliance): self.failUnlessRaises(YAMLError, lambda: self._load_string(invalid_filename)) def _load(self, filename): - reader = Reader(file(filename, 'rb')) - scanner = Scanner(reader) - return list(scanner) + try: + reader = Reader(file(filename, 'rb')) + scanner = Scanner(reader) + parser = Parser(scanner) + return list(parser) + except YAMLError, exc: + #except ScannerError, exc: + #except ParserError, exc: + #print '.'*70 + #print "%s:" % exc.__class__.__name__, exc + raise def _load_string(self, filename): - reader = Reader(file(filename, 'rb').read()) - scanner = Scanner(reader) - return list(scanner) + try: + reader = Reader(file(filename, 'rb').read()) + scanner = Scanner(reader) + parser = Parser(scanner) + return list(parser) + except YAMLError, exc: + #except ScannerError, exc: + #except ParserError, exc: + #print '.'*70 + #print "%s:" % filename + #print "%s:" % exc.__class__.__name__, exc + raise TestErrors.add_tests('testErrors', '.error-message') TestErrors.add_tests('testStringErrors', '.error-message') diff --git a/tests/test_syck.py b/tests/test_syck.py new file mode 100644 index 0000000..dd63056 --- /dev/null +++ b/tests/test_syck.py @@ -0,0 +1,30 @@ + +import test_appliance + +class TestSyck(test_appliance.TestAppliance): + + def _testSyckOnTokenTests(self, test_name, data_filename, tokens_filename): + try: + syck.parse(file(data_filename, 'rb')) + except: + print + print "DATA:" + print file(data_filename, 'rb').read() + raise + + def _testSyckOnCanonicalTests(self, test_name, data_filename, canonical_filename): + try: + syck.parse(file(data_filename, 'rb')) + except: + print + print "DATA:" + print file(data_filename, 'rb').read() + raise + +try: + import syck + #TestSyck.add_tests('testSyckOnTokenTests', '.data', '.tokens') + #TestSyck.add_tests('testSyckOnCanonicalTests', '.data', '.canonical') +except ImportError: + pass + diff --git a/tests/test_yaml.py b/tests/test_yaml.py index fd7b5ac..f0c0527 100644 --- a/tests/test_yaml.py +++ b/tests/test_yaml.py @@ -7,6 +7,7 @@ from test_canonical import * from test_tokens import * from test_structure import * from test_errors import * +from test_syck import * def main(module='__main__'): unittest.main(module) |