Hello community,

here is the log from the commit of package python-pyftpdlib for 
openSUSE:Leap:15.2 checked in at 2020-03-02 13:20:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-pyftpdlib (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.python-pyftpdlib.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pyftpdlib"

Mon Mar  2 13:20:50 2020 rev:4 rq:776971 version:1.5.5

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-pyftpdlib/python-pyftpdlib.changes      
2020-01-15 15:51:56.751546404 +0100
+++ 
/work/SRC/openSUSE:Leap:15.2/.python-pyftpdlib.new.26092/python-pyftpdlib.changes
   2020-03-02 13:20:50.446098230 +0100
@@ -1,0 +2,11 @@
+Tue May 28 11:07:18 UTC 2019 - Tomáš Chvátal <tchva...@suse.com>
+
+- Do not remove tests, other packages import them
+
+-------------------------------------------------------------------
+Sat May 25 09:29:17 UTC 2019 - Tomáš Chvátal <tchva...@suse.com>
+
+- Update to 1.5.5:
+  * Various minor fixes and documentation updates
+
+-------------------------------------------------------------------

Old:
----
  pyftpdlib-1.5.4.tar.gz

New:
----
  pyftpdlib-1.5.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pyftpdlib.spec ++++++
--- /var/tmp/diff_new_pack.oEnysL/_old  2020-03-02 13:20:50.758098849 +0100
+++ /var/tmp/diff_new_pack.oEnysL/_new  2020-03-02 13:20:50.762098857 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-pyftpdlib
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 # Copyright (c) 2016 LISA GmbH, Bingen, Germany.
 #
 # All modifications and additions to the file contributed by third parties
@@ -21,7 +21,7 @@
 # Tests randomly fail: https://github.com/giampaolo/pyftpdlib/issues/386
 %bcond_with     test
 Name:           python-pyftpdlib
-Version:        1.5.4
+Version:        1.5.5
 Release:        0
 Summary:        Asynchronous FTP server library for Python
 License:        MIT
@@ -57,7 +57,7 @@
 
 %install
 %python_install
-%python_expand %fdupes -s %{buildroot}%{$python_sitelib}
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %if %{with test}
 %check

++++++ pyftpdlib-1.5.4.tar.gz -> pyftpdlib-1.5.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/CREDITS new/pyftpdlib-1.5.5/CREDITS
--- old/pyftpdlib-1.5.4/CREDITS 2017-12-30 09:44:57.000000000 +0100
+++ new/pyftpdlib-1.5.5/CREDITS 2019-03-27 17:31:43.000000000 +0100
@@ -48,6 +48,12 @@
 D: Inclusion of pyftpdlib in Far Manager, a file and archive manager for 
Windows
    
http://www.farmanager.com/enforum/viewtopic.php?t=640&highlight=&sid=12d4d90f27f421243bcf7a0e3c516efb.
 
+N: Andrew Shulgin
+C: Ukraine
+E: andrewshulgi...@gmail.com
+D: Fixing CR duplication in ASCII mode downloads.
+   https://github.com/giampaolo/pyftpdlib/pull/492
+
 N: Arkadiusz Wahlig
 C: Germany
 W: http://arkadiusz-wahlig.blogspot.com
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/HISTORY.rst 
new/pyftpdlib-1.5.5/HISTORY.rst
--- old/pyftpdlib-1.5.4/HISTORY.rst     2018-05-04 23:04:49.000000000 +0200
+++ new/pyftpdlib-1.5.5/HISTORY.rst     2019-04-04 11:10:16.000000000 +0200
@@ -1,5 +1,17 @@
 Bug tracker at https://github.com/giampaolo/pyftpdlib/issues
 
+Version: 1.5.5 - 2019-04-04
+===========================
+
+**Enhancements**
+
+- #495: colored test output.
+
+**Bug fixes**
+
+- #492: CRLF line endings are replaced with CRCRLF in ASCII mode downloads.
+- #496: import error due to multiprocessing.Lock() bug.
+
 Version: 1.5.4 - 2018-05-04
 ===========================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/Makefile new/pyftpdlib-1.5.5/Makefile
--- old/pyftpdlib-1.5.4/Makefile        2018-04-27 08:26:44.000000000 +0200
+++ new/pyftpdlib-1.5.5/Makefile        2019-03-27 17:32:12.000000000 +0100
@@ -2,7 +2,7 @@
 # To use a specific Python version run:
 # $ make install PYTHON=python3.3
 
-PYTHON = python
+PYTHON = python3
 TSCRIPT = pyftpdlib/test/runner.py
 ARGS =
 DEV_DEPS = \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/PKG-INFO new/pyftpdlib-1.5.5/PKG-INFO
--- old/pyftpdlib-1.5.4/PKG-INFO        2018-05-04 23:06:51.000000000 +0200
+++ new/pyftpdlib-1.5.5/PKG-INFO        2019-04-04 11:11:03.000000000 +0200
@@ -1,12 +1,16 @@
 Metadata-Version: 2.1
 Name: pyftpdlib
-Version: 1.5.4
+Version: 1.5.5
 Summary: Very fast asynchronous FTP server library
 Home-page: https://github.com/giampaolo/pyftpdlib/
 Author: Giampaolo Rodola'
 Author-email: g.rod...@gmail.com
 License: MIT
-Description: .. image:: 
https://img.shields.io/travis/giampaolo/pyftpdlib/master.svg?maxAge=3600&label=Linux%20/%20OSX
+Description: .. image:: http://pepy.tech/badge/pyftpdlib
+            :target: http://pepy.tech/project/pyftpdlib
+            :alt: Downloads
+        
+        .. image:: 
https://img.shields.io/travis/giampaolo/pyftpdlib/master.svg?maxAge=3600&label=Linux%20/%20OSX
             :target: https://travis-ci.org/giampaolo/pyftpdlib
             :alt: Linux tests (Travis)
         
@@ -194,67 +198,6 @@
         software to the
         `adoptions list 
<http://pyftpdlib.readthedocs.io/en/latest/adoptions.html>`__.
         
-        Timeline
-        ========
-        
-        - 2018-05-04: version `1.5.4 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.4.tar.gz>`__ 
released.
-        - 2017-11-04: version `1.5.3 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.3.tar.gz>`__ 
released.
-        - 2017-04-06: version `1.5.2 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.2.tar.gz>`__ 
released.
-        - 2016-05-02: version `1.5.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.1.tar.gz>`__ 
released.
-        - 2015-12-13: version `1.5.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.0.tar.gz>`__ 
released.
-        - 2014-06-03: version `1.4.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.4.0.tar.gz>`__ 
released.
-        - 2014-04-12: version `1.3.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.1.tar.gz>`__ 
released.
-        - 2013-11-07: version `1.3.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.0.tar.gz>`__ 
released.
-        - 2013-04-22: version `1.2.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.2.0.tar.gz>`__ 
released.
-        - 2013-04-09: version `1.1.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.1.0.tar.gz>`__ 
released.
-        - 2013-02-22: version `1.0.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.1.tar.gz>`__ 
released.
-        - 2013-02-19: version `1.0.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.0.tar.gz>`__ 
released.
-        - 2012-05-14: pyftpdlib included in `ftp-cloudfs 
<https://github.com/chmouel/ftp-cloudfs/>`__ project.
-        - 2012-01-25: version `0.7.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.7.0.tar.gz>`__ 
released.
-        - 2011-12-01: pyftpdlib included in `feitp-server 
<http://code.google.com/p/feitp-server/>`__ project.
-        - 2011-09-26: pyftpdlib included in `ftpmaster 
<https://github.com/MarkLIC/ftpmaster>`__ project.
-        - 2011-07-09: pyftpdlib included in `bftpd 
<http://bftpd.sourceforge.net/>`__ project.
-        - 2011-07-09: pyftpdlib included in `fastersync 
<http://code.google.com/p/fastersync/>`__ project.
-        - 2011-01-31: pyftpdlib included in `put.io FTP connector project 
<http://code.google.com/p/pyftpdlib/wiki/Adoptions?ts=1296442469&updated=Adoptions#put.io*FTP*connector>`__.
-        - 2011-01-24: version `0.6.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.6.0.tar.gz>`__ 
released.
-        - 2010-12-14: added `donations 
<http://code.google.com/p/pyftpdlib/wiki/Donate>`__.
-        - 2010-08-24: pyftpdlib included in `peerscape 
<http://www.peerscape.org/>`__ project.
-        - 2010-07-15: pyftpdlib included in `Faetus 
<http://tomatohater.com/faetus/>`__ project.
-        - 2010-07-11: pyftpdlib included in `Pyfilesystem 
<http://code.google.com/p/pyfilesystem>`__ project.
-        - 2010-06-28: pyftpdlib has been `packaged for Debian 
<http://packages.debian.org/sid/python-pyftpdlib>`__
-        - 2010-04-28: pyftpdlib included in `sierramodulepos 
<http://forge.openbravo.com/plugins/mwiki/index.php/MobilePOS>`__ project.
-        - 2010-03-20: `http://www.smartfile.com <http://www.smartfile.com>`__ 
uses pyftpdlib.
-        - 2010-01-13: pyftpdlib included in `zenftp 
<http://code.irondojo.com/>`__ project.
-        - 2009-12-26: pyftpdlib included in `Symbian Python FTP server 
<http://code.google.com/p/sypftp>`__ project.
-        - 2009-11-04: `www.netplay.it <http://www.netplay.it>`__ uses 
pyftpdlib.
-        - 2009-11-04: `www.adcast.tv <http://www.adcast.tv>`__ uses pyftpdlib.
-        - 2009-11-04: `www.bitsontherun.com <http://www.bitsontherun.com>`__ 
uses pyftpdlib.
-        - 2009-11-02: pyftpdlib included in `ftp-cloudfs 
<http://github.com/chmouel/ftp-cloudfs>`__ project.
-        - 2009-09-14: version `0.5.2 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.2.tar.gz>`__ 
released.
-        - 2009-08-10: pyftpdlib included in `Imgserve 
<http://github.com/wuzhe/imgserve/tree/master>`__ project.
-        - 2009-07-22: pyftpdlib included in  `Plumi <http://plumi.org/wiki>`__ 
project.
-        - 2009-04-02: pyftpdlib RPM-packaged and ported on `Fedora 
<https://admin.fedoraproject.org/pkgdb/packages/name/pyftpdlib>`__ to make 
users can easily install on it via *yum install pyftpdlib*.
-        - 2009-03-28: pyftpdlib included in  `Bazaar 
<http://bazaar-vcs.org/>`__ project.
-        - 2009-02-23: pyftpdlib included in `ShareFTP 
<http://git.logfish.net/shareftp.git/>`__ project.
-        - 2009-01-21: version `0.5.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.1.tar.gz>`__ 
released.
-        - 2008-12-27: pyftpdlib included in `Google Chromium 
<http://code.google.com/intl/it-IT/chromium/>`__, the open source project 
behind `Google Chrome <http://www.google.com/chrome>`__.
-        - 2008-12-27: pyftpdlib ported on `GNU Darwin 
<http://www.gnu-darwin.org/>`__ systems to make users can easily install on it.
-        - 2008-11-26: pyftpdlib included in `OpenERP <http://openerp.com>`__.
-        - 2008-10-26: pyftpdlib included in `Python for OpenVMS 
<http://www.vmspython.org/>`__ as standard package.
-        - 2008-10-09: pyftpdlib included in `Shareme 
<http://bbs.archlinux.org/viewtopic.php?pid=431474>`__ project.
-        - 2008-09-20: version `0.5.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.0.tar.gz>`__ 
released.
-        - 2008-08-10: pyftpdlib included in `Manent 
<http://trac.manent-backup.com/>`__ project.
-        - 2008-05-16: version `0.4.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.4.0.tar.gz>`__ 
released.
-        - 2008-04-09: pyftpdlib used as backend for `gpftpd 
<http://arkadiusz-wahlig.blogspot.com/2008/04/hosting-files-on-google.html>`__, 
an FTP server for managing files hosted on `Google Pages 
<http://-ages.google.com>`__.
-        - 2008-01-17: version `0.3.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.3.0.tar.gz>`__ 
released.
-        - 2007-10-14: pyftpdlib included in `Aksy 
<http://walco.n--tree.net/projects/aksy/wiki>`__ project.
-        - 2007-09-17: version `0.2.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.2.0.tar.gz>`__ 
released.
-        - 2007-09-08: pyftpdlib included as `FarManager 
<http://farmanager.com/>`__ `plug-in 
<http://www.farmanager.com/enforum/viewtopic.php?t=640&highlight=&sid=12d4d90f27f421243bcf7a0e3c516efb>`__.
-        - 2007-03-06: pyftpdlib `ported on FreeBSD 
<http://www.freshports.org/ftp/py-pyftpdlib/>`__ systems to make users can 
easily install on it.
-        - 2007-03-07: version `0.1.1 
<http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.1.tar.gz>`__ released.
-        - 2007-02-26: version `0.1.0 
<http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.tar.gz>`__ released.
-        - 2006-09-26: initial clunky thread-based progenitor `link 
<http://billiejoex.altervista.org/Prj_pftpd.htm>`__.
-        
         Trademarks
         ==========
         
@@ -299,5 +242,4 @@
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
-Provides-Extra: sendfile
 Provides-Extra: ssl
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/README.rst 
new/pyftpdlib-1.5.5/README.rst
--- old/pyftpdlib-1.5.4/README.rst      2018-05-04 23:06:31.000000000 +0200
+++ new/pyftpdlib-1.5.5/README.rst      2019-04-04 11:10:51.000000000 +0200
@@ -1,3 +1,7 @@
+.. image:: http://pepy.tech/badge/pyftpdlib
+    :target: http://pepy.tech/project/pyftpdlib
+    :alt: Downloads
+
 .. image:: 
https://img.shields.io/travis/giampaolo/pyftpdlib/master.svg?maxAge=3600&label=Linux%20/%20OSX
     :target: https://travis-ci.org/giampaolo/pyftpdlib
     :alt: Linux tests (Travis)
@@ -186,67 +190,6 @@
 software to the
 `adoptions list <http://pyftpdlib.readthedocs.io/en/latest/adoptions.html>`__.
 
-Timeline
-========
-
-- 2018-05-04: version `1.5.4 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.4.tar.gz>`__ 
released.
-- 2017-11-04: version `1.5.3 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.3.tar.gz>`__ 
released.
-- 2017-04-06: version `1.5.2 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.2.tar.gz>`__ 
released.
-- 2016-05-02: version `1.5.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.1.tar.gz>`__ 
released.
-- 2015-12-13: version `1.5.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.0.tar.gz>`__ 
released.
-- 2014-06-03: version `1.4.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.4.0.tar.gz>`__ 
released.
-- 2014-04-12: version `1.3.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.1.tar.gz>`__ 
released.
-- 2013-11-07: version `1.3.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.0.tar.gz>`__ 
released.
-- 2013-04-22: version `1.2.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.2.0.tar.gz>`__ 
released.
-- 2013-04-09: version `1.1.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.1.0.tar.gz>`__ 
released.
-- 2013-02-22: version `1.0.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.1.tar.gz>`__ 
released.
-- 2013-02-19: version `1.0.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.0.tar.gz>`__ 
released.
-- 2012-05-14: pyftpdlib included in `ftp-cloudfs 
<https://github.com/chmouel/ftp-cloudfs/>`__ project.
-- 2012-01-25: version `0.7.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.7.0.tar.gz>`__ 
released.
-- 2011-12-01: pyftpdlib included in `feitp-server 
<http://code.google.com/p/feitp-server/>`__ project.
-- 2011-09-26: pyftpdlib included in `ftpmaster 
<https://github.com/MarkLIC/ftpmaster>`__ project.
-- 2011-07-09: pyftpdlib included in `bftpd <http://bftpd.sourceforge.net/>`__ 
project.
-- 2011-07-09: pyftpdlib included in `fastersync 
<http://code.google.com/p/fastersync/>`__ project.
-- 2011-01-31: pyftpdlib included in `put.io FTP connector project 
<http://code.google.com/p/pyftpdlib/wiki/Adoptions?ts=1296442469&updated=Adoptions#put.io*FTP*connector>`__.
-- 2011-01-24: version `0.6.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.6.0.tar.gz>`__ 
released.
-- 2010-12-14: added `donations 
<http://code.google.com/p/pyftpdlib/wiki/Donate>`__.
-- 2010-08-24: pyftpdlib included in `peerscape <http://www.peerscape.org/>`__ 
project.
-- 2010-07-15: pyftpdlib included in `Faetus 
<http://tomatohater.com/faetus/>`__ project.
-- 2010-07-11: pyftpdlib included in `Pyfilesystem 
<http://code.google.com/p/pyfilesystem>`__ project.
-- 2010-06-28: pyftpdlib has been `packaged for Debian 
<http://packages.debian.org/sid/python-pyftpdlib>`__
-- 2010-04-28: pyftpdlib included in `sierramodulepos 
<http://forge.openbravo.com/plugins/mwiki/index.php/MobilePOS>`__ project.
-- 2010-03-20: `http://www.smartfile.com <http://www.smartfile.com>`__ uses 
pyftpdlib.
-- 2010-01-13: pyftpdlib included in `zenftp <http://code.irondojo.com/>`__ 
project.
-- 2009-12-26: pyftpdlib included in `Symbian Python FTP server 
<http://code.google.com/p/sypftp>`__ project.
-- 2009-11-04: `www.netplay.it <http://www.netplay.it>`__ uses pyftpdlib.
-- 2009-11-04: `www.adcast.tv <http://www.adcast.tv>`__ uses pyftpdlib.
-- 2009-11-04: `www.bitsontherun.com <http://www.bitsontherun.com>`__ uses 
pyftpdlib.
-- 2009-11-02: pyftpdlib included in `ftp-cloudfs 
<http://github.com/chmouel/ftp-cloudfs>`__ project.
-- 2009-09-14: version `0.5.2 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.2.tar.gz>`__ 
released.
-- 2009-08-10: pyftpdlib included in `Imgserve 
<http://github.com/wuzhe/imgserve/tree/master>`__ project.
-- 2009-07-22: pyftpdlib included in  `Plumi <http://plumi.org/wiki>`__ project.
-- 2009-04-02: pyftpdlib RPM-packaged and ported on `Fedora 
<https://admin.fedoraproject.org/pkgdb/packages/name/pyftpdlib>`__ to make 
users can easily install on it via *yum install pyftpdlib*.
-- 2009-03-28: pyftpdlib included in  `Bazaar <http://bazaar-vcs.org/>`__ 
project.
-- 2009-02-23: pyftpdlib included in `ShareFTP 
<http://git.logfish.net/shareftp.git/>`__ project.
-- 2009-01-21: version `0.5.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.1.tar.gz>`__ 
released.
-- 2008-12-27: pyftpdlib included in `Google Chromium 
<http://code.google.com/intl/it-IT/chromium/>`__, the open source project 
behind `Google Chrome <http://www.google.com/chrome>`__.
-- 2008-12-27: pyftpdlib ported on `GNU Darwin <http://www.gnu-darwin.org/>`__ 
systems to make users can easily install on it.
-- 2008-11-26: pyftpdlib included in `OpenERP <http://openerp.com>`__.
-- 2008-10-26: pyftpdlib included in `Python for OpenVMS 
<http://www.vmspython.org/>`__ as standard package.
-- 2008-10-09: pyftpdlib included in `Shareme 
<http://bbs.archlinux.org/viewtopic.php?pid=431474>`__ project.
-- 2008-09-20: version `0.5.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.0.tar.gz>`__ 
released.
-- 2008-08-10: pyftpdlib included in `Manent 
<http://trac.manent-backup.com/>`__ project.
-- 2008-05-16: version `0.4.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.4.0.tar.gz>`__ 
released.
-- 2008-04-09: pyftpdlib used as backend for `gpftpd 
<http://arkadiusz-wahlig.blogspot.com/2008/04/hosting-files-on-google.html>`__, 
an FTP server for managing files hosted on `Google Pages 
<http://-ages.google.com>`__.
-- 2008-01-17: version `0.3.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.3.0.tar.gz>`__ 
released.
-- 2007-10-14: pyftpdlib included in `Aksy 
<http://walco.n--tree.net/projects/aksy/wiki>`__ project.
-- 2007-09-17: version `0.2.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.2.0.tar.gz>`__ 
released.
-- 2007-09-08: pyftpdlib included as `FarManager <http://farmanager.com/>`__ 
`plug-in 
<http://www.farmanager.com/enforum/viewtopic.php?t=640&highlight=&sid=12d4d90f27f421243bcf7a0e3c516efb>`__.
-- 2007-03-06: pyftpdlib `ported on FreeBSD 
<http://www.freshports.org/ftp/py-pyftpdlib/>`__ systems to make users can 
easily install on it.
-- 2007-03-07: version `0.1.1 
<http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.1.tar.gz>`__ released.
-- 2007-02-26: version `0.1.0 
<http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.tar.gz>`__ released.
-- 2006-09-26: initial clunky thread-based progenitor `link 
<http://billiejoex.altervista.org/Prj_pftpd.htm>`__.
-
 Trademarks
 ==========
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/docs/api.rst 
new/pyftpdlib-1.5.5/docs/api.rst
--- old/pyftpdlib-1.5.4/docs/api.rst    2018-04-27 16:47:07.000000000 +0200
+++ new/pyftpdlib-1.5.5/docs/api.rst    2018-05-15 17:45:22.000000000 +0200
@@ -390,12 +390,13 @@
   .. method:: close()
 
     Stop accepting connections without disconnecting currently connected
-    clients.
+    clients. :meth:`server_forever` loop will automatically stop when there are
+    no more connected clients.
 
   .. method:: close_all()
 
-    Tell :meth:`server_forever` loop to stop and wait until it does.
-    Also all connected clients will be closed.
+    Disconnect all clients, tell :meth:`server_forever` loop to stop and wait
+    until it does.
 
     *Changed in version 1.0.0: 'map' and 'ignore_all' parameters were removed.*
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/docs/benchmarks.rst 
new/pyftpdlib-1.5.5/docs/benchmarks.rst
--- old/pyftpdlib-1.5.4/docs/benchmarks.rst     2017-12-30 09:44:57.000000000 
+0100
+++ new/pyftpdlib-1.5.5/docs/benchmarks.rst     2019-03-27 17:31:43.000000000 
+0100
@@ -77,8 +77,8 @@
 By using *sendfile()* (Twisted *does not* support sendfile()):
 
 
+-----------------------------------------+----------------+----------------+-------------+
-| *benchmark type*                        |  *pyftpdlib*   | *twisted*      | 
*speedup*   |
-+=========================================+=================+================+============+
+| *benchmark type*                        |  *pyftpdlib*   |  *twisted*     | 
*speedup*   |
++=========================================+================+================+=============+
 | STOR (client -> server)                 |  585.90 MB/sec | 496.44 MB/sec  | 
**+0.01x**  |
 
+-----------------------------------------+----------------+----------------+-------------+
 | RETR (server -> client)                 | 1652.72 MB/sec | 283.24 MB/sec  | 
**+4.8x**   |
@@ -99,7 +99,7 @@
 By using plain *send()*:
 
 
+-----------------------------------------+----------------+---------------+--------------+
-| *benchmark type*                        |tpdlib*         | *twisted*     | 
*speedup*    |
+| *benchmark type*                        | *tpdlib*       | *twisted*     | 
*speedup*    |
 
+=========================================+================+===============+==============+
 | RETR (server -> client)                 |  894.29 MB/sec | 283.24 MB/sec | 
**+2.1x**    |
 
+-----------------------------------------+----------------+---------------+--------------+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/make.bat new/pyftpdlib-1.5.5/make.bat
--- old/pyftpdlib-1.5.4/make.bat        2017-12-30 09:44:57.000000000 +0100
+++ new/pyftpdlib-1.5.5/make.bat        2019-03-27 21:33:09.000000000 +0100
@@ -2,99 +2,36 @@
 
 rem ==========================================================================
 rem Shortcuts for various tasks, emulating UNIX "make" on Windows.
-rem It is primarly intended as a shortcut for installing pyftpdlib and running
-rem tests (just run "make.bat test").
+rem It is primarly intended as a shortcut for compiling / installing
+rem psutil ("make.bat build", "make.bat install") and running tests
+rem ("make.bat test").
+rem
+rem This script is modeled after my Windows installation which uses:
+rem - Visual studio 2008 for Python 2.6, 2.7
+rem - Visual studio 2010 for Python 3.4+
+rem ...therefore it might not work on your Windows installation.
+rem
 rem By default C:\Python27\python.exe is used.
-rem To use another Python version run:
-rem     set PYTHON=C:\Python24\python.exe & make.bat test
+rem To compile for a specific Python version run:
+rem     set PYTHON=C:\Python34\python.exe & make.bat build
+rem
+rem To use a different test script:
+rem      set PYTHON=C:\Python34\python.exe & set TSCRIPT=foo.py & make.bat test
 rem ==========================================================================
 
-
 if "%PYTHON%" == "" (
-    set PYTHON=C:\Python27\python.exe
-)
-if "%TSCRIPT%" == "" (
-    set TSCRIPT=pyftpdlib\test\runner.py
-)
-
-
-if "%1" == "help" (
-    :help
-    echo Run `make ^<target^>` where ^<target^> is one of:
-    echo   clean         clean build files
-    echo   install       compile and install
-    echo   uninstall     uninstall
-    echo   test          run tests
-    echo   setup-dev-env install all deps
-    goto :eof
-)
-
-if "%1" == "clean" (
-    :clean
-    for /r %%R in (__pycache__) do if exist %%R (rmdir /S /Q %%R)
-    for /r %%R in (*.pyc) do if exist %%R (del /s %%R)
-    for /r %%R in (*.pyd) do if exist %%R (del /s %%R)
-    for /r %%R in (*.orig) do if exist %%R (del /s %%R)
-    for /r %%R in (*.bak) do if exist %%R (del /s %%R)
-    for /r %%R in (*.rej) do if exist %%R (del /s %%R)
-    if exist pyftpdlib.egg-info (rmdir /S /Q pyftpdlib.egg-info)
-    if exist build (rmdir /S /Q build)
-    if exist dist (rmdir /S /Q dist)
-    goto :eof
-)
-
-if "%1" == "install" (
-    :install
-    if %PYTHON%==C:\Python24\python.exe (
-        %PYTHON% setup.py build -c mingw32 install
-    ) else if %PYTHON%==C:\Python25\python.exe (
-        %PYTHON% setup.py build -c mingw32 install
+    if exist "C:\Python37\python.exe" (
+        set PYTHON=C:\Python37\python.exe
     ) else (
-        %PYTHON% setup.py build install
+        set PYTHON=C:\Python27\python.exe
     )
-    goto :eof
-)
-
-if "%1" == "uninstall" (
-    :uninstall
-    rmdir /S /Q %PYTHON%\Lib\site-packages\pyftpdlib*
-    goto :eof
-)
-
-if "%1" == "test" (
-    :test
-    call :install
-    %PYTHON% %TSCRIPT%
-    goto :eof
 )
 
-if "%1" == "setup-dev-env" (
-    :setup-env
-    if not exist get-pip.py (
-        @echo ------------------------------------------------
-        @echo downloading pip installer
-        @echo ------------------------------------------------
-        C:\python27\python.exe -c "import urllib2; r = 
urllib2.urlopen('https://bootstrap.pypa.io/get-pip.py'); open('get-pip.py', 
'wb').write(r.read())"
-    )
-    @echo ------------------------------------------------
-    @echo installing pip for %PYTHON%
-    @echo ------------------------------------------------
-    %PYTHON% get-pip.py
-    @echo ------------------------------------------------
-    @echo upgrade pip for %PYTHON%
-    @echo ------------------------------------------------
-    %PYTHON% -m pip install pip --upgrade
-    @echo ------------------------------------------------
-    @echo installing deps
-    @echo ------------------------------------------------
-    rem mandatory / for unittests
-    %PYTHON% -m pip install unittest2 ipaddress mock wmi pypiwin32 pyopenssl 
--upgrade
-    goto :eof
+if "%TSCRIPT%" == "" (
+    set TSCRIPT=psutil\tests\__main__.py
 )
 
+rem Needed to locate the .pypirc file and upload exes on PyPI.
+set HOME=%USERPROFILE%
 
-goto :help
-
-:error
-    echo last command returned an error; exiting
-    exit /b %errorlevel%
+%PYTHON% scripts\winmake.py %1 %2 %3 %4 %5 %6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/__init__.py 
new/pyftpdlib-1.5.5/pyftpdlib/__init__.py
--- old/pyftpdlib-1.5.4/pyftpdlib/__init__.py   2017-12-30 09:44:57.000000000 
+0100
+++ new/pyftpdlib-1.5.5/pyftpdlib/__init__.py   2019-03-27 21:53:41.000000000 
+0100
@@ -68,6 +68,6 @@
 """
 
 
-__ver__ = '1.5.4'
+__ver__ = '1.5.5'
 __author__ = "Giampaolo Rodola' <g.rod...@gmail.com>"
 __web__ = 'https://github.com/giampaolo/pyftpdlib/'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/filesystems.py 
new/pyftpdlib-1.5.5/pyftpdlib/filesystems.py
--- old/pyftpdlib-1.5.4/pyftpdlib/filesystems.py        2017-12-30 
09:44:57.000000000 +0100
+++ new/pyftpdlib-1.5.5/pyftpdlib/filesystems.py        2018-08-29 
12:40:33.000000000 +0200
@@ -237,11 +237,13 @@
     # --- Wrapper methods around os.* calls
 
     def chdir(self, path):
-        """Change the current directory."""
+        """Change the current directory. If this method is overridden
+        it is vital that `cwd` attribute gets set.
+        """
         # note: process cwd will be reset by the caller
         assert isinstance(path, unicode), path
         os.chdir(path)
-        self._cwd = self.fs2ftp(path)
+        self.cwd = self.fs2ftp(path)
 
     def mkdir(self, path):
         """Create the specified directory."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/handlers.py 
new/pyftpdlib-1.5.5/pyftpdlib/handlers.py
--- old/pyftpdlib-1.5.4/pyftpdlib/handlers.py   2017-12-30 09:44:57.000000000 
+0100
+++ new/pyftpdlib-1.5.5/pyftpdlib/handlers.py   2019-04-04 01:41:30.000000000 
+0200
@@ -54,6 +54,8 @@
 from .log import debug
 from .log import logger
 
+CR_BYTE = ord('\r')
+
 
 def _import_sendfile():
     # By default attempt to use os.sendfile introduced in Python 3.3:
@@ -1028,11 +1030,32 @@
         """
         self.file = file
         self.type = type
+        self._prev_chunk_endswith_cr = False
         if type == 'a' and os.linesep != '\r\n':
-            self._data_wrapper = lambda x: x.replace(b(os.linesep), b'\r\n')
+            self._data_wrapper = self._posix_ascii_data_wrapper
         else:
             self._data_wrapper = None
 
+    def _posix_ascii_data_wrapper(self, chunk):
+        """The data wrapper used for sending data in ASCII mode on
+        systems using a single line terminator, handling those cases
+        where CRLF ('\r\n') gets delivered in two chunks.
+        """
+        chunk = bytearray(chunk)
+        pos = 0
+        if self._prev_chunk_endswith_cr and chunk.startswith(b'\n'):
+            pos += 1
+        while True:
+            pos = chunk.find(b'\n', pos)
+            if pos == -1:
+                break
+            if chunk[pos - 1] != CR_BYTE:
+                chunk.insert(pos, CR_BYTE)
+                pos += 1
+            pos += 1
+        self._prev_chunk_endswith_cr = chunk.endswith(b'\r')
+        return chunk
+
     def more(self):
         """Attempt a chunk of data of size self.buffer_size."""
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/servers.py 
new/pyftpdlib-1.5.5/pyftpdlib/servers.py
--- old/pyftpdlib-1.5.4/pyftpdlib/servers.py    2018-04-27 16:35:39.000000000 
+0200
+++ new/pyftpdlib-1.5.5/pyftpdlib/servers.py    2019-04-04 01:42:29.000000000 
+0200
@@ -122,6 +122,7 @@
 
     @property
     def address(self):
+        """The address this server is listening on as a (ip, port) tuple."""
         return self.socket.getsockname()[:2]
 
     def _map_len(self):
@@ -513,16 +514,21 @@
 
 
 if os.name == 'posix':
-    import multiprocessing
+    try:
+        import multiprocessing
+        multiprocessing.Lock()
+    except Exception:
+        # see https://github.com/giampaolo/pyftpdlib/issues/496
+        pass
+    else:
+        __all__ += ['MultiprocessFTPServer']
+
+        class MultiprocessFTPServer(_SpawnerBase):
+            """A modified version of base FTPServer class which spawns a
+            process every time a new connection is established.
+            """
+            _lock = multiprocessing.Lock()
+            _exit = multiprocessing.Event()
 
-    __all__ += ['MultiprocessFTPServer']
-
-    class MultiprocessFTPServer(_SpawnerBase):
-        """A modified version of base FTPServer class which spawns a
-        process every time a new connection is established.
-        """
-        _lock = multiprocessing.Lock()
-        _exit = multiprocessing.Event()
-
-        def _start_task(self, *args, **kwargs):
-            return multiprocessing.Process(*args, **kwargs)
+            def _start_task(self, *args, **kwargs):
+                return multiprocessing.Process(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/test/__init__.py 
new/pyftpdlib-1.5.5/pyftpdlib/test/__init__.py
--- old/pyftpdlib-1.5.4/pyftpdlib/test/__init__.py      2018-04-27 
16:24:18.000000000 +0200
+++ new/pyftpdlib-1.5.5/pyftpdlib/test/__init__.py      2018-05-15 
14:14:07.000000000 +0200
@@ -77,6 +77,22 @@
 unittest.TestCase = TestCase
 
 
+def close_client(session):
+    """Closes a ftplib.FTP client session."""
+    try:
+        if session.sock is not None:
+            try:
+                resp = session.quit()
+            except Exception:
+                pass
+            else:
+                # ...just to make sure the server isn't replying to some
+                # pending command.
+                assert resp.startswith('221'), resp
+    finally:
+        session.close()
+
+
 def try_address(host, port=0, family=socket.AF_INET):
     """Try to bind a socket on the given host:port and return True
     if that has been possible."""
@@ -240,7 +256,8 @@
     p = psutil.Process()
     children = p.children()
     assert not children, children
-    cons = p.connections('tcp')
+    cons = [x for x in p.connections('tcp')
+            if x.status != psutil.CONN_CLOSE_WAIT]
     assert not cons, cons
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/test/runner.py 
new/pyftpdlib-1.5.5/pyftpdlib/test/runner.py
--- old/pyftpdlib-1.5.4/pyftpdlib/test/runner.py        2018-04-27 
08:21:14.000000000 +0200
+++ new/pyftpdlib-1.5.5/pyftpdlib/test/runner.py        2019-03-27 
21:53:41.000000000 +0100
@@ -4,8 +4,18 @@
 # Use of this source code is governed by MIT license that can be
 # found in the LICENSE file.
 
+
+from __future__ import print_function
+import atexit
 import os
 import sys
+from unittest import TestResult
+from unittest import TextTestResult
+from unittest import TextTestRunner
+try:
+    import ctypes
+except ImportError:
+    ctypes = None
 
 from pyftpdlib.test import configure_logging
 from pyftpdlib.test import remove_test_files
@@ -13,22 +23,136 @@
 from pyftpdlib.test import VERBOSITY
 
 HERE = os.path.abspath(os.path.dirname(__file__))
+if os.name == 'posix':
+    GREEN = 1
+    RED = 2
+    BROWN = 94
+else:
+    GREEN = 2
+    RED = 4
+    BROWN = 6
+    DEFAULT_COLOR = 7
+
+
+def term_supports_colors(file=sys.stdout):
+    if os.name == 'nt':
+        return ctypes is not None
+    try:
+        import curses
+        assert file.isatty()
+        curses.setupterm()
+        assert curses.tigetnum("colors") > 0
+    except Exception:
+        return False
+    else:
+        return True
+
+
+def hilite(s, color, bold=False):
+    """Return an highlighted version of 'string'."""
+    attr = []
+    if color == GREEN:
+        attr.append('32')
+    elif color == RED:
+        attr.append('91')
+    elif color == BROWN:
+        attr.append('33')
+    else:
+        raise ValueError("unrecognized color")
+    if bold:
+        attr.append('1')
+    return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), s)
+
+
+def _stderr_handle():
+    GetStdHandle = ctypes.windll.Kernel32.GetStdHandle
+    STD_ERROR_HANDLE_ID = ctypes.c_ulong(0xfffffff4)
+    GetStdHandle.restype = ctypes.c_ulong
+    handle = GetStdHandle(STD_ERROR_HANDLE_ID)
+    atexit.register(ctypes.windll.Kernel32.CloseHandle, handle)
+    return handle
+
+
+def win_colorprint(printer, s, color, bold=False):
+    if bold and color <= 7:
+        color += 8
+    handle = _stderr_handle()
+    SetConsoleTextAttribute = ctypes.windll.Kernel32.SetConsoleTextAttribute
+    SetConsoleTextAttribute(handle, color)
+    try:
+        printer(s)
+    finally:
+        SetConsoleTextAttribute(handle, DEFAULT_COLOR)
+
+
+class ColouredResult(TextTestResult):
+
+    def _color_print(self, s, color, bold=False):
+        if os.name == 'posix':
+            self.stream.writeln(hilite(s, color, bold=bold))
+        else:
+            win_colorprint(self.stream.writeln, s, color, bold=bold)
+
+    def addSuccess(self, test):
+        TestResult.addSuccess(self, test)
+        self._color_print("OK", GREEN)
+
+    def addError(self, test, err):
+        TestResult.addError(self, test, err)
+        self._color_print("ERROR", RED, bold=True)
+
+    def addFailure(self, test, err):
+        TestResult.addFailure(self, test, err)
+        self._color_print("FAIL", RED)
+
+    def addSkip(self, test, reason):
+        TestResult.addSkip(self, test, reason)
+        self._color_print("skipped: %s" % reason, BROWN)
+
+    def printErrorList(self, flavour, errors):
+        flavour = hilite(flavour, RED, bold=flavour == 'ERROR')
+        TextTestResult.printErrorList(self, flavour, errors)
+
+
+class ColouredRunner(TextTestRunner):
+    resultclass = ColouredResult if term_supports_colors() else TextTestResult
+
+    def _makeResult(self):
+        # Store result instance so that it can be accessed on
+        # KeyboardInterrupt.
+        self.result = TextTestRunner._makeResult(self)
+        return self.result
+
+
+def get_suite(name=None):
+    suite = unittest.TestSuite()
+    if name is None:
+        testmods = [os.path.splitext(x)[0] for x in os.listdir(HERE)
+                    if x.endswith('.py') and x.startswith('test_')]
+        for tm in testmods:
+            # ...so that the full test paths are printed on screen
+            tm = "pyftpdlib.test.%s" % tm
+            suite.addTest(unittest.defaultTestLoader.loadTestsFromName(tm))
+    else:
+        name = os.path.splitext(os.path.basename(name))[0]
+        suite.addTest(unittest.defaultTestLoader.loadTestsFromName(name))
+    return suite
 
 
-def main():
-    testmodules = [os.path.splitext(x)[0] for x in os.listdir(HERE)
-                   if x.endswith('.py') and x.startswith('test_')]
+def main(name=None):
     configure_logging()
     remove_test_files()
-    suite = unittest.TestSuite()
-    for t in testmodules:
-        # ...so that "make test" will print the full test paths
-        t = "pyftpdlib.test.%s" % t
-        suite.addTest(unittest.defaultTestLoader.loadTestsFromName(t))
-    result = unittest.TextTestRunner(verbosity=VERBOSITY).run(suite)
-    return result.wasSuccessful()
+    runner = ColouredRunner(verbosity=VERBOSITY)
+    try:
+        result = runner.run(get_suite(name))
+    except (KeyboardInterrupt, SystemExit) as err:
+        print("received %s" % err.__class__.__name__, file=sys.stderr)
+        runner.result.printErrors()
+        sys.exit(1)
+    else:
+        success = result.wasSuccessful()
+        sys.exit(0 if success else 1)
 
 
 if __name__ == '__main__':
-    if not main():
-        sys.exit(1)
+    main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/test/test_functional.py 
new/pyftpdlib-1.5.5/pyftpdlib/test/test_functional.py
--- old/pyftpdlib-1.5.4/pyftpdlib/test/test_functional.py       2018-04-27 
16:53:45.000000000 +0200
+++ new/pyftpdlib-1.5.5/pyftpdlib/test/test_functional.py       2019-03-27 
17:31:43.000000000 +0100
@@ -30,6 +30,7 @@
 from pyftpdlib.ioloop import IOLoop
 from pyftpdlib.servers import FTPServer
 from pyftpdlib.test import BUFSIZE
+from pyftpdlib.test import close_client
 from pyftpdlib.test import configure_logging
 from pyftpdlib.test import disable_log_warning
 from pyftpdlib.test import get_server_handler
@@ -86,7 +87,7 @@
         self.dummyfile = BytesIO()
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         if not self.file.closed:
             self.file.close()
@@ -260,7 +261,7 @@
         self.client.login(USER, PASSWD)
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
 
     def test_type(self):
@@ -383,7 +384,7 @@
         self.client.login(USER, PASSWD)
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
 
     def test_arg_cmds(self):
@@ -448,7 +449,7 @@
         self.tempdir = os.path.basename(tempfile.mkdtemp(dir=HOME))
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         safe_remove(self.tempfile)
         if os.path.exists(self.tempdir):
@@ -658,7 +659,7 @@
         self.dummy_sendfile = BytesIO()
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         self.dummy_recvfile.close()
         self.dummy_sendfile.close()
@@ -960,12 +961,24 @@
 
 
 class TestFtpRetrieveData(unittest.TestCase):
-
-    "Test RETR, REST, TYPE"
+    """Test RETR, REST, TYPE"""
     server_class = MProcessTestFTPd
     client_class = ftplib.FTP
     use_sendfile = None
 
+    def retrieve_ascii(self, cmd, callback, blocksize=8192, rest=None):
+        """Like retrbinary but uses TYPE A instead."""
+        self.client.voidcmd('type a')
+        with contextlib.closing(
+                self.client.transfercmd(cmd, rest)) as conn:
+            conn.settimeout(TIMEOUT)
+            while True:
+                data = conn.recv(blocksize)
+                if not data:
+                    break
+                callback(data)
+        return self.client.voidresp()
+
     def setUp(self):
         self.server = self.server_class()
         if self.use_sendfile is not None:
@@ -978,7 +991,7 @@
         self.dummyfile = BytesIO()
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         if not self.file.closed:
             self.file.close()
@@ -1005,31 +1018,30 @@
                           "retr " + bogus, lambda x: x)
 
     def test_retr_ascii(self):
-        # Test RETR in ASCII mode.
-
-        def retrieve(cmd, callback, blocksize=8192, rest=None):
-            # like retrbinary but uses TYPE A instead
-            self.client.voidcmd('type a')
-            with contextlib.closing(
-                    self.client.transfercmd(cmd, rest)) as conn:
-                conn.settimeout(TIMEOUT)
-                while True:
-                    data = conn.recv(blocksize)
-                    if not data:
-                        break
-                    callback(data)
-            return self.client.voidresp()
+        """Test RETR in ASCII mode."""
 
         data = (b'abcde12345' + b(os.linesep)) * 100000
         self.file.write(data)
         self.file.close()
-        retrieve("retr " + TESTFN, self.dummyfile.write)
+        self.retrieve_ascii("retr " + TESTFN, self.dummyfile.write)
         expected = data.replace(b(os.linesep), b'\r\n')
         self.dummyfile.seek(0)
         datafile = self.dummyfile.read()
         self.assertEqual(len(expected), len(datafile))
         self.assertEqual(hash(expected), hash(datafile))
 
+    def test_retr_ascii_already_crlf(self):
+        """Test ASCII mode RETR for data with CRLF line endings."""
+
+        data = b'abcde12345\r\n' * 100000
+        self.file.write(data)
+        self.file.close()
+        self.retrieve_ascii("retr " + TESTFN, self.dummyfile.write)
+        self.dummyfile.seek(0)
+        datafile = self.dummyfile.read()
+        self.assertEqual(len(data), len(datafile))
+        self.assertEqual(hash(data), hash(datafile))
+
     @retry_on_failure()
     def test_restore_on_retr(self):
         data = b'abcde12345' * 1000000
@@ -1096,7 +1108,7 @@
         touch(TESTFN)
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         os.remove(TESTFN)
 
@@ -1257,7 +1269,7 @@
         self.client.login(USER, PASSWD)
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
 
     def test_abor_no_data(self):
@@ -1364,7 +1376,7 @@
         self.dummyfile = BytesIO()
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.handler.dtp_handler.read_limit = 0
         self.server.handler.dtp_handler.write_limit = 0
         self.server.handler.dtp_handler = DTPHandler
@@ -1430,7 +1442,7 @@
 
     def tearDown(self):
         if self.client is not None and self.server is not None:
-            self.client.close()
+            close_client(self.client)
             self.server.handler.timeout = 300
             self.server.handler.dtp_handler.timeout = 300
             self.server.handler.passive_dtp.timeout = 30
@@ -1580,7 +1592,7 @@
 
     def tearDown(self):
         if self.client is not None:
-            self.client.close()
+            close_client(self.client)
         # set back options to their original value
         if self.server is not None:
             self.server.server.max_cons = 0
@@ -1823,7 +1835,7 @@
         self.client.connect(self.server.host, self.server.port)
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         safe_remove(TESTFN)
         safe_remove(self.TESTFN_2)
@@ -1913,7 +1925,10 @@
                 if bytes_sent >= INTERRUPTED_TRANSF_SIZE or not chunk:
                     self.client.putcmd('abor')
                     break
+        # If a data transfer is in progress server is supposed to send
+        # a 426 reply followed by a 226 reply.
         self.assertRaises(ftplib.error_temp, self.client.getresp)  # 426
+        self.assertEqual(self.client.getresp()[:3], "226")
         self.read_file(
             'on_connect,on_login:%s,on_incomplete_file_received:%s,' %
             (USER, self.TESTFN_2))
@@ -1958,7 +1973,7 @@
             self.other_proto = "1"
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
 
     def cmdresp(self, cmd):
@@ -2149,7 +2164,7 @@
 
     def tearDown(self):
         if self.client is not None:
-            self.client.close()
+            close_client(self.client)
         self.server.stop()
 
     def test_port_v4(self):
@@ -2225,7 +2240,7 @@
         self.client.login(USER, PASSWD)
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
 
     def test_port_race_condition(self):
@@ -2365,7 +2380,7 @@
 #             warnings.resetwarnings()
 
 #     def tearDown(self):
-#         self.client.close()
+#         close_client(self.client)
 #         self.server.stop()
 #         remove_test_files()
 
@@ -2529,7 +2544,7 @@
         self.dummy_sendfile = BytesIO()
 
     def tearDown(self):
-        self.client.close()
+        close_client(self.client)
         self.server.stop()
         self.dummy_recvfile.close()
         self.dummy_sendfile.close()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pyftpdlib-1.5.4/pyftpdlib/test/test_functional_ssl.py 
new/pyftpdlib-1.5.5/pyftpdlib/test/test_functional_ssl.py
--- old/pyftpdlib-1.5.4/pyftpdlib/test/test_functional_ssl.py   2017-12-30 
09:44:57.000000000 +0100
+++ new/pyftpdlib-1.5.5/pyftpdlib/test/test_functional_ssl.py   2018-05-15 
13:19:21.000000000 +0200
@@ -14,6 +14,7 @@
 import OpenSSL  # requires "pip install pyopenssl"
 
 from pyftpdlib.handlers import TLS_FTPHandler
+from pyftpdlib.test import close_client
 from pyftpdlib.test import configure_logging
 from pyftpdlib.test import MProcessTestFTPd
 from pyftpdlib.test import OSX
@@ -195,7 +196,7 @@
     def tearDown(self):
         if self.client is not None:
             self.client.ssl_version = ssl.PROTOCOL_SSLv23
-            self.client.close()
+            close_client(self.client)
         if self.server is not None:
             self.server.handler.ssl_protocol = ssl.PROTOCOL_SSLv23
             self.server.handler.tls_control_required = False
@@ -313,7 +314,7 @@
     def try_protocol_combo(self, server_protocol, client_protocol):
         self._setup(ssl_protocol=server_protocol)
         self.client.ssl_version = client_protocol
-        self.client.close()
+        close_client(self.client)
         self.client.connect(self.server.host, self.server.port)
         try:
             self.client.login()
@@ -339,7 +340,7 @@
     if hasattr(ssl, "PROTOCOL_SSLv2"):
         def test_sslv2(self):
             self.client.ssl_version = ssl.PROTOCOL_SSLv2
-            self.client.close()
+            close_client(self.client)
             if not OSX:
                 with self.server.lock:
                     self.client.connect(self.server.host, self.server.port)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib/test/test_servers.py 
new/pyftpdlib-1.5.5/pyftpdlib/test/test_servers.py
--- old/pyftpdlib-1.5.4/pyftpdlib/test/test_servers.py  2018-05-04 
23:04:20.000000000 +0200
+++ new/pyftpdlib-1.5.5/pyftpdlib/test/test_servers.py  2018-08-29 
12:37:54.000000000 +0200
@@ -12,6 +12,7 @@
 
 from pyftpdlib import handlers
 from pyftpdlib import servers
+from pyftpdlib.test import close_client
 from pyftpdlib.test import configure_logging
 from pyftpdlib.test import HOST
 from pyftpdlib.test import PASSWD
@@ -48,7 +49,7 @@
 
     def tearDown(self):
         if self.client is not None:
-            self.client.close()
+            close_client(self.client)
         if self.server is not None:
             self.server.stop()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib.egg-info/PKG-INFO 
new/pyftpdlib-1.5.5/pyftpdlib.egg-info/PKG-INFO
--- old/pyftpdlib-1.5.4/pyftpdlib.egg-info/PKG-INFO     2018-05-04 
23:06:51.000000000 +0200
+++ new/pyftpdlib-1.5.5/pyftpdlib.egg-info/PKG-INFO     2019-04-04 
11:11:03.000000000 +0200
@@ -1,12 +1,16 @@
 Metadata-Version: 2.1
 Name: pyftpdlib
-Version: 1.5.4
+Version: 1.5.5
 Summary: Very fast asynchronous FTP server library
 Home-page: https://github.com/giampaolo/pyftpdlib/
 Author: Giampaolo Rodola'
 Author-email: g.rod...@gmail.com
 License: MIT
-Description: .. image:: 
https://img.shields.io/travis/giampaolo/pyftpdlib/master.svg?maxAge=3600&label=Linux%20/%20OSX
+Description: .. image:: http://pepy.tech/badge/pyftpdlib
+            :target: http://pepy.tech/project/pyftpdlib
+            :alt: Downloads
+        
+        .. image:: 
https://img.shields.io/travis/giampaolo/pyftpdlib/master.svg?maxAge=3600&label=Linux%20/%20OSX
             :target: https://travis-ci.org/giampaolo/pyftpdlib
             :alt: Linux tests (Travis)
         
@@ -194,67 +198,6 @@
         software to the
         `adoptions list 
<http://pyftpdlib.readthedocs.io/en/latest/adoptions.html>`__.
         
-        Timeline
-        ========
-        
-        - 2018-05-04: version `1.5.4 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.4.tar.gz>`__ 
released.
-        - 2017-11-04: version `1.5.3 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.3.tar.gz>`__ 
released.
-        - 2017-04-06: version `1.5.2 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.2.tar.gz>`__ 
released.
-        - 2016-05-02: version `1.5.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.1.tar.gz>`__ 
released.
-        - 2015-12-13: version `1.5.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.0.tar.gz>`__ 
released.
-        - 2014-06-03: version `1.4.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.4.0.tar.gz>`__ 
released.
-        - 2014-04-12: version `1.3.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.1.tar.gz>`__ 
released.
-        - 2013-11-07: version `1.3.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.0.tar.gz>`__ 
released.
-        - 2013-04-22: version `1.2.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.2.0.tar.gz>`__ 
released.
-        - 2013-04-09: version `1.1.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.1.0.tar.gz>`__ 
released.
-        - 2013-02-22: version `1.0.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.1.tar.gz>`__ 
released.
-        - 2013-02-19: version `1.0.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.0.tar.gz>`__ 
released.
-        - 2012-05-14: pyftpdlib included in `ftp-cloudfs 
<https://github.com/chmouel/ftp-cloudfs/>`__ project.
-        - 2012-01-25: version `0.7.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.7.0.tar.gz>`__ 
released.
-        - 2011-12-01: pyftpdlib included in `feitp-server 
<http://code.google.com/p/feitp-server/>`__ project.
-        - 2011-09-26: pyftpdlib included in `ftpmaster 
<https://github.com/MarkLIC/ftpmaster>`__ project.
-        - 2011-07-09: pyftpdlib included in `bftpd 
<http://bftpd.sourceforge.net/>`__ project.
-        - 2011-07-09: pyftpdlib included in `fastersync 
<http://code.google.com/p/fastersync/>`__ project.
-        - 2011-01-31: pyftpdlib included in `put.io FTP connector project 
<http://code.google.com/p/pyftpdlib/wiki/Adoptions?ts=1296442469&updated=Adoptions#put.io*FTP*connector>`__.
-        - 2011-01-24: version `0.6.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.6.0.tar.gz>`__ 
released.
-        - 2010-12-14: added `donations 
<http://code.google.com/p/pyftpdlib/wiki/Donate>`__.
-        - 2010-08-24: pyftpdlib included in `peerscape 
<http://www.peerscape.org/>`__ project.
-        - 2010-07-15: pyftpdlib included in `Faetus 
<http://tomatohater.com/faetus/>`__ project.
-        - 2010-07-11: pyftpdlib included in `Pyfilesystem 
<http://code.google.com/p/pyfilesystem>`__ project.
-        - 2010-06-28: pyftpdlib has been `packaged for Debian 
<http://packages.debian.org/sid/python-pyftpdlib>`__
-        - 2010-04-28: pyftpdlib included in `sierramodulepos 
<http://forge.openbravo.com/plugins/mwiki/index.php/MobilePOS>`__ project.
-        - 2010-03-20: `http://www.smartfile.com <http://www.smartfile.com>`__ 
uses pyftpdlib.
-        - 2010-01-13: pyftpdlib included in `zenftp 
<http://code.irondojo.com/>`__ project.
-        - 2009-12-26: pyftpdlib included in `Symbian Python FTP server 
<http://code.google.com/p/sypftp>`__ project.
-        - 2009-11-04: `www.netplay.it <http://www.netplay.it>`__ uses 
pyftpdlib.
-        - 2009-11-04: `www.adcast.tv <http://www.adcast.tv>`__ uses pyftpdlib.
-        - 2009-11-04: `www.bitsontherun.com <http://www.bitsontherun.com>`__ 
uses pyftpdlib.
-        - 2009-11-02: pyftpdlib included in `ftp-cloudfs 
<http://github.com/chmouel/ftp-cloudfs>`__ project.
-        - 2009-09-14: version `0.5.2 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.2.tar.gz>`__ 
released.
-        - 2009-08-10: pyftpdlib included in `Imgserve 
<http://github.com/wuzhe/imgserve/tree/master>`__ project.
-        - 2009-07-22: pyftpdlib included in  `Plumi <http://plumi.org/wiki>`__ 
project.
-        - 2009-04-02: pyftpdlib RPM-packaged and ported on `Fedora 
<https://admin.fedoraproject.org/pkgdb/packages/name/pyftpdlib>`__ to make 
users can easily install on it via *yum install pyftpdlib*.
-        - 2009-03-28: pyftpdlib included in  `Bazaar 
<http://bazaar-vcs.org/>`__ project.
-        - 2009-02-23: pyftpdlib included in `ShareFTP 
<http://git.logfish.net/shareftp.git/>`__ project.
-        - 2009-01-21: version `0.5.1 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.1.tar.gz>`__ 
released.
-        - 2008-12-27: pyftpdlib included in `Google Chromium 
<http://code.google.com/intl/it-IT/chromium/>`__, the open source project 
behind `Google Chrome <http://www.google.com/chrome>`__.
-        - 2008-12-27: pyftpdlib ported on `GNU Darwin 
<http://www.gnu-darwin.org/>`__ systems to make users can easily install on it.
-        - 2008-11-26: pyftpdlib included in `OpenERP <http://openerp.com>`__.
-        - 2008-10-26: pyftpdlib included in `Python for OpenVMS 
<http://www.vmspython.org/>`__ as standard package.
-        - 2008-10-09: pyftpdlib included in `Shareme 
<http://bbs.archlinux.org/viewtopic.php?pid=431474>`__ project.
-        - 2008-09-20: version `0.5.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.0.tar.gz>`__ 
released.
-        - 2008-08-10: pyftpdlib included in `Manent 
<http://trac.manent-backup.com/>`__ project.
-        - 2008-05-16: version `0.4.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.4.0.tar.gz>`__ 
released.
-        - 2008-04-09: pyftpdlib used as backend for `gpftpd 
<http://arkadiusz-wahlig.blogspot.com/2008/04/hosting-files-on-google.html>`__, 
an FTP server for managing files hosted on `Google Pages 
<http://-ages.google.com>`__.
-        - 2008-01-17: version `0.3.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.3.0.tar.gz>`__ 
released.
-        - 2007-10-14: pyftpdlib included in `Aksy 
<http://walco.n--tree.net/projects/aksy/wiki>`__ project.
-        - 2007-09-17: version `0.2.0 
<https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.2.0.tar.gz>`__ 
released.
-        - 2007-09-08: pyftpdlib included as `FarManager 
<http://farmanager.com/>`__ `plug-in 
<http://www.farmanager.com/enforum/viewtopic.php?t=640&highlight=&sid=12d4d90f27f421243bcf7a0e3c516efb>`__.
-        - 2007-03-06: pyftpdlib `ported on FreeBSD 
<http://www.freshports.org/ftp/py-pyftpdlib/>`__ systems to make users can 
easily install on it.
-        - 2007-03-07: version `0.1.1 
<http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.1.tar.gz>`__ released.
-        - 2007-02-26: version `0.1.0 
<http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.tar.gz>`__ released.
-        - 2006-09-26: initial clunky thread-based progenitor `link 
<http://billiejoex.altervista.org/Prj_pftpd.htm>`__.
-        
         Trademarks
         ==========
         
@@ -299,5 +242,4 @@
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
-Provides-Extra: sendfile
 Provides-Extra: ssl
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pyftpdlib-1.5.4/pyftpdlib.egg-info/requires.txt 
new/pyftpdlib-1.5.5/pyftpdlib.egg-info/requires.txt
--- old/pyftpdlib-1.5.4/pyftpdlib.egg-info/requires.txt 2018-05-04 
23:06:51.000000000 +0200
+++ new/pyftpdlib-1.5.5/pyftpdlib.egg-info/requires.txt 2019-04-04 
11:11:03.000000000 +0200
@@ -1,6 +1,3 @@
 
-[sendfile]
-pysendfile
-
 [ssl]
 PyOpenSSL


Reply via email to