| 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':
|
|
|