registry.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from itertools import chain
  4. from django.utils.itercompat import is_iterable
  5. class Tags(object):
  6. """
  7. Built-in tags for internal checks.
  8. """
  9. admin = 'admin'
  10. compatibility = 'compatibility'
  11. models = 'models'
  12. signals = 'signals'
  13. class CheckRegistry(object):
  14. def __init__(self):
  15. self.registered_checks = []
  16. def register(self, *tags):
  17. """
  18. Decorator. Register given function `f` labeled with given `tags`. The
  19. function should receive **kwargs and return list of Errors and
  20. Warnings.
  21. Example::
  22. registry = CheckRegistry()
  23. @registry.register('mytag', 'anothertag')
  24. def my_check(apps, **kwargs):
  25. # ... perform checks and collect `errors` ...
  26. return errors
  27. """
  28. def inner(check):
  29. check.tags = tags
  30. if check not in self.registered_checks:
  31. self.registered_checks.append(check)
  32. return check
  33. return inner
  34. def run_checks(self, app_configs=None, tags=None):
  35. """ Run all registered checks and return list of Errors and Warnings.
  36. """
  37. errors = []
  38. if tags is not None:
  39. checks = [check for check in self.registered_checks
  40. if hasattr(check, 'tags') and set(check.tags) & set(tags)]
  41. else:
  42. checks = self.registered_checks
  43. for check in checks:
  44. new_errors = check(app_configs=app_configs)
  45. assert is_iterable(new_errors), (
  46. "The function %r did not return a list. All functions registered "
  47. "with the checks registry must return a list." % check)
  48. errors.extend(new_errors)
  49. return errors
  50. def tag_exists(self, tag):
  51. return tag in self.tags_available()
  52. def tags_available(self):
  53. return set(chain(*[check.tags for check in self.registered_checks if hasattr(check, 'tags')]))
  54. registry = CheckRegistry()
  55. register = registry.register
  56. run_checks = registry.run_checks
  57. tag_exists = registry.tag_exists