From 6efb96a893fd3714eed462cac02e7356433004fc Mon Sep 17 00:00:00 2001 From: Mike Dirolf Date: Wed, 7 Jan 2009 19:52:58 -0500 Subject: [PATCH] wip: still banging against weirdness w/ bson regexps --- bson.py | 38 ++++++++++++++++++++++++++++++++++++-- test/qcheck.py | 20 +++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/bson.py b/bson.py index f190d2a01..e6fc13aa5 100644 --- a/bson.py +++ b/bson.py @@ -195,6 +195,24 @@ def _get_date(data): def _get_null(data): return (None, data) +_re_stack = [] + +def _get_regex(data): + (pattern, data) = _get_c_string(data) + print "out %r" % pattern + (bson_flags, data) = _get_c_string(data) + flags = 0 + if bson_flags.find("i") > -1: + flags |= re.IGNORECASE + if bson_flags.find("m") > -1: + flags |= re.MULTILINE + print "out %r" % flags + res = re.compile(pattern, flags) + other = _re_stack.pop(0) + assert res.pattern == other.pattern, "%r %r" % (res.pattern, other.pattern) + assert res == other, "%r %r" % (res.pattern, other.pattern) + return (re.compile(pattern, flags), data) + _element_getter = { "\x01": _get_number, "\x02": _get_string, @@ -206,7 +224,7 @@ _element_getter = { "\x08": _get_boolean, "\x09": _get_date, "\x0A": _get_null, -# "\x0B": _get_regex, + "\x0B": _get_regex, # "\x0C": _get_ref, # "\x0D": _get_code, # "\x0E": _get_symbol, @@ -238,6 +256,7 @@ def _int_to_bson(int): def _int_64_to_bson(int): return struct.pack(" 0.5: + flags = flags | re.IGNORECASE + if random.random() > 0.5: + flags = flags | re.MULTILINE + return flags + return lambda: re.compile(pattern(), gen_flags()) + def gen_mongo_value(depth): choices = [gen_unicode(gen_range(0, 50)), gen_string(gen_range(0, 1000)), @@ -70,6 +85,7 @@ def gen_mongo_value(depth): gen_float(), gen_boolean(), gen_datetime(), + gen_regexp(gen_range(0, 20)), lift(None),] if depth > 0: choices.append(gen_mongo_list(depth)) @@ -93,8 +109,10 @@ def check(predicate, generator): case = generator() try: if not predicate(case): + print "FAIL" counter_examples.append(repr(case)) except: + print "FAIL" counter_examples.append("%r : %s" % (case, traceback.format_exc())) return counter_examples