From 58426f0c525db667afd08e85df54514b491033f4 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:02:39 +0100 Subject: [PATCH 1/7] Minimal pyproject.toml migration: add project metadata and setuptools config Populate pyproject.toml with PEP 621 project metadata and setuptools configuration: set build-system requirements (setuptools>=64, wheel, setuptools_scm[toml]>=7), declare package name, description, python requirement, license, authors, classifiers, dependencies, project URLs and napari entry-point. Configure setuptools to use src layout, include package data (napari.yaml), mark version as dynamic (setuptools-scm), and add optional testing dependencies. Minor whitespace/qt_api line adjustments preserved. --- pyproject.toml | 84 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 594660f9..efd95704 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,89 @@ [build-system] -requires = ["setuptools", "wheel", "setuptools_scm"] +requires = [ + "setuptools>=64", + "wheel", + "setuptools_scm[toml]>=7" +] build-backend = "setuptools.build_meta" +[project] +name = "napari-deeplabcut" +description = "napari + DeepLabCut annotation tool" +readme = { file = "README.md", content-type = "text/markdown" } +requires-python = ">=3.10" +license = { text = "LGPL-3.0" } + +authors = [ + { name = "Team DeepLabCut, Lead by Jessy Lauer", email = "admin@deeplabcut.org" } +] + +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Framework :: napari", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Scientific/Engineering :: Image Processing", + "Topic :: Scientific/Engineering :: Visualization", +] + +dependencies = [ + "dask-image", + "matplotlib>=3.3", + "napari==0.6.6", + "natsort", + "numpy>=1.18.5,<2.0.0", + "opencv-python-headless", + "pandas", + "pyside6>=6.4.2", + "pyyaml", + "qtpy>=2.4", + "scikit-image", + "scipy", + "tables", +] + +# You are using setuptools-scm -> version is derived from git tags +dynamic = ["version"] + +[project.urls] +"Bug Tracker" = "https://github.com/DeepLabCut/napari-deeplabcut/issues" +Documentation = "https://github.com/DeepLabCut/napari-deeplabcut#README.md" +"Source Code" = "https://github.com/DeepLabCut/napari-deeplabcut" +"User Support" = "https://github.com/DeepLabCut/napari-deeplabcut/issues" + +[project.entry-points."napari.manifest"] +napari-deeplabcut = "napari_deeplabcut:napari.yaml" + +[project.optional-dependencies] +testing = [ + "Pillow", + "pytest", + "pytest-cov", + "pytest-qt", + "tox", +] + +# ---------------------------- +# setuptools configuration +# ---------------------------- +[tool.setuptools] +include-package-data = true + +[tool.setuptools.package-dir] +"" = "src" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +napari_deeplabcut = ["napari.yaml"] + +# ---------------------------- +# existing tool configuration +# ---------------------------- [tool.ruff] lint.select = ["E", "F", "B", "I", "UP"] lint.ignore = ["E741"] From cb5cdb081774ef7771f09e3f76840beb5415470b Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:04:42 +0100 Subject: [PATCH 2/7] Bump setuptools and normalize license metadata Update pyproject.toml: raise build-system requirement to setuptools>=77 and replace the license table with license = "LGPL-3.0-only" plus license-files = ["LICENSE"]. These changes align packaging metadata with newer setuptools/PEP expectations and ensure the license file is included. --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index efd95704..6e303024 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "setuptools>=64", + "setuptools>=77", "wheel", "setuptools_scm[toml]>=7" ] @@ -11,7 +11,8 @@ name = "napari-deeplabcut" description = "napari + DeepLabCut annotation tool" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.10" -license = { text = "LGPL-3.0" } +license = "LGPL-3.0-only" +license-files = ["LICENSE"] authors = [ { name = "Team DeepLabCut, Lead by Jessy Lauer", email = "admin@deeplabcut.org" } From 2c9b15330f811e10742f3d670d5953f23374fb1f Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:08:07 +0100 Subject: [PATCH 3/7] Add LGPLv3 classifier and update comment Add GNU Lesser General Public License v3 (LGPLv3) to the project classifiers in pyproject.toml to explicitly declare the license. Also rephrase the setuptools-scm comment for clarity that the version is derived from git tags. --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6e303024..6b77026f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Image Processing", "Topic :: Scientific/Engineering :: Visualization", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)" ] dependencies = [ @@ -46,7 +47,7 @@ dependencies = [ "tables", ] -# You are using setuptools-scm -> version is derived from git tags +# Using setuptools-scm -> version is derived from git tags dynamic = ["version"] [project.urls] From 8e1dd77231e3bca4adccf531bc56b7de9f9b6eb4 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:10:30 +0100 Subject: [PATCH 4/7] Add pyproject-fmt & validate hooks; configure fmt Add pyproject-fmt and validate-pyproject to pre-commit to enforce and validate pyproject.toml formatting. Add [tool.pyproject-fmt] settings in pyproject.toml to set max_supported_python to 3.12, enable generation of Python version classifiers, and keep tables in long format to preserve readability. --- .pre-commit-config.yaml | 8 +++++ pyproject.toml | 79 +++++++++++++++++++---------------------- 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 77f27c91..3d40485f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,6 +17,14 @@ repos: # Run the linter. - id: ruff-check args: [--fix,--unsafe-fixes] + - repo: https://github.com/tox-dev/pyproject-fmt + rev: v2.15.2 + hooks: + - id: pyproject-fmt + - repo: https://github.com/abravalheri/validate-pyproject + rev: v0.25 + hooks: + - id: validate-pyproject - repo: https://github.com/tlambert03/napari-plugin-checks rev: v0.3.0 hooks: diff --git a/pyproject.toml b/pyproject.toml index 6b77026f..4e93006f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,42 +1,36 @@ [build-system] -requires = [ - "setuptools>=77", - "wheel", - "setuptools_scm[toml]>=7" -] build-backend = "setuptools.build_meta" +requires = [ "setuptools>=77", "setuptools-scm[toml]>=7", "wheel" ] [project] name = "napari-deeplabcut" description = "napari + DeepLabCut annotation tool" readme = { file = "README.md", content-type = "text/markdown" } -requires-python = ">=3.10" license = "LGPL-3.0-only" -license-files = ["LICENSE"] - -authors = [ - { name = "Team DeepLabCut, Lead by Jessy Lauer", email = "admin@deeplabcut.org" } -] - +license-files = [ "LICENSE" ] +requires-python = ">=3.10" classifiers = [ "Development Status :: 2 - Pre-Alpha", "Framework :: napari", "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", - "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Image Processing", "Topic :: Scientific/Engineering :: Visualization", - "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)" ] - +# Using setuptools-scm -> version is derived from git tags +dynamic = [ "version" ] dependencies = [ "dask-image", "matplotlib>=3.3", "napari==0.6.6", "natsort", - "numpy>=1.18.5,<2.0.0", + "numpy>=1.18.5,<2", "opencv-python-headless", "pandas", "pyside6>=6.4.2", @@ -46,58 +40,59 @@ dependencies = [ "scipy", "tables", ] - -# Using setuptools-scm -> version is derived from git tags -dynamic = ["version"] - -[project.urls] -"Bug Tracker" = "https://github.com/DeepLabCut/napari-deeplabcut/issues" -Documentation = "https://github.com/DeepLabCut/napari-deeplabcut#README.md" -"Source Code" = "https://github.com/DeepLabCut/napari-deeplabcut" -"User Support" = "https://github.com/DeepLabCut/napari-deeplabcut/issues" - +[[project.authors]] +name = "Team DeepLabCut, Lead by Jessy Lauer" +email = "admin@deeplabcut.org" [project.entry-points."napari.manifest"] napari-deeplabcut = "napari_deeplabcut:napari.yaml" - [project.optional-dependencies] testing = [ - "Pillow", + "pillow", "pytest", "pytest-cov", "pytest-qt", "tox", ] +[project.urls] +"Bug Tracker" = "https://github.com/DeepLabCut/napari-deeplabcut/issues" +Documentation = "https://github.com/DeepLabCut/napari-deeplabcut#README.md" +"Source Code" = "https://github.com/DeepLabCut/napari-deeplabcut" +"User Support" = "https://github.com/DeepLabCut/napari-deeplabcut/issues" # ---------------------------- # setuptools configuration # ---------------------------- [tool.setuptools] include-package-data = true - +[tool.setuptools.package-data] +napari_deeplabcut = [ "napari.yaml" ] [tool.setuptools.package-dir] "" = "src" - [tool.setuptools.packages.find] -where = ["src"] +where = [ "src" ] -[tool.setuptools.package-data] -napari_deeplabcut = ["napari.yaml"] +[tool.setuptools_scm] +write_to = "src/napari_deeplabcut/_version.py" + +[tool.uv] +package = true # ---------------------------- # existing tool configuration # ---------------------------- [tool.ruff] -lint.select = ["E", "F", "B", "I", "UP"] -lint.ignore = ["E741"] target-version = "py310" -fix = true line-length = 120 - -[tool.uv] -package = true - -[tool.setuptools_scm] -write_to = "src/napari_deeplabcut/_version.py" +fix = true +[tool.ruff.lint] +select = [ "E", "F", "B", "I", "UP" ] +ignore = [ "E741" ] + +[tool.pyproject-fmt] +max_supported_python = "3.12" +generate_python_version_classifiers = true +# Avoid collapsing tables to field.key = value format (less readable) +table_format = "long" [tool.pytest.ini_options] qt_api = "pyside6" From ca984b94bfb3188b061b22cdddf079135798ee10 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:16:49 +0100 Subject: [PATCH 5/7] Delete setup.cfg --- setup.cfg | 67 ------------------------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index fe16cb09..00000000 --- a/setup.cfg +++ /dev/null @@ -1,67 +0,0 @@ -[metadata] -name = napari-deeplabcut -description = napari + DeepLabCut annotation tool -long_description = file: README.md -long_description_content_type = text/markdown -url = https://github.com/DeepLabCut/napari-deeplabcut -author = Team DeepLabCut, Lead by Jessy Lauer -author_email = admin@deeplabcut.org -license = LGPL-3.0 -license_files = LICENSE -classifiers = - Development Status :: 2 - Pre-Alpha - Framework :: napari - Intended Audience :: Developers - Operating System :: OS Independent - Programming Language :: Python :: 3 - Programming Language :: Python :: 3 :: Only - Topic :: Scientific/Engineering :: Artificial Intelligence - Topic :: Scientific/Engineering :: Image Processing - Topic :: Scientific/Engineering :: Visualization -project_urls = - Bug Tracker = https://github.com/DeepLabCut/napari-deeplabcut/issues - Documentation = https://github.com/DeepLabCut/napari-deeplabcut#README.md - Source Code = https://github.com/DeepLabCut/napari-deeplabcut - User Support = https://github.com/DeepLabCut/napari-deeplabcut/issues - -[options] -packages = find: -install_requires = - dask-image - matplotlib>=3.3 - napari==0.6.6 - natsort - numpy>=1.18.5,<2.0.0 - opencv-python-headless - pandas - pyside6>=6.4.2 - pyyaml - qtpy>=2.4 - scikit-image - scipy - tables -python_requires = >=3.10 -include_package_data = True -package_dir = - =src -setup_requires = - setuptools-scm - -[options.packages.find] -where = src - -[options.entry_points] -napari.manifest = - napari-deeplabcut = napari_deeplabcut:napari.yaml - -[options.extras_require] -testing = - Pillow - pytest - pytest-cov - pytest-qt - tox - -[options.package_data] -napari_deeplabcut = - napari.yaml From 87d39c946839ae952b574f8931c0f60ed1f6b1a6 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:18:13 +0100 Subject: [PATCH 6/7] Remove LGPLv3 license classifier Delete the GNU Lesser General Public License v3 trove classifier from pyproject.toml to correct package metadata, following PEP 639 --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4e93006f..19ddbb69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ classifiers = [ "Development Status :: 2 - Pre-Alpha", "Framework :: napari", "Intended Audience :: Developers", - "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", From ea64aabccb1bb9c75be1a26cd8eb3874edf4bb29 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 4 Mar 2026 10:44:29 +0100 Subject: [PATCH 7/7] Remove setup-cfg-fmt hook and fix author casing Remove the setup-cfg-fmt hook from .pre-commit-config.yaml. Correct a grammar/casing issue in pyproject.toml by changing the author line from "Lead by Jessy Lauer" to "led by Jessy Lauer". --- .pre-commit-config.yaml | 4 ---- pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3d40485f..ea9d503c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,10 +5,6 @@ repos: - id: check-docstring-first - id: end-of-file-fixer - id: trailing-whitespace - - repo: https://github.com/asottile/setup-cfg-fmt - rev: v3.2.0 - hooks: - - id: setup-cfg-fmt - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.10 hooks: diff --git a/pyproject.toml b/pyproject.toml index 19ddbb69..afc982af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ dependencies = [ "tables", ] [[project.authors]] -name = "Team DeepLabCut, Lead by Jessy Lauer" +name = "Team DeepLabCut, led by Jessy Lauer" email = "admin@deeplabcut.org" [project.entry-points."napari.manifest"] napari-deeplabcut = "napari_deeplabcut:napari.yaml"