You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
4.0 KiB

4 years ago
  1. from jmespath.compat import with_str_method
  2. class JMESPathError(ValueError):
  3. pass
  4. @with_str_method
  5. class ParseError(JMESPathError):
  6. _ERROR_MESSAGE = 'Invalid jmespath expression'
  7. def __init__(self, lex_position, token_value, token_type,
  8. msg=_ERROR_MESSAGE):
  9. super(ParseError, self).__init__(lex_position, token_value, token_type)
  10. self.lex_position = lex_position
  11. self.token_value = token_value
  12. self.token_type = token_type.upper()
  13. self.msg = msg
  14. # Whatever catches the ParseError can fill in the full expression
  15. self.expression = None
  16. def __str__(self):
  17. # self.lex_position +1 to account for the starting double quote char.
  18. underline = ' ' * (self.lex_position + 1) + '^'
  19. return (
  20. '%s: Parse error at column %s, '
  21. 'token "%s" (%s), for expression:\n"%s"\n%s' % (
  22. self.msg, self.lex_position, self.token_value, self.token_type,
  23. self.expression, underline))
  24. @with_str_method
  25. class IncompleteExpressionError(ParseError):
  26. def set_expression(self, expression):
  27. self.expression = expression
  28. self.lex_position = len(expression)
  29. self.token_type = None
  30. self.token_value = None
  31. def __str__(self):
  32. # self.lex_position +1 to account for the starting double quote char.
  33. underline = ' ' * (self.lex_position + 1) + '^'
  34. return (
  35. 'Invalid jmespath expression: Incomplete expression:\n'
  36. '"%s"\n%s' % (self.expression, underline))
  37. @with_str_method
  38. class LexerError(ParseError):
  39. def __init__(self, lexer_position, lexer_value, message, expression=None):
  40. self.lexer_position = lexer_position
  41. self.lexer_value = lexer_value
  42. self.message = message
  43. super(LexerError, self).__init__(lexer_position,
  44. lexer_value,
  45. message)
  46. # Whatever catches LexerError can set this.
  47. self.expression = expression
  48. def __str__(self):
  49. underline = ' ' * self.lexer_position + '^'
  50. return 'Bad jmespath expression: %s:\n%s\n%s' % (
  51. self.message, self.expression, underline)
  52. @with_str_method
  53. class ArityError(ParseError):
  54. def __init__(self, expected, actual, name):
  55. self.expected_arity = expected
  56. self.actual_arity = actual
  57. self.function_name = name
  58. self.expression = None
  59. def __str__(self):
  60. return ("Expected %s %s for function %s(), "
  61. "received %s" % (
  62. self.expected_arity,
  63. self._pluralize('argument', self.expected_arity),
  64. self.function_name,
  65. self.actual_arity))
  66. def _pluralize(self, word, count):
  67. if count == 1:
  68. return word
  69. else:
  70. return word + 's'
  71. @with_str_method
  72. class VariadictArityError(ArityError):
  73. def __str__(self):
  74. return ("Expected at least %s %s for function %s(), "
  75. "received %s" % (
  76. self.expected_arity,
  77. self._pluralize('argument', self.expected_arity),
  78. self.function_name,
  79. self.actual_arity))
  80. @with_str_method
  81. class JMESPathTypeError(JMESPathError):
  82. def __init__(self, function_name, current_value, actual_type,
  83. expected_types):
  84. self.function_name = function_name
  85. self.current_value = current_value
  86. self.actual_type = actual_type
  87. self.expected_types = expected_types
  88. def __str__(self):
  89. return ('In function %s(), invalid type for value: %s, '
  90. 'expected one of: %s, received: "%s"' % (
  91. self.function_name, self.current_value,
  92. self.expected_types, self.actual_type))
  93. class EmptyExpressionError(JMESPathError):
  94. def __init__(self):
  95. super(EmptyExpressionError, self).__init__(
  96. "Invalid JMESPath expression: cannot be empty.")
  97. class UnknownFunctionError(JMESPathError):
  98. pass