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..261e8d0a72a5bd5c784118ed7e79e96bce5d6bf0 100644 |
--- a/tools/json_schema_compiler/schema_loader.py |
+++ b/tools/json_schema_compiler/schema_loader.py |
@@ -8,20 +8,48 @@ 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. |
Properties: |
- - |display_path| path to the directory with the API header files, intended for |
- use with the Model. |
- - |real_path| path to the directory with the API header files, used for file |
- access. |
+ - |root| path to the root directory. |
+ - |path| path to the directory with the API header files, relative to the |
+ root. |
+ - |include_rules| List containing tuples with (path, cpp_namespace_pattern) |
+ used when searching for types. |
+ - |cpp_namespace_pattern| Default namespace pattern |
''' |
- def __init__(self, display_path, real_path): |
- self._display_path = display_path |
- self._real_path = real_path |
+ def __init__(self, |
+ root, |
+ path, |
+ include_rules, |
+ cpp_namespace_pattern): |
+ self._root = root |
+ self._include_rules = [(path, cpp_namespace_pattern)] |
+ self._include_rules.extend(include_rules) |
def ResolveType(self, full_name, default_namespace): |
name_parts = full_name.rsplit('.', 1) |
@@ -29,35 +57,26 @@ 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 path, namespace in self._include_rules: |
+ for filename in reversed(filenames): |
+ filepath = os.path.join(path, filename); |
+ if os.path.exists(os.path.join(self._root, filepath)): |
+ namespace = Model().AddNamespace( |
+ self.LoadSchema(filepath)[0], |
+ filepath, |
+ environment=CppNamespaceEnvironment(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 |
- without any path component - the file is loaded from the path defined by |
- the real_path argument passed to the constructor.''' |
+ with the full path relative to the root.''' |
schema_filename, schema_extension = os.path.splitext(schema) |
- schema_path = os.path.join(self._real_path, schema); |
+ schema_path = os.path.join(self._root, schema) |
if schema_extension == '.json': |
api_defs = json_schema.Load(schema_path) |
elif schema_extension == '.idl': |