From 8ed3cfa35f9265807bd6cdc89ff53e8cf0b548bf Mon Sep 17 00:00:00 2001 From: Turtle-Hwan Date: Sun, 4 Jan 2026 23:37:42 +0900 Subject: [PATCH 1/2] Handle inline comments with empty values in parser --- src/dotenv/parser.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dotenv/parser.py b/src/dotenv/parser.py index eb100b47..f62dfcc9 100644 --- a/src/dotenv/parser.py +++ b/src/dotenv/parser.py @@ -21,7 +21,7 @@ def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: _export = make_regex(r"(?:export[^\S\r\n]+)?") _single_quoted_key = make_regex(r"'([^']+)'") _unquoted_key = make_regex(r"([^=\#\s]+)") -_equal_sign = make_regex(r"(=[^\S\r\n]*)") +_equal_sign = make_regex(r"(=)") _single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") _double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') _unquoted_value = make_regex(r"([^\r\n]*)") @@ -155,7 +155,16 @@ def parse_binding(reader: Reader) -> Binding: reader.read_regex(_whitespace) if reader.peek(1) == "=": reader.read_regex(_equal_sign) - value: Optional[str] = parse_value(reader) + + start_position = reader.position.chars + reader.read_regex(_whitespace) + consumed_whitespace = reader.position.chars > start_position + + is_inline_comment = consumed_whitespace and reader.peek(1) == "#" + if is_inline_comment: + value: Optional[str] = "" + else: + value = parse_value(reader) else: value = None reader.read_regex(_comment) From e8ba8a4c39690daed1fa7556a415f6bdf58e5f99 Mon Sep 17 00:00:00 2001 From: Turtle-Hwan Date: Sun, 4 Jan 2026 23:49:04 +0900 Subject: [PATCH 2/2] Add tests for inline comments with empty values in parser --- tests/test_parser.py | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tests/test_parser.py b/tests/test_parser.py index 43386e5a..6a9b8fbf 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -119,6 +119,72 @@ ) ], ), + ( + "a= # comment", + [ + Binding( + key="a", + value="", + original=Original(string="a= # comment", line=1), + error=False, + ) + ], + ), + ( + "a=# comment", + [ + Binding( + key="a", + value="# comment", + original=Original(string="a=# comment", line=1), + error=False, + ) + ], + ), + ( + "a=\t# comment", + [ + Binding( + key="a", + value="", + original=Original(string="a=\t# comment", line=1), + error=False, + ) + ], + ), + ( + 'a=""', + [ + Binding( + key="a", + value="", + original=Original(string='a=""', line=1), + error=False, + ) + ], + ), + ( + "a=## comment", + [ + Binding( + key="a", + value="## comment", + original=Original(string="a=## comment", line=1), + error=False, + ) + ], + ), + ( + "a=# # comment", + [ + Binding( + key="a", + value="#", + original=Original(string="a=# # comment", line=1), + error=False, + ) + ], + ), ( "a=b c", [