[Python-modules-commits] [python-pyftpdlib] 01/04: Import python-pyftpdlib_1.5.1.orig.tar.gz

Wolfgang Borgert debacle at moszumanska.debian.org
Tue Oct 11 23:59:53 UTC 2016


This is an automated email from the git hooks/post-receive script.

debacle pushed a commit to branch master
in repository python-pyftpdlib.

commit 333ae10df2adecae4973ce28485c822850c9bb13
Author: W. Martin Borgert <debacle at debian.org>
Date:   Mon Oct 10 23:29:39 2016 +0000

    Import python-pyftpdlib_1.5.1.orig.tar.gz
---
 .git-pre-commit                                    |   47 +
 .travis.yml                                        |   20 -
 HISTORY.rst                                        |   53 +
 LICENSE                                            |    2 +-
 MANIFEST.in                                        |   14 +-
 Makefile                                           |   55 +-
 PKG-INFO                                           |  287 ++++
 README.rst                                         |    7 +-
 demo/anti_flood_ftpd.py                            |   33 +-
 demo/basic_ftpd.py                                 |   31 +-
 demo/md5_ftpd.py                                   |   51 +-
 demo/multi_proc_ftp.py                             |   33 +-
 demo/multi_thread_ftp.py                           |   33 +-
 demo/throttled_ftpd.py                             |   39 +-
 demo/tls_ftpd.py                                   |   35 +-
 demo/unix_daemon.py                                |   72 +-
 demo/unix_ftpd.py                                  |   35 +-
 demo/winnt_ftpd.py                                 |   33 +-
 docs/Makefile                                      |  177 ---
 docs/README.rst                                    |   15 -
 docs/_static/copybutton.js                         |   57 -
 docs/_static/favicon.ico                           |  Bin 15086 -> 0 bytes
 docs/_static/logo.png                              |  Bin 13008 -> 0 bytes
 docs/_static/sidebar.js                            |  161 --
 docs/_template/globaltoc.html                      |   12 -
 docs/_template/indexcontent.html                   |    4 -
 docs/_template/indexsidebar.html                   |    8 -
 docs/_template/page.html                           |   66 -
 docs/_themes/pydoctheme/static/pydoctheme.css      |  187 ---
 docs/_themes/pydoctheme/theme.conf                 |   23 -
 docs/adoptions.rst                                 |  340 ----
 docs/api.rst                                       |  615 -------
 docs/benchmarks.rst                                |  274 ----
 docs/conf.py                                       |  262 ---
 docs/faqs.rst                                      |  385 -----
 docs/index.rst                                     |   27 -
 docs/install.rst                                   |   43 -
 docs/make.bat                                      |  242 ---
 docs/rfc-compliance.rst                            |  296 ----
 docs/tutorial.rst                                  |  536 -------
 make.bat                                           |   10 +-
 pyftpdlib.egg-info/PKG-INFO                        |  287 ++++
 pyftpdlib.egg-info/SOURCES.txt                     |   45 +
 pyftpdlib.egg-info/dependency_links.txt            |    1 +
 pyftpdlib.egg-info/requires.txt                    |    6 +
 pyftpdlib.egg-info/top_level.txt                   |    1 +
 pyftpdlib/__init__.py                              |   49 +-
 pyftpdlib/__main__.py                              |   52 +-
 pyftpdlib/_compat.py                               |   70 +-
 pyftpdlib/authorizers.py                           |   89 +-
 pyftpdlib/contrib/__init__.py                      |    3 -
 pyftpdlib/contrib/authorizers.py                   |   47 -
 pyftpdlib/contrib/filesystems.py                   |   40 -
 pyftpdlib/contrib/handlers.py                      |   40 -
 pyftpdlib/filesystems.py                           |   40 +-
 pyftpdlib/ftpserver.py                             |   89 --
 pyftpdlib/handlers.py                              |  791 +++++----
 pyftpdlib/ioloop.py                                |  512 +++---
 pyftpdlib/log.py                                   |   80 +-
 pyftpdlib/servers.py                               |  152 +-
 pyftpdlib/test/README                              |    5 +
 pyftpdlib/test/__init__.py                         |  282 ++++
 {test => pyftpdlib/test}/keycert.pem               |    0
 pyftpdlib/test/runner.py                           |   33 +
 pyftpdlib/test/test_authorizers.py                 |  554 +++++++
 pyftpdlib/test/test_filesystems.py                 |  219 +++
 .../test/test_functional.py                        | 1674 ++++++--------------
 pyftpdlib/test/test_functional_ssl.py              |  373 +++++
 pyftpdlib/test/test_ioloop.py                      |  291 ++++
 pyftpdlib/test/test_servers.py                     |  223 +++
 test/bench.py => scripts/ftpbench                  |  434 ++---
 setup.cfg                                          |    5 +
 setup.py                                           |   94 +-
 test/test_contrib.py                               |  963 -----------
 tox.ini                                            |   29 -
 75 files changed, 4477 insertions(+), 7716 deletions(-)

diff --git a/.git-pre-commit b/.git-pre-commit
new file mode 100755
index 0000000..0b838d4
--- /dev/null
+++ b/.git-pre-commit
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+
+# This gets executed on 'git commit' and rejects the commit in case the
+# submitted code does not pass validation.
+# Install it with "make install-git-hooks"
+
+import os
+import subprocess
+import sys
+
+
+def main():
+    out = subprocess.check_output("git diff --cached --name-only", shell=True)
+    files = [x for x in out.split('\n') if x.endswith('.py') and
+             os.path.exists(x)]
+
+    for path in files:
+        with open(path) as f:
+            data = f.read()
+
+        # pdb
+        if "pdb.set_trace" in data:
+            for lineno, line in enumerate(data.split('\n'), 1):
+                line = line.rstrip()
+                if "pdb.set_trace" in line:
+                    print("%s: %s" % (lineno, line))
+                    sys.exit(
+                        "commit aborted: you forgot a pdb in your python code")
+
+        # bare except clause
+        if "except:" in data:
+            for lineno, line in enumerate(data.split('\n'), 1):
+                line = line.rstrip()
+                if "except:" in line and not line.endswith("# NOQA"):
+                    print("%s: %s" % (lineno, line))
+                    sys.exit("commit aborted: bare except clause")
+
+    # flake8
+    failed = False
+    for path in files:
+        ret = subprocess.call("python -m flake8 %s" % path, shell=True)
+        if ret != 0:
+            failed = True
+    if failed:
+        sys.exit("commit aborted: python code is not flake8-compliant")
+
+main()
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 544db06..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: python
-python:
-    - 2.6
-    - 2.7
-    - 3.2
-    - 3.3
-    - 3.4
-    - pypy
-install:
-    - if [[ $TRAVIS_PYTHON_VERSION == '2.6' ]]; then pip install unittest2; fi
-script:
-    - pip install flake8
-    - python setup.py install
-    - python test/test_ftpd.py
-    - python test/test_contrib.py
-    - make flake8
-os:
-    - linux
-    - osx
-
diff --git a/HISTORY.rst b/HISTORY.rst
index 4165aa1..3e9b6b2 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,5 +1,58 @@
 Bug tracker at https://github.com/giampaolo/pyftpdlib/issues
 
+Version: 1.5.1 - 2016-05-02
+===========================
+
+**Bug fixes**
+
+- #381: an extraneous file was accidentally added to the tarball, causing
+  issues with Python 3.
+
+
+Version: 1.5.0 - 2015-12-13
+===========================
+
+**Enhancements**
+
+- #304: remove deprecated items from 1.0.0 which were left in place for
+  backward compatibility
+- #324: FTPHandler.started attribute, to figure out when client connected.
+- #340: dropped python 2.4 and 2.5 support.
+- #344: bench.py script --ssl option.
+- #346: provide more debugging info.
+- #348: FTPHandler has a new "auth_failed_timeout" class attribute (previously
+  this was called _auth_failed_timeout).
+- #350: tests now live in pyftpdlib module namespace.
+- #351: fallback on using plain send() if sendfile() fails and no data has been
+  transmitted yet.
+- #356: sendfile() is now used in case we're using SSL but data connection is
+  in clear text.
+- #361: benchmark script now allows to benchmark downloads and uploads only
+  (instead of both).
+- #362: 'ftpbench' script is now installed as a system script on 'setup.py
+  install'.
+- #365: TLS FTP server is now 25% faster when dealing with clear-text
+  connections.
+
+**Bug fixes**
+
+- #302: setup.py should not require pysendfile on Python >= 3.3.
+- #313: configuring root logger has no effect on pyftpdlib logging.
+- #329: IOLoop throws OSError on Linux.
+- #337: MultiprocessFTPServer and ThreadedFTPServer do not accept backlog
+  argument.
+- #338: benchmark script uses old psutil API.
+- #343: recv() does not handle EBUSY.
+- #347: SSL WantReadError and WantWriteError errors are not properly taken into
+  account.
+- #357: python -m pyftpdlib --verbose option doesn't work
+
+**Incompatible API changes**
+
+- FTPHandler._auth_failed_timeout has been renamed to
+  FTPHandler.auth_failed_timeout.
+
+
 Version: 1.4.0 - Date: 2014-06-03
 =================================
 
diff --git a/LICENSE b/LICENSE
index a4d4cca..8e518f1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
 ======================================================================
-Copyright (C) 2007-2012  Giampaolo Rodola' <g.rodola at gmail.com>
+Copyright (C) 2007-2016  Giampaolo Rodola' <g.rodola at gmail.com>
 
                          All Rights Reserved
 
diff --git a/MANIFEST.in b/MANIFEST.in
index 3609251..3a23451 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,15 +1,13 @@
 # Tells "python setup.py sdist" what files to include in the tarball.
-# Note: make sure everything is in place with "svn list -R".
 
+include .git-pre-commit
 include CREDITS
-include HISTORY
-include INSTALL
+include HISTORY.rst
 include LICENSE
 include make.bat
 include Makefile
 include MANIFEST.in
-include README
-include setup.py
-recursive-include demo *.py *.pem
-recursive-include pyftpdlib *.py
-recursive-include test *.py *.pem
+include README.rst
+recursive-include demo *.py *.pem *README*
+recursive-include pyftpdlib *.py *.pem *README*
+recursive-include scripts *
diff --git a/Makefile b/Makefile
index 55225cd..1072dce 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 # $ make install PYTHON=python3.3
 
 PYTHON=python
-TSCRIPT=test/test_ftpd.py
+TSCRIPT=pyftpdlib/test/runner.py
 FLAGS=
 
 all: test
@@ -25,22 +25,49 @@ build: clean
 	$(PYTHON) setup.py build
 
 install: build
-	if test $(PYTHON) = python2.4; then \
-		$(PYTHON) setup.py install; \
-	elif test $(PYTHON) = python2.5; then \
-		$(PYTHON) setup.py install; \
-	else \
-		$(PYTHON) setup.py install --user; \
-	fi
+	$(PYTHON) setup.py install --user;
 
 uninstall:
-	pip-`$(PYTHON) -c "import sys; sys.stdout.write('.'.join(map(str, sys.version_info)[:2]))"` uninstall -y -v pyftpdlib
+	pip-`$(PYTHON) -c "import sys; sys.stdout.write('.'.join(list(map(str, sys.version_info))[:2]))"` uninstall -y -v pyftpdlib
+
+# useful deps which are nice to have while developing / testing
+setup-dev-env: install-git-hooks
+	python -c  "import urllib2, ssl; \
+				context = ssl._create_unverified_context() if hasattr(ssl, '_create_unverified_context') else None; \
+				kw = dict(context=context) if context else {}; \
+				r = urllib2.urlopen('https://bootstrap.pypa.io/get-pip.py', **kw); \
+				open('/tmp/get-pip.py', 'w').write(r.read());"
+	$(PYTHON) /tmp/get-pip.py --user
+	rm /tmp/get-pip.py
+	$(PYTHON) -m pip install --user --upgrade pip
+	$(PYTHON) -m pip install --user --upgrade \
+		coverage  \
+		flake8 \
+		ipdb \
+		mock==1.0.1 \
+		nose \
+		pep8 \
+		pyflakes \
+		pyopenssl \
+		pysendfile \
+		sphinx \
+		sphinx-pypi-upload \
+		unittest2 \
 
 test: install
 	$(PYTHON) $(TSCRIPT)
 
-test-contrib: install
-	$(PYTHON) test/test_contrib.py
+test-functional: install
+	$(PYTHON) pyftpdlib/test/test_functional.py
+
+test-functional-ssl: install
+	$(PYTHON) pyftpdlib/test/test_functional_ssl.py
+
+# Run a specific test by name; e.g. "make test-by-name retr" will run
+# all test methods containing "retr" in their name.
+# Requires "pip install nose".
+test-by-name:
+	@$(PYTHON) -m nose pyftpdlib/test/test_*.py --nocapture -v -m $(filter-out $@,$(MAKECMDGOALS))
 
 nosetest: install
 	# $ make nosetest FLAGS=test_name
@@ -69,3 +96,9 @@ upload-docs:
 # git-tag a new release
 git-tag-release:
 	git tag -a release-`python -c "import setup; print(setup.VERSION)"` -m `git rev-list HEAD --count`:`git rev-parse --short HEAD`
+	@echo "now run 'git push --tags'"
+
+# install GIT pre-commit hook
+install-git-hooks:
+	ln -sf ../../.git-pre-commit .git/hooks/pre-commit
+	chmod +x .git/hooks/pre-commit
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..1d1b0e0
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,287 @@
+Metadata-Version: 1.1
+Name: pyftpdlib
+Version: 1.5.1
+Summary: Very fast asynchronous FTP server library
+Home-page: https://github.com/giampaolo/pyftpdlib/
+Author: Giampaolo Rodola'
+Author-email: g.rodola at gmail.com
+License: MIT
+Description: .. image:: https://pypip.in/d/pyftpdlib/badge.png
+            :target: https://crate.io/packages/pyftpdlib/
+            :alt: Download this month
+        
+        .. image:: https://pypip.in/v/pyftpdlib/badge.png
+            :target: https://pypi.python.org/pypi/pyftpdlib/
+            :alt: Latest version
+        
+        .. image:: https://pypip.in/license/pyftpdlib/badge.png
+            :target: https://pypi.python.org/pypi/pyftpdlib/
+            :alt: License
+        
+        .. image:: https://api.travis-ci.org/giampaolo/pyftpdlib.png?branch=master
+            :target: https://travis-ci.org/giampaolo/pyftpdlib
+            :alt: Travis
+        
+        Quick links
+        ===========
+        
+        - `Home <https://github.com/giampaolo/pyftpdlib>`__
+        - `Documentation <http://pythonhosted.org/pyftpdlib/>`__
+        - `Download <https://pypi.python.org/pypi/pyftpdlib/>`__
+        - `Blog <http://grodola.blogspot.com/search/label/pyftpdlib>`__
+        - `Mailing list <http://groups.google.com/group/pyftpdlib/topics>`__
+        - `What's new <https://github.com/giampaolo/pyftpdlib/blob/master/HISTORY.rst>`__
+        
+        About
+        =====
+        
+        Python FTP server library provides a high-level portable interface to easily
+        write very efficient, scalable and asynchronous FTP servers with Python. It is
+        the most complete `RFC-959 <http://www.faqs.org/rfcs/rfc959.html>`__ FTP server
+        implementation available for `Python <http://www.python.org/>`__ programming
+        language and it's used in projects like
+        `Google Chromium <http://www.code.google.com/chromium/>`__ and
+        `Bazaar <http://bazaar-vcs.org/>`__ and included in
+        `Debian <http://packages.debian.org/sid/python-pyftpdlib>`__,
+        `Fedora <https://admin.fedoraproject.org/pkgdb/packages/name/pyftpdlib>`__ and
+        `FreeBSD <http://www.freshports.org/ftp/py-pyftpdlib/>`__ package repositories.
+        
+        Features
+        ========
+        
+        - Extremely **lightweight**, **fast** and **scalable** (see
+          `why <https://github.com/giampaolo/pyftpdlib/issues/203>`__ and
+          `benchmarks <http://pythonhosted.org/pyftpdlib/benchmarks.html>`__).
+        - Uses **sendfile(2)** (see `pysendfile <https://github.com/giampaolo/pysendfile>`__)
+          system call for uploads.
+        - Uses epoll() / kqueue() / select() to handle concurrency asynchronously.
+        - ...But can optionally skip to a
+          `multiple thread / process <http://pythonhosted.org/pyftpdlib/tutorial.html#changing-the-concurrency-model>`__
+          model (as in: you'll be free to block or use slow filesystems).
+        - Portable: entirely written in pure Python; works with Python from **2.6** to
+          **3.5** by using a single code base.
+        - Supports **FTPS** (`RFC-4217 <http://tools.ietf.org/html/rfc4217>`__),
+          **IPv6** (`RFC-2428 <ftp://ftp.rfc-editor.org/in-notes/rfc2428.txt>`__),
+          **Unicode** file names (`RFC-2640 <http://tools.ietf.org/html/rfc2640>`__),
+          **MLSD/MLST** commands (`RFC-3659 <ftp://ftp.rfc-editor.org/in-notes/rfc3659.txt>`__).
+        - Support for virtual users and virtual filesystem.
+        - Extremely flexible system of "authorizers" able to manage both "virtual" and
+          "real" users on on both
+          `UNIX <http://pythonhosted.org/pyftpdlib/tutorial.html#unix-ftp-server>`__
+          and
+          `Windows <http://pythonhosted.org/pyftpdlib/tutorial.html#windows-ftp-server>`__.
+        - `Test coverage <https://github.com/giampaolo/pyftpdlib/blob/master/pyftpdlib/test/>`__
+          close to 100%.
+        
+        Performances
+        ============
+        
+        Depite being written in an intepreted language, pyftpdlib has transfer rates
+        superior to most common UNIX FTP servers. It also scales better since whereas
+        vsftpd and proftpd use multiple processes to achieve concurrency, pyftpdlib
+        will only use one process and handle concurrency asynchronously (see
+        `the C10K problem <http://www.kegel.com/c10k.html>`__). Here are some
+        `benchmarks <https://github.com/giampaolo/pyftpdlib/blob/master/test/bench.py>`__
+        made against my Linux 3.0.0 box, Intel core-duo 3.1 Ghz:
+        
+        pyftpdlib vs. proftpd 1.3.4
+        ---------------------------
+        
+        +-----------------------------------------+----------------+----------------+-------------+
+        | **benchmark type**                      | **pyftpdlib**  | **proftpd**    | **speedup** |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | STOR (client -> server)                 |  585.90 MB/sec | 600.49 MB/sec  | -0.02x      |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | RETR (server -> client)                 | 1652.72 MB/sec | 1524.05 MB/sec | **+0.08**   |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (connect, login) |    0.19 secs   | 9.98 secs      | **+51x**    |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | STOR (1 file with 300 idle clients)     |  585.59 MB/sec | 518.55 MB/sec  | **+0.1x**   |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | RETR (1 file with 300 idle clients)     | 1497.58 MB/sec | 1478.19 MB/sec | 0x          |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (RETR 10M file)  |    3.41 secs   | 3.60 secs      | **+0.05x**  |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (STOR 10M file)  |    8.60 secs   | 11.56 secs     | **+0.3x**   |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (QUIT)           |    0.03 secs   | 0.39 secs      | **+12x**    |
+        +-----------------------------------------+----------------+----------------+-------------+
+        
+        pyftpdlib vs. vsftpd 2.3.5
+        --------------------------
+        
+        +-----------------------------------------+----------------+----------------+-------------+
+        | **benchmark type**                      | **pyftpdlib**  | **proftpd**    | **speedup** |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | STOR (client -> server)                 |  585.90 MB/sec | 611.73 MB/sec  | -0.04x      |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | RETR (server -> client)                 | 1652.72 MB/sec | 1512.92 MB/sec | **+0.09**   |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (connect, login) |    0.19 secs   | 20.39 secs     | **+106x**   |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | STOR (1 file with 300 idle clients)     |  585.59 MB/sec | 610.23 MB/sec  | -0.04x      |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | RETR (1 file with 300 idle clients)     | 1497.58 MB/sec | 1493.01 MB/sec | 0x          |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (RETR 10M file)  |    3.41 secs   | 3.67 secs      | **+0.07x**  |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (STOR 10M file)  |    8.60 secs   | 9.82 secs      | **+0.07x**  |
+        +-----------------------------------------+----------------+----------------+-------------+
+        | 300 concurrent clients (QUIT)           |    0.03 secs   | 0.01 secs      | +0.14x      |
+        +-----------------------------------------+----------------+----------------+-------------+
+        
+        For more benchmarks see `here <http://pythonhosted.org/pyftpdlib/benchmarks.html>`__.
+        
+        Quick start
+        ===========
+        
+        .. code-block:: python
+        
+            >>> from pyftpdlib.authorizers import DummyAuthorizer
+            >>> from pyftpdlib.handlers import FTPHandler
+            >>> from pyftpdlib.servers import FTPServer
+            >>>
+            >>> authorizer = DummyAuthorizer()
+            >>> authorizer.add_user("user", "12345", "/home/giampaolo", perm="elradfmw")
+            >>> authorizer.add_anonymous("/home/nobody")
+            >>>
+            >>> handler = FTPHandler
+            >>> handler.authorizer = authorizer
+            >>>
+            >>> server = FTPServer(("127.0.0.1", 21), handler)
+            >>> server.serve_forever()
+            [I 13-02-19 10:55:42] >>> starting FTP server on 127.0.0.1:21 <<<
+            [I 13-02-19 10:55:42] poller: <class 'pyftpdlib.ioloop.Epoll'>
+            [I 13-02-19 10:55:42] masquerade (NAT) address: None
+            [I 13-02-19 10:55:42] passive ports: None
+            [I 13-02-19 10:55:42] use sendfile(2): True
+            [I 13-02-19 10:55:45] 127.0.0.1:34178-[] FTP session opened (connect)
+            [I 13-02-19 10:55:48] 127.0.0.1:34178-[user] USER 'user' logged in.
+            [I 13-02-19 10:56:27] 127.0.0.1:34179-[user] RETR /home/giampaolo/.vimrc completed=1 bytes=1700 seconds=0.001
+            [I 13-02-19 10:56:39] 127.0.0.1:34179-[user] FTP session closed (disconnect).
+        
+        `other code samples <http://pythonhosted.org/pyftpdlib/tutorial.html>`__
+        
+        Donate
+        ======
+        
+        A lot of time and effort went into making pyftpdlib as it is right now.
+        If you feel pyftpdlib is useful to you or your business and want to support its
+        future development please consider donating me
+        (`Giampaolo Rodola' <http://grodola.blogspot.com/p/about.html>`_) some money.
+        I only ask for a small donation, but of course I appreciate any amount.
+        
+        .. image:: https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif
+          :target: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZSSF7G42VA2XE
+          :alt: Donate via PayPal
+        
+        Don't want to donate money? Then maybe you could
+        `write me a recommendation on Linkedin <http://www.linkedin.com/in/grodola>`_.
+        In case you're using pyftpdlib into a software of yours
+        `mail me <http://grodola.blogspot.com/p/about.html>`_ and I'll add your
+        software to the
+        `adoptions list <http://pythonhosted.org/pyftpdlib/adoptions.html>`__.
+        
+        Timeline
+        ========
+        
+        - 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
+        ==========
+        
+        Some famous trademarks which adopted pyftpdlib (`complete list <http://pythonhosted.org/pyftpdlib/adoptions.html>`__).
+        
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/chrome.jpg
+          :target: http://www.google.com/chrome
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/debian.png
+          :target: http://www.debian.org
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/fedora.png
+          :target: http://fedoraproject.org/
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/freebsd.gif
+          :target: http://www.freebsd.org
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/openerp.jpg
+          :target: http://openerp.com
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/bazaar.jpg
+          :target: http://bazaar-vcs.org
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/bitsontherun.png
+          :target: http://www.bitsontherun.com
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/openvms.png
+          :target: http://www.openvms.org/
+        .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/smartfile.jpg
+          :target: http://www.openvms.org/
+        
+Keywords: ftp,ftps,server,ftpd,daemon,python,ssl,sendfile,asynchronous,nonblocking,eventdriven,rfc959,rfc1123,rfc2228,rfc2428,rfc2640,rfc3659
+Platform: Platform Independent
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: File Transfer Protocol (FTP)
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: System :: Filesystems
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.0
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
diff --git a/README.rst b/README.rst
index c56b58d..7b1a972 100644
--- a/README.rst
+++ b/README.rst
@@ -50,8 +50,8 @@ Features
 - ...But can optionally skip to a
   `multiple thread / process <http://pythonhosted.org/pyftpdlib/tutorial.html#changing-the-concurrency-model>`__
   model (as in: you'll be free to block or use slow filesystems).
-- Portable: entirely written in pure Python; works with Python from **2.4** to
-  **3.4** (by using a single code base).
+- Portable: entirely written in pure Python; works with Python from **2.6** to
+  **3.5** by using a single code base.
 - Supports **FTPS** (`RFC-4217 <http://tools.ietf.org/html/rfc4217>`__),
   **IPv6** (`RFC-2428 <ftp://ftp.rfc-editor.org/in-notes/rfc2428.txt>`__),
   **Unicode** file names (`RFC-2640 <http://tools.ietf.org/html/rfc2640>`__),
@@ -62,7 +62,7 @@ Features
   `UNIX <http://pythonhosted.org/pyftpdlib/tutorial.html#unix-ftp-server>`__
   and
   `Windows <http://pythonhosted.org/pyftpdlib/tutorial.html#windows-ftp-server>`__.
-- `Test coverage <https://github.com/giampaolo/pyftpdlib/blob/master/test/test_ftpd.py>`__
+- `Test coverage <https://github.com/giampaolo/pyftpdlib/blob/master/pyftpdlib/test/>`__
   close to 100%.
 
 Performances
@@ -177,6 +177,7 @@ software to the
 Timeline
 ========
 
+- 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.
diff --git a/demo/anti_flood_ftpd.py b/demo/anti_flood_ftpd.py
index c12befe..864fedd 100755
--- a/demo/anti_flood_ftpd.py
+++ b/demo/anti_flood_ftpd.py
@@ -1,33 +1,8 @@
 #!/usr/bin/env python
 
-#  pyftpdlib is released under the MIT license, reproduced below:
-#  ======================================================================
-#  Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-#                         All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#  ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
 
 """
 A FTP server banning clients in case of commands flood.
@@ -36,9 +11,9 @@ If client sends more than 300 requests per-second it will be
 disconnected and won't be able to re-connect for 1 hour.
 """
 
+from pyftpdlib.authorizers import DummyAuthorizer
 from pyftpdlib.handlers import FTPHandler
 from pyftpdlib.servers import FTPServer
-from pyftpdlib.authorizers import DummyAuthorizer
 
 
 class AntiFloodHandler(FTPHandler):
diff --git a/demo/basic_ftpd.py b/demo/basic_ftpd.py
index c1ebc4a..88512ab 100755
--- a/demo/basic_ftpd.py
+++ b/demo/basic_ftpd.py
@@ -1,33 +1,8 @@
 #!/usr/bin/env python
 
-#  pyftpdlib is released under the MIT license, reproduced below:
-#  ======================================================================
-#  Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-#                         All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#  ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
 
 """A basic FTP server which uses a DummyAuthorizer for managing 'virtual
 users', setting a limit for incoming connections.
diff --git a/demo/md5_ftpd.py b/demo/md5_ftpd.py
index 547c444..c2653bd 100755
--- a/demo/md5_ftpd.py
+++ b/demo/md5_ftpd.py
@@ -1,54 +1,29 @@
 #!/usr/bin/env python
 
-#  pyftpdlib is released under the MIT license, reproduced below:
-#  ======================================================================
-#  Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-#                         All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#  ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
 
-"""A basic ftpd storing passwords as hash digests (platform independent).
+"""
+A basic ftpd storing passwords as hash digests (platform independent).
 """
 
+from hashlib import md5
 import os
-try:
-    from hashlib import md5
-except ImportError:
-    # backward compatibility with Python < 2.5
-    from md5 import new as md5
+import sys
 
+from pyftpdlib.authorizers import AuthenticationFailed
+from pyftpdlib.authorizers import DummyAuthorizer
 from pyftpdlib.handlers import FTPHandler
 from pyftpdlib.servers import FTPServer
-from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed
-from pyftpdlib._compat import b
 
 
 class DummyMD5Authorizer(DummyAuthorizer):
 
     def validate_authentication(self, username, password, handler):
-        hash = md5(b(password)).hexdigest()
+        if sys.version_info >= (3, 0):
+            password = md5(password.encode('latin1'))
+        hash = md5(password).hexdigest()
         try:
             if self.user_table[username]['pwd'] != hash:
                 raise KeyError
@@ -58,7 +33,7 @@ class DummyMD5Authorizer(DummyAuthorizer):
 
 def main():
     # get a hash digest from a clear-text password
-    hash = md5(b('12345')).hexdigest()
+    hash = md5(b'12345').hexdigest()
     authorizer = DummyMD5Authorizer()
     authorizer.add_user('user', hash, os.getcwd(), perm='elradfmw')
     authorizer.add_anonymous(os.getcwd())
diff --git a/demo/multi_proc_ftp.py b/demo/multi_proc_ftp.py
index 49e95eb..ccd03d9 100755
--- a/demo/multi_proc_ftp.py
+++ b/demo/multi_proc_ftp.py
@@ -1,33 +1,8 @@
 #!/usr/bin/env python
 
-#  pyftpdlib is released under the MIT license, reproduced below:
-#  ======================================================================
-#  Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-#                         All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#  ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
 
 """
 A FTP server which handles every connection in a separate process.
@@ -37,9 +12,9 @@ filesystem is too slow.
 POSIX only; requires python >= 2.6.
 """
 
+from pyftpdlib.authorizers import DummyAuthorizer
 from pyftpdlib.handlers import FTPHandler
 from pyftpdlib.servers import MultiprocessFTPServer
-from pyftpdlib.authorizers import DummyAuthorizer
 
 
 def main():
diff --git a/demo/multi_thread_ftp.py b/demo/multi_thread_ftp.py
index ddbc3a4..c6161af 100755
--- a/demo/multi_thread_ftp.py
+++ b/demo/multi_thread_ftp.py
@@ -1,33 +1,8 @@
 #!/usr/bin/env python
 
-#  pyftpdlib is released under the MIT license, reproduced below:
-#  ======================================================================
-#  Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-#                         All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#  ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
 
 """
 A FTP server which handles every connection in a separate thread.
@@ -35,9 +10,9 @@ Useful if your handler class contains blocking calls or your
 filesystem is too slow.
 """
 
+from pyftpdlib.authorizers import DummyAuthorizer
 from pyftpdlib.handlers import FTPHandler
 from pyftpdlib.servers import ThreadedFTPServer
-from pyftpdlib.authorizers import DummyAuthorizer
 
 
 def main():
diff --git a/demo/throttled_ftpd.py b/demo/throttled_ftpd.py
index 6de4e9b..a7464f4 100755
--- a/demo/throttled_ftpd.py
+++ b/demo/throttled_ftpd.py
@@ -1,42 +1,19 @@
 #!/usr/bin/env python
 
-#  pyftpdlib is released under the MIT license, reproduced below:
-#  ======================================================================
-#  Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-#                         All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#  ======================================================================
-
-"""An FTP server which uses the ThrottledDTPHandler class for limiting the
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
+
+"""
+An FTP server which uses the ThrottledDTPHandler class for limiting the
 speed of downloads and uploads.
 """
 
 import os
 
 from pyftpdlib.authorizers import DummyAuthorizer
-from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler
+from pyftpdlib.handlers import FTPHandler
+from pyftpdlib.handlers import ThrottledDTPHandler
 from pyftpdlib.servers import FTPServer
... 14211 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-pyftpdlib.git



More information about the Python-modules-commits mailing list