Ability to pass keyword args to CastingMixin casters

This commit is contained in:
Dmitry Kozhedubov 2014-03-02 13:30:27 +04:00
parent 88ae1f28cd
commit e33eeeb871
2 changed files with 28 additions and 1 deletions

View file

@ -3,6 +3,7 @@ import copy
import decimal
import os
import sys
import inspect
from django.core import validators
from django.core.exceptions import ValidationError, ImproperlyConfigured
@ -95,6 +96,7 @@ class BooleanValue(Value):
class CastingMixin(object):
exception = (TypeError, ValueError)
message = 'Cannot interpret value {0!r}'
kwargs = {}
def __init__(self, *args, **kwargs):
super(CastingMixin, self).__init__(*args, **kwargs)
@ -106,10 +108,20 @@ class CastingMixin(object):
error = 'Cannot use caster of {0} ({1!r})'.format(self,
self.caster)
raise ValueError(error)
self.process_kwargs(kwargs)
def process_kwargs(self, kwargs):
if kwargs:
arg_names = inspect.getargspec(self._caster)[0]
self.kwargs = dict((name, kwargs[name]) for name in arg_names \
if name in kwargs)
def to_python(self, value):
try:
return self._caster(value)
if self.kwargs:
return self._caster(value, **self.kwargs)
else:
return self._caster(value)
except self.exception:
raise ValueError(self.message.format(value))

View file

@ -253,6 +253,21 @@ class ValueTests(TestCase):
'USER': None,
}})
def test_database_url_additional_args(self):
def mock_database_url_caster(self, url, engine=None):
return { 'URL': url, 'ENGINE': engine }
with patch('configurations.values.DatabaseURLValue.caster', mock_database_url_caster):
value = DatabaseURLValue(engine='django_mysqlpool.backends.mysqlpool')
with env(DATABASE_URL='sqlite://'):
self.assertEqual(value.setup('DATABASE_URL'), {
'default': {
'URL': 'sqlite://',
'ENGINE': 'django_mysqlpool.backends.mysqlpool'
}
})
def test_email_url_value(self):
value = EmailURLValue()
self.assertEqual(value.default, {})