Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(903)

Unified Diff: tools/json_schema_compiler/schema_loader.py

Issue 487533005: Add support for references in different paths in apis (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/json_schema_compiler/model.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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':
« no previous file with comments | « tools/json_schema_compiler/model.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698