Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7816)

Unified Diff: chrome/common/extensions/docs/server2/compiled_file_system.py

Issue 13470005: Refactor the devserver to make it easier to control caching (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cduvall, rebase Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/server2/compiled_file_system.py
diff --git a/chrome/common/extensions/docs/server2/compiled_file_system.py b/chrome/common/extensions/docs/server2/compiled_file_system.py
index 6c547ba2a2b9a9efc9f9faffc0692872f80b023a..4cea9c7a807e8821c4ccbf04408f4f575c56fbe4 100644
--- a/chrome/common/extensions/docs/server2/compiled_file_system.py
+++ b/chrome/common/extensions/docs/server2/compiled_file_system.py
@@ -2,31 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import os
-
-import object_store
-
-APPS = 'Apps'
-APPS_FS = 'AppsFileSystem'
-CRON = 'Cron'
-EXTENSIONS = 'Extensions'
-EXTENSIONS_FS = 'ExtensionsFileSystem'
-CRON_FILE_LISTING = 'Cron.FileListing'
-CRON_GITHUB_INVALIDATION = 'Cron.GithubInvalidation'
-CRON_INVALIDATION = 'Cron.Invalidation'
-HANDLEBAR = 'Handlebar'
-IDL = 'IDL'
-IDL_NO_REFS = 'IDLNoRefs'
-IDL_NAMES = 'IDLNames'
-INTRO = 'Intro'
-JSON = 'JSON'
-JSON_NO_REFS = 'JSONNoRefs'
-LIST = 'List'
-NAMES = 'Names'
-PERMS = 'Perms'
-SIDENAV = 'Sidenav'
-STATIC = 'Static'
-ZIP = 'Zip'
+from object_store_creator import ObjectStoreCreator
class _CacheEntry(object):
def __init__(self, cache_data, version):
@@ -37,49 +13,67 @@ class CompiledFileSystem(object):
"""This class caches FileSystem data that has been processed.
"""
class Factory(object):
- """A class to build a CompiledFileSystem.
+ """A class to build a CompiledFileSystem backed by |file_system|.
+ Set an explicit |store_type| for tests.
"""
- def __init__(self, file_system, object_store):
+ def __init__(self, file_system, store_type=None):
self._file_system = file_system
- self._object_store = object_store
+ self._store_type = store_type
+ self._identity_instance = None
- def Create(self, populate_function, namespace, version=None):
+ def Create(self, populate_function, cls, category=None, version=None):
"""Create a CompiledFileSystem that populates the cache by calling
|populate_function| with (path, data), where |data| is the data that was
- fetched from |path|. The keys to the cache are put in the namespace
- specified by |namespace|, and optionally adding |version|. """
- return CompiledFileSystem(self._file_system,
- populate_function,
- self._object_store,
- namespace,
- version=version)
+ fetched from |path|.
+ The namespace for the file system is derived like ObjectStoreCreator: from
+ |cls| along with an optional |category| and |version|.
+ """
+ assert isinstance(cls, type)
+ assert not cls.__name__[0].islower() # guard against non-class types
+ full_name = cls.__name__
+ if category is not None:
+ full_name = '%s/%s' % (full_name, category)
+ return self._Create(populate_function, full_name, version=version)
+
+ def GetOrCreateIdentity(self):
+ '''Handy helper to get or create the identity compiled file system.
+ GetFromFile will return the file's contents.
+ GetFromFileListing will return the directory list.
+ '''
+ if self._identity_instance is None:
+ self._identity_instance = self._Create(lambda _, x: x, 'id')
+ return self._identity_instance
+
+ def _Create(self, populate_function, full_name, version=None):
+ object_store_creator = ObjectStoreCreator(CompiledFileSystem,
+ store_type=self._store_type)
+ return CompiledFileSystem(
+ self._file_system,
+ populate_function,
+ object_store_creator.Create(category='%s/file' % full_name,
+ version=version),
+ object_store_creator.Create(category='%s/list' % full_name,
+ version=version))
def __init__(self,
file_system,
populate_function,
- object_store,
- namespace,
- version=None):
+ file_object_store,
+ list_object_store):
self._file_system = file_system
self._populate_function = populate_function
- self._object_store = object_store
- self._namespace = 'CompiledFileSystem.' + namespace
- if version is not None:
- self._namespace = '%s.%s' % (self._namespace, version)
+ self._file_object_store = file_object_store
+ self._list_object_store = list_object_store
- def _MakeKey(self, key):
- return self._namespace + '.' + key
-
- def _RecursiveList(self, files):
- all_files = files[:]
- dirs = {}
- for filename in files:
+ def _RecursiveList(self, path):
+ files = []
+ for filename in self._file_system.ReadSingle(path):
if filename.endswith('/'):
- all_files.remove(filename)
- dirs.update(self._file_system.Read([filename]).Get())
- for dir_, files in dirs.iteritems():
- all_files.extend(self._RecursiveList([dir_ + f for f in files]))
- return all_files
+ files.extend(['%s%s' % (filename, f)
+ for f in self._RecursiveList('%s%s' % (path, filename))])
+ else:
+ files.append(filename)
+ return files
def GetFromFile(self, path, binary=False):
"""Calls |populate_function| on the contents of the file at |path|. If
@@ -88,18 +82,13 @@ class CompiledFileSystem(object):
will be ignored.
"""
version = self._file_system.Stat(path).version
- cache_entry = self._object_store.Get(self._MakeKey(path),
- object_store.FILE_SYSTEM_CACHE,
- time=0).Get()
+ cache_entry = self._file_object_store.Get(path, time=0).Get()
if (cache_entry is not None) and (version == cache_entry.version):
return cache_entry._cache_data
cache_data = self._populate_function(
path,
self._file_system.ReadSingle(path, binary=binary))
- self._object_store.Set(self._MakeKey(path),
- _CacheEntry(cache_data, version),
- object_store.FILE_SYSTEM_CACHE,
- time=0)
+ self._file_object_store.Set(path, _CacheEntry(cache_data, version), time=0)
return cache_data
def GetFromFileListing(self, path):
@@ -109,18 +98,9 @@ class CompiledFileSystem(object):
if not path.endswith('/'):
path += '/'
version = self._file_system.Stat(path).version
- cache_entry = self._object_store.Get(
- self._MakeKey(path),
- object_store.FILE_SYSTEM_CACHE_LISTING,
- time=0).Get()
+ cache_entry = self._list_object_store.Get(path, time=0).Get()
if (cache_entry is not None) and (version == cache_entry.version):
return cache_entry._cache_data
- cache_data = self._populate_function(
- path,
- self._RecursiveList(
- [path + f for f in self._file_system.ReadSingle(path)]))
- self._object_store.Set(self._MakeKey(path),
- _CacheEntry(cache_data, version),
- object_store.FILE_SYSTEM_CACHE_LISTING,
- time=0)
+ cache_data = self._populate_function(path, self._RecursiveList(path))
+ self._list_object_store.Set(path, _CacheEntry(cache_data, version), time=0)
return cache_data

Powered by Google App Engine
This is Rietveld 408576698