From 84f0219e9b2a8ee9264a717cf8e6647c050a53fc Mon Sep 17 00:00:00 2001
From: Andre Anjos <andre.dos.anjos@gmail.com>
Date: Wed, 20 Mar 2024 18:13:47 +0100
Subject: [PATCH] [pyproject] Use hatch and versioningit for modern project
 management

---
 MANIFEST.in                                   |   7 --
 conda/meta.yaml                               |   4 +-
 pyproject.toml                                | 111 ++++++++++--------
 setup.py                                      |   7 --
 src/idiap_devtools/click.py                   |   2 -
 src/idiap_devtools/conda.py                   |   2 -
 src/idiap_devtools/gitlab/__init__.py         |   2 -
 src/idiap_devtools/gitlab/changelog.py        |   2 -
 src/idiap_devtools/gitlab/release.py          |   2 -
 src/idiap_devtools/gitlab/runners.py          |   2 -
 src/idiap_devtools/profile.py                 |   2 -
 src/idiap_devtools/python.py                  |   2 -
 src/idiap_devtools/scripts/cli.py             |   2 -
 src/idiap_devtools/scripts/env.py             |   4 +-
 src/idiap_devtools/scripts/fullenv.py         |   2 -
 src/idiap_devtools/scripts/gitlab/__init__.py |   2 -
 src/idiap_devtools/scripts/gitlab/badges.py   |   2 -
 .../scripts/gitlab/changelog.py               |   2 -
 src/idiap_devtools/scripts/gitlab/getpath.py  |   2 -
 src/idiap_devtools/scripts/gitlab/jobs.py     |   2 -
 src/idiap_devtools/scripts/gitlab/lasttag.py  |   2 -
 src/idiap_devtools/scripts/gitlab/release.py  |   2 -
 src/idiap_devtools/scripts/gitlab/runners.py  |   2 -
 src/idiap_devtools/scripts/gitlab/settings.py |   2 -
 src/idiap_devtools/scripts/update_pins.py     |   2 -
 src/idiap_devtools/update_pins.py             |   2 -
 src/idiap_devtools/utils.py                   |   2 -
 27 files changed, 66 insertions(+), 111 deletions(-)
 delete mode 100644 MANIFEST.in
 delete mode 100644 setup.py

diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index 175644b..0000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
-#
-# SPDX-License-Identifier: BSD-3-Clause
-
-include LICENSES/*.txt
-recursive-include doc *.rst *.ico *.png *.json *.txt
-recursive-include tests *.py
diff --git a/conda/meta.yaml b/conda/meta.yaml
index fe2828f..d62ef88 100644
--- a/conda/meta.yaml
+++ b/conda/meta.yaml
@@ -6,7 +6,7 @@
 
 package:
   name: {{ data['project']['name'] }}
-  version: {{ data['project']['version'] }}
+  version: {{ environ.get('PACKAGE_VERSION', environ.get('GIT_DESCRIBE_TAG')) }}
 
 source:
   path: ..
@@ -23,6 +23,8 @@ requirements:
   host:
     - python >=3.10
     - pip
+    - hatchling
+    - versioningit
   run:
     - python >=3.10
     - pip
diff --git a/pyproject.toml b/pyproject.toml
index 36ed5da..9da1ad7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,41 +3,65 @@
 # SPDX-License-Identifier: BSD-3-Clause
 
 [build-system]
-    requires = ["setuptools>=61.0.0", "wheel"]
-    build-backend = "setuptools.build_meta"
+requires = ["hatchling", "versioningit"]
+build-backend = "hatchling.build"
 
 [project]
 name = "idiap-devtools"
-version = "1.0.1b0"
+dynamic = ["version"]
 requires-python = ">=3.10"
 description = "This package contains a *pot-pourri* of various tools required to develop python packages at Idiap's GitLab infrastructure"
 readme = "README.md"
-license = {text = "BSD 3-Clause License"}
-authors = [
-  {name = "Andre Anjos", email = "andre.anjos@idiap.ch"},
-]
+license = { text = "BSD 3-Clause License" }
+authors = [{ name = "Andre Anjos", email = "andre.anjos@idiap.ch" }]
 classifiers = [
-    "Development Status :: 4 - Beta",
-    "Intended Audience :: Developers",
-    "License :: OSI Approved :: BSD License",
-    "Natural Language :: English",
-    "Programming Language :: Python :: 3",
-    "Topic :: Software Development :: Libraries :: Python Modules",
+  "Development Status :: 4 - Beta",
+  "Intended Audience :: Developers",
+  "License :: OSI Approved :: BSD License",
+  "Natural Language :: English",
+  "Programming Language :: Python :: 3",
+  "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 dependencies = [
-    "click>=8",
-    "cookiecutter",
-    "gitpython",
-    "packaging",
-    "python-dateutil",
-    "python-gitlab",
-    "pytz",
-    "pyyaml",
-    "setuptools",
-    "tomli",
-    "tomlkit",
-    "xdg",
-    ]
+  "click>=8",
+  "cookiecutter",
+  "gitpython",
+  "packaging",
+  "python-dateutil",
+  "python-gitlab",
+  "pytz",
+  "pyyaml",
+  "setuptools",
+  "tomli",
+  "tomlkit",
+  "xdg",
+]
+
+[tool.hatch.version]
+source = "versioningit"
+
+[tool.versioningit.next-version]
+method = "smallest"
+
+[tool.versioningit.format]
+# Example formatted version: 1.2.4.dev42+ge174a1f
+distance = "{next_version}.dev{distance}+{vcs}{rev}"
+# Example formatted version: 1.2.4.dev42+ge174a1f.d20230922
+distance-dirty = "{next_version}.dev{distance}+{vcs}{rev}.d{build_date:%Y%m%d}"
+
+[tool.hatch.build.targets.sdist]
+include = [
+  "src/**/*.py",
+  "tests/**/*.py",
+  "doc/**/*.rst",
+  "doc/**/*.py",
+  "doc/*.json",
+  "doc/*.txt",
+  "LICENSES/*.txt",
+]
+
+[tool.hatch.build.targets.wheel]
+packages = ["src/idiap_devtools"]
 
 [project.urls]
 documentation = "https://idiap-devtools.readthedocs.io/en/latest/"
@@ -48,30 +72,19 @@ changelog = "https://gitlab.idiap.ch/software/idiap-devtools/-/releases"
 [project.optional-dependencies]
 qa = ["pre-commit"]
 doc = [
-    "sphinx",
-    "furo",
-    "sphinx-autodoc-typehints",
-    "sphinx-copybutton",
-    "sphinx-inline-tabs",
-    "sphinx-click",
-    "auto-intersphinx",
-    ]
-test = [
-    "pytest",
-    "pytest-cov",
-    "coverage",
-    ]
+  "sphinx",
+  "furo",
+  "sphinx-autodoc-typehints",
+  "sphinx-copybutton",
+  "sphinx-inline-tabs",
+  "sphinx-click",
+  "auto-intersphinx",
+]
+test = ["pytest", "pytest-cov", "coverage"]
 
 [project.scripts]
 devtool = "idiap_devtools.scripts.cli:cli"
 
-[tool.setuptools]
-zip-safe = true
-package-dir = {"" = "src"}
-
-[tool.distutils.bdist_wheel]
-universal = true
-
 [tool.isort]
 profile = "black"
 line_length = 80
@@ -83,9 +96,9 @@ line-length = 80
 
 [tool.pytest.ini_options]
 addopts = [
-    "--cov=idiap_devtools",
-    "--cov-report=term-missing",
-    "--import-mode=append",
+  "--cov=idiap_devtools",
+  "--cov-report=term-missing",
+  "--import-mode=append",
 ]
 junit_logging = "all"
 junit_log_passing_tests = false
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 6aeeebe..0000000
--- a/setup.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
-#
-# SPDX-License-Identifier: BSD-3-Clause
-
-from setuptools import setup
-
-setup()
diff --git a/src/idiap_devtools/click.py b/src/idiap_devtools/click.py
index 0d6d1a7..fcd9e97 100644
--- a/src/idiap_devtools/click.py
+++ b/src/idiap_devtools/click.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import logging
 import typing
 
diff --git a/src/idiap_devtools/conda.py b/src/idiap_devtools/conda.py
index 02df01f..ddc8ce4 100644
--- a/src/idiap_devtools/conda.py
+++ b/src/idiap_devtools/conda.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import contextlib
 import copy
 import logging
diff --git a/src/idiap_devtools/gitlab/__init__.py b/src/idiap_devtools/gitlab/__init__.py
index ff6dd88..4fd9f56 100644
--- a/src/idiap_devtools/gitlab/__init__.py
+++ b/src/idiap_devtools/gitlab/__init__.py
@@ -3,8 +3,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 """Utilities to interact with GitLab."""
 
-from __future__ import annotations
-
 import logging
 import os
 import pathlib
diff --git a/src/idiap_devtools/gitlab/changelog.py b/src/idiap_devtools/gitlab/changelog.py
index cbb17d9..df7e3aa 100644
--- a/src/idiap_devtools/gitlab/changelog.py
+++ b/src/idiap_devtools/gitlab/changelog.py
@@ -3,8 +3,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 """Utilities for retrieving, parsing and auto-generating changelogs."""
 
-from __future__ import annotations
-
 import datetime
 import io
 import logging
diff --git a/src/idiap_devtools/gitlab/release.py b/src/idiap_devtools/gitlab/release.py
index fe02ede..6662c79 100644
--- a/src/idiap_devtools/gitlab/release.py
+++ b/src/idiap_devtools/gitlab/release.py
@@ -3,8 +3,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 """Utilities to needed to release packages."""
 
-from __future__ import annotations
-
 import difflib
 import logging
 import re
diff --git a/src/idiap_devtools/gitlab/runners.py b/src/idiap_devtools/gitlab/runners.py
index 8392edf..983faf5 100644
--- a/src/idiap_devtools/gitlab/runners.py
+++ b/src/idiap_devtools/gitlab/runners.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import logging
 import pathlib
 import typing
diff --git a/src/idiap_devtools/profile.py b/src/idiap_devtools/profile.py
index 8edfffc..2e49c2f 100644
--- a/src/idiap_devtools/profile.py
+++ b/src/idiap_devtools/profile.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import io
 import os
 import pathlib
diff --git a/src/idiap_devtools/python.py b/src/idiap_devtools/python.py
index 83f48a8..64b9e66 100644
--- a/src/idiap_devtools/python.py
+++ b/src/idiap_devtools/python.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import pkg_resources
 import tomli
 
diff --git a/src/idiap_devtools/scripts/cli.py b/src/idiap_devtools/scripts/cli.py
index 62cc419..5c9a87c 100644
--- a/src/idiap_devtools/scripts/cli.py
+++ b/src/idiap_devtools/scripts/cli.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import click
 
 from ..click import AliasedGroup
diff --git a/src/idiap_devtools/scripts/env.py b/src/idiap_devtools/scripts/env.py
index d0d55dc..784633a 100644
--- a/src/idiap_devtools/scripts/env.py
+++ b/src/idiap_devtools/scripts/env.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import sys
 import typing
 
@@ -258,7 +256,7 @@ def _add_missing_conda_pins(
     epilog="""
 Examples:
 
-  1. Creates an environment installation plan for developing the currently
+  1. Creates a conda environment installation plan for developing the currently
      checked-out package, and the development profile in ``../profile``:
 
      .. code:: sh
diff --git a/src/idiap_devtools/scripts/fullenv.py b/src/idiap_devtools/scripts/fullenv.py
index b6eb41f..bfa83c5 100644
--- a/src/idiap_devtools/scripts/fullenv.py
+++ b/src/idiap_devtools/scripts/fullenv.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import sys
 
 import click
diff --git a/src/idiap_devtools/scripts/gitlab/__init__.py b/src/idiap_devtools/scripts/gitlab/__init__.py
index 72fad1f..ad63e2b 100644
--- a/src/idiap_devtools/scripts/gitlab/__init__.py
+++ b/src/idiap_devtools/scripts/gitlab/__init__.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import click
 
 from ...click import AliasedGroup
diff --git a/src/idiap_devtools/scripts/gitlab/badges.py b/src/idiap_devtools/scripts/gitlab/badges.py
index 1eb2699..22968f5 100644
--- a/src/idiap_devtools/scripts/gitlab/badges.py
+++ b/src/idiap_devtools/scripts/gitlab/badges.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import click
 
 from ...click import PreserveIndentCommand, verbosity_option
diff --git a/src/idiap_devtools/scripts/gitlab/changelog.py b/src/idiap_devtools/scripts/gitlab/changelog.py
index 8e6d606..d286bdc 100644
--- a/src/idiap_devtools/scripts/gitlab/changelog.py
+++ b/src/idiap_devtools/scripts/gitlab/changelog.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import sys
 
 import click
diff --git a/src/idiap_devtools/scripts/gitlab/getpath.py b/src/idiap_devtools/scripts/gitlab/getpath.py
index 67de11f..4e0d763 100644
--- a/src/idiap_devtools/scripts/gitlab/getpath.py
+++ b/src/idiap_devtools/scripts/gitlab/getpath.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import click
 
 from ...click import PreserveIndentCommand, verbosity_option
diff --git a/src/idiap_devtools/scripts/gitlab/jobs.py b/src/idiap_devtools/scripts/gitlab/jobs.py
index d37bebf..a69e3d9 100644
--- a/src/idiap_devtools/scripts/gitlab/jobs.py
+++ b/src/idiap_devtools/scripts/gitlab/jobs.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import click
 
 from ...click import PreserveIndentCommand, verbosity_option
diff --git a/src/idiap_devtools/scripts/gitlab/lasttag.py b/src/idiap_devtools/scripts/gitlab/lasttag.py
index f1c986d..936b894 100644
--- a/src/idiap_devtools/scripts/gitlab/lasttag.py
+++ b/src/idiap_devtools/scripts/gitlab/lasttag.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import click
 
 from ...click import PreserveIndentCommand, verbosity_option
diff --git a/src/idiap_devtools/scripts/gitlab/release.py b/src/idiap_devtools/scripts/gitlab/release.py
index 51278b2..cb198d6 100644
--- a/src/idiap_devtools/scripts/gitlab/release.py
+++ b/src/idiap_devtools/scripts/gitlab/release.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import typing
 
 import click
diff --git a/src/idiap_devtools/scripts/gitlab/runners.py b/src/idiap_devtools/scripts/gitlab/runners.py
index 362d477..217229d 100644
--- a/src/idiap_devtools/scripts/gitlab/runners.py
+++ b/src/idiap_devtools/scripts/gitlab/runners.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import os
 
 import click
diff --git a/src/idiap_devtools/scripts/gitlab/settings.py b/src/idiap_devtools/scripts/gitlab/settings.py
index e9de2d1..ed6f866 100644
--- a/src/idiap_devtools/scripts/gitlab/settings.py
+++ b/src/idiap_devtools/scripts/gitlab/settings.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import typing
 
 import click
diff --git a/src/idiap_devtools/scripts/update_pins.py b/src/idiap_devtools/scripts/update_pins.py
index c1c2609..362c7e3 100644
--- a/src/idiap_devtools/scripts/update_pins.py
+++ b/src/idiap_devtools/scripts/update_pins.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import sys
 
 import click
diff --git a/src/idiap_devtools/update_pins.py b/src/idiap_devtools/update_pins.py
index 9a15837..6202063 100644
--- a/src/idiap_devtools/update_pins.py
+++ b/src/idiap_devtools/update_pins.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import contextlib
 import copy
 import logging
diff --git a/src/idiap_devtools/utils.py b/src/idiap_devtools/utils.py
index 2097f82..4fe17b0 100644
--- a/src/idiap_devtools/utils.py
+++ b/src/idiap_devtools/utils.py
@@ -2,8 +2,6 @@
 #
 # SPDX-License-Identifier: BSD-3-Clause
 
-from __future__ import annotations
-
 import logging
 import os
 import subprocess
-- 
GitLab