mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Fix issue with explicit providing of envs_required=False for configuration from_*()
This commit is contained in:
		
							parent
							
								
									f51a946973
								
							
						
					
					
						commit
						8a31384b18
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -1527,7 +1527,7 @@ cdef class ConfigurationOption(Provider):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        self.override(value)
 | 
					        self.override(value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def from_ini(self, filepath, required=UNDEFINED, envs_required=False):
 | 
					    def from_ini(self, filepath, required=UNDEFINED, envs_required=UNDEFINED):
 | 
				
			||||||
        """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.
 | 
				
			||||||
| 
						 | 
					@ -1546,7 +1546,7 @@ cdef class ConfigurationOption(Provider):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            parser = _parse_ini_file(
 | 
					            parser = _parse_ini_file(
 | 
				
			||||||
                filepath,
 | 
					                filepath,
 | 
				
			||||||
                envs_required=envs_required or self._is_strict_mode_enabled(),
 | 
					                envs_required=envs_required if envs_required is not UNDEFINED else self._is_strict_mode_enabled(),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        except IOError as exception:
 | 
					        except IOError as exception:
 | 
				
			||||||
            if required is not False \
 | 
					            if required is not False \
 | 
				
			||||||
| 
						 | 
					@ -1565,7 +1565,7 @@ cdef class ConfigurationOption(Provider):
 | 
				
			||||||
            current_config = {}
 | 
					            current_config = {}
 | 
				
			||||||
        self.override(merge_dicts(current_config, config))
 | 
					        self.override(merge_dicts(current_config, config))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def from_yaml(self, filepath, required=UNDEFINED, loader=None, envs_required=False):
 | 
					    def from_yaml(self, filepath, required=UNDEFINED, loader=None, envs_required=UNDEFINED):
 | 
				
			||||||
        """Load configuration from the yaml file.
 | 
					        """Load configuration from the yaml file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Loaded configuration is merged recursively over existing configuration.
 | 
					        Loaded configuration is merged recursively over existing configuration.
 | 
				
			||||||
| 
						 | 
					@ -1607,7 +1607,7 @@ cdef class ConfigurationOption(Provider):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config_content = _resolve_config_env_markers(
 | 
					        config_content = _resolve_config_env_markers(
 | 
				
			||||||
            config_content,
 | 
					            config_content,
 | 
				
			||||||
            envs_required=envs_required or self._is_strict_mode_enabled(),
 | 
					            envs_required=envs_required if envs_required is not UNDEFINED else self._is_strict_mode_enabled(),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        config = yaml.load(config_content, loader)
 | 
					        config = yaml.load(config_content, loader)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1861,7 +1861,7 @@ cdef class Configuration(Object):
 | 
				
			||||||
        self.__yaml_files = list(files)
 | 
					        self.__yaml_files = list(files)
 | 
				
			||||||
        return self
 | 
					        return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def load(self, required=UNDEFINED, envs_required=False):
 | 
					    def load(self, required=UNDEFINED, envs_required=UNDEFINED):
 | 
				
			||||||
        """Load configuration.
 | 
					        """Load configuration.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        This method loads configuration from configuration files or pydantic settings that
 | 
					        This method loads configuration from configuration files or pydantic settings that
 | 
				
			||||||
| 
						 | 
					@ -1998,7 +1998,7 @@ cdef class Configuration(Object):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        self.override(value)
 | 
					        self.override(value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def from_ini(self, filepath, required=UNDEFINED, envs_required=False):
 | 
					    def from_ini(self, filepath, required=UNDEFINED, envs_required=UNDEFINED):
 | 
				
			||||||
        """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.
 | 
				
			||||||
| 
						 | 
					@ -2017,7 +2017,7 @@ cdef class Configuration(Object):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            parser = _parse_ini_file(
 | 
					            parser = _parse_ini_file(
 | 
				
			||||||
                filepath,
 | 
					                filepath,
 | 
				
			||||||
                envs_required=envs_required or self._is_strict_mode_enabled(),
 | 
					                envs_required=envs_required if envs_required is not UNDEFINED else self._is_strict_mode_enabled(),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        except IOError as exception:
 | 
					        except IOError as exception:
 | 
				
			||||||
            if required is not False \
 | 
					            if required is not False \
 | 
				
			||||||
| 
						 | 
					@ -2036,7 +2036,7 @@ cdef class Configuration(Object):
 | 
				
			||||||
            current_config = {}
 | 
					            current_config = {}
 | 
				
			||||||
        self.override(merge_dicts(current_config, config))
 | 
					        self.override(merge_dicts(current_config, config))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def from_yaml(self, filepath, required=UNDEFINED, loader=None, envs_required=False):
 | 
					    def from_yaml(self, filepath, required=UNDEFINED, loader=None, envs_required=UNDEFINED):
 | 
				
			||||||
        """Load configuration from the yaml file.
 | 
					        """Load configuration from the yaml file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Loaded configuration is merged recursively over existing configuration.
 | 
					        Loaded configuration is merged recursively over existing configuration.
 | 
				
			||||||
| 
						 | 
					@ -2078,7 +2078,7 @@ cdef class Configuration(Object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config_content = _resolve_config_env_markers(
 | 
					        config_content = _resolve_config_env_markers(
 | 
				
			||||||
            config_content,
 | 
					            config_content,
 | 
				
			||||||
            envs_required=envs_required or self._is_strict_mode_enabled(),
 | 
					            envs_required=envs_required if envs_required is not UNDEFINED else self._is_strict_mode_enabled(),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        config = yaml.load(config_content, loader)
 | 
					        config = yaml.load(config_content, loader)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from dependency_injector import providers
 | 
					from dependency_injector import providers
 | 
				
			||||||
from pytest import fixture
 | 
					from pytest import fixture, mark
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@fixture
 | 
					@fixture
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ def ini_config_file_2(tmp_path):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@fixture
 | 
					@fixture
 | 
				
			||||||
def ini_config_file_3(tmp_path):
 | 
					def ini_config_file_3(tmp_path):
 | 
				
			||||||
    ini_config_file_3 = str(tmp_path / "config_1.ini")
 | 
					    ini_config_file_3 = str(tmp_path / "config_3.ini")
 | 
				
			||||||
    with open(ini_config_file_3, "w") as file:
 | 
					    with open(ini_config_file_3, "w") as file:
 | 
				
			||||||
        file.write(
 | 
					        file.write(
 | 
				
			||||||
            "[section1]\n"
 | 
					            "[section1]\n"
 | 
				
			||||||
| 
						 | 
					@ -91,7 +91,7 @@ def yaml_config_file_2(tmp_path):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@fixture
 | 
					@fixture
 | 
				
			||||||
def yaml_config_file_3(tmp_path):
 | 
					def yaml_config_file_3(tmp_path):
 | 
				
			||||||
    yaml_config_file_3 = str(tmp_path / "config_1.yml")
 | 
					    yaml_config_file_3 = str(tmp_path / "config_3.yml")
 | 
				
			||||||
    with open(yaml_config_file_3, "w") as file:
 | 
					    with open(yaml_config_file_3, "w") as file:
 | 
				
			||||||
        file.write(
 | 
					        file.write(
 | 
				
			||||||
            "section1:\n"
 | 
					            "section1:\n"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +63,17 @@ def test_missing_envs_strict_mode(config, ini_config_file_3):
 | 
				
			||||||
        config.from_ini(ini_config_file_3)
 | 
					        config.from_ini(ini_config_file_3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
 | 
					def test_missing_envs_not_required_in_strict_mode(config, ini_config_file_3):
 | 
				
			||||||
 | 
					    with open(ini_config_file_3, "w") as file:
 | 
				
			||||||
 | 
					        file.write(
 | 
				
			||||||
 | 
					            "[section]\n"
 | 
				
			||||||
 | 
					            "undefined=${UNDEFINED}\n"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    config.from_ini(ini_config_file_3, envs_required=False)
 | 
				
			||||||
 | 
					    assert config.section.undefined() == ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_option_missing_envs_not_required(config, ini_config_file_3):
 | 
					def test_option_missing_envs_not_required(config, ini_config_file_3):
 | 
				
			||||||
    del os.environ["CONFIG_TEST_ENV"]
 | 
					    del os.environ["CONFIG_TEST_ENV"]
 | 
				
			||||||
    del os.environ["CONFIG_TEST_PATH"]
 | 
					    del os.environ["CONFIG_TEST_PATH"]
 | 
				
			||||||
| 
						 | 
					@ -93,6 +104,18 @@ def test_option_missing_envs_required(config, ini_config_file_3):
 | 
				
			||||||
        config.option.from_ini(ini_config_file_3, envs_required=True)
 | 
					        config.option.from_ini(ini_config_file_3, envs_required=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
 | 
					def test_option_missing_envs_not_required_in_strict_mode(config, ini_config_file_3):
 | 
				
			||||||
 | 
					    config.override({"option": {}})
 | 
				
			||||||
 | 
					    with open(ini_config_file_3, "w") as file:
 | 
				
			||||||
 | 
					        file.write(
 | 
				
			||||||
 | 
					            "[section]\n"
 | 
				
			||||||
 | 
					            "undefined=${UNDEFINED}\n"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    config.option.from_ini(ini_config_file_3, envs_required=False)
 | 
				
			||||||
 | 
					    assert config.option.section.undefined() == ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@mark.parametrize("config_type", ["strict"])
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
def test_option_missing_envs_strict_mode(config, ini_config_file_3):
 | 
					def test_option_missing_envs_strict_mode(config, ini_config_file_3):
 | 
				
			||||||
    with open(ini_config_file_3, "w") as file:
 | 
					    with open(ini_config_file_3, "w") as file:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,6 +64,17 @@ def test_missing_envs_strict_mode(config, yaml_config_file_3):
 | 
				
			||||||
        config.from_yaml(yaml_config_file_3)
 | 
					        config.from_yaml(yaml_config_file_3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
 | 
					def test_missing_envs_not_required_in_strict_mode(config, yaml_config_file_3):
 | 
				
			||||||
 | 
					    with open(yaml_config_file_3, "w") as file:
 | 
				
			||||||
 | 
					        file.write(
 | 
				
			||||||
 | 
					            "section:\n"
 | 
				
			||||||
 | 
					            "  undefined: ${UNDEFINED}\n"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    config.from_yaml(yaml_config_file_3, envs_required=False)
 | 
				
			||||||
 | 
					    assert config.section.undefined() is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_option_missing_envs_not_required(config, yaml_config_file_3):
 | 
					def test_option_missing_envs_not_required(config, yaml_config_file_3):
 | 
				
			||||||
    del os.environ["CONFIG_TEST_ENV"]
 | 
					    del os.environ["CONFIG_TEST_ENV"]
 | 
				
			||||||
    del os.environ["CONFIG_TEST_PATH"]
 | 
					    del os.environ["CONFIG_TEST_PATH"]
 | 
				
			||||||
| 
						 | 
					@ -94,6 +105,18 @@ def test_option_missing_envs_required(config, yaml_config_file_3):
 | 
				
			||||||
        config.option.from_yaml(yaml_config_file_3, envs_required=True)
 | 
					        config.option.from_yaml(yaml_config_file_3, envs_required=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
 | 
					def test_option_missing_envs_not_required_in_strict_mode(config, yaml_config_file_3):
 | 
				
			||||||
 | 
					    config.override({"option": {}})
 | 
				
			||||||
 | 
					    with open(yaml_config_file_3, "w") as file:
 | 
				
			||||||
 | 
					        file.write(
 | 
				
			||||||
 | 
					            "section:\n"
 | 
				
			||||||
 | 
					            "  undefined: ${UNDEFINED}\n"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    config.option.from_yaml(yaml_config_file_3, envs_required=False)
 | 
				
			||||||
 | 
					    assert config.option.section.undefined() is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@mark.parametrize("config_type", ["strict"])
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
def test_option_missing_envs_strict_mode(config, yaml_config_file_3):
 | 
					def test_option_missing_envs_strict_mode(config, yaml_config_file_3):
 | 
				
			||||||
    with open(yaml_config_file_3, "w") as file:
 | 
					    with open(yaml_config_file_3, "w") as file:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,3 +72,26 @@ def test_not_required_file_does_not_exist_strict_mode(config):
 | 
				
			||||||
    config.set_yaml_files(["./does_not_exist.yml"])
 | 
					    config.set_yaml_files(["./does_not_exist.yml"])
 | 
				
			||||||
    config.load(required=False)
 | 
					    config.load(required=False)
 | 
				
			||||||
    assert config() == {}
 | 
					    assert config() == {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test_missing_envs_required(config, yaml_config_file_3):
 | 
				
			||||||
 | 
					    with open(yaml_config_file_3, "w") as file:
 | 
				
			||||||
 | 
					        file.write(
 | 
				
			||||||
 | 
					            "section:\n"
 | 
				
			||||||
 | 
					            "  undefined: ${UNDEFINED}\n"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    config.set_yaml_files([yaml_config_file_3])
 | 
				
			||||||
 | 
					    with raises(ValueError, match="Missing required environment variable \"UNDEFINED\""):
 | 
				
			||||||
 | 
					        config.load(envs_required=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mark.parametrize("config_type", ["strict"])
 | 
				
			||||||
 | 
					def test_missing_envs_not_required_in_strict_mode(config, yaml_config_file_3):
 | 
				
			||||||
 | 
					    with open(yaml_config_file_3, "w") as file:
 | 
				
			||||||
 | 
					        file.write(
 | 
				
			||||||
 | 
					            "section:\n"
 | 
				
			||||||
 | 
					            "  undefined: ${UNDEFINED}\n"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    config.set_yaml_files([yaml_config_file_3])
 | 
				
			||||||
 | 
					    config.load(envs_required=False)
 | 
				
			||||||
 | 
					    assert config.section.undefined() is None
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user