Repository: rottingresearch/linkrot (language: python)

Issue:
Move from `requirements.txt`, `requirements_dev.txt`, `setup.cfg`, and `setup.py` to `pyproject.toml`.
**Is your feature request related to a problem? Please describe.**
Hey @marshalmiller. As you may already know, the use of `setup.cfg`, `setup.py`, and `requirements.txt` files is quite [outdated](https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html). Because of [PEP 517](https://peps.python.org/pep-0517/), [PEP 660](https://peps.python.org/pep-0660/), and [PEP 631](https://peps.python.org/pep-0631/), the packaging is now being standardized on the usage of the `pyproject.toml` file.

**Describe the solution you'd like**
Given the above info, the project packaging should add support for `pyproject.toml`.

**Describe alternatives you've considered**
Not available.

**Additional context**
That's pretty much it. What do you think? Also, I would like to work on this issue.



Discussion / hints:

Fix patch:
diff --git a/Makefile b/Makefile
index 7f3c735..b18058d 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 
 deps:  ## Install dependencies
 	pip install -e .
-	pip install -r requirements_dev.txt
+	pip install -e .[dev]
 
 format:  ## Code formatting
 	black linkrot
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..7005ed2
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,66 @@
+[build-system]
+requires = ["hatchling>=1.8.0"]
+build-backend = "hatchling.build"
+
+[project]
+name = "linkrot"
+dynamic = ["version"]
+description = "Extract metadata and URLs from PDF files"
+readme = "README.md"
+license = "MIT"
+requires-python = ">=3.7"
+authors = [
+	{ name = "Marshal Miller", email = "marshal@marshalmiller.com" },
+]
+keywords = [
+	"pdf",
+	"reference",
+	"linkrot",
+]
+classifiers = [
+    "Development Status :: 5 - Production/Stable",
+    "Environment :: Console",
+    "License :: OSI Approved :: Apache Software License",
+    "Programming Language :: Python :: 3.7",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Topic :: Software Development :: Build Tools",
+    "Topic :: Scientific/Engineering",
+    "Topic :: Software Development :: Libraries",
+    "Topic :: Utilities",
+]
+dependencies = [
+    "pdfminer.six==20220524",
+    "chardet==5.0.0"
+]
+
+[project.optional-dependencies]
+dev = [
+	"black==22.8.0",
+	"coverage==6.5.0",
+	"flake8==5.0.4",
+	"mccabe<=0.7.0",
+	"mypy==0.981",
+	"pylint==2.15.3",
+	"pytest==7.1.3",
+]
+test = [
+	"pytest==7.1.3",
+]
+
+[project.urls]
+Homepage = "https://github.com/marshalmiller/linkrot"
+
+[tool.hatch.version]
+path = "linkrot/__init__.py"
+
+[tool.hatch.build.targets.sdist]
+include = [
+	"/linkrot",
+]
+
+[tool.hatch.build.targets.wheel]
+include = [
+	"/linkrot",
+]
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 1284776..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-pdfminer.six==20220524
-chardet==5.0.0
diff --git a/requirements_dev.txt b/requirements_dev.txt
deleted file mode 100644
index 671795e..0000000
--- a/requirements_dev.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-black==22.8.0
-coverage==6.5.0
-flake8==5.0.4
-mccabe<=0.7.0
-mypy==0.981
-pylint==2.15.3
-pytest==7.1.3
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index e69de29..0000000
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 51fe38f..0000000
--- a/setup.py
+++ /dev/null
@@ -1,115 +0,0 @@
-"""A setuptools based setup module.
-
-See:
-https://packaging.python.org/en/latest/distributing.html
-https://github.com/pypa/sampleproject
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-# To use a consistent encoding
-from os import path
-
-
-def parse_requirements(filename):
-    """ load requirements from a pip requirements file """
-    lineiter = (line.strip() for line in open(filename))
-    return [line for line in lineiter if line and not line.startswith("#")]
-
-
-here = path.abspath(path.dirname(__file__))
-reqs = parse_requirements(path.join(here, "requirements.txt"))
-
-# Parses README
-with open("README.md", "r") as fh:
-    long_description = fh.read()
-
-setup(
-    name='linkrot',
-
-    # Versions should comply with PEP440.  For a discussion on single-sourcing
-    # the version across setup.py and the project code, see
-    # https://packaging.python.org/en/latest/single_source_version.html
-    version="3.9.2",
-
-    # Package Descriptions
-    description='Extract metadata and URLs from PDF files',
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-
-    # The project's main homepage.
-    url='https://github.com/marshalmiller/linkrot',
-
-    # Author details
-    author='Marshal Miller',
-    author_email='marshal@marshalmiller.com',
-
-    # Choose your license
-    license='MIT',
-
-    # See https://pypi.python.org/pypi?%3Aaction=list_classifiers
-    classifiers=[
-        # How mature is this project? Common values are
-        #   3 - Alpha
-        #   4 - Beta
-        #   5 - Production/Stable
-        'Development Status :: 5 - Production/Stable',
-
-        'Environment :: Console',
-
-        # Pick your license as you wish (should match "license" above)
-        'License :: OSI Approved :: Apache Software License',
-
-        # Specify the Python versions you support here. In particular, ensure
-        # that you indicate whether you support Python 2, Python 3 or both.
-
-        'Programming Language :: Python :: 3.7',
-        'Programming Language :: Python :: 3.8',
-        'Programming Language :: Python :: 3.9',
-        'Programming Language :: Python :: 3.10',
-
-        'Topic :: Software Development :: Build Tools',
-        'Topic :: Scientific/Engineering',
-        'Topic :: Software Development :: Libraries',
-        'Topic :: Utilities'
-    ],
-
-    # What does your project relate to?
-    keywords='pdf reference linkrot',
-
-    # You can just specify the packages manually here if your project is
-    # simple. Or you can use find_packages().
-    packages=find_packages(exclude=["tests"]),
-
-    # Alternatively, if you want to distribute just a my_module.py, uncomment
-    # this:
-    #   py_modules=["my_module"],
-
-    # List run-time dependencies here.  These will be installed by pip when
-    # your project is installed. For an analysis of "install_requires" vs pip's
-    # requirements files see:
-    # https://packaging.python.org/en/latest/requirements.html
-    install_requires=reqs,
-
-    # If there are data files included in your packages that need to be
-    # installed, specify them here.  If using Python 2.6 or less, then these
-    # have to be included in MANIFEST.in as well.
-    package_data={
-        # 'sample': ['package_data.dat'],
-    },
-
-    # Although 'package_data' is the preferred approach, in some case you may
-    # need to place data files outside of your packages. See:
-    # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa
-    # In this case, 'data_file' will be installed into '<sys.prefix>/my_data'
-    # data_files=[('my_data', ['data/data_file'])],
-
-    # To provide executable scripts, use entry points in preference to the
-    # "scripts" keyword. Entry points provide cross-platform support and allow
-    # pip to create the appropriate form of executable for the target platform.
-    entry_points={
-        "console_scripts": [
-            "linkrot=linkrot.cli:main",
-        ],
-    },
-)


Test patch:
diff --git a/.github/workflows/lint-and-test.yml b/.github/workflows/lint-and-test.yml
index 068478d..32f2596 100644
--- a/.github/workflows/lint-and-test.yml
+++ b/.github/workflows/lint-and-test.yml
@@ -27,7 +27,7 @@ jobs:
       run: |
         python -m pip install -U pip
           pip install -e .
-          pip install -r requirements_dev.txt
+          pip install -e .[dev]
 
     - name: Python & pip versions
       run: |