mirror of https://github.com/django/django.git
Fixed #31327 -- Deprecated providing_args argument for Signal.
This commit is contained in:
parent
5ca76baa72
commit
769cee5252
|
@ -1,5 +1,5 @@
|
||||||
from django.dispatch import Signal
|
from django.dispatch import Signal
|
||||||
|
|
||||||
user_logged_in = Signal(providing_args=['request', 'user'])
|
user_logged_in = Signal()
|
||||||
user_login_failed = Signal(providing_args=['credentials', 'request'])
|
user_login_failed = Signal()
|
||||||
user_logged_out = Signal(providing_args=['request', 'user'])
|
user_logged_out = Signal()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from django.dispatch import Signal
|
from django.dispatch import Signal
|
||||||
|
|
||||||
request_started = Signal(providing_args=["environ", "scope"])
|
request_started = Signal()
|
||||||
request_finished = Signal()
|
request_finished = Signal()
|
||||||
got_request_exception = Signal(providing_args=["request"])
|
got_request_exception = Signal()
|
||||||
setting_changed = Signal(providing_args=["setting", "value", "enter"])
|
setting_changed = Signal()
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
from django.dispatch import Signal
|
from django.dispatch import Signal
|
||||||
|
|
||||||
connection_created = Signal(providing_args=["connection"])
|
connection_created = Signal()
|
||||||
|
|
|
@ -3,7 +3,7 @@ from functools import partial
|
||||||
from django.db.models.utils import make_model_tuple
|
from django.db.models.utils import make_model_tuple
|
||||||
from django.dispatch import Signal
|
from django.dispatch import Signal
|
||||||
|
|
||||||
class_prepared = Signal(providing_args=["class"])
|
class_prepared = Signal()
|
||||||
|
|
||||||
|
|
||||||
class ModelSignal(Signal):
|
class ModelSignal(Signal):
|
||||||
|
@ -34,20 +34,16 @@ class ModelSignal(Signal):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
pre_init = ModelSignal(providing_args=["instance", "args", "kwargs"], use_caching=True)
|
pre_init = ModelSignal(use_caching=True)
|
||||||
post_init = ModelSignal(providing_args=["instance"], use_caching=True)
|
post_init = ModelSignal(use_caching=True)
|
||||||
|
|
||||||
pre_save = ModelSignal(providing_args=["instance", "raw", "using", "update_fields"],
|
pre_save = ModelSignal(use_caching=True)
|
||||||
use_caching=True)
|
post_save = ModelSignal(use_caching=True)
|
||||||
post_save = ModelSignal(providing_args=["instance", "raw", "created", "using", "update_fields"], use_caching=True)
|
|
||||||
|
|
||||||
pre_delete = ModelSignal(providing_args=["instance", "using"], use_caching=True)
|
pre_delete = ModelSignal(use_caching=True)
|
||||||
post_delete = ModelSignal(providing_args=["instance", "using"], use_caching=True)
|
post_delete = ModelSignal(use_caching=True)
|
||||||
|
|
||||||
m2m_changed = ModelSignal(
|
m2m_changed = ModelSignal(use_caching=True)
|
||||||
providing_args=["action", "instance", "reverse", "model", "pk_set", "using"],
|
|
||||||
use_caching=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
pre_migrate = Signal(providing_args=["app_config", "verbosity", "interactive", "using", "apps", "plan"])
|
pre_migrate = Signal()
|
||||||
post_migrate = Signal(providing_args=["app_config", "verbosity", "interactive", "using", "apps", "plan"])
|
post_migrate = Signal()
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import threading
|
import threading
|
||||||
|
import warnings
|
||||||
import weakref
|
import weakref
|
||||||
|
|
||||||
|
from django.utils.deprecation import RemovedInDjango40Warning
|
||||||
from django.utils.inspect import func_accepts_kwargs
|
from django.utils.inspect import func_accepts_kwargs
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,14 +30,16 @@ class Signal:
|
||||||
def __init__(self, providing_args=None, use_caching=False):
|
def __init__(self, providing_args=None, use_caching=False):
|
||||||
"""
|
"""
|
||||||
Create a new signal.
|
Create a new signal.
|
||||||
|
|
||||||
providing_args
|
|
||||||
A list of the arguments this signal can pass along in a send() call.
|
|
||||||
"""
|
"""
|
||||||
self.receivers = []
|
self.receivers = []
|
||||||
if providing_args is None:
|
if providing_args is not None:
|
||||||
providing_args = []
|
warnings.warn(
|
||||||
self.providing_args = set(providing_args)
|
'The providing_args argument is deprecated. As it is purely '
|
||||||
|
'documentational, it has no replacement. If you rely on this '
|
||||||
|
'argument as documentation, you can move the text to a code '
|
||||||
|
'comment or docstring.',
|
||||||
|
RemovedInDjango40Warning, stacklevel=2,
|
||||||
|
)
|
||||||
self.lock = threading.Lock()
|
self.lock = threading.Lock()
|
||||||
self.use_caching = use_caching
|
self.use_caching = use_caching
|
||||||
# For convenience we create empty caches even if they are not used.
|
# For convenience we create empty caches even if they are not used.
|
||||||
|
@ -187,9 +191,7 @@ class Signal:
|
||||||
occur).
|
occur).
|
||||||
|
|
||||||
named
|
named
|
||||||
Named arguments which will be passed to receivers. These
|
Named arguments which will be passed to receivers.
|
||||||
arguments must be a subset of the argument names defined in
|
|
||||||
providing_args.
|
|
||||||
|
|
||||||
Return a list of tuple pairs [(receiver, response), ... ].
|
Return a list of tuple pairs [(receiver, response), ... ].
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ from django.utils import timezone
|
||||||
from django.utils.formats import FORMAT_SETTINGS, reset_format_cache
|
from django.utils.formats import FORMAT_SETTINGS, reset_format_cache
|
||||||
from django.utils.functional import empty
|
from django.utils.functional import empty
|
||||||
|
|
||||||
template_rendered = Signal(providing_args=["template", "context"])
|
template_rendered = Signal()
|
||||||
|
|
||||||
# Most setting_changed receivers are supposed to be added below,
|
# Most setting_changed receivers are supposed to be added below,
|
||||||
# except for cases where the receiver is related to a contrib app.
|
# except for cases where the receiver is related to a contrib app.
|
||||||
|
|
|
@ -21,7 +21,7 @@ from django.utils.functional import cached_property
|
||||||
from django.utils.version import get_version_tuple
|
from django.utils.version import get_version_tuple
|
||||||
|
|
||||||
autoreload_started = Signal()
|
autoreload_started = Signal()
|
||||||
file_changed = Signal(providing_args=['file_path', 'kind'])
|
file_changed = Signal()
|
||||||
|
|
||||||
DJANGO_AUTORELOAD_ENV = 'RUN_MAIN'
|
DJANGO_AUTORELOAD_ENV = 'RUN_MAIN'
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,9 @@ details on these changes.
|
||||||
``django.utils.deprecation.MiddlewareMixin.__init__()`` will be required and
|
``django.utils.deprecation.MiddlewareMixin.__init__()`` will be required and
|
||||||
won't accept ``None``.
|
won't accept ``None``.
|
||||||
|
|
||||||
|
* The ``providing_args`` argument for ``django.dispatch.Signal`` will be
|
||||||
|
removed.
|
||||||
|
|
||||||
See the :ref:`Django 3.1 release notes <deprecated-features-3.1>` for more
|
See the :ref:`Django 3.1 release notes <deprecated-features-3.1>` for more
|
||||||
details on these changes.
|
details on these changes.
|
||||||
|
|
||||||
|
|
|
@ -546,6 +546,11 @@ Miscellaneous
|
||||||
older versions of Django. Support for the old format remains until Django
|
older versions of Django. Support for the old format remains until Django
|
||||||
4.0.
|
4.0.
|
||||||
|
|
||||||
|
* The purely documentational ``providing_args`` argument for
|
||||||
|
:class:`~django.dispatch.Signal` is deprecated. If you rely on this
|
||||||
|
argument as documentation, you can move the text to a code comment or
|
||||||
|
docstring.
|
||||||
|
|
||||||
.. _removed-features-3.1:
|
.. _removed-features-3.1:
|
||||||
|
|
||||||
Features removed in 3.1
|
Features removed in 3.1
|
||||||
|
|
|
@ -216,24 +216,17 @@ its own signals.
|
||||||
Defining signals
|
Defining signals
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
.. class:: Signal(providing_args=list)
|
.. class:: Signal()
|
||||||
|
|
||||||
All signals are :class:`django.dispatch.Signal` instances. The
|
All signals are :class:`django.dispatch.Signal` instances.
|
||||||
``providing_args`` is a list of the names of arguments the signal will provide
|
|
||||||
to listeners. This is purely documentational, however, as there is nothing that
|
|
||||||
checks that the signal actually provides these arguments to its listeners.
|
|
||||||
|
|
||||||
For example::
|
For example::
|
||||||
|
|
||||||
import django.dispatch
|
import django.dispatch
|
||||||
|
|
||||||
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
|
pizza_done = django.dispatch.Signal()
|
||||||
|
|
||||||
This declares a ``pizza_done`` signal that will provide receivers with
|
This declares a ``pizza_done`` signal.
|
||||||
``toppings`` and ``size`` arguments.
|
|
||||||
|
|
||||||
Remember that you're allowed to change this list of arguments at any time, so
|
|
||||||
getting the API right on the first try isn't necessary.
|
|
||||||
|
|
||||||
Sending signals
|
Sending signals
|
||||||
---------------
|
---------------
|
||||||
|
|
|
@ -29,10 +29,10 @@ class Callable:
|
||||||
return val
|
return val
|
||||||
|
|
||||||
|
|
||||||
a_signal = Signal(providing_args=["val"])
|
a_signal = Signal()
|
||||||
b_signal = Signal(providing_args=["val"])
|
b_signal = Signal()
|
||||||
c_signal = Signal(providing_args=["val"])
|
c_signal = Signal()
|
||||||
d_signal = Signal(providing_args=["val"], use_caching=True)
|
d_signal = Signal(use_caching=True)
|
||||||
|
|
||||||
|
|
||||||
class DispatcherTests(SimpleTestCase):
|
class DispatcherTests(SimpleTestCase):
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
from django.dispatch import Signal
|
||||||
|
from django.test import SimpleTestCase
|
||||||
|
from django.utils.deprecation import RemovedInDjango40Warning
|
||||||
|
|
||||||
|
|
||||||
|
class SignalDeprecationTests(SimpleTestCase):
|
||||||
|
def test_providing_args_warning(self):
|
||||||
|
msg = (
|
||||||
|
'The providing_args argument is deprecated. As it is purely '
|
||||||
|
'documentational, it has no replacement. If you rely on this '
|
||||||
|
'argument as documentation, you can move the text to a code '
|
||||||
|
'comment or docstring.'
|
||||||
|
)
|
||||||
|
with self.assertWarnsMessage(RemovedInDjango40Warning, msg):
|
||||||
|
Signal(providing_args=['arg1', 'arg2'])
|
||||||
|
|
||||||
|
def test_without_providing_args_does_not_warn(self):
|
||||||
|
with warnings.catch_warnings(record=True) as recorded:
|
||||||
|
Signal()
|
||||||
|
self.assertEqual(len(recorded), 0)
|
Loading…
Reference in New Issue