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. 4 5 import logging 6 import posixpath 7 import traceback 8 9 from data_source import DataSource 10 from docs_server_utils import FormatKey 11 from extensions_paths import ( 12 ARTICLES_TEMPLATES, INTROS_TEMPLATES, PRIVATE_TEMPLATES) 13 from file_system import FileNotFoundError 14 from future import Collect 15 from path_util import AssertIsDirectory 16 17 18 class TemplateDataSource(DataSource): 19 '''Provides a DataSource interface for compiled templates. 20 ''' 21 def __init__(self, server_instance, request=None): 22 self._dir = type(self)._BASE 23 AssertIsDirectory(self._dir) 24 self._request = request 25 self._template_cache = server_instance.compiled_fs_factory.ForTemplates( 26 server_instance.host_file_system_provider.GetTrunk()) 27 self._file_system = server_instance.host_file_system_provider.GetTrunk() 28 29 def get(self, path): 30 try: 31 return self._template_cache.GetFromFile('%s%s' % 32 (self._dir, FormatKey(path))).Get() 33 except FileNotFoundError: 34 logging.warning(traceback.format_exc()) 35 return None 36 37 def Cron(self): 38 futures = [] 39 for root, _, files in self._file_system.Walk(self._dir): 40 futures += [self._template_cache.GetFromFile( 41 posixpath.join(self._dir, root, FormatKey(f))) 42 for f in files 43 if posixpath.splitext(f)[1] == '.html'] 44 return Collect(futures) 45 46 47 class ArticleDataSource(TemplateDataSource): 48 '''Serves templates for Articles. 49 ''' 50 _BASE = ARTICLES_TEMPLATES 51 52 53 class IntroDataSource(TemplateDataSource): 54 '''Serves templates for Intros. 55 ''' 56 _BASE = INTROS_TEMPLATES 57 58 59 class PartialDataSource(TemplateDataSource): 60 '''Serves templates for private templates. 61 ''' 62 _BASE = PRIVATE_TEMPLATES 63