Chromium Code Reviews| 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 |