Chromium Code Reviews| 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..c88bb8187dc1c21c254f92deb5f10f2da2d6913a |
| --- /dev/null |
| +++ b/chrome/common/extensions/docs/server2/api_models.py |
| @@ -0,0 +1,63 @@ |
| +# 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 full path (.json or .idl) themselves. If so, |
|
Yoyo Zhou
2013/10/30 23:22:19
This isn't always a full path, sometimes just the
not at google - send to devlin
2013/10/30 23:50:05
Done.
|
| + # believe them. |
| + 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. |
| + if 'devtools_' in file_name: |
|
Yoyo Zhou
2013/10/30 23:22:19
perhaps os.path.basename(file_name).startswith('de
not at google - send to devlin
2013/10/30 23:50:05
Done.
|
| + file_name = posixpath.join('devtools', file_name.replace('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. |
|
Yoyo Zhou
2013/10/30 23:22:19
...if both were filenotfound
not at google - send to devlin
2013/10/30 23:50:05
Done.
|
| + futures[0].Get() |
| + return Future(delegate=Gettable(resolve)) |