Commit 3eceda0a authored by Martin Claus's avatar Martin Claus

*Fixed* string output for index assignments

parent b3a5d90e
...@@ -62,8 +62,13 @@ class Namelist(DictClass): ...@@ -62,8 +62,13 @@ class Namelist(DictClass):
""" """
retstr = "&%s\n" % str(self.name) retstr = "&%s\n" % str(self.name)
for k, v in self.items(): for k, v in self.items():
if hasattr(v, '__iter__'): if hasattr(v, 'islower'): # is a string
retstr += "%s = (/ " % k retstr += "{} = {}\n".format(k, repr(v))
elif hasattr(v, 'items'): # is a dictionary
for i, ival in v.items():
retstr += "{}({}) = {}\n".format(k, i, repr(ival))
elif hasattr(v, 'index'): # is an array
retstr += "{} = (/ ".format(k)
tmpstr = "" tmpstr = ""
for vv in v: for vv in v:
if isinstance(vv, bool): if isinstance(vv, bool):
...@@ -226,7 +231,7 @@ def _add_value(container, value, key): ...@@ -226,7 +231,7 @@ def _add_value(container, value, key):
# test if container is a dict like object # test if container is a dict like object
container.keys() container.keys()
container[key] = value container[key] = value
except: # container is a list except AttributeError: # container is a list
container.append(value) container.append(value)
......
...@@ -58,6 +58,7 @@ def test_parse_file(string): ...@@ -58,6 +58,7 @@ def test_parse_file(string):
"&nml\nval1 = .FALSE.\n/\n", "&nml\nval1 = .FALSE.\n/\n",
"&nml\nval1 = (/ 1,2,3,4,5,6 /)\n/\n", "&nml\nval1 = (/ 1,2,3,4,5,6 /)\n/\n",
"&nml\nval1 = (/ .TRUE.,.FALSE.,.TRUE.,.TRUE. /)\n/\n", "&nml\nval1 = (/ .TRUE.,.FALSE.,.TRUE.,.TRUE. /)\n/\n",
"&nml\nval1 = 3\nval2 = 5\n/\n",
] ]
) )
def test_string_out(string): def test_string_out(string):
...@@ -189,6 +190,7 @@ def test_var_bool(string, val): ...@@ -189,6 +190,7 @@ def test_var_bool(string, val):
) )
def test_var_string(string, val): def test_var_string(string, val):
nml = namelist.parse_namelist_string(string)["nml"] nml = namelist.parse_namelist_string(string)["nml"]
print(str(nml))
assert nml["val"] == val assert nml["val"] == val
...@@ -243,30 +245,41 @@ def test_index_assignment(string, val1, d): ...@@ -243,30 +245,41 @@ def test_index_assignment(string, val1, d):
assert nml["val"] == d assert nml["val"] == d
@pytest.mark.parametrize("string", ["&nml {} /", "&nml {} val2=34 /"]) @pytest.mark.parametrize("string", ["&nml\n{}/\n", "&nml\n{}val2 = 34\n/\n"])
@pytest.mark.parametrize("val1", ["lala", "((1 + 2) + 3)", 3, 3.0, 3e6, ".T."]) @pytest.mark.parametrize(
@pytest.mark.parametrize("d", [{1: None, 2: 35},{1: None}]) "val1",
["some_string", "((1 + 2) + 3)", 3, 3.0, 3e6, ".T."]
)
@pytest.mark.parametrize("d", [{1: None, 2: 35}, {1: None}])
def test_index_assignment_to_str(string, d, val1): def test_index_assignment_to_str(string, d, val1):
val_str = ""
try: try:
int(eval(val1)) int(eval(val1))
is_expression = True is_expression = True
except: except (NameError, SyntaxError, TypeError):
is_expression = False is_expression = False
is_bool = (val1 == ".T.") is_bool = (val1 == ".T.")
d[1] = val1 d[1] = val1
val_str = ""
for k, v in d.items(): for k, v in d.items():
if is_expression | is_bool: if is_expression | is_bool:
val_str += "val({}) = {} ".format(k, v) val_str += "val({}) = {}\n".format(k, v)
else: else:
val_str += "val({}) = {} ".format(k, repr(v)) val_str += "val({}) = {}\n".format(k, repr(v))
nml_string = string.format(val_str)
nml = namelist.parse_namelist_string(nml_string)["nml"]
if is_expression: if is_expression:
d[1] = eval(d[1]) d[1] = eval(d[1])
if is_bool: if is_bool:
d[1] = (val1 == ".T.") d[1] = (val1 == ".T.")
nml_string = string.format(val_str) valid_String = ""
nml = namelist.parse_namelist_string(nml_string)["nml"] for k, v in d.items():
assert nml_string == str(nml) valid_String += "val({}) = {}\n".format(k, repr(v))
valid_String = string.format(valid_String)
print(valid_String, nml_string, str(nml))
print(is_expression, is_bool)
assert valid_String == str(nml)
@pytest.mark.parametrize("string", ["&nml val= {}, val2='lsl'/"]) @pytest.mark.parametrize("string", ["&nml val= {}, val2='lsl'/"])
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment