tvalidate_config.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
       ---
       tvalidate_config.py (2695B)
       ---
            1 #!/usr/bin/env python3
            2 
            3 import json
            4 import jsonschema
            5 import copy
            6 
            7 # Shortcuts to save some typing:
            8 integer_t = {"type": "integer"}
            9 number_t = {"type": "number"}
           10 string_t = {"type": "string"}
           11 flag_t = {"type": "flag"}
           12 
           13 # A generic entry:
           14 entry = {
           15     "type": "object",
           16     "properties": {
           17         "doc": string_t,
           18         "reference": string_t,
           19         "comment": string_t
           20     },
           21     "required": ["doc", "value", "type"],
           22     "additionalProperties": False
           23 }
           24 
           25 
           26 def gen_type(keyword):
           27     return {"type": "string", "pattern": "^%s$" % keyword}
           28 
           29 
           30 # numerical configuration parameters
           31 number = copy.deepcopy(entry)
           32 number['properties']['value'] = number_t
           33 number['properties']['units'] = string_t
           34 number['properties']['type'] = gen_type("number")
           35 number['required'].append('units')
           36 
           37 # integer configuration parameters
           38 integer = copy.deepcopy(number)
           39 integer['properties']['value'] = integer_t
           40 integer['properties']['type'] = gen_type("integer")
           41 
           42 # strings
           43 string = copy.deepcopy(entry)
           44 string['properties']['value'] = string_t
           45 string['properties']['type'] = gen_type("string")
           46 
           47 # keywords ("choose one of...")
           48 keyword = copy.deepcopy(string)
           49 keyword['properties']['choices'] = {
           50     "type": "array",
           51     "minItems": 2,
           52     "items": {
           53         "type": "string"
           54     }
           55 }
           56 
           57 # configuration flags
           58 flag = copy.deepcopy(entry)
           59 flag['properties']['type'] = gen_type("flag")
           60 flag['properties']['value'] = flag_t
           61 
           62 # assembled schema
           63 config_schema = {
           64     "$schema": "http://json-schema.org/draft-04/schema#",
           65     "type": "object",
           66     "definitions": {
           67         "number": number,
           68         "integer": integer,
           69         "string": string,
           70         "keyword": keyword,
           71         "flag": flag,
           72     },
           73     "properties": {
           74         "doc": string_t,
           75         "comment": string_t,
           76         "reference": string_t,
           77     },
           78     "required": ["doc"],
           79     "additionalProperties": {
           80         "anyOf": [
           81             {"$ref": "#"},
           82             {"$ref": "#/definitions/number"},
           83             {"$ref": "#/definitions/integer"},
           84             {"$ref": "#/definitions/string"},
           85             {"$ref": "#/definitions/keyword"},
           86             {"$ref": "#/definitions/flag"},
           87         ]
           88     }
           89 }
           90 
           91 
           92 def reload_data():
           93     f = open("pism_config.json")
           94     j = json.load(f)
           95     f.close()
           96 
           97     return j
           98 
           99 
          100 j = reload_data()
          101 
          102 
          103 def validate_recursively(data, path=[]):
          104     try:
          105         jsonschema.validate(data, config_schema)
          106     except jsonschema.ValidationError as e:
          107         if len(e.path) == 0:
          108             print("Failed while validating %s" % json.dumps(e.instance))
          109             print("Message:", e.message)
          110             print("Path:", ".".join(path))
          111         else:
          112             validate_recursively(e.instance, path + list(e.path))
          113 
          114 
          115 validate_recursively(j)