Skip to content

Commit fa2d30b

Browse files
committed
Test that shows jinja can use generator functions
To keep the load small, we need to write files via generators, not simply via one big string. Using file.writelines() is buffered, and the dask array is buffered.
1 parent 489cda9 commit fa2d30b

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

flopy4/xarray_jinja/filters.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import numpy as np
2+
import xarray as xr
3+
4+
5+
def dask_expand(data: xr.DataArray):
6+
for block in data.data.blocks:
7+
block_data = block.compute()
8+
yield block_data
9+
10+
11+
def nparray2string(data: np.ndarray):
12+
return " ".join(data.astype(str))
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
BEGIN GRIDDATA
2+
{% for chunk in data | dask_expand %}
3+
{{chunk | nparray2string }}
4+
{% endfor %}
5+
END GRIDDATA

test/test_xarray_jinja.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import dask.array as da
2+
import jinja2
3+
import xarray as xr
4+
5+
import flopy4.xarray_jinja.filters as filters
6+
7+
8+
def test_xarray_to_text_jinja(tmp_path):
9+
data = xr.DataArray(da.arange(0, 10_000, 1), dims="x")
10+
data = data.chunk(100)
11+
12+
env = jinja2.Environment(
13+
loader=jinja2.PackageLoader("flopy4.xarray_jinja"),
14+
trim_blocks=True,
15+
lstrip_blocks=True,
16+
)
17+
env.filters["dask_expand"] = filters.dask_expand
18+
env.filters["nparray2string"] = filters.nparray2string
19+
20+
generator = env.get_template("disu_template.disu.jinja").generate(
21+
data=data
22+
)
23+
with open(tmp_path / "test_xarray_to_text_jinja.disu", "w") as f:
24+
f.writelines(generator)
25+
26+
with open(tmp_path / "test_xarray_to_text_jinja.disu", "r") as f:
27+
output = f.readlines()
28+
assert len(output) == 102 # begin + end + 100 lines of data

0 commit comments

Comments
 (0)