Переглянути джерело

Reduce Flake8 config to one file (#1807)

* All Flake8 configuration is now in one file in the top/root directory.
* CI runs only for the top directory.

Flake8 now needs to be always executed from the top directory or the config file needs to be specified in the command line
in order to be picked up (before, different directories would work differently).
Vaclav Petras 3 роки тому
батько
коміт
ea1c26eadb
6 змінених файлів з 187 додано та 300 видалено
  1. 187 5
      .flake8
  2. 0 10
      .github/workflows/flake8.yml
  3. 0 114
      gui/wxpython/.flake8
  4. 0 88
      python/grass/.flake8
  5. 0 51
      scripts/.flake8
  6. 0 32
      temporal/.flake8

+ 187 - 5
.flake8

@@ -4,13 +4,19 @@ ignore =
     W503,  # line break before binary operator (Black)
 
 per-file-ignores =
+    # Files and directories which need fixes or specific exceptions
+    # Many of these ignores can and should be removed and the problem fixed.
     # Quick reference for some of the most common errors
+    # F403 star import used; unable to detect undefined names
+    # F405 variable may be undefined, or defined from star imports
+    # E402 module level import not at top of file
     # E501 line too long
     # E722 do not use bare 'except'
     # W605 invalid escape sequence
     # F401 imported but unused
     # F821 undefined name 'unicode'
     # F841 local variable assigned to but never used
+    # E741 ambiguous variable name 'l'
     lib/init/grass.py: E501, E722, F821, F841, W605
     utils/mkrest.py: E501, W605
     utils/gitlog2changelog.py: E722, E712, W605
@@ -37,6 +43,184 @@ per-file-ignores =
     locale/grass_po_stats.py: E122, E128, E231, E401, E501, E722, E741
     gui/scripts/d.rast3d.py: E501
     gui/scripts/d.wms.py: E501
+    gui/wxpython/core/debug.py: E501
+    gui/wxpython/core/gcmd.py: E402, E501
+    gui/wxpython/core/giface.py: E501
+    gui/wxpython/core/gthread.py: F841
+    gui/wxpython/core/gconsole.py: E722, W605
+    gui/wxpython/core/toolboxes.py: E722, E501
+    gui/wxpython/core/utils.py: E722, F841, W605
+    gui/wxpython/core/workspace.py: E722, E501
+    gui/wxpython/core/render.py: E722, F841, E501
+    gui/wxpython/core/ws.py: F841, E501
+    gui/wxpython/core/settings.py: E722
+    gui/wxpython/datacatalog/tree.py: E731, E402, E501
+    gui/wxpython/dbmgr/base.py: E501, E722, F841
+    gui/wxpython/dbmgr/dialogs.py: E501, F841, E722
+    gui/wxpython/dbmgr/sqlbuilder.py: E501, E722, F841
+    gui/wxpython/dbmgr/manager.py: E501, E722
+    gui/wxpython/dbmgr/vinfo.py: F841
+    gui/wxpython/docs/wxgui_sphinx/conf.py: E402, E501
+    gui/wxpython/gcp/g.gui.gcp.py: F841
+    gui/wxpython/gcp/manager.py: E501, F841, E722
+    gui/wxpython/gcp/mapdisplay.py: F841
+    gui/wxpython/gmodeler/*: F841, E722, W605, F405, F403, E402
+    gui/wxpython/gui_core/*: F841, E266, E722, W605
+    gui/wxpython/gui_core/dialogs.py: E501, E722, F841, W605
+    gui/wxpython/gui_core/forms.py: E501, E722, F841
+    gui/wxpython/gui_core/ghelp.py: E501, E722
+    gui/wxpython/gui_core/gselect.py: E501, F841, E266, E722
+    gui/wxpython/gui_core/preferences.py: E501, E266, F841
+    gui/wxpython/gui_core/treeview.py: E501, F841
+    gui/wxpython/gui_core/widgets.py: E501, F841, E722, E266
+    gui/wxpython/image2target/*: F841, E722, E265, E501
+    gui/wxpython/iscatt/*: F841, E722, E741, F405, F403, E501
+    gui/wxpython/lmgr/giface.py: E501, E741
+    gui/wxpython/lmgr/frame.py: F841, E722, W605, E501
+    # layertree still includes some formatting issues (it is ignored by Black)
+    gui/wxpython/lmgr/layertree.py: E722, E266, W504, E225, E501
+    gui/wxpython/lmgr/workspace.py: F841
+    gui/wxpython/modules/*: F841, E722, W605, E501
+    gui/wxpython/nviz/*: F841, E266, E722, W605, F403, F405, E501
+    gui/wxpython/photo2image/*: F841, E722, E265, E501
+    gui/wxpython/psmap/*: F841, E266, E722, F405, F403, E501
+    gui/wxpython/vdigit/*: F841, E722, E741, F405, F403, E501
+    gui/wxpython/vnet/*: F841, E501
+    gui/wxpython/wxgui.py: F841
+    gui/wxpython/animation/g.gui.animation.py: E501
+    gui/wxpython/animation/mapwindow.py: F841
+    gui/wxpython/animation/provider.py: F841, E501
+    gui/wxpython/animation/temporal_manager.py: E501
+    gui/wxpython/tplot/frame.py: F841, E722
+    gui/wxpython/tplot/g.gui.tplot.py: E501
+    gui/wxpython/rdigit/g.gui.rdigit.py: F841
+    gui/wxpython/rdigit/toolbars.py: E501
+    gui/wxpython/iclass/dialogs.py: E741, E501
+    gui/wxpython/iclass/digit.py: F405, F403
+    gui/wxpython/iclass/frame.py: F405, F403, E501
+    gui/wxpython/iclass/g.gui.iclass.py: E501
+    gui/wxpython/iclass/statistics.py: F841, F405, F403
+    gui/wxpython/wxplot/dialogs.py: E501
+    gui/wxpython/wxplot/histogram.py: E722
+    gui/wxpython/wxplot/profile.py: F841, E722
+    gui/wxpython/wxplot/base.py: F841, E722
+    gui/wxpython/wxplot/scatter.py: E501
+    gui/wxpython/location_wizard/dialogs.py: F841, E501
+    gui/wxpython/location_wizard/wizard.py: E722
+    gui/wxpython/mapdisp/frame.py: E501
+    gui/wxpython/mapdisp/main.py: E722, E501
+    gui/wxpython/mapdisp/test_mapdisp.py: E501
+    gui/wxpython/mapdisp/toolbars.py: E501
+    gui/wxpython/mapdisp/statusbar.py: F841, E501
+    gui/wxpython/mapswipe/g.gui.mapswipe.py: E501
+    gui/wxpython/mapwin/base.py: E722, E501
+    gui/wxpython/mapwin/buffered.py: E722, E501
+    gui/wxpython/mapwin/decorations.py: E501
+    gui/wxpython/mapwin/graphics.py: E722
+    gui/wxpython/startup/locdownload.py: E722, E402, E501
+    gui/wxpython/timeline/g.gui.timeline.py: E501
+    gui/wxpython/tools/build_modules_xml.py: E722, E501
+    gui/wxpython/web_services/cap_interface.py: E501
+    gui/wxpython/web_services/dialogs.py: E501
+    gui/wxpython/web_services/widgets.py: F841, E741, W605, E402, E501
+    gui/wxpython/rlisetup/frame.py: E741
+    gui/wxpython/rlisetup/sampling_frame.py: F841
+    gui/wxpython/rlisetup/wizard.py: E722, E741
+    # Generated file
+    gui/wxpython/menustrings.py: E501
+    # C wrappers call libgis.G_gisinit before importing other modules.
+    # TODO: Is this really needed?
+    python/grass/pygrass/vector/__init__.py: E402,
+    python/grass/pygrass/raster/__init__.py: E402,
+    python/grass/gunittest/*.py: E501  # These are mainly just todo comments
+    python/grass/gunittest/gmodules.py: E501, W605
+    python/grass/pygrass/vector/geometry.py: W605
+    python/grass/pygrass/vector/table.py: E501
+    python/grass/pygrass/vector/__init__.py: E501, E402
+    python/grass/pygrass/modules/interface/*.py: E501, F401
+    python/grass/pygrass/modules/interface/module.py: E501, W605
+    python/grass/pygrass/modules/interface/parameter.py: E501, W605
+    python/grass/pygrass/modules/grid/*.py: E501, F401
+    python/grass/pygrass/raster/*.py: E501
+    python/grass/pygrass/raster/rowio.py: E741
+    python/grass/pygrass/rpc/__init__.py: E501, F401, F403
+    python/grass/pygrass/utils.py: E402, E501
+    python/grass/script/db.py: E501
+    python/grass/script/task.py: W605
+    python/grass/script/vector.py: E501  # Long doctest lines which need review anyway
+    python/grass/temporal/abstract_map_dataset.py: E501
+    python/grass/temporal/abstract_space_time_dataset.py: W605, E501, F841, E722
+    python/grass/temporal/aggregation.py: E501
+    python/grass/temporal/base.py: E501
+    python/grass/temporal/c_libraries_interface.py: E501, F841, E722
+    python/grass/temporal/core.py: E501, E722
+    python/grass/temporal/datetime_math.py: E501, F841, E722
+    python/grass/temporal/list_stds.py: E501
+    python/grass/temporal/metadata.py: E501
+    python/grass/temporal/open_stds.py: F841
+    python/grass/temporal/register.py: E501
+    python/grass/temporal/space_time_datasets.py: E501
+    python/grass/temporal/spatial_extent.py: E501
+    python/grass/temporal/spatial_topology_dataset_connector.py: E501, E722
+    python/grass/temporal/spatio_temporal_relationships.py: E501
+    python/grass/temporal/temporal_algebra.py: E741, E501, F841, E722
+    python/grass/temporal/temporal_extent.py: E501
+    python/grass/temporal/temporal_granularity.py: E501, F841, E722
+    python/grass/temporal/temporal_operator.py: E501
+    python/grass/temporal/temporal_raster_algebra.py: E741
+    python/grass/temporal/temporal_raster_base_algebra.py: E501, F841, E722
+    python/grass/temporal/temporal_raster3d_algebra.py: E741
+    python/grass/temporal/temporal_topology_dataset_connector.py: E501, E722
+    python/grass/temporal/temporal_vector_algebra.py: E741, E501, F841
+    python/grass/temporal/univar_statistics.py: E501
+    # Current benchmarks/tests are changing sys.path before import.
+    # Possibly, a different approach should be taken there anyway.
+    python/grass/pygrass/tests/benchmark.py: E501, E402, F401, F821
+    # Configuration file for Sphinx:
+    # Ignoring import/code mix and line length.
+    python/grass/docs/conf.py: E402, E501,
+    # Files not managed by Black
+    python/grass/imaging/images2gif.py: E226, E501
+    # Unused imports in init files
+    # F401 imported but unused
+    # F403 star import used; unable to detect undefined names
+    python/grass/*/__init__.py: F401, F403
+    python/grass/*/*/__init__.py: F401, F403
+    python/grass/*/*/*/__init__.py: F401, F403
+    # E402 module level import not at top of file
+    scripts/d.polar/d.polar.py: F841, E501
+    scripts/r.in.wms/wms_gdal_drv.py: F841, E722, E501
+    scripts/r.in.wms/wms_cap_parsers.py: F841, E741, E501
+    scripts/r.in.wms/wms_drv.py: E402, E722, E501
+    scripts/r.in.wms/srs.py: E722, E501
+    scripts/i.band/i.band.py: F841, E501
+    scripts/v.report/v.report.py: F841, E501
+    scripts/db.out.ogr/db.out.ogr.py: F841
+    scripts/g.extension/g.extension.py: F841, E722, E501
+    scripts/r.unpack/r.unpack.py: E722, E501
+    scripts/v.unpack/v.unpack.py: F841, E722, E501
+    scripts/v.import/v.import.py: F841, E722, E501
+    scripts/db.univar/db.univar.py: E741, E501
+    scripts/d.rast.leg/d.rast.leg.py: E741
+    scripts/d.frame/d.frame.py: E722, E501
+    scripts/i.pansharpen/i.pansharpen.py: E722, E501
+    scripts/r.in.srtm/r.in.srtm.py: E722, E501
+    scripts/r.fillnulls/r.fillnulls.py: E722, E501
+    scripts/d.rast.edit/d.rast.edit.py: E722, E501
+    scripts/v.what.strds/v.what.strds.py: E722, E501
+    scripts/i.in.spotvgt/i.in.spotvgt.py: E722, E501
+    # Line too long (esp. module interface definitions)
+    scripts/*/*.py: E501
+    # local variable 'column' is assigned to but never used
+    temporal/t.rast.to.vect/t.rast.to.vect.py: F841, E501
+    # local variable 'stdstype' is assigned to but never used
+    temporal/t.vect.algebra/t.vect.algebra.py: F841, E501
+    # ## used (##% key: r etc)
+    # local variable 'map_list' is assigned to but never used
+    temporal/t.rast.what/t.rast.what.py: E265, E266, F841, E501
+    # Line too long (esp. module interface definitions)
+    temporal/*/*.py: E501
+
 
 max-line-length = 88
 exclude =
@@ -55,11 +239,9 @@ exclude =
     OBJ.*,
     # Test output directory
     testreport,
-    # Have their own configs for now
-    python/grass,
-    gui/wxpython,
-    scripts/*/*.py,
-    temporal/*/*.py,
+    # Not yet compliant
+    python/grass/ctypes,
+    python/grass/pydispatch,
     # No tests checked for now
     testsuite,
 

+ 0 - 10
.github/workflows/flake8.yml

@@ -8,15 +8,6 @@ jobs:
   flake8:
     name: ${{ matrix.directory }}
     runs-on: ubuntu-20.04
-    strategy:
-      matrix:
-        directory:
-          - .
-          - gui/wxpython
-          - python/grass
-          - scripts
-          - temporal
-      fail-fast: false
 
     steps:
       - uses: actions/checkout@v2
@@ -33,5 +24,4 @@ jobs:
 
       - name: Run Flake8
         run: |
-          cd ${{ matrix.directory }}
           flake8 --count --statistics --show-source --jobs=$(nproc) .

+ 0 - 114
gui/wxpython/.flake8

@@ -1,114 +0,0 @@
-[flake8]
-ignore =
-    E203,  # whitespace before ':' (Black)
-    W503,  # line break before binary operator (Black)
-
-per-file-ignores =
-    # Many of these ignores can and should be removed and the problem fixed.
-    # F841 local variable is assigned to but never used
-    # F403 star import used; unable to detect undefined names
-    # F405 variable may be undefined, or defined from star imports
-    # E402 module level import not at top of file
-    # E501 line too long
-    core/debug.py: E501
-    core/gcmd.py: E402, E501
-    core/giface.py: E501
-    core/gthread.py: F841
-    core/gconsole.py: E722, W605
-    core/toolboxes.py: E722, E501
-    core/utils.py: E722, F841, W605
-    core/workspace.py: E722, E501
-    core/render.py: E722, F841, E501
-    core/ws.py: F841, E501
-    core/settings.py: E722
-    datacatalog/tree.py: E731, E402, E501
-    dbmgr/base.py: E501, E722, F841
-    dbmgr/dialogs.py: E501, F841, E722
-    dbmgr/sqlbuilder.py: E501, E722, F841
-    dbmgr/manager.py: E501, E722
-    dbmgr/vinfo.py: F841
-    docs/wxgui_sphinx/conf.py: E402, E501
-    gcp/g.gui.gcp.py: F841
-    gcp/manager.py: E501, F841, E722
-    gcp/mapdisplay.py: F841
-    gmodeler/*: F841, E722, W605, F405, F403, E402
-    gui_core/*: F841, E266, E722, W605
-    gui_core/dialogs.py: E501, E722, F841, W605
-    gui_core/forms.py: E501, E722, F841
-    gui_core/ghelp.py: E501, E722
-    gui_core/gselect.py: E501, F841, E266, E722
-    gui_core/preferences.py: E501, E266, F841
-    gui_core/treeview.py: E501, F841
-    gui_core/widgets.py: E501, F841, E722, E266
-    image2target/*: F841, E722, E265, E501
-    iscatt/*: F841, E722, E741, F405, F403, E501
-    lmgr/giface.py: E501, E741
-    lmgr/frame.py: F841, E722, W605, E501
-    # layertree still includes some formatting issues (it is ignored by Black)
-    lmgr/layertree.py: E722, E266, W504, E225, E501
-    lmgr/workspace.py: F841
-    modules/*: F841, E722, W605, E501
-    nviz/*: F841, E266, E722, W605, F403, F405, E501
-    photo2image/*: F841, E722, E265, E501
-    psmap/*: F841, E266, E722, F405, F403, E501
-    vdigit/*: F841, E722, E741, F405, F403, E501
-    vnet/*: F841, E501
-    wxgui.py: F841
-    animation/g.gui.animation.py: E501
-    animation/mapwindow.py: F841
-    animation/provider.py: F841, E501
-    animation/temporal_manager.py: E501
-    tplot/frame.py: F841, E722
-    tplot/g.gui.tplot.py: E501
-    rdigit/g.gui.rdigit.py: F841
-    rdigit/toolbars.py: E501
-    iclass/dialogs.py: E741, E501
-    iclass/digit.py: F405, F403
-    iclass/frame.py: F405, F403, E501
-    iclass/g.gui.iclass.py: E501
-    iclass/statistics.py: F841, F405, F403
-    wxplot/dialogs.py: E501
-    wxplot/histogram.py: E722
-    wxplot/profile.py: F841, E722
-    wxplot/base.py: F841, E722
-    wxplot/scatter.py: E501
-    location_wizard/dialogs.py: F841, E501
-    location_wizard/wizard.py: E722
-    mapdisp/frame.py: E501
-    mapdisp/main.py: E722, E501
-    mapdisp/test_mapdisp.py: E501
-    mapdisp/toolbars.py: E501
-    mapdisp/statusbar.py: F841, E501
-    mapswipe/g.gui.mapswipe.py: E501
-    mapwin/base.py: E722, E501
-    mapwin/buffered.py: E722, E501
-    mapwin/decorations.py: E501
-    mapwin/graphics.py: E722
-    startup/locdownload.py: E722, E402, E501
-    timeline/g.gui.timeline.py: E501
-    tools/build_modules_xml.py: E722, E501
-    web_services/cap_interface.py: E501
-    web_services/dialogs.py: E501
-    web_services/widgets.py: F841, E741, W605, E402, E501
-    rlisetup/frame.py: E741
-    rlisetup/sampling_frame.py: F841
-    rlisetup/wizard.py: E722, E741
-    # Generated file
-    menustrings.py: E501
-
-max-line-length = 88
-exclude =
-    .git,
-    __pycache__,
-    .env,
-    .venv,
-    env,
-    venv,
-    ENV,
-    env.bak,
-    venv.bak,
-    ctypes,
-    pydispatch,
-    testsuite,
-builtins =
-    _

+ 0 - 88
python/grass/.flake8

@@ -1,88 +0,0 @@
-[flake8]
-ignore =
-    E203,  # whitespace before ':' (Black)
-    W503,  # line break before binary operator (Black)
-
-per-file-ignores =
-    # C wrappers call libgis.G_gisinit before importing other modules.
-    # TODO: Is this really needed?
-    pygrass/vector/__init__.py: E402,
-    pygrass/raster/__init__.py: E402,
-    # Files and directories which need fixes or specific exceptions
-    # E501 line too long
-    # W605 invalid escape sequence
-    # E741 ambiguous variable name 'l'
-    gunittest/*.py: E501  # These are mainly just todo comments
-    gunittest/gmodules.py: E501, W605
-    pygrass/vector/geometry.py: W605
-    pygrass/vector/table.py: E501
-    pygrass/vector/__init__.py: E501, E402
-    pygrass/modules/interface/*.py: E501, F401
-    pygrass/modules/interface/module.py: E501, W605
-    pygrass/modules/interface/parameter.py: E501, W605
-    pygrass/modules/grid/*.py: E501, F401
-    pygrass/raster/*.py: E501
-    pygrass/raster/rowio.py: E741
-    pygrass/rpc/__init__.py: E501, F401, F403
-    pygrass/utils.py: E402, E501
-    script/db.py: E501
-    script/task.py: W605
-    script/vector.py: E501  # Long doctest lines which need review anyway
-    temporal/abstract_map_dataset.py: E501
-    temporal/abstract_space_time_dataset.py: W605, E501, F841, E722
-    temporal/aggregation.py: E501
-    temporal/base.py: E501
-    temporal/c_libraries_interface.py: E501, F841, E722
-    temporal/core.py: E501, E722
-    temporal/datetime_math.py: E501, F841, E722
-    temporal/list_stds.py: E501
-    temporal/metadata.py: E501
-    temporal/open_stds.py: F841
-    temporal/register.py: E501
-    temporal/space_time_datasets.py: E501
-    temporal/spatial_extent.py: E501
-    temporal/spatial_topology_dataset_connector.py: E501, E722
-    temporal/spatio_temporal_relationships.py: E501
-    temporal/temporal_algebra.py: E741, E501, F841, E722
-    temporal/temporal_extent.py: E501
-    temporal/temporal_granularity.py: E501, F841, E722
-    temporal/temporal_operator.py: E501
-    temporal/temporal_raster_algebra.py: E741
-    temporal/temporal_raster_base_algebra.py: E501, F841, E722
-    temporal/temporal_raster3d_algebra.py: E741
-    temporal/temporal_topology_dataset_connector.py: E501, E722
-    temporal/temporal_vector_algebra.py: E741, E501, F841
-    temporal/univar_statistics.py: E501
-    # Current benchmarks/tests are changing sys.path before import.
-    # Possibly, a different approach should be taken there anyway.
-    pygrass/tests/benchmark.py: E501, E402, F401, F821
-    # Configuration file for Sphinx:
-    # Ignoring import/code mix and line length.
-    docs/conf.py: E402, E501,
-    # Files not managed by Black
-    imaging/images2gif.py: E226, E501
-    # Unused imports in init files
-    # F401 imported but unused
-    # F403 star import used; unable to detect undefined names
-    */__init__.py: F401, F403
-    */*/__init__.py: F401, F403
-    */*/*/__init__.py: F401, F403
-
-
-max-line-length = 88
-exclude =
-    .git,
-    __pycache__,
-    .env,
-    .venv,
-    env,
-    venv,
-    ENV,
-    env.bak,
-    venv.bak,
-    ctypes,
-    pydispatch,
-    testsuite,
-
-builtins =
-    _

+ 0 - 51
scripts/.flake8

@@ -1,51 +0,0 @@
-[flake8]
-ignore =
-    E203,  # whitespace before ':' (Black)
-    W503,  # line break before binary operator (Black)
-    E501, # line too long (161 > 150 characters)
-
-per-file-ignores =
-    # Many of these ignores can and should be removed and the problem fixed.
-    # F841 local variable is assigned to but never used
-    # E402 module level import not at top of file
-    # E741 ambiguous variable name 'l' (needs longer name)
-    # E722 do not use bare 'except'
-    d.polar/d.polar.py: F841
-    r.in.wms/wms_gdal_drv.py: F841, E722
-    r.in.wms/wms_cap_parsers.py: F841, E741
-    r.in.wms/wms_drv.py: E402, E722
-    r.in.wms/srs.py: E722
-    i.band/i.band.py: F841
-    v.report/v.report.py: F841
-    db.out.ogr/db.out.ogr.py: F841
-    g.extension/g.extension.py: F841, E722
-    r.unpack/r.unpack.py: E722
-    v.unpack/v.unpack.py: F841, E722
-    v.import/v.import.py: F841, E722
-    db.univar/db.univar.py: E741
-    d.rast.leg/d.rast.leg.py: E741
-    d.frame/d.frame.py: E722
-    i.pansharpen/i.pansharpen.py: E722
-    r.in.srtm/r.in.srtm.py: E722
-    r.fillnulls/r.fillnulls.py: E722
-    d.rast.edit/d.rast.edit.py: E722
-    v.what.strds/v.what.strds.py: E722
-    i.in.spotvgt/i.in.spotvgt.py: E722
-
-max-line-length = 88
-exclude =
-    .git,
-    __pycache__,
-    .env,
-    .venv,
-    env,
-    venv,
-    ENV,
-    env.bak,
-    venv.bak,
-    ctypes,
-    pydispatch,
-    testsuite,
-
-builtins =
-    _

+ 0 - 32
temporal/.flake8

@@ -1,32 +0,0 @@
-[flake8]
-ignore =
-    E203,  # whitespace before ':' (Black)
-    W503,  # line break before binary operator (Black)
-    E501,  # line too long (179 > 150 characters)
-
-per-file-ignores =
-    # local variable 'column' is assigned to but never used
-    t.rast.to.vect/t.rast.to.vect.py: F841
-    # local variable 'stdstype' is assigned to but never used
-    t.vect.algebra/t.vect.algebra.py: F841
-    # ## used (##% key: r etc)
-    # local variable 'map_list' is assigned to but never used
-    t.rast.what/t.rast.what.py: E265, E266, F841
-
-max-line-length = 88
-exclude =
-    .git,
-    __pycache__,
-    .env,
-    .venv,
-    env,
-    venv,
-    ENV,
-    env.bak,
-    venv.bak,
-    ctypes,
-    pydispatch,
-    testsuite,
-
-builtins =
-    _