diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 27bbcb763..a5ea46db1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,9 +31,17 @@ repos: hooks: - id: codespell exclude: locale|kickstarter-announcement.md|coreapi-0.1.1.js + additional_dependencies: + # python doesn't come with a toml parser prior to 3.11 + - "tomli; python_version < '3.11'" - repo: https://github.com/asottile/pyupgrade rev: v3.19.1 hooks: - id: pyupgrade args: ["--py39-plus", "--keep-percent-format"] + +- repo: https://github.com/tox-dev/pyproject-fmt + rev: v2.6.0 + hooks: + - id: pyproject-fmt diff --git a/docs/community/project-management.md b/docs/community/project-management.md index 4f203e13b..87f966786 100644 --- a/docs/community/project-management.md +++ b/docs/community/project-management.md @@ -60,8 +60,8 @@ The following template should be used for the description of the issue, and serv - [ ] Create pull request for [release notes](https://github.com/encode/django-rest-framework/blob/master/docs/topics/release-notes.md) based on the [*.*.* milestone](https://github.com/encode/django-rest-framework/milestones/***). - [ ] Update supported versions: - - [ ] `setup.py` `python_requires` list - - [ ] `setup.py` Python & Django version trove classifiers + - [ ] `pyproject.toml` `python_requires` list + - [ ] `pyproject.toml` Python & Django version trove classifiers - [ ] `README` Python & Django versions - [ ] `docs` Python & Django versions - [ ] Update the translations from [transifex](https://www.django-rest-framework.org/topics/project-management/#translations). @@ -72,7 +72,9 @@ The following template should be used for the description of the issue, and serv - [ ] Confirm with @tomchristie that release is finalized and ready to go. - [ ] Ensure that release date is included in pull request. - [ ] Merge the release pull request. - - [ ] Push the package to PyPI with `./setup.py publish`. + - [ ] Install the release tools: `pip install build twine` + - [ ] Build the package: `python -m build` + - [ ] Push the package to PyPI with `twine upload dist/*` - [ ] Tag the release, with `git tag -a *.*.* -m 'version *.*.*'; git push --tags`. - [ ] Deploy the documentation with `mkdocs gh-deploy`. - [ ] Make a release announcement on the [discussion group](https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework). diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..0c7b4db72 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,76 @@ +[build-system] +build-backend = "setuptools.build_meta" +requires = [ "setuptools>=77.0.3" ] + +[project] +name = "djangorestframework" +description = "Web APIs for Django, made easy." +readme = "README.md" +license = "BSD-3-Clause" +authors = [ { name = "Tom Christie", email = "tom@tomchristie.com" } ] +requires-python = ">=3.9" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Web Environment", + "Framework :: Django", + "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", + "Framework :: Django :: 5.1", + "Framework :: Django :: 5.2", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Internet :: WWW/HTTP", +] +dynamic = [ "version" ] + +dependencies = [ "django>=4.2" ] +urls.Changelog = "https://www.django-rest-framework.org/community/release-notes/" +urls.Funding = "https://fund.django-rest-framework.org/topics/funding/" +urls.Homepage = "https://www.django-rest-framework.org" +urls.Source = "https://github.com/encode/django-rest-framework" + +[tool.setuptools] + +[tool.setuptools.dynamic] +version = { attr = "rest_framework.__version__" } + +[tool.setuptools.packages.find] +include = [ "rest_framework*" ] + +[tool.isort] +skip = [ ".tox" ] +atomic = true +multi_line_output = 5 +extra_standard_library = [ "types" ] +known_third_party = [ "pytest", "_pytest", "django", "pytz", "uritemplate" ] +known_first_party = [ "rest_framework", "tests" ] + +[tool.codespell] +# Ref: https://github.com/codespell-project/codespell#using-a-config-file +skip = "*/kickstarter-announcement.md,*.js,*.map,*.po" +ignore-words-list = "fo,malcom,ser" + +[tool.pytest.ini_options] +addopts = "--tb=short --strict-markers -ra" +testpaths = [ "tests" ] +filterwarnings = [ "ignore:CoreAPI compatibility is deprecated*:rest_framework.RemovedInDRF317Warning" ] + +[tool.coverage.run] +# NOTE: source is ignored with pytest-cov (but uses the same). +source = [ "." ] +include = [ "rest_framework/*", "tests/*" ] +branch = true + +[tool.coverage.report] +include = [ "rest_framework/*", "tests/*" ] +exclude_lines = [ + "pragma: no cover", + "raise NotImplementedError", +] diff --git a/setup.cfg b/setup.cfg index 459238836..aebdf5362 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,36 +1,3 @@ -[metadata] -license_files = LICENSE.md - -[tool:pytest] -addopts=--tb=short --strict-markers -ra -testpaths = tests -filterwarnings = ignore:CoreAPI compatibility is deprecated*:rest_framework.RemovedInDRF317Warning - [flake8] ignore = E501,W503,W504 banned-modules = json = use from rest_framework.utils import json! - -[isort] -skip=.tox -atomic=true -multi_line_output=5 -extra_standard_library=types -known_third_party=pytest,_pytest,django,pytz,uritemplate -known_first_party=rest_framework,tests - -[coverage:run] -# NOTE: source is ignored with pytest-cov (but uses the same). -source = . -include = rest_framework/*,tests/* -branch = 1 - -[coverage:report] -include = rest_framework/*,tests/* -exclude_lines = - pragma: no cover - raise NotImplementedError - -[codespell] -# Ref: https://github.com/codespell-project/codespell#using-a-config-file -skip = */kickstarter-announcement.md,*.js,*.map,*.po -ignore-words-list = fo,malcom,ser diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index e5e78c2c7..606849326 --- a/setup.py +++ b/setup.py @@ -1,119 +1,3 @@ -import os -import re -import shutil -import sys +from setuptools import setup -from setuptools import find_packages, setup - -CURRENT_PYTHON = sys.version_info[:2] -REQUIRED_PYTHON = (3, 9) - -# This check and everything above must remain compatible with Python 2.7. -if CURRENT_PYTHON < REQUIRED_PYTHON: - sys.stderr.write(""" -========================== -Unsupported Python version -========================== - -This version of Django REST Framework requires Python {}.{}, but you're trying -to install it on Python {}.{}. - -This may be because you are using a version of pip that doesn't -understand the python_requires classifier. Make sure you -have pip >= 9.0 and setuptools >= 24.2, then try again: - - $ python -m pip install --upgrade pip setuptools - $ python -m pip install djangorestframework - -This will install the latest version of Django REST Framework which works on -your version of Python. If you can't upgrade your pip (or Python), request -an older version of Django REST Framework: - - $ python -m pip install "djangorestframework<3.10" -""".format(*(REQUIRED_PYTHON + CURRENT_PYTHON))) - sys.exit(1) - - -def read(f): - with open(f, encoding='utf-8') as file: - return file.read() - - -def get_version(package): - """ - Return package version as listed in `__version__` in `init.py`. - """ - init_py = open(os.path.join(package, '__init__.py')).read() - return re.search("__version__ = ['\"]([^'\"]+)['\"]", init_py).group(1) - - -version = get_version('rest_framework') - - -if sys.argv[-1] == 'publish': - if os.system("pip freeze | grep twine"): - print("twine not installed.\nUse `pip install twine`.\nExiting.") - sys.exit() - os.system("python setup.py sdist bdist_wheel") - if os.system("twine check dist/*"): - print("twine check failed. Packages might be outdated.") - print("Try using `pip install -U twine wheel`.\nExiting.") - sys.exit() - os.system("twine upload dist/*") - print("You probably want to also tag the version now:") - print(" git tag -a %s -m 'version %s'" % (version, version)) - print(" git push --tags") - shutil.rmtree('dist') - shutil.rmtree('build') - shutil.rmtree('djangorestframework.egg-info') - sys.exit() - - -setup( - name='djangorestframework', - version=version, - url='https://www.django-rest-framework.org/', - license='BSD', - description='Web APIs for Django, made easy.', - long_description=read('README.md'), - long_description_content_type='text/markdown', - author='Tom Christie', - author_email='tom@tomchristie.com', # SEE NOTE BELOW (*) - packages=find_packages(exclude=['tests*']), - include_package_data=True, - install_requires=["django>=4.2"], - python_requires=">=3.9", - zip_safe=False, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Web Environment', - 'Framework :: Django', - 'Framework :: Django :: 4.2', - 'Framework :: Django :: 5.0', - 'Framework :: Django :: 5.1', - 'Framework :: Django :: 5.2', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12', - 'Programming Language :: Python :: 3.13', - 'Programming Language :: Python :: 3 :: Only', - 'Topic :: Internet :: WWW/HTTP', - ], - project_urls={ - 'Funding': 'https://fund.django-rest-framework.org/topics/funding/', - 'Source': 'https://github.com/encode/django-rest-framework', - 'Changelog': 'https://www.django-rest-framework.org/community/release-notes/', - }, -) - -# (*) Please direct queries to the discussion group, rather than to me directly -# Doing so helps ensure your question is helpful to other users. -# Queries directly to my email are likely to receive a canned response. -# -# Many thanks for your understanding. +setup()