flake8-no-pep420


Nameflake8-no-pep420 JSON
Version 2.8.0 PyPI version JSON
download
home_pageNone
SummaryA flake8 plugin to ban PEP-420 implicit namespace packages.
upload_time2024-10-27 22:29:42
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords flake8
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ================
flake8-no-pep420
================

.. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/flake8-no-pep420/main.yml.svg?branch=main&style=for-the-badge
   :target: https://github.com/adamchainz/flake8-no-pep420/actions?workflow=CI

.. image:: https://img.shields.io/pypi/v/flake8-no-pep420.svg?style=for-the-badge
   :target: https://pypi.org/project/flake8-no-pep420/

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge
   :target: https://github.com/psf/black

.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge
   :target: https://github.com/pre-commit/pre-commit
   :alt: pre-commit

A `flake8 <https://flake8.readthedocs.io/en/latest/>`_ plugin to ban `PEP-420 <https://www.python.org/dev/peps/pep-0420/>`__ implicit namespace packages.

----

**Linting a Django project?**
Check out my book `Boost Your Django DX <https://adamchainz.gumroad.com/l/byddx>`__ which covers Flake8 and many other code quality tools.

----

Requirements
============

Python 3.9 to 3.13 supported.

Installation
============

First, install with ``pip``:

.. code-block:: sh

     python -m pip install flake8-no-pep420

Second, if you define Flake8’s ``select`` setting, add the ``INP`` prefix to it.
Otherwise, the plugin should be active by default.

Rationale
=========

Implicit namespace packages are directories of Python files without an ``__init__.py``.
They’re valid and importable, but they break some tools:

* unittest test discovery, unless |-s (--start-directory)|__ points to the namespace package.
  By extension, this affects Django’s test runner too.

  .. |-s (--start-directory)| replace:: ``-s`` (``--start-directory``)
  __ https://docs.python.org/3/library/unittest.html#cmdoption-unittest-discover-s

* Coverage.py, unless |report.include_namespace_packages|__ is enabled.

  .. |report.include_namespace_packages| replace:: ``report.include_namespace_packages``
  __ https://coverage.readthedocs.io/en/latest/config.html#report-include-namespace-packages

* pytest (`Issue #5147 <https://github.com/pytest-dev/pytest/issues/5147>`__)

In most cases, tools fail silently, which can lead to a false sense of security:

* Tests may look legitimate but never run
* Code may be untested but not appear in coverage statistics

PEP-420’s algorithm is non-trivial which is probably why such tools haven’t (yet) implemented it.

Rules
=====

INP001: File is part of an implicit namespace package. Add __init__.py?
-----------------------------------------------------------------------

flake8-no-pep420 will trigger this on the first line of any file that sits in a directory without an ``__init__.py`` file.

Often projects have a few root files *not* in packages, for which an ``__init__.py`` file should not be added.
For example, Django projects normally have a ``manage.py`` file in the root of their repository.
In these cases you can ignore the ``INP001`` error.
It’s possible to use ``# noqa: INP001`` to ignore the error in-line, but this isn’t possible if the first line is a `shebang <https://en.wikipedia.org/wiki/Shebang_(Unix)>`__, such as in Django’s ``manage.py``.
In such cases it’s preferable to use Flake8’s `per-file-ignores option <https://flake8.pycqa.org/en/latest/user/options.html#cmdoption-flake8-per-file-ignores>`__, for example in ``setup.cfg``:

.. code-block:: ini

    [flake8]
    # ...
    per-file-ignores =
        manage.py:INP001

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "flake8-no-pep420",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "flake8",
    "author": null,
    "author_email": "Adam Johnson <me@adamj.eu>",
    "download_url": "https://files.pythonhosted.org/packages/b4/4d/fef818f3d6539171e977c19868f43943469e5b61228599c7a3fc22249b1b/flake8_no_pep420-2.8.0.tar.gz",
    "platform": null,
    "description": "================\nflake8-no-pep420\n================\n\n.. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/flake8-no-pep420/main.yml.svg?branch=main&style=for-the-badge\n   :target: https://github.com/adamchainz/flake8-no-pep420/actions?workflow=CI\n\n.. image:: https://img.shields.io/pypi/v/flake8-no-pep420.svg?style=for-the-badge\n   :target: https://pypi.org/project/flake8-no-pep420/\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge\n   :target: https://github.com/psf/black\n\n.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge\n   :target: https://github.com/pre-commit/pre-commit\n   :alt: pre-commit\n\nA `flake8 <https://flake8.readthedocs.io/en/latest/>`_ plugin to ban `PEP-420 <https://www.python.org/dev/peps/pep-0420/>`__ implicit namespace packages.\n\n----\n\n**Linting a Django project?**\nCheck out my book `Boost Your Django DX <https://adamchainz.gumroad.com/l/byddx>`__ which covers Flake8 and many other code quality tools.\n\n----\n\nRequirements\n============\n\nPython 3.9 to 3.13 supported.\n\nInstallation\n============\n\nFirst, install with ``pip``:\n\n.. code-block:: sh\n\n     python -m pip install flake8-no-pep420\n\nSecond, if you define Flake8\u2019s ``select`` setting, add the ``INP`` prefix to it.\nOtherwise, the plugin should be active by default.\n\nRationale\n=========\n\nImplicit namespace packages are directories of Python files without an ``__init__.py``.\nThey\u2019re valid and importable, but they break some tools:\n\n* unittest test discovery, unless |-s (--start-directory)|__ points to the namespace package.\n  By extension, this affects Django\u2019s test runner too.\n\n  .. |-s (--start-directory)| replace:: ``-s`` (``--start-directory``)\n  __ https://docs.python.org/3/library/unittest.html#cmdoption-unittest-discover-s\n\n* Coverage.py, unless |report.include_namespace_packages|__ is enabled.\n\n  .. |report.include_namespace_packages| replace:: ``report.include_namespace_packages``\n  __ https://coverage.readthedocs.io/en/latest/config.html#report-include-namespace-packages\n\n* pytest (`Issue #5147 <https://github.com/pytest-dev/pytest/issues/5147>`__)\n\nIn most cases, tools fail silently, which can lead to a false sense of security:\n\n* Tests may look legitimate but never run\n* Code may be untested but not appear in coverage statistics\n\nPEP-420\u2019s algorithm is non-trivial which is probably why such tools haven\u2019t (yet) implemented it.\n\nRules\n=====\n\nINP001: File is part of an implicit namespace package. Add __init__.py?\n-----------------------------------------------------------------------\n\nflake8-no-pep420 will trigger this on the first line of any file that sits in a directory without an ``__init__.py`` file.\n\nOften projects have a few root files *not* in packages, for which an ``__init__.py`` file should not be added.\nFor example, Django projects normally have a ``manage.py`` file in the root of their repository.\nIn these cases you can ignore the ``INP001`` error.\nIt\u2019s possible to use ``# noqa: INP001`` to ignore the error in-line, but this isn\u2019t possible if the first line is a `shebang <https://en.wikipedia.org/wiki/Shebang_(Unix)>`__, such as in Django\u2019s ``manage.py``.\nIn such cases it\u2019s preferable to use Flake8\u2019s `per-file-ignores option <https://flake8.pycqa.org/en/latest/user/options.html#cmdoption-flake8-per-file-ignores>`__, for example in ``setup.cfg``:\n\n.. code-block:: ini\n\n    [flake8]\n    # ...\n    per-file-ignores =\n        manage.py:INP001\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A flake8 plugin to ban PEP-420 implicit namespace packages.",
    "version": "2.8.0",
    "project_urls": {
        "Changelog": "https://github.com/adamchainz/flake8-no-pep420/blob/main/CHANGELOG.rst",
        "Funding": "https://adamj.eu/books/",
        "Repository": "https://github.com/adamchainz/flake8-no-pep420"
    },
    "split_keywords": [
        "flake8"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9dcfefc2ecaca3283dcd1c6d3429191c870e03cf7805e6f98d31e09238d37949",
                "md5": "e5e13504614f2c80af6babfde5759999",
                "sha256": "0c00f88cab94724ccce916c2617b49b8a6c8fbc1171de8423b0a856a8ecbebf1"
            },
            "downloads": -1,
            "filename": "flake8_no_pep420-2.8.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e5e13504614f2c80af6babfde5759999",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 4770,
            "upload_time": "2024-10-27T22:29:40",
            "upload_time_iso_8601": "2024-10-27T22:29:40.865222Z",
            "url": "https://files.pythonhosted.org/packages/9d/cf/efc2ecaca3283dcd1c6d3429191c870e03cf7805e6f98d31e09238d37949/flake8_no_pep420-2.8.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b44dfef818f3d6539171e977c19868f43943469e5b61228599c7a3fc22249b1b",
                "md5": "de29eb12bedf144118a4930bb78c28e6",
                "sha256": "37e2cc47400033de66aa826bd08994aa6f9a2fdf9dfb9705723ff7946812019e"
            },
            "downloads": -1,
            "filename": "flake8_no_pep420-2.8.0.tar.gz",
            "has_sig": false,
            "md5_digest": "de29eb12bedf144118a4930bb78c28e6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 5199,
            "upload_time": "2024-10-27T22:29:42",
            "upload_time_iso_8601": "2024-10-27T22:29:42.464491Z",
            "url": "https://files.pythonhosted.org/packages/b4/4d/fef818f3d6539171e977c19868f43943469e5b61228599c7a3fc22249b1b/flake8_no_pep420-2.8.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-27 22:29:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "adamchainz",
    "github_project": "flake8-no-pep420",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "flake8-no-pep420"
}
        
Elapsed time: 0.35446s