Chromium Code Reviews| Index: chrome/common/extensions/docs/server2/host_file_system_provider.py |
| diff --git a/chrome/common/extensions/docs/server2/host_file_system_provider.py b/chrome/common/extensions/docs/server2/host_file_system_provider.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c55e1e694dd5b5f708448dad794007ac0cfa07b2 |
| --- /dev/null |
| +++ b/chrome/common/extensions/docs/server2/host_file_system_provider.py |
| @@ -0,0 +1,88 @@ |
| +# Copyright 2013 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +from caching_file_system import CachingFileSystem |
| +from local_file_system import LocalFileSystem |
| +from offline_file_system import OfflineFileSystem |
| +from subversion_file_system import SubversionFileSystem |
| +from third_party.json_schema_compiler.memoize import memoize |
| + |
|
not at google - send to devlin
2013/10/08 15:48:39
no amount of --similarity=? will convince git cl t
Jeffrey Yasskin
2013/10/08 17:46:05
Half the time I try to increase the --similarity a
not at google - send to devlin
2013/10/08 18:27:37
hm ok I'll give it a go.
|
| + |
| +class HostFileSystemProvider(object): |
|
Jeffrey Yasskin
2013/10/08 17:46:05
What's the difference between a "Creator" and a "P
not at google - send to devlin
2013/10/08 18:27:37
the memoization is an implementation detail, thoug
|
| + '''Provides cached instances of host file systems for trunk or any branch. |
| + ''' |
| + def __init__(self, |
| + object_store_creator, |
| + max_trunk_revision=None, |
| + default_trunk_instance=None, |
| + offline=False, |
| + constructor_for_test=None): |
| + ''' |
| + |object_store_creator| |
| + Provides caches for file systems that need one. |
| + |max_trunk_revision| |
| + If not None, the maximum revision that a 'trunk' file system will be |
| + created at. If None, 'trunk' file systems will use HEAD. |
| + |default_trunk_instance| |
| + If not None, 'trunk' file systems provided by this class without a |
| + specific revision will return |default_trunk_instance| instead. |
| + |offline| |
| + If True all provided file systems will be wrapped in an OfflineFileSystem. |
| + |constructor_for_test| |
| + Provides a custom constructor rather than creating SubversionFileSystems. |
| + ''' |
| + self._object_store_creator = object_store_creator |
| + self._max_trunk_revision = max_trunk_revision |
| + self._default_trunk_instance = default_trunk_instance |
| + self._offline = offline |
| + self._constructor_for_test = constructor_for_test |
|
Jeffrey Yasskin
2013/10/08 17:46:05
Don't do it in this change (to keep the diff small
not at google - send to devlin
2013/10/08 18:27:37
SGTM.
|
| + |
| + @memoize |
|
Jeffrey Yasskin
2013/10/08 17:46:05
Memoization is dangerous in long-lived servers whe
not at google - send to devlin
2013/10/08 18:27:37
that's not the level that the memoization happens
Jeffrey Yasskin
2013/10/08 20:49:39
'k, sounds good.
|
| + def GetTrunk(self, revision=None): |
|
Jeffrey Yasskin
2013/10/08 17:46:05
Please describe the meaning of 'revision' on trunk
not at google - send to devlin
2013/10/08 18:27:37
Done.
|
| + if revision is None: |
| + if self._default_trunk_instance is not None: |
| + return self._default_trunk_instance |
| + return self._Create('trunk', revision=self._max_trunk_revision) |
| + if self._max_trunk_revision is not None: |
| + revision = min(revision, self._max_trunk_revision) |
| + return self._Create('trunk', revision=revision) |
| + |
| + @memoize |
|
Jeffrey Yasskin
2013/10/08 17:46:05
Branches also change over time, but maybe we don't
not at google - send to devlin
2013/10/08 18:27:37
correct, branches change, and it would be seriousl
Jeffrey Yasskin
2013/10/08 20:49:39
Given my misunderstanding about this memoization t
not at google - send to devlin
2013/10/08 21:29:36
Strictly speaking yes. We should be making sure th
|
| + def GetBranch(self, branch): |
| + '''Creates either SVN file systems or specialized file systems from the |
|
Jeffrey Yasskin
2013/10/08 17:46:05
This seems like it still belongs on _Create. You s
not at google - send to devlin
2013/10/08 18:27:37
Done.
|
| + constructor passed into this instance. Wraps the resulting file system in |
| + an Offline file system if the offline flag is set, and finally wraps it in a |
| + Caching file system. |
| + ''' |
| + assert isinstance(branch, basestring), 'Branch %s must be a string' % branch |
| + assert branch != 'trunk', 'Cannot specify branch=\'trunk\', use GetTrunk()' |
| + return self._Create(branch) |
| + |
| + def _Create(self, branch, revision=None): |
| + if self._constructor_for_test is not None: |
| + file_system = self._constructor_for_test(branch=branch, revision=revision) |
| + else: |
| + file_system = SubversionFileSystem.Create(branch=branch, |
| + revision=revision) |
| + if self._offline: |
| + file_system = OfflineFileSystem(file_system) |
| + return CachingFileSystem(file_system, self._object_store_creator) |
| + |
| + @staticmethod |
|
Jeffrey Yasskin
2013/10/08 17:46:05
If these had been @classmethod, you wouldn't have
not at google - send to devlin
2013/10/08 18:27:37
that sounds like a nice pattern in general, thanks
|
| + def ForLocal(object_store_creator): |
| + '''Used in creating a server instance on localhost. |
| + ''' |
| + return HostFileSystemProvider( |
| + object_store_creator, |
| + constructor_for_test=lambda **_: LocalFileSystem.Create()) |
|
Jeffrey Yasskin
2013/10/08 17:46:05
'constructor_for_test' seems like the wrong name i
not at google - send to devlin
2013/10/08 18:27:37
Local only makes sense when testing (or when runni
|
| + |
| + @staticmethod |
| + def ForTest(file_system, object_store_creator): |
| + '''Used in creating a test server instance. The HostFileSystemProvider |
| + returned here will always return |file_system| when its Create() method is |
| + called. |
| + ''' |
| + return HostFileSystemProvider( |
| + object_store_creator, |
| + constructor_for_test=lambda **_: file_system) |