I'm building a Pylint plugin to check for common Django bugs. I already watched all Pylint/Astroid talks I could find and read a good amount of astroid/brain code, as well as code from existing Pylint plugins like pylint-django. However, since Astroid docs are sparse, I would appreciate some feedback on this plugin code.
Code is here: https://github.com/vintasoftware/django-bug-finder/ Relevant parts are the checkers.py https://github.com/vintasoftware/django-bug-finder/blob/master/django_bug_finder/checkers.py and the transforms.py https://github.com/vintasoftware/django-bug-finder/blob/master/django_bug_finder/transforms.py. I've documented the non-trivial lines.
For now, the plugin is just a proof of concept, very early stage, no unit-tests yet. I ran it against some large projects from my company; it seems to be working. I've implemented only two checks: - Check for not assigned queryset expressions. This is a common Django bug, since most queryset operations return an updated queryset clone and don't change the original one. - Check for Celery task calls that pass a model instance or a queryset as an argument. This is generally problematic because the model might suffer a concurrent update before the task is executed.
For the checks to work properly, I had to fix the Astroid inference for Managers and QuerySets in transforms.py https://github.com/vintasoftware/django-bug-finder/blob/master/django_bug_finder/transforms.py. This part is especially tricky, so I would love some feedback on this. If you know better ways to do what I'm doing there, please let me know.