Show More
@@ -0,0 +1,166 b'' | |||||
|
1 | { | |||
|
2 | "description": "custom json structure with references to generate notebook schema", | |||
|
3 | "notebook":{ | |||
|
4 | "type": "object", | |||
|
5 | "description": "notebook v3.0 root schema", | |||
|
6 | "$schema": "http://json-schema.org/draft-03/schema", | |||
|
7 | "id": "#notebook", | |||
|
8 | "required": true, | |||
|
9 | "additionalProperties": false, | |||
|
10 | "properties":{ | |||
|
11 | "metadata": { | |||
|
12 | "type": "object", | |||
|
13 | "id": "metadata", | |||
|
14 | "required": true, | |||
|
15 | "description": "the metadata atribute can contain any additionnal information", | |||
|
16 | "additionalProperties": true, | |||
|
17 | "properties":{ | |||
|
18 | "name": { | |||
|
19 | "id": "name", | |||
|
20 | "description": "the title of the notebook", | |||
|
21 | "type": "string", | |||
|
22 | "id": "name", | |||
|
23 | "required": true | |||
|
24 | } | |||
|
25 | } | |||
|
26 | }, | |||
|
27 | "nbformat_minor": { | |||
|
28 | "description": "Notebook format, minor number. Incremented for slight variation of notebook format.", | |||
|
29 | "type": "number", | |||
|
30 | "id": "nbformat_minor", | |||
|
31 | "required": true | |||
|
32 | }, | |||
|
33 | "nbformat": { | |||
|
34 | "description": "Notebook format, major number. Incremented between backward incompatible change is introduced.", | |||
|
35 | "type": "number", | |||
|
36 | "id": "nbformat", | |||
|
37 | "required": true | |||
|
38 | }, | |||
|
39 | "worksheets": { | |||
|
40 | "description": "Array of worksheet, not used by the current implementation of ipython yet", | |||
|
41 | "type": "array", | |||
|
42 | "id": "worksheets", | |||
|
43 | "required": true, | |||
|
44 | "items": {"$ref": "/worksheet"} | |||
|
45 | } | |||
|
46 | } | |||
|
47 | }, | |||
|
48 | ||||
|
49 | "worksheet": { | |||
|
50 | "additionalProperties": false, | |||
|
51 | "properties":{ | |||
|
52 | "cells": { | |||
|
53 | "type": "array", | |||
|
54 | "$schema": "http://json-schema.org/draft-03/schema", | |||
|
55 | "description": "array of cells of the current worksheet", | |||
|
56 | "id": "#cells", | |||
|
57 | "required": true, | |||
|
58 | "items": {"$ref": "/any_cell"} | |||
|
59 | ||||
|
60 | }, | |||
|
61 | "metadata": { | |||
|
62 | "type": "object", | |||
|
63 | "description": "metadata of the current worksheet", | |||
|
64 | "id": "metadata", | |||
|
65 | "required": true | |||
|
66 | } | |||
|
67 | } | |||
|
68 | }, | |||
|
69 | ||||
|
70 | "text_cell": { | |||
|
71 | "type": "object", | |||
|
72 | "description": "scheme for text cel and childrenm (level only optionnal argument for HEader cell)", | |||
|
73 | "$schema": "http://json-schema.org/draft-03/schema", | |||
|
74 | "id": "#cell", | |||
|
75 | "required": true, | |||
|
76 | "additionalProperties": false, | |||
|
77 | "properties":{ | |||
|
78 | "cell_type": { | |||
|
79 | "type": "string", | |||
|
80 | "id": "cell_type", | |||
|
81 | "required": true | |||
|
82 | }, | |||
|
83 | "level": { | |||
|
84 | "type": "number", | |||
|
85 | "id": "level", | |||
|
86 | "required": false | |||
|
87 | }, | |||
|
88 | "metadata": { | |||
|
89 | "type": "object", | |||
|
90 | "id": "metadata", | |||
|
91 | "required": true | |||
|
92 | }, | |||
|
93 | "source": { | |||
|
94 | "description": "for code cell, the source code", | |||
|
95 | "type": "array", | |||
|
96 | "id": "source", | |||
|
97 | "required": true, | |||
|
98 | "items": | |||
|
99 | { | |||
|
100 | "type": "string", | |||
|
101 | "description": "each item represent one line of the source code written, terminated by \n", | |||
|
102 | "id": "0", | |||
|
103 | "required": true | |||
|
104 | } | |||
|
105 | } | |||
|
106 | } | |||
|
107 | ||||
|
108 | }, | |||
|
109 | ||||
|
110 | "any_cell": { | |||
|
111 | "description": "Meta cell type that match any cell type", | |||
|
112 | "type": [{"$ref": "/text_cell"},{"$ref":"/code_cell"}], | |||
|
113 | "$schema": "http://json-schema.org/draft-03/schema" | |||
|
114 | }, | |||
|
115 | ||||
|
116 | "code_cell":{ | |||
|
117 | "type": "object", | |||
|
118 | "$schema": "http://json-schema.org/draft-03/schema", | |||
|
119 | "description": "Cell used to execute code", | |||
|
120 | "id": "#cell", | |||
|
121 | "required": true, | |||
|
122 | "additionalProperties": false, | |||
|
123 | "properties":{ | |||
|
124 | "cell_type": { | |||
|
125 | "type": "string", | |||
|
126 | "id": "cell_type", | |||
|
127 | "required": true | |||
|
128 | }, | |||
|
129 | "metadata": { | |||
|
130 | "type": "object", | |||
|
131 | "id": "metadata", | |||
|
132 | "required": true | |||
|
133 | }, | |||
|
134 | "collapsed": { | |||
|
135 | "type": "boolean", | |||
|
136 | "required": true | |||
|
137 | }, | |||
|
138 | "input": { | |||
|
139 | "description": "user input for text cells", | |||
|
140 | "type": "array", | |||
|
141 | "id": "input", | |||
|
142 | "required": true, | |||
|
143 | "items": | |||
|
144 | { | |||
|
145 | "type": "string", | |||
|
146 | "id": "input", | |||
|
147 | "required": true | |||
|
148 | } | |||
|
149 | }, | |||
|
150 | "outputs": { | |||
|
151 | "description": "output for code cell, to be definied", | |||
|
152 | "required": true, | |||
|
153 | "type": "array" | |||
|
154 | }, | |||
|
155 | "prompt_number": { | |||
|
156 | "type": ["number","string"], | |||
|
157 | "minimum": 0 | |||
|
158 | }, | |||
|
159 | "language": { | |||
|
160 | "type": "string", | |||
|
161 | "required": true | |||
|
162 | } | |||
|
163 | } | |||
|
164 | ||||
|
165 | } | |||
|
166 | } |
@@ -0,0 +1,88 b'' | |||||
|
1 | #!/usr/bin/env python | |||
|
2 | # -*- coding: utf8 -*- | |||
|
3 | ||||
|
4 | from jsonschema import Validator, validate, ValidationError | |||
|
5 | import jsonpointer | |||
|
6 | import argparse | |||
|
7 | import traceback | |||
|
8 | import json | |||
|
9 | ||||
|
10 | v = Validator(); | |||
|
11 | def nbvalidate(nbjson, schema='v3.withref.json', key=None,verbose=True): | |||
|
12 | v3schema = resolve_ref(json.load(open(schema,'r'))) | |||
|
13 | if key : | |||
|
14 | v3schema = jsonpointer.resolve_pointer(v3schema,key) | |||
|
15 | errors = 0 | |||
|
16 | for error in v.iter_errors(nbjson, v3schema): | |||
|
17 | errors = errors + 1 | |||
|
18 | if verbose: | |||
|
19 | print(error) | |||
|
20 | return errors | |||
|
21 | ||||
|
22 | def resolve_ref(json, base=None): | |||
|
23 | """return a json with resolved internal references | |||
|
24 | ||||
|
25 | only support local reference to the same json | |||
|
26 | """ | |||
|
27 | if not base : | |||
|
28 | base = json | |||
|
29 | ||||
|
30 | temp = None | |||
|
31 | if type(json) is list: | |||
|
32 | temp = []; | |||
|
33 | for item in json: | |||
|
34 | temp.append(resolve_ref(item, base=base)) | |||
|
35 | elif type(json) is dict: | |||
|
36 | temp = {}; | |||
|
37 | for key,value in json.iteritems(): | |||
|
38 | if key == '$ref': | |||
|
39 | return resolve_ref(jsonpointer.resolve_pointer(base,value), base=base) | |||
|
40 | else : | |||
|
41 | temp[key]=resolve_ref(value, base=base) | |||
|
42 | else : | |||
|
43 | return json | |||
|
44 | return temp | |||
|
45 | ||||
|
46 | def convert(namein, nameout, indent=2): | |||
|
47 | """resolve the references of namein, save the result in nameout""" | |||
|
48 | jsn = None | |||
|
49 | with open(namein) as file : | |||
|
50 | jsn = json.load(file) | |||
|
51 | v = resolve_ref(jsn, base=jsn) | |||
|
52 | x = jsonpointer.resolve_pointer(v, '/notebook') | |||
|
53 | with open(nameout,'w') as file: | |||
|
54 | json.dump(x,file,indent=indent) | |||
|
55 | ||||
|
56 | ||||
|
57 | if __name__ == '__main__': | |||
|
58 | parser = argparse.ArgumentParser() | |||
|
59 | parser.add_argument('-s', '--schema', | |||
|
60 | type=str, default='v3.withref.json') | |||
|
61 | ||||
|
62 | parser.add_argument('-k', '--key', | |||
|
63 | type=str, default='/notebook', | |||
|
64 | help='subkey to extract json schema from json file') | |||
|
65 | ||||
|
66 | parser.add_argument("-v", "--verbose", action="store_true", | |||
|
67 | help="increase output verbosity") | |||
|
68 | ||||
|
69 | parser.add_argument('filename', | |||
|
70 | type=str, | |||
|
71 | help="file to validate", | |||
|
72 | nargs='*', | |||
|
73 | metavar='names') | |||
|
74 | ||||
|
75 | args = parser.parse_args() | |||
|
76 | for name in args.filename : | |||
|
77 | nerror = nbvalidate(json.load(open(name,'r')), | |||
|
78 | schema=args.schema, | |||
|
79 | key=args.key, | |||
|
80 | verbose=args.verbose) | |||
|
81 | if nerror is 0: | |||
|
82 | print u"[Pass]",name | |||
|
83 | else : | |||
|
84 | print u"[ ]",name,'(%d)'%(nerror) | |||
|
85 | if args.verbose : | |||
|
86 | print '==================================================' | |||
|
87 | ||||
|
88 |
General Comments 0
You need to be logged in to leave comments.
Login now