From c2402f405fb1453e0ee78a07fca24539d66e586f Mon Sep 17 00:00:00 2001
From: David Douard <david.douard@sdfa3.org>
Date: Fri, 24 Nov 2023 18:15:13 +0100
Subject: [PATCH] Migrate to copier-based swh-py-template

---
 .copier-answers.yml     |  11 ++++
 .gitignore              |  16 +++---
 .pre-commit-config.yaml |  23 +++++----
 AUTHORS                 |   3 ++
 MANIFEST.in             |   8 ---
 docs/Makefile           |   2 +-
 mypy.ini                |   8 +--
 pyproject.toml          |  86 ++++++++++++++++++++++++++++++
 setup.py                | 112 ----------------------------------------
 swh/__init__.py         |   3 --
 tox.ini                 |  51 +++++++-----------
 11 files changed, 144 insertions(+), 179 deletions(-)
 create mode 100644 .copier-answers.yml
 create mode 100644 AUTHORS
 delete mode 100644 MANIFEST.in
 delete mode 100755 setup.py
 delete mode 100644 swh/__init__.py

diff --git a/.copier-answers.yml b/.copier-answers.yml
new file mode 100644
index 00000000..3c7bb49f
--- /dev/null
+++ b/.copier-answers.yml
@@ -0,0 +1,11 @@
+# Changes here will be overwritten by Copier
+_commit: v0.1.5
+_src_path: https://gitlab.softwareheritage.org/swh/devel/swh-py-template.git
+description: Software Heritage lister
+distribution_name: swh-lister
+have_cli: true
+have_workers: true
+package_root: swh/lister
+project_name: swh.lister
+python_minimal_version: '3.7'
+readme_format: rst
diff --git a/.gitignore b/.gitignore
index 999e8688..035b1395 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,12 @@
+*.egg-info/
 *.pyc
-*.sw?
-*~
-/.coverage
-/.coverage.*
+.coverage
 .eggs/
+.hypothesis
+.mypy_cache
+.tox
 __pycache__
 build/
 dist/
-*.egg-info
-version.txt
-.tox/
-.mypy_cache/
-/.hypothesis/
+docs/README.rst
+docs/README.md
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 63607d6f..22f277c1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,13 +1,23 @@
 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.3.0
+    rev: v4.4.0
     hooks:
       - id: trailing-whitespace
       - id: check-json
       - id: check-yaml
 
+  - repo: https://github.com/python/black
+    rev: 23.1.0
+    hooks:
+      - id: black
+
+  - repo: https://github.com/PyCQA/isort
+    rev: 5.12.0
+    hooks:
+      - id: isort
+
   - repo: https://github.com/pycqa/flake8
-    rev: 5.0.4
+    rev: 6.0.0
     hooks:
       - id: flake8
         additional_dependencies: [flake8-bugbear==22.9.23]
@@ -31,12 +41,3 @@ repos:
         language: system
         types: [python]
 
-  - repo: https://github.com/PyCQA/isort
-    rev: 5.11.5
-    hooks:
-      - id: isort
-
-  - repo: https://github.com/python/black
-    rev: 22.10.0
-    hooks:
-      - id: black
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 00000000..d5bc532d
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,3 @@
+Copyright (C) 2019-2023 The Software Heritage developers
+
+See http://www.softwareheritage.org/ for more information.
diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index 2f90a77b..00000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1,8 +0,0 @@
-include Makefile
-include README
-include requirements*.txt
-include version.txt
-include conftest.py
-include swh/lister/cran/list_all_packages.R
-recursive-include swh/lister/*/tests/data/ *
-recursive-include swh py.typed
diff --git a/docs/Makefile b/docs/Makefile
index c30c50ab..85f23e85 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1 +1 @@
-include ../../swh-docs/Makefile.sphinx
+include swh-docs/Makefile.sphinx
diff --git a/mypy.ini b/mypy.ini
index baa6ce50..da4d2d88 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -1,6 +1,9 @@
 [mypy]
 namespace_packages = True
 warn_unused_ignores = True
+explicit_package_bases = True
+# ^ Needed for mypy to detect py.typed from swh packages installed
+# in editable mode
 
 # 3rd party libraries without stubs (yet)
 
@@ -34,9 +37,6 @@ ignore_missing_imports = True
 [mypy-pyreadr.*]
 ignore_missing_imports = True
 
-[mypy-pytest.*]
-ignore_missing_imports = True
-
 [mypy-pytest_postgresql.*]
 ignore_missing_imports = True
 
@@ -63,3 +63,5 @@ ignore_missing_imports = True
 
 [mypy-defusedxml.*]
 ignore_missing_imports = True
+# [mypy-add_your_lib_here.*]
+# ignore_missing_imports = True
diff --git a/pyproject.toml b/pyproject.toml
index 69b8f4dd..dd1b0c21 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,89 @@
+[project]
+name = "swh.lister"
+authors = [
+    {name="Software Heritage developers", email="swh-devel@inria.fr"},
+]
+
+description = "Software Heritage lister"
+readme = {file = "README.rst", content-type = "text/x-rst"}
+requires-python = ">=3.7"
+classifiers = [
+    "Programming Language :: Python :: 3",
+    "Intended Audience :: Developers",
+    "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
+    "Operating System :: OS Independent",
+    "Development Status :: 5 - Production/Stable",
+]
+dynamic = ["version", "dependencies", "optional-dependencies"]
+
+[tool.setuptools.packages.find]
+include = ["swh.*"]
+
+[tool.setuptools.dynamic]
+dependencies = {file = ["requirements.txt", "requirements-swh.txt"]}
+
+[tool.setuptools.dynamic.optional-dependencies]
+testing = {file = ["requirements-test.txt"]}
+
+[project.entry-points."swh.cli.subcommands"]
+"swh.lister" = "swh.lister.cli"
+
+[project.entry-points."swh.workers"]
+"swh.lister.arch" = "swh.lister.arch:register"
+"swh.lister.aur" = "swh.lister.aur:register"
+"swh.lister.bitbucket" = "swh.lister.bitbucket:register"
+"swh.lister.bower" = "swh.lister.bower:register"
+"swh.lister.cgit" = "swh.lister.cgit:register"
+"swh.lister.conda" = "swh.lister.conda:register"
+"swh.lister.cpan" = "swh.lister.cpan:register"
+"swh.lister.cran" = "swh.lister.cran:register"
+"swh.lister.crates" = "swh.lister.crates:register"
+"swh.lister.debian" = "swh.lister.debian:register"
+"swh.lister.dlang" = "swh.lister.dlang:register"
+"swh.lister.gitea" = "swh.lister.gitea:register"
+"swh.lister.github" = "swh.lister.github:register"
+"swh.lister.gitiles" = "swh.lister.gitiles:register"
+"swh.lister.gitlab" = "swh.lister.gitlab:register"
+"swh.lister.gitweb" = "swh.lister.gitweb:register"
+"swh.lister.gnu" = "swh.lister.gnu:register"
+"swh.lister.golang" = "swh.lister.golang:register"
+"swh.lister.gogs" = "swh.lister.gogs:register"
+"swh.lister.hackage" = "swh.lister.hackage:register"
+"swh.lister.hex" = "swh.lister.hex:register"
+"swh.lister.julia" = "swh.lister.julia:register"
+"swh.lister.launchpad" = "swh.lister.launchpad:register"
+"swh.lister.nixguix" = "swh.lister.nixguix:register"
+"swh.lister.npm" = "swh.lister.npm:register"
+"swh.lister.nuget" = "swh.lister.nuget:register"
+"swh.lister.opam" = "swh.lister.opam:register"
+"swh.lister.packagist" = "swh.lister.packagist:register"
+"swh.lister.pagure" = "swh.lister.pagure:register"
+"swh.lister.phabricator" = "swh.lister.phabricator:register"
+"swh.lister.pubdev" = "swh.lister.pubdev:register"
+"swh.lister.puppet" = "swh.lister.puppet:register"
+"swh.lister.pypi" = "swh.lister.pypi:register"
+"swh.lister.rpm" = "swh.lister.rpm:register"
+"swh.lister.rubygems" = "swh.lister.rubygems:register"
+"swh.lister.sourceforge" = "swh.lister.sourceforge:register"
+"swh.lister.stagit" = "swh.lister.stagit:register"
+"swh.lister.tuleap" = "swh.lister.tuleap:register"
+"swh.lister.maven" = "swh.lister.maven:register"
+"swh.lister.bioconductor" = "swh.lister.bioconductor:register"
+
+[project.urls]
+"Homepage" = "https://gitlab.softwareheritage.org/swh/devel/swh-lister"
+"Bug Reports" = "https://gitlab.softwareheritage.org/swh/devel/swh-lister/-/issues"
+"Funding" = "https://www.softwareheritage.org/donate"
+"Documentation" = "https://docs.softwareheritage.org/devel/swh-lister/"
+"Source" = "https://gitlab.softwareheritage.org/swh/devel/swh-lister.git"
+
+[build-system]
+requires = ["setuptools", "setuptools-scm"]
+build-backend = "setuptools.build_meta"
+
+[tool.setuptools_scm]
+fallback_version = "0.0.1"
+
 [tool.black]
 target-version = ['py37']
 
diff --git a/setup.py b/setup.py
deleted file mode 100755
index cb4b008f..00000000
--- a/setup.py
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (C) 2015-2023  The Software Heritage developers
-# See the AUTHORS file at the top-level directory of this distribution
-# License: GNU General Public License version 3, or any later version
-# See top-level LICENSE file for more information
-
-from io import open
-from os import path
-
-from setuptools import find_packages, setup
-
-here = path.abspath(path.dirname(__file__))
-
-# Get the long description from the README file
-with open(path.join(here, "README.rst"), encoding="utf-8") as f:
-    long_description = f.read()
-
-
-def parse_requirements(name=None):
-    if name:
-        reqf = "requirements-%s.txt" % name
-    else:
-        reqf = "requirements.txt"
-
-    requirements = []
-    if not path.exists(reqf):
-        return requirements
-
-    with open(reqf) as f:
-        for line in f.readlines():
-            line = line.strip()
-            if not line or line.startswith("#"):
-                continue
-            requirements.append(line)
-    return requirements
-
-
-setup(
-    name="swh.lister",
-    description="Software Heritage lister",
-    long_description=long_description,
-    long_description_content_type="text/x-rst",
-    python_requires=">=3.7",
-    author="Software Heritage developers",
-    author_email="swh-devel@inria.fr",
-    url="https://forge.softwareheritage.org/diffusion/DLSGH/",
-    packages=find_packages(),
-    install_requires=parse_requirements() + parse_requirements("swh"),
-    tests_require=parse_requirements("test"),
-    setup_requires=["setuptools-scm"],
-    extras_require={"testing": parse_requirements("test")},
-    use_scm_version=True,
-    include_package_data=True,
-    entry_points="""
-        [swh.cli.subcommands]
-        lister=swh.lister.cli
-        [swh.workers]
-        lister.arch=swh.lister.arch:register
-        lister.aur=swh.lister.aur:register
-        lister.bitbucket=swh.lister.bitbucket:register
-        lister.bower=swh.lister.bower:register
-        lister.cgit=swh.lister.cgit:register
-        lister.conda=swh.lister.conda:register
-        lister.cpan=swh.lister.cpan:register
-        lister.cran=swh.lister.cran:register
-        lister.crates=swh.lister.crates:register
-        lister.debian=swh.lister.debian:register
-        lister.dlang=swh.lister.dlang:register
-        lister.gitea=swh.lister.gitea:register
-        lister.github=swh.lister.github:register
-        lister.gitiles=swh.lister.gitiles:register
-        lister.gitlab=swh.lister.gitlab:register
-        lister.gitweb=swh.lister.gitweb:register
-        lister.gnu=swh.lister.gnu:register
-        lister.golang=swh.lister.golang:register
-        lister.gogs=swh.lister.gogs:register
-        lister.hackage=swh.lister.hackage:register
-        lister.hex=swh.lister.hex:register
-        lister.julia=swh.lister.julia:register
-        lister.launchpad=swh.lister.launchpad:register
-        lister.nixguix=swh.lister.nixguix:register
-        lister.npm=swh.lister.npm:register
-        lister.nuget=swh.lister.nuget:register
-        lister.opam=swh.lister.opam:register
-        lister.packagist=swh.lister.packagist:register
-        lister.pagure=swh.lister.pagure:register
-        lister.phabricator=swh.lister.phabricator:register
-        lister.pubdev=swh.lister.pubdev:register
-        lister.puppet=swh.lister.puppet:register
-        lister.pypi=swh.lister.pypi:register
-        lister.rpm=swh.lister.rpm:register
-        lister.rubygems=swh.lister.rubygems:register
-        lister.sourceforge=swh.lister.sourceforge:register
-        lister.stagit=swh.lister.stagit:register
-        lister.tuleap=swh.lister.tuleap:register
-        lister.maven=swh.lister.maven:register
-        lister.bioconductor=swh.lister.bioconductor:register
-    """,
-    classifiers=[
-        "Programming Language :: Python :: 3",
-        "Intended Audience :: Developers",
-        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
-        "Operating System :: OS Independent",
-        "Development Status :: 5 - Production/Stable",
-    ],
-    project_urls={
-        "Bug Reports": "https://forge.softwareheritage.org/maniphest",
-        "Funding": "https://www.softwareheritage.org/donate",
-        "Source": "https://forge.softwareheritage.org/source/swh-lister",
-        "Documentation": "https://docs.softwareheritage.org/devel/swh-lister/",
-    },
-)
diff --git a/swh/__init__.py b/swh/__init__.py
deleted file mode 100644
index b36383a6..00000000
--- a/swh/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from pkgutil import extend_path
-
-__path__ = extend_path(__path__, __name__)
diff --git a/tox.ini b/tox.ini
index 83ee868a..0df11b76 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,22 +1,27 @@
 [tox]
-requires =
-  tox>4
-envlist=black,flake8,mypy,py3
+minversion = 4
+envlist =
+  black
+  flake8
+  mypy
+  py3
 
 [testenv]
 extras =
   testing
 deps =
-  swh.core[http] >= 0.0.61
-  swh.scheduler[testing] >= 0.5.0
-  amqp != 5.0.4
   pytest-cov
-  dev: ipdb
 commands =
-  pytest \
-  !dev: --cov={envsitepackagesdir}/swh/lister/ --cov-branch \
-        --doctest-modules \
-         {envsitepackagesdir}/swh/lister/ {posargs}
+  pytest --doctest-modules \
+         --import-mode importlib \
+         --rootdir {envsitepackagesdir} \
+         --cov={envsitepackagesdir}/swh/lister \
+         --cov-branch \
+         {envsitepackagesdir}/swh/lister \
+         {posargs}
+# --rootdir and --import-mode are required to make tests that depends
+# on the test file to be a proper submodule of the swh namespace after
+# migration to PEP420 (implicit namespace).
 
 [testenv:black]
 skip_install = true
@@ -47,32 +52,14 @@ commands =
 # breaking doc build
 [testenv:sphinx]
 allowlist_externals = make
-usedevelop = true
 extras =
   testing
 deps =
-  # fetch and install swh-docs in develop mode
-  -e git+https://gitlab.softwareheritage.org/swh/devel/swh-docs.git\#egg=swh.docs
+  # fetch and install swh-docs
+  git+https://gitlab.softwareheritage.org/swh/devel/swh-docs.git\#egg=swh.docs
 setenv =
   SWH_PACKAGE_DOC_TOX_BUILD = 1
   # turn warnings into errors
   SPHINXOPTS = -W
 commands =
-  make -I ../.tox/sphinx/src/swh-docs/swh/ -C docs
-
-# build documentation only inside swh-environment using local state
-# of swh-docs package
-[testenv:sphinx-dev]
-allowlist_externals = make
-usedevelop = true
-extras =
-  testing
-deps =
-  # install swh-docs in develop mode
-  -e ../swh-docs
-setenv =
-  SWH_PACKAGE_DOC_TOX_BUILD = 1
-  # turn warnings into errors
-  SPHINXOPTS = -W
-commands =
-  make -I ../.tox/sphinx-dev/src/swh-docs/swh/ -C docs
+  make -I {env_dir}/share/ -C docs
-- 
GitLab