Skip to content

Commit 2bba27a

Browse files
authored
Bugfix: include expr in variable definitions when writing to file (#87)
* correct release date for v0.4.2 * Fix equation generator and activate test. * Fix and activate second test. * Add get_parents to utils. * Rename writer.eq and writer.var to neweq and newvar. * Fix VariableWriter and add test. * Replace value by default in VariableWriter * Add VariableWriter.var and test * Add EquationWriter.eq and failing test. * Add imports of functions. * Remove eval from utils. * fix utils. * Clean up test * Replace domain by assumptions * Fix to _generator.py * Fix examples in _generator. * Fix examples in _generator. * Update jupyter examples * update docu * Fix spaces. * Update jupyter examples * Fix pydocstyle * Add failing test of VariableWriter with expr in variable. * Fix VariableWriter and move test to test_variable_writer.py * Remove unused function. * Update CHANGES.rst
1 parent 08eb362 commit 2bba27a

File tree

4 files changed

+59
-56
lines changed

4 files changed

+59
-56
lines changed

CHANGES.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
Changes
22
=======
33

4+
``v0.4.3``
5+
----------
6+
*released 2020-06-18*
7+
8+
Bug Fixes
9+
~~~~~~~~~
10+
- **utils:** Include expr in variable definitions when writing to file
11+
(`PR #87 <https://github.com/environmentalscience/essm/pull/87>`__)
12+
13+
14+
Features
15+
~~~~~~~~
16+
17+
- **documentation:** Add use examples as Jupyter notebooks and integrate in documentation
18+
(`PR #83 <https://github.com/environmentalscience/essm/pull/83>`__)
19+
20+
- **utils:** Enable writers of .py files for re-import of variable and equation definitions
21+
(`PR #84 <https://github.com/environmentalscience/essm/pull/84>`__)
22+
23+
424
``v0.4.2``
525
----------
626
*released 2020-04-28*

essm/_generator.py

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class {name}(Variable):
7878
assumptions = {assumptions!r}
7979
latex_name = {latex_name!r}
8080
{default}
81+
{expr}
8182
"""
8283

8384
# CONSTANTS = re.compile(r'\b(e|pi)\b')
@@ -96,38 +97,6 @@ def _lint_content(content):
9697
return content
9798

9899

99-
def create_module(name, doc=None, folder=None, overwrite=False):
100-
"""Create folder with init file."""
101-
name_path = (name.replace('.', os.path.sep), ) \
102-
if not isinstance(name, (tuple, list)) \
103-
else name
104-
folder = folder or pkg_resources.resource_filename('essm', '')
105-
path = os.path.join(folder, *name_path)
106-
try:
107-
os.makedirs(path)
108-
logger.info('Created new folder: {0}'.format(path))
109-
except OSError as e1:
110-
logger.error('Could not create new folder: {0}'.format(path))
111-
112-
init_path = os.path.join(path, '__init__.py')
113-
114-
if os.path.isfile(init_path):
115-
logger.info(
116-
'{0} already exists. Use `overwrite=True` to overwrite.'.
117-
format(init_path)
118-
)
119-
120-
if overwrite or not os.path.isfile(init_path):
121-
with open(init_path, 'w') as file_out:
122-
file_out.write(
123-
LICENSE_TPL.format(year=datetime.datetime.now().year)
124-
)
125-
file_out.write('"""{0}"""\n'.format(doc))
126-
logger.debug('Created file {0}.'.format(init_path))
127-
128-
return path
129-
130-
131100
def extract_functions(expr):
132101
"""Traverse through expression and return set of functions."""
133102
return {
@@ -207,22 +176,30 @@ def newvar(
207176
units=None,
208177
assumptions={'real': True},
209178
latex_name=None,
210-
default=None
179+
default=None,
180+
expr=None
211181
):
212182
"""Add new variable."""
213183
if not latex_name:
214184
latex_name = name
215185
if default is None:
216-
default = ''
186+
default = 'default = None'
217187
else:
218188
default = 'default = ' + str(default)
189+
if expr is None:
190+
expr = ''
191+
else:
192+
expr = 'expr = ' + str(expr)
193+
219194
context = {
220195
"name": name,
221196
"doc": doc,
222197
"units": str(units).replace('^', '**') if units else '1/1',
223198
"assumptions": assumptions,
224199
"latex_name": latex_name,
225-
"default": default
200+
"default": default,
201+
"expr": expr
202+
226203
}
227204
self.vars.append(context)
228205

@@ -252,7 +229,8 @@ def var(self, var1):
252229
assumptions = dict_attr.get('assumptions')
253230
latex_name = dict_attr.get('latex_name')
254231
value = dict_attr.get('default')
255-
self.newvar(name, doc, units, assumptions, latex_name, value)
232+
expr = dict_attr.get('expr')
233+
self.newvar(name, doc, units, assumptions, latex_name, value, expr)
256234

257235
def write(self, filename):
258236
"""Serialize itself to a filename."""

tests/test_equations.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -303,26 +303,6 @@ def test_solve():
303303
) == [0.031 * demo_d - 1.68e-7 * demo_d2]
304304

305305

306-
def test_variable_writer(tmpdir):
307-
"""VariableWriter creates importable file with variable definitions."""
308-
from essm.variables.physics.thermodynamics import c_pa
309-
g = {}
310-
writer_td = VariableWriter(docstring='Test of Variable_writer.')
311-
writer_td.newvar(
312-
'g',
313-
'meter / second ^ 2',
314-
'default = 9.81'
315-
)
316-
writer_td.var(c_pa)
317-
eq_file = tmpdir.mkdir('test').join('test_variables.py')
318-
writer_td.write(eq_file.strpath)
319-
with open(eq_file, "rb") as source_file:
320-
code = compile(eq_file.read(), eq_file, "exec")
321-
exec(code, g)
322-
assert g['g'].definition.default == 9.81
323-
assert g['c_pa'].definition.unit == c_pa.definition.unit
324-
325-
326306
def test_equation_writer(tmpdir):
327307
"""EquationWriter creates importable file with internal variables."""
328308
from sympy import var

tests/test_variables.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import pytest
55

66
from essm.variables import Variable
7+
from essm._generator import VariableWriter
78
from essm.variables.units import (derive_baseunit, derive_unit, joule,
89
kilogram, markdown, meter, second)
910
from essm.variables.utils import generate_metadata_table
@@ -179,3 +180,27 @@ def test_generate_metadata_table():
179180
'Test expression variable.', '$2 demo_variable$', '-', 'm'),
180181
('$E_l$', 'E_l',
181182
'Latent heat flux from leaf.', '', '-', 'J s$^{-1}$ m$^{-2}$')]
183+
184+
185+
def test_variable_writer(tmpdir):
186+
"""VariableWriter creates importable file with variable definitions."""
187+
from essm.variables.physics.thermodynamics import c_pa
188+
g = {}
189+
writer_td = VariableWriter(docstring='Test of Variable_writer.')
190+
writer_td.newvar(
191+
'g',
192+
units=meter / second ** 2,
193+
default=9.81
194+
)
195+
writer_td.var(c_pa)
196+
writer_td.var(demo_variable)
197+
writer_td.var(demo_expression_variable)
198+
eq_file = tmpdir.mkdir('test').join('test_variables.py')
199+
writer_td.write(eq_file.strpath)
200+
with open(eq_file, "rb") as source_file:
201+
code = compile(eq_file.read(), eq_file, "exec")
202+
exec(code, g)
203+
assert g['g'].definition.default == 9.81
204+
assert g['c_pa'].definition.unit == c_pa.definition.unit
205+
assert g['demo_expression_variable'].definition.expr \
206+
== demo_expression_variable.definition.expr

0 commit comments

Comments
 (0)