From 010067b433c80fa1531fd7257f81f1c7b3f3b1ba Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Sun, 9 Aug 2015 14:54:55 +0200 Subject: [PATCH] Introduced environ_required parameter for Value class. Refs #118. --- configurations/values.py | 10 +++++++++- docs/values.rst | 9 ++++++++- tests/test_values.py | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/configurations/values.py b/configurations/values.py index 5c516d1..72058b4 100644 --- a/configurations/values.py +++ b/configurations/values.py @@ -27,6 +27,7 @@ class Value(object): """ multiple = False late_binding = False + environ_required = False @property def value(self): @@ -57,7 +58,8 @@ class Value(object): return instance def __init__(self, default=None, environ=True, environ_name=None, - environ_prefix='DJANGO', *args, **kwargs): + environ_prefix='DJANGO', environ_required=False, + *args, **kwargs): if isinstance(default, Value) and default.default is not None: self.default = copy.copy(default.default) else: @@ -67,6 +69,7 @@ class Value(object): environ_prefix = environ_prefix[:-1] self.environ_prefix = environ_prefix self.environ_name = environ_name + self.environ_required = environ_required def __str__(self): return str(self.value) @@ -92,6 +95,10 @@ class Value(object): full_environ_name = self.full_environ_name(name) if full_environ_name in os.environ: value = self.to_python(os.environ[full_environ_name]) + elif self.environ_required: + raise ValueError('Value {0!r} is required to be set as the ' + 'environment variable {1!r}' + .format(name, full_environ_name)) self.value = value return value @@ -378,6 +385,7 @@ class SecretValue(Value): def __init__(self, *args, **kwargs): kwargs['environ'] = True + kwargs['environ_required'] = True super(SecretValue, self).__init__(*args, **kwargs) if self.default is not None: raise ValueError('Secret values are only allowed to ' diff --git a/docs/values.rst b/docs/values.rst index c9ef8d7..510b2e1 100644 --- a/docs/values.rst +++ b/docs/values.rst @@ -139,7 +139,7 @@ the prefix. ``Value`` class --------------- -.. class:: Value(default, [environ=True, environ_name=None, environ_prefix='DJANGO']) +.. class:: Value(default, [environ=True, environ_name=None, environ_prefix='DJANGO', environ_required=False]) The ``Value`` class takes one required and several optional parameters. @@ -147,9 +147,11 @@ the prefix. :param environ: toggle for environment use :param environ_name: name of environment variable to look for :param environ_prefix: prefix to use when looking for environment variable + :param environ_required: wheter or not the value is required to be set as an environment variable :type environ: bool :type environ_name: capitalized string or None :type environ_prefix: capitalized string + :type environ_required: bool The ``default`` parameter is effectively the value the setting has right now in your ``settings.py``. @@ -538,6 +540,11 @@ Other values :raises: ``ValueError`` when given a default value + .. versionchanged:: 1.0 + + This value class has the ``environ_required`` parameter turned to + ``True``. + :: SECRET_KEY = values.SecretValue() diff --git a/tests/test_values.py b/tests/test_values.py index 28f2157..482799a 100644 --- a/tests/test_values.py +++ b/tests/test_values.py @@ -336,6 +336,7 @@ class ValueTests(TestCase): self.assertEqual(value.setup('TEST'), '/does/not/exist') def test_secret_value(self): + # no default allowed, only environment values are self.assertRaises(ValueError, SecretValue, 'default') value = SecretValue()