diff options
author | btimby <btimby@67cdc799-7952-0410-af00-57a81ceafa0f> | 2012-04-21 19:13:56 +0000 |
---|---|---|
committer | btimby <btimby@67cdc799-7952-0410-af00-57a81ceafa0f> | 2012-04-21 19:13:56 +0000 |
commit | d7db15e914a8b76e8eebad11b39eb8dda847c6c4 (patch) | |
tree | a5e7100c6f751370815a0e944aee528877c00e3d | |
parent | 8c66ea7847d6ab44ca27e69b3b04f25315550c00 (diff) | |
download | pyfilesystem-d7db15e914a8b76e8eebad11b39eb8dda847c6c4.tar.gz |
DRY
git-svn-id: http://pyfilesystem.googlecode.com/svn/trunk@780 67cdc799-7952-0410-af00-57a81ceafa0f
-rw-r--r-- | fs/expose/ftp.py | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/fs/expose/ftp.py b/fs/expose/ftp.py index 12f0f7a..071b5cf 100644 --- a/fs/expose/ftp.py +++ b/fs/expose/ftp.py @@ -18,6 +18,7 @@ loopback address. import os import stat import time +from functools import wraps from pyftpdlib import ftpserver @@ -30,6 +31,23 @@ UID = os.getuid() GID = os.getgid() +def decode_args(f): + """ + Decodes string arguments using the decoding defined on the method's class. + This decorator is for use on methods (functions which take a class or instance + as the first parameter). + """ + @wraps(f) + def wrapper(self, *args): + encoded = [] + for arg in args: + if isinstance(arg, str): + arg = arg.decode(self.encoding) + encoded.append(arg) + return f(self, *encoded) + return wrapper + + class FakeStat(object): """ Pyftpdlib uses stat inside the library. This class emulates the standard @@ -67,53 +85,44 @@ class FTPFS(ftpserver.AbstractedFS): return False @convert_fs_errors + @decode_args def open(self, path, mode): - if not isinstance(path, unicode): - path = path.decode(self.encoding) return self.fs.open(path, mode) def chdir(self, path): self._cwd = self.ftp2fs(path) @convert_fs_errors + @decode_args def mkdir(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) self.fs.makedir(path) @convert_fs_errors + @decode_args def listdir(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) return map(lambda x: x.encode(self.encoding), self.fs.listdir(path)) @convert_fs_errors + @decode_args def rmdir(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) self.fs.removedir(path) @convert_fs_errors + @decode_args def remove(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) self.fs.remove(path) @convert_fs_errors + @decode_args def rename(self, src, dst): - if not isinstance(src, unicode): - src = src.decode(self.encoding) - if not isinstance(dst, unicode): - dst = dst.decode(self.encoding) self.fs.rename(src, dst) def chmod(self, path, mode): - raise NotImplementedError() + return @convert_fs_errors + @decode_args def stat(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) info = self.fs.getinfo(path) kwargs = { 'st_size': info.get('size'), @@ -147,27 +156,23 @@ class FTPFS(ftpserver.AbstractedFS): lstat = stat @convert_fs_errors + @decode_args def isfile(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) return self.fs.isfile(path) @convert_fs_errors + @decode_args def isdir(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) return self.fs.isdir(path) @convert_fs_errors + @decode_args def getsize(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) return self.fs.getsize(path) @convert_fs_errors + @decode_args def getmtime(self, path): - if not isinstance(path, unicode): - path = path.decode(self.encoding) return self.fs.getinfo(path).time def realpath(self, path): |