diff options
| author | Michael Williamson <mike@zwobble.org> | 2014-03-27 14:13:04 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2014-03-27 14:13:04 +0000 |
| commit | c09350f5016796ee76d2e43f174cce2fdb672ddd (patch) | |
| tree | 6fbab141cee745927d832453f7015466a2b1d648 | |
| parent | d9cae8c701c21d401551ed1d551ced7324fd7114 (diff) | |
Capture invalid input errors
| -rw-r--r-- | jq.pyx | 14 | ||||
| -rw-r--r-- | tests/jq_tests.py | 11 |
2 files changed, 24 insertions, 1 deletions
@@ -14,11 +14,15 @@ cdef extern from "jv.h": ctypedef struct jv: pass + jv_kind jv_get_kind(jv) int jv_is_valid(jv) + jv jv_copy(jv) + void jv_free(jv) + jv jv_invalid_get_msg(jv) + int jv_invalid_has_msg(jv) char* jv_string_value(jv) jv jv_dump_string(jv, int flags) - void jv_free(jv) cdef struct jv_parser: pass @@ -126,12 +130,20 @@ cdef class _Program(object): cdef jv_parser* parser = jv_parser_new(<jv_parser_flags>0) jv_parser_set_buf(parser, input, len(input), 0) cdef jv value + cdef jv error_message results = [] while True: value = jv_parser_next(parser) if jv_is_valid(value): self._process(value, results) else: + if jv_invalid_has_msg(jv_copy(value)): + error_message = jv_invalid_get_msg(value) + full_error_message = "parse error: {0}\n".format(jv_string_value(error_message)) + self._error_store.store_error(full_error_message) + jv_free(error_message) + else: + jv_free(value) break jv_parser_free(parser) diff --git a/tests/jq_tests.py b/tests/jq_tests.py index 3bf7ffb..0a3aca7 100644 --- a/tests/jq_tests.py +++ b/tests/jq_tests.py @@ -105,6 +105,17 @@ def errors_do_not_leak_between_transformations(): @istest +def value_error_is_raised_if_input_is_not_valid_json(): + program = jq(".x") + try: + program.transform("!!", raw_input=True) + assert False, "Expected error" + except ValueError as error: + expected_error_str = "parse error: Invalid numeric literal\n" + assert_equal(str(error), expected_error_str) + + +@istest def unicode_strings_can_be_used_as_input(): assert_equal( u"‽", |
