1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 from data_source
import DataSource
6 from future
import Future
7 from operator
import itemgetter
9 import docs_server_utils
as utils
11 class APIListDataSource(DataSource
):
12 """ This class creates a list of chrome.* APIs and chrome.experimental.* APIs
13 for extensions and apps that are used in the api_index.html,
14 experimental.html, and private_apis.html pages.
16 An API is considered listable if it is listed in _api_features.json,
17 it has a corresponding HTML file in the public template path, and one of
18 the following conditions is met:
19 - It has no "dependencies" or "extension_types" properties in _api_features
20 - It has an "extension_types" property in _api_features with either/both
21 "extension"/"platform_app" values present.
22 - It has a dependency in _{api,manifest,permission}_features with an
23 "extension_types" property where either/both "extension"/"platform_app"
26 def __init__(self
, server_instance
, _
):
27 self
._features
_bundle
= server_instance
.features_bundle
28 self
._object
_store
= server_instance
.object_store_creator
.Create(
30 self
._api
_models
= server_instance
.api_models
31 self
._api
_categorizer
= server_instance
.api_categorizer
32 self
._availability
_finder
= server_instance
.availability_finder
34 def _GenerateAPIDict(self
):
35 def get_channel_info(api_name
):
36 return self
._availability
_finder
.GetApiAvailability(api_name
).channel_info
38 def get_api_platform(api_name
):
39 feature
= self
._features
_bundle
.GetAPIFeatures().Get()[api_name
]
40 return feature
['platforms']
42 def make_dict_for_platform(platform
):
44 'chrome': {'stable': [], 'beta': [], 'dev': [], 'trunk': []},
47 experimental_apis
= []
49 for api_name
, api_model
in self
._api
_models
.IterModels():
50 if not self
._api
_categorizer
.IsDocumented(platform
, api_name
):
54 'description': api_model
.description
,
55 'platforms': get_api_platform(api_name
),
57 category
= self
._api
_categorizer
.GetCategory(platform
, api_name
)
58 if category
== 'chrome':
59 channel_info
= get_channel_info(api_name
)
60 channel
= channel_info
.channel
61 if channel
== 'stable':
62 version
= channel_info
.version
63 api
['version'] = version
64 platform_dict
[category
][channel
].append(api
)
66 elif category
== 'experimental':
67 experimental_apis
.append(api
)
69 elif category
== 'private':
70 private_apis
.append(api
)
72 for channel
, apis_by_channel
in platform_dict
['chrome'].iteritems():
73 apis_by_channel
.sort(key
=itemgetter('name'))
74 utils
.MarkLast(apis_by_channel
)
75 platform_dict
['chrome'][channel
] = apis_by_channel
77 for key
, apis
in (('all', all_apis
),
78 ('private', private_apis
),
79 ('experimental', experimental_apis
)):
80 apis
.sort(key
=itemgetter('name'))
82 platform_dict
[key
] = apis
86 'apps': make_dict_for_platform('apps'),
87 'extensions': make_dict_for_platform('extensions'),
90 def _GetCachedAPIData(self
):
91 data_future
= self
._object
_store
.Get('api_data')
93 data
= data_future
.Get()
95 data
= self
._GenerateAPIDict
()
96 self
._object
_store
.Set('api_data', data
)
98 return Future(callback
=resolve
)
101 return self
._GetCachedAPIData
().Get().get(key
)
104 return self
._GetCachedAPIData
()