bpo-44498: Issue a deprecation warning on asynchat, asyncore and smtpd import (#26882)

* Issue a deprecation warning on smtpd import

* Also issue DeprecationWarnings for asynchat and asyncore

* Fix some tests

* test___all__ requires the word 'module' or 'package' in the deprecation
  warning text, so add those to smtpd, asynchat, and asyncore.
* In test_support, use pprint now instead of asyncore as the landmark.

* Add What's New

* Use ..deprecated::

* Use ..deprecated::

* Update Lib/smtpd.py

Co-authored-by: Miro Hrončok <miro@hroncok.cz>

* Update Doc/library/smtpd.rst

Co-authored-by: Miro Hrončok <miro@hroncok.cz>

* Import async{hat,ore} after the DeprecationWarning for this module

Co-authored-by: Miro Hrončok <miro@hroncok.cz>
This commit is contained in:
Barry Warsaw 2021-06-24 12:37:26 -07:00 committed by GitHub
parent 19459f8ce6
commit 8488b85c63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 9 deletions

View File

@ -13,11 +13,10 @@
This module offers several classes to implement SMTP (email) servers. This module offers several classes to implement SMTP (email) servers.
.. seealso:: .. deprecated:: 3.6
The `aiosmtpd <https://aiosmtpd.readthedocs.io/>`_ package is a recommended
The `aiosmtpd <http://aiosmtpd.readthedocs.io/>`_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a
replacement for this module. It is based on :mod:`asyncio` and provides a more straightforward API.
more straightforward API. :mod:`smtpd` should be considered deprecated.
Several server implementations are present; one is a generic Several server implementations are present; one is a generic
do-nothing implementation, which can be overridden, while the other two offer do-nothing implementation, which can be overridden, while the other two offer

View File

@ -883,6 +883,12 @@ The :meth:`~array.array.index` method of :class:`array.array` now has
optional *start* and *stop* parameters. optional *start* and *stop* parameters.
(Contributed by Anders Lorentsen and Zackery Spytz in :issue:`31956`.) (Contributed by Anders Lorentsen and Zackery Spytz in :issue:`31956`.)
asynchat, asyncore, smtpd
-------------------------
These modules have been marked as deprecated in their module documentation
since Python 3.6. An import-time :class:`DeprecationWarning` has now been
added to all three of these modules.
base64 base64
------ ------

View File

@ -48,6 +48,14 @@ you - by calling your self.found_terminator() method.
import asyncore import asyncore
from collections import deque from collections import deque
from warnings import warn
warn(
'The asynchat module is deprecated. '
'The recommended replacement is asyncio',
DeprecationWarning,
stacklevel=2)
class async_chat(asyncore.dispatcher): class async_chat(asyncore.dispatcher):
"""This is an abstract class. You must derive from this class, and add """This is an abstract class. You must derive from this class, and add

View File

@ -57,6 +57,13 @@ from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \
ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \
errorcode errorcode
warnings.warn(
'The asyncore module is deprecated. '
'The recommended replacement is asyncio',
DeprecationWarning,
stacklevel=2)
_DISCONNECTED = frozenset({ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, _DISCONNECTED = frozenset({ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE,
EBADF}) EBADF})

View File

@ -76,8 +76,6 @@ import errno
import getopt import getopt
import time import time
import socket import socket
import asyncore
import asynchat
import collections import collections
from warnings import warn from warnings import warn
from email._header_value_parser import get_addr_spec, get_angle_addr from email._header_value_parser import get_addr_spec, get_angle_addr
@ -86,6 +84,19 @@ __all__ = [
"SMTPChannel", "SMTPServer", "DebuggingServer", "PureProxy", "SMTPChannel", "SMTPServer", "DebuggingServer", "PureProxy",
] ]
warn(
'The smtpd module is deprecated and unmaintained. Please see aiosmtpd '
'(https://aiosmtpd.readthedocs.io/) for the recommended replacement.',
DeprecationWarning,
stacklevel=2)
# These are imported after the above warning so that users get the correct
# deprecation warning.
import asyncore
import asynchat
program = sys.argv[0] program = sys.argv[0]
__version__ = 'Python SMTP proxy version 0.3' __version__ = 'Python SMTP proxy version 0.3'

View File

@ -292,8 +292,8 @@ class TestSupport(unittest.TestCase):
def test_CleanImport(self): def test_CleanImport(self):
import importlib import importlib
with import_helper.CleanImport("asyncore"): with import_helper.CleanImport("pprint"):
importlib.import_module("asyncore") importlib.import_module("pprint")
def test_DirsOnSysPath(self): def test_DirsOnSysPath(self):
with import_helper.DirsOnSysPath('foo', 'bar'): with import_helper.DirsOnSysPath('foo', 'bar'):