mirror of
https://github.com/jazzband/django-configurations.git
synced 2026-03-16 22:20:27 +00:00
Ability to pass keyword args to CastingMixin casters
This commit is contained in:
parent
88ae1f28cd
commit
e33eeeb871
2 changed files with 28 additions and 1 deletions
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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, {})
|
||||
|
|
|
|||
Loading…
Reference in a new issue