Просмотр исходного кода

classex.AttributeDescriptor: added min filter

Fabian Peter Hammerle 8 лет назад
Родитель
Сommit
efae5c9909
2 измененных файлов с 22 добавлено и 1 удалено
  1. 7 1
      ioex/classex.py
  2. 15 0
      tests/classex/test_attribute_descriptor.py

+ 7 - 1
ioex/classex.py

@@ -3,9 +3,10 @@
 
 class AttributeDescriptor(object):
 
-    def __init__(self, name, types=None):
+    def __init__(self, name, types=None, min=None):
         self._name = name
         self._types = types
+        self._min = min
 
     def __get__(self, instance, owner):
         return getattr(instance, self._name)
@@ -17,4 +18,9 @@ class AttributeDescriptor(object):
                 type(value).__name__,
                 value,
             ))
+        if self._min and not self._min <= value:
+            raise ValueError('expected value >= {!r}, {!r} given'.format(
+                self._min,
+                value,
+            ))
         setattr(instance, self._name, value)

+ 15 - 0
tests/classex/test_attribute_descriptor.py

@@ -97,3 +97,18 @@ def test_types():
     with pytest.raises(TypeError):
         obj.desc = '123'
     assert isinstance(obj.desc, float) and 1.23 == obj.desc
+
+
+class MinFilter(object):
+
+    desc = AttributeDescriptor('attr', types=(int,), min=2)
+
+
+def test_min():
+    obj = MinFilter()
+    obj.desc = 2
+    assert 2 == obj.attr
+    obj.attr = 1
+    assert 1 == obj.desc
+    with pytest.raises(ValueError):
+        obj.desc = 0