Commit da422dd9 by btimby

DRY

parent 1e8f893b
...@@ -18,6 +18,7 @@ loopback address. ...@@ -18,6 +18,7 @@ loopback address.
import os import os
import stat import stat
import time import time
from functools import wraps
from pyftpdlib import ftpserver from pyftpdlib import ftpserver
...@@ -30,6 +31,23 @@ UID = os.getuid() ...@@ -30,6 +31,23 @@ UID = os.getuid()
GID = os.getgid() 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): class FakeStat(object):
""" """
Pyftpdlib uses stat inside the library. This class emulates the standard Pyftpdlib uses stat inside the library. This class emulates the standard
...@@ -67,53 +85,44 @@ class FTPFS(ftpserver.AbstractedFS): ...@@ -67,53 +85,44 @@ class FTPFS(ftpserver.AbstractedFS):
return False return False
@convert_fs_errors @convert_fs_errors
@decode_args
def open(self, path, mode): def open(self, path, mode):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
return self.fs.open(path, mode) return self.fs.open(path, mode)
def chdir(self, path): def chdir(self, path):
self._cwd = self.ftp2fs(path) self._cwd = self.ftp2fs(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def mkdir(self, path): def mkdir(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
self.fs.makedir(path) self.fs.makedir(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def listdir(self, path): 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)) return map(lambda x: x.encode(self.encoding), self.fs.listdir(path))
@convert_fs_errors @convert_fs_errors
@decode_args
def rmdir(self, path): def rmdir(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
self.fs.removedir(path) self.fs.removedir(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def remove(self, path): def remove(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
self.fs.remove(path) self.fs.remove(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def rename(self, src, dst): 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) self.fs.rename(src, dst)
def chmod(self, path, mode): def chmod(self, path, mode):
raise NotImplementedError() return
@convert_fs_errors @convert_fs_errors
@decode_args
def stat(self, path): def stat(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
info = self.fs.getinfo(path) info = self.fs.getinfo(path)
kwargs = { kwargs = {
'st_size': info.get('size'), 'st_size': info.get('size'),
...@@ -147,27 +156,23 @@ class FTPFS(ftpserver.AbstractedFS): ...@@ -147,27 +156,23 @@ class FTPFS(ftpserver.AbstractedFS):
lstat = stat lstat = stat
@convert_fs_errors @convert_fs_errors
@decode_args
def isfile(self, path): def isfile(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
return self.fs.isfile(path) return self.fs.isfile(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def isdir(self, path): def isdir(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
return self.fs.isdir(path) return self.fs.isdir(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def getsize(self, path): def getsize(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
return self.fs.getsize(path) return self.fs.getsize(path)
@convert_fs_errors @convert_fs_errors
@decode_args
def getmtime(self, path): def getmtime(self, path):
if not isinstance(path, unicode):
path = path.decode(self.encoding)
return self.fs.getinfo(path).time return self.fs.getinfo(path).time
def realpath(self, path): def realpath(self, path):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment