[Checkins] SVN: BTrees/branches/pure_python/ Reorder to test sets before mappings.
Tres Seaver
cvs-admin at zope.org
Wed Nov 14 21:29:36 UTC 2012
Log message for revision 128289:
Reorder to test sets before mappings.
Changed:
_U BTrees/branches/pure_python/
U BTrees/branches/pure_python/BTrees/_base.py
U BTrees/branches/pure_python/BTrees/tests/test__base.py
-=-
Modified: BTrees/branches/pure_python/BTrees/_base.py
===================================================================
--- BTrees/branches/pure_python/BTrees/_base.py 2012-11-14 21:29:35 UTC (rev 128288)
+++ BTrees/branches/pure_python/BTrees/_base.py 2012-11-14 21:29:36 UTC (rev 128289)
@@ -183,39 +183,22 @@
return self
-class _MappingBase(_Base):
+class _SetBase(_Base):
- def setdefault(self, key, value):
- return self._set(self._to_key(key), self._to_value(value), True)[1]
+ #_next = None
+ def add(self, key):
+ return self._set(self._to_key(key))[0]
- def pop(self, key, default=_marker):
- try:
- return self._del(self._to_key(key))[1]
- except KeyError:
- if default is _marker:
- raise
- return default
+ insert = add
+ def remove(self, key):
+ self._del(self._to_key(key))
+
def update(self, items):
- if hasattr(items, 'iteritems'):
- items = items.iteritems()
- elif hasattr(items, 'items'):
- items = items.items()
-
- set = self.__setitem__
+ add = self.add
for i in items:
- set(*i)
+ add(i)
- def __setitem__(self, key, value):
- # Enforce test that key has non-default comparison.
- if ( getattr(key, '__lt__', None) is None and
- getattr(key, '__cmp__', None) is None):
- raise TypeError("Can't use default __cmp__")
- self._set(self._to_key(key), self._to_value(value))
-
- def __delitem__(self, key):
- self._del(self._to_key(key))
-
def _p_resolveConflict(self, s_old, s_com, s_new):
b_old = self.__class__()
if s_old is not None:
@@ -245,26 +228,20 @@
def merge_output(it):
result._keys.append(it.key)
- result._values.append(it.value)
it.advance()
while i_old.active and i_com.active and i_new.active:
cmp12 = cmp(i_old.key, i_com.key)
cmp13 = cmp(i_old.key, i_new.key)
- if cmp12==0:
- if cmp13==0:
- if i_com.value == i_old.value:
- result[i_old.key] = i_new.value
- elif i_new.value == i_old.value:
- result[i_old.key] = i_com.value
- else:
- raise merge_error(1)
+ if cmp12 == 0:
+ if cmp13 == 0:
+ result.add(i_old.key)
i_old.advance()
i_com.advance()
i_new.advance()
- elif (cmp13 > 0): # insert in new
+ elif cmp13 > 0: # insert in new
merge_output(i_new)
- elif i_old.value == i_com.value: # deleted new
+ else: # deleted new
if i_new.position == 1:
# Deleted the first item. This will modify the
# parent node, so we don't know if merging will be
@@ -272,12 +249,10 @@
raise merge_error(13)
i_old.advance()
i_com.advance()
- else:
- raise merge_error(2)
elif cmp13 == 0:
if cmp12 > 0: # insert committed
merge_output(i_com)
- elif i_old.value == i_new.value: # delete committed
+ else: # delete committed
if i_com.position == 1:
# Deleted the first item. This will modify the
# parent node, so we don't know if merging will be
@@ -285,8 +260,6 @@
raise merge_error(13)
i_old.advance()
i_new.advance()
- else:
- raise merge_error(3)
else: # both keys changed
cmp23 = cmp(i_com.key, i_new.key)
if cmp23 == 0:
@@ -314,7 +287,7 @@
cmp12 = cmp(i_old.key, i_com.key)
if cmp12 > 0: # insert committed
merge_output(i_com)
- elif cmp12 == 0 and (i_old.value == i_com.value): # del in new
+ elif cmp12 == 0: # del in new
i_old.advance()
i_com.advance()
else: # dueling deletes or delete and change
@@ -325,8 +298,7 @@
cmp13 = cmp(i_old.key, i_new.key)
if cmp13 > 0: # insert new
merge_output(i_new)
- elif cmp13 == 0 and (i_old.value == i_new.value):
- # deleted in committed
+ elif cmp13 == 0: # deleted in committed
i_old.advance()
i_new.advance()
else: # dueling deletes or delete and change
@@ -350,22 +322,39 @@
return result.__getstate__()
-class _SetBase(_Base):
+class _MappingBase(_Base):
- #_next = None
- def add(self, key):
- return self._set(self._to_key(key))[0]
+ def setdefault(self, key, value):
+ return self._set(self._to_key(key), self._to_value(value), True)[1]
- insert = add
+ def pop(self, key, default=_marker):
+ try:
+ return self._del(self._to_key(key))[1]
+ except KeyError:
+ if default is _marker:
+ raise
+ return default
- def remove(self, key):
- self._del(self._to_key(key))
+ def update(self, items):
+ if hasattr(items, 'iteritems'):
+ items = items.iteritems()
+ elif hasattr(items, 'items'):
+ items = items.items()
- def update(self, items):
- add = self.add
+ set = self.__setitem__
for i in items:
- add(i)
+ set(*i)
+ def __setitem__(self, key, value):
+ # Enforce test that key has non-default comparison.
+ if ( getattr(key, '__lt__', None) is None and
+ getattr(key, '__cmp__', None) is None):
+ raise TypeError("Can't use default __cmp__")
+ self._set(self._to_key(key), self._to_value(value))
+
+ def __delitem__(self, key):
+ self._del(self._to_key(key))
+
def _p_resolveConflict(self, s_old, s_com, s_new):
b_old = self.__class__()
if s_old is not None:
@@ -395,20 +384,26 @@
def merge_output(it):
result._keys.append(it.key)
+ result._values.append(it.value)
it.advance()
while i_old.active and i_com.active and i_new.active:
cmp12 = cmp(i_old.key, i_com.key)
cmp13 = cmp(i_old.key, i_new.key)
- if cmp12 == 0:
- if cmp13 == 0:
- result.add(i_old.key)
+ if cmp12==0:
+ if cmp13==0:
+ if i_com.value == i_old.value:
+ result[i_old.key] = i_new.value
+ elif i_new.value == i_old.value:
+ result[i_old.key] = i_com.value
+ else:
+ raise merge_error(1)
i_old.advance()
i_com.advance()
i_new.advance()
- elif cmp13 > 0: # insert in new
+ elif (cmp13 > 0): # insert in new
merge_output(i_new)
- else: # deleted new
+ elif i_old.value == i_com.value: # deleted new
if i_new.position == 1:
# Deleted the first item. This will modify the
# parent node, so we don't know if merging will be
@@ -416,10 +411,12 @@
raise merge_error(13)
i_old.advance()
i_com.advance()
+ else:
+ raise merge_error(2)
elif cmp13 == 0:
if cmp12 > 0: # insert committed
merge_output(i_com)
- else: # delete committed
+ elif i_old.value == i_new.value: # delete committed
if i_com.position == 1:
# Deleted the first item. This will modify the
# parent node, so we don't know if merging will be
@@ -427,6 +424,8 @@
raise merge_error(13)
i_old.advance()
i_new.advance()
+ else:
+ raise merge_error(3)
else: # both keys changed
cmp23 = cmp(i_com.key, i_new.key)
if cmp23 == 0:
@@ -454,7 +453,7 @@
cmp12 = cmp(i_old.key, i_com.key)
if cmp12 > 0: # insert committed
merge_output(i_com)
- elif cmp12 == 0: # del in new
+ elif cmp12 == 0 and (i_old.value == i_com.value): # del in new
i_old.advance()
i_com.advance()
else: # dueling deletes or delete and change
@@ -465,7 +464,8 @@
cmp13 = cmp(i_old.key, i_new.key)
if cmp13 > 0: # insert new
merge_output(i_new)
- elif cmp13 == 0: # deleted in committed
+ elif cmp13 == 0 and (i_old.value == i_new.value):
+ # deleted in committed
i_old.advance()
i_new.advance()
else: # dueling deletes or delete and change
Modified: BTrees/branches/pure_python/BTrees/tests/test__base.py
===================================================================
--- BTrees/branches/pure_python/BTrees/tests/test__base.py 2012-11-14 21:29:35 UTC (rev 128288)
+++ BTrees/branches/pure_python/BTrees/tests/test__base.py 2012-11-14 21:29:36 UTC (rev 128289)
@@ -363,58 +363,15 @@
self.assertTrue(key in bucket)
-def _assertRaises(self, e_type, checked, *args, **kw):
- try:
- checked(*args, **kw)
- except e_type as e:
- return e
- self.fail("Didn't raise: %s" % e_type.__name__)
+class Test__SetIteration(unittest.TestCase):
-class Test__MappingBase(unittest.TestCase):
-
assertRaises = _assertRaises
def _getTargetClass(self):
- from .._base import _MappingBase
- return _MappingBase
+ from .._base import _SetIteration
+ return _SetIteration
- def _makeOne(self):
- class _TestMapping(self._getTargetClass()):
- _values = None
- def __setstate__(self, state):
- state, self._next = state
- self._keys = []
- self._values = []
- for i in range(len(state) // 2):
- self._keys.append(state[i])
- self._values.append(state[i+1])
- def clear(self):
- self._keys, self._values, self._next = [], [], None
- def iteritems(self):
- return iter(zip(self._keys, self._values))
- return _TestMapping()
- def test__p_resolveConflict_delete_first_new(self):
- from ..Interfaces import BTreesConflictError
- bucket = self._makeOne()
- s_old = (['a', 0, 'b', 1], None)
- s_com = (['a', 1, 'b', 2, 'c', 3], None)
- s_new = (['b', 4], None)
- e = self.assertRaises(BTreesConflictError,
- bucket._p_resolveConflict, s_old, s_com, s_new)
- self.assertEqual(e.reason, 2)
-
- def test__p_resolveConflict_delete_first_committed(self):
- from ..Interfaces import BTreesConflictError
- bucket = self._makeOne()
- s_old = (['a', 0, 'b', 1], None)
- s_com = (['b', 4], None)
- s_new = (['a', 1, 'b', 2, 'c', 3], None)
- e = self.assertRaises(BTreesConflictError,
- bucket._p_resolveConflict, s_old, s_com, s_new)
- self.assertEqual(e.reason, 3)
-
-
class Test__SetBase(unittest.TestCase):
assertRaises = _assertRaises
@@ -498,6 +455,51 @@
self.assertEqual(e.reason, 13)
+class Test__MappingBase(unittest.TestCase):
+
+ assertRaises = _assertRaises
+
+ def _getTargetClass(self):
+ from .._base import _MappingBase
+ return _MappingBase
+
+ def _makeOne(self):
+ class _TestMapping(self._getTargetClass()):
+ _values = None
+ def __setstate__(self, state):
+ state, self._next = state
+ self._keys = []
+ self._values = []
+ for i in range(len(state) // 2):
+ self._keys.append(state[i])
+ self._values.append(state[i+1])
+ def clear(self):
+ self._keys, self._values, self._next = [], [], None
+ def iteritems(self):
+ return iter(zip(self._keys, self._values))
+ return _TestMapping()
+
+ def test__p_resolveConflict_delete_first_new(self):
+ from ..Interfaces import BTreesConflictError
+ bucket = self._makeOne()
+ s_old = (['a', 0, 'b', 1], None)
+ s_com = (['a', 1, 'b', 2, 'c', 3], None)
+ s_new = (['b', 4], None)
+ e = self.assertRaises(BTreesConflictError,
+ bucket._p_resolveConflict, s_old, s_com, s_new)
+ self.assertEqual(e.reason, 2)
+
+ def test__p_resolveConflict_delete_first_committed(self):
+ from ..Interfaces import BTreesConflictError
+ bucket = self._makeOne()
+ s_old = (['a', 0, 'b', 1], None)
+ s_com = (['b', 4], None)
+ s_new = (['a', 1, 'b', 2, 'c', 3], None)
+ e = self.assertRaises(BTreesConflictError,
+ bucket._p_resolveConflict, s_old, s_com, s_new)
+ self.assertEqual(e.reason, 3)
+
+
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(Test_BucketBase),
More information about the checkins
mailing list