diff --git a/force_bdss/api.py b/force_bdss/api.py index a4d3c0d4bd689a439c5101bfb32fa118a316407f..aa798246e41d12c9cd0b14745c5302725c70c33c 100644 --- a/force_bdss/api.py +++ b/force_bdss/api.py @@ -43,4 +43,4 @@ from .ui_hooks.i_ui_hooks_factory import IUIHooksFactory # noqa from .ui_hooks.base_ui_hooks_factory import BaseUIHooksFactory # noqa from .ui_hooks.base_ui_hooks_manager import BaseUIHooksManager # noqa -from .local_traits import Identifier # noqa +from .local_traits import Identifier, PositiveInt # noqa diff --git a/force_bdss/local_traits.py b/force_bdss/local_traits.py index f759aed8596558d9783bae4e0ce1f35671f3059c..12c982542bad386d9874386c3df6f2ec1077ee45 100644 --- a/force_bdss/local_traits.py +++ b/force_bdss/local_traits.py @@ -1,4 +1,4 @@ -from traits.api import Regex, String +from traits.api import Regex, String, BaseInt #: Used for variable names, but allow also empty string as it's the default #: case and it will be present if the workflow is saved before actually @@ -8,3 +8,19 @@ Identifier = Regex(regex="(^[^\d\W]\w*\Z|^\Z)") #: Identifies a CUBA type with its key. At the moment a String with #: no validation, but will come later. CUBAType = String() + + +class PositiveInt(BaseInt): + """A positive integer trait.""" + + info_text = 'a positive integer' + + default_value = 1 + + def validate(self, object, name, value): + int_value = super(PositiveInt, self).validate(object, name, value) + + if int_value > 0: + return int_value + + self.error(object, name, value) diff --git a/force_bdss/tests/test_local_traits.py b/force_bdss/tests/test_local_traits.py index d61e6d2c89520653d65431a0030ad89b362f18be..7d0c59c991be882835312c0ce661e24761f7affc 100644 --- a/force_bdss/tests/test_local_traits.py +++ b/force_bdss/tests/test_local_traits.py @@ -1,12 +1,13 @@ import unittest from traits.api import HasStrictTraits, TraitError -from force_bdss.local_traits import Identifier, CUBAType +from force_bdss.local_traits import Identifier, CUBAType, PositiveInt class Traited(HasStrictTraits): val = Identifier() cuba = CUBAType() + positive_int = PositiveInt() class TestLocalTraits(unittest.TestCase): @@ -25,3 +26,13 @@ class TestLocalTraits(unittest.TestCase): c = Traited() c.cuba = "PRESSURE" self.assertEqual(c.cuba, "PRESSURE") + + def test_positive_int(self): + c = Traited() + with self.assertRaises(TraitError): + c.positive_int = 0 + + with self.assertRaises(TraitError): + c.positive_int = -1 + + c.positive_int = 3