content: [build-system]
  requires = [
    "setuptools >= 69",
    "setuptools_scm[toml]>=8"
  ]
  build-backend = "setuptools.build_meta"
  
  [project]
  name = "napari"
  description = "n-dimensional array viewer in Python"
  authors = [
      { name = "napari team", email = "napari-steering-council@googlegroups.com" },
  ]
  classifiers = [
      "Development Status :: 4 - Beta",
      "Environment :: X11 Applications :: Qt",
      "Framework :: napari",
      "Intended Audience :: Education",
      "Intended Audience :: Science/Research",
      "License :: OSI Approved :: BSD License",
      "Programming Language :: C",
      "Programming Language :: Python",
      "Programming Language :: Python :: 3 :: Only",
      "Programming Language :: Python :: 3.10",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Topic :: Scientific/Engineering",
      "Topic :: Scientific/Engineering :: Visualization",
      "Topic :: Scientific/Engineering :: Information Analysis",
      "Topic :: Scientific/Engineering :: Bio-Informatics",
      "Topic :: Utilities",
      "Operating System :: Microsoft :: Windows",
      "Operating System :: POSIX",
      "Operating System :: Unix",
      "Operating System :: MacOS",
  ]
  requires-python = ">=3.10"
  dependencies = [
      "appdirs>=1.4.4",
      "app-model>=0.4.0,<0.5.0",
      "cachey>=0.2.1",
      "certifi>=2018.1.18",
      "dask[array]>=2021.10.0",
      "imageio>=2.20,!=2.22.1",
      "jsonschema>=3.2.0",
      "lazy_loader>=0.3",
      "magicgui>=0.7.0",
      "napari-console>=0.1.1",
      "napari-plugin-engine>=0.1.9",
      "napari-svg>=0.1.8",
      "npe2>=0.7.9",
      "numpy>=1.24.2",
      "numpydoc>=1.0.0",
      "pandas>=1.3.3",
      "Pillow>=9.0",
      "pint>=0.17",
      "psutil>=5.9.0",
      "psygnal>=0.14.2",
      "pydantic>=2.2.0",
      "pygments>=2.6.0",
      "PyOpenGL>=3.1.5",
      "pywin32 ; platform_system == 'Windows'",
      "PyYAML>=6.0",
      "qtpy>=2.3.1",
      "scikit-image[data]>=0.19.1",
      "scipy>=1.10.1",
      "superqt>=0.7.4",
      "tifffile>=2022.7.28",
      "toolz>=0.11.0",
      "tqdm>=4.56.0",
      "typing_extensions>=4.12",
      "vispy>=0.15.2,<0.16",
      "wrapt>=1.13.3",
  ]
  dynamic = [
      "version",
  ]
  
  [project.license]
  text = "BSD 3-Clause"
  
  [project.readme]
  file = "README.md"
  content-type = "text/markdown"
  
  [project.urls]
  Homepage = "https://napari.org"
  Download = "https://github.com/napari/napari"
  "Bug Tracker" = "https://github.com/napari/napari/issues"
  Documentation = "https://napari.org"
  "Source Code" = "https://github.com/napari/napari"
  
  [project.optional-dependencies]
  pyside2 = [
      "PySide2>=5.15.1 ; python_version < '3.11' and platform_machine != 'arm64'",
  ]
  pyside6 = [
      "PySide6 > 6.7"
  ]
  pyqt6 = [
      "PyQt6 > 6.5",
      "PyQt6 != 6.6.1 ; platform_system == 'Darwin'"
  ]
  pyside = [
      "napari[pyside2]"
  ]
  pyqt5 = [
      "PyQt5>=5.15.8",
      "pyqt5-qt5<=5.15.2; sys_platform == 'Windows'",  # 5.15.2 is latest to build on Windows, required for `uv add` compatability as of uv 0.6.9
  ]
  pyqt = [
      "napari[pyqt5]"
  ]
  qt = [
      "napari[pyqt]"
  ]
  all = [
      "napari[pyqt,optional]"
  ]
  optional-base = [
      "zarr>=2.12.0", # needed by `builtins` (dask.array.from_zarr) to open zarr
      "aiohttp", # needed to open remote files by zarr, replace by extras once https://github.com/zarr-developers/zarr-python/issues/3453 is done
      "napari-plugin-manager >=0.1.3, <0.2.0",
  ]
  optional-numba = [
      "numba>=0.57.1",
  ]
  optional = [
      "napari[optional-base,optional-numba,bermuda]",
      "triangle",
  ]
  bermuda = [
      "bermuda>=0.1.5",
  ]
  partsegcore = [
      "PartSegCore-compiled-backend>=0.15.11",
  ]
  all_optional = [
      "napari[optional,partsegcore]"
  ]
  
  # the following extras need to match the dependency-groups below
  # they will be removed in napari 0.7.0
  
  testing = [
      "napari[gallery]",
      "babel>=2.9.0",
      "fsspec>=2023.10.0",
      "hypothesis>=6.8.0",
      "lxml[html_clean]>5",
      "matplotlib >= 3.6.1",
      "pooch>=1.6.0",
      "coverage>7",
      "docstring_parser>=0.15",
      "pretend>=1.0.9",
      "pyautogui>=0.9.54",
      "pytest-qt >=4.4.0; python_version > '3.10'",
      "pytest-qt ==4.4.0; python_version <= '3.10'",
      "pytest-pretty>=1.1.0",
      "pytest>=8.3.5",
      "pytest-rerunfailures>=15.1",
      "tensorstore>=0.1.32",
      "virtualenv>=20.17",
      "xarray>=0.16.2",
      "IPython>=7.25.0",
      "qtconsole>=4.5.1",
      "rich>=12.0.0",
      "napari[optional-base]",
  ]
  testing_extra = [
      "torch>=1.10.2",
  ]
  # needed for gallery examples
  gallery = [
      "glasbey",
      "zarr",
      "dask[array,distributed]",
      "matplotlib",
      "pooch",
      "nilearn",
      "xarray",
      "h5netcdf",
      "meshio",
  ]
  # needed to build docs
  docs = [
      "napari[gallery]",
      "sphinx<8",
      "sphinx-autobuild",
      "sphinx-tabs",
      "sphinx-tags",
      "sphinx-design",
      "sphinx-external-toc",
      "sphinx-favicon>=1.0",
      "sphinx-copybutton",
      "sphinx-gallery",
      "sphinx_autodoc_typehints==1.12.0",
      "sphinxcontrib-mermaid>=1.0.0",
      "sphinxext-opengraph[social-cards]",
      "myst-nb",
      "napari-sphinx-theme>=1.0.0",
      "matplotlib",
      "lxml[html_clean]>5",
      "imageio-ffmpeg",
      "pydeps",
      "seedir",
      # triangle and bermuda needed for docs/guides/triangulation.md
      "triangle",
      "bermuda>=0.1.4",
      "pytest",
      "linkify-it-py",
  ]
  release = [
      "PyGithub>=1.46",
      "twine>=3.1.1",
      "gitpython>=3.1.0",
      "requests-cache>=0.9.2",
  ]
  dev = [
      "ruff",
      "check-manifest>=0.42",
      "pre-commit>=2.9.0",
      "pydantic",
      "tox",
      "tox-min-req",
      "napari[testing]",
  ]
  build = [
      "ruff",
      "pyqt5",
  ]
  
  # these need to be kept in sync with the equivalent optional-dependencies
  [dependency-groups]
  testing = [
      {include-group = "gallery"},
      "babel>=2.9.0",
      "fsspec>=2023.10.0",
      "hypothesis>=6.8.0",
      "lxml[html_clean]>5",
      "matplotlib >= 3.6.1",
      "pooch>=1.6.0",
      "coverage>7",
      "docstring_parser>=0.15",
      "pretend>=1.0.9",
      "pyautogui>=0.9.54",
      "pytest-qt >=4.4.0; python_version > '3.10'",
      "pytest-qt ==4.4.0; python_version <= '3.10'",
      "pytest-pretty>=1.1.0",
      "pytest>=8.3.5",
      "pytest-rerunfailures>=15.1",
      "tensorstore>=0.1.32",
      "virtualenv>=20.17",
      "xarray>=0.16.2",
      "IPython>=7.25.0",
      "qtconsole>=4.5.1",
      "rich>=12.0.0",
      "napari[optional-base]",
  ]
  testing_extra = [
      "torch>=1.10.2",
  ]
  # needed for gallery examples
  gallery = [
      "glasbey",
      "zarr",
      "dask[array,distributed]",
      "matplotlib",
      "pooch",
      "nilearn",
      "xarray",
      "h5netcdf",
      "meshio",
  ]
  # needed to build docs
  docs = [
      {include-group = "gallery"},
      "sphinx<8",
      "sphinx-autobuild",
      "sphinx-tabs",
      "sphinx-tags",
      "sphinx-design",
      "sphinx-external-toc",
      "sphinx-favicon>=1.0",
      "sphinx-copybutton",
      "sphinx-gallery",
      "sphinx_autodoc_typehints==1.12.0",
      "sphinxcontrib-mermaid>=1.0.0",
      "sphinxext-opengraph[social-cards]",
      "myst-nb",
      "napari-sphinx-theme>=1.0.0",
      "matplotlib",
      "lxml[html_clean]>5",
      "imageio-ffmpeg",
      "pydeps",
      "seedir",
      # triangle and bermuda needed for docs/guides/triangulation.md
      "triangle",
      "bermuda>=0.1.4",
      "pytest",
      "linkify-it-py",
  ]
  release = [
      "PyGithub>=1.46",
      "twine>=3.1.1",
      "gitpython>=3.1.0",
      "requests-cache>=0.9.2",
  ]
  dev = [
      "ruff",
      "check-manifest>=0.42",
      "pre-commit>=2.9.0",
      "pydantic",
      "tox",
      "tox-min-req",
      {include-group = "testing"},
  ]
  build = [
      "ruff",
      "pyqt5",
  ]
  
  [project.entry-points.pytest11]
  napari = "napari.utils._testsupport"
  
  [project.entry-points."napari.manifest"]
  napari_builtins = "napari_builtins:builtins.yaml"
  
  [project.scripts]
  napari = "napari.__main__:main"
  
  [tool.setuptools]
  zip-safe = false
  include-package-data = true
  license-files = [
      "LICENSE",
  ]
  
  [tool.setuptools.packages.find]
  where = [
      "src",
  ]
  namespaces = false
  
  [tool.setuptools.package-data]
  "*" = [
      "*.pyi",
  ]
  napari_builtins = [
      "builtins.yaml",
  ]
  
  
  [tool.setuptools_scm]
  write_to = "src/napari/_version.py"
  fallback_version = "0.6.4.dev0"
  
  [tool.check-manifest]
  ignore = [
    ".cirrus.yml",
    ".pre-commit-config.yaml",
    "asv.conf.json",
    "codecov.yml",
    "Makefile",
    "src/napari/_version.py",  # added during build by setuptools_scm
    "tools/minreq.py",
    "tox.ini",
    "src/napari/_qt/qt_resources/_qt_resources_*.py",
    "*.pyi",  # added by make typestubs
    "binder/*",
    ".env_sample",
    ".devcontainer/*",
    "src/napari/resources/icons/_themes/*/*.svg"
  ]
  
  [tool.ruff]
  line-length = 79
  exclude = [
      ".bzr",
      ".direnv",
      ".eggs",
      ".git",
      ".mypy_cache",
      ".pants.d",
      ".ruff_cache",
      ".svn",
      ".tox",
      ".venv",
      "__pypackages__",
      "_build",
      "buck-out",
      "build",
      "dist",
      "node_modules",
      "venv",
      "*vendored*",
      "*_vendor*",
  ]
  
  fix = true
  
  [tool.ruff.format]
  quote-style = "single"
  
  [tool.ruff.lint]
  select = [
      "E", "F", "W", #flake8
      "UP", # pyupgrade
      "I", # isort
      "YTT", #flake8-2020
      "TC", # flake8-type-checing
      "BLE", # flake8-blind-exception
      "B", # flake8-bugbear
      "A", # flake8-builtins
      "C4", # flake8-comprehensions
      "ISC", # flake8-implicit-str-concat
      "G", # flake8-logging-format
      "PIE", # flake8-pie
      "COM", # flake8-commas
      "SIM", # flake8-simplify
      "INP", # flake8-no-pep420
      "PYI", # flake8-pyi
      "Q", # flake8-quotes
      "RSE", # flake8-raise
      "RET", # flake8-return
      "TID",  # flake8-tidy-imports # replace absolutify import
      "TRY", # tryceratops
      "ICN", # flake8-import-conventions
      "RUF", # ruff specyfic rules
      "NPY201", # checks compatibility with numpy version 2.0
      "ASYNC", # flake8-async
      "EXE", # flake8-executable
      "FA", # flake8-future-annotations
      "LOG", # flake8-logging
      "SLOT", # flake8-slots
      "PT", # flake8-pytest-style
      "T20", # flake8-print
  ]
  ignore = [
      "E501", "TC001", "TC002", "TC003",
      "A003", # flake8-builtins - we have class attributes violating these rule
      "COM812", # flake8-commas - we don't like adding comma on single line of arguments
      "COM819", # conflicts with ruff-format
      "RET504", # not fixed yet https://github.com/charliermarsh/ruff/issues/2950
      "TRY003", # require implement multiple exception class
      "RUF005", # problem with numpy compatybility, see https://github.com/charliermarsh/ruff/issues/2142#issuecomment-1451038741
      "B028", # need to be fixed
      "PYI015", # it produces bad looking files (@jni opinion)
      "W191", "Q000", "Q001", "Q002", "Q003", "ISC001", # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
      "UP007", # temporary disable migrtion form Union[X, Y] to X | Y
      "UP045", # temporary disable migrtion from Optional[X] to X | None
      "TC006", # put types in quotes in typing.cast
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "src/napari/_vispy/__init__.py" = ["E402"]
  "**/_tests/*.py" = ["B011", "INP001", "TRY301", "B018", "RUF012"]
  "src/napari/utils/_testsupport.py" = ["B011"]
  "tools/validate_strings.py" = ["F401"]
  "tools/**" = ["INP001", "T20", "LOG015"]
  "examples/**" = ["ICN001", "INP001", "T20", "LOG015"]
  "**/vendored/**" = ["TID"]
  "src/napari/benchmarks/**" = ["RUF012", "TID252"]
  
  [tool.ruff.lint.flake8-builtins]
  builtins-allowed-modules = ["io", "types", "threading"]
  
  [tool.ruff.lint.pyupgrade]
  keep-runtime-typing = true
  
  [tool.ruff.lint.flake8-quotes]
  docstring-quotes = "double"
  inline-quotes = "single"
  multiline-quotes = "double"
  
  [tool.ruff.lint.flake8-tidy-imports]
  # Disallow all relative imports.
  ban-relative-imports = "all"
  
  [tool.ruff.lint.isort]
  known-first-party=['napari']
  combine-as-imports = true
  
  [tool.ruff.lint.flake8-import-conventions]
  [tool.ruff.lint.flake8-import-conventions.extend-aliases]
  # Declare a custom alias for the `matplotlib` module.
  "dask.array" = "da"
  xarray = "xr"
  
  [tool.pytest.ini_options]
  # These follow standard library warnings filters syntax.  See more here:
  # https://docs.python.org/3/library/warnings.html#describing-warning-filters
  addopts = ["--maxfail=5",  "--durations=10",  "-ra", "--strict-markers", "--strict-config"]
  console_output_style = "count"
  minversion = "8"
  # log_cli_level = "INFO"
  xfail_strict = true
  testpaths = ["napari", "napari_builtins"]
  #pythonpath = "src"
  
  
  # NOTE: only put things that will never change in here.
  # napari deprecation and future warnings should NOT go in here.
  # instead... assert the warning with `pytest.warns()` in the relevant test,
  # That way we can clean them up when no longer necessary
  filterwarnings = [
    "error:::napari", # turn warnings from napari into errors
    "error:::test_.*", # turn warnings in our own tests into errors
    "default:::napari.+vendored.+",  # just print warnings inside vendored modules
    "ignore::DeprecationWarning:shibokensupport",
    "ignore::DeprecationWarning:ipykernel",
    "ignore::DeprecationWarning:tensorstore",
    "ignore:Accessing zmq Socket:DeprecationWarning:jupyter_client",
    "ignore:pythonw executable not found:UserWarning:",
    "ignore:data shape .* exceeds GL_MAX_TEXTURE_SIZE:UserWarning",
    "ignore:For best performance with Dask arrays in napari:UserWarning:",
    "ignore:numpy.ufunc size changed:RuntimeWarning",
    "ignore:Multiscale rendering is only supported in 2D. In 3D, only the lowest resolution scale is displayed",
    "ignore:Alternative shading modes are only available in 3D, defaulting to none",
    "ignore:distutils Version classes are deprecated::",
    "ignore:There is no current event loop:DeprecationWarning:",
    "ignore:(?s).*Pyarrow will become a required dependency of pandas:DeprecationWarning",  # pandas pyarrow (pandas<3.0),
    # TODO: remove once xarray is updated to avoid this warning
    # https://github.com/pydata/xarray/blame/b1f3fea467f9387ed35c221205a70524f4caa18b/pyproject.toml#L333-L334
    # https://github.com/pydata/xarray/pull/8939
    "ignore:__array__ implementation doesn't accept a copy keyword, so passing copy=False failed.",
    "ignore:pkg_resources is deprecated",
    "ignore:Deprecated call to `pkg_resources.declare_namespace",
    "ignore:Use Group.create_array instead."
  ]
  markers = [
      "examples: Test of examples",
      "disable_qthread_start: Disable thread start in this Test",
      "disable_qthread_pool_start: Disable strarting QRunnable using QThreadPool start in this Test",
      "disable_qtimer_start: Disable timer start in this Test",
      "disable_qanimation_start: Disable animation start in this Test",
      "enable_console: Don't mock the IPython console (in QtConsole) in this Test",
      # mark slow tests, so they can be skipped using: pytest -m "not slow"
      "slow: mark a test as slow",
      "key_bindings: Test of keybindings",
      "show_qt_viewer: Show the QtViewer in this Test",
  ]
  
  [tool.mypy]
  files = "napari"
  # This file triggers an internal mypy error, so exclude collection
  # TODO: fix this
  exclude = "src/napari/utils/events/_tests/test_evented_model\\.py"
  plugins =  "pydantic.mypy"
  ignore_missing_imports = true
  hide_error_codes = false
  warn_redundant_casts = true
  disallow_incomplete_defs = true
  disallow_untyped_calls = true
  disallow_untyped_defs = true
  warn_unused_ignores = true
  check_untyped_defs = true
  no_implicit_optional = true
  disable_error_code = [
    # See discussion at https://github.com/python/mypy/issues/2427;
    # mypy cannot run type checking on method assignment, but we use
    # that in several places, so ignore the error
    'method-assign'
  ]
  # see `$ qtpy mypy-args` and qtpy readme. This will be used by `tox -e mypy`
  # to properly infer with PyQt6 installed
  always_false=['PYSIDE6', 'PYSIDE2', 'PYQT5']
  always_true=['PYQT6']
  
  
  # gloabl ignore error
  [[tool.mypy.overrides]]
  module = [
    '*._tests.*',
    '*.experimental.*',
    '*._vendor.*',
    '*.benchmarks.*',
    'napari_builtins.*'
  ]
  ignore_errors = true
  
  
  
  
  # individual ignore error
  # we should strive to remove those
  # See https://github.com/napari/napari/issues/2751
  # you can regenerate this list with the following command \047 is single quote.
  # mypy napari | cut -f1 -d: | sort | uniq  | tr '/' '.'  | sed 's/\.py//' | awk '{ print "    \047" $0 "\047," }'
  [[tool.mypy.overrides]]
  module = [
      'napari._qt.code_syntax_highlight',
      'napari._qt.containers._base_item_model',
      'napari._qt.containers._base_item_view',
      'napari._qt.containers._layer_delegate',
      'napari._qt.containers.qt_axis_model',
      'napari._qt.containers.qt_layer_model',
      'napari._qt.containers.qt_list_model',
      'napari._qt.containers.qt_list_view',
      'napari._qt.containers.qt_tree_model',
      'napari._qt.containers.qt_tree_view',
      'napari._qt.dialogs.confirm_close_dialog',
      'napari._qt.dialogs.preferences_dialog',
      'napari._qt.dialogs.qt_about',
      'napari._qt.dialogs.qt_activity_dialog',
      'napari._qt.dialogs.qt_modal',
      'napari._qt.dialogs.qt_notification',
      'napari._qt.dialogs.qt_package_installer',
      'napari._qt.dialogs.qt_plugin_dialog',
      'napari._qt.dialogs.qt_plugin_report',
      'napari._qt.dialogs.qt_reader_dialog',
      'napari._qt.dialogs.screenshot_dialog',
      'napari._qt.experimental.qt_chunk_receiver',
      'napari._qt.experimental.qt_poll',
      'napari._qt.layer_controls.qt_colormap_combobox',
      'napari._qt.layer_controls.qt_image_controls',
      'napari._qt.layer_controls.qt_image_controls_base',
      'napari._qt.layer_controls.qt_labels_controls',
      'napari._qt.layer_controls.qt_layer_controls_base',
      'napari._qt.layer_controls.qt_layer_controls_container',
      'napari._qt.layer_controls.qt_points_controls',
      'napari._qt.layer_controls.qt_shapes_controls',
      'napari._qt.layer_controls.qt_surface_controls',
      'napari._qt.layer_controls.qt_tracks_controls',
      'napari._qt.layer_controls.qt_vectors_controls',
      'napari._qt.layer_controls.widgets.qt_widget_controls_base',
      'napari._qt.layer_controls.widgets.qt_face_color',
      'napari._qt.layer_controls.widgets.qt_opacity_blending_controls',
      'napari._qt.layer_controls.widgets.qt_text_visibility',
      'napari._qt.layer_controls.widgets.qt_out_slice_checkbox',
      'napari._qt.layer_controls.widgets.qt_projection_mode_control',
      'napari._qt.layer_controls.widgets._shapes.qt_edge_color',
      'napari._qt.layer_controls.widgets._shapes.qt_edge_width_slider',
      'napari._qt.layer_controls.widgets._labels.qt_label_color',
      'napari._qt.layer_controls.widgets._labels.qt_brush_size_slider',
      'napari._qt.layer_controls.widgets._labels.qt_color_mode_combobox',
      'napari._qt.layer_controls.widgets._labels.qt_contiguous_checkbox',
      'napari._qt.layer_controls.widgets._labels.qt_ndim_spinbox',
      'napari._qt.layer_controls.widgets._labels.qt_contour_spinbox',
      'napari._qt.layer_controls.widgets._labels.qt_preserve_labels_checkbox',
      'napari._qt.layer_controls.widgets._labels.qt_render_control',
      'napari._qt.layer_controls.widgets._labels.qt_display_selected_label_checkbox',
      'napari._qt.layer_controls.widgets._points.qt_current_size_slider',
      'napari._qt.layer_controls.widgets._points.qt_symbol_combobox',
      'napari._qt.layer_controls.widgets._points.qt_border_color',
      'napari._qt.layer_controls.widgets.qt_colormap_control',
      'napari._qt.layer_controls.widgets.qt_contrast_limits',
      'napari._qt.layer_controls.widgets.qt_autoscale_control',
      'napari._qt.layer_controls.widgets.qt_gamma_slider',
      'napari._qt.layer_controls.widgets._surface.qt_shading_combobox',
      'napari._qt.layer_controls.widgets._image.qt_interpolation_combobox',
      'napari._qt.layer_controls.widgets._image.qt_render_control',
      'napari._qt.layer_controls.widgets._image.qt_depiction_control',
      'napari._qt.layer_controls.widgets._vectors.qt_edge_color',
      'napari._qt.layer_controls.widgets._vectors.qt_vector_style_combobox',
      'napari._qt.layer_controls.widgets._vectors.qt_line_dimension_spinbox',
      'napari._qt.layer_controls.widgets._tracks.qt_color_properties_combobox',
      'napari._qt.layer_controls.widgets._tracks.qt_head_slider',
      'napari._qt.layer_controls.widgets._tracks.qt_tail_control',
      'napari._qt.layer_controls.widgets._tracks.qt_id_checkbox',
      'napari._qt.layer_controls.widgets._tracks.qt_graph_checkbox',
      'napari._qt.layer_controls.widgets._tracks.qt_colormap_control',
      'napari._qt.layer_controls.widgets._tracks.qt_hide_completed_tracks_checkbox',
      'napari._qt.menus._util',
      'napari._qt.menus.file_menu',
      'napari._qt.perf.qt_event_tracing',
      'napari._qt.perf.qt_performance',
      'napari._qt.qt_event_filters',
      'napari._qt.qt_event_loop',
      'napari._qt.qt_main_window',
      'napari._qt.qt_resources._svg',
      'napari._qt.qt_viewer',
      'napari._qt.qthreading',
      'napari._qt.utils',
      'napari._qt.widgets._slider_compat',
      'napari._qt.widgets.qt_color_swatch',
      'napari._qt.widgets.qt_dict_table',
      'napari._qt.widgets.qt_dims',
      'napari._qt.widgets.qt_dims_slider',
      'napari._qt.widgets.qt_dims_sorter',
      'napari._qt.widgets.qt_extension2reader',
      'napari._qt.widgets.qt_font_size',
      'napari._qt.widgets.qt_highlight_preview',
      'napari._qt.widgets.qt_keyboard_settings',
      'napari._qt.widgets.qt_logger',
      'napari._qt.widgets.qt_message_popup',
      'napari._qt.widgets.qt_mode_buttons',
      'napari._qt.widgets.qt_plugin_sorter',
      'napari._qt.widgets.qt_progress_bar',
      'napari._qt.widgets.qt_range_slider_popup',
      'napari._qt.widgets.qt_scrollbar',
      'napari._qt.widgets.qt_size_preview',
      'napari._qt.widgets.qt_spinbox',
      'napari._qt.widgets.qt_splash_screen',
      'napari._qt.widgets.qt_theme_sample',
      'napari._qt.widgets.qt_tooltip',
      'napari._qt.widgets.qt_viewer_buttons',
      'napari._qt.widgets.qt_viewer_dock_widget',
      'napari._qt.widgets.qt_viewer_status_bar',
      'napari._qt.widgets.qt_welcome',
      'napari._vispy.canvas',
      'napari._vispy.experimental.texture_atlas',
      'napari._vispy.experimental.tile_set',
      'napari._vispy.experimental.tiled_image_visual',
      'napari._vispy.experimental.vispy_tiled_image_layer',
      'napari._vispy.overlays.base',
      'napari._vispy.utils.cursor',
      'napari.components.layerlist',
      'napari.layers._layer_actions',
      'napari.layers._multiscale_data',
      'napari.layers.intensity_mixin',
      'napari.layers.points._points_key_bindings',
      'napari.layers.points._points_utils',
      'napari.layers.points.points',
      'napari.layers.shapes._shapes_mouse_bindings',
      'napari.layers.shapes.shapes',
      'napari.layers.utils.color_encoding',
      'napari.layers.utils.color_manager',
      'napari.layers.utils.stack_utils',
      'napari.layers.utils.string_encoding',
      'napari.layers.utils.style_encoding',
      'napari.layers.utils.text_manager',
      'napari.utils._magicgui',
      'napari.utils._testsupport',
      'napari.utils._tracebacks',
      'napari.utils.action_manager',
      'napari.utils.events.containers._evented_dict',
      'napari.utils.events.containers._evented_list',
      'napari.utils.events.containers._nested_list',
      'napari.utils.events.custom_types',
      'napari.utils.events.debugging',
      'napari.utils.events.event',
      'napari.utils.events.evented_model',
      'napari.utils.interactions',
      'napari.utils.key_bindings',
      'napari.utils.mouse_bindings',
      'napari.utils.progress',
      'napari.utils.shortcuts',
      'napari.utils.stubgen',
      'napari.utils.transforms.transforms',
      'napari.utils.tree.group',
      'napari.view_layers',
      'napari._app_model.injection._processors',
  ]
  ignore_errors = true
  
  [[tool.mypy.overrides]]
  module = [
      "napari.settings",
      "napari.settings._yaml",
      "napari.plugins.exceptions",
      "napari._app_model.actions._toggle_action",
      "napari._vispy.filters.tracks",
      "napari._vispy.utils.text",
      "napari._vispy.utils.visual",
      "napari._vispy.visuals.clipping_planes_mixin",
      "napari._vispy.visuals.markers",
      "napari._vispy.visuals.surface",
      "napari.layers.shapes._shapes_models.path",
      "napari.layers.shapes._shapes_models.polygon",
      "napari.layers.shapes._shapes_models._polygon_base",
      "napari.layers.shapes._shapes_models.ellipse",
      "napari.layers.shapes._shapes_models.line",
      "napari.layers.shapes._shapes_models.rectangle",
      "napari.layers.shapes._shapes_models.shape",
      "napari.resources._icons",
      "napari.utils.color",
      "napari.utils.events.containers._dict",
      "napari.utils.events.event_utils",
      "napari.utils.migrations",
      "napari.utils.validators",
      "napari.window"
  ]
  disallow_incomplete_defs = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._event_loop",
      "napari._vispy.utils.quaternion",
      "napari._vispy.visuals.bounding_box",
      "napari._vispy.visuals.image",
      "napari._vispy.visuals.interaction_box",
      "napari._vispy.visuals.points",
      "napari._vispy.visuals.scale_bar",
      "napari.components._layer_slicer",
      "napari.components._viewer_mouse_bindings",
      "napari.components.overlays.base",
      "napari.components.overlays.interaction_box",
      "napari.utils.colormaps.categorical_colormap_utils",
  ]
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari.components.viewer_model",
      "napari.settings._fields",
      "napari.settings._migrations",
      "napari.settings._base",
      "napari.types",
      "napari.plugins._npe2",
      "napari.settings._napari_settings",
      "napari.plugins._plugin_manager",
      "napari.plugins.utils",
      "napari._qt._qapp_model.qactions._file",
      "napari._qt._qapp_model.qactions._help",
      "napari._qt._qapp_model.qactions._view",
      "napari._vispy.camera",
      "napari._vispy.layers.image",
      "napari._vispy.layers.scalar_field",
      "napari._vispy.layers.tracks",
      "napari._vispy.layers.vectors",
      "napari._vispy.overlays.axes",
      "napari._vispy.overlays.interaction_box",
      "napari._vispy.overlays.labels_polygon",
      "napari._vispy.overlays.scale_bar",
      "napari._vispy.overlays.text",
      "napari.layers.labels._labels_key_bindings",
      "napari.layers.utils._slice_input",
      "napari.utils._register",
      "napari.utils.colormaps.categorical_colormap",
      "napari.utils.colormaps.standardize_color",
      "napari.utils.geometry",
      "napari.utils.io",
      "napari.utils.notebook_display",
      "napari.utils.transforms.transform_utils",
      "napari.utils.translations",
      "napari.utils.tree.node",
      "napari.viewer",
      "napari.layers.shapes._shape_list",
      "napari.layers.vectors.vectors",
  ]
  disallow_incomplete_defs = false
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari.plugins",
      "napari._vispy.layers.base",
      "napari._vispy.visuals.axes",
      "napari.layers.labels._labels_mouse_bindings",
      "napari.layers.utils.color_manager_utils",
      "napari.utils.colormaps.vendored._cm",
      "napari.utils.colormaps.vendored.cm",
      "napari.utils.status_messages",
      "napari.layers.shapes._shapes_utils"
  ]
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._app_model._app",
      "napari.utils.theme",
  ]
  disallow_incomplete_defs = false
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  warn_unused_ignores = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._app_model.context._context",
      "napari._qt.containers._factory"
  ]
  disallow_incomplete_defs = false
  disallow_untyped_defs = false
  warn_unused_ignores = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._qt.menus.plugins_menu",
      "napari._vispy.layers.labels",
      "napari._vispy.layers.points",
      "napari._vispy.layers.shapes",
      "napari._vispy.layers.surface",
      "napari.components._viewer_key_bindings",
      "napari.layers.labels.labels",
      "napari.layers.surface.surface",
      "napari.layers.tracks.tracks",
      "napari.layers.utils.layer_utils",
      "napari.utils._dtype",
      "napari.utils.colormaps.colormap_utils",
      "napari.utils.misc",
  ]
  check_untyped_defs = false
  disallow_incomplete_defs = false
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari.components.camera",
      "napari.components.dims",
      "napari.conftest",
      "napari.layers.labels._labels_utils",
      "napari.layers.points._points_mouse_bindings",
      "napari.utils.colormaps.colormap",
      "napari.utils.notifications",
  ]
  check_untyped_defs = false
  disallow_incomplete_defs = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari.utils.events.containers._typed",
  ]
  check_untyped_defs = false
  disallow_incomplete_defs = false
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  warn_unused_ignores = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari.__main__",
      "napari.utils.colormaps.vendored.colors",
      "napari.layers.image.image",
      "napari.layers._scalar_field.scalar_field",
  ]
  check_untyped_defs = false
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._app_model.context._layerlist_context",
      "napari._vispy.overlays.colormap",
      "napari.components.overlays.labels_polygon",
      "napari.plugins.io",
      "napari.utils.colormaps.vendored._cm_listed",
  ]
  disallow_untyped_calls = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._qt.containers.qt_layer_list",
      "napari.layers.base.base"
  ]
  check_untyped_defs = false
  disallow_untyped_calls = false
  disallow_untyped_defs = false
  warn_unused_ignores = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._vispy.overlays.bounding_box",
      "napari._vispy.overlays.brush_circle",
      "napari.utils._test_utils",
  ]
  check_untyped_defs = false
  disallow_untyped_defs = false
  
  [[tool.mypy.overrides]]
  module = [
      "napari._pydantic_compat",
  ]
  ignore_errors = true
  
  
  [tool.coverage.report]
  exclude_lines = [
      "pragma: no cover",
      "if TYPE_CHECKING:",
      "if typing.TYPE_CHECKING:",
      "raise NotImplementedError()",
      "except ImportError:",
      "^ +\\.\\.\\.$",
  ]
  
  [tool.coverage.run]
  omit = [
      "*/_vendor/*",
      "*/_version.py",
      "*/benchmarks/*",
      "napari/utils/indexing.py",
      "**/add_layer.py_tmpl",
      "*/.pytest_tmp/**",
  ]
  source = [
      "src/napari",
      "src/napari_builtins",
      "napari",
      "napari_builtins",
  ]
  
  [tool.coverage.paths]
  source = [
      "src/napari/",
      "**/src/napari/",
      "**/.tox/*/lib/python*/site-packages/napari/",
      "**\\.tox\\*\\Lib\\site-packages\\napari",
  ]
  builtins = [
      "src/napari_builtins/",
      "**/src/napari_builtins/",
      "**/.tox/*/lib/python*/site-packages/napari_builtins/",
      "**\\.tox\\*\\Lib\\site-packages\\napari_builtins",
  ]
  
  [tool.importlinter]
  root_package = "napari"
  include_external_packages = true
  
  [[tool.importlinter.contracts]]
  name = "Forbid import PyQt and PySide"
  type = "forbidden"
  source_modules = "napari"
  forbidden_modules = ["PyQt5", "PySide2", "PyQt6", "PySide6"]
  ignore_imports = [
      "napari._qt -> PySide2",
      "napari.plugins._npe2 -> napari._qt._qplugins",
  ]
  
  [[tool.importlinter.contracts]]
  name = "Block import from qt module in napari.layers"
  type = "layers"
  layers = ["napari.qt","napari.layers"]
  ignore_imports = [
      "napari.plugins._npe2 -> napari._qt._qplugins",
      # TODO: remove once npe1 deprecated
      "napari._qt.qt_main_window -> napari._qt._qplugins",
  ]
  
  [[tool.importlinter.contracts]]
  name = "Block import from qt module in napari.components"
  type = "layers"
  layers = ["napari.qt","napari.components"]
  ignore_imports = [
      "napari.plugins._npe2 -> napari._qt._qplugins",
      # TODO: remove once npe1 deprecated
      "napari._qt.qt_main_window -> napari._qt._qplugins",
  ]
  