summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxi <xi@18f92427-320e-0410-9341-c67f048884a3>2006-02-20 17:41:45 +0000
committerxi <xi@18f92427-320e-0410-9341-c67f048884a3>2006-02-20 17:41:45 +0000
commitab545668480793a64dcc6e71c16af09068ed91b9 (patch)
tree5cdfcd8b4497e29462b9b0b5f2010dba89793fd9
parent282bbe171b1c36ce94185dbb95fbd9d5b971d21f (diff)
downloadpyyaml-ab545668480793a64dcc6e71c16af09068ed91b9.tar.gz
Cleanup error messages.
git-svn-id: http://svn.pyyaml.org/branches/pyyaml3000@52 18f92427-320e-0410-9341-c67f048884a3
-rw-r--r--lib/yaml/error.py75
-rw-r--r--lib/yaml/parser.py37
-rw-r--r--lib/yaml/reader.py44
-rw-r--r--lib/yaml/scanner.py72
-rw-r--r--lib/yaml/tokens.py2
-rw-r--r--tests/data/duplicate-tag-directive.error-message3
-rw-r--r--tests/data/duplicate-yaml-directive.error-message3
-rw-r--r--tests/data/invalid-anchor-1.error-message1
-rw-r--r--tests/data/invalid-anchor-2.error-message8
-rw-r--r--tests/data/invalid-directive-line.error-message2
-rw-r--r--tests/data/invalid-directive-name-1.error-message2
-rw-r--r--tests/data/invalid-directive-name-2.error-message2
-rw-r--r--tests/data/invalid-tag-1.error-message1
-rw-r--r--tests/data/invalid-tag-2.error-message1
-rw-r--r--tests/data/invalid-tag-directive-handle.error-message2
-rw-r--r--tests/data/invalid-tag-directive-prefix.error-message2
-rw-r--r--tests/data/invalid-tag-handle-1.error-message2
-rw-r--r--tests/data/invalid-tag-handle-2.error-message2
-rw-r--r--tests/data/invalid-uri-escapes-1.error-message1
-rw-r--r--tests/data/invalid-uri-escapes-2.error-message1
-rw-r--r--tests/data/invalid-uri-escapes-3.error-message1
-rw-r--r--tests/data/invalid-uri.error-message1
-rw-r--r--tests/data/invalid-yaml-directive-version-1.error-message3
-rw-r--r--tests/data/invalid-yaml-directive-version-2.error-message2
-rw-r--r--tests/data/invalid-yaml-directive-version-3.error-message2
-rw-r--r--tests/data/invalid-yaml-directive-version-4.error-message2
-rw-r--r--tests/data/invalid-yaml-directive-version-5.error-message2
-rw-r--r--tests/data/invalid-yaml-directive-version-6.error-message2
-rw-r--r--tests/data/invalid-yaml-version.error-message2
-rw-r--r--tests/data/no-block-collection-end.error-message3
-rw-r--r--tests/data/no-block-mapping-end.error-message1
-rw-r--r--tests/data/no-document-start.error-message3
-rw-r--r--tests/data/no-flow-mapping-end.error-message1
-rw-r--r--tests/data/no-flow-sequence-end.error-message1
-rw-r--r--tests/data/no-node-1.error-message1
-rw-r--r--tests/data/no-node-2.error-message1
-rw-r--r--tests/data/unclosed-bracket.error-message7
-rw-r--r--tests/data/undefined-tag-handle.error-message1
-rw-r--r--tests/test_errors.py34
-rw-r--r--tests/test_syck.py30
-rw-r--r--tests/test_yaml.py1
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)