error.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # SPDX-License-Identifier: MIT
  2. __all__ = ['Mark', 'YAMLError', 'MarkedYAMLError']
  3. class Mark(object):
  4. def __init__(self, name, index, line, column, buffer, pointer):
  5. self.name = name
  6. self.index = index
  7. self.line = line
  8. self.column = column
  9. self.buffer = buffer
  10. self.pointer = pointer
  11. def get_snippet(self, indent=4, max_length=75):
  12. if self.buffer is None:
  13. return None
  14. head = ''
  15. start = self.pointer
  16. while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029':
  17. start -= 1
  18. if self.pointer-start > max_length/2-1:
  19. head = ' ... '
  20. start += 5
  21. break
  22. tail = ''
  23. end = self.pointer
  24. while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029':
  25. end += 1
  26. if end-self.pointer > max_length/2-1:
  27. tail = ' ... '
  28. end -= 5
  29. break
  30. snippet = self.buffer[start:end].encode('utf-8')
  31. return ' '*indent + head + snippet + tail + '\n' \
  32. + ' '*(indent+self.pointer-start+len(head)) + '^'
  33. def __str__(self):
  34. snippet = self.get_snippet()
  35. where = " in \"%s\", line %d, column %d" \
  36. % (self.name, self.line+1, self.column+1)
  37. if snippet is not None:
  38. where += ":\n"+snippet
  39. return where
  40. class YAMLError(Exception):
  41. pass
  42. class MarkedYAMLError(YAMLError):
  43. def __init__(self, context=None, context_mark=None,
  44. problem=None, problem_mark=None, note=None):
  45. self.context = context
  46. self.context_mark = context_mark
  47. self.problem = problem
  48. self.problem_mark = problem_mark
  49. self.note = note
  50. def __str__(self):
  51. lines = []
  52. if self.context is not None:
  53. lines.append(self.context)
  54. if self.context_mark is not None \
  55. and (self.problem is None or self.problem_mark is None
  56. or self.context_mark.name != self.problem_mark.name
  57. or self.context_mark.line != self.problem_mark.line
  58. or self.context_mark.column != self.problem_mark.column):
  59. lines.append(str(self.context_mark))
  60. if self.problem is not None:
  61. lines.append(self.problem)
  62. if self.problem_mark is not None:
  63. lines.append(str(self.problem_mark))
  64. if self.note is not None:
  65. lines.append(self.note)
  66. return '\n'.join(lines)