bpo-36932: use proper deprecation-removed directive (GH-13349)



.. And update some deprecation warnings with version numbers.




https://bugs.python.org/issue36932
diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst
index bb064bd..d94fa58 100644
--- a/Doc/library/asyncio-task.rst
+++ b/Doc/library/asyncio-task.rst
@@ -279,8 +279,8 @@
    ``sleep()`` always suspends the current task, allowing other tasks
    to run.
 
-   The *loop* argument is deprecated and scheduled for removal
-   in Python 3.10.
+   .. deprecated-removed:: 3.8 3.10
+      The *loop* parameter.
 
    .. _asyncio_example_sleep:
 
@@ -437,8 +437,8 @@
 
    If the wait is cancelled, the future *aw* is also cancelled.
 
-   The *loop* argument is deprecated and scheduled for removal
-   in Python 3.10.
+   .. deprecated-removed:: 3.8 3.10
+      The *loop* parameter.
 
    .. _asyncio_example_waitfor:
 
@@ -478,10 +478,12 @@
    set concurrently and block until the condition specified
    by *return_when*.
 
-   If any awaitable in *aws* is a coroutine, it is automatically
-   scheduled as a Task.  Passing coroutines objects to
-   ``wait()`` directly is deprecated as it leads to
-   :ref:`confusing behavior <asyncio_example_wait_coroutine>`.
+   .. deprecated:: 3.8
+
+      If any awaitable in *aws* is a coroutine, it is automatically
+      scheduled as a Task.  Passing coroutines objects to
+      ``wait()`` directly is deprecated as it leads to
+      :ref:`confusing behavior <asyncio_example_wait_coroutine>`.
 
    Returns two sets of Tasks/Futures: ``(done, pending)``.
 
@@ -489,8 +491,8 @@
 
         done, pending = await asyncio.wait(aws)
 
-   The *loop* argument is deprecated and scheduled for removal
-   in Python 3.10.
+   .. deprecated-removed:: 3.8 3.10
+      The *loop* parameter.
 
    *timeout* (a float or int), if specified, can be used to control
    the maximum number of seconds to wait before returning.
@@ -550,6 +552,8 @@
           if task in done:
               # Everything will work as expected now.
 
+   .. deprecated:: 3.8
+
       Passing coroutine objects to ``wait()`` directly is
       deprecated.
 
@@ -868,8 +872,10 @@
       If *loop* is ``None``, the :func:`get_event_loop` function
       is used to get the current loop.
 
-      This method is **deprecated** and will be removed in
-      Python 3.9.  Use the :func:`asyncio.all_tasks` function instead.
+      .. deprecated-removed:: 3.7 3.9
+
+         Do not call this as a task method. Use the :func:`asyncio.all_tasks`
+         function instead.
 
    .. classmethod:: current_task(loop=None)
 
@@ -878,9 +884,10 @@
       If *loop* is ``None``, the :func:`get_event_loop` function
       is used to get the current loop.
 
-      This method is **deprecated** and will be removed in
-      Python 3.9.  Use the :func:`asyncio.current_task` function
-      instead.
+      .. deprecated-removed:: 3.7 3.9
+
+         Do not call this as a task method.  Use the
+         :func:`asyncio.current_task` function instead.
 
 
 .. _asyncio_generator_based_coro:
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 5039ffa..7d27c89 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -1353,7 +1353,7 @@
       This function has been added on a provisional basis (see :pep:`411`
       for details.)  Use it only for debugging purposes.
 
-   .. deprecated:: 3.7
+   .. deprecated-removed:: 3.7 3.8
       The coroutine wrapper functionality has been deprecated, and
       will be removed in 3.8. See :issue:`32591` for details.
 
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index b274b9b..1dc5952 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -95,7 +95,7 @@
 
         None is returned when called not in the context of a Task.
         """
-        warnings.warn("Task.current_task() is deprecated, "
+        warnings.warn("Task.current_task() is deprecated since Python 3.7, "
                       "use asyncio.current_task() instead",
                       DeprecationWarning,
                       stacklevel=2)
@@ -109,7 +109,7 @@
 
         By default all tasks for the current event loop are returned.
         """
-        warnings.warn("Task.all_tasks() is deprecated, "
+        warnings.warn("Task.all_tasks() is deprecated since Python 3.7, "
                       "use asyncio.all_tasks() instead",
                       DeprecationWarning,
                       stacklevel=2)
@@ -388,8 +388,8 @@
     if loop is None:
         loop = events.get_running_loop()
     else:
-        warnings.warn("The loop argument is deprecated and scheduled for "
-                      "removal in Python 3.10.",
+        warnings.warn("The loop argument is deprecated since Python 3.8, "
+                      "and scheduled for removal in Python 3.10.",
                       DeprecationWarning, stacklevel=2)
 
     fs = {ensure_future(f, loop=loop) for f in set(fs)}
@@ -418,8 +418,8 @@
     if loop is None:
         loop = events.get_running_loop()
     else:
-        warnings.warn("The loop argument is deprecated and scheduled for "
-                      "removal in Python 3.10.",
+        warnings.warn("The loop argument is deprecated since Python 3.8, "
+                      "and scheduled for removal in Python 3.10.",
                       DeprecationWarning, stacklevel=2)
 
     if timeout is None:
@@ -600,8 +600,8 @@
     if loop is None:
         loop = events.get_running_loop()
     else:
-        warnings.warn("The loop argument is deprecated and scheduled for "
-                      "removal in Python 3.10.",
+        warnings.warn("The loop argument is deprecated since Python 3.8, "
+                      "and scheduled for removal in Python 3.10.",
                       DeprecationWarning, stacklevel=2)
 
     future = loop.create_future()