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