[Python-checkins] r58434 - in python/trunk/Lib/bsddb: dbshelve.py test/test_dbshelve.py

Neal Norwitz nnorwitz at gmail.com
Sat Oct 13 07:55:04 CEST 2007


Gregory,

After this change, one of the buildbots had a failure when checking gc.garbage:

http://python.org/dev/buildbot/trunk/x86%20XP-3%20trunk/builds/317/step-test/0

It could be the change just triggered an existing issue with a new test.

Also, another buildbot failed with this message:

test test_bsddb3 failed -- errors occurred; run in verbose mode for details
Warning: test created 1 uncollectable object(s).

http://python.org/dev/buildbot/trunk/amd64%20gentoo%20trunk/builds/2249/step-test/0

Could you take a look?

Thanks,
n
--
On Oct 12, 2007 11:44 AM, gregory.p.smith <python-checkins at python.org> wrote:
> Author: gregory.p.smith
> Date: Fri Oct 12 20:44:06 2007
> New Revision: 58434
>
> Modified:
>    python/trunk/Lib/bsddb/dbshelve.py
>    python/trunk/Lib/bsddb/test/test_dbshelve.py
> Log:
> Fixes http://bugs.python.org/issue1233 - bsddb.dbshelve.DBShelf.append
> was useless due to inverted logic.  Also adds a test case for RECNO dbs
> to test_dbshelve.
>
>
> Modified: python/trunk/Lib/bsddb/dbshelve.py
> ==============================================================================
> --- python/trunk/Lib/bsddb/dbshelve.py  (original)
> +++ python/trunk/Lib/bsddb/dbshelve.py  Fri Oct 12 20:44:06 2007
> @@ -84,6 +84,9 @@
>
>  #---------------------------------------------------------------------------
>
> +class DBShelveError(db.DBError): pass
> +
> +
>  class DBShelf(DictMixin):
>      """A shelf to hold pickled objects, built upon a bsddb DB object.  It
>      automatically pickles/unpickles data objects going to/from the DB.
> @@ -162,10 +165,10 @@
>          return self.db.append(data, txn)
>
>      def append(self, value, txn=None):
> -        if self.get_type() != db.DB_RECNO:
> +        if self.get_type() == db.DB_RECNO:
>              self.append = self.__append
>              return self.append(value, txn=txn)
> -        raise db.DBError, "append() only supported when dbshelve opened with filetype=dbshelve.db.DB_RECNO"
> +        raise DBShelveError, "append() only supported when dbshelve opened with filetype=dbshelve.db.DB_RECNO"
>
>
>      def associate(self, secondaryDB, callback, flags=0):
>
> Modified: python/trunk/Lib/bsddb/test/test_dbshelve.py
> ==============================================================================
> --- python/trunk/Lib/bsddb/test/test_dbshelve.py        (original)
> +++ python/trunk/Lib/bsddb/test/test_dbshelve.py        Fri Oct 12 20:44:06 2007
> @@ -41,17 +41,22 @@
>          except os.error:
>              pass
>
> +    def mk(self, key):
> +        """Turn key into an appropriate key type for this db"""
> +        # override in child class for RECNO
> +        return key
> +
>      def populateDB(self, d):
>          for x in string.letters:
> -            d['S' + x] = 10 * x           # add a string
> -            d['I' + x] = ord(x)           # add an integer
> -            d['L' + x] = [x] * 10         # add a list
> +            d[self.mk('S' + x)] = 10 * x           # add a string
> +            d[self.mk('I' + x)] = ord(x)           # add an integer
> +            d[self.mk('L' + x)] = [x] * 10         # add a list
>
>              inst = DataClass()            # add an instance
>              inst.S = 10 * x
>              inst.I = ord(x)
>              inst.L = [x] * 10
> -            d['O' + x] = inst
> +            d[self.mk('O' + x)] = inst
>
>
>      # overridable in derived classes to affect how the shelf is created/opened
> @@ -85,14 +90,14 @@
>              print "keys:", k
>              print "stats:", s
>
> -        assert 0 == d.has_key('bad key')
> -        assert 1 == d.has_key('IA')
> -        assert 1 == d.has_key('OA')
> -
> -        d.delete('IA')
> -        del d['OA']
> -        assert 0 == d.has_key('IA')
> -        assert 0 == d.has_key('OA')
> +        assert 0 == d.has_key(self.mk('bad key'))
> +        assert 1 == d.has_key(self.mk('IA'))
> +        assert 1 == d.has_key(self.mk('OA'))
> +
> +        d.delete(self.mk('IA'))
> +        del d[self.mk('OA')]
> +        assert 0 == d.has_key(self.mk('IA'))
> +        assert 0 == d.has_key(self.mk('OA'))
>          assert len(d) == l-2
>
>          values = []
> @@ -115,18 +120,18 @@
>          for key, value in items:
>              self.checkrec(key, value)
>
> -        assert d.get('bad key') == None
> -        assert d.get('bad key', None) == None
> -        assert d.get('bad key', 'a string') == 'a string'
> -        assert d.get('bad key', [1, 2, 3]) == [1, 2, 3]
> +        assert d.get(self.mk('bad key')) == None
> +        assert d.get(self.mk('bad key'), None) == None
> +        assert d.get(self.mk('bad key'), 'a string') == 'a string'
> +        assert d.get(self.mk('bad key'), [1, 2, 3]) == [1, 2, 3]
>
>          d.set_get_returns_none(0)
> -        self.assertRaises(db.DBNotFoundError, d.get, 'bad key')
> +        self.assertRaises(db.DBNotFoundError, d.get, self.mk('bad key'))
>          d.set_get_returns_none(1)
>
> -        d.put('new key', 'new data')
> -        assert d.get('new key') == 'new data'
> -        assert d['new key'] == 'new data'
> +        d.put(self.mk('new key'), 'new data')
> +        assert d.get(self.mk('new key')) == 'new data'
> +        assert d[self.mk('new key')] == 'new data'
>
>
>
> @@ -165,14 +170,24 @@
>
>          assert count == len(d)
>
> -        c.set('SS')
> +        c.set(self.mk('SS'))
>          key, value = c.current()
>          self.checkrec(key, value)
>          del c
>
>
> +    def test03_append(self):
> +        # NOTE: this is overridden in RECNO subclass, don't change its name.
> +        if verbose:
> +            print '\n', '-=' * 30
> +            print "Running %s.test03_append..." % self.__class__.__name__
> +
> +        self.assertRaises(dbshelve.DBShelveError,
> +                          self.d.append, 'unit test was here')
> +
>
>      def checkrec(self, key, value):
> +        # override this in a subclass if the key type is different
>          x = key[1]
>          if key[0] == 'S':
>              assert type(value) == StringType
> @@ -281,7 +296,43 @@
>
>
>  #----------------------------------------------------------------------
> -# TODO:  Add test cases for a DBShelf in a RECNO DB.
> +# test cases for a DBShelf in a RECNO DB.
> +
> +class RecNoShelveTestCase(BasicShelveTestCase):
> +    dbtype = db.DB_RECNO
> +    dbflags = db.DB_CREATE
> +
> +    def setUp(self):
> +        BasicShelveTestCase.setUp(self)
> +
> +        # pool to assign integer key values out of
> +        self.key_pool = list(range(1, 5000))
> +        self.key_map = {}     # map string keys to the number we gave them
> +        self.intkey_map = {}  # reverse map of above
> +
> +    def mk(self, key):
> +        if key not in self.key_map:
> +            self.key_map[key] = self.key_pool.pop(0)
> +            self.intkey_map[self.key_map[key]] = key
> +        return self.key_map[key]
> +
> +    def checkrec(self, intkey, value):
> +        key = self.intkey_map[intkey]
> +        BasicShelveTestCase.checkrec(self, key, value)
> +
> +    def test03_append(self):
> +        if verbose:
> +            print '\n', '-=' * 30
> +            print "Running %s.test03_append..." % self.__class__.__name__
> +
> +        self.d[1] = 'spam'
> +        self.d[5] = 'eggs'
> +        self.assertEqual(6, self.d.append('spam'))
> +        self.assertEqual(7, self.d.append('baked beans'))
> +        self.assertEqual('spam', self.d.get(6))
> +        self.assertEqual('spam', self.d.get(1))
> +        self.assertEqual('baked beans', self.d.get(7))
> +        self.assertEqual('eggs', self.d.get(5))
>
>
>  #----------------------------------------------------------------------
> @@ -298,6 +349,7 @@
>      suite.addTest(unittest.makeSuite(EnvHashShelveTestCase))
>      suite.addTest(unittest.makeSuite(EnvThreadBTreeShelveTestCase))
>      suite.addTest(unittest.makeSuite(EnvThreadHashShelveTestCase))
> +    suite.addTest(unittest.makeSuite(RecNoShelveTestCase))
>
>      return suite
>
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>


More information about the Python-checkins mailing list