diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8ae01735c7..00457a53d3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,6 @@ jobs: python-version: ${{ matrix.python-version }} allow-prereleases: true cache: 'pip' - cache-dependency-path: 'requirements/*.txt' - name: Upgrade packaging tools run: python -m pip install --upgrade pip setuptools virtualenv wheel @@ -60,7 +59,7 @@ jobs: python-version: '3.13' - name: Install dependencies - run: pip install -r requirements/requirements-documentation.txt + run: pip install --group docs # Start mkdocs server and wait for it to be ready - run: mkdocs serve & diff --git a/.github/workflows/mkdocs-deploy.yml b/.github/workflows/mkdocs-deploy.yml index ef58e9b779..778c7f1275 100644 --- a/.github/workflows/mkdocs-deploy.yml +++ b/.github/workflows/mkdocs-deploy.yml @@ -7,7 +7,7 @@ on: paths: - docs/** - docs_theme/** - - requirements/requirements-documentation.txt + - pyproject.toml - mkdocs.yml - .github/workflows/mkdocs-deploy.yml @@ -25,5 +25,5 @@ jobs: - uses: actions/setup-python@v6 with: python-version: 3.x - - run: pip install -r requirements/requirements-documentation.txt + - run: pip install --group docs - run: mkdocs gh-deploy diff --git a/docs/community/contributing.md b/docs/community/contributing.md index 797bf72e38..00e4ec4d89 100644 --- a/docs/community/contributing.md +++ b/docs/community/contributing.md @@ -75,8 +75,7 @@ To run the tests, clone the repository, and then: # Setup the virtual environment python3 -m venv env source env/bin/activate - pip install -e . - pip install -r requirements.txt + pip install -e . --group dev # Run the tests ./runtests.py diff --git a/docs/community/project-management.md b/docs/community/project-management.md index 5c7577ec81..7856fedd5d 100644 --- a/docs/community/project-management.md +++ b/docs/community/project-management.md @@ -81,14 +81,6 @@ When pushing the release to PyPI ensure that your environment has been installed --- -## Project requirements - -All our test requirements are pinned to exact versions, in order to ensure that our test runs are reproducible. We maintain the requirements in the `requirements` directory. The requirements files are referenced from the `tox.ini` configuration file, ensuring we have a single source of truth for package versions used in testing. - -Package upgrades should generally be treated as isolated pull requests. You can check if there are any packages available at a newer version, by using the `pip list --outdated`. - ---- - ## Project ownership The PyPI package is owned by `@tomchristie`. As a backup `@j4mie` also has ownership of the package. diff --git a/pyproject.toml b/pyproject.toml index da608a26c4..5120a3a577 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,46 @@ classifiers = [ dynamic = [ "version" ] dependencies = [ "django>=4.2" ] + +[dependency-groups] +dev = [ + { include-group = "docs" }, + { include-group = "optional" }, + { include-group = "test" }, +] + +test = [ + # temporary pin of attrs + "attrs==22.1", + "importlib-metadata<5", + + # Pytest for running the tests. + "pytest>=7.0.1,<8", + "pytest-cov>=4,<5", + "pytest-django>=4.5.2,<5", + + # Remove when dropping support for Django<5.0 + "pytz", +] +docs = [ + # MkDocs to build our documentation. + "mkdocs==1.6", + # pylinkvalidator to check for broken links in documentation. + "pylinkvalidator==0.3", +] +optional = [ + # Optional packages which may be used with REST framework. + "coreapi==2.3.1", + "coreschema==0.0.4", + "django-filter", + "django-guardian>=2.4,<2.5", + "inflection==0.5.1", + "legacy-cgi; python_version>='3.13'", + "markdown>=3.3.7", + "psycopg[binary]>=3.1.8", + "pygments~=2.17.0", + "pyyaml>=5.3.1,<5.4", +] 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" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index c3a1f1187c..0000000000 --- a/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -# The base set of requirements for REST framework is actually -# just Django and pytz, but for the purposes of development -# and testing there are a number of packages that are useful -# to install. - -# Laying these out as separate requirements files, allows us to -# only included the relevant sets when running tox, and ensures -# we are only ever declaring our dependencies in one place. - --r requirements/requirements-optionals.txt --r requirements/requirements-testing.txt --r requirements/requirements-documentation.txt --r requirements/requirements-packaging.txt diff --git a/requirements/requirements-documentation.txt b/requirements/requirements-documentation.txt deleted file mode 100644 index 2cf936ef38..0000000000 --- a/requirements/requirements-documentation.txt +++ /dev/null @@ -1,5 +0,0 @@ -# MkDocs to build our documentation. -mkdocs==1.6.0 - -# pylinkvalidator to check for broken links in documentation. -pylinkvalidator==0.3 diff --git a/requirements/requirements-optionals.txt b/requirements/requirements-optionals.txt deleted file mode 100644 index a19e4d1929..0000000000 --- a/requirements/requirements-optionals.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Optional packages which may be used with REST framework. -coreapi==2.3.1 -coreschema==0.0.4 -django-filter -django-guardian>=2.4.0,<2.5 -inflection==0.5.1 -legacy-cgi; python_version>="3.13" -markdown>=3.3.7 -psycopg[binary]>=3.1.8 -pygments~=2.17.0 -pyyaml>=5.3.1,<5.4 diff --git a/requirements/requirements-packaging.txt b/requirements/requirements-packaging.txt deleted file mode 100644 index 81f22a35a1..0000000000 --- a/requirements/requirements-packaging.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Wheel for PyPI installs. -wheel>=0.36.2,<0.40.0 - -# Twine for secured PyPI uploads. -twine>=3.4.2,<4.0.2 - -# Transifex client for managing translation resources. -transifex-client diff --git a/requirements/requirements-testing.txt b/requirements/requirements-testing.txt deleted file mode 100644 index a3821a5089..0000000000 --- a/requirements/requirements-testing.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Pytest for running the tests. -pytest>=7.0.1,<8.0 -pytest-cov>=4.0.0,<5.0 -pytest-django>=4.5.2,<5.0 -importlib-metadata<5.0 -# temporary pin of attrs -attrs==22.1.0 -pytz # Remove when dropping support for Django<5.0 -setuptools>=77.0.3 diff --git a/tox.ini b/tox.ini index 6980d0bfa3..8c7d861caa 100644 --- a/tox.ini +++ b/tox.ini @@ -15,35 +15,38 @@ envdir = {toxworkdir}/venvs/{envname} setenv = PYTHONDONTWRITEBYTECODE=1 PYTHONWARNINGS=once +dependency_groups = + test + optional deps = - django42: Django>=4.2,<5.0 - django50: Django>=5.0,<5.1 - django51: Django>=5.1,<5.2 - django52: Django>=5.2,<6.0 - django60: Django>=6.0,<6.1 - djangomain: https://github.com/django/django/archive/main.tar.gz - -rrequirements/requirements-testing.txt - -rrequirements/requirements-optionals.txt + django42: Django>=4.2,<5.0 + django50: Django>=5.0,<5.1 + django51: Django>=5.1,<5.2 + django52: Django>=5.2,<6.0 + django60: Django>=6.0,<6.1 + djangomain: https://github.com/django/django/archive/main.tar.gz [testenv:base] ; Ensure optional dependencies are not required +dependency_groups = + test deps = - django<6.1 - -rrequirements/requirements-testing.txt [testenv:dist] commands = python -W error::DeprecationWarning -W error::PendingDeprecationWarning runtests.py --no-pkgroot --staticfiles {posargs} +dependency_groups = + test + optional deps = - django<6.1 - -rrequirements/requirements-testing.txt - -rrequirements/requirements-optionals.txt [testenv:docs] skip_install = true -commands = mkdocs build +commands = + mkdocs build +dependency_groups = + test + docs deps = - -rrequirements/requirements-testing.txt - -rrequirements/requirements-documentation.txt [testenv:py312-djangomain] ignore_outcome = true