diff options
7 files changed, 82 insertions, 107 deletions
diff --git a/chrome/common/extensions/docs/server2/api_list_data_source.py b/chrome/common/extensions/docs/server2/api_list_data_source.py index 22f4f33..4ae0ca3 100644 --- a/chrome/common/extensions/docs/server2/api_list_data_source.py +++ b/chrome/common/extensions/docs/server2/api_list_data_source.py @@ -2,11 +2,13 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +from data_source import DataSource +from future import Gettable, Future from operator import itemgetter import docs_server_utils as utils -class APIListDataSource(object): +class APIListDataSource(DataSource): """ This class creates a list of chrome.* APIs and chrome.experimental.* APIs for extensions and apps that are used in the api_index.html, experimental.html, and private_apis.html pages. @@ -21,92 +23,82 @@ class APIListDataSource(object): "extension_types" property where either/both "extension"/"platform_app" values are present. """ - class Factory(object): - def __init__(self, - compiled_fs_factory, - file_system, - features_bundle, - object_store_creator, - api_models, - availability_finder, - api_categorizer): - self._file_system = file_system - self._features_bundle = features_bundle - self._api_categorizer = api_categorizer - self._object_store_creator = object_store_creator - self._api_models = api_models - self._availability_finder = availability_finder + def __init__(self, server_instance, _): + self._features_bundle = server_instance.features_bundle + self._object_store = server_instance.object_store_creator.Create( + APIListDataSource) + self._api_models = server_instance.api_models + self._api_categorizer = server_instance.api_categorizer + self._availability_finder = server_instance.availability_finder - def _GenerateAPIDict(self): + def _GenerateAPIDict(self): + def get_channel_info(api_name): + return self._availability_finder.GetApiAvailability(api_name) - def _GetChannelInfo(api_name): - return self._availability_finder.GetApiAvailability(api_name) + def get_api_platform(api_name): + feature = self._features_bundle.GetAPIFeatures().Get()[api_name] + return feature['platforms'] - def _GetApiPlatform(api_name): - feature = self._features_bundle.GetAPIFeatures().Get()[api_name] - return feature['platforms'] - - def _MakeDictForPlatform(platform): - platform_dict = { - 'chrome': {'stable': [], 'beta': [], 'dev': [], 'trunk': []}, + def make_dict_for_platform(platform): + platform_dict = { + 'chrome': {'stable': [], 'beta': [], 'dev': [], 'trunk': []}, + } + private_apis = [] + experimental_apis = [] + all_apis = [] + for api_name, api_model in self._api_models.IterModels(): + if not self._api_categorizer.IsDocumented(platform, api_name): + continue + api = { + 'name': api_name, + 'description': api_model.description, + 'platforms': get_api_platform(api_name), } - private_apis = [] - experimental_apis = [] - all_apis = [] - for api_name, api_model in self._api_models.IterModels(): - if not self._api_categorizer.IsDocumented(platform, api_name): - continue - api = { - 'name': api_name, - 'description': api_model.description, - 'platforms': _GetApiPlatform(api_name), - } - category = self._api_categorizer.GetCategory(platform, api_name) - if category == 'chrome': - channel_info = _GetChannelInfo(api_name) - channel = channel_info.channel - if channel == 'stable': - version = channel_info.version - api['version'] = version - platform_dict[category][channel].append(api) - all_apis.append(api) - elif category == 'experimental': - experimental_apis.append(api) - all_apis.append(api) - elif category == 'private': - private_apis.append(api) - - for channel, apis_by_channel in platform_dict['chrome'].iteritems(): - apis_by_channel.sort(key=itemgetter('name')) - utils.MarkLast(apis_by_channel) - platform_dict['chrome'][channel] = apis_by_channel + category = self._api_categorizer.GetCategory(platform, api_name) + if category == 'chrome': + channel_info = get_channel_info(api_name) + channel = channel_info.channel + if channel == 'stable': + version = channel_info.version + api['version'] = version + platform_dict[category][channel].append(api) + all_apis.append(api) + elif category == 'experimental': + experimental_apis.append(api) + all_apis.append(api) + elif category == 'private': + private_apis.append(api) - for key, apis in (('all', all_apis), - ('private', private_apis), - ('experimental', experimental_apis)): - apis.sort(key=itemgetter('name')) - utils.MarkLast(apis) - platform_dict[key] = apis + for channel, apis_by_channel in platform_dict['chrome'].iteritems(): + apis_by_channel.sort(key=itemgetter('name')) + utils.MarkLast(apis_by_channel) + platform_dict['chrome'][channel] = apis_by_channel - return platform_dict - return { - 'apps': _MakeDictForPlatform('apps'), - 'extensions': _MakeDictForPlatform('extensions'), - } - - def Create(self): - return APIListDataSource(self, self._object_store_creator) + for key, apis in (('all', all_apis), + ('private', private_apis), + ('experimental', experimental_apis)): + apis.sort(key=itemgetter('name')) + utils.MarkLast(apis) + platform_dict[key] = apis - def __init__(self, factory, object_store_creator): - self._factory = factory - self._object_store = object_store_creator.Create(APIListDataSource) + return platform_dict + return { + 'apps': make_dict_for_platform('apps'), + 'extensions': make_dict_for_platform('extensions'), + } def _GetCachedAPIData(self): - data = self._object_store.Get('api_data').Get() - if data is None: - data = self._factory._GenerateAPIDict() - self._object_store.Set('api_data', data) - return data + data_future = self._object_store.Get('api_data') + def resolve(): + data = data_future.Get() + if data is None: + data = self._GenerateAPIDict() + self._object_store.Set('api_data', data) + return data + return Future(delegate=Gettable(resolve)) def get(self, key): - return self._GetCachedAPIData().get(key) + return self._GetCachedAPIData().Get().get(key) + + def Cron(self): + return self._GetCachedAPIData() diff --git a/chrome/common/extensions/docs/server2/api_list_data_source_test.py b/chrome/common/extensions/docs/server2/api_list_data_source_test.py index 8964d50..44523a5 100755 --- a/chrome/common/extensions/docs/server2/api_list_data_source_test.py +++ b/chrome/common/extensions/docs/server2/api_list_data_source_test.py @@ -131,18 +131,12 @@ class APIListDataSourceTest(unittest.TestCase): def setUp(self): server_instance = ServerInstance.ForTest( TestFileSystem(_TEST_DATA, relative_to=CHROME_EXTENSIONS)) - self._factory = APIListDataSource.Factory( - server_instance.compiled_fs_factory, - server_instance.host_file_system_provider.GetTrunk(), - server_instance.features_bundle, - server_instance.object_store_creator, - server_instance.api_models, - server_instance.availability_finder, - server_instance.api_categorizer) + # APIListDataSource takes a request but doesn't use it, + # so put None + self._api_list = APIListDataSource(server_instance, None) self.maxDiff = None def testApps(self): - api_list = self._factory.Create() self.assertEqual({ 'stable': [ { @@ -176,10 +170,9 @@ class APIListDataSourceTest(unittest.TestCase): }], 'beta': [], 'trunk': [] - }, api_list.get('apps').get('chrome')) + }, self._api_list.get('apps').get('chrome')) def testExperimentalApps(self): - api_list = self._factory.Create() self.assertEqual([ { 'name': 'experimental.bluetooth', @@ -191,10 +184,9 @@ class APIListDataSourceTest(unittest.TestCase): 'platforms': ['apps', 'extensions'], 'last': True, 'description': u'<code>experimental.power</code>' - }], api_list.get('apps').get('experimental')) + }], self._api_list.get('apps').get('experimental')) def testExtensions(self): - api_list = self._factory.Create() self.assertEqual({ 'stable': [ { @@ -232,10 +224,9 @@ class APIListDataSourceTest(unittest.TestCase): }], 'beta': [], 'trunk': [] - }, api_list.get('extensions').get('chrome')) + }, self._api_list.get('extensions').get('chrome')) def testExperimentalExtensions(self): - api_list = self._factory.Create() self.assertEqual([ { 'name': 'experimental.history', @@ -247,7 +238,7 @@ class APIListDataSourceTest(unittest.TestCase): 'platforms': ['apps', 'extensions'], 'description': u'<code>experimental.power</code>', 'last': True - }], api_list.get('extensions').get('experimental')) + }], self._api_list.get('extensions').get('experimental')) if __name__ == '__main__': unittest.main() diff --git a/chrome/common/extensions/docs/server2/app.yaml b/chrome/common/extensions/docs/server2/app.yaml index fc83781..f9b1d53 100644 --- a/chrome/common/extensions/docs/server2/app.yaml +++ b/chrome/common/extensions/docs/server2/app.yaml @@ -1,5 +1,5 @@ application: chrome-apps-doc -version: 3-14-0 +version: 3-14-1 runtime: python27 api_version: 1 threadsafe: false diff --git a/chrome/common/extensions/docs/server2/cron.yaml b/chrome/common/extensions/docs/server2/cron.yaml index c7f5d95..218152c 100644 --- a/chrome/common/extensions/docs/server2/cron.yaml +++ b/chrome/common/extensions/docs/server2/cron.yaml @@ -2,4 +2,4 @@ cron: - description: Repopulates all cached data. url: /_cron schedule: every 5 minutes - target: 3-14-0 + target: 3-14-1 diff --git a/chrome/common/extensions/docs/server2/data_source_registry.py b/chrome/common/extensions/docs/server2/data_source_registry.py index 8249a23..7588811 100644 --- a/chrome/common/extensions/docs/server2/data_source_registry.py +++ b/chrome/common/extensions/docs/server2/data_source_registry.py @@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +from api_list_data_source import APIListDataSource from data_source import DataSource from manifest_data_source import ManifestDataSource from permissions_data_source import PermissionsDataSource @@ -13,6 +14,7 @@ from whats_new_data_source import WhatsNewDataSource _all_data_sources = { + 'api_list': APIListDataSource, 'articles': ArticleDataSource, 'intros': IntroDataSource, 'manifest_source': ManifestDataSource, diff --git a/chrome/common/extensions/docs/server2/server_instance.py b/chrome/common/extensions/docs/server2/server_instance.py index cfcb691..13f4f20 100644 --- a/chrome/common/extensions/docs/server2/server_instance.py +++ b/chrome/common/extensions/docs/server2/server_instance.py @@ -100,15 +100,6 @@ class ServerInstance(object): self.api_models, self.object_store_creator) - self.api_list_data_source_factory = APIListDataSource.Factory( - self.compiled_fs_factory, - host_fs_at_trunk, - self.features_bundle, - self.object_store_creator, - self.api_models, - self.availability_finder, - self.api_categorizer) - self.ref_resolver_factory = ReferenceResolver.Factory( self.api_data_source_factory, self.api_models, diff --git a/chrome/common/extensions/docs/server2/template_renderer.py b/chrome/common/extensions/docs/server2/template_renderer.py index a6b8d65..3316ec7 100644 --- a/chrome/common/extensions/docs/server2/template_renderer.py +++ b/chrome/common/extensions/docs/server2/template_renderer.py @@ -51,7 +51,6 @@ class TemplateRenderer(object): server_instance = self._server_instance data_sources = CreateDataSources(server_instance, request=request) data_sources.update({ - 'api_list': server_instance.api_list_data_source_factory.Create(), 'apis': server_instance.api_data_source_factory.Create(request), 'samples': server_instance.samples_data_source_factory.Create(request), }) |