utils.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. """Utils."""
  2. import sys
  3. import astroid
  4. from astroid.bases import Instance
  5. from astroid.exceptions import InferenceError
  6. from astroid.nodes import ClassDef
  7. from pylint_django.compat import Uninferable
  8. PY3 = sys.version_info >= (3, 0) # TODO: pylint_django doesn't support Py2 any more
  9. def node_is_subclass(cls, *subclass_names):
  10. """Checks if cls node has parent with subclass_name."""
  11. if not isinstance(cls, (ClassDef, Instance)):
  12. return False
  13. if cls.bases == Uninferable:
  14. return False
  15. for base_cls in cls.bases:
  16. try:
  17. for inf in base_cls.inferred():
  18. if inf.qname() in subclass_names:
  19. return True
  20. if inf != cls and node_is_subclass(inf, *subclass_names):
  21. # check up the hierarchy in case we are a subclass of
  22. # a subclass of a subclass ...
  23. return True
  24. except InferenceError:
  25. continue
  26. return False
  27. def is_migrations_module(node):
  28. if not isinstance(node, astroid.Module):
  29. return False
  30. return "migrations" in node.path[0] and not node.path[0].endswith("__init__.py")