[Checkins] SVN: BTrees/branches/py3k/ Document / enforce that fsBTree deals in bytes, not text.

Tres Seaver cvs-admin at zope.org
Fri Dec 14 22:37:21 UTC 2012


Log message for revision 128673:
  Document / enforce that fsBTree deals in bytes, not text.

Changed:
  _U  BTrees/branches/py3k/
  U   BTrees/branches/py3k/BTrees/_base.py
  U   BTrees/branches/py3k/BTrees/_compat.py
  U   BTrees/branches/py3k/BTrees/_fsBTree.c
  U   BTrees/branches/py3k/BTrees/fsBTree.py
  U   BTrees/branches/py3k/BTrees/tests/test__base.py
  U   BTrees/branches/py3k/BTrees/tests/test_fsBTree.py

-=-
Modified: BTrees/branches/py3k/BTrees/_base.py
===================================================================
--- BTrees/branches/py3k/BTrees/_base.py	2012-12-14 22:37:20 UTC (rev 128672)
+++ BTrees/branches/py3k/BTrees/_base.py	2012-12-14 22:37:21 UTC (rev 128673)
@@ -1420,10 +1420,10 @@
 
     return int(v)
 
-def to_str(l):
+def to_bytes(l):
     def to(self, v):
-        if not (isinstance(v, str) and len(v) == l):
-            raise TypeError("%s-character string expected" % l)
+        if not (isinstance(v, bytes) and len(v) == l):
+            raise TypeError("%s-byte array expected" % l)
         return v
     return to
 

Modified: BTrees/branches/py3k/BTrees/_compat.py
===================================================================
--- BTrees/branches/py3k/BTrees/_compat.py	2012-12-14 22:37:20 UTC (rev 128672)
+++ BTrees/branches/py3k/BTrees/_compat.py	2012-12-14 22:37:21 UTC (rev 128673)
@@ -26,6 +26,8 @@
     cmp = cmp
 
     _bytes = str
+    def _ascii(x):
+        return bytes(x)
 
     def _u(s, encoding='unicode_escape'):
         return unicode(s, encoding)
@@ -45,6 +47,8 @@
         return (x > y) - (y > x)
 
     _bytes = bytes
+    def _ascii(x):
+        return bytes(x, 'ascii')
 
     def _u(s, encoding=None):
         if encoding is None:

Modified: BTrees/branches/py3k/BTrees/_fsBTree.c
===================================================================
--- BTrees/branches/py3k/BTrees/_fsBTree.c	2012-12-14 22:37:20 UTC (rev 128672)
+++ BTrees/branches/py3k/BTrees/_fsBTree.c	2012-12-14 22:37:21 UTC (rev 128673)
@@ -71,15 +71,19 @@
 
 #include "Python.h"
 
-static PyObject *bucket_toString(PyObject *self);
+static PyObject *bucket_toBytes(PyObject *self);
 
-static PyObject *bucket_fromString(PyObject *self, PyObject *state);
+static PyObject *bucket_fromBytes(PyObject *self, PyObject *state);
 
 #define EXTRA_BUCKET_METHODS \
-    {"toString", (PyCFunction) bucket_toString,	METH_NOARGS, \
-     "toString() -- Return the state as a string"}, \
-    {"fromString", (PyCFunction) bucket_fromString,	METH_O, \
-     "fromString(s) -- Set the state of the object from a string"}, \
+    {"toBytes", (PyCFunction) bucket_toBytes,	METH_NOARGS, \
+     "toBytes() -- Return the state as a bytes array"}, \
+    {"fromBytes", (PyCFunction) bucket_fromBytes,	METH_O, \
+     "fromSBytes(s) -- Set the state of the object from a bytes array"}, \
+    {"toString", (PyCFunction) bucket_toBytes,	METH_NOARGS, \
+     "toString() -- Deprecated alias for 'toBytes'"}, \
+    {"fromString", (PyCFunction) bucket_fromBytes,	METH_O, \
+     "fromString(s) -- Deprecated alias for 'fromBytes'"}, \
 
 #ifdef PY3K
 #define INITMODULE PyInit__fsBTree
@@ -89,7 +93,7 @@
 #include "BTreeModuleTemplate.c"
 
 static PyObject *
-bucket_toString(PyObject *oself)
+bucket_toBytes(PyObject *oself)
 {
   Bucket *self = (Bucket *)oself;
   PyObject *items = NULL;
@@ -115,7 +119,7 @@
 }
 
 static PyObject *
-bucket_fromString(PyObject *oself, PyObject *state)
+bucket_fromBytes(PyObject *oself, PyObject *state)
 {
   Bucket *self = (Bucket *)oself;
   int len;

Modified: BTrees/branches/py3k/BTrees/fsBTree.py
===================================================================
--- BTrees/branches/py3k/BTrees/fsBTree.py	2012-12-14 22:37:20 UTC (rev 128672)
+++ BTrees/branches/py3k/BTrees/fsBTree.py	2012-12-14 22:37:21 UTC (rev 128673)
@@ -14,6 +14,7 @@
 
 # fsBTrees are data structures used for ZODB FileStorage.  They are not
 # expected to be "public" excpect to FileStorage.
+# Each item in an fsBTree maps a two-byte key to a six-byte value.
 
 __all__ = ('Bucket', 'Set', 'BTree', 'TreeSet',
            'fsBucket', 'fsSet', 'fsBTree', 'fsTreeSet',
@@ -31,14 +32,14 @@
 from ._base import difference as _difference
 from ._base import intersection as _intersection
 from ._base import set_operation as _set_operation
-from ._base import to_str as _to_str
+from ._base import to_bytes as _to_bytes
 from ._base import union as _union
 
 _BUCKET_SIZE = 500
 _TREE_SIZE = 500
 using64bits = False
-_to_key = _to_str(2)
-_to_value = _to_str(6)
+_to_key = _to_bytes(2)
+_to_value = _to_bytes(6)
 
 
 class fsBucketPy(Bucket):
@@ -47,7 +48,7 @@
     _to_value = _to_value
 
     def toString(self):
-        return ''.join(self._keys) + ''.join(self._values)
+        return b''.join(self._keys) + b''.join(self._values)
 
     def fromString(self, v):
         length = len(v)

Modified: BTrees/branches/py3k/BTrees/tests/test__base.py
===================================================================
--- BTrees/branches/py3k/BTrees/tests/test__base.py	2012-12-14 22:37:20 UTC (rev 128672)
+++ BTrees/branches/py3k/BTrees/tests/test__base.py	2012-12-14 22:37:21 UTC (rev 128673)
@@ -2909,18 +2909,18 @@
         faux_self = object()
         self.assertRaises(TypeError, to_long, faux_self, ())
 
-    def test_to_str_w_ok(self):
-        from BTrees._base import to_str
+    def test_to_bytes_w_ok(self):
+        from BTrees._base import to_bytes
         faux_self = object()
-        conv = to_str(3)
-        self.assertEqual(conv(faux_self, 'abc'), 'abc')
+        conv = to_bytes(3)
+        self.assertEqual(conv(faux_self, b'abc'), b'abc')
 
-    def test_to_str_w_invalid_length(self):
-        from BTrees._base import to_str
+    def test_to_bytes_w_invalid_length(self):
+        from BTrees._base import to_bytes
         faux_self = object()
-        conv = to_str(3)
-        self.assertRaises(TypeError, conv, faux_self, 'ab')
-        self.assertRaises(TypeError, conv, faux_self, 'abcd')
+        conv = to_bytes(3)
+        self.assertRaises(TypeError, conv, faux_self, b'ab')
+        self.assertRaises(TypeError, conv, faux_self, b'abcd')
 
     def test_MERGE(self):
         from BTrees._base import MERGE

Modified: BTrees/branches/py3k/BTrees/tests/test_fsBTree.py
===================================================================
--- BTrees/branches/py3k/BTrees/tests/test_fsBTree.py	2012-12-14 22:37:20 UTC (rev 128672)
+++ BTrees/branches/py3k/BTrees/tests/test_fsBTree.py	2012-12-14 22:37:21 UTC (rev 128673)
@@ -19,24 +19,28 @@
     def _makeOne(self, *args, **kw):
         return self._getTargetClass()(*args, **kw)
 
+    def _makeBytesItems(self):
+        from .._compat import _ascii
+        return[(_ascii(c*2), _ascii(c*6)) for c in 'abcdef']
+
     def test_toString(self):
-        bucket = self._makeOne([(c*2, c*6) for c in 'abcdef'])
+        bucket = self._makeOne(self._makeBytesItems())
         self.assertEqual(bucket.toString(),
-                         'aabbccddeeffaaaaaabbbbbbccccccddddddeeeeeeffffff')
+                         b'aabbccddeeffaaaaaabbbbbbccccccddddddeeeeeeffffff')
 
     def test_fromString(self):
-        before = self._makeOne([(c*2, c*6) for c in 'abcdef'])
+        before = self._makeOne(self._makeBytesItems())
         after = before.fromString(before.toString())
         self.assertEqual(before.__getstate__(), after.__getstate__())
 
     def test_fromString_empty(self):
-        before = self._makeOne([(c*2, c*6) for c in 'abcdef'])
-        after = before.fromString('')
+        before = self._makeOne(self._makeBytesItems())
+        after = before.fromString(b'')
         self.assertEqual(after.__getstate__(), ((),))
 
-    def test_fromString_invalid(self):
-        bucket = self._makeOne([(c*2, c*6) for c in 'abcdef'])
-        self.assertRaises(ValueError, bucket.fromString, 'xxx')
+    def test_fromString_invalid_length(self):
+        bucket = self._makeOne(self._makeBytesItems())
+        self.assertRaises(ValueError, bucket.fromString, b'xxx')
 
 
 class fsBucketTests(unittest.TestCase, fsBucketBase):



More information about the checkins mailing list