From d29e0e9f789bbd056abf9dcefcdbe8f16451be9a Mon Sep 17 00:00:00 2001 From: Mayur Dhavan <118877752+mayur-dhavan@users.noreply.github.com> Date: Mon, 26 Oct 2026 00:07:09 +0530 Subject: [PATCH 1/2] Apply ${name:-default} when the variable is set but empty --- src/dotenv/variables.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dotenv/variables.py b/src/dotenv/variables.py index 667f2f26..5554b4dc 100644 --- a/src/dotenv/variables.py +++ b/src/dotenv/variables.py @@ -64,7 +64,12 @@ def __hash__(self) -> int: def resolve(self, env: Mapping[str, Optional[str]]) -> str: default = self.default if self.default is not None else "" result = env.get(self.name, default) - return result if result is not None else "" + if result is None: + return "" + # POSIX ${name:-default} also applies when the variable is set but empty. + if result == "" and self.default is not None: + return self.default + return result def parse_variables(value: str) -> Iterator[Atom]: From 31aecc08b552918365b0f282e953fa4f27896f88 Mon Sep 17 00:00:00 2001 From: Mayur Dhavan <118877752+mayur-dhavan@users.noreply.github.com> Date: Mon, 26 Oct 2026 00:07:44 +0530 Subject: [PATCH 2/2] Test ${name:-default} with a set-but-empty variable --- tests/test_main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index 930ab171..38592997 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -894,6 +894,10 @@ def test_dotenv_values_file(dotenv_path): # Undefined ({}, "a=${b}", True, {"a": ""}), ({}, "a=${b:-d}", True, {"a": "d"}), + # Defined but empty: ${name:-default} applies (POSIX semantics) + ({"b": ""}, "a=${b:-d}", True, {"a": "d"}), + ({}, "b=\na=${b:-d}", True, {"a": "d", "b": ""}), + ({"b": ""}, "a=${b}", True, {"a": ""}), # With quotes ({"b": "c"}, 'a="${b}"', True, {"a": "c"}), ({"b": "c"}, "a='${b}'", True, {"a": "c"}),