Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: tools/json_schema_compiler/compiler.py

Issue 9456007: Add wider support to json_schema_compiler (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: reupload Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 """Generator for C++ structs from api json files. 5 """Generator for C++ structs from api json files.
6 6
7 The purpose of this tool is to remove the need for hand-written code that 7 The purpose of this tool is to remove the need for hand-written code that
8 converts to and from base::Value types when receiving javascript api calls. 8 converts to and from base::Value types when receiving javascript api calls.
9 Originally written for generating code for extension apis. Reference schemas 9 Originally written for generating code for extension apis. Reference schemas
10 are in chrome/common/extensions/api. 10 are in chrome/common/extensions/api.
(...skipping 10 matching lines...) Expand all
21 import h_generator 21 import h_generator
22 import json 22 import json
23 import model 23 import model
24 import optparse 24 import optparse
25 import os.path 25 import os.path
26 import sys 26 import sys
27 27
28 if __name__ == '__main__': 28 if __name__ == '__main__':
29 parser = optparse.OptionParser( 29 parser = optparse.OptionParser(
30 description='Generates a C++ model of an API from JSON schema', 30 description='Generates a C++ model of an API from JSON schema',
31 usage='usage: %prog [option]... schema [referenced_schema]...') 31 usage='usage: %prog [option]... schema')
32 parser.add_option('-r', '--root', default='.', 32 parser.add_option('-r', '--root', default='.',
33 help='logical include root directory. Path to schema files from specified' 33 help='logical include root directory. Path to schema files from specified'
34 'dir will be the include path.') 34 'dir will be the include path.')
35 parser.add_option('-d', '--destdir', 35 parser.add_option('-d', '--destdir',
36 help='root directory to output generated files.') 36 help='root directory to output generated files.')
37 parser.add_option('-n', '--namespace', default='generated_api_schemas', 37 parser.add_option('-n', '--namespace', default='generated_api_schemas',
38 help='C++ namespace for generated files. e.g extensions::api.') 38 help='C++ namespace for generated files. e.g extensions::api.')
39 39
40 (opts, args) = parser.parse_args() 40 (opts, args) = parser.parse_args()
41 if not args: 41 if not args:
42 sys.exit(parser.get_usage()) 42 sys.exit(parser.get_usage())
43 dest_dir = opts.destdir 43 dest_dir = opts.destdir
44 root_namespace = opts.namespace 44 root_namespace = opts.namespace
45 45
46 schema = os.path.normpath(args[0]) 46 schema = os.path.normpath(args[0])
47 referenced_schemas = args[1:]
48 47
49 api_model = model.Model() 48 api_model = model.Model()
50 49
51 # Load type dependencies into the model.
52 for referenced_schema_path in referenced_schemas:
53 with open(referenced_schema_path, 'r') as referenced_schema_file:
54 referenced_api_defs = json.loads(referenced_schema_file.read())
55
56 for namespace in referenced_api_defs:
57 api_model.AddNamespace(namespace,
58 os.path.relpath(referenced_schema_path, opts.root))
59 50
60 # Actually generate for source file. 51 # Actually generate for source file.
61 with open(schema, 'r') as schema_file: 52 with open(schema, 'r') as schema_file:
62 api_defs = json.loads(schema_file.read()) 53 api_defs = json.loads(schema_file.read())
63 54
64 for target_namespace in api_defs: 55 for target_namespace in api_defs:
56 referenced_schemas = target_namespace.get('dependencies', [])
57 # Load type dependencies into the model.
58 for referenced_schema in referenced_schemas:
59 referenced_schema_path = os.path.join(
60 os.path.dirname(schema), referenced_schema + '.json')
61 with open(referenced_schema_path, 'r') as referenced_schema_file:
62 referenced_api_defs = json.loads(referenced_schema_file.read())
63
64 for namespace in referenced_api_defs:
65 api_model.AddNamespace(namespace,
66 os.path.relpath(referenced_schema_path, opts.root))
67
65 # Gets the relative path from opts.root to the schema to correctly determine 68 # Gets the relative path from opts.root to the schema to correctly determine
66 # the include path. 69 # the include path.
67 relpath = os.path.relpath(schema, opts.root) 70 relpath = os.path.relpath(schema, opts.root)
68 namespace = api_model.AddNamespace(target_namespace, relpath) 71 namespace = api_model.AddNamespace(target_namespace, relpath)
69 if not namespace: 72 if not namespace:
70 continue 73 continue
71 74
72 # The output filename must match the input filename for gyp to deal with it 75 # The output filename must match the input filename for gyp to deal with it
73 # properly. 76 # properly.
74 out_file = namespace.name 77 out_file = namespace.name
(...skipping 19 matching lines...) Expand all
94 'w') as h_file: 97 'w') as h_file:
95 h_file.write(h_code) 98 h_file.write(h_code)
96 else: 99 else:
97 print '%s.h' % out_file 100 print '%s.h' % out_file
98 print 101 print
99 print h_code 102 print h_code
100 print 103 print
101 print '%s.cc' % out_file 104 print '%s.cc' % out_file
102 print 105 print
103 print cc_code 106 print cc_code
OLDNEW
« no previous file with comments | « tools/json_schema_compiler/cc_generator.py ('k') | tools/json_schema_compiler/cpp_type_generator.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698