diff --git a/simple_settings/core.py b/simple_settings/core.py index ec2de3e..95acf8b 100644 --- a/simple_settings/core.py +++ b/simple_settings/core.py @@ -11,11 +11,11 @@ def __init__(self): def _setup(self): self._settings_module = self._get_settings_from_cmd_line() - if not self._settings_module: + if self._settings_module is None: self._settings_module = os.environ.get('settings') - if not self._settings_module: + if self._settings_module is None: raise RuntimeError('Settings are not configured') - self._load_settings_module() + self._load_settings_pipeline() def _get_settings_from_cmd_line(self): for arg in sys.argv: @@ -25,8 +25,12 @@ def _get_settings_from_cmd_line(self): except IndexError: return None - def _load_settings_module(self): - module = importlib.import_module(self._settings_module) + def _load_settings_pipeline(self): + for settings_module in self._settings_module.split(','): + self._load_settings_module(settings_module) + + def _load_settings_module(self, settings_module): + module = importlib.import_module(settings_module) for setting in dir(module): value = os.environ.get(setting, getattr(module, setting)) self._dict[setting] = value diff --git a/tests/samples/without_import.py b/tests/samples/without_import.py new file mode 100644 index 0000000..dd783ee --- /dev/null +++ b/tests/samples/without_import.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + + +SOME_TEXT = u'some text' +SIMPLE_INTEGER = 2 diff --git a/tests/test_settings.py b/tests/test_settings.py index bd93785..196bc34 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -10,7 +10,7 @@ def get_settings_by_cmd_line(module_name): return _Settings() -def get_settings_by_enviroment(module_name): +def get_settings_by_environment(module_name): with patch('os.environ.get') as mock: mock.return_value = module_name from simple_settings.core import _Settings @@ -25,10 +25,10 @@ def test_should_load_module_by_cmd_line(self): assert settings._settings_module == expect_module - def test_should_load_module_by_enviroment(self): + def test_should_load_module_by_environment(self): expect_module = 'tests.samples.complex' with patch.object(sys, 'argv', []): - settings = get_settings_by_enviroment(expect_module) + settings = get_settings_by_environment(expect_module) assert settings._settings_module == expect_module @@ -43,6 +43,21 @@ def test_should_inherit_settings(self): assert settings.APPLICATION_NAME == u'Simple Settings' + def test_should_load_multiple_settings_by_pipeline(self): + settings = get_settings_by_cmd_line( + 'tests.samples.simple,tests.samples.without_import' + ) + + assert settings.SIMPLE_STRING == u'simple' + assert settings.SOME_TEXT == u'some text' + + def test_should_inherit_settings_with_pipeline(self): + settings = get_settings_by_cmd_line( + 'tests.samples.simple,tests.samples.without_import' + ) + + assert settings.SIMPLE_INTEGER == 2 + def test_complex_settings(self): settings = get_settings_by_cmd_line('tests.samples.complex') @@ -56,7 +71,7 @@ def test_settings_as_dict(self): assert settings_dict['SIMPLE_STRING'] == u'simple' assert settings_dict['SIMPLE_INTEGER'] == 1 - def test_settings_override_by_enviroment(self): + def test_settings_override_by_environment(self): def _mock_env_side_effect(k, d=None): return u'simple from env' if k == 'SIMPLE_STRING' else d