Пример #1
0
 def test_skeleton_simple(self):
     self.assertEqual(s.skeleton({'hello': 'world'}), '{hello}')
     self.assertEqual(s.skeleton({
         'hello': 'world',
         'foo': 'bar'
     }), '{foo,hello}')
     self.assertEqual(s.skeleton({}), '{}')
Пример #2
0
    def test_error_message(self):
        class NonBsonType(object):
            def __init__(self, value):
                self.value = value

            def __repr__(self):
                return 'NonBsonType(%r)' % self.value

        self.assertRaises(InvalidDocument, s.sanitize, ({
            'a': NonBsonType(1)
        }, ))
        try:
            s.skeleton({'a': NonBsonType(1)})
        except InvalidDocument as e:
            msg = e.args[0]
            self.assertTrue(
                re.match(r'unknown BSON type <.*NonBsonType.*>', msg))

        self.assertRaises(InvalidDocument, s.desanitize, ({
            'a': NonBsonType(1)
        }, ))
        try:
            s.skeleton({'a': NonBsonType(1)})
        except InvalidDocument as e:
            msg = e.args[0]
            self.assertTrue(
                re.match(r'unknown BSON type <.*NonBsonType.*>', msg))
Пример #3
0
    def test_skeleton_list(self):
        self.assertEqual(s.skeleton({'a': []}), '{a:[]}')
        self.assertEqual(s.skeleton({'a': [1,2,3]}), '{a:[]}')
        self.assertEqual(s.skeleton({'a': [{'b': 1}, {'b': 2}]}), '{a:[{b},{b}]}')
        self.assertEqual(s.skeleton({'a': [{'b': 1}, {'c': 2}]}), '{a:[{b},{c}]}')

        # TODO: this is weird, what should this do?
        self.assertEqual(s.skeleton({'a': [{'b': 1}, 2]}), '{a:[{b}]}')
Пример #4
0
    def test_error_message(self):
        class NonBsonType(object):
            def __init__(self, value):
                self.value = value
            def __repr__(self):
                return 'NonBsonType(%r)' % self.value

        self.assertRaises(InvalidDocument, s.skeleton, ({'a': NonBsonType(1)}, ))
        try:
            s.skeleton({'a': NonBsonType(1)})
        except InvalidDocument as e:
            msg = e.args[0]
            self.assertTrue(re.match(r'unknown BSON type <.*NonBsonType.*>', msg))
Пример #5
0
    def test_skeleton_list(self):
        self.assertEqual(s.skeleton({'a': []}), '{a:[]}')
        self.assertEqual(s.skeleton({'a': [1, 2, 3]}), '{a:[]}')
        self.assertEqual(s.skeleton({'a': [{
            'b': 1
        }, {
            'b': 2
        }]}), '{a:[{b},{b}]}')
        self.assertEqual(s.skeleton({'a': [{
            'b': 1
        }, {
            'c': 2
        }]}), '{a:[{b},{c}]}')

        # TODO: this is weird, what should this do?
        self.assertEqual(s.skeleton({'a': [{'b': 1}, 2]}), '{a:[{b}]}')
Пример #6
0
def skeleton(query_part):
    """
    Generate a "skeleton" of a document (or embedded document). A
    skeleton is a (unicode) string indicating the keys present in
    a document, but not the values, and is used to group queries
    together which have identical key patterns regardless of the
    particular values used. Keys in the skeleton are always sorted
    lexicographically.

    Raises :class:`~bson.errors.InvalidDocument` when the document
    cannot be converted into a skeleton (this usually indicates that
    the type of a key or value in the document is not known to
    Professor).

    For example:

        >>> skeleton({'hello': 'World'})
        u'{hello}'
        >>> skeleton({'title': 'My Blog Post', 'author': 'Dan Crosta'})
        u'{author,title}
        >>> skeleton({})
        u'{}'
    """
    t = type(query_part)
    if t == list:
        out = []
        for element in query_part:
            sub = skeleton(element)
            if sub is not None:
                out.append(sub)
        return u'[%s]' % ','.join(out)
    elif t in (dict, SON):
        out = []
        for key in sorted(query_part.keys()):
            sub = skeleton(query_part[key])
            if sub is not None:
                out.append('%s:%s' % (key, sub))
            else:
                out.append(key)
        return u'{%s}' % ','.join(out)
    elif t not in BSON_TYPES:
        raise InvalidDocument('unknown BSON type %r' % t)
Пример #7
0
def skeleton(query_part):
    """
    Generate a "skeleton" of a document (or embedded document). A
    skeleton is a (unicode) string indicating the keys present in
    a document, but not the values, and is used to group queries
    together which have identical key patterns regardless of the
    particular values used. Keys in the skeleton are always sorted
    lexicographically.

    Raises :class:`~bson.errors.InvalidDocument` when the document
    cannot be converted into a skeleton (this usually indicates that
    the type of a key or value in the document is not known to
    Professor).

    For example:

        >>> skeleton({'hello': 'World'})
        u'{hello}'
        >>> skeleton({'title': 'My Blog Post', 'author': 'Dan Crosta'})
        u'{author,title}
        >>> skeleton({})
        u'{}'
    """
    t = type(query_part)
    if t == list:
        out = []
        for element in query_part:
            sub = skeleton(element)
            if sub is not None:
                out.append(sub)
        return u'[%s]' % ','.join(out)
    elif t in (dict, SON):
        out = []
        for key in sorted(query_part.keys()):
            sub = skeleton(query_part[key])
            if sub is not None:
                out.append('%s:%s' % (key, sub))
            else:
                out.append(key)
        return u'{%s}' % ','.join(out)
    elif t not in BSON_TYPES:
        raise InvalidDocument('unknown BSON type %r' % t)
Пример #8
0
    def test_skeleton_embedded_objects(self):
        self.assertEqual(s.skeleton({'a': {'b': 1}}), '{a:{b}}')
        self.assertEqual(s.skeleton({'a': {'b': 1}, 'c': 1}), '{a:{b},c}')
        self.assertEqual(s.skeleton({'a': {'b': 1, 'd': 2}, 'c': 1}), '{a:{b,d},c}')

        # make sure top-level SON objects work
        self.assertEqual(s.skeleton(SON([('a', 1)])), '{a}')

        # and embedded SON objects
        self.assertEqual(s.skeleton({'a': SON([('b', 1)])}), '{a:{b}}')
        self.assertEqual(s.skeleton({'a': SON([('b', 1)]), 'c': 1}), '{a:{b},c}')
        self.assertEqual(s.skeleton({'a': SON([('b', 1), ('d', 2)]), 'c': 1}), '{a:{b,d},c}')
Пример #9
0
def parse_query(entry):
    # {'responseLength': 20,
    #  'millis': 40,
    #  'ts': datetime.datetime(2011, 9, 19, 15, 8, 1, 976000),
    #  'scanAndOrder': True,
    #  'client': '127.0.0.1',
    #  'user': '',
    #  'query': {'$orderby': {'date': 1},
    #            '$query': {'processing.status': 'new'}},
    #  'ns': 'www.formcapture',
    #  'nscanned': 12133,
    #  'op': 'query'}

    query = entry.get('query', {}).get('$query', None)
    if query is None:
        query = entry.get('query', {})

    orderby = entry.get('query', {}).get('$orderby', None)
    if orderby is None:
        orderby = {}

    entry['skel'] = skeleton(query)
    entry['sort'] = skeleton(orderby)
    return True
Пример #10
0
def parse_query(entry):
    # {'responseLength': 20,
    #  'millis': 40,
    #  'ts': datetime.datetime(2011, 9, 19, 15, 8, 1, 976000),
    #  'scanAndOrder': True,
    #  'client': '127.0.0.1',
    #  'user': '',
    #  'query': {'$orderby': {'date': 1},
    #            '$query': {'processing.status': 'new'}},
    #  'ns': 'www.formcapture',
    #  'nscanned': 12133,
    #  'op': 'query'}

    query = entry.get('query', {}).get('$query', None)
    if query is None:
        query = entry.get('query', {})

    orderby = entry.get('query', {}).get('$orderby', None)
    if orderby is None:
        orderby = {}

    entry['skel'] = skeleton(query)
    entry['sort'] = skeleton(orderby)
    return True
Пример #11
0
    def test_skeleton_embedded_objects(self):
        self.assertEqual(s.skeleton({'a': {'b': 1}}), '{a:{b}}')
        self.assertEqual(s.skeleton({'a': {'b': 1}, 'c': 1}), '{a:{b},c}')
        self.assertEqual(s.skeleton({
            'a': {
                'b': 1,
                'd': 2
            },
            'c': 1
        }), '{a:{b,d},c}')

        # make sure top-level SON objects work
        self.assertEqual(s.skeleton(SON([('a', 1)])), '{a}')

        # and embedded SON objects
        self.assertEqual(s.skeleton({'a': SON([('b', 1)])}), '{a:{b}}')
        self.assertEqual(s.skeleton({
            'a': SON([('b', 1)]),
            'c': 1
        }), '{a:{b},c}')
        self.assertEqual(s.skeleton({
            'a': SON([('b', 1), ('d', 2)]),
            'c': 1
        }), '{a:{b,d},c}')
Пример #12
0
 def test_skeleton_types(self):
     # ensure that all valid BSON types can be
     # skeleton'd; lists and subobjects are
     # tested in other functions and omitted here
     self.assertEqual(s.skeleton({'a': 1}), '{a}')
     self.assertEqual(s.skeleton({'a': 1L}), '{a}')
     self.assertEqual(s.skeleton({'a': 1.0}), '{a}')
     self.assertEqual(s.skeleton({'a': '1'}), '{a}')
     self.assertEqual(s.skeleton({'a': u'1'}), '{a}')
     self.assertEqual(s.skeleton({'a': True}), '{a}')
     self.assertEqual(s.skeleton({'a': datetime.now()}), '{a}')
     self.assertEqual(
         s.skeleton({'a': ObjectId('000000000000000000000000')}), '{a}')
     self.assertEqual(s.skeleton({'a': re.compile(r'^$')}), '{a}')
     self.assertEqual(s.skeleton({'a': Code('function(){}')}), '{a}')
     self.assertEqual(s.skeleton({'a': None}), '{a}')
     self.assertEqual(s.skeleton({'a': Binary('123456')}), '{a}')
     self.assertEqual(s.skeleton({'a': DBRef('coll', 123)}), '{a}')
Пример #13
0
 def test_skeleton_types(self):
     # ensure that all valid BSON types can be
     # skeleton'd; lists and subobjects are
     # tested in other functions and omitted here
     self.assertEqual(s.skeleton({'a': 1}), '{a}')
     self.assertEqual(s.skeleton({'a': 1L}), '{a}')
     self.assertEqual(s.skeleton({'a': 1.0}), '{a}')
     self.assertEqual(s.skeleton({'a': '1'}), '{a}')
     self.assertEqual(s.skeleton({'a': u'1'}), '{a}')
     self.assertEqual(s.skeleton({'a': True}), '{a}')
     self.assertEqual(s.skeleton({'a': datetime.now()}), '{a}')
     self.assertEqual(s.skeleton({'a': ObjectId('000000000000000000000000')}), '{a}')
     self.assertEqual(s.skeleton({'a': re.compile(r'^$')}), '{a}')
     self.assertEqual(s.skeleton({'a': Code('function(){}')}), '{a}')
     self.assertEqual(s.skeleton({'a': None}), '{a}')
     self.assertEqual(s.skeleton({'a': Binary('123456')}), '{a}')
     self.assertEqual(s.skeleton({'a': DBRef('coll', 123)}), '{a}')
Пример #14
0
 def test_skeleton_simple(self):
     self.assertEqual(s.skeleton({'hello': 'world'}), '{hello}')
     self.assertEqual(s.skeleton({'hello': 'world', 'foo': 'bar'}), '{foo,hello}')
     self.assertEqual(s.skeleton({}), '{}')