summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraverybigant <averybigant@gmail.com>2014-11-05 14:01:49 +0800
committerTim Graham <timograham@gmail.com>2014-11-11 16:29:32 +0100
commitb7a5b6ab8672daf907ba57e50edbed4cad596d4b (patch)
treeabd0bf721e3ea3df856aa8a358c96d69787177b4
parentb3fd39f7c8921b314f12dd53ee65740464d4a5f1 (diff)
Fixed #23750 -- Allowed core.checks.register to be used as a function
-rw-r--r--AUTHORS1
-rw-r--r--django/contrib/admin/apps.py2
-rw-r--r--django/contrib/auth/apps.py2
-rw-r--r--django/contrib/contenttypes/apps.py2
-rw-r--r--django/core/checks/registry.py17
-rw-r--r--docs/releases/1.8.txt5
-rw-r--r--docs/topics/checks.txt14
-rw-r--r--tests/check_framework/tests.py42
8 files changed, 71 insertions, 14 deletions
diff --git a/AUTHORS b/AUTHORS
index 6a527fa229..ab62be513c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -561,6 +561,7 @@ answer newbie questions, and generally made Django that much better:
Raúl Cumplido <raulcumplido@gmail.com>
Remco Wendt <remco.wendt@gmail.com>
Renaud Parent <renaud.parent@gmail.com>
+ Renbi Yu <averybigant@gmail.com>
Reza Mohammadi <reza@zeerak.ir>
rhettg@gmail.com
Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
diff --git a/django/contrib/admin/apps.py b/django/contrib/admin/apps.py
index 3b4f1a3028..b052746ff4 100644
--- a/django/contrib/admin/apps.py
+++ b/django/contrib/admin/apps.py
@@ -11,7 +11,7 @@ class SimpleAdminConfig(AppConfig):
verbose_name = _("Administration")
def ready(self):
- checks.register(checks.Tags.admin)(check_admin_app)
+ checks.register(check_admin_app, checks.Tags.admin)
class AdminConfig(SimpleAdminConfig):
diff --git a/django/contrib/auth/apps.py b/django/contrib/auth/apps.py
index 254a73d3db..3a0cb1aea1 100644
--- a/django/contrib/auth/apps.py
+++ b/django/contrib/auth/apps.py
@@ -10,4 +10,4 @@ class AuthConfig(AppConfig):
verbose_name = _("Authentication and Authorization")
def ready(self):
- checks.register(checks.Tags.models)(check_user_model)
+ checks.register(check_user_model, checks.Tags.models)
diff --git a/django/contrib/contenttypes/apps.py b/django/contrib/contenttypes/apps.py
index 0462e3163c..6fc8633762 100644
--- a/django/contrib/contenttypes/apps.py
+++ b/django/contrib/contenttypes/apps.py
@@ -9,4 +9,4 @@ class ContentTypesConfig(AppConfig):
verbose_name = _("Content Types")
def ready(self):
- checks.register(checks.Tags.models)(check_generic_foreign_keys)
+ checks.register(check_generic_foreign_keys, checks.Tags.models)
diff --git a/django/core/checks/registry.py b/django/core/checks/registry.py
index e8626f03c7..88cc519a50 100644
--- a/django/core/checks/registry.py
+++ b/django/core/checks/registry.py
@@ -23,11 +23,11 @@ class CheckRegistry(object):
self.registered_checks = []
self.deployment_checks = []
- def register(self, *tags, **kwargs):
+ def register(self, check=None, *tags, **kwargs):
"""
- Decorator. Register given function `f` labeled with given `tags`. The
- function should receive **kwargs and return list of Errors and
- Warnings.
+ Can be used as a function or a decorator. Register given function
+ `f` labeled with given `tags`. The function should receive **kwargs
+ and return list of Errors and Warnings.
Example::
@@ -36,6 +36,8 @@ class CheckRegistry(object):
def my_check(apps, **kwargs):
# ... perform checks and collect `errors` ...
return errors
+ # or
+ registry.register(my_check, 'mytag', 'anothertag')
"""
kwargs.setdefault('deploy', False)
@@ -49,7 +51,12 @@ class CheckRegistry(object):
self.registered_checks.append(check)
return check
- return inner
+ if callable(check):
+ return inner(check)
+ else:
+ if check:
+ tags += (check, )
+ return inner
def run_checks(self, app_configs=None, tags=None, include_deployment_checks=False):
""" Run all registered checks and return list of Errors and Warnings.
diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt
index dda798f0a2..d5281243be 100644
--- a/docs/releases/1.8.txt
+++ b/docs/releases/1.8.txt
@@ -364,6 +364,11 @@ Signals
the request, was added to the :data:`~django.core.signals.request_started`
signal.
+System Check Framework
+^^^^^^^^^^^^^^^^^^^^^^
+
+* :attr:`~django.core.checks.register` can now be used as a function.
+
Templates
^^^^^^^^^
diff --git a/docs/topics/checks.txt b/docs/topics/checks.txt
index 55181688b3..b40b06f137 100644
--- a/docs/topics/checks.txt
+++ b/docs/topics/checks.txt
@@ -151,6 +151,20 @@ settings file like this::
These checks will only be run if the :djadminopt:`--deploy` option is passed to
the :djadmin:`check` command.
+You can also use ``register`` as a function rather than a decorator by
+passing a callable object (usually a function) as the first argument
+to ``register``.
+
+The code below is equivalent to the code above::
+
+ def my_check(app_configs, **kwargs):
+ ...
+ register(my_check, Tags.security, deploy=True)
+
+.. versionchanged:: 1.8
+
+ The ability to use register as a function was added.
+
.. _field-checking:
Field, Model, and Manager checks
diff --git a/tests/check_framework/tests.py b/tests/check_framework/tests.py
index 4d29429313..43b579d383 100644
--- a/tests/check_framework/tests.py
+++ b/tests/check_framework/tests.py
@@ -31,17 +31,47 @@ class DummyObj(object):
class SystemCheckFrameworkTests(TestCase):
def test_register_and_run_checks(self):
- calls = [0]
-
- registry = CheckRegistry()
- @registry.register()
def f(**kwargs):
calls[0] += 1
return [1, 2, 3]
+
+ def f2(**kwargs):
+ return [4, ]
+
+ def f3(**kwargs):
+ return [5, ]
+
+ calls = [0]
+
+ # test register as decorator
+ registry = CheckRegistry()
+ registry.register()(f)
+ registry.register("tag1", "tag2")(f2)
+ registry.register("tag2", deploy=True)(f3)
+
+ # test register as function
+ registry2 = CheckRegistry()
+ registry2.register(f)
+ registry2.register(f2, "tag1", "tag2")
+ registry2.register(f3, "tag2", deploy=True)
+
+ # check results
errors = registry.run_checks()
- self.assertEqual(errors, [1, 2, 3])
- self.assertEqual(calls[0], 1)
+ errors2 = registry2.run_checks()
+ self.assertEqual(errors, errors2)
+ self.assertEqual(sorted(errors), [1, 2, 3, 4])
+ self.assertEqual(calls[0], 2)
+
+ errors = registry.run_checks(tags=["tag1"])
+ errors2 = registry2.run_checks(tags=["tag1"])
+ self.assertEqual(errors, errors2)
+ self.assertEqual(sorted(errors), [4])
+
+ errors = registry.run_checks(tags=["tag1", "tag2"], include_deployment_checks=True)
+ errors2 = registry2.run_checks(tags=["tag1", "tag2"], include_deployment_checks=True)
+ self.assertEqual(errors, errors2)
+ self.assertEqual(sorted(errors), [4, 5])
class MessageTests(TestCase):