mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-06 14:40:48 +03:00
Add tests for .from_ini() for config and config option
This commit is contained in:
parent
534b9691fa
commit
f77c8b13e9
File diff suppressed because it is too large
Load Diff
|
@ -200,7 +200,7 @@ class ConfigurationOption(Provider[Any]):
|
||||||
def required(self) -> ConfigurationOption: ...
|
def required(self) -> ConfigurationOption: ...
|
||||||
def is_required(self) -> bool: ...
|
def is_required(self) -> bool: ...
|
||||||
def update(self, value: Any) -> None: ...
|
def update(self, value: Any) -> None: ...
|
||||||
def from_ini(self, filepath: Union[Path, str], required: bool = False) -> None: ...
|
def from_ini(self, filepath: Union[Path, str], required: bool = False, envs_required: bool = False) -> None: ...
|
||||||
def from_yaml(self, filepath: Union[Path, str], required: bool = False, loader: Optional[Any] = None, envs_required: bool = False) -> None: ...
|
def from_yaml(self, filepath: Union[Path, str], required: bool = False, loader: Optional[Any] = None, envs_required: bool = False) -> None: ...
|
||||||
def from_pydantic(self, settings: PydanticSettings, required: bool = False, **kwargs: Any) -> None: ...
|
def from_pydantic(self, settings: PydanticSettings, required: bool = False, **kwargs: Any) -> None: ...
|
||||||
def from_dict(self, options: _Dict[str, Any], required: bool = False) -> None: ...
|
def from_dict(self, options: _Dict[str, Any], required: bool = False) -> None: ...
|
||||||
|
@ -237,7 +237,7 @@ class Configuration(Object[Any]):
|
||||||
def set(self, selector: str, value: Any) -> OverridingContext[P]: ...
|
def set(self, selector: str, value: Any) -> OverridingContext[P]: ...
|
||||||
def reset_cache(self) -> None: ...
|
def reset_cache(self) -> None: ...
|
||||||
def update(self, value: Any) -> None: ...
|
def update(self, value: Any) -> None: ...
|
||||||
def from_ini(self, filepath: Union[Path, str], required: bool = False) -> None: ...
|
def from_ini(self, filepath: Union[Path, str], required: bool = False, envs_required: bool = False) -> None: ...
|
||||||
def from_yaml(self, filepath: Union[Path, str], required: bool = False, loader: Optional[Any] = None, envs_required: bool = False) -> None: ...
|
def from_yaml(self, filepath: Union[Path, str], required: bool = False, loader: Optional[Any] = None, envs_required: bool = False) -> None: ...
|
||||||
def from_pydantic(self, settings: PydanticSettings, required: bool = False, **kwargs: Any) -> None: ...
|
def from_pydantic(self, settings: PydanticSettings, required: bool = False, **kwargs: Any) -> None: ...
|
||||||
def from_dict(self, options: _Dict[str, Any], required: bool = False) -> None: ...
|
def from_dict(self, options: _Dict[str, Any], required: bool = False) -> None: ...
|
||||||
|
|
|
@ -88,19 +88,25 @@ def _resolve_config_env_markers(config_content, envs_required=False):
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info[0] == 3:
|
if sys.version_info[0] == 3:
|
||||||
def _parse_ini_file(filepath):
|
def _parse_ini_file(filepath, envs_required=False):
|
||||||
parser = iniconfigparser.ConfigParser()
|
parser = iniconfigparser.ConfigParser()
|
||||||
with open(filepath) as config_file:
|
with open(filepath) as config_file:
|
||||||
config_string = _resolve_config_env_markers(config_file.read())
|
config_string = _resolve_config_env_markers(
|
||||||
|
config_file.read(),
|
||||||
|
envs_required=envs_required,
|
||||||
|
)
|
||||||
parser.read_string(config_string)
|
parser.read_string(config_string)
|
||||||
return parser
|
return parser
|
||||||
else:
|
else:
|
||||||
import StringIO
|
import StringIO
|
||||||
|
|
||||||
def _parse_ini_file(filepath):
|
def _parse_ini_file(filepath, envs_required=False):
|
||||||
parser = iniconfigparser.ConfigParser()
|
parser = iniconfigparser.ConfigParser()
|
||||||
with open(filepath) as config_file:
|
with open(filepath) as config_file:
|
||||||
config_string = _resolve_config_env_markers(config_file.read())
|
config_string = _resolve_config_env_markers(
|
||||||
|
config_file.read(),
|
||||||
|
envs_required=envs_required,
|
||||||
|
)
|
||||||
parser.readfp(StringIO.StringIO(config_string))
|
parser.readfp(StringIO.StringIO(config_string))
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
@ -1521,7 +1527,7 @@ cdef class ConfigurationOption(Provider):
|
||||||
"""
|
"""
|
||||||
self.override(value)
|
self.override(value)
|
||||||
|
|
||||||
def from_ini(self, filepath, required=UNDEFINED):
|
def from_ini(self, filepath, required=UNDEFINED, envs_required=False):
|
||||||
"""Load configuration from the ini file.
|
"""Load configuration from the ini file.
|
||||||
|
|
||||||
Loaded configuration is merged recursively over existing configuration.
|
Loaded configuration is merged recursively over existing configuration.
|
||||||
|
@ -1532,10 +1538,16 @@ cdef class ConfigurationOption(Provider):
|
||||||
:param required: When required is True, raise an exception if file does not exist.
|
:param required: When required is True, raise an exception if file does not exist.
|
||||||
:type required: bool
|
:type required: bool
|
||||||
|
|
||||||
|
:param envs_required: When True, raises an error on undefined environment variable.
|
||||||
|
:type envs_required: bool
|
||||||
|
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
parser = _parse_ini_file(filepath)
|
parser = _parse_ini_file(
|
||||||
|
filepath,
|
||||||
|
envs_required=envs_required or self._is_strict_mode_enabled(),
|
||||||
|
)
|
||||||
except IOError as exception:
|
except IOError as exception:
|
||||||
if required is not False \
|
if required is not False \
|
||||||
and (self._is_strict_mode_enabled() or required is True) \
|
and (self._is_strict_mode_enabled() or required is True) \
|
||||||
|
@ -1951,7 +1963,7 @@ cdef class Configuration(Object):
|
||||||
"""
|
"""
|
||||||
self.override(value)
|
self.override(value)
|
||||||
|
|
||||||
def from_ini(self, filepath, required=UNDEFINED):
|
def from_ini(self, filepath, required=UNDEFINED, envs_required=False):
|
||||||
"""Load configuration from the ini file.
|
"""Load configuration from the ini file.
|
||||||
|
|
||||||
Loaded configuration is merged recursively over existing configuration.
|
Loaded configuration is merged recursively over existing configuration.
|
||||||
|
@ -1962,10 +1974,16 @@ cdef class Configuration(Object):
|
||||||
:param required: When required is True, raise an exception if file does not exist.
|
:param required: When required is True, raise an exception if file does not exist.
|
||||||
:type required: bool
|
:type required: bool
|
||||||
|
|
||||||
|
:param envs_required: When True, raises an error on undefined environment variable.
|
||||||
|
:type envs_required: bool
|
||||||
|
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
parser = _parse_ini_file(filepath)
|
parser = _parse_ini_file(
|
||||||
|
filepath,
|
||||||
|
envs_required=envs_required or self._is_strict_mode_enabled(),
|
||||||
|
)
|
||||||
except IOError as exception:
|
except IOError as exception:
|
||||||
if required is not False \
|
if required is not False \
|
||||||
and (self._is_strict_mode_enabled() or required is True) \
|
and (self._is_strict_mode_enabled() or required is True) \
|
||||||
|
|
|
@ -629,7 +629,7 @@ class ConfigFromIniWithEnvInterpolationTests(unittest.TestCase):
|
||||||
self.assertEqual(self.config.section1.value1(), 'test-value')
|
self.assertEqual(self.config.section1.value1(), 'test-value')
|
||||||
self.assertEqual(self.config.section1.value2(), 'test-path/path')
|
self.assertEqual(self.config.section1.value2(), 'test-path/path')
|
||||||
|
|
||||||
def test_missing_envs(self):
|
def test_missing_envs_not_required(self):
|
||||||
del os.environ['CONFIG_TEST_ENV']
|
del os.environ['CONFIG_TEST_ENV']
|
||||||
del os.environ['CONFIG_TEST_PATH']
|
del os.environ['CONFIG_TEST_PATH']
|
||||||
|
|
||||||
|
@ -654,7 +654,38 @@ class ConfigFromIniWithEnvInterpolationTests(unittest.TestCase):
|
||||||
self.assertEqual(self.config.section1.value1(), '')
|
self.assertEqual(self.config.section1.value1(), '')
|
||||||
self.assertEqual(self.config.section1.value2(), '/path')
|
self.assertEqual(self.config.section1.value2(), '/path')
|
||||||
|
|
||||||
def test_option_missing_envs(self):
|
def test_missing_envs_required(self):
|
||||||
|
with open(self.config_file, 'w') as config_file:
|
||||||
|
config_file.write(
|
||||||
|
'[section]\n'
|
||||||
|
'undefined=${UNDEFINED}\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(ValueError) as context:
|
||||||
|
self.config.from_ini(self.config_file, envs_required=True)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
str(context.exception),
|
||||||
|
'Missing required environment variable "UNDEFINED"',
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_missing_envs_strict_mode(self):
|
||||||
|
with open(self.config_file, 'w') as config_file:
|
||||||
|
config_file.write(
|
||||||
|
'[section]\n'
|
||||||
|
'undefined=${UNDEFINED}\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.config.set_strict(True)
|
||||||
|
with self.assertRaises(ValueError) as context:
|
||||||
|
self.config.from_ini(self.config_file)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
str(context.exception),
|
||||||
|
'Missing required environment variable "UNDEFINED"',
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_option_missing_envs_not_required(self):
|
||||||
del os.environ['CONFIG_TEST_ENV']
|
del os.environ['CONFIG_TEST_ENV']
|
||||||
del os.environ['CONFIG_TEST_PATH']
|
del os.environ['CONFIG_TEST_PATH']
|
||||||
|
|
||||||
|
@ -679,6 +710,37 @@ class ConfigFromIniWithEnvInterpolationTests(unittest.TestCase):
|
||||||
self.assertEqual(self.config.option.section1.value1(), '')
|
self.assertEqual(self.config.option.section1.value1(), '')
|
||||||
self.assertEqual(self.config.option.section1.value2(), '/path')
|
self.assertEqual(self.config.option.section1.value2(), '/path')
|
||||||
|
|
||||||
|
def test_option_missing_envs_required(self):
|
||||||
|
with open(self.config_file, 'w') as config_file:
|
||||||
|
config_file.write(
|
||||||
|
'[section]\n'
|
||||||
|
'undefined=${UNDEFINED}\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(ValueError) as context:
|
||||||
|
self.config.option.from_ini(self.config_file, envs_required=True)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
str(context.exception),
|
||||||
|
'Missing required environment variable "UNDEFINED"',
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_option_missing_envs_strict_mode(self):
|
||||||
|
with open(self.config_file, 'w') as config_file:
|
||||||
|
config_file.write(
|
||||||
|
'[section]\n'
|
||||||
|
'undefined=${UNDEFINED}\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.config.set_strict(True)
|
||||||
|
with self.assertRaises(ValueError) as context:
|
||||||
|
self.config.option.from_ini(self.config_file)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
str(context.exception),
|
||||||
|
'Missing required environment variable "UNDEFINED"',
|
||||||
|
)
|
||||||
|
|
||||||
def test_default_values(self):
|
def test_default_values(self):
|
||||||
os.environ['DEFINED'] = 'defined'
|
os.environ['DEFINED'] = 'defined'
|
||||||
self.addCleanup(os.environ.pop, 'DEFINED')
|
self.addCleanup(os.environ.pop, 'DEFINED')
|
||||||
|
@ -964,7 +1026,7 @@ class ConfigFromYamlWithEnvInterpolationTests(unittest.TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
@unittest.skipIf(sys.version_info[:2] == (3, 4), 'PyYAML does not support Python 3.4')
|
@unittest.skipIf(sys.version_info[:2] == (3, 4), 'PyYAML does not support Python 3.4')
|
||||||
def test_option_missing_envs(self):
|
def test_option_missing_envs_not_required(self):
|
||||||
del os.environ['CONFIG_TEST_ENV']
|
del os.environ['CONFIG_TEST_ENV']
|
||||||
del os.environ['CONFIG_TEST_PATH']
|
del os.environ['CONFIG_TEST_PATH']
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user