[pypy-svn] r66663 - in pypy/branch/pyjitpl5/pypy/lib: . app_test

arigo at codespeak.net arigo at codespeak.net
Wed Jul 29 14:40:55 CEST 2009


Author: arigo
Date: Wed Jul 29 14:40:54 2009
New Revision: 66663

Modified:
   pypy/branch/pyjitpl5/pypy/lib/app_test/test_dbm_extra.py
   pypy/branch/pyjitpl5/pypy/lib/dbm.py
Log:
Fix fix fix in dbm.py, with tests, mostly related to detecting
exceptional cases.


Modified: pypy/branch/pyjitpl5/pypy/lib/app_test/test_dbm_extra.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/lib/app_test/test_dbm_extra.py	(original)
+++ pypy/branch/pyjitpl5/pypy/lib/app_test/test_dbm_extra.py	Wed Jul 29 14:40:54 2009
@@ -9,9 +9,24 @@
     assert x is None
     d.close()
 
-def test_set_nonstring():
-    path = str(udir.join('test_dbm_extra.test_set_nonstring'))
+def test_delitem():
+    path = str(udir.join('test_dbm_extra.test_delitem'))
+    d = dbm.open(path, 'c')
+    py.test.raises(KeyError, "del d['xyz']")
+
+def test_nonstring():
+    path = str(udir.join('test_dbm_extra.test_nonstring'))
     d = dbm.open(path, 'c')
     py.test.raises(TypeError, "d[123] = 'xyz'")
     py.test.raises(TypeError, "d['xyz'] = 123")
+    py.test.raises(TypeError, "d['xyz'] = None")
+    py.test.raises(TypeError, "del d[123]")
+    py.test.raises(TypeError, "d[123]")
+    py.test.raises(TypeError, "123 in d")
+    py.test.raises(TypeError, "d.has_key(123)")
+    py.test.raises(TypeError, "d.setdefault(123, 'xyz')")
+    py.test.raises(TypeError, "d.setdefault('xyz', 123)")
+    py.test.raises(TypeError, "d.get(123)")
+    d.setdefault('xyz')
+    assert dict(d) == {'xyz': ''}
     d.close()

Modified: pypy/branch/pyjitpl5/pypy/lib/dbm.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/lib/dbm.py	(original)
+++ pypy/branch/pyjitpl5/pypy/lib/dbm.py	Wed Jul 29 14:40:54 2009
@@ -20,6 +20,8 @@
         self._aobj = dbmobj
 
     def close(self):
+        if not self._aobj:
+            raise error('DBM object has already been closed')
         getattr(lib, funcs['close'])(self._aobj)
         self._aobj = None
 
@@ -51,42 +53,29 @@
         return len(self.keys())
 
     def __getitem__(self, key):
-        assert isinstance(key, str)
         value = self.get(key)
         if value is None:
-            raise KeyError
+            raise KeyError(key)
         return value
 
     def __setitem__(self, key, value):
         if not self._aobj: 
             raise error('DBM object has already been closed')
-        if not isinstance(key, str):
-            raise TypeError("dbm mappings have string indices only")
-        if not isinstance(value, str):
-            raise TypeError("dbm mappings have string values only")
         dat = datum()
         dat.dptr = c_char_p(key)
         dat.dsize = c_int(len(key))
-        if value == None:
-            status = getattr(lib, funcs['delete'])(self._aobj, dat)
-            if status < 0:
-                getattr(lib, funcs['clearerr'])(self._aobj)
-                raise KeyError(key)
-        else:
-            if not isinstance(value, str):
-                raise TypeError("dbm mappings have string indices only")
-            data = datum()
-            data.dptr = c_char_p(value)
-            data.dsize = c_int(len(value))
-            status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_INSERT)
-            if status == 1:
-                status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_REPLACE)
+        data = datum()
+        data.dptr = c_char_p(value)
+        data.dsize = c_int(len(value))
+        status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_INSERT)
+        if status == 1:
+            status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_REPLACE)
         if getattr(lib, funcs['error'])(self._aobj):
             getattr(lib, funcs['clearerr'])(self._aobj)
             raise error("")
         return status
 
-    def setdefault(self, key, default=None):
+    def setdefault(self, key, default=''):
         if not self._aobj:
             raise error('DBM object has already been closed')
         dat = datum()
@@ -95,16 +84,14 @@
         k = getattr(lib, funcs['fetch'])(self._aobj, dat)
         if k.dptr:
             return k.dptr[:k.dsize]
-        if default:
-            data = datum()
-            data.dptr = c_char_p(default)
-            data.dsize = c_int(len(default))
-            status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_INSERT)
-            if status < 0:
-                getattr(lib, funcs['clearerr'])(self._aobj)
-                raise error("cannot add item to database")
-            return default
-        return None
+        data = datum()
+        data.dptr = c_char_p(default)
+        data.dsize = c_int(len(default))
+        status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_INSERT)
+        if status < 0:
+            getattr(lib, funcs['clearerr'])(self._aobj)
+            raise error("cannot add item to database")
+        return default
 
     def has_key(self, key):
         if not self._aobj:
@@ -118,12 +105,14 @@
         return False
 
     def __delitem__(self, key):
-        if not isinstance(key, str):
-            raise error("dbm mappings have string indices only")
+        if not self._aobj:
+            raise error('DBM object has already been closed')
         dat = datum()
         dat.dptr = c_char_p(key)
         dat.dsize = c_int(len(key))
-        getattr(lib, funcs['delete'])(self._aobj, dat)
+        status = getattr(lib, funcs['delete'])(self._aobj, dat)
+        if status < 0:
+            raise KeyError(key)
 
 ### initialization: Berkeley DB versus normal DB
 
@@ -160,7 +149,7 @@
 _init_func('fetch', restype=datum)
 _init_func('store', restype=c_int)
 _init_func('error')
-_init_func('delete')
+_init_func('delete', restype=c_int)
 
 lib.DBM_INSERT = 0
 lib.DBM_REPLACE = 1



More information about the Pypy-commit mailing list