Skip to content

Commit

Permalink
Fix parsing of unquoted values with two spaces
Browse files Browse the repository at this point in the history
If a value is unquoted and has two or more adjacent spaces (like in `a=b
c`), the parser would detect an error.  This commit fixes that.

Tabs are now also considered like space characters in this case and I
added relevant test cases.
  • Loading branch information
bbc2 committed Sep 9, 2020
1 parent 4b43436 commit 96a98ad
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 12 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -10,6 +10,8 @@ project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### Fixed

- Fix potentially empty expanded value for duplicate key (#260 by [@bbc]).
- Fix parsing of unquoted values containing several adjacent space or tab characters
(#277 by [@bbc]).

## [0.14.0] - 2020-07-03

Expand Down
8 changes: 4 additions & 4 deletions src/dotenv/parser.py
Expand Up @@ -24,7 +24,7 @@ def make_regex(string, extra_flags=0):
_equal_sign = make_regex(r"(=[^\S\r\n]*)")
_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'")
_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"')
_unquoted_value_part = make_regex(r"([^ \r\n]*)")
_unquoted_value_part = make_regex(r"(\S*)")
_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?")
_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)")
_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?")
Expand Down Expand Up @@ -172,9 +172,9 @@ def parse_unquoted_value(reader):
(part,) = reader.read_regex(_unquoted_value_part)
value += part
after = reader.peek(2)
if len(after) < 2 or after[0] in u"\r\n" or after[1] in u" #\r\n":
return value
value += reader.read(2)
if after[:1] not in (u" ", u"\t") or after in (u" #", u"\t#"):
return value.rstrip()
value += reader.read(1)


def parse_value(reader):
Expand Down
32 changes: 24 additions & 8 deletions tests/test_parser.py
Expand Up @@ -19,20 +19,36 @@
(u"# a=b", [Binding(key=None, value=None, original=Original(string=u"# a=b", line=1), error=False)]),
(u"a=b#c", [Binding(key=u"a", value=u"b#c", original=Original(string=u"a=b#c", line=1), error=False)]),
(
u'a=b # comment',
[Binding(key=u"a", value=u"b", original=Original(string=u"a=b # comment", line=1), error=False)],
u'a=b #c',
[Binding(key=u"a", value=u"b", original=Original(string=u"a=b #c", line=1), error=False)],
),
(
u"a=b space ",
[Binding(key=u"a", value=u"b space", original=Original(string=u"a=b space ", line=1), error=False)],
u'a=b\t#c',
[Binding(key=u"a", value=u"b", original=Original(string=u"a=b\t#c", line=1), error=False)],
),
(
u"a='b space '",
[Binding(key=u"a", value=u"b space ", original=Original(string=u"a='b space '", line=1), error=False)],
u"a=b c",
[Binding(key=u"a", value=u"b c", original=Original(string=u"a=b c", line=1), error=False)],
),
(
u'a="b space "',
[Binding(key=u"a", value=u"b space ", original=Original(string=u'a="b space "', line=1), error=False)],
u"a=b\tc",
[Binding(key=u"a", value=u"b\tc", original=Original(string=u"a=b\tc", line=1), error=False)],
),
(
u"a=b c",
[Binding(key=u"a", value=u"b c", original=Original(string=u"a=b c", line=1), error=False)],
),
(
u"a=b c ",
[Binding(key=u"a", value=u"b c", original=Original(string=u"a=b c ", line=1), error=False)],
),
(
u"a='b c '",
[Binding(key=u"a", value=u"b c ", original=Original(string=u"a='b c '", line=1), error=False)],
),
(
u'a="b c "',
[Binding(key=u"a", value=u"b c ", original=Original(string=u'a="b c "', line=1), error=False)],
),
(
u"export export_a=1",
Expand Down

0 comments on commit 96a98ad

Please sign in to comment.