Skip to content

Commit a02bfac

Browse files
ulyssessouzabbc2
authored andcommitted
Add control over interpolation
Signed-off-by: Ulysses Souza <[email protected]>
1 parent a8daa7c commit a02bfac

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

src/dotenv/main.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ def with_warn_for_invalid_lines(mappings):
4646

4747
class DotEnv():
4848

49-
def __init__(self, dotenv_path, verbose=False, encoding=None):
50-
# type: (Union[Text, _PathLike, _StringIO], bool, Union[None, Text]) -> None
49+
def __init__(self, dotenv_path, verbose=False, encoding=None, interpolate=True):
50+
# type: (Union[Text, _PathLike, _StringIO], bool, Union[None, Text], bool) -> None
5151
self.dotenv_path = dotenv_path # type: Union[Text,_PathLike, _StringIO]
5252
self._dict = None # type: Optional[Dict[Text, Optional[Text]]]
5353
self.verbose = verbose # type: bool
5454
self.encoding = encoding # type: Union[None, Text]
55+
self.interpolate = interpolate # type: bool
5556

5657
@contextmanager
5758
def _get_stream(self):
@@ -73,7 +74,7 @@ def dict(self):
7374
return self._dict
7475

7576
values = OrderedDict(self.parse())
76-
self._dict = resolve_nested_variables(values)
77+
self._dict = resolve_nested_variables(values) if self.interpolate else values
7778
return self._dict
7879

7980
def parse(self):
@@ -286,8 +287,8 @@ def _is_interactive():
286287
return ''
287288

288289

289-
def load_dotenv(dotenv_path=None, stream=None, verbose=False, override=False, **kwargs):
290-
# type: (Union[Text, _PathLike, None], Optional[_StringIO], bool, bool, Union[None, Text]) -> bool
290+
def load_dotenv(dotenv_path=None, stream=None, verbose=False, override=False, interpolate=True, **kwargs):
291+
# type: (Union[Text, _PathLike, None], Optional[_StringIO], bool, bool, bool, Union[None, Text]) -> bool
291292
"""Parse a .env file and then load all the variables found as environment variables.
292293
293294
- *dotenv_path*: absolute or relative path to .env file.
@@ -297,10 +298,10 @@ def load_dotenv(dotenv_path=None, stream=None, verbose=False, override=False, **
297298
Defaults to `False`.
298299
"""
299300
f = dotenv_path or stream or find_dotenv()
300-
return DotEnv(f, verbose=verbose, **kwargs).set_as_environment_variables(override=override)
301+
return DotEnv(f, verbose=verbose, interpolate=interpolate, **kwargs).set_as_environment_variables(override=override)
301302

302303

303-
def dotenv_values(dotenv_path=None, stream=None, verbose=False, **kwargs):
304-
# type: (Union[Text, _PathLike, None], Optional[_StringIO], bool, Union[None, Text]) -> Dict[Text, Optional[Text]]
304+
def dotenv_values(dotenv_path=None, stream=None, verbose=False, interpolate=True, **kwargs):
305+
# type: (Union[Text, _PathLike, None], Optional[_StringIO], bool, bool, Union[None, Text]) -> Dict[Text, Optional[Text]] # noqa: E501
305306
f = dotenv_path or stream or find_dotenv()
306-
return DotEnv(f, verbose=verbose, **kwargs).dict()
307+
return DotEnv(f, verbose=verbose, interpolate=interpolate, **kwargs).dict()

tests/test_core.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,22 @@ def test_dotenv_values_stream():
147147
assert parsed_dict['DOTENV'] == u'it works!😃'
148148

149149

150+
def test_dotenv_values_no_interpolate():
151+
stream = StringIO(u'no_interpolate=$MYVAR')
152+
stream.seek(0)
153+
parsed_dict = dotenv_values(stream=stream, interpolate=False)
154+
assert 'no_interpolate' in parsed_dict
155+
assert parsed_dict['no_interpolate'] == u'$MYVAR'
156+
157+
158+
def test_dotenv_values_no_interpolate_strict():
159+
stream = StringIO(u'no_interpolate_strict=${MYVAR}')
160+
stream.seek(0)
161+
parsed_dict = dotenv_values(stream=stream, interpolate=False)
162+
assert 'no_interpolate_strict' in parsed_dict
163+
assert parsed_dict['no_interpolate_strict'] == u'${MYVAR}'
164+
165+
150166
def test_dotenv_values_export():
151167
stream = StringIO('export foo=bar\n')
152168
stream.seek(0)

0 commit comments

Comments
 (0)