tlist_parameters.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
       ---
       tlist_parameters.py (3740B)
       ---
            1 #!/usr/bin/env python3
            2 
            3 import netCDF4
            4 import argparse
            5 
            6 
            7 def is_special(name):
            8     "Check if the name is 'special' and should not be included."
            9 
           10     if name == "long_name":
           11         return True
           12 
           13     for n in ["_doc", "_units", "_type", "_option", "_choices"]:
           14         if name.endswith(n):
           15             return True
           16 
           17     return False
           18 
           19 
           20 def number_to_string(number):
           21     "Format a number as a string. Use scientific notation for large and small numbers, remove '.0' from integers."
           22     if abs(number) >= 1e7:
           23         return '%e' % number  # use scientific notation if a number is big
           24     elif int(number) == number:
           25         return '%d' % int(number)  # remove zeros after the decimal point
           26     elif abs(number) <= 1e-5:
           27         return '%e' % number  # use scientific notation if small (and not zero; previous case)
           28     else:
           29         return '%f' % number
           30 
           31 
           32 def entry(name, T, value, option, description, choices=None):
           33 
           34     if len(value) == 0:
           35         value = "*no default*"
           36 
           37     if value.find(",") != -1:
           38         # A comma-separated list
           39         value = "``{}``".format(value.replace(",", ", "))
           40 
           41     if choices is not None:
           42         # This is always a comma-separated list.
           43         choices = "``{}``".format(choices.replace(",", ", "))
           44         # value is a keyword, so we should format it as a literal
           45         value = "``{}``".format(value)
           46 
           47     template = """
           48 #. :config:`{name}` (*{T}*)
           49 
           50    :Value: {value}"""
           51 
           52     if choices is not None:
           53         template += """
           54    :Choices: {choices}"""
           55 
           56     if option is not None:
           57         option = ":opt:`{}`".format(option)
           58         template += """
           59    :Option: {option}"""
           60 
           61     template += """
           62    :Description: {description}"""
           63 
           64     return template.format(name=name,
           65                            T=T,
           66                            value=value,
           67                            choices=choices,
           68                            option=option,
           69                            description=description)
           70 
           71 
           72 def print_string(var, name, T):
           73     print(entry(name,
           74                 T,
           75                 value(var, name),
           76                 option(var, name),
           77                 doc(var, name)))
           78 
           79 
           80 def print_number(var, name, T):
           81     V = "{} ({})".format(number_to_string(value(var, name)), units(var, name))
           82     print(entry(name, T, V, option(var, name), doc(var, name)))
           83 
           84 
           85 def print_integer(var, name, T):
           86     print(entry(name,
           87                 T,
           88                 str(value(var, name)),
           89                 option(var, name),
           90                 doc(var, name)))
           91 
           92 
           93 def print_keyword(var, name, T):
           94     print(entry(name,
           95                 T,
           96                 value(var, name),
           97                 option(var, name),
           98                 doc(var, name),
           99                 choices=value(var, name + "_choices")))
          100 
          101 
          102 def value(var, name):
          103     return var.getncattr(name)
          104 
          105 
          106 def units(var, name):
          107     return value(var, name + "_units")
          108 
          109 
          110 def doc(var, name):
          111     return value(var, name + "_doc")
          112 
          113 
          114 def option(var, name):
          115     try:
          116         return "-" + value(var, name + "_option")
          117     except AttributeError:
          118         return None
          119 
          120 
          121 printers = {"string":  print_string,
          122             "number":  print_number,
          123             "integer": print_integer,
          124             "flag":    print_string,
          125             "keyword": print_keyword}
          126 
          127 header = """.. -*- mode: rst -*-
          128 
          129 .. DO NOT EDIT: This file was automatically generated. Edit src/pism_config.cdl instead.
          130 """
          131 
          132 if __name__ == "__main__":
          133 
          134     parser = argparse.ArgumentParser()
          135     parser.add_argument("FILE", nargs=1)
          136     options = parser.parse_args()
          137 
          138     f = netCDF4.Dataset(options.FILE[0], 'r')
          139 
          140     var = f.variables['pism_config']
          141 
          142     print(header)
          143 
          144     for parameter in sorted(var.ncattrs()):
          145         if is_special(parameter):
          146             continue
          147 
          148         T = var.getncattr(parameter + "_type")
          149 
          150         printers[T](var, parameter, T)