def validate()

in Chemistry/Schema/validator.py [0:0]


def validate(instance, schema):
    """
    Given a YAML-serialized object, determines if
    that object is a valid instance of a given schema.
    """
    failed = []
    schema_data = {}
    broombridge_v0_1 = "broombridge-0.1.schema.json"
    broombridge_v0_2 = "broombridge-0.2.schema.json"
    
    # Get version number
    def get_schema_name(instance_data):
        version_number = instance_data['format']['version']
        if version_number == "0.1":
            return broombridge_v0_1
        elif version_number == "0.2":
            return broombridge_v0_2
        else:
            return schema

    for schema_path in [schema, broombridge_v0_1, broombridge_v0_2]:
        with open(schema_path, 'r') as f:
            schema_data[schema_path] = json.load(f)

    for instance_path in glob(instance, recursive=True):
        with open(instance_path, 'r') as f:
            instance_data = yaml.safe_load(f)
        
        try:
            schema_name = get_schema_name(instance_data)
            jsonschema.validate(instance_data, schema_data[schema_name])
        except jsonschema.ValidationError as ex:
            print(f"Validation of {instance_path} failed with exception:\n{ex}")
            failed.append(instance_path)
        else:
            print(f"{instance_path} is a valid instance of {schema_name}.")

    if failed:
        stderr.write("\n\nThe following files failed validation:\n")
        stderr.write("\n".join(failed))
        stderr.write("\n\n")
        exit(-1)