Socket
Book a DemoInstallSign in
Socket

flake8-qgis

Package Overview
Dependencies
Maintainers
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

flake8-qgis

Flake8 plugin for QGIS python plugins.

pipPyPI
Version
1.1.0
Maintainers
3

flake8-qgis

PyPI version Downloads CI Code on Github Code style: black Imports: isort pre-commit

A flake8 plugin for QGIS3 python plugins written in Python.

Made with Cookiecutter template cookiecutter-flake8-plugin. Inspired by flake8-simplify.

Installation

Install with pip:

pip install flake8-qgis

Usage

Just call flake8 . in your package or flake your.py.

Rules

RuleDescription
QGS101Avoid using from-imports from qgis protected members
QGS102Avoid using imports from qgis protected members
QGS103Avoid using from-imports from PyQt directly
QGS104Avoid using imports from PyQt directly
QGS105Avoid passing QgisInterface as an argument
QGS106Avoid importing gdal directly, import it from osgeo package

Please check the Examples section below for good and bad usage examples for each rule.

While it's important to adhere to these rules, there might be good reasons to ignore some of them. You can do so by using the standard Flake8 configuration. For example, in the setup.cfg file:

[flake8]
ignore = QGS101, QGS102

QGS101

Avoid using from-imports from qgis protected members

An exception is made for importing qgis._3d (since flake-qgis 1.1.0). The underscore in the package name is used to prevent the name from starting with a number, ensuring it is a valid package name.

Why is this bad?

Protected members are potentially unstable across software versions. Future changes in protected members might cause problems.

Example

# Bad
from qgis._core import QgsMapLayer, QgsVectorLayer
from qgis._core import QgsApplication

# Good
from qgis.core import QgsMapLayer, QgsVectorLayer
from qgis.core import QgsApplication

QGS102

Avoid using imports from qgis protected members

An exception is made for importing qgis._3d (since flake-qgis 1.1.0). The underscore in the package name is used to prevent the name from starting with a number, ensuring it is a valid package name.

Why is this bad?

Protected members are potentially unstable across software versions. Future changes in protected members might cause problems.

Example

# Bad
import qgis._core.QgsVectorLayer as QgsVectorLayer

# Good
import qgis.core.QgsVectorLayer as QgsVectorLayer

QGS103

Avoid using from-imports from PyQt directly

Why is this bad?

Importing directly from PyQt might create conflict with QGIS bundled PyQt version

Example

# Bad
from PyQt5.QtCore import pyqtSignal

# Good
from qgis.PyQt.QtCore import pyqtSignal

QGS104

Avoid using imports from PyQt directly

Why is this bad?

Importing directly from PyQt might create conflict with QGIS bundled PyQt version

Example

# Bad
import PyQt5.QtCore.pyqtSignal as pyqtSignal

# Good
import qgis.PyQt.QtCore.pyqtSignal as pyqtSignal

QGS105

Avoid passing QgisInterface as an argument

Why is this bad?

It is much easier to import QgisInterface, and it's easier to mock it as well when writing tests. This approach is not however documented properly, so the API might change at some point to exclude this.

This rule can be excluded safely since this is only a matter of preference. Passing iface as an argument is the documented way of getting QgisInterface in plugins. However, it requires writing more code.

Example

# Bad: iface passed as argument
def some_function(somearg, iface):
    # do something with iface


# Good: iface imported
from qgis.utils import iface

def some_function(somearg):
    # do something with iface
# in classFactory the passing is OK, since QGIS injects it
def classFactory(iface):
    # preferably do not pass the iface to plugin

QGS106

Avoid importing gdal directly, import it from osgeo package

Why is this bad?

Importing directly from gdal might create conflict with different gdal versions

Example

# Bad
import gdal
import ogr

# Good
from osgeo import gdal

Development

Install development dependencies

python -m venv .venv
# activate the venv
python -m pip install -U pip
pip install pip-tools
pip-sync requirements.txt requirements-dev.txt requirements-lint.txt

Updating dependencies

Edit .in dependency files then run

uv pip compile --universal --python 3.9 setup.cfg -o requirements.txt
uv pip compile --universal --python 3.9 requirements-dev.in -o requirements-dev.txt
uv pip compile --universal --python 3.9 requirements-lint.in -o requirements-lint.txt

Keywords

flake8

FAQs

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

About

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc

U.S. Patent No. 12,346,443 & 12,314,394. Other pending.