summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrfkelly0 <rfkelly0@67cdc799-7952-0410-af00-57a81ceafa0f>2009-06-16 02:56:09 +0000
committerrfkelly0 <rfkelly0@67cdc799-7952-0410-af00-57a81ceafa0f>2009-06-16 02:56:09 +0000
commit83092e413355ea75ac515aaa2a00752fbc702587 (patch)
treedffd5d6eaa68604a510c4a10d96ddbfbe2063cbb
parent7edd3203842978c4916fcd71883bad25dd15733d (diff)
downloadpyfilesystem-83092e413355ea75ac515aaa2a00752fbc702587.tar.gz
consistently use @synchronize decorator throughout
git-svn-id: http://pyfilesystem.googlecode.com/svn/trunk@182 67cdc799-7952-0410-af00-57a81ceafa0f
-rw-r--r--fs/multifs.py226
-rw-r--r--fs/zipfs.py124
2 files changed, 140 insertions, 210 deletions
diff --git a/fs/multifs.py b/fs/multifs.py
index 3454e64..8163300 100644
--- a/fs/multifs.py
+++ b/fs/multifs.py
@@ -19,12 +19,9 @@ class MultiFS(FS):
self.fs_sequence = []
self.fs_lookup = {}
+ @synchronize
def __str__(self):
- self._lock.acquire()
- try:
- return "<MultiFS: %s>" % ", ".join(str(fs) for fs in self.fs_sequence)
- finally:
- self._lock.release()
+ return "<MultiFS: %s>" % ", ".join(str(fs) for fs in self.fs_sequence)
__repr__ = __str__
@@ -32,6 +29,7 @@ class MultiFS(FS):
return unicode(self.__str__())
+ @synchronize
def addfs(self, name, fs):
"""Adds a filesystem to the MultiFS.
@@ -39,46 +37,32 @@ class MultiFS(FS):
fs -- The filesystem to add
"""
- self._lock.acquire()
- try:
- if name in self.fs_lookup:
- raise ValueError("Name already exists.")
+ if name in self.fs_lookup:
+ raise ValueError("Name already exists.")
- self.fs_sequence.append(fs)
- self.fs_lookup[name] = fs
- finally:
- self._lock.release()
+ self.fs_sequence.append(fs)
+ self.fs_lookup[name] = fs
+ @synchronize
def removefs(self, name):
"""Removes a filesystem from the sequence.
name -- The name of the filesystem, as used in addfs
"""
- self._lock.acquire()
- try:
- if name not in self.fs_lookup:
- raise ValueError("No filesystem called '%s'"%name)
- fs = self.fs_lookup[name]
- self.fs_sequence.remove(fs)
- del self.fs_lookup[name]
- finally:
- self._lock.release()
+ if name not in self.fs_lookup:
+ raise ValueError("No filesystem called '%s'"%name)
+ fs = self.fs_lookup[name]
+ self.fs_sequence.remove(fs)
+ del self.fs_lookup[name]
+ @synchronize
def __getitem__(self, name):
- self._lock.acquire()
- try:
- return self.fs_lookup[name]
- finally:
- self._lock.release()
+ return self.fs_lookup[name]
+ @synchronize
def __iter__(self):
- self._lock.acquire()
- try:
- return iter(self.fs_sequence[:])
- finally:
- self._lock.release()
-
+ return iter(self.fs_sequence[:])
def _delegate_search(self, path):
for fs in self:
@@ -86,6 +70,7 @@ class MultiFS(FS):
return fs
return None
+ @synchronize
def which(self, path):
"""Retrieves the filesystem that a given path would delegate to.
Returns a tuple of the filesystem's name and the filesystem object itself.
@@ -93,137 +78,98 @@ class MultiFS(FS):
path -- A path in MultiFS
"""
- self._lock.acquire()
- try:
- for fs in self:
- if fs.exists(path):
- for fs_name, fs_object in self.fs_lookup.iteritems():
- if fs is fs_object:
- return fs_name, fs
- raise ResourceNotFoundError(path, msg="Path does not map to any filesystem: %(path)s")
- finally:
- self._lock.release()
+ for fs in self:
+ if fs.exists(path):
+ for fs_name, fs_object in self.fs_lookup.iteritems():
+ if fs is fs_object:
+ return fs_name, fs
+ raise ResourceNotFoundError(path, msg="Path does not map to any filesystem: %(path)s")
+ @synchronize
def getsyspath(self, path, allow_none=False):
- self._lock.acquire()
- try:
- fs = self._delegate_search(path)
- if fs is not None:
- return fs.getsyspath(path, allow_none=allow_none)
- raise ResourceNotFoundError(path)
- finally:
- self._lock.release()
+ fs = self._delegate_search(path)
+ if fs is not None:
+ return fs.getsyspath(path, allow_none=allow_none)
+ raise ResourceNotFoundError(path)
+ @synchronize
def desc(self, path):
- self._lock.acquire()
- try:
- if not self.exists(path):
- raise ResourceNotFoundError(path)
-
- name, fs = self.which(path)
- if name is None:
- return ""
- return "%s, on %s (%s)" % (fs.desc(path), name, fs)
- finally:
- self._lock.release()
+ if not self.exists(path):
+ raise ResourceNotFoundError(path)
+ name, fs = self.which(path)
+ if name is None:
+ return ""
+ return "%s, on %s (%s)" % (fs.desc(path), name, fs)
+ @synchronize
def open(self, path, mode="r",**kwargs):
- self._lock.acquire()
- try:
- for fs in self:
- if fs.exists(path):
- fs_file = fs.open(path, mode, **kwargs)
- return fs_file
+ for fs in self:
+ if fs.exists(path):
+ fs_file = fs.open(path, mode, **kwargs)
+ return fs_file
- raise ResourceNotFoundError(path)
- finally:
- self._lock.release()
+ raise ResourceNotFoundError(path)
+ @synchronize
def exists(self, path):
- self._lock.acquire()
- try:
- return self._delegate_search(path) is not None
- finally:
- self._lock.release()
+ return self._delegate_search(path) is not None
+ @synchronize
def isdir(self, path):
- self._lock.acquire()
- try:
- fs = self._delegate_search(path)
- if fs is not None:
- return fs.isdir(path)
- return False
- finally:
- self._lock.release()
+ fs = self._delegate_search(path)
+ if fs is not None:
+ return fs.isdir(path)
+ return False
+ @synchronize
def isfile(self, path):
- self._lock.acquire()
- try:
- fs = self._delegate_search(path)
- if fs is not None:
- return fs.isfile(path)
- return False
- finally:
- self._lock.release()
+ fs = self._delegate_search(path)
+ if fs is not None:
+ return fs.isfile(path)
+ return False
+ @synchronize
def listdir(self, path="./", *args, **kwargs):
- self._lock.acquire()
- try:
- paths = []
- for fs in self:
- try:
- paths += fs.listdir(path, *args, **kwargs)
- except FSError, e:
- pass
-
- return list(set(paths))
- finally:
- self._lock.release()
+ paths = []
+ for fs in self:
+ try:
+ paths += fs.listdir(path, *args, **kwargs)
+ except FSError, e:
+ pass
+
+ return list(set(paths))
+ @synchronize
def remove(self, path):
- self._lock.acquire()
- try:
- for fs in self:
- if fs.exists(path):
- fs.remove(path)
- return
- raise ResourceNotFoundError(path)
- finally:
- self._lock.release()
+ for fs in self:
+ if fs.exists(path):
+ fs.remove(path)
+ return
+ raise ResourceNotFoundError(path)
+ @synchronize
def removedir(self, path, recursive=False):
- self._lock.acquire()
- try:
- for fs in self:
- if fs.isdir(path):
- fs.removedir(path, recursive)
- return
- raise ResourceNotFoundError(path)
- finally:
- self._lock.release()
+ for fs in self:
+ if fs.isdir(path):
+ fs.removedir(path, recursive)
+ return
+ raise ResourceNotFoundError(path)
+ @synchronize
def rename(self, src, dst):
if not issamedir(src, dst):
raise ValueError("Destination path must the same directory (use the move method for moving to a different directory)")
- self._lock.acquire()
- try:
- for fs in self:
- if fs.exists(src):
- fs.rename(src, dst)
- return
- raise ResourceNotFoundError(path)
- finally:
- self._lock.release()
+ for fs in self:
+ if fs.exists(src):
+ fs.rename(src, dst)
+ return
+ raise ResourceNotFoundError(path)
+ @synchronize
def getinfo(self, path):
- self._lock.acquire()
- try:
- for fs in self:
- if fs.exists(path):
- return fs.getinfo(path)
-
- raise ResourceNotFoundError(path)
- finally:
- self._lock.release()
+ for fs in self:
+ if fs.exists(path):
+ return fs.getinfo(path)
+ raise ResourceNotFoundError(path)
diff --git a/fs/zipfs.py b/fs/zipfs.py
index 2d1bdec..c6470b1 100644
--- a/fs/zipfs.py
+++ b/fs/zipfs.py
@@ -119,59 +119,49 @@ class ZipFS(FS):
def __del__(self):
self.close()
+ @synchronize
def open(self, path, mode="r", **kwargs):
+ path = normpath(path)
+ self.zip_path = path
- self._lock.acquire()
- try:
- path = normpath(path)
- self.zip_path = path
-
- if 'r' in mode:
- if self.zip_mode not in 'ra':
- raise OperationFailedError("open file", path=path, msg="Zip file must be opened for reading ('r') or appending ('a')")
- try:
- contents = self.zf.read(path)
- except KeyError:
- raise ResourceNotFoundError(path)
- return StringIO(contents)
+ if 'r' in mode:
+ if self.zip_mode not in 'ra':
+ raise OperationFailedError("open file", path=path, msg="Zip file must be opened for reading ('r') or appending ('a')")
+ try:
+ contents = self.zf.read(path)
+ except KeyError:
+ raise ResourceNotFoundError(path)
+ return StringIO(contents)
- if 'w' in mode:
- dirname, filename = pathsplit(path)
- if dirname:
- self.temp_fs.makedir(dirname, recursive=True, allow_recreate=True)
+ if 'w' in mode:
+ dirname, filename = pathsplit(path)
+ if dirname:
+ self.temp_fs.makedir(dirname, recursive=True, allow_recreate=True)
- self._add_resource(path)
- f = _TempWriteFile(self.temp_fs, path, self._on_write_close)
+ self._add_resource(path)
+ f = _TempWriteFile(self.temp_fs, path, self._on_write_close)
- return f
+ return f
- raise ValueError("Mode must contain be 'r' or 'w'")
- finally:
- self._lock.release()
+ raise ValueError("Mode must contain be 'r' or 'w'")
+ @synchronize
def getcontents(self, path):
- self._lock.acquire()
+ if not self.exists(path):
+ raise ResourceNotFoundError(path)
+ path = normpath(path)
try:
- if not self.exists(path):
- raise ResourceNotFoundError(path)
- path = normpath(path)
- try:
- contents = self.zf.read(path)
- except KeyError:
- raise ResourceNotFoundError(path)
- except RuntimeError:
- raise OperationFailedError("read file", path=path, msg="Zip file must be oppened with 'r' or 'a' to read")
- return contents
- finally:
- self._lock.release()
-
+ contents = self.zf.read(path)
+ except KeyError:
+ raise ResourceNotFoundError(path)
+ except RuntimeError:
+ raise OperationFailedError("read file", path=path, msg="Zip file must be oppened with 'r' or 'a' to read")
+ return contents
+
+ @synchronize
def _on_write_close(self, filename):
- self._lock.acquire()
- try:
- sys_path = self.temp_fs.getsyspath(filename)
- self.zf.write(sys_path, filename)
- finally:
- self._lock.release()
+ sys_path = self.temp_fs.getsyspath(filename)
+ self.zf.write(sys_path, filename)
def desc(self, path):
if self.isdir(path):
@@ -188,40 +178,34 @@ class ZipFS(FS):
def exists(self, path):
return self._path_fs.exists(path)
- def makedir(self, dirname, mode=0777, recursive=False, allow_recreate=False):
- self._lock.acquire()
- try:
- dirname = normpath(dirname)
- if self.zip_mode not in "wa":
- raise OperationFailedError("create directory", path=dirname, msg="Zip file must be opened for writing ('w') or appending ('a')")
- if not dirname.endswith('/'):
- dirname += '/'
- self._add_resource(dirname)
- finally:
- self._lock.release()
+ @synchronize
+ def makedir(self, dirname, recursive=False, allow_recreate=False):
+ dirname = normpath(dirname)
+ if self.zip_mode not in "wa":
+ raise OperationFailedError("create directory", path=dirname, msg="Zip file must be opened for writing ('w') or appending ('a')")
+ if not dirname.endswith('/'):
+ dirname += '/'
+ self._add_resource(dirname)
def listdir(self, path="/", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False):
return self._path_fs.listdir(path, wildcard, full, absolute, dirs_only, files_only)
+ @synchronize
def getinfo(self, path):
- self._lock.acquire()
+ if not self.exists(path):
+ return ResourceNotFoundError(path)
+ path = normpath(path).lstrip('/')
try:
- if not self.exists(path):
- return ResourceNotFoundError(path)
- path = normpath(path).lstrip('/')
- try:
- zi = self.zf.getinfo(path)
- zinfo = dict((attrib, getattr(zi, attrib)) for attrib in dir(zi) if not attrib.startswith('_'))
- except KeyError:
- zinfo = {'file_size':0}
- info = {'size' : zinfo['file_size'] }
- if 'date_time' in zinfo:
- info['created_time'] = datetime.datetime(*zinfo['date_time'])
- info.update(zinfo)
- return info
- finally:
- self._lock.release()
+ zi = self.zf.getinfo(path)
+ zinfo = dict((attrib, getattr(zi, attrib)) for attrib in dir(zi) if not attrib.startswith('_'))
+ except KeyError:
+ zinfo = {'file_size':0}
+ info = {'size' : zinfo['file_size'] }
+ if 'date_time' in zinfo:
+ info['created_time'] = datetime.datetime(*zinfo['date_time'])
+ info.update(zinfo)
+ return info