Skip to content

Commit 89de186

Browse files
committed
added jinja template formatting
1 parent 8868524 commit 89de186

4 files changed

Lines changed: 42 additions & 0 deletions

File tree

dotenv/main.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import re
99
from collections import OrderedDict
1010

11+
from jinja2 import Template
12+
1113
__escape_decoder = codecs.getdecoder('unicode_escape')
1214
__posix_variable = re.compile('\$\{[^\}]*\}')
1315

@@ -16,6 +18,13 @@ def decode_escaped(escaped):
1618
return __escape_decoder(escaped)[0]
1719

1820

21+
def jinja_templating(variable):
22+
if "{{" in variable:
23+
template = Template(variable)
24+
return template.render(**os.environ)
25+
return variable
26+
27+
1928
def load_dotenv(dotenv_path, verbose=False, override=False):
2029
"""
2130
Read a .env file and load into os.environ.
@@ -25,6 +34,7 @@ def load_dotenv(dotenv_path, verbose=False, override=False):
2534
warnings.warn("Not loading %s - it doesn't exist." % dotenv_path)
2635
return None
2736
for k, v in dotenv_values(dotenv_path).items():
37+
v = jinja_templating(v)
2838
if override:
2939
os.environ[k] = v
3040
else:

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ wheel
66
pytest-cov
77
click
88
ipython
9+
Jinja2==2.7

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
packages=['dotenv'],
2222
install_requires=[
2323
'click>=5.0',
24+
'Jinja2==2.7',
2425
],
2526
entry_points='''
2627
[console_scripts]

tests/test_core.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,36 @@ def test_load_dotenv_override(cli):
8787
sh.rm(dotenv_path)
8888

8989

90+
def test_load_dotenv_variable_jinja_formatting(cli):
91+
dotenv_path = '.test_load_dotenv_variable_formatting'
92+
93+
with cli.isolated_filesystem():
94+
sh.touch(dotenv_path)
95+
set_key(dotenv_path, 'a', 'foo')
96+
set_key(dotenv_path, 'b', '{{a}}/bar')
97+
set_key(dotenv_path, 'c', '{bar}')
98+
success = load_dotenv(dotenv_path)
99+
assert success
100+
assert os.environ['a'] == 'foo'
101+
assert os.environ['b'] == 'foo/bar'
102+
assert os.environ['c'] == '{bar}'
103+
sh.rm(dotenv_path)
104+
105+
106+
def test_load_dotenv_variable_filtering(cli):
107+
dotenv_path = '.test_load_dotenv_variable_formatting'
108+
with cli.isolated_filesystem():
109+
sh.touch(dotenv_path)
110+
set_key(dotenv_path, 'd', 'foo')
111+
set_key(dotenv_path, 'e', '{{a|upper}}')
112+
success = load_dotenv(dotenv_path)
113+
assert success
114+
assert os.environ['d'] == 'foo'
115+
assert os.environ['e'] == os.environ['a'].upper()
116+
sh.rm(dotenv_path)
117+
118+
119+
90120
def test_ipython():
91121
tmpdir = os.path.realpath(tempfile.mkdtemp())
92122
os.chdir(tmpdir)

0 commit comments

Comments
 (0)