15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import logging 60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import posixpath 70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import traceback 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from data_source import DataSource 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)from docs_server_utils import FormatKey 1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)from extensions_paths import ( 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ARTICLES_TEMPLATES, INTROS_TEMPLATES, PRIVATE_TEMPLATES) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from file_system import FileNotFoundError 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from future import All 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from path_util import AssertIsDirectory 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class TemplateDataSource(DataSource): 190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) '''Provides a DataSource interface for compiled templates. 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ''' 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) def __init__(self, server_instance, request=None): 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) self._dir = type(self)._BASE 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) AssertIsDirectory(self._dir) 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) self._request = request 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self._template_cache = server_instance.compiled_fs_factory.ForTemplates( 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_instance.host_file_system_provider.GetMaster()) 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci self._file_system = server_instance.host_file_system_provider.GetMaster() 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def get(self, path): 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return self._template_cache.GetFromFile('%s%s' % 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) (self._dir, FormatKey(path))).Get() 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch except FileNotFoundError: 340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) logging.warning(traceback.format_exc()) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return None 360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci def Refresh(self, path): 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) futures = [] 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for root, _, files in self._file_system.Walk(self._dir): 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) futures += [self._template_cache.GetFromFile( 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch posixpath.join(self._dir, root, FormatKey(f))) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for f in files 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if posixpath.splitext(f)[1] == '.html'] 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return All(futures) 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ArticleDataSource(TemplateDataSource): 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '''Serves templates for Articles. 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ''' 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) _BASE = ARTICLES_TEMPLATES 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class IntroDataSource(TemplateDataSource): 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '''Serves templates for Intros. 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ''' 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) _BASE = INTROS_TEMPLATES 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class PartialDataSource(TemplateDataSource): 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '''Serves templates for private templates. 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ''' 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) _BASE = PRIVATE_TEMPLATES 63