Chromium Code Reviews| Index: tools/json_schema_compiler/preview.py |
| diff --git a/tools/json_schema_compiler/preview.py b/tools/json_schema_compiler/preview.py |
| index 5c5fee084bac400572f50e86468aa042ecf74630..3fcd5d37681fffa3a07bdc41c7c5e19aeeaaa908 100755 |
| --- a/tools/json_schema_compiler/preview.py |
| +++ b/tools/json_schema_compiler/preview.py |
| @@ -16,11 +16,13 @@ import json_schema |
| import model |
| import optparse |
| import os |
| -import schema_loader |
| +import shlex |
| import urlparse |
| from highlighters import ( |
| pygments_highlighter, none_highlighter, hilite_me_highlighter) |
| from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer |
| +from cpp_namespace_environment import CppNamespaceEnvironment |
| +from schema_loader import SchemaLoader |
| class CompilerHandler(BaseHTTPRequestHandler): |
| @@ -176,27 +178,6 @@ window.addEventListener('hashchange', updateEverything, false); |
| updateEverything(); |
| </script>''') |
| - def _LoadModel(self, basedir, name): |
| - """Loads and returns the model for the |name| API from either its JSON or |
| - IDL file, e.g. |
| - name=contextMenus will be loaded from |basedir|/context_menus.json, |
| - name=alarms will be loaded from |basedir|/alarms.idl. |
| - """ |
| - loaders = { |
| - 'json': json_schema.Load, |
| - 'idl': idl_schema.Load |
| - } |
| - # APIs are referred to like "webRequest" but that's in a file |
| - # "web_request.json" so we need to unixify the name. |
| - unix_name = model.UnixName(name) |
| - for loader_ext, loader_fn in loaders.items(): |
| - file_path = '%s/%s.%s' % (basedir, unix_name, loader_ext) |
| - if os.path.exists(file_path): |
| - # For historical reasons these files contain a singleton list with the |
| - # model, so just return that single object. |
| - return (loader_fn(file_path)[0], file_path) |
| - raise ValueError('File for model "%s" not found' % name) |
| - |
| def _ShowCompiledFile(self, parsed_url, head, body): |
| """Show the compiled version of a json or idl file given the path to the |
| compiled file. |
| @@ -207,17 +188,20 @@ updateEverything(); |
| (file_root, file_ext) = os.path.splitext(request_path) |
| (filedir, filename) = os.path.split(file_root) |
| + schema_loader = SchemaLoader(filedir, |
| + filedir, |
| + self.server.include_rules, |
| + '') |
| try: |
| # Get main file. |
| - (api_def, file_path) = self._LoadModel(filedir, filename) |
| - namespace = api_model.AddNamespace(api_def, file_path) |
| + namespace = schema_loader.ResolveNamespace(filename) |
| type_generator = cpp_type_generator.CppTypeGenerator( |
| api_model, |
| - schema_loader.SchemaLoader(filedir), |
| + schema_loader, |
| namespace) |
| # Get the model's dependencies. |
| - for dependency in api_def.get('dependencies', []): |
| + for dependency in namespace.dependencies: |
| # Dependencies can contain : in which case they don't refer to APIs, |
| # rather, permissions or manifest keys. |
| if ':' in dependency: |
| @@ -231,10 +215,10 @@ updateEverything(); |
| # Generate code |
| cpp_namespace = 'generated_api_schemas' |
| if file_ext == '.h': |
| - cpp_code = (h_generator.HGenerator(type_generator, cpp_namespace) |
| + cpp_code = (h_generator.HGenerator(type_generator) |
| .Generate(namespace).Render()) |
| elif file_ext == '.cc': |
| - cpp_code = (cc_generator.CCGenerator(type_generator, cpp_namespace) |
| + cpp_code = (cc_generator.CCGenerator(type_generator) |
| .Generate(namespace).Render()) |
| else: |
| self.send_error(404, "File not found: %s" % request_path) |
| @@ -249,6 +233,7 @@ updateEverything(); |
| .GetCodeElement(cpp_code, style_param)) |
| except IOError: |
| self.send_error(404, "File not found: %s" % request_path) |
| + raise |
| return |
|
not at google - send to devlin
2014/08/28 19:22:09
No point returning after a raise - but I prefer th
lfg
2014/08/28 19:33:35
Oops, that was left over after I debugged this cod
|
| except (TypeError, KeyError, AttributeError, |
| AssertionError, NotImplementedError) as error: |
| @@ -328,9 +313,10 @@ updateEverything(); |
| class PreviewHTTPServer(HTTPServer, object): |
| - def __init__(self, server_address, handler, highlighters): |
| + def __init__(self, server_address, handler, highlighters, include_rules): |
| super(PreviewHTTPServer, self).__init__(server_address, handler) |
| self.highlighters = highlighters |
| + self.include_rules = include_rules |
| if __name__ == '__main__': |
| @@ -339,9 +325,24 @@ if __name__ == '__main__': |
| usage='usage: %prog [option]...') |
| parser.add_option('-p', '--port', default='8000', |
| help='port to run the server on') |
| + parser.add_option('-I', '--include-rules', |
| + help='A list of paths to include when searching for referenced objects,' |
| + ' with the namespace separated by a \':\'. Example: ' |
| + '/foo/bar:Foo::Bar::%(namespace)s') |
| (opts, argv) = parser.parse_args() |
| + def split_path_and_namespace(path_and_namespace): |
| + if ':' not in path_and_namespace: |
| + raise ValueError('Invalid include rule "%s". Rules must be of ' |
| + 'the form path:namespace' % path_and_namespace) |
| + return path_and_namespace.split(':', 1) |
| + |
| + include_rules = [] |
| + if opts.include_rules: |
| + include_rules = map(split_path_and_namespace, |
| + shlex.split(opts.include_rules)) |
| + |
| try: |
| print('Starting previewserver on port %s' % opts.port) |
| print('The extension documentation can be found at:') |
| @@ -360,7 +361,8 @@ if __name__ == '__main__': |
| server = PreviewHTTPServer(('', int(opts.port)), |
| CompilerHandler, |
| - highlighters) |
| + highlighters, |
| + include_rules) |
| server.serve_forever() |
| except KeyboardInterrupt: |
| server.socket.close() |