tconfig_test.py - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch) (HTM) git clone git://src.adamsgaard.dk/pism (DIR) Log (DIR) Files (DIR) Refs (DIR) LICENSE --- tconfig_test.py (1863B) --- 1 #!/usr/bin/env python3 2 # Checks the structure of a PISM configuration file. (This is used as a regression test.) 3 4 5 def is_special(name): 6 "Check if the name is 'special' and should not be included." 7 8 if name == "long_name": 9 return True 10 11 for n in ["_doc", "_units", "_type", "_option", "_choices"]: 12 if name.endswith(n): 13 return True 14 15 return False 16 17 18 import netCDF4 19 import sys 20 import numpy as np 21 22 config = netCDF4.Dataset(sys.argv[1]) 23 24 pism_config = config.variables['pism_config'] 25 26 attrs = pism_config.ncattrs() 27 28 for a in attrs: 29 if is_special(a): 30 continue 31 32 attr_value = getattr(pism_config, a) 33 34 if (a + "_doc") not in attrs: 35 print("Attribute {} is not documented".format(a)) 36 sys.exit(1) 37 38 if (a + "_type") not in attrs: 39 print("Attribute {} does not have a type".format(a)) 40 sys.exit(1) 41 42 attr_type = getattr(pism_config, a + "_type") 43 44 if attr_type in ["number", "integer"] and (a + "_units") not in attrs: 45 print("Attribute {} is a number, but it does not have units".format(a)) 46 sys.exit(1) 47 48 if attr_type == "flag" and attr_value not in ["yes", "no", "true", "false", "on", "off"]: 49 print("Attribute {} is a flag, but its value is {}".format(a, attr_value)) 50 sys.exit(1) 51 52 if attr_type == "keyword" and (a + "_choices") not in attrs: 53 print("Attribute {} is a keyword, but {}_choices is not set".format(a, a)) 54 sys.exit(1) 55 56 if attr_type in ["number", "integer"] and not isinstance(attr_value, (int, float, np.number)): 57 print("Attribute {} is a number, but its value is not".format(a)) 58 print(type(attr_value)) 59 sys.exit(1) 60 61 if attr_type not in ["number", "integer"] and isinstance(attr_value, (int, float)): 62 print("Attribute {} is not a number, but its value is".format(a))