Index: chrome/common/extensions/docs/server2/api_models.py |
diff --git a/chrome/common/extensions/docs/server2/api_models.py b/chrome/common/extensions/docs/server2/api_models.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3928c0396d4d564993b4a4295ffb8bf8760d8beb |
--- /dev/null |
+++ b/chrome/common/extensions/docs/server2/api_models.py |
@@ -0,0 +1,65 @@ |
+# Copyright 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import logging |
+import os |
+import posixpath |
+ |
+from file_system import FileNotFoundError |
+from future import Gettable, Future |
+from schema_util import ProcessSchema |
+from svn_constants import API_PATH |
+from third_party.json_schema_compiler.model import Namespace, UnixName |
+ |
+ |
+def _CreateAPIModel(path, data): |
+ schema = ProcessSchema(path, data) |
+ if os.path.splitext(path)[1] == '.json': |
+ schema = schema[0] |
+ return Namespace(schema, schema['namespace']) |
+ |
+ |
+class APIModels(object): |
+ '''Tracks APIs and their Models. |
+ ''' |
+ |
+ def __init__(self, features_bundle, compiled_fs_factory, file_system): |
+ self._features_bundle = features_bundle |
+ self._model_cache = compiled_fs_factory.Create( |
+ file_system, _CreateAPIModel, APIModels) |
+ |
+ def GetNames(self): |
+ return self._features_bundle.GetAPIFeatures().keys() |
+ |
+ def GetModel(self, api_name): |
+ # Callers sometimes specify a filename which includes .json or .idl - if |
+ # so, believe them. They may even include the 'api/' prefix. |
+ if os.path.splitext(api_name)[1] in ('.json', '.idl'): |
+ if not api_name.startswith(API_PATH + '/'): |
+ api_name = posixpath.join(API_PATH, api_name) |
+ return self._model_cache.GetFromFile(api_name) |
+ |
+ assert not api_name.startswith(API_PATH) |
+ |
+ # API names are given as declarativeContent and app.window but file names |
+ # will be declarative_content and app_window. |
+ file_name = UnixName(api_name).replace('.', '_') |
+ # Devtools APIs are in API_PATH/devtools/ not API_PATH/, and have their |
+ # "devtools" names removed from the file names. |
+ basename = posixpath.basename(file_name) |
+ if basename.startswith('devtools_'): |
+ file_name = posixpath.join( |
+ 'devtools', file_name.replace(basename, basename[len('devtools_'):])) |
+ |
+ futures = [self._model_cache.GetFromFile('%s/%s.%s' % |
+ (API_PATH, file_name, ext)) |
+ for ext in ('json', 'idl')] |
+ def resolve(): |
+ for future in futures: |
+ try: |
+ return future.Get() |
+ except FileNotFoundError: pass |
+ # Propagate the first FileNotFoundError if neither were found. |
+ futures[0].Get() |
+ return Future(delegate=Gettable(resolve)) |