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

Unified Diff: tools/json_schema_compiler/preview.py

Issue 515983003: Fixing json compiler preview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
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()

Powered by Google App Engine
This is Rietveld 408576698