whats_new_data_source.py revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
1# Copyright 2013 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.
4
5from itertools import groupby
6from operator import itemgetter
7import posixpath
8
9from data_source import DataSource
10from extensions_paths import JSON_TEMPLATES, PUBLIC_TEMPLATES
11from future import Future
12
13
14class WhatsNewDataSource(DataSource):
15  ''' This class creates a list of "what is new" by chrome version.
16  '''
17
18  def __init__(self, server_instance, _):
19    self._parse_cache = server_instance.compiled_fs_factory.ForJson(
20        server_instance.host_file_system_provider.GetTrunk())
21    self._object_store = server_instance.object_store_creator.Create(
22        WhatsNewDataSource)
23    self._api_models = server_instance.api_models
24    self._availability_finder = server_instance.availability_finder
25    self._api_categorizer = server_instance.api_categorizer
26
27  def _GenerateChangesListWithVersion(self, platform, whats_new_json):
28    return [{
29      'id': change_id,
30      'type': change['type'],
31      'description': change['description'],
32      'version': change['version']
33    } for change_id, change in whats_new_json.iteritems()]
34
35  def _GetAPIVersion(self, platform, api_name):
36    version = None
37    category = self._api_categorizer.GetCategory(platform, api_name)
38    if category == 'chrome':
39      channel_info = self._availability_finder.GetAPIAvailability(
40          api_name).channel_info
41      channel = channel_info.channel
42      if channel == 'stable':
43        version = channel_info.version
44    return version
45
46  def _GenerateAPIListWithVersion(self, platform):
47    data = []
48    for api_name, api_model in self._api_models.IterModels():
49      version = self._GetAPIVersion(platform, api_name)
50      if version:
51        api = {
52          'name': api_name,
53          'description': api_model.description,
54          'version' : version,
55          'type': 'apis',
56        }
57        data.append(api)
58    data.sort(key=itemgetter('version'))
59    return data
60
61  def _GenerateWhatsNewDict(self):
62    whats_new_json_future = self._parse_cache.GetFromFile(
63        posixpath.join(JSON_TEMPLATES, 'whats_new.json'))
64    def _MakeDictByPlatform(platform):
65      whats_new_json = whats_new_json_future.Get()
66      platform_list = []
67      apis = self._GenerateAPIListWithVersion(platform)
68      apis.extend(self._GenerateChangesListWithVersion(platform,
69          whats_new_json))
70      apis.sort(key=itemgetter('version'), reverse=True)
71      for version, group in groupby(apis, key=itemgetter('version')):
72        whats_new_by_version = {
73          'version': version,
74        }
75        for item in group:
76          item_type = item['type']
77          if item_type not in whats_new_by_version:
78            whats_new_by_version[item_type] = []
79          whats_new_by_version[item_type].append(item)
80        platform_list.append(whats_new_by_version)
81      return platform_list
82
83    def resolve():
84      return {
85        'apps': _MakeDictByPlatform('apps'),
86        'extensions': _MakeDictByPlatform('extensions')
87      }
88    return Future(callback=resolve)
89
90  def _GetCachedWhatsNewData(self):
91    data = self._object_store.Get('whats_new_data').Get()
92    if data is None:
93      data = self._GenerateWhatsNewDict().Get()
94      self._object_store.Set('whats_new_data', data)
95    return data
96
97  def get(self, key):
98    return self._GetCachedWhatsNewData().get(key)
99
100  def Cron(self):
101    return self._GenerateWhatsNewDict()
102