summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam Groszer <agroszer@gmail.com>2019-01-03 10:55:06 +0100
committerAdam Groszer <agroszer@gmail.com>2019-01-03 14:18:42 +0100
commit0660cf005e88e677228b8096c0f78148885016d8 (patch)
treeaf4e6cb05702bab16bd1617ed03897360db79c0d /src
parent6846c5f352d35771101a7dfedcc2fbe38707bac5 (diff)
downloadzope-security-0660cf005e88e677228b8096c0f78148885016d8.tar.gz
Decimal checker: __truediv__ was missing, also added tests, did some cleanupadamg-truediv-missing
Diffstat (limited to 'src')
-rw-r--r--src/zope/security/checker.py27
-rw-r--r--src/zope/security/tests/test_checker.py42
2 files changed, 59 insertions, 10 deletions
diff --git a/src/zope/security/checker.py b/src/zope/security/checker.py
index 79975d4..818ee72 100644
--- a/src/zope/security/checker.py
+++ b/src/zope/security/checker.py
@@ -816,20 +816,27 @@ _default_checkers = {
'__add__', '__radd__', ]),
set: _setChecker,
frozenset: _setChecker,
+ # XXX: actually decimal.Decimal has more methods, which are unlisted here
+ # so expect ForbiddenAttribute on such
decimal.Decimal: NamesChecker(['__nonzero__', '__cmp__', '__eq__',
- '__ne__', 'compare', '__hash__',
- 'as_tuple', '__str__', 'to_eng_string',
+ '__ne__', '__hash__',
+ '__str__',
'__neg__', '__pos__', '__abs__',
- '__add__', '__radd__', '__sub__',
- '__rsub__', '__mul__', '__rmul__',
- '__div__', '__rdiv__', '__rtruediv__',
- '__divmod__', '__rdivmod__', '__mod__',
- '__rmod__', 'remainder_near',
+ '__add__', '__radd__',
+ '__sub__', '__rsub__',
+ '__mul__', '__rmul__',
+ '__div__', '__truediv__',
+ '__rdiv__', '__rtruediv__',
+ '__divmod__', '__rdivmod__',
+ '__mod__', '__rmod__',
'__floordiv__', '__rfloordiv__',
'__float__', '__int__', '__long__',
- '__pow__', '__rpow__', 'normalize',
- 'quantize', 'same_quantum', 'to_integral',
- 'sqrt', 'max', 'min', 'adjusted']),
+ '__pow__', '__rpow__',
+ 'adjusted', 'as_tuple', 'compare',
+ 'max', 'min', 'normalize',
+ 'quantize', 'remainder_near',
+ 'same_quantum', 'sqrt',
+ 'to_eng_string', 'to_integral' ]),
# YAGNI: () a rock
tuple: NamesChecker(['__getitem__', '__getslice__', '__add__', '__radd__',
diff --git a/src/zope/security/tests/test_checker.py b/src/zope/security/tests/test_checker.py
index 14f6002..3473886 100644
--- a/src/zope/security/tests/test_checker.py
+++ b/src/zope/security/tests/test_checker.py
@@ -389,6 +389,48 @@ class CheckerTestsBase(QuietWatchingChecker):
finally:
_clear()
+ def test_Decimal_operations(self):
+ from zope.security.proxy import Proxy
+ from zope.security.checker import _default_checkers
+ from decimal import Decimal
+ from decimal import DecimalTuple
+
+ checker = _default_checkers[Decimal]
+
+ value = Decimal('1.1')
+ proxy = Proxy(value, checker)
+
+ self.assertTrue(proxy)
+ self.assertTrue(proxy < Decimal('2'))
+ self.assertTrue(proxy == Decimal('1.1'))
+ self.assertTrue(proxy > Decimal('1'))
+ self.assertTrue(proxy != Decimal('1'))
+ self.assertEqual(-proxy, Decimal('-1.1'))
+ self.assertEqual(proxy + Decimal('1.1'), Decimal('2.2'))
+ self.assertEqual(Decimal('1.1') + proxy, Decimal('2.2'))
+ self.assertEqual(proxy - Decimal('1'), Decimal('0.1'))
+ self.assertEqual(Decimal('2.1') - proxy, Decimal('1'))
+ self.assertEqual(proxy * 1, Decimal('1.1'))
+ self.assertEqual(1 * proxy, Decimal('1.1'))
+ self.assertEqual(proxy * Decimal('1.1'), Decimal('1.21'))
+ self.assertEqual(Decimal('1.1') * proxy, Decimal('1.21'))
+ self.assertEqual(proxy / 1, Decimal('1.1'))
+ self.assertEqual(proxy / Decimal('1'), Decimal('1.1'))
+ self.assertEqual(proxy // 1, Decimal('1'))
+ self.assertEqual(proxy // Decimal('1'), Decimal('1'))
+ self.assertEqual(float(proxy), 1.1)
+ self.assertEqual(int(proxy), 1)
+ if PY2:
+ self.assertEqual(long(proxy), 1)
+ self.assertEqual(proxy ** 2, Decimal('1.21'))
+ self.assertEqual(1 ** proxy, Decimal('1'))
+ self.assertEqual(proxy.adjusted(), 0)
+ self.assertEqual(
+ proxy.as_tuple(), DecimalTuple(sign=0, digits=(1, 1), exponent=-1))
+ self.assertEqual(proxy.compare(Decimal('1.1')), Decimal('0'))
+ self.assertEqual(proxy.normalize(), Decimal('1.1'))
+ self.assertEqual(proxy.quantize(Decimal('1.10')), Decimal('1.10'))
+
def _check_iteration_of_dict_like(self, dict_like):
from zope.security.proxy import Proxy
from zope.security.checker import _default_checkers