Log message for revision 92151:
   - Add guards for 'all' and 'any', new in Python 2.5. Add support for 'key' 
keyword argument to 'max' and 'min' guards

Changed:
  U   Zope/branches/gsoc-python-2.5/lib/python/AccessControl/ZopeGuards.py
  U   
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/actual_python.py
  U   
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/testZopeGuards.py

-=-
Modified: Zope/branches/gsoc-python-2.5/lib/python/AccessControl/ZopeGuards.py
===================================================================
--- Zope/branches/gsoc-python-2.5/lib/python/AccessControl/ZopeGuards.py        
2008-10-13 19:27:54 UTC (rev 92150)
+++ Zope/branches/gsoc-python-2.5/lib/python/AccessControl/ZopeGuards.py        
2008-10-13 19:28:34 UTC (rev 92151)
@@ -237,18 +237,18 @@
         return reduce(f, guarded_iter(seq), initial)
 safe_builtins['reduce'] = guarded_reduce
 
-def guarded_max(item, *items):
+def guarded_max(item, *items, **kw):
     if items:
         item = [item]
         item.extend(items)
-    return max(guarded_iter(item))
+    return max(guarded_iter(item), **kw)
 safe_builtins['max'] = guarded_max
 
-def guarded_min(item, *items):
+def guarded_min(item, *items, **kw):
     if items:
         item = [item]
         item.extend(items)
-    return min(guarded_iter(item))
+    return min(guarded_iter(item), **kw)
 safe_builtins['min'] = guarded_min
 
 def guarded_map(f, *seqs):
@@ -366,6 +366,17 @@
 
 safe_builtins['apply'] = builtin_guarded_apply
 
+# Similar to min and reduce, use guarded_iter on the sequence being
+# tested and apply the original function.
+if sys.version_info >= (2, 5):
+    def guarded_any(seq):
+        return any(guarded_iter(seq))
+    safe_builtins['any'] = guarded_any
+
+    def guarded_all(seq):
+        return all(guarded_iter(seq))
+    safe_builtins['all'] = guarded_all
+
 # This metaclass supplies the security declarations that allow all
 # attributes of a class and its instances to be read and written.
 def _metaclass(name, bases, dict):

Modified: 
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/actual_python.py
===================================================================
--- 
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/actual_python.py   
    2008-10-13 19:27:54 UTC (rev 92150)
+++ 
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/actual_python.py   
    2008-10-13 19:28:34 UTC (rev 92151)
@@ -163,3 +163,14 @@
     x += 1
 f11()
 
+def f12():
+    assert all([True, True, True]) == True
+    assert all([True, False, True]) == False
+f12()
+
+def f13():
+    assert any([True, True, True]) == True
+    assert any([True, False, True]) == True
+    assert any([False, False, False]) == False
+f13()
+

Modified: 
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/testZopeGuards.py
===================================================================
--- 
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/testZopeGuards.py  
    2008-10-13 19:27:54 UTC (rev 92150)
+++ 
Zope/branches/gsoc-python-2.5/lib/python/AccessControl/tests/testZopeGuards.py  
    2008-10-13 19:28:34 UTC (rev 92151)
@@ -19,6 +19,7 @@
 """
 
 import os, sys
+import operator
 import unittest
 from zope.testing import doctest
 import ZODB
@@ -30,6 +31,9 @@
     get_iter, guarded_min, guarded_max, safe_builtins, guarded_enumerate, \
     guarded_sum, guarded_apply
 
+if sys.version_info >= (2, 5):
+    from AccessControl.ZopeGuards import guarded_any, guarded_all
+
 try:
     __file__
 except NameError:
@@ -236,11 +240,26 @@
 
 class TestBuiltinFunctionGuards(GuardTestCase):
 
+    if sys.version_info >= (2, 5):
+        def test_all_fails(self):
+            sm = SecurityManager(1) # rejects
+            old = self.setSecurityManager(sm)
+            self.assertRaises(Unauthorized, guarded_all, [True,True,False])
+            self.setSecurityManager(old)
+
+        def test_any_fails(self):
+            sm = SecurityManager(1) # rejects
+            old = self.setSecurityManager(sm)
+            self.assertRaises(Unauthorized, guarded_any, [True,True,False])
+            self.setSecurityManager(old)
+
     def test_min_fails(self):
         sm = SecurityManager(1) # rejects
         old = self.setSecurityManager(sm)
         self.assertRaises(Unauthorized, guarded_min, [1,2,3])
         self.assertRaises(Unauthorized, guarded_min, 1,2,3)
+        self.assertRaises(Unauthorized, guarded_min,
+                          [{'x':1},{'x':2}], operator.itemgetter('x'))
         self.setSecurityManager(old)
 
     def test_max_fails(self):
@@ -248,6 +267,8 @@
         old = self.setSecurityManager(sm)
         self.assertRaises(Unauthorized, guarded_max, [1,2,3])
         self.assertRaises(Unauthorized, guarded_max, 1,2,3)
+        self.assertRaises(Unauthorized, guarded_max, 
+                          [{'x':1},{'x':2}], operator.itemgetter('x'))
         self.setSecurityManager(old)
 
     def test_enumerate_fails(self):
@@ -263,11 +284,26 @@
         self.assertRaises(Unauthorized, guarded_sum, [1,2,3])
         self.setSecurityManager(old)
 
+    if sys.version_info >= (2, 5):
+        def test_all_succeeds(self):
+            sm = SecurityManager() # accepts
+            old = self.setSecurityManager(sm)
+            self.assertEqual(guarded_all([True,True,False]), False)
+            self.setSecurityManager(old)
+
+        def test_any_succeeds(self):
+            sm = SecurityManager() # accepts
+            old = self.setSecurityManager(sm)
+            self.assertEquals(guarded_any([True,True,False]), True)
+            self.setSecurityManager(old)
+
     def test_min_succeeds(self):
         sm = SecurityManager() # accepts
         old = self.setSecurityManager(sm)
         self.assertEqual(guarded_min([1,2,3]), 1)
         self.assertEqual(guarded_min(1,2,3), 1)
+        self.assertEqual(guarded_min({'x':1},{'x':2}, 
+                                     key=operator.itemgetter('x')), {'x':1})
         self.setSecurityManager(old)
 
     def test_max_succeeds(self):
@@ -275,6 +311,8 @@
         old = self.setSecurityManager(sm)
         self.assertEqual(guarded_max([1,2,3]), 3)
         self.assertEqual(guarded_max(1,2,3), 3)
+        self.assertEqual(guarded_max({'x':1},{'x':2}, 
+                                     key=operator.itemgetter('x')), {'x':2})
         self.setSecurityManager(old)
 
     def test_enumerate_succeeds(self):

_______________________________________________
Zope-Checkins maillist  -  Zope-Checkins@zope.org
http://mail.zope.org/mailman/listinfo/zope-checkins

Reply via email to