Pylint plugin for improving code analysis for when using Django

Overview

pylint-django

https://travis-ci.org/PyCQA/pylint-django.svg?branch=master https://landscape.io/github/landscapeio/pylint-django/master/landscape.png

About

pylint-django is a Pylint plugin for improving code analysis when analysing code using Django. It is also used by the Prospector tool.

Installation

To install:

pip install pylint-django

WARNING: pylint-django will not install Django by default because this causes more trouble than good, see discussion. If you wish to automatically install the latest version of Django then:

pip install pylint-django[with_django]

otherwise sort out your testing environment and please DO NOT report issues about missing Django!

Usage

Ensure pylint-django is installed and on your path. In order to access some of the internal Django features to improve pylint inspections, you should also provide a Django settings module appropriate to your project. This can be done either with an environment variable:

DJANGO_SETTINGS_MODULE=your.app.settings pylint --load-plugins pylint_django [..other options..] <path_to_your_sources>

Alternatively, this can be passed in as a commandline flag:

pylint --load-plugins pylint_django --django-settings-module=your.app.settings [..other options..] <path_to_your_sources>

If you do not configure Django, default settings will be used but this will not include, for example, which applications to include in INSTALLED_APPS and so the linting and type inference will be less accurate. It is recommended to specify a settings module.

Prospector

If you have prospector installed, then pylint-django will already be installed as a dependency, and will be activated automatically if Django is detected:

prospector [..other options..]

Features

  • Prevents warnings about Django-generated attributes such as Model.objects or Views.request.
  • Prevents warnings when using ForeignKey attributes ("Instance of ForeignKey has no <x> member").
  • Fixes pylint's knowledge of the types of Model and Form field attributes
  • Validates Model.__unicode__ methods.
  • Meta informational classes on forms and models do not generate errors.
  • Flags dangerous use of the exclude attribute in ModelForm.Meta.
  • Uses Django's internal machinery to try and resolve models referenced as strings in ForeignKey fields. That relies on django.setup() which needs the appropriate project settings defined!

Additional plugins

pylint_django.checkers.migrations looks for migrations which:

  • add new model fields and these fields have a default value. According to Django docs this may have performance penalties especially on large tables. The prefered way is to add a new DB column with null=True because it will be created instantly and then possibly populate the table with the desired default values. Only the last migration from a sub-directory will be examined;
  • are migrations.RunPython() without a reverse callable - these will result in non reversible data migrations;

This plugin is disabled by default! To enable it:

pylint --load-plugins pylint_django --load-plugins pylint_django.checkers.migrations

Contributing

Please feel free to add your name to the CONTRIBUTORS.rst file if you want to be credited when pull requests get merged. You can also add to the CHANGELOG.rst file if you wish, although we'll also do that when merging.

Tests

The structure of the test package follows that from pylint itself.

It is fairly simple: create a module starting with func_ followed by a test name, and insert into it some code. The tests will run pylint against these modules. If the idea is that no messages now occur, then that is fine, just check to see if it works by running scripts/test.sh.

Any command line argument passed to scripts/test.sh will be passed to the internal invocation of pytest. For example if you want to debug the tests you can execute scripts/test.sh --capture=no. A specific test case can be run by filtering based on the file name of the test case ./scripts/test.sh -k 'func_noerror_views'.

Ideally, add some pylint error suppression messages to the file to prevent spurious warnings, since these are all tiny little modules not designed to do anything so there's no need to be perfect.

It is possible to make tests with expected error output, for example, if adding a new message or simply accepting that pylint is supposed to warn. A test_file_name.txt file contains a list of expected error messages in the format error-type:line number:class name or empty:1st line of detailed error text:confidence or empty.

License

pylint-django is available under the GPLv2 license.

Comments
  • Python 3.7 pylint 2.0.0.dev2 AttributeError: module 'astroid.nodes' has no attribute 'CallFunc'

    Python 3.7 pylint 2.0.0.dev2 AttributeError: module 'astroid.nodes' has no attribute 'CallFunc'

    I'm trying to use pylint for Python 3.7, which isn't supported until pylint 2.0.0, so it is still in dev. However, I thought I would bring this here as pylint 2.0.0 fails when loading pylint_django, simply when checking the version (no file to be linted).

    2062$ pylint --version
    pylint 2.0.0.dev2
    astroid 2.0.0.dev4
    Python 3.7.0 (default, Jun 28 2018, 02:32:19) 
    [GCC 5.4.0 20160609]
    

    Fails when loading the plugin pylint_django:

    2061$ pylint --version --load-plugins pylint_django
    Traceback (most recent call last):
      File "/home/ferd/.virtualenvs/python37/bin/pylint", line 11, in <module>
        sys.exit(run_pylint())
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint/__init__.py", line 18, in run_pylint
        Run(sys.argv[1:])
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint/lint.py", line 1293, in __init__
        linter.load_plugin_modules(self._plugins)
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint/lint.py", line 502, in load_plugin_modules
        module = modutils.load_module_from_name(modname)
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/astroid/modutils.py", line 187, in load_module_from_name
        return load_module_from_modpath(dotted_name.split('.'), path, use_sys)
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/astroid/modutils.py", line 230, in load_module_from_modpath
        module = imp.load_module(curname, mp_file, mp_filename, mp_desc)
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/imp.py", line 245, in load_module
        return load_package(name, filename)
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/imp.py", line 217, in load_package
        return _load(spec)
      File "<frozen importlib._bootstrap>", line 696, in _load
      File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 728, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint_django/__init__.py", line 7, in <module>
        from pylint_django import plugin
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint_django/plugin.py", line 9, in <module>
        from pylint_django import transforms  # noqa, pylint: disable=unused-import
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint_django/transforms/__init__.py", line 12, in <module>
        foreignkey.add_transform(MANAGER)
      File "/home/ferd/.virtualenvs/python37/lib/python3.7/site-packages/pylint_django/transforms/foreignkey.py", line 59, in add_transform
        manager.register_transform(nodes.CallFunc, inference_tip(infer_key_classes),
    AttributeError: module 'astroid.nodes' has no attribute 'CallFunc'
    

    Freeze:

    astroid==2.0.0.dev4
    isort==4.3.4
    lazy-object-proxy==1.3.1
    mccabe==0.6.1
    Pillow==5.2.0
    pylint==2.0.0.dev2
    pylint-django==0.11.1
    pylint-plugin-utils==0.3
    six==1.11.0
    wrapt==1.10.11
    
    opened by fsnidely 26
  • UnboundLocalError: local variable 'key_cls' referenced before assignment

    UnboundLocalError: local variable 'key_cls' referenced before assignment

    I found this failure in my CI logs, but could not reproduce it locally. The corresponding code looks wrong but I don't know exactly how to correct it. If I can be of any help fixing it let me know.

    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/site-packages/astroid/__init__.py", line 91, in _inference_tip_cached
        return iter(_cache[func, node])
    KeyError: (<function infer_key_classes at 0x7fe149cfe048>, <Call l.306 at 0x7fe142e66320>)
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/bin/pylint", line 11, in <module>
        sys.exit(run_pylint())
      File "/usr/local/lib/python3.6/site-packages/pylint/__init__.py", line 20, in run_pylint
        Run(sys.argv[1:])
      File "/usr/local/lib/python3.6/site-packages/pylint/lint.py", line 1628, in __init__
        linter.check(args)
      File "/usr/local/lib/python3.6/site-packages/pylint/lint.py", line 943, in check
        self._do_check(files_or_modules)
      File "/usr/local/lib/python3.6/site-packages/pylint/lint.py", line 1075, in _do_check
        self.check_astroid_module(ast_node, walker, rawcheckers, tokencheckers)
      File "/usr/local/lib/python3.6/site-packages/pylint/lint.py", line 1158, in check_astroid_module
        walker.walk(ast_node)
      File "/usr/local/lib/python3.6/site-packages/pylint/utils.py", line 1303, in walk
        self.walk(child)
      File "/usr/local/lib/python3.6/site-packages/pylint/utils.py", line 1300, in walk
        cb(astroid)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 57, in augment_func
        augmentation(chain, node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 148, in do_suppress
        chain()
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 56, in chain
        old_method(node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 57, in augment_func
        augmentation(chain, node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 148, in do_suppress
        chain()
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 56, in chain
        old_method(node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 57, in augment_func
        augmentation(chain, node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 148, in do_suppress
        chain()
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 56, in chain
        old_method(node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 57, in augment_func
        augmentation(chain, node)
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 148, in do_suppress
        chain()
      File "/usr/local/lib/python3.6/site-packages/pylint_plugin_utils/__init__.py", line 56, in chain
        old_method(node)
      File "/usr/local/lib/python3.6/site-packages/pylint/checkers/classes.py", line 729, in visit_classdef
        self._check_bases_classes(node)
      File "/usr/local/lib/python3.6/site-packages/pylint/checkers/classes.py", line 1444, in _check_bases_classes
        unimplemented_abstract_methods(node, is_abstract).items(),
      File "/usr/local/lib/python3.6/site-packages/pylint/checkers/utils.py", line 782, in unimplemented_abstract_methods
        infered = safe_infer(obj)
      File "/usr/local/lib/python3.6/site-packages/pylint/checkers/utils.py", line 1066, in safe_infer
        value = next(inferit)
      File "/usr/local/lib/python3.6/site-packages/astroid/decorators.py", line 131, in raise_if_nothing_inferred
        yield next(generator)
      File "/usr/local/lib/python3.6/site-packages/astroid/decorators.py", line 95, in wrapped
        res = next(generator)
      File "/usr/local/lib/python3.6/site-packages/astroid/bases.py", line 137, in _infer_stmts
        for inferred in stmt.infer(context=context):
      File "/usr/local/lib/python3.6/site-packages/astroid/node_classes.py", line 348, in infer
        return self._explicit_inference(self, context, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/astroid/__init__.py", line 93, in _inference_tip_cached
        result = func(*args, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/pylint_django/transforms/foreignkey.py", line 91, in infer_key_classes
        return iter([key_cls.instantiate_class()])
    UnboundLocalError: local variable 'key_cls' referenced before assignment
    

    Version: pylint-django==2.0.8

    opened by federicobond 19
  • AttributeError: 'AssignAttr' object has no attribute 'qname'

    AttributeError: 'AssignAttr' object has no attribute 'qname'

    I frequently, but not always, see AttributeError: 'AssignAttr' object has no attribute 'qname' when running pylint on my sourcecode.

    Unfortunately I was unable to find any clues as to why this is happening. I have tried pylint 1.7.4 and pylint 1.6.5. I am using astroid 1.5.3.

    Please advise how I can investigate this further.

    See the attached backtrace: error (3).txt

    need info 
    opened by alex-hutton 18
  • Add support for new load_configuration hook of pylint

    Add support for new load_configuration hook of pylint

    This PR adds new pylint hook load_configuration(). This hook serves for adjusting configuration of linter: http://pylint.pycqa.org/en/latest/how_tos/plugins.html

    Closes #181

    opened by matusvalo 17
  • Repo is dead - I've made a fork

    Repo is dead - I've made a fork

    Upgrading to pylint 1.8.1 has made this repo no longer work.

    Various people have made PRs that fix this repo, however, it appears this repo is inactive.

    Therefore, I've made a fork:

    https://pypi.python.org/pypi/pylint-django-forked https://github.com/JuggleJobs/pylint-django-forked/

    PRs are welcome. I'm also looking for an additional maintainer to help prevent this useful repo from falling into disrepair should I not be around to maintain it for whatever reason.

    opened by colinhowe 17
  • Plugin appears to broken by astroid 2.9.1

    Plugin appears to broken by astroid 2.9.1

    With astroid 2.9.1, pylint-django appears not to work correctly.

    For example, it produces errors like Class 'MyModel' has no 'objects' member (no-member), even when it should be able to infer that the objects member exists.

    Full repro steps, including Pipenv.lock file with precise package versions, is available in the following repo:

    https://github.com/amdw/pylint-django-repro

    opened by amdw 16
  • AttributeError: Can't pickle local object 'augment_visit.<locals>.augment_func'

    AttributeError: Can't pickle local object 'augment_visit..augment_func'

    Dear Colleagues,

    enabling this plugin on the DjangoChannelsGraphqlWs gives me the traceback below. It is worth mentioning that it has worked fine some months ago. Unfortunately I could not track what particular change made this happen, probably Python version upgrade or PyLInt version upgrade, I am not sure. Anyway, currently I cannot make it running and had to disable pylint-django otherwise PyLint fails.

    Traceback (most recent call last):
      File "/Volumes/Dev/DjangoChannelsGraphqlWs/.venv/bin/pylint", line 8, in <module>
        sys.exit(run_pylint())
      File "/Volumes/Dev/DjangoChannelsGraphqlWs/.venv/lib/python3.8/site-packages/pylint/__init__.py", line 22, in run_pylint
        PylintRun(sys.argv[1:])
      File "/Volumes/Dev/DjangoChannelsGraphqlWs/.venv/lib/python3.8/site-packages/pylint/lint/run.py", line 344, in __init__
        linter.check(args)
      File "/Volumes/Dev/DjangoChannelsGraphqlWs/.venv/lib/python3.8/site-packages/pylint/lint/pylinter.py", line 874, in check
        check_parallel(
      File "/Volumes/Dev/DjangoChannelsGraphqlWs/.venv/lib/python3.8/site-packages/pylint/lint/check_parallel.py", line 92, in check_parallel
        with multiprocessing.Pool(jobs, initializer=initializer, initargs=[linter]) as pool:
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/context.py", line 119, in Pool
        return Pool(processes, initializer, initargs, maxtasksperchild,
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/pool.py", line 212, in __init__
        self._repopulate_pool()
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/pool.py", line 303, in _repopulate_pool
        return self._repopulate_pool_static(self._ctx, self.Process,
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/pool.py", line 326, in _repopulate_pool_static
        w.start()
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/process.py", line 121, in start
        self._popen = self._Popen(self)
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/context.py", line 284, in _Popen
        return Popen(process_obj)
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 32, in __init__
        super().__init__(process_obj)
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
        self._launch(process_obj)
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 47, in _launch
        reduction.dump(process_obj, fp)
      File "/Users/prokher/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/reduction.py", line 60, in dump
        ForkingPickler(file, protocol).dump(obj)
    AttributeError: Can't pickle local object 'augment_visit.<locals>.augment_func'
    

    Here is pip freeze output:

    pip freeze 
    WARNING: Could not find setup.py for directory /Volumes/Dev/DjangoChannelsGraphqlWs (tried all parent directories)
    aiohttp==3.6.2
    aioredis==1.3.1
    aniso8601==7.0.0
    apipkg==1.5
    appdirs==1.4.4
    appnope==0.1.0
    asgiref==3.2.10
    astroid==2.4.2
    async-timeout==3.0.1
    attrs==19.3.0
    autobahn==20.7.1
    Automat==20.2.0
    backcall==0.2.0
    black==19.10b0
    cffi==1.14.0
    cfgv==3.0.0
    channels==2.4.0
    channels-redis==3.0.1
    chardet==3.0.4
    click==7.1.2
    constantly==15.1.0
    coverage==5.2.1
    cryptography==3.0
    daphne==2.5.0
    decorator==4.4.2
    distlib==0.3.1
    Django==3.0.8
    -e git+https://gitlab.sd.datadvance.net/sd/pseven/DjangoChannelsGraphqlWs.git@ce8d5936a4dda3489c3d8951380f24745264106a#egg=django_channels_graphql_ws
    execnet==1.7.1
    filelock==3.0.12
    graphene==2.1.8
    graphene-django==2.12.1
    graphql-core==2.3.2
    graphql-relay==2.0.1
    hiredis==1.1.0
    hyperlink==19.0.0
    identify==1.4.25
    idna==2.10
    incremental==17.5.0
    ipython==7.16.1
    ipython-genutils==0.2.0
    isort==4.3.21
    jedi==0.17.2
    lazy-object-proxy==1.4.3
    mccabe==0.6.1
    more-itertools==8.4.0
    msgpack==1.0.0
    multidict==4.7.6
    mypy==0.782
    mypy-extensions==0.4.3
    nodeenv==1.4.0
    packaging==20.4
    parso==0.7.1
    pathspec==0.8.0
    pexpect==4.8.0
    pickleshare==0.7.5
    pluggy==0.13.1
    plumbum==1.6.9
    pre-commit==2.1.1
    promise==2.3
    prompt-toolkit==3.0.3
    ptyprocess==0.6.0
    py==1.9.0
    pyasn1==0.4.8
    pyasn1-modules==0.2.8
    pycparser==2.20
    pydocstyle==5.0.2
    Pygments==2.6.1
    PyHamcrest==2.0.2
    pylint==2.5.3
    pylint-django==2.2.0
    pylint-plugin-utils==0.6
    pylint-quotes==0.2.1
    pyOpenSSL==19.1.0
    pyparsing==2.4.7
    pytest==5.4.3
    pytest-asyncio==0.14.0
    pytest-cov==2.10.0
    pytest-django==3.9.0
    pytest-forked==1.2.0
    pytest-pythonpath==0.7.3
    pytest-xdist==1.33.0
    pytz==2020.1
    PyYAML==5.3.1
    regex==2020.7.14
    Rx==1.6.1
    service-identity==18.1.0
    singledispatch==3.4.0.3
    six==1.15.0
    snowballstemmer==2.0.0
    sqlparse==0.3.1
    toml==0.10.1
    tox==3.18.0
    traitlets==4.3.3
    Twisted==20.3.0
    txaio==20.4.1
    typed-ast==1.4.1
    typing-extensions==3.7.4.2
    Unidecode==1.1.1
    virtualenv==20.0.28
    wcwidth==0.2.5
    wrapt==1.12.1
    yarl==1.4.2
    zope.interface==5.1.0
    
    opened by prokher 16
  • Do not rely on the version number to know if the tests are present and fixing test matrix

    Do not rely on the version number to know if the tests are present and fixing test matrix

    Hi guys,

    Sometimes the distro re-add the files that were removed from the pip packages and in this case it will probably be the case in a few days, so maybe it would be better to check if the test directory exists instead of relying on the version. What do you think?

    Thanks for your help, Joseph

    opened by aerostitch 16
  • Upgrading from pylint `2.14.5` to `2.15.0` causes `django.core.exceptions.ImproperlyConfigured` to be raised

    Upgrading from pylint `2.14.5` to `2.15.0` causes `django.core.exceptions.ImproperlyConfigured` to be raised

    After upgrading pylint from 2.14.5 to 2.15.0, running pylint **/*.py now raises django.core.exceptions.ImproperlyConfigured. If I downgrade to pylint 2.14.5, the issue disappears.

    With pylint 2.15.0:

    $ pylint --version
    pylint 2.15.0
    astroid 2.12.5
    Python 3.10.6 (main, Aug  3 2022, 10:13:24) [GCC 10.2.1 20210110]
    
    $ pylint **/*.py
    Traceback (most recent call last):
      File "/usr/local/lib/python3.10/site-packages/pylint_django/checkers/foreign_key_strings.py", line 92, in open
        django.setup()
      File "/usr/local/lib/python3.10/site-packages/django/__init__.py", line 19, in setup
        configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
      File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 92, in __getattr__
        self._setup(name)
      File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 72, in _setup
        raise ImproperlyConfigured(
    django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/lib/python3.10/site-packages/pylint_django/checkers/foreign_key_strings.py", line 120, in open
        settings.configure(Settings(self.config.django_settings_module))
      File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 190, in __init__
        mod = importlib.import_module(self.SETTINGS_MODULE)
      File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
      File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
      File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
    ModuleNotFoundError: No module named 'config'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/bin/pylint", line 8, in <module>
        sys.exit(run_pylint())
      File "/usr/local/lib/python3.10/site-packages/pylint/__init__.py", line 35, in run_pylint
        PylintRun(argv or sys.argv[1:])
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/run.py", line 207, in __init__
        linter.check(args)
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/pylinter.py", line 672, in check
        with self._astroid_module_checker() as check_astroid_module:
      File "/usr/local/lib/python3.10/contextlib.py", line 135, in __enter__
        return next(self.gen)
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/pylinter.py", line 962, in _astroid_module_checker
        checker.open()
      File "/usr/local/lib/python3.10/site-packages/pylint_django/checkers/foreign_key_strings.py", line 125, in open
        self.add_message(
      File "/usr/local/lib/python3.10/site-packages/pylint/checkers/base_checker.py", line 164, in add_message
        self.linter.add_message(
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/pylinter.py", line 1284, in add_message
        self._add_one_message(
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/pylinter.py", line 1217, in _add_one_message
        self.stats.increase_single_module_message_count(
      File "/usr/local/lib/python3.10/site-packages/pylint/utils/linterstats.py", line 309, in increase_single_module_message_count
        self.by_module[modname][type_name] += increase
    KeyError: 'Command line or configuration file'
    

    With pylint 2.14.5:

    $ pylint --version
    pylint 2.14.5
    astroid 2.11.7
    Python 3.10.6 (main, Aug  3 2022, 10:13:24) [GCC 10.2.1 20210110]
    
    $ pylint **/*.py
    
    --------------------------------------------------------------------
    Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)
    

    The Django settings module is provided through pyproject.toml (see below). If I provide the Django settings module through environmental variables, a somewhat different exception is raised with pylint 2.15.0:

    $ pylint --version
    pylint 2.15.0
    astroid 2.12.5
    Python 3.10.6 (main, Aug  3 2022, 10:13:24) [GCC 10.2.1 20210110]
    
    $ export DJANGO_SETTINGS_MODULE="config.settings"
    
    $ pylint **/*.py
    Traceback (most recent call last):
      File "/usr/local/bin/pylint", line 8, in <module>
        sys.exit(run_pylint())
      File "/usr/local/lib/python3.10/site-packages/pylint/__init__.py", line 35, in run_pylint
        PylintRun(argv or sys.argv[1:])
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/run.py", line 207, in __init__
        linter.check(args)
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/pylinter.py", line 672, in check
        with self._astroid_module_checker() as check_astroid_module:
      File "/usr/local/lib/python3.10/contextlib.py", line 135, in __enter__
        return next(self.gen)
      File "/usr/local/lib/python3.10/site-packages/pylint/lint/pylinter.py", line 962, in _astroid_module_checker
        checker.open()
      File "/usr/local/lib/python3.10/site-packages/pylint_django/checkers/foreign_key_strings.py", line 92, in open
        django.setup()
      File "/usr/local/lib/python3.10/site-packages/django/__init__.py", line 19, in setup
        configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
      File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 92, in __getattr__
        self._setup(name)
      File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 79, in _setup
        self._wrapped = Settings(settings_module)
      File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 190, in __init__
        mod = importlib.import_module(self.SETTINGS_MODULE)
      File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
      File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
      File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
    ModuleNotFoundError: No module named 'config'
    

    This exception disappears with pylint 2.14.5:

    $ pylint --version
    pylint 2.14.5
    astroid 2.11.7
    Python 3.10.6 (main, Aug  3 2022, 10:13:24) [GCC 10.2.1 20210110]
    
    $ export DJANGO_SETTINGS_MODULE="config.settings"
    
    $ pylint **/*.py
    
    --------------------------------------------------------------------
    Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)
    

    Output from pip freeze:

    asgiref==3.5.2
    astroid==2.11.7
    attrs==22.1.0
    Babel==2.10.3
    black==22.6.0
    certifi==2022.6.15
    charset-normalizer==2.1.1
    click==8.1.3
    commonmark==0.9.1
    coverage==6.4.4
    defusedxml==0.7.1
    dill==0.3.5.1
    distlib==0.3.6
    dj-database-url==1.0.0
    dj-email-url==1.0.5
    Django==4.1
    django-cache-url==3.4.2
    django-extensions==3.2.0
    django-fake-model==0.1.4
    django-money==2.1.1
    django-stubs-ext==0.5.0
    django-types==0.16.0
    djangorestframework==3.13.1
    djangorestframework-types==0.8.0
    environs==9.5.0
    execnet==1.9.0
    filelock==3.8.0
    get-docker-secret==1.0.2
    httpie==3.2.1
    idna==3.3
    importlib-resources==5.9.0
    inclusive-django-range-fields==0.2.3
    iniconfig==1.1.1
    isort==5.10.1
    lazy-object-proxy==1.7.1
    lorem-text==2.1
    marshmallow==3.17.1
    mccabe==0.7.0
    multidict==6.0.2
    mypy-extensions==0.4.3
    packaging==21.3
    pathspec==0.10.0
    pipenv==2022.8.24
    platformdirs==2.5.2
    pluggy==1.0.0
    psycopg2==2.9.3
    py==1.11.0
    py-moneyed==1.2
    Pygments==2.13.0
    pylint-django==2.5.3
    pylint-plugin-utils==0.7
    pyparsing==3.0.9
    PySocks==1.7.1
    pytest==7.1.2
    pytest-cov==3.0.0
    pytest-django==4.5.2
    pytest-forked==1.4.0
    pytest-xdist==2.5.0
    python-dotenv==0.20.0
    pytz==2022.2.1
    PyYAML==6.0
    requests==2.28.1
    requests-toolbelt==0.9.1
    rich==12.5.1
    sqlparse==0.4.2
    StrEnum==0.4.8
    tomli==2.0.1
    tomlkit==0.11.4
    types-psycopg2==2.9.21
    typing_extensions==4.3.0
    uritemplate==4.1.1
    urllib3==1.26.12
    virtualenv==20.16.4
    virtualenv-clone==0.5.7
    wrapt==1.14.1
    yachalk==0.1.5
    
    + pylint==2.14.5 or 2.15.0
    + two editable local python packages
    

    pylint config in pyproject.toml:

    [tool.pylint.master]
    ignore-patterns = ["manage.py", "migrations/"]
    load-plugins = [
        "pylint.extensions.docparams",
        "pylint_django",
        "pylint_django.checkers.migrations",
        "local_pylint_plugin",
    ]
    
    [tool.pylint.miscellaneous]
    notes = ["BUG"]
    
    [tool.pylint.parameter_documentation]
    accept-no-raise-doc = "no"
    
    [tool.pylint.similarities]
    min-similarity-lines = 10
    
    [tool.pylint.basic]
    no-docstring-rgx = "([a-zA-Z]+Inline)|([a-zA-Z]+Admin)|([a-zA-Z]+Config)|([a-zA-Z]+Config)"
    class-const-rgx = "([A-Z]{1}[a-zA-Z_]+)"
    
    [tool.pylint."DJANGO FOREIGN KEYS REFERENCED BY STRINGS"]
    django-settings-module = "config.settings"
    
    [tool.pylint."MESSAGES CONTROL"]
    disable = [
        "too-few-public-methods",
        "wrong-import-order",
        "unsubscriptable-object",
    ]
    
    Upstream Bug 🪲 
    opened by simensol 15
  • AttributeError: 'NoneType' object has no attribute 'pattern'

    AttributeError: 'NoneType' object has no attribute 'pattern'

    Travis CI is falling for me in another project because of

    $ python -m pylint lowfat
    Using config file /home/travis/build/softwaresaved/lowfat/pylintrc
    Traceback (most recent call last):
      File "/opt/python/3.5.4/lib/python3.5/runpy.py", line 193, in _run_module_as_main
        "__main__", mod_spec)
      File "/opt/python/3.5.4/lib/python3.5/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/travis/virtualenv/python3.5.4/lib/python3.5/site-packages/pylint/__main__.py", line 7, in <module>
        pylint.run_pylint()
      File "/home/travis/virtualenv/python3.5.4/lib/python3.5/site-packages/pylint/__init__.py", line 16, in run_pylint
        Run(sys.argv[1:])
      File "/home/travis/virtualenv/python3.5.4/lib/python3.5/site-packages/pylint/lint.py", line 1312, in __init__
        linter.load_plugin_modules(plugins)
      File "/home/travis/virtualenv/python3.5.4/lib/python3.5/site-packages/pylint/lint.py", line 495, in load_plugin_modules
        module.register(self)
      File "/home/travis/virtualenv/python3.5.4/lib/python3.5/site-packages/pylint_django/plugin.py", line 22, in register
        start = name_checker.config.const_rgx.pattern[:-2]
    AttributeError: 'NoneType' object has no attribute 'pattern'
    

    Any suggestions of what can be causing it?

    opened by rgaiacs 15
  • List Django as a dependency. Fix #96

    List Django as a dependency. Fix #96

    also add a big warning statement about possible side effects and to deter people from reporting issues about Django version mismatches. Updates README formatting a bit as well.

    @jakirkham this should fix #96.

    @carlio I've read your reasoning about not listing this as a dependency and the side effects it may have. Let's see if the warning text I've added has any effect. If we start seeing consistent reports about Django version mismatches I'm all for dropping the Django dependency from setup.py and adjusting the warning so that folks are aware they have to install Django explicitly.

    opened by atodorov 13
  • pylint-django to check models raise error if it have foreignkey like this

    pylint-django to check models raise error if it have foreignkey like this

    error:

    Traceback (most recent call last):
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/inference_tip.py", line 38, in _inference_tip_cached
        result = _cache[func, node]
    KeyError: (<function infer_key_classes at 0x7fd7a30493a0>, <Call l.18 at 0x7fd7a20c89a0>)
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/pylint/checkers/utils.py", line 1344, in safe_infer
        value = next(infer_gen)
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/nodes/node_ng.py", line [16](https://github.com/liangqingzhao/my_local_test/actions/runs/3628194094/jobs/6118923554#step:7:17)9, in infer
        yield from self._infer(context=context, **kwargs)
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/decorators.py", line 140, in raise_if_nothing_inferred
        yield next(generator)
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/decorators.py", line 109, in wrapped
        for res in _func(node, context, **kwargs):
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/bases.py", line 165, in _infer_stmts
        for inf in stmt.infer(context=context):  # type: ignore[union-attr]
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/nodes/node_ng.py", line 159, in infer
        results = list(self._explicit_inference(self, context, **kwargs))
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/inference_tip.py", line 45, in _inference_tip_cached
        result = _cache[func, node] = list(func(*args, **kwargs))
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/pylint_django/transforms/foreignkey.py", line 1[20](https://github.com/liangqingzhao/my_local_test/actions/runs/3628194094/jobs/6118923554#step:7:21), in infer_key_classes
        MANAGER.ast_from_module_name(module_name)
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/manager.py", line [21](https://github.com/liangqingzhao/my_local_test/actions/runs/3628194094/jobs/6118923554#step:7:22)6, in ast_from_module_name
        raise e
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/manager.py", line 161, in ast_from_module_name
        found_spec = self.file_from_module_name(modname, context_file)
      File "/opt/hostedtoolcache/Python/3.8.14/x64/lib/python3.8/site-packages/astroid/manager.py", line [26](https://github.com/liangqingzhao/my_local_test/actions/runs/3628194094/jobs/6118923554#step:7:27)7, in file_from_module_name
        raise value.with_traceback(None)  # pylint: disable=no-member
    astroid.exceptions.AstroidImportError: Failed to import module main.models with error:
    No module named main.models.
    

    this is my model

    class EngravingPromotionOrder(models.Model):
        engraving_promotion_number = models.ForeignKey('main.EngravingPromotion', blank=True, null=True, related_name='engraving_promotion', on_delete=models.CASCADE)
        order_number = models.OneToOneField('order.Order', blank=True, null=True, on_delete=models.CASCADE)
    

    if i change it to this way,the error will dissappear

    from xxx.apps.main.models import EngravingPromotion
    class EngravingPromotionOrder(models.Model):
        engraving_promotion_number = models.ForeignKey(EngravingPromotion, blank=True, null=True, related_name='engraving_promotion', on_delete=models.CASCADE)
        order_number = models.OneToOneField('order.Order', blank=True, null=True, on_delete=models.CASCADE)
    

    do we must to use the second way,if not it will raise error i find a similar issue #2995 also use this way to slove the error

    opened by liangqingzhao 0
  • Error when chaining more than two Q objects

    Error when chaining more than two Q objects

    When chaining more than two Q Objects I get an E1131: unsupported operand type(s) for | (unsupported-binary-operation)`. I created a code example:

    from django.db.models import Q
    
    from django.contrib.auth.models import Permission
    
    
    def pylint_alright():
        Permission.objects.filter(Q(pk=1) | Q(pk=2))
    
    
    def pylint_error():
        # ************* Module app.scratch
        # scratch.py:13:30: E1131: unsupported operand type(s) for | (unsupported-binary-operation)
        Permission.objects.filter(Q(pk=1) | Q(pk=2) | Q(pk=3))
    
    

    freeze:

    amqp==2.6.1 
    arabic-reshaper==2.1.4 
    arrow==1.2.3 
    asgiref==3.5.2 
    asn1crypto==1.5.1 
    babel==2.11.0 
    billiard==3.6.4.0 
    bleach==3.3.1 
    celery==4.4.0 
    certifi==2022.9.24 
    cffi==1.15.1 
    charset-normalizer==2.1.1 
    click==8.1.3 
    colorama==0.4.6 
    cryptography==38.0.4 
    cssselect2==0.7.0 
    defusedxml==0.7.1 
    deprecated==1.2.13 
    django-appconf==1.0.5 
    django-axes==5.39.0 
    django-celery-email==3.0.0 
    django-classy-tags==4.0.0 
    django-cms==3.11.0 
    django-countries==7.2.1 
    django-elasticsearch-dsl==7.2.2 
    django-environ==0.7.0 
    django-filer==2.2.3 
    django-filter==2.4.0 
    django-formtools==2.4 
    django-hamlpy==1.4.4 
    django-ipware==4.0.2 
    django-js-asset==2.0.0 
    django-localflavor==3.1 
    django-modeltranslation==0.17.7 
    django-mptt==0.14.0 
    django-multiselectfield==0.1.11 
    django-npm==1.0.0 
    django-oauth-toolkit==1.7.1 
    django-phonenumber-field[phonenumbers]==4.0.0 
    django-polymorphic==3.1.0 
    django-recaptcha==3.0.0 
    django-sekizai==2.0.0 
    django-tinymce4-lite==1.8.0 
    django-treebeard==4.5.1 
    django==3.2.16 
    djangocms-admin-style==3.2.0 
    djangocms-attributes-field==2.0.0 
    djangocms-file==3.0.0 
    djangocms-link==3.0.0 
    djangocms-picture==4.0.0 
    djangocms-text-ckeditor==5.0.1 
    djangorestframework-xml==2.0.0 
    djangorestframework==3.13.1 
    djangosaml2==1.5.4 
    djangosaml2idp==0.7.2 
    docutils==0.16 
    easy-thumbnails==2.8.3 
    easy-thumbnails[svg]==2.8.3 
    elasticsearch-dsl==7.4.0 
    elasticsearch==7.17.7 
    elementpath==3.0.2 
    factory-boy==3.2.1 
    faker==15.3.4 
    future==0.18.2 
    greenlet==2.0.1 
    gunicorn==20.1.0 
    hashids==1.3.1 
    html5lib==1.1 
    idna==3.4 
    jsmin==3.0.1 
    jsonpickle==1.5.2 
    jwcrypto==1.4.2 
    kombu==4.6.11 
    lxml==4.9.1 
    oauthlib==3.2.2 
    oscrypto==1.3.0 
    packaging==21.3 
    phonenumbers==8.13.1 
    pillow==9.3.0 
    psycopg2==2.9.5 
    pycparser==2.21 
    pyhanko-certvalidator==0.19.6 
    pyhanko==0.15.1 
    pyopenssl==21.0.0 
    pyparsing==3.0.9 
    pypdf3==1.0.6 
    pysaml2==7.2.1 
    python-bidi==0.4.2 
    python-dateutil==2.8.2 
    python-memcached==1.59 
    python-stdnum==1.18 
    pytz-deprecation-shim==0.1.0.post0 
    pytz==2022.6 
    pyyaml==6.0 
    qrcode==7.3.1 
    regex==2022.10.31 
    reportlab==3.5.63 
    requests==2.28.1 
    sentry-sdk==1.11.1 
    setuptools==65.6.3 
    six==1.16.0 
    sqlalchemy==1.4.44 
    sqlparse==0.3.1 
    svglib==1.4.1 
    tinycss2==1.2.1 
    tqdm==4.64.1 
    tzdata==2022.7 
    tzlocal==4.2 
    unidecode==1.1.2 
    uritools==4.0.0 
    urllib3==1.26.13 
    vine==1.3.0 
    webencodings==0.5.1 
    wheel==0.38.4 
    whitenoise==5.0.1 
    wrapt==1.14.1 
    xhtml2pdf==0.2.8 
    xmlschema==2.1.1 
    
    opened by rvanlaar 0
  • Issue using commandline flag with pylint

    Issue using commandline flag with pylint

    I get a crash now when using the commandline flags.

    Fix https://github.com/PyCQA/pylint-django/issues/385

    The issue is that creating the Settings objects already configures the settings.

    See the symptom:

    $ pylint --load-plugins=pylint_django --enable=W0611 --disable=bad-continuation,invalid-name,no-self-argument,E0211,C0116,C0115,C0114 --max-line-length=110 --django-settings-module=heypluto.settings.local **/*.py
    ************* Module Command line
    Command line:1:0: R0022: Useless option value for '--disable', 'bad-continuation' was removed from pylint, see https://github.com/PyCQA/pylint/pull/3571. (useless-option-value)
    Traceback (most recent call last):
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint_django/checkers/foreign_key_strings.py", line 92, in open
        django.setup()
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/django/__init__.py", line 19, in setup
        configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/django/conf/__init__.py", line 82, in __getattr__
        self._setup(name)
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/django/conf/__init__.py", line 63, in _setup
        raise ImproperlyConfigured(
    django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/dev/.virtualenvs/pluto-chat/bin/pylint", line 8, in <module>
        sys.exit(run_pylint())
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint/__init__.py", line 25, in run_pylint
        PylintRun(argv or sys.argv[1:])
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint/lint/run.py", line 207, in __init__
        linter.check(args)
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint/lint/pylinter.py", line 646, in check
        self._check_files(
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint/lint/pylinter.py", line 681, in _check_files
        with self._astroid_module_checker() as check_astroid_module:
      File "/usr/lib/python3.8/contextlib.py", line 113, in __enter__
        return next(self.gen)
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint/lint/pylinter.py", line 859, in _astroid_module_checker
        checker.open()
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/pylint_django/checkers/foreign_key_strings.py", line 120, in open
        settings.configure(Settings(self.config.django_settings_module))
      File "/home/dev/.virtualenvs/pluto-chat/lib/python3.8/site-packages/django/conf/__init__.py", line 118, in configure
        raise RuntimeError('Settings already configured.')
    RuntimeError: Settings already configured.
    

    Pylint version:

    $ pylint --version
    pylint 2.14.5
    astroid 2.11.7
    Python 3.8.10 (default, Jun 22 2022, 20:18:18) 
    [GCC 9.4.0]
    

    Relevant pip freeze:

    Django==3.2.16
    
    opened by slorg1 0
  • Linter 'pylint' failed to parse the output when plugin loaded

    Linter 'pylint' failed to parse the output when plugin loaded

    I have installed and setup pylint_django and when running from the command line I am not receiving an error. But when run from vscode itself pylint crashes due to Syntax error

    Versions pylint 2.15.5 astroid 2.12.12 Python 3.10.6 (main, Nov 2 2022, 18:53:38) [GCC 11.3.0] pylint_django 2.5.3

    VSCODE Version: 1.73.1 (system setup) Commit: 6261075646f055b99068d3688932416f2346dd3b Date: 2022-11-09T04:27:29.066Z Electron: 19.0.17 Chromium: 102.0.5005.167 Node.js: 16.14.2 V8: 10.2.154.15-electron.0 OS: Windows_NT x64 10.0.22000 Sandboxed: No

    ##########Linting Output - pylint##########

    [ERROR 2022-10-30 19:15:36.361]: Linter 'pylint' failed to parse the output '. SyntaxError: Unexpected end of JSON input at JSON.parse () at s.parseMessages (/root/.vscode-server/extensions/ms-python.python-2022.18.2/src/client/linters/pylint.ts:48:39) at s.run (/root/.vscode-server/extensions/ms-python.python-2022.18.2/src/client/linters/baseLinter.ts:99:31) at runMicrotasks () at process.messages (node:internal/process/task_queues:96:5) at s.runLinter (/root/.vscode-server/extensions/ms-python.python-2022.18.2/src/client/linters/pylint.ts:21:15)

    PIP FREEZE asgiref==3.5.2 astroid==2.12.12 black==22.10.0 certifi==2022.9.24 charset-normalizer==2.1.1 click==8.1.3 colorama==0.4.6 cssbeautifier==1.14.7 cssselect2==0.7.0 dill==0.3.6 dj-database-url==1.0.0 Django==3.1.14 django-classy-tags==3.0.1 django-cms==3.8.0 django-filer==2.2.3 django-formtools==2.4 django-js-asset==2.0.0 django-mptt==0.14.0 django-polymorphic==3.1.0 django-sekizai==3.0.1 django-treebeard==4.4 djangocms-admin-style==2.0.2 djangocms-attributes-field==2.1.0 djangocms-bootstrap4==2.0.0 djangocms-file==3.0.0 djangocms-googlemap==2.0.0 djangocms-icon==2.0.0 djangocms-installer==2.0.0 djangocms-link==3.1.0 djangocms-picture==3.0.0 djangocms-style==3.0.0 djangocms-text-ckeditor==4.0.0 djangocms-video==3.0.0 djangorestframework==3.14.0 djlint==1.19.4 easy-thumbnails==2.8.3 EditorConfig==0.12.3 free-proxy==1.0.6 gunicorn==20.1.0 html-tag-names==0.1.2 html-void-elements==0.1.0 html5lib==1.1 idna==3.4 importlib-metadata==5.0.0 isort==5.10.1 jellyfish==0.9.0 jsbeautifier==1.14.7 lazy-object-proxy==1.8.0 lxml==4.9.1 mccabe==0.7.0 mypy-extensions==0.4.3 pathspec==0.10.1 Pillow==9.3.0 platformdirs==2.5.2 psycopg2==2.9.5 pylint==2.15.5 pylint-django==2.5.3 pylint-plugin-utils==0.7 pytz==2022.6 pytz-deprecation-shim==0.1.0.post0 PyYAML==6.0 regex==2022.10.31 reportlab==3.6.12 requests==2.28.1 six==1.16.0 sqlparse==0.4.3 supermarket-connector==0.0.26 svglib==1.4.1 tinycss2==1.2.1 tomli==2.0.1 tomlkit==0.11.6 tqdm==4.64.1 tzdata==2022.6 tzlocal==4.2 Unidecode==1.1.2 urllib3==1.26.12 webencodings==0.5.1 wrapt==1.14.1 zipp==3.10.0

    opened by Repsay 0
  • Redirect stdout to stderr when running Django setup

    Redirect stdout to stderr when running Django setup

    This prevents from a malformed JSON being created if any stdout output is made during Django setup, e.g.: print().

    Signed-off-by: Noam Stolero [email protected]

    opened by noamsto 1
Releases(v2.5.3)
Owner
Python Code Quality Authority
Organization for code quality tools (and plugins) for the Python programming language
Python Code Quality Authority
Type annotations builder for boto3 compatible with VSCode, PyCharm, Emacs, Sublime Text, pyright and mypy.

mypy_boto3_builder Type annotations builder for boto3-stubs project. Compatible with VSCode, PyCharm, Emacs, Sublime Text, mypy, pyright and other too

Vlad Emelianov 2 Dec 05, 2022
An extension for flake8 that forbids some imports statements in some modules.

flake8-obey-import-goat An extension for flake8 that forbids some imports statements in some modules. Important: this project is developed using DDD,

Ilya Lebedev 10 Nov 09, 2022
Flake8 plugin to validate annotations complexity

flake8-annotations-complexity An extension for flake8 to report on too complex type annotations. Complex type annotations often means bad annotations

BestDoctor 41 Dec 28, 2022
Design by contract for Python. Write bug-free code. Add a few decorators, get static analysis and tests for free.

A Python library for design by contract (DbC) and checking values, exceptions, and side-effects. In a nutshell, deal empowers you to write bug-free co

Life4 473 Dec 28, 2022
OpenStack Hacking Style Checks. Mirror of code maintained at opendev.org.

Introduction hacking is a set of flake8 plugins that test and enforce the OpenStack StyleGuide Hacking pins its dependencies, as a new release of some

Mirrors of opendev.org/openstack 224 Jan 05, 2023
Mypy stubs for the PyQt5 framework

Mypy stubs for the PyQt5 framework This repository holds the stubs of the PyQt5 framework. It uses the stub files that are produced during compilation

62 Nov 22, 2022
flake8 plugin that integrates isort

Flake8 meet isort Use isort to check if the imports on your python files are sorted the way you expect. Add an .isort.cfg to define how you want your

Gil Forcada Codinachs 139 Nov 08, 2022
👻 Phantom types for Python

phantom-types Phantom types for Python will help you make illegal states unrepresentable and avoid shotgun parsing by enabling you to practice "Parse,

Anton Agestam 118 Dec 22, 2022
Pylint plugin to enforce some secure coding standards for Python.

Pylint Secure Coding Standard Plugin pylint plugin that enforces some secure coding standards. Installation pip install pylint-secure-coding-standard

Nguyen Damien 2 Jan 04, 2022
Collection of awesome Python types, stubs, plugins, and tools to work with them.

Awesome Python Typing Collection of awesome Python types, stubs, plugins, and tools to work with them. Contents Static type checkers Dynamic type chec

TypedDjango 1.2k Jan 04, 2023
A plugin for Flake8 that provides specializations for type hinting stub files

flake8-pyi A plugin for Flake8 that provides specializations for type hinting stub files, especially interesting for linting typeshed. Functionality A

Łukasz Langa 58 Jan 04, 2023
Mypy plugin and stubs for SQLAlchemy

Pythonista Stubs Stubs for the Pythonista iOS API. This allows for better error detection and IDE / editor autocomplete. Installation and Usage pip in

Dropbox 521 Dec 29, 2022
Unbearably fast O(1) runtime type-checking in pure Python.

Look for the bare necessities, the simple bare necessities. Forget about your worries and your strife. — The Jungle Book.

beartype 1.4k Jan 01, 2023
Tools for improving Python imports

imptools Tools for improving Python imports. Installation pip3 install imptools Overview Detailed docs import_path Import a module from any path on th

Danijar Hafner 7 Aug 07, 2022
A Python Parser

parso - A Python Parser Parso is a Python parser that supports error recovery and round-trip parsing for different Python versions (in multiple Python

Dave Halter 520 Dec 26, 2022
The official GitHub mirror of https://gitlab.com/pycqa/flake8

Flake8 Flake8 is a wrapper around these tools: PyFlakes pycodestyle Ned Batchelder's McCabe script Flake8 runs all the tools by launching the single f

Python Code Quality Authority 2.6k Jan 03, 2023
Simple Python style checker in one Python file

pycodestyle (formerly called pep8) - Python style guide checker pycodestyle is a tool to check your Python code against some of the style conventions

Python Code Quality Authority 4.7k Jan 01, 2023
Tool for automatically reordering python imports. Similar to isort but uses static analysis more.

reorder_python_imports Tool for automatically reordering python imports. Similar to isort but uses static analysis more. Installation pip install reor

Anthony Sottile 589 Dec 26, 2022
Performant type-checking for python.

Pyre is a performant type checker for Python compliant with PEP 484. Pyre can analyze codebases with millions of lines of code incrementally – providi

Facebook 6.2k Jan 04, 2023
Rust like Option and Result types in Python

Option Rust-like Option and Result types in Python, slotted and fully typed. An Option type represents an optional value, every Option is either Some

45 Dec 13, 2022