diff options
author | Colin Watson <cjwatson@debian.org> | 2022-03-10 10:49:08 +0000 |
---|---|---|
committer | Colin Watson <cjwatson@debian.org> | 2022-03-10 10:49:08 +0000 |
commit | 779c5db040759de3fb51e80f90f9805d1e093e1c (patch) | |
tree | c980498248b0d9dc7dc0c59fe0412355f921e070 /src | |
parent | fca22bb84b4eaf11875a7a7207fb0c1d9be36d39 (diff) | |
download | zope-security-779c5db040759de3fb51e80f90f9805d1e093e1c.tar.gz |
Fix default checker for method-wrapper on Python 3
The default checker for `method-wrapper` objects such as `().__repr__`
and `{}.__repr__` was previously set by setting the default checker
`type(().__getslice__)`, which only worked on Python 2. Use a different
exemplar for this type which works on both Python 2 and 3.
Fixes #75.
Diffstat (limited to 'src')
-rw-r--r-- | src/zope/security/checker.py | 3 | ||||
-rw-r--r-- | src/zope/security/tests/test_proxy.py | 5 |
2 files changed, 7 insertions, 1 deletions
diff --git a/src/zope/security/checker.py b/src/zope/security/checker.py index fe570d1..534e8bb 100644 --- a/src/zope/security/checker.py +++ b/src/zope/security/checker.py @@ -882,6 +882,8 @@ _default_checkers = { types.MethodType: _callableChecker, types.BuiltinFunctionType: _callableChecker, types.BuiltinMethodType: _callableChecker, + # method-wrapper + type(().__repr__): _callableChecker, type: _typeChecker, types.ModuleType: lambda module: _checkers.get(module, _namedChecker), type(iter([])): _iteratorChecker, # Same types in Python 2.2.1, @@ -912,7 +914,6 @@ if PYTHON2: # pragma: no cover _default_checkers[types.ClassType] = _typeChecker _default_checkers[types.InstanceType] = _instanceChecker # slot description - _default_checkers[type(().__getslice__)] = _callableChecker _default_checkers[type({}.iteritems())] = _iteratorChecker _default_checkers[type({}.iterkeys())] = _iteratorChecker _default_checkers[type({}.itervalues())] = _iteratorChecker diff --git a/src/zope/security/tests/test_proxy.py b/src/zope/security/tests/test_proxy.py index adbb4f2..d646f54 100644 --- a/src/zope/security/tests/test_proxy.py +++ b/src/zope/security/tests/test_proxy.py @@ -2171,6 +2171,11 @@ class ProxyFactoryTests(unittest.TestCase): self.assertEqual(list(IFoo), ['x']) self.assertEqual(list(proxy), list(IFoo)) + def test_method_wrapper(self): + from zope.security.proxy import ProxyFactory + + self.assertEqual(ProxyFactory({}).__repr__(), '{}') + def test_using_mapping_slots_hack(): """The security proxy will use mapping slots, on the checker to go faster |