bson support for oid

This commit is contained in:
Mike Dirolf 2009-01-08 11:09:41 -05:00
parent 318549abdd
commit c2ada2f010
2 changed files with 18 additions and 4 deletions

14
bson.py
View File

@ -12,6 +12,7 @@ import time
import logging
from test import test_data, qcheck
from objectid import ObjectId
_logger = logging.getLogger("mongo.bson")
# _logger.setLevel(logging.DEBUG)
@ -213,6 +214,10 @@ def _get_binary(data):
(length, data) = _get_int(data)
return (data[:length], data[length:])
def _get_oid(data):
_logger.debug("unpacking oid")
return (ObjectId(data[:12]), data[12:])
def _get_boolean(data):
_logger.debug("unpacking boolean")
return (data[0] == "\x01", data[1:])
@ -244,7 +249,7 @@ _element_getter = {
"\x04": _get_array,
"\x05": _get_binary,
"\x06": _get_null, # undefined
# "\x07": _get_oid,
"\x07": _get_oid,
"\x08": _get_boolean,
"\x09": _get_date,
"\x0A": _get_null,
@ -283,7 +288,7 @@ def _int_64_to_bson(int):
_RE_TYPE = type(_valid_array_name)
def _value_to_bson(value):
if isinstance(value, types.FloatType):
_logger.debug("packing float")
_logger.debug("packing number")
return ("\x01", struct.pack("<d", value))
if isinstance(value, types.UnicodeType):
_logger.debug("packing string")
@ -300,6 +305,9 @@ def _value_to_bson(value):
if isinstance(value, types.StringType):
_logger.debug("packing binary")
return ("\x05", _int_to_bson(len(value)) + value)
if isinstance(value, ObjectId):
_logger.debug("packing oid")
return ("\x07", str(value))
if isinstance(value, types.BooleanType):
_logger.debug("packing boolean")
if value:
@ -471,6 +479,8 @@ class TestBSON(unittest.TestCase):
"\x16\x00\x00\x00\x0D\x24\x77\x68\x65\x72\x65\x00\x05\x00\x00\x00\x74\x65\x73\x74\x00\x00")
self.assertEqual(BSON.from_dict({"$where": u"test"}),
"\x16\x00\x00\x00\x0D\x24\x77\x68\x65\x72\x65\x00\x05\x00\x00\x00\x74\x65\x73\x74\x00\x00")
self.assertEqual(BSON.from_dict({"oid": ObjectId("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B")}),
"\x16\x00\x00\x00\x07\x6F\x69\x64\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x00")
def test_from_then_to_dict(self):
def helper(dict):

View File

@ -4,6 +4,8 @@ import traceback
import datetime
import re
from objectid import ObjectId
gen_target = 100
examples = 5
@ -81,6 +83,9 @@ def gen_regexp(gen_length):
return flags
return lambda: re.compile(pattern(), gen_flags())
def gen_objectid():
return lambda: ObjectId()
def gen_mongo_value(depth):
choices = [gen_unicode(gen_range(0, 50)),
gen_string(gen_range(0, 1000)),
@ -89,6 +94,7 @@ def gen_mongo_value(depth):
gen_boolean(),
gen_datetime(),
gen_regexp(gen_range(0, 20)),
gen_objectid(),
lift(None),]
if depth > 0:
choices.append(gen_mongo_list(depth))
@ -112,10 +118,8 @@ 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