Raise an ImproperlyConfigured exception if value handling doesn't work, thanks @pydanny for the suggestion.

This commit is contained in:
Jannis Leidel 2013-07-27 15:38:30 +02:00
parent 19c7765d04
commit b8222d2271
3 changed files with 40 additions and 30 deletions

View file

@ -68,7 +68,7 @@ class ValueTests(TestCase):
self.assertTrue(value.setup('TEST'))
def test_boolean_values_faulty(self):
self.assertRaises(ValueError, BooleanValue, 'false')
self.assertRaises(ImproperlyConfigured, BooleanValue, 'false')
def test_boolean_values_false(self):
value = BooleanValue(True, environ=True)
@ -79,28 +79,28 @@ class ValueTests(TestCase):
def test_boolean_values_nonboolean(self):
value = BooleanValue(True, environ=True)
with env(DJANGO_TEST='nonboolean'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_integer_values(self):
value = IntegerValue(1, environ=True)
with env(DJANGO_TEST='2'):
self.assertEqual(value.setup('TEST'), 2)
with env(DJANGO_TEST='noninteger'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_float_values(self):
value = FloatValue(1.0, environ=True)
with env(DJANGO_TEST='2.0'):
self.assertEqual(value.setup('TEST'), 2.0)
with env(DJANGO_TEST='noninteger'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_decimal_values(self):
value = DecimalValue(decimal.Decimal(1), environ=True)
with env(DJANGO_TEST='2'):
self.assertEqual(value.setup('TEST'), decimal.Decimal(2))
with env(DJANGO_TEST='nondecimal'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_failing_caster(self):
self.assertRaises(ImproperlyConfigured, FailingCasterValue)
@ -137,7 +137,7 @@ class ValueTests(TestCase):
def test_list_values_converter_exception(self):
value = ListValue(environ=True, converter=int)
with env(DJANGO_TEST='2,b'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_tuple_values_default(self):
value = TupleValue(environ=True)
@ -173,21 +173,21 @@ class ValueTests(TestCase):
with env(DJANGO_TEST=''):
self.assertEqual(value.setup('TEST'), {})
with env(DJANGO_TEST='spam'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_email_values(self):
value = EmailValue('spam@eg.gs', environ=True)
with env(DJANGO_TEST='spam@sp.am'):
self.assertEqual(value.setup('TEST'), 'spam@sp.am')
with env(DJANGO_TEST='spam'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_url_values(self):
value = URLValue('http://eggs.spam', environ=True)
with env(DJANGO_TEST='http://spam.eggs'):
self.assertEqual(value.setup('TEST'), 'http://spam.eggs')
with env(DJANGO_TEST='httb://spam.eggs'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_ip_values(self):
value = IPValue('0.0.0.0', environ=True)
@ -196,14 +196,14 @@ class ValueTests(TestCase):
with env(DJANGO_TEST='::1'):
self.assertEqual(value.setup('TEST'), '::1')
with env(DJANGO_TEST='spam.eggs'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_regex_values(self):
value = RegexValue('000--000', environ=True, regex=r'\d+--\d+')
with env(DJANGO_TEST='123--456'):
self.assertEqual(value.setup('TEST'), '123--456')
with env(DJANGO_TEST='123456'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_path_values_with_check(self):
value = PathValue(environ=True)
@ -212,7 +212,7 @@ class ValueTests(TestCase):
with env(DJANGO_TEST='~/'):
self.assertEqual(value.setup('TEST'), os.path.expanduser('~'))
with env(DJANGO_TEST='/does/not/exist'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_path_values_no_check(self):
value = PathValue(environ=True, check_exists=False)
@ -226,9 +226,9 @@ class ValueTests(TestCase):
self.assertEqual(value.setup('TEST'), '/does/not/exist')
def test_secret_value(self):
self.assertRaises(ValueError, SecretValue, 'default')
self.assertRaises(ImproperlyConfigured, SecretValue, 'default')
value = SecretValue()
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
with env(DJANGO_SECRET_KEY='123'):
self.assertEqual(value.setup('SECRET_KEY'), '123')
@ -268,7 +268,7 @@ class ValueTests(TestCase):
'EMAIL_PORT': None,
'EMAIL_USE_TLS': False})
with env(EMAIL_URL='smtps://user@domain.com:password@smtp.example.com:wrong'):
self.assertRaises(ValueError, value.setup, 'TEST')
self.assertRaises(ImproperlyConfigured, value.setup, 'TEST')
def test_cache_url_value(self):
value = CacheURLValue(environ=True)

View file

@ -79,8 +79,8 @@ class BooleanValue(Value):
def __init__(self, *args, **kwargs):
super(BooleanValue, self).__init__(*args, **kwargs)
if self.default not in (True, False):
raise ValueError('Default value {!r} is '
'not a boolean value'.format(self.default))
raise ImproperlyConfigured('Default value {!r} is not a '
'boolean value'.format(self.default))
def to_python(self, value):
normalized_value = value.strip().lower()
@ -89,8 +89,8 @@ class BooleanValue(Value):
elif normalized_value in self.false_values:
return False
else:
raise ValueError('Cannot interpret '
'boolean value {!r}'.format(value))
raise ImproperlyConfigured('Cannot interpret '
'boolean value {!r}'.format(value))
class CastingMixin(object):
@ -112,7 +112,7 @@ class CastingMixin(object):
try:
return self._caster(value)
except self.exception:
raise ValueError(self.message.format(value))
raise ImproperlyConfigured(self.message.format(value))
class IntegerValue(CastingMixin, Value):
@ -157,7 +157,8 @@ class ListValue(Value):
try:
converted_values.append(self.converter(list_value))
except (TypeError, ValueError):
raise ValueError(self.message.format(list_value, value))
raise ImproperlyConfigured(self.message.format(list_value,
value))
return converted_values
@ -197,6 +198,7 @@ class SetValue(ListValue):
class DictValue(Value):
message = 'Cannot interpret dict value {!s}'
def __init__(self, *args, **kwargs):
super(DictValue, self).__init__(*args, **kwargs)
@ -209,9 +211,12 @@ class DictValue(Value):
value = super(DictValue, self).to_python(value)
if not value:
return {}
evaled_value = ast.literal_eval(value)
try:
evaled_value = ast.literal_eval(value)
except ValueError:
raise ImproperlyConfigured(self.message.format(value))
if not isinstance(evaled_value, dict):
raise ValueError('Cannot interpret dict value {!s}'.format(value))
raise ImproperlyConfigured(self.message.format(value))
return evaled_value
@ -233,7 +238,7 @@ class ValidationMixin(object):
try:
self._validator(value)
except ValidationError:
raise ValueError(self.message.format(value))
raise ImproperlyConfigured(self.message.format(value))
else:
return value
@ -271,7 +276,8 @@ class PathValue(Value):
value = super(PathValue, self).setup(name)
value = os.path.expanduser(value)
if self.check_exists and not os.path.exists(value):
raise ValueError('Path {!r} does not exist.'.format(value))
raise ImproperlyConfigured('Path {!r} does '
'not exist.'.format(value))
return os.path.abspath(value)
@ -281,13 +287,14 @@ class SecretValue(Value):
kwargs['environ'] = True
super(SecretValue, self).__init__(*args, **kwargs)
if self.default is not None:
raise ValueError('Secret values are only allowed to be '
'set as environment variables')
raise ImproperlyConfigured('Secret values are only allowed to '
'be set as environment variables')
def setup(self, name):
value = super(SecretValue, self).setup(name)
if not value:
raise ValueError('Secret value {!r} is not set'.format(name))
raise ImproperlyConfigured('Secret value {!r} '
'is not set'.format(name))
return value

View file

@ -176,9 +176,12 @@ Type values
Use a custom converter to check for the given variables::
from django.core.exceptions import ImproperlyConfigured
def check_monty_python(person):
if not is_completely_different(person):
raise ValueError('{0} is not a Monty Python member'.format(person))
error = '{0} is not a Monty Python member'.format(person)
raise ImproperlyConfigured(error)
return person
MONTY_PYTHONS = ListValue(['John Cleese', 'Eric Idle'],
@ -399,7 +402,7 @@ Other values
to reduce the risk of accidentally storing secret values in the settings
file.
:raises: ``ValueError`` when given a default value
:raises: ``ImproperlyConfigured`` when given a default value
::