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 |