diff --git a/classsettings/__init__.py b/classsettings/__init__.py index df710b1..a2fb098 100644 --- a/classsettings/__init__.py +++ b/classsettings/__init__.py @@ -1,4 +1,4 @@ from .settings import Settings, Config from .env import from_env, get_env_setting -__version__ = '1.0.0' +__version__ = '1.0.1' diff --git a/classsettings/env.py b/classsettings/env.py index c6e6b30..9034103 100644 --- a/classsettings/env.py +++ b/classsettings/env.py @@ -7,22 +7,26 @@ @defaultargs -def from_env(key=None): +def from_env(key=None, through=None): """ Gets environment variable by given key. - If key is not given, uses decorated function's name. If key is not present within environ, calls given function and raises :class:`ImproperlyConfigured` if it returns `None`. + + :param key: env. variable name, defaults to function's name + :param through: callable should be applied to result """ def decorator(func): @functools.wraps(func) def decorated(*args, **kwargs): try: - return get_env_setting(key or func.__name__) + value = get_env_setting(key or func.__name__) except ImproperlyConfigured as e: - default = func(*args, **kwargs) - if default is not None: return default - raise e + value = func(*args, **kwargs) + if value is None: + raise e + + return through(value) if through else value return decorated return decorator diff --git a/tests.py b/tests.py index 91cc41b..b60f5cf 100644 --- a/tests.py +++ b/tests.py @@ -118,6 +118,7 @@ def tearDown(self): def test_has_default(self): self.assertEqual(os.environ.get('CLASSSETTINGS_ENV'), None) + @from_env(key='CLASSSETTINGS_ENV') def getter(): return 'default' @@ -127,6 +128,7 @@ def getter(): return 'default' def test_no_default(self): self.assertEqual(os.environ.get('CLASSSETTINGS_ENV'), None) + @from_env(key='CLASSSETTINGS_ENV') def getter(): pass @@ -134,6 +136,27 @@ def getter(): pass os.environ['CLASSSETTINGS_ENV'] = 'value' self.assertEqual(getter(), 'value') + def test_through_with_env(self): + self.assertEqual(os.environ.get('CLASSSETTINGS_ENV'), None) + + filter_func = lambda val: val.upper() + + @from_env(key='CLASSSETTINGS_ENV', through=filter_func) + def getter(): pass + + os.environ['CLASSSETTINGS_ENV'] = 'value' + self.assertEqual(getter(), 'VALUE') + + def test_through_with_default(self): + self.assertEqual(os.environ.get('CLASSSETTINGS_ENV'), None) + + filter_func = lambda val: val.upper() + + @from_env(key='CLASSSETTINGS_ENV', through=filter_func) + def getter(): return 'default' + + self.assertEqual(getter(), 'DEFAULT') + class UtilsTestCase(unittest.TestCase):