From f103688359f6a55ba6010f0b4c18402e9b0b3f3f Mon Sep 17 00:00:00 2001
From: "Mads M. Pedersen" <mmpe@dtu.dk>
Date: Thu, 12 Jan 2017 16:10:12 +0100
Subject: [PATCH] added ftp_file

---
 wetb/utils/ftp_file.py | 101 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 wetb/utils/ftp_file.py

diff --git a/wetb/utils/ftp_file.py b/wetb/utils/ftp_file.py
new file mode 100644
index 0000000..b69b72f
--- /dev/null
+++ b/wetb/utils/ftp_file.py
@@ -0,0 +1,101 @@
+'''
+Created on 30/04/2013
+
+@author: Mads M. Pedersen (mmpe@dtu.dk)
+'''
+
+from ftplib import FTP
+from zipfile import ZipFile
+import io
+import getpass
+
+
+class FtpFile():
+
+    def __init__(self, url, username, password):
+        if url.lower().startswith('ftp://'):
+            url = url[6:]
+        self.url = url
+        self.domain = url.split('/')[0]
+        self.path = '/'.join(url.split('/')[1:])
+
+        self.username = username
+        if password is None:
+            passwrod = getpass.getpass("Enter password for ftp server")
+        self.password = password
+
+    def load(self, open_file=None):
+        ftp = FTP(self.domain)
+        try:
+            ftp.login(self.username, self.password)
+            if open_file is None:
+                open_file = self
+            ftp.retrbinary('RETR /%s' % self.path, open_file.write)
+        finally:
+            ftp.close()
+        open_file.seek(0)
+
+    def write(self, obj):
+        raise NotImplementedError
+
+    def __str__(self):
+        return "%s(url='%s', username='%s', password=None)" % (self.__class__.__name__, self.url, self.username)
+
+    def name(self):
+        return self.path.split('/')[-1]
+
+    def filename(self):
+        return self.path
+
+
+class FtpTxtFile(io.StringIO, FtpFile):
+
+    def __init__(self, url, username, password):
+        FtpFile.__init__(self, url, username, password)
+        io.StringIO.__init__(self)
+        self.load()
+
+
+    def write(self, s):
+        if isinstance(s, bytes):
+            s = s.decode('cp1251')
+        io.StringIO.write(self, s)
+
+
+
+class FtpZipFile(ZipFile, FtpFile):
+
+    def __init__(self, url, username, password):
+        FtpFile.__init__(self, url, username, password)
+        byteIO = io.BytesIO()
+        self.load(byteIO)
+        ZipFile.__init__(self, byteIO)
+
+    def FtpZipTxtFile(self, txt_filename):
+        return FtpZipTxtFile(self.url, self.username, self.password, txt_filename)
+
+
+class FtpZipTxtFile(io.StringIO, FtpZipFile):
+
+    def __init__(self, url, username, password, filename):
+        FtpZipFile.__init__(self, url, username, password)
+        io.StringIO.__init__(self, buf='')
+        fid = self.open(filename)
+        self.buf = fid.read()
+        if self.buf[-1] != "\n":
+            self.buf += "\n"
+        fid.close()
+        self.filename = filename
+
+    def __str__(self):
+        return "%s(url='%s', username='%s', password=None, filename='%s')" % (self.__class__.__name__, self.url, self.username, self.filename)
+
+
+class FtpBinaryFile(io.BytesIO, FtpFile):
+
+    def __init__(self, url, username, password):
+        FtpFile.__init__(self, url, username, password)
+        self.load()
+
+    def __str__(self):
+        return FtpFile.__str__(self)
-- 
GitLab