@@ -33,6 +33,7 @@ class Entry:
3333 value : str
3434 transform : bool
3535 skip_if_set : bool
36+ unset : bool = False
3637
3738
3839@pytest .hookimpl (tryfirst = True )
@@ -43,20 +44,24 @@ def pytest_load_initial_conftests(
4344) -> None :
4445 """Load environment variables from configuration files."""
4546 for entry in _load_values (early_config ):
46- if entry .skip_if_set and entry .key in os .environ :
47+ if entry .unset :
48+ os .environ .pop (entry .key , None )
49+ elif entry .skip_if_set and entry .key in os .environ :
4750 continue
48- # transformation -> replace environment variables, e.g. TEST_DIR={USER}/repo_test_dir.
49- os .environ [entry .key ] = entry .value .format (** os .environ ) if entry .transform else entry .value
51+ else :
52+ # transformation -> replace environment variables, e.g. TEST_DIR={USER}/repo_test_dir.
53+ os .environ [entry .key ] = entry .value .format (** os .environ ) if entry .transform else entry .value
5054
5155
5256def _parse_toml_config (config : dict [str , Any ]) -> Generator [Entry , None , None ]:
5357 for key , entry in config .items ():
5458 if isinstance (entry , dict ):
55- value = str (entry ["value" ])
59+ unset = bool (entry .get ("unset" ))
60+ value = str (entry .get ("value" , "" )) if not unset else ""
5661 transform , skip_if_set = bool (entry .get ("transform" )), bool (entry .get ("skip_if_set" ))
5762 else :
58- value , transform , skip_if_set = str (entry ), False , False
59- yield Entry (key , value , transform , skip_if_set )
63+ value , transform , skip_if_set , unset = str (entry ), False , False , False
64+ yield Entry (key , value , transform , skip_if_set , unset = unset )
6065
6166
6267def _load_values (early_config : pytest .Config ) -> Iterator [Entry ]:
@@ -91,6 +96,8 @@ def _load_values(early_config: pytest.Config) -> Iterator[Entry]:
9196 transform = "R" not in flags
9297 # D: is a way to mark the value to be set only if it does not exist yet
9398 skip_if_set = "D" in flags
99+ # U: is a way to unset (remove) an environment variable
100+ unset = "U" in flags
94101 key = ini_key_parts [- 1 ].strip ()
95102 value = parts [2 ].strip ()
96- yield Entry (key , value , transform , skip_if_set )
103+ yield Entry (key , value , transform , skip_if_set , unset = unset )
0 commit comments