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

Unified Diff: tools/json_schema_compiler/schema_loader.py

Issue 487533005: Add support for references in different paths in apis (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/schema_loader.py
diff --git a/tools/json_schema_compiler/schema_loader.py b/tools/json_schema_compiler/schema_loader.py
index 358381f847f4766c0fbbe57da4e0db205963ef05..ccd5f05e5fe5c630e63d3fb6f8869603cc71a207 100644
--- a/tools/json_schema_compiler/schema_loader.py
+++ b/tools/json_schema_compiler/schema_loader.py
@@ -8,8 +8,29 @@ import sys
import idl_schema
import json_schema
+from cpp_namespace_environment import CppNamespaceEnvironment
from model import Model, UnixName
+def GenerateFilenames(full_namespace):
+ # Try to find the file defining the namespace. Eg. for
+ # nameSpace.sub_name_space.Type' the following heuristics looks for:
+ # 1. name_space_sub_name_space.json,
+ # 2. name_space_sub_name_space.idl,
+ # 3. sub_name_space.json,
+ # 4. sub_name_space.idl,
+ # 5. etc.
+ sub_namespaces = full_namespace.split('.')
+ filenames = [ ]
+ basename = None
+ for namespace in reversed(sub_namespaces):
+ if basename is not None:
+ basename = UnixName(namespace + '.' + basename)
+ else:
+ basename = UnixName(namespace)
+ for ext in ['json', 'idl']:
+ filenames.append('%s.%s' % (basename, ext))
+ return filenames
+
class SchemaLoader(object):
'''Resolves a type name into the namespace the type belongs to.
@@ -19,9 +40,12 @@ class SchemaLoader(object):
- |real_path| path to the directory with the API header files, used for file
access.
'''
- def __init__(self, display_path, real_path):
+ def __init__(self, display_path, real_path, includes, cpp_namespace_pattern):
self._display_path = display_path
self._real_path = real_path
+ self._includes = [
+ { 'path': real_path, 'namespace': cpp_namespace_pattern } ]
+ self._includes.extend(includes)
def ResolveType(self, full_name, default_namespace):
name_parts = full_name.rsplit('.', 1)
@@ -29,27 +53,20 @@ class SchemaLoader(object):
if full_name not in default_namespace.types:
return None
return default_namespace
- namespace_name, type_name = name_parts
- real_name = None
- # Try to find the file defining the namespace. Eg. for
- # nameSpace.sub_name_space.Type' the following heuristics looks for:
- # 1. name_space_sub_name_space.json,
- # 2. name_space_sub_name_space.idl.
- for ext in ['json', 'idl']:
- basename = UnixName(namespace_name)
- filename = '%s.%s' % (basename, ext)
- filepath = os.path.join(self._real_path, filename);
- if os.path.exists(filepath):
- real_name = filename
- break
- if real_name is None:
- return None
- namespace = Model().AddNamespace(
- self.LoadSchema(real_name)[0],
- os.path.join(self._display_path, real_name))
- if type_name not in namespace.types:
- return None
- return namespace
+ full_namespace, type_name = full_name.rsplit('.', 1)
+ filenames = GenerateFilenames(full_namespace)
+ for include in self._includes:
not at google - send to devlin 2014/08/26 20:16:06 You should be able to write here: for path, names
lfg 2014/08/26 21:18:44 I don't think this can be done with dictionaries,
not at google - send to devlin 2014/08/27 23:11:23 That's what iteritems() does, turns a dictionary i
not at google - send to devlin 2014/08/27 23:14:20 (but tuples is fine as well)
lfg 2014/08/28 18:57:10 Done.
+ path = include['path']
+ for filename in reversed(filenames):
+ filepath = os.path.join(path, filename);
+ if os.path.exists(filepath):
+ namespace = Model().AddNamespace(
+ self.LoadSchema(filepath)[0],
+ os.path.join(self._display_path, filepath),
+ environment=CppNamespaceEnvironment(include['namespace']))
+ if type_name in namespace.types:
+ return namespace
+ return None
def LoadSchema(self, schema):
'''Load a schema definition. The schema parameter must be a file name
« tools/json_schema_compiler/h_generator.py ('K') | « tools/json_schema_compiler/model.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698