Update from_env() method

This commit is contained in:
Roman Mogylatov 2021-01-24 09:15:38 -05:00
parent f701ef8085
commit a7a0294f5d
3 changed files with 3950 additions and 3802 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1415,7 +1415,7 @@ cdef class ConfigurationOption(Provider):
self.override(merge_dicts(current_config, options))
def from_env(self, name, default=UNDEFINED):
def from_env(self, name, default=UNDEFINED, required=UNDEFINED):
"""Load configuration value from the environment variable.
:param name: Name of the environment variable.
@ -1424,12 +1424,16 @@ cdef class ConfigurationOption(Provider):
:param default: Default value that is used if environment variable does not exist.
:type default: object
:param required: When required is True, raise an exception if environment variable is undefined.
:type required: bool
:rtype: None
"""
value = os.environ.get(name, default)
if value is UNDEFINED:
if self._is_strict_mode_enabled():
if required is not False \
and (self._is_strict_mode_enabled() or required is True):
raise ValueError('Environment variable "{0}" is undefined'.format(name))
value = None
@ -1738,7 +1742,7 @@ cdef class Configuration(Object):
current_config = {}
self.override(merge_dicts(current_config, options))
def from_env(self, name, default=UNDEFINED):
def from_env(self, name, default=UNDEFINED, required=UNDEFINED):
"""Load configuration value from the environment variable.
:param name: Name of the environment variable.
@ -1747,12 +1751,16 @@ cdef class Configuration(Object):
:param default: Default value that is used if environment variable does not exist.
:type default: object
:param required: When required is True, raise an exception if environment variable is undefined.
:type required: bool
:rtype: None
"""
value = os.environ.get(name, default)
if value is UNDEFINED:
if self._is_strict_mode_enabled():
if required is not False \
and (self._is_strict_mode_enabled() or required is True):
raise ValueError('Environment variable "{0}" is undefined'.format(name))
value = None

View File

@ -816,10 +816,25 @@ class ConfigFromEnvTests(unittest.TestCase):
self.config.from_env('CONFIG_TEST_ENV')
self.assertEqual(self.config(), 'test-value')
def test_with_children(self):
self.config.section1.value1.from_env('CONFIG_TEST_ENV')
self.assertEqual(self.config(), {'section1': {'value1': 'test-value'}})
self.assertEqual(self.config.section1(), {'value1': 'test-value'})
self.assertEqual(self.config.section1.value1(), 'test-value')
def test_default(self):
self.config.from_env('UNDEFINED_ENV', 'default-value')
self.assertEqual(self.config(), 'default-value')
def test_default_none(self):
self.config.from_env('UNDEFINED_ENV')
self.assertIsNone(self.config())
def test_option_default_none(self):
self.config.option.from_env('UNDEFINED_ENV')
self.assertIsNone(self.config.option())
def test_undefined_in_strict_mode(self):
self.config = providers.Configuration(strict=True)
with self.assertRaises(ValueError):
@ -840,17 +855,38 @@ class ConfigFromEnvTests(unittest.TestCase):
self.config.option.from_env('UNDEFINED_ENV', 'default-value')
self.assertEqual(self.config.option(), 'default-value')
def test_default_none(self):
self.config.from_env('UNDEFINED_ENV')
def test_required_undefined(self):
with self.assertRaises(ValueError):
self.config.from_env('UNDEFINED_ENV', required=True)
def test_required_undefined_with_default(self):
self.config.from_env('UNDEFINED_ENV', default='default-value', required=True)
self.assertEqual(self.config(), 'default-value')
def test_option_required_undefined(self):
with self.assertRaises(ValueError):
self.config.option.from_env('UNDEFINED_ENV', required=True)
def test_option_required_undefined_with_default(self):
self.config.option.from_env('UNDEFINED_ENV', default='default-value', required=True)
self.assertEqual(self.config.option(), 'default-value')
def test_not_required_undefined_in_strict_mode(self):
self.config = providers.Configuration(strict=True)
self.config.from_env('UNDEFINED_ENV', required=False)
self.assertIsNone(self.config())
def test_option_default_none(self):
self.config.option.from_env('UNDEFINED_ENV')
def test_option_not_required_undefined_in_strict_mode(self):
self.config = providers.Configuration(strict=True)
self.config.option.from_env('UNDEFINED_ENV', required=False)
self.assertIsNone(self.config.option())
def test_with_children(self):
self.config.section1.value1.from_env('CONFIG_TEST_ENV')
def test_not_required_undefined_with_default_in_strict_mode(self):
self.config = providers.Configuration(strict=True)
self.config.from_env('UNDEFINED_ENV', default='default-value', required=False)
self.assertEqual(self.config(), 'default-value')
self.assertEqual(self.config(), {'section1': {'value1': 'test-value'}})
self.assertEqual(self.config.section1(), {'value1': 'test-value'})
self.assertEqual(self.config.section1.value1(), 'test-value')
def test_option_not_required_undefined_with_default_in_strict_mode(self):
self.config = providers.Configuration(strict=True)
self.config.option.from_env('UNDEFINED_ENV', default='default-value', required=False)
self.assertEqual(self.config.option(), 'default-value')