summaryrefslogtreecommitdiff
path: root/error.py
diff options
context:
space:
mode:
authorAnthon van der Neut <anthon@mnt.org>2015-08-28 08:03:59 +0200
committerAnthon van der Neut <anthon@mnt.org>2015-08-28 08:03:59 +0200
commit386029ed647ca7fd0209506285f02365c347eef9 (patch)
tree78263b913d9dbe9bf7c8a3c04379f508bff56a23 /error.py
parent04e651b6b062edbdf66271847d3dde06550adbb4 (diff)
downloadruamel.yaml-386029ed647ca7fd0209506285f02365c347eef9.tar.gz
- main problem in moving stuff from yaml/py to yaml was that
parser.py clashes with built-in parser module (CPython, C-module) which is inlucded from pkg_resources/__init__.py - no C compile yet
Diffstat (limited to 'error.py')
-rw-r--r--error.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/error.py b/error.py
new file mode 100644
index 0000000..2b76904
--- /dev/null
+++ b/error.py
@@ -0,0 +1,80 @@
+from __future__ import absolute_import
+
+__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError']
+
+from .compat import utf8
+
+
+class Mark(object):
+ def __init__(self, name, index, line, column, buffer, pointer):
+ self.name = name
+ self.index = index
+ self.line = line
+ self.column = column
+ self.buffer = buffer
+ self.pointer = pointer
+
+ def get_snippet(self, indent=4, max_length=75):
+ if self.buffer is None:
+ return None
+ head = ''
+ start = self.pointer
+ while (start > 0 and
+ self.buffer[start-1] not in 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 = utf8(self.buffer[start:end])
+ return ' '*indent + head + snippet + tail + '\n' \
+ + ' '*(indent+self.pointer-start+len(head)) + '^'
+
+ def __str__(self):
+ snippet = self.get_snippet()
+ where = " in \"%s\", line %d, column %d" \
+ % (self.name, self.line+1, self.column+1)
+ if snippet is not None:
+ where += ":\n"+snippet
+ return where
+
+
+class YAMLError(Exception):
+ pass
+
+
+class MarkedYAMLError(YAMLError):
+ def __init__(self, context=None, context_mark=None,
+ problem=None, problem_mark=None, note=None):
+ self.context = context
+ self.context_mark = context_mark
+ self.problem = problem
+ self.problem_mark = problem_mark
+ self.note = note
+
+ def __str__(self):
+ lines = []
+ if self.context is not None:
+ lines.append(self.context)
+ if self.context_mark is not None \
+ and (self.problem is None or self.problem_mark is None
+ or self.context_mark.name != self.problem_mark.name
+ or self.context_mark.line != self.problem_mark.line
+ or self.context_mark.column != self.problem_mark.column):
+ lines.append(str(self.context_mark))
+ if self.problem is not None:
+ lines.append(self.problem)
+ if self.problem_mark is not None:
+ lines.append(str(self.problem_mark))
+ if self.note is not None:
+ lines.append(self.note)
+ return '\n'.join(lines)