From d7d8d4f00eaf3865a0066827439712cfa62b130d Mon Sep 17 00:00:00 2001 From: Pravin Kamble Date: Sun, 7 Dec 2025 15:37:52 +0530 Subject: [PATCH] migrate to pyproject.toml --- .flake8 | 2 - .pre-commit-config.yaml | 1 + MANIFEST.in | 13 ---- pyproject.toml | 83 +++++++++++++++++++++ requirements-dev.txt | 10 --- requirements-test.txt | 6 -- requirements.txt | 1 - setup.cfg | 2 - setup.py | 160 ---------------------------------------- tox.ini | 5 +- 10 files changed, 87 insertions(+), 196 deletions(-) delete mode 100644 .flake8 delete mode 100644 MANIFEST.in create mode 100644 pyproject.toml delete mode 100644 requirements-dev.txt delete mode 100644 requirements-test.txt delete mode 100644 requirements.txt delete mode 100644 setup.cfg delete mode 100755 setup.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 2bcd70e..0000000 --- a/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -max-line-length = 88 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 787a439..23fe39b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,3 +9,4 @@ repos: rev: 7.3.0 hooks: - id: flake8 + additional_dependencies: [Flake8-pyproject] diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 3a55821..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,13 +0,0 @@ -include CONTRIBUTING.rst -include LICENSE -include README.rst - -include requirements-dev.txt -include requirements-test.txt -include requirements.txt - -exclude .coveragerc -exclude tox.ini - -prune docs -prune djclick/test diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9478f0d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,83 @@ +[build-system] +requires = ["setuptools>=78.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "django-click" +dynamic = ["version"] +description = "Build Django management commands using the click CLI package." +readme = "README.rst" +license = "MIT" +license-files = ["LICENSE"] +authors = [ + { name = "Jonathan Stoppani", email = "jonathan@stoppani.name" }, +] +maintainers = [ + {name = "Jonathan Stoppani" }, + {name = "Timothy Allen"}, +] +requires-python = ">=3.10" +classifiers = [ + "Development Status :: 4 - Beta", + "Framework :: Django :: 4.2", + "Framework :: Django :: 5.2", + "Framework :: Django :: 6.0", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", +] +dependencies = [ + "click>=7.1", +] + +[project.urls] +Homepage = "https://github.com/django-commons/django-click" + +[dependency-groups] +all = [ + {include-group = "docs"}, + {include-group = "test"}, +] +test = [ + "pytest", + "coverage<8", + "pytest-django", + "pytest-cov", +] +docs = [ + # Documentation + "Sphinx", + "sphinx-autobuild", + "sphinx_rtd_theme", +] + + +[tool.setuptools.packages.find] +include = ["djclick"] + +[tool.setuptools.package-data] +"djclick" = ["**/*"] + +[tool.setuptools.exclude-package-data] +"djclick" = [ + "test/*", + "test/**/*", +] + +[tool.setuptools.data-files] +"." = [ + "CONTRIBUTING.rst", +] + + +[tool.flake8] +max-line-length = 88 + +[tool.setuptools.dynamic] +version = { attr = "djclick.__version__" } diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 2fee3a3..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,10 +0,0 @@ --r requirements-test.txt - -# Packaging -wheel -check-manifest - -# Documentation -Sphinx -sphinx-autobuild -sphinx_rtd_theme diff --git a/requirements-test.txt b/requirements-test.txt deleted file mode 100644 index 10103c8..0000000 --- a/requirements-test.txt +++ /dev/null @@ -1,6 +0,0 @@ --r requirements.txt - -pytest -coverage<8 -pytest-django -pytest-cov diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9f65be1..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -click>=7.1 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 2a9acf1..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[bdist_wheel] -universal = 1 diff --git a/setup.py b/setup.py deleted file mode 100755 index 501d91c..0000000 --- a/setup.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python - -import os -import re -import sys -import glob - -from setuptools import setup, find_packages - - -PACKAGE = "djclick" -PACKAGE_NAME = "django-click" -DESCRIPTION = "Build Django management commands using the click CLI package." -CLASSIFIERS = [ - "Development Status :: 4 - Beta", - "Framework :: Django :: 4.2", - "Framework :: Django :: 5.2", - "Framework :: Django :: 6.0", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", -] - - -if sys.argv[-1] == "publish": - os.system("python setup.py sdist bdist_wheel upload") - sys.exit() - - -class Setup: - @staticmethod - def read(fname, fail_silently=False): - """ - Read the content of the given file. The path is evaluated from the - directory containing this file. - """ - try: - filepath = os.path.join(os.path.dirname(__file__), fname) - with open(filepath, encoding="utf8") as f: - return f.read() - except Exception: - if not fail_silently: - raise - return "" - - @staticmethod - def requirements(fname): - """ - Create a list of requirements from the output of the pip freeze command - saved in a text file. - """ - packages = Setup.read(fname, fail_silently=True).split("\n") - packages = (p.strip() for p in packages) - packages = (p for p in packages if p and not p.startswith("#")) - packages = (p for p in packages if p and not p.startswith("https://")) - packages = (p for p in packages if p and not p.startswith("-r ")) - return list(packages) - - @classmethod - def extra_requirements(cls, glob_pattern): - before, after = glob_pattern.split("*", 1) - pattern = os.path.join(os.path.dirname(__file__), glob_pattern) - requirements = {} - for path in glob.glob(pattern): - name = path[len(before): -len(after)] - requirements[name] = cls.requirements(path) - return requirements - - @staticmethod - def get_files(*bases): - """ - List all files in a data directory. - """ - for base in bases: - basedir, _ = base.split(".", 1) - base = os.path.join(os.path.dirname(__file__), *base.split(".")) - - rem = len(os.path.dirname(base)) + len(basedir) + 2 - - for root, dirs, files in os.walk(base): - for name in files: - yield os.path.join(basedir, root, name)[rem:] - - @staticmethod - def get_metavar(name): - data = Setup.read(os.path.join(PACKAGE, "__init__.py")) - value = ( - re.search(fr"__{name}__\s*=\s*u?'([^']+)'", data).group(1).strip() - ) - return value - - @classmethod - def version(cls): - return cls.get_metavar("version") - - @classmethod - def url(cls): - return cls.get_metavar("url") - - @classmethod - def author(cls): - return cls.get_metavar("author") - - @classmethod - def email(cls): - return cls.get_metavar("email") - - @classmethod - def license(cls): - return cls.get_metavar("license") - - @staticmethod - def longdesc(): - return Setup.read("README.rst") - - @staticmethod - def test_links(): - # Test if hardlinks work. This is a workaround until - # http://bugs.python.org/issue8876 is solved - if hasattr(os, "link"): - tempfile = __file__ + ".tmp" - try: - os.link(__file__, tempfile) - except OSError as e: - if e.errno == 1: # Operation not permitted - del os.link - else: - raise - finally: - if os.path.exists(tempfile): - os.remove(tempfile) - - -Setup.test_links() - -setup( - name=PACKAGE_NAME, - version=Setup.version(), - author=Setup.author(), - author_email=Setup.email(), - include_package_data=True, - zip_safe=False, - url=Setup.url(), - license=Setup.license(), - packages=find_packages(), - package_dir={PACKAGE: PACKAGE}, - description=DESCRIPTION, - install_requires=Setup.requirements("requirements.txt"), - extras_require=Setup.extra_requirements("requirements-*.txt"), - long_description=Setup.longdesc(), - entry_points=Setup.read("entry-points.ini", True), - classifiers=CLASSIFIERS, -) diff --git a/tox.ini b/tox.ini index 29dd525..eea1f72 100644 --- a/tox.ini +++ b/tox.ini @@ -16,9 +16,10 @@ setenv = DJANGO_SETTINGS_MODULE=testprj.settings PYTHONPATH={toxinidir}/djclick/test/testprj deps = - -rrequirements-test.txt dj42: django>=4.2,<4.3 dj52: django>=5.2,<5.3 dj60: django>=6.0,<6.1 djmain: https://github.com/django/django/archive/main.tar.gz -commands = pytest -rxs --cov-report= --cov-append --cov djclick {posargs:djclick} +commands = + pip install --group test + pytest -rxs --cov-report= --cov-append --cov djclick {posargs:djclick}