From 9103774c1b7bee522cca47b3c138a05defaf013f Mon Sep 17 00:00:00 2001 From: Karl-Hermann Wieners <karl-hermann.wieners@mpimet.mpg.de> Date: Wed, 22 Jul 2015 10:56:38 +0000 Subject: [PATCH] Prepared for release 0.3.3 * Added 'raw(...)' expression to allow unquoted namelist expressions * Added 'set' test to reliably check if namelist switches are true * Updated version info and change list --- CHANGES.txt | 14 ++++++++++++++ mkexp | 12 ++++++++---- setup.py | 2 +- test.py | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 71580bf..82622cf 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,20 @@ Make Experiments! Release Changes --------------- +Release 0.3.3 +============= + +Configuration +------------- + +* Added 'raw(...)' expression to allow unquoted namelist expressions. + Needed for native variables containing lists + +Templates +--------- + +* Added 'set' test to reliably check if namelist switches are true + Release 0.3.2 ============= diff --git a/mkexp b/mkexp index 5ae28e5..e39e5b7 100755 --- a/mkexp +++ b/mkexp @@ -90,9 +90,11 @@ def move_file_to_backup(file_name, backup_name): # Namelist formatting +quote = repr + def format_atom(value): '''Format atomic value for use in namelists''' - result = repr(value) + result = quote(value) # Strip quotes from all-numeric strings result = re.sub('^(["'r"'])([-+]?(\d+\.\d*|\.?\d+)([de][-+]?\d+)?)\1$", r'\2', result, flags=re.I) @@ -102,6 +104,7 @@ def format_atom(value): result = re.sub('^(["'r"'])\.?t(rue)?\.?\1$", '.true.', result, flags=re.I) result = \ re.sub('^(["'r"'])\.?f(alse)?\.?\1$", '.false.', result, flags=re.I) + result = re.sub('^(["'r"'])raw\((.*)\)\1$", r'\2', result) return result def format_value(value, indent): @@ -208,9 +211,6 @@ def format_vars(section, key, log, fmt): # Format all list elements section[newkey] = map(transform, value) -def quote(value): - return repr(value) - # Command line parsing def value_to_list(value): @@ -313,6 +313,10 @@ template_env.filters['split'] = lambda x, s, m=-1: x.split(s, m) # - Add list operations filter and map template_env.filters['filter'] = lambda x, f=None: filter(f, x) +# Additional tests +# - Check a namelist logical +template_env.tests['set'] = lambda x: x.strip('.').lower().startswith('t') + # Read and store configuration info from input and experiments' library # Store environment as default for control settings, then add config from files diff --git a/setup.py b/setup.py index 4b14236..3795c75 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from distutils.core import setup name = 'mkexp' -version = '0.3.2' +version = '0.3.3' setup( name = name, diff --git a/test.py b/test.py index 7167fac..143c819 100644 --- a/test.py +++ b/test.py @@ -234,6 +234,39 @@ class ContentTestCase(MkexpTestCase): result = align(result) self.assertMultiLineEqual(expected, result) + def test_var_in_namelist(self): + exp_id = "test_var_in_namelist" + job_id = "job" + writeconfig(exp_id, """ + EXP_TYPE = + [namelists] + [[namelist]] + [[[group]]] + var_1 = raw($$value_1) + var_2 = raw($${value_2}) + var_3 = a, raw($$value_3), b + var_4 = a$$value_4 + var_5 = $${value_5}b + [jobs] + [["""+job_id+"""]] + """) + writetemplate(exp_id, job_id, """ + %{NAMELIST} + """) + expected = align(""" + &group + var_1 = $value_1 + var_2 = ${value_2} + var_3 = 'a', $value_3, 'b' + var_4 = 'a$value_4' + var_5 = '${value_5}b' + / + """) + ignore = output(script("mkexp "+exp_id+".config")) + result = readfile(join("test", "experiments", exp_id, exp_id+"."+job_id)) + result = align(result) + self.assertMultiLineEqual(expected, result) + def test_split_date(self): exp_id = 'test_split_date' job_id = 'job' -- GitLab