diff options
Diffstat (limited to 'ricky/param/constrainednumber.py')
| -rw-r--r-- | ricky/param/constrainednumber.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/ricky/param/constrainednumber.py b/ricky/param/constrainednumber.py new file mode 100644 index 0000000..214924a --- /dev/null +++ b/ricky/param/constrainednumber.py @@ -0,0 +1,88 @@ +import random +from ricky.param import Param +DEFAULT_RAND_MAX = 1000 +DEFAULT_RAND_MIN = -1000 + +class ConstrainedNumber(Param): + def __init__(self, **kwargs): + super(ConstrainedNumber, self).__init__(**kwargs) + self.range_min = kwargs.get('min') + self.range_max = kwargs.get('max') + self.forbidden = kwargs.get('forbidden') + self.forbidden_range_min = kwargs.get('forbidden_range_min') + self.forbidden_range_max = kwargs.get('forbidden_range_max') + self.assert_int = kwargs.get('assert_int') + + def randomize(self): + val = random.randint(self.range_min, self.range_max) + self.value = val + + @property + def value(self): + return super(ConstrainedNumber, self).value_get() + + @value.setter + def value(self, value): + if value is not None and ( + self._value < self.range_min or + self._value > self.range_max + ): + raise ValueError( + "Value must be between %s and %s\n" % ( + self.range_min, self.range_max + ) + ) + if value == self.forbidden: + raise ValueError( + "Value %s is forbidden" % value + ) + if (self.forbidden_range_max or self.forbidden_range_max == 0) and \ + self.forbidden_range_max >= value: + raise ValueError( + "In forbidden range: Value %s is below %s" % + (value, self.forbidden_range_max) + ) + if (self.forbidden_range_min or self.forbidden_range_min == 0) and \ + self.forbidden_range_min <= value: + raise ValueError( + "In forbidden range: Value %s is above %s" % + (value, self.forbidden_range_min) + ) + if self.assert_int and type(value) != int: + raise ValueError( + "Value %s is not an int" % value + ) + self._value = value + + def __str__(self): + value_dict = { + 'value': self._value, + } + for attr in ( + 'range_min', 'range_max', 'forbidden', 'forbidden_range_min', + 'forbidden_range_max', 'enforce_int' + ): + attr_val = getattr(self, attr) + if attr_val or attr_val == 0: + value_dict[attr] = attr_val + return "Constrained Number Range \"%s\":\n %s" % (self.name, value_dict) + + def _generate_random(self): + value = random.uniform(DEFAULT_RAND_MIN, DEFAULT_RAND_MAX) + if self.assert_int: + value = int(value) + self.value = value + + def randomize(self): + tries = 0 + tries_max = 30 + try: + self._generate_random() + except ValueError: + tries += 1 + if tries < tries_max: + self._generate_random() + else: + raise ValueError( + "Unable to set random value on %s in %s tries" + ) % (self.name, self.tries_max) |
