diff options
author | Sascha Silbe <sascha-pgp@silbe.org> | 2013-06-22 07:30:34 (GMT) |
---|---|---|
committer | Sascha Silbe <sascha-pgp@silbe.org> | 2013-06-22 07:30:34 (GMT) |
commit | 8f186bc8a931f14fdab0efdec9b084fde8f2ecfe (patch) | |
tree | c65971264471d7d5395ea2c17d9304c768021f18 | |
parent | 2111710c5f18fa0409fa181e5bebf660fc7823cb (diff) |
fsemulation: add support for "search" directories
Add support for exporting arbitrary search results as a directory. The
directory can be requested using the new API FSEmulation.search() and
will expect to live directly below the root directory (for symlinking
purposes).
Like with all other directories, the root query will be taken into
account.
-rw-r--r-- | fsemulation.py | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/fsemulation.py b/fsemulation.py index 58120fb..0eeca9b 100644 --- a/fsemulation.py +++ b/fsemulation.py @@ -701,12 +701,13 @@ class Directory(FSEntry): class ByTitleDirectory(Directory): def __init__(self, file_system, level, parent): Directory.__init__(self, file_system, level, 0550, parent) + self._query = None def listdir(self): for name in Directory.listdir(self): yield name - for object_id in self._ds.list_object_ids(): + for object_id in self._ds.list_object_ids(self._query): name = self._fs.lookup_title_name(object_id) yield name @@ -714,7 +715,7 @@ class ByTitleDirectory(Directory): for name, entry in Directory.readdir(self): yield name, entry - for object_id, metadata in self._ds.list_metadata(): + for object_id, metadata in self._ds.list_metadata(self._query): name = self._fs.lookup_title_name(object_id, metadata) yield (name, self._get_symlink(object_id, metadata)) @@ -897,6 +898,12 @@ class ByTagsDirectory(Directory): return tags +class SearchResultDirectory(ByTitleDirectory): + def __init__(self, file_system, level, parent, query): + ByTitleDirectory.__init__(self, file_system, level, parent) + self._query = query + + class RootDirectory(Directory): def __init__(self, file_system, mode): Directory.__init__(self, file_system, 0, mode, None) @@ -973,7 +980,10 @@ class FSEmulation(object): return entry - # internal API (for FSEntry derivatives) + def search(self, query): + return SearchResultDirectory(self, 1, self._root_dir, query) + + # internal API def resolve_title_name(self, name): if name not in self._title_name_to_object_id: |