| 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..a42f4c4c5673fd1f2c09d6a45356f1a32f53d2c3 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,15 @@ 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,
|
| + include_rules,
|
| + cpp_namespace_pattern):
|
| self._display_path = display_path
|
| self._real_path = real_path
|
| + self._include_rules = [(real_path, cpp_namespace_pattern)]
|
| + self._include_rules.extend(include_rules)
|
|
|
| def ResolveType(self, full_name, default_namespace):
|
| name_parts = full_name.rsplit('.', 1)
|
| @@ -29,27 +56,19 @@ 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(filepath):
|
| + namespace = Model().AddNamespace(
|
| + self.LoadSchema(filepath)[0],
|
| + os.path.join(self._display_path, 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
|
|
|