From 1c6fd0f505ca9ce6ed71ea44d92a97ec60a9befc Mon Sep 17 00:00:00 2001 From: Mike Date: Thu, 15 Mar 2018 12:19:50 +0000 Subject: [PATCH] Add PositiveIntegerValue to only allow positive integers (#186) --- configurations/values.py | 9 +++++++++ docs/values.rst | 8 ++++++++ tests/test_values.py | 11 ++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/configurations/values.py b/configurations/values.py index e5f4e2d..056e9a0 100644 --- a/configurations/values.py +++ b/configurations/values.py @@ -178,6 +178,15 @@ class IntegerValue(CastingMixin, Value): caster = int +class PositiveIntegerValue(IntegerValue): + + def to_python(self, value): + int_value = super(PositiveIntegerValue, self).to_python(value) + if int_value < 0: + raise ValueError(self.message.format(value)) + return int_value + + class FloatValue(CastingMixin, Value): caster = float diff --git a/docs/values.rst b/docs/values.rst index 255880f..cf2e7bf 100644 --- a/docs/values.rst +++ b/docs/values.rst @@ -230,6 +230,14 @@ Type values MYSITE_CACHE_TIMEOUT = values.IntegerValue(3600) +.. class:: PositiveIntegerValue + + A :class:`~Value` subclass that handles positive integer values. + + :: + + MYSITE_WORKER_POOL = values.PositiveIntegerValue(8) + .. class:: FloatValue A :class:`~Value` subclass that handles float values. diff --git a/tests/test_values.py b/tests/test_values.py index 0eb3f43..853b4be 100644 --- a/tests/test_values.py +++ b/tests/test_values.py @@ -16,7 +16,7 @@ from configurations.values import (Value, BooleanValue, IntegerValue, DatabaseURLValue, EmailURLValue, CacheURLValue, BackendsValue, CastingMixin, SearchURLValue, - setup_value) + setup_value, PositiveIntegerValue) @contextmanager @@ -136,6 +136,15 @@ class ValueTests(TestCase): with env(DJANGO_TEST='noninteger'): self.assertRaises(ValueError, value.setup, 'TEST') + def test_positive_integer_values(self): + value = PositiveIntegerValue(1) + with env(DJANGO_TEST='2'): + self.assertEqual(value.setup('TEST'), 2) + with env(DJANGO_TEST='noninteger'): + self.assertRaises(ValueError, value.setup, 'TEST') + with env(DJANGO_TEST='-1'): + self.assertRaises(ValueError, value.setup, 'TEST') + def test_float_values(self): value = FloatValue(1.0) with env(DJANGO_TEST='2.0'):