#!/usr/bin/env python
# coding=utf-8
from __future__ import absolute_import
from textwrap import dedent
[docs]class YAMLException(Exception):
"""Base exception for package"""
[docs] def __init__(self, message):
self.message = message
[docs] def __str__(self):
if self.message:
return str(self.message)
[docs]class YAMLUnknownSyntaxError(SyntaxError, YAMLException):
"""Unexpected syntax error"""
[docs]class YAMLSyntaxError(SyntaxError, YAMLException):
[docs] def __init__(self, p, value=None):
if value is None:
value = p.value
self.value = repr(value)[1:-1]
self.token = p
# get cursor position with expanded raw string
self.offset = len(repr(p.lexer.lexdata[:p.lexpos])[1:-1])
self.input = repr(p.lexer.lexdata)[1:-1]
[docs] def msg_lines(self):
yield 'unexpected: %r\n' % self.token
show_chars = 30
preview_start = max(0, self.offset - show_chars)
preview_end = min(len(self.input), len(self.input) + show_chars + 1)
yield self.input[preview_start:preview_end]
error_length = max(1, len(self.value))
pointer = '^' * error_length
width = len(self.input[preview_start:self.offset - 1] + self.value)
yield pointer.rjust(width)
[docs] def __str__(self):
return '\n'.join(self.msg_lines())
[docs]class YAMLStrictTypeError(TypeError, YAMLException):
[docs] def __init__(self, token, types, func):
func_lineno = getattr(func, 'co_firstlineno', func.__code__.co_firstlineno)
self.module = func.__module__
self.function = func.__name__
self.lineno = func_lineno
self.token_type = type(token).__name__
self.expected_types = ', '.join(type_.__name__ for type_ in types)
self.token = token
[docs] def __str__(self):
return dedent("""
expected: {self.expected_types}
unexpected type: {self.token_type}
| value: {self.token!r}
line: {self.lineno}
module: {self.module}
function: {self.function}
""").format(self=self)
[docs]class YAMLCastTypeError(TypeError, YAMLException):
[docs] def __init__(self, message=None, cast=None):
self.message = message or 'Unexpected cast type: {cast}. Type not defined'.format(cast=cast)