from data_source import DataSource
from future import Future
from operator import itemgetter
+from platform_util import GetPlatforms
-from docs_server_utils import MarkLast, StringIdentity
+from docs_server_utils import MarkFirstAndLast, MarkLast
class APIListDataSource(DataSource):
""" This class creates a list of chrome.* APIs and chrome.experimental.* APIs
values are present.
"""
def __init__(self, server_instance, _):
- self._features_bundle = server_instance.features_bundle
- self._api_models = server_instance.api_models
+ self._platform_bundle = server_instance.platform_bundle
self._object_store = server_instance.object_store_creator.Create(
# Update the model when the API or Features model updates.
- APIListDataSource,
- category=StringIdentity(self._features_bundle.GetIdentity(),
- self._api_models.GetIdentity()))
- self._api_categorizer = server_instance.api_categorizer
- self._availability_finder = server_instance.availability_finder
+ APIListDataSource, category=self._platform_bundle.GetIdentity())
def _GenerateAPIDict(self):
- def get_channel_info(api_name):
- return self._availability_finder.GetAPIAvailability(api_name).channel_info
+ def make_list_for_content_scripts():
+ def convert_to_list(content_script_apis):
+ content_script_apis_list = [csa.__dict__ for api_name, csa
+ in content_script_apis.iteritems()
+ if self._platform_bundle.GetAPICategorizer(
+ 'extensions').IsDocumented(api_name)]
+ content_script_apis_list.sort(key=itemgetter('name'))
+ for csa in content_script_apis_list:
+ restricted_nodes = csa['restrictedTo']
+ if restricted_nodes:
+ restricted_nodes.sort(key=itemgetter('node'))
+ MarkFirstAndLast(restricted_nodes)
+ else:
+ del csa['restrictedTo']
+ return content_script_apis_list
- def get_api_platform(api_name):
- feature = self._features_bundle.GetAPIFeatures().Get()[api_name]
- return feature['platforms']
+ return (self._platform_bundle.GetAPIModels('extensions')
+ .GetContentScriptAPIs()
+ .Then(convert_to_list))
def make_dict_for_platform(platform):
platform_dict = {
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):
+ for api_name, api_model in self._platform_bundle.GetAPIModels(
+ platform).IterModels():
+ if not self._platform_bundle.GetAPICategorizer(platform).IsDocumented(
+ api_name):
continue
api = {
'name': api_name,
'description': api_model.description,
- 'platforms': get_api_platform(api_name),
}
- category = self._api_categorizer.GetCategory(platform, api_name)
+ category = self._platform_bundle.GetAPICategorizer(
+ platform).GetCategory(api_name)
if category == 'chrome':
- channel_info = get_channel_info(api_name)
+ channel_info = self._platform_bundle.GetAvailabilityFinder(
+ platform).GetAPIAvailability(api_name).channel_info
channel = channel_info.channel
if channel == 'stable':
version = channel_info.version
platform_dict[key] = apis
return platform_dict
- return {
- 'apps': make_dict_for_platform('apps'),
- 'extensions': make_dict_for_platform('extensions'),
- }
+
+ def make_api_dict(content_script_apis):
+ api_dict = dict((platform, make_dict_for_platform(platform))
+ for platform in GetPlatforms())
+ api_dict['contentScripts'] = content_script_apis
+ return api_dict
+
+ return make_list_for_content_scripts().Then(make_api_dict)
def _GetCachedAPIData(self):
- data_future = self._object_store.Get('api_data')
- def resolve():
- data = data_future.Get()
+ def persist_and_return(data):
+ self._object_store.Set('api_data', data)
+ return data
+ def return_or_generate(data):
if data is None:
- data = self._GenerateAPIDict()
- self._object_store.Set('api_data', data)
+ return self._GenerateAPIDict().Then(persist_and_return)
return data
- return Future(callback=resolve)
+ return self._object_store.Get('api_data').Then(return_or_generate)
def get(self, key):
return self._GetCachedAPIData().Get().get(key)