From c09350f5016796ee76d2e43f174cce2fdb672ddd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 27 Mar 2014 14:13:04 +0000 Subject: Capture invalid input errors --- jq.pyx | 14 +++++++++++++- tests/jq_tests.py | 11 +++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/jq.pyx b/jq.pyx index 5e49c34..980662d 100644 --- a/jq.pyx +++ b/jq.pyx @@ -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(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 @@ -104,6 +104,17 @@ def errors_do_not_leak_between_transformations(): assert_equal(1, program.transform({"x": 1})) +@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( -- cgit v1.2.3