--- title: "Validate Behaverse Sample Data Files" author: "Morteza Ansarinia" date: "Nov 26, 2019" output: html_document: highlight: espresso --- ```{r setup, include=FALSE} # TODO: change the current directory to where `data` and `behaverse/validators` are available. knitr::opts_knit$set(root.dir = "~/workspace/notebooks/") knitr::opts_chunk$set(echo = TRUE) library(reticulate) use_condaenv("miniconda3", conda = "auto", required = T) ``` The following code demonstrates how to validate the content of a sample json file generated by Behaverse. TODO: BUILD? ```{python} import jsonschema import json #import fastjsonschema class BehaverseJsonValidator(): """ Loads Behaverse json file from local drive, aggregate json lines into a single array, and validate the content and structure of the events. """ def __init__(self, json_schema_path: str = None): if json_schema_path is not None: with open(json_schema_path) as f: self.schema = json.load(f) @staticmethod def __join_json_lines(src_path): with open(src_path) as f: return f"[{','.join(f.readlines())}]" def convert(self, src_path, dest_path): with open(dest_path, "w") as f: f.write(self.__join_json_lines(src_path)) def validate_json(self, content): """ Validates a json object with respect to a predefined schema (json-schema-v7). If json contains errornous content, a validation error will be raised. """ assert(self.schema is not None) return jsonschema.validate(content, self.schema) def validate_json_file(self, json_path: str): """ Loads and validates a json file. Respective validation error will be raised in case of invalid structure. """ with open(json_path) as f: content = json.load(f) return self.validate_json(content) ``` This code first concats all json lines and produces a single json array, and then confirms the validity of the json file according to a provided schema. This schema contains rules to validate content, structures, conditional structures (e.g., `custom` metadata), and integrity of the stored fields. TODO: list all concerns that is being tested in a bullet list. ```{python} import os original_json_file = "data/samples/nback_demo.json" valid_json_file = "data/samples/nback_demo_v.json" schema_file = "behaverse/validators/nback.schema.json" # load and concat json lines #BehaverseJsonValidator().convert(original_json_file, valid_json_file) # load and validate json lines BehaverseJsonValidator(json_schema_path=schema_file).validate_json_file(valid_json_file) print("Good news everyone! Behaverse JSON file is valid!") ```