Author: Philip Jenvey <[email protected]>
Branch: 
Changeset: r64271:32dd588a5e23
Date: 2013-05-17 16:41 -0700
http://bitbucket.org/pypy/pypy/changeset/32dd588a5e23/

Log:    add missing __sub__ to viewitems/keys and kill the set like methods
        from viewvalues which aren't supported

diff --git a/pypy/objspace/std/dictmultiobject.py 
b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -1273,6 +1273,14 @@
     def descr_len(self, space):
         return space.len(self.w_dict)
 
+class SetLikeDictView(object):
+    _mixin_ = True
+
+    def descr_sub(self, space, w_otherview):
+        w_set = space.call_function(space.w_set, self)
+        space.call_method(w_set, "difference_update", w_otherview)
+        return w_set
+
     def descr_and(self, space, w_otherview):
         w_set = space.call_function(space.w_set, self)
         space.call_method(w_set, "intersection_update", w_otherview)
@@ -1288,11 +1296,11 @@
         space.call_method(w_set, "symmetric_difference_update", w_otherview)
         return w_set
 
-class W_DictViewItemsObject(W_DictViewObject):
+class W_DictViewItemsObject(W_DictViewObject, SetLikeDictView):
     def descr_iter(self, space):
         return W_DictMultiIterItemsObject(space, self.w_dict.iteritems())
 
-class W_DictViewKeysObject(W_DictViewObject):
+class W_DictViewKeysObject(W_DictViewObject, SetLikeDictView):
     def descr_iter(self, space):
         return W_DictMultiIterKeysObject(space, self.w_dict.iterkeys())
 
@@ -1306,6 +1314,7 @@
     __eq__ = interp2app(W_DictViewItemsObject.descr_eq),
     __len__ = interp2app(W_DictViewItemsObject.descr_len),
     __iter__ = interp2app(W_DictViewItemsObject.descr_iter),
+    __sub__ = interp2app(W_DictViewItemsObject.descr_sub),
     __and__ = interp2app(W_DictViewItemsObject.descr_and),
     __or__ = interp2app(W_DictViewItemsObject.descr_or),
     __xor__ = interp2app(W_DictViewItemsObject.descr_xor)
@@ -1317,6 +1326,7 @@
     __eq__ = interp2app(W_DictViewKeysObject.descr_eq),
     __len__ = interp2app(W_DictViewKeysObject.descr_len),
     __iter__ = interp2app(W_DictViewKeysObject.descr_iter),
+    __sub__ = interp2app(W_DictViewKeysObject.descr_sub),
     __and__ = interp2app(W_DictViewKeysObject.descr_and),
     __or__ = interp2app(W_DictViewKeysObject.descr_or),
     __xor__ = interp2app(W_DictViewKeysObject.descr_xor)
@@ -1328,7 +1338,4 @@
     __eq__ = interp2app(W_DictViewValuesObject.descr_eq),
     __len__ = interp2app(W_DictViewValuesObject.descr_len),
     __iter__ = interp2app(W_DictViewValuesObject.descr_iter),
-    __and__ = interp2app(W_DictViewValuesObject.descr_and),
-    __or__ = interp2app(W_DictViewValuesObject.descr_or),
-    __xor__ = interp2app(W_DictViewValuesObject.descr_xor)
     )
diff --git a/pypy/objspace/std/test/test_dictmultiobject.py 
b/pypy/objspace/std/test/test_dictmultiobject.py
--- a/pypy/objspace/std/test/test_dictmultiobject.py
+++ b/pypy/objspace/std/test/test_dictmultiobject.py
@@ -774,6 +774,13 @@
         assert d1.viewkeys() ^ set(d2.viewkeys()) == set('ac')
         assert d1.viewkeys() ^ set(d3.viewkeys()) == set('abde')
 
+        assert d1.viewkeys() - d1.viewkeys() == set()
+        assert d1.viewkeys() - d2.viewkeys() == set('a')
+        assert d1.viewkeys() - d3.viewkeys() == set('ab')
+        assert d1.viewkeys() - set(d1.viewkeys()) == set()
+        assert d1.viewkeys() - set(d2.viewkeys()) == set('a')
+        assert d1.viewkeys() - set(d3.viewkeys()) == set('ab')
+
     def test_items_set_operations(self):
         d1 = {'a': 1, 'b': 2}
         d2 = {'a': 2, 'b': 2}
@@ -802,6 +809,10 @@
         assert (d1.viewitems() ^ d3.viewitems() ==
                 set([('a', 1), ('b', 2), ('d', 4), ('e', 5)]))
 
+        assert d1.viewitems() - d1.viewitems() == set()
+        assert d1.viewitems() - d2.viewitems() == set([('a', 1)])
+        assert d1.viewitems() - d3.viewitems() == set([('a', 1), ('b', 2)])
+
 
 class AppTestStrategies(object):
     def setup_class(cls):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to