summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbtimby <btimby@67cdc799-7952-0410-af00-57a81ceafa0f>2012-04-21 19:13:56 +0000
committerbtimby <btimby@67cdc799-7952-0410-af00-57a81ceafa0f>2012-04-21 19:13:56 +0000
commitd7db15e914a8b76e8eebad11b39eb8dda847c6c4 (patch)
treea5e7100c6f751370815a0e944aee528877c00e3d
parent8c66ea7847d6ab44ca27e69b3b04f25315550c00 (diff)
downloadpyfilesystem-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.py55
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):