Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / common / extensions / docs / server2 / template_data_source.py
blob0fdad5c1fd490e555e1558a5da4d69166adcee93
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 import logging
6 import posixpath
7 import traceback
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 All
15 from path_util import AssertIsDirectory
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.GetMaster())
27 self._file_system = server_instance.host_file_system_provider.GetMaster()
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
37 def Refresh(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 All(futures)
47 class ArticleDataSource(TemplateDataSource):
48 '''Serves templates for Articles.
49 '''
50 _BASE = ARTICLES_TEMPLATES
53 class IntroDataSource(TemplateDataSource):
54 '''Serves templates for Intros.
55 '''
56 _BASE = INTROS_TEMPLATES
59 class PartialDataSource(TemplateDataSource):
60 '''Serves templates for private templates.
61 '''
62 _BASE = PRIVATE_TEMPLATES