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