Loading namelist/namelist.py +8 −3 Original line number Diff line number Diff line Loading @@ -62,8 +62,13 @@ class Namelist(DictClass): """ retstr = "&%s\n" % str(self.name) for k, v in self.items(): if hasattr(v, '__iter__'): retstr += "%s = (/ " % k if hasattr(v, 'islower'): # is a string 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 = "" for vv in v: if isinstance(vv, bool): Loading Loading @@ -226,7 +231,7 @@ def _add_value(container, value, key): # test if container is a dict like object container.keys() container[key] = value except: # container is a list except AttributeError: # container is a list container.append(value) Loading tests/test_parsing.py +23 −10 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ def test_parse_file(string): "&nml\nval1 = .FALSE.\n/\n", "&nml\nval1 = (/ 1,2,3,4,5,6 /)\n/\n", "&nml\nval1 = (/ .TRUE.,.FALSE.,.TRUE.,.TRUE. /)\n/\n", "&nml\nval1 = 3\nval2 = 5\n/\n", ] ) def test_string_out(string): Loading Loading @@ -189,6 +190,7 @@ def test_var_bool(string, val): ) def test_var_string(string, val): nml = namelist.parse_namelist_string(string)["nml"] print(str(nml)) assert nml["val"] == val Loading Loading @@ -243,30 +245,41 @@ def test_index_assignment(string, val1, d): assert nml["val"] == d @pytest.mark.parametrize("string", ["&nml {} /", "&nml {} val2=34 /"]) @pytest.mark.parametrize("val1", ["lala", "((1 + 2) + 3)", 3, 3.0, 3e6, ".T."]) @pytest.mark.parametrize("string", ["&nml\n{}/\n", "&nml\n{}val2 = 34\n/\n"]) @pytest.mark.parametrize( "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): val_str = "" try: int(eval(val1)) is_expression = True except: except (NameError, SyntaxError, TypeError): is_expression = False is_bool = (val1 == ".T.") d[1] = val1 val_str = "" for k, v in d.items(): if is_expression | is_bool: val_str += "val({}) = {} ".format(k, v) val_str += "val({}) = {}\n".format(k, v) 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: d[1] = eval(d[1]) if is_bool: d[1] = (val1 == ".T.") nml_string = string.format(val_str) nml = namelist.parse_namelist_string(nml_string)["nml"] assert nml_string == str(nml) valid_String = "" for k, v in d.items(): 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'/"]) Loading Loading
namelist/namelist.py +8 −3 Original line number Diff line number Diff line Loading @@ -62,8 +62,13 @@ class Namelist(DictClass): """ retstr = "&%s\n" % str(self.name) for k, v in self.items(): if hasattr(v, '__iter__'): retstr += "%s = (/ " % k if hasattr(v, 'islower'): # is a string 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 = "" for vv in v: if isinstance(vv, bool): Loading Loading @@ -226,7 +231,7 @@ def _add_value(container, value, key): # test if container is a dict like object container.keys() container[key] = value except: # container is a list except AttributeError: # container is a list container.append(value) Loading
tests/test_parsing.py +23 −10 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ def test_parse_file(string): "&nml\nval1 = .FALSE.\n/\n", "&nml\nval1 = (/ 1,2,3,4,5,6 /)\n/\n", "&nml\nval1 = (/ .TRUE.,.FALSE.,.TRUE.,.TRUE. /)\n/\n", "&nml\nval1 = 3\nval2 = 5\n/\n", ] ) def test_string_out(string): Loading Loading @@ -189,6 +190,7 @@ def test_var_bool(string, val): ) def test_var_string(string, val): nml = namelist.parse_namelist_string(string)["nml"] print(str(nml)) assert nml["val"] == val Loading Loading @@ -243,30 +245,41 @@ def test_index_assignment(string, val1, d): assert nml["val"] == d @pytest.mark.parametrize("string", ["&nml {} /", "&nml {} val2=34 /"]) @pytest.mark.parametrize("val1", ["lala", "((1 + 2) + 3)", 3, 3.0, 3e6, ".T."]) @pytest.mark.parametrize("string", ["&nml\n{}/\n", "&nml\n{}val2 = 34\n/\n"]) @pytest.mark.parametrize( "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): val_str = "" try: int(eval(val1)) is_expression = True except: except (NameError, SyntaxError, TypeError): is_expression = False is_bool = (val1 == ".T.") d[1] = val1 val_str = "" for k, v in d.items(): if is_expression | is_bool: val_str += "val({}) = {} ".format(k, v) val_str += "val({}) = {}\n".format(k, v) 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: d[1] = eval(d[1]) if is_bool: d[1] = (val1 == ".T.") nml_string = string.format(val_str) nml = namelist.parse_namelist_string(nml_string)["nml"] assert nml_string == str(nml) valid_String = "" for k, v in d.items(): 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'/"]) Loading