From a8182508a51b6a861e77202722a9b767455c4bbe Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 17:02:15 -0500 Subject: [PATCH 1/6] chore: drop Python 3.11 support Remove Python 3.11 from CI matrix and all workflow files. Update coverage conditional from 3.11 to 3.12. Python 3.12 is now the minimum supported version. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/check-reserved-keywords.yml | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/pypi-publish.yml | 2 +- .github/workflows/verify_changed_contract.yml | 2 +- setup.py | 1 - 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check-reserved-keywords.yml b/.github/workflows/check-reserved-keywords.yml index 22f8b335..5978ec79 100644 --- a/.github/workflows/check-reserved-keywords.yml +++ b/.github/workflows/check-reserved-keywords.yml @@ -15,7 +15,7 @@ jobs: - name: setup python uses: actions/setup-python@v5 with: - python-version: 3.11 + python-version: 3.12 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a7de04a9..e720fa04 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - python-version: ['3.11', '3.12'] + python-version: ['3.12'] toxenv: [django42, django52, quality] steps: @@ -36,7 +36,7 @@ jobs: run: tox - name: Run Coverage - if: matrix.python-version == '3.11' && matrix.toxenv=='django42' + if: matrix.python-version == '3.12' && matrix.toxenv=='django42' uses: codecov/codecov-action@v5 with: flags: unittests @@ -56,7 +56,7 @@ jobs: - name: setup python uses: actions/setup-python@v5 with: - python-version: 3.11 + python-version: 3.12 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml index 1bc4399b..eba2eb2d 100644 --- a/.github/workflows/pypi-publish.yml +++ b/.github/workflows/pypi-publish.yml @@ -15,7 +15,7 @@ jobs: - name: setup python uses: actions/setup-python@v5 with: - python-version: 3.11 + python-version: 3.12 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/.github/workflows/verify_changed_contract.yml b/.github/workflows/verify_changed_contract.yml index 0928a1f0..13d3b46c 100644 --- a/.github/workflows/verify_changed_contract.yml +++ b/.github/workflows/verify_changed_contract.yml @@ -24,7 +24,7 @@ jobs: - name: setup python uses: actions/setup-python@v5 with: - python-version: 3.11 + python-version: 3.12 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/setup.py b/setup.py index 4fa86270..99557c56 100644 --- a/setup.py +++ b/setup.py @@ -148,7 +148,6 @@ def get_version(*file_paths): 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Framework :: Django', 'Framework :: Django :: 4.2', From bfd970c61489cf5b3af3bcd9f185f95fac6672f0 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 17:03:07 -0500 Subject: [PATCH 2/6] chore: upgrade Python requirements for Python 3.12 Regenerate all pinned requirements files using Python 3.12. Co-Authored-By: Claude Sonnet 4.6 --- requirements/ci.txt | 64 +++++--- requirements/common_constraints.txt | 13 +- requirements/dev.txt | 244 ++++++++++++++-------------- requirements/pip-tools.txt | 16 +- requirements/pip.txt | 14 +- requirements/quality.txt | 213 ++++++++++++------------ requirements/test.txt | 150 ++++++++--------- 7 files changed, 342 insertions(+), 372 deletions(-) diff --git a/requirements/ci.txt b/requirements/ci.txt index 968283d3..25c0a71b 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,52 +1,68 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -cachetools==5.5.2 +annotated-doc==0.0.4 + # via typer +cachetools==7.0.3 # via tox -certifi==2025.4.26 +certifi==2026.2.25 # via requests -chardet==5.2.0 - # via tox -charset-normalizer==3.4.2 +charset-normalizer==3.4.5 # via requests +click==8.3.1 + # via typer colorama==0.4.6 # via tox -coverage[toml]==7.8.0 +coverage[toml]==7.13.4 # via coveralls -coveralls==4.0.1 +coveralls==4.1.0 # via -r requirements/ci.in -distlib==0.3.9 +distlib==0.4.0 # via virtualenv -docopt==0.6.2 - # via coveralls -filelock==3.18.0 +filelock==3.25.0 # via + # python-discovery # tox # virtualenv -idna==3.10 +idna==3.11 # via requests -packaging==25.0 +markdown-it-py==4.0.0 + # via rich +mdurl==0.1.2 + # via markdown-it-py +packaging==26.0 # via # pyproject-api # tox -platformdirs==4.3.7 +platformdirs==4.9.4 # via + # python-discovery # tox # virtualenv -pluggy==1.5.0 +pluggy==1.6.0 # via tox -pyproject-api==1.9.0 +pygments==2.19.2 + # via rich +pyproject-api==1.10.0 # via tox -requests==2.32.3 +python-discovery==1.1.0 + # via virtualenv +requests==2.32.5 # via coveralls -tox==4.25.0 +rich==14.3.3 + # via typer +shellingham==1.5.4 + # via typer +tomli-w==1.2.0 + # via tox +tox==4.49.0 # via -r requirements/ci.in -urllib3==2.2.3 - # via - # -c requirements/common_constraints.txt - # requests -virtualenv==20.30.0 +typer==0.24.1 + # via coveralls +urllib3==2.6.3 + # via requests +virtualenv==21.1.0 # via tox diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index 1511019d..72cc4cc8 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -12,20 +12,9 @@ # this file from Github directly. It does not require packaging in edx-lint. # using LTS django version -Django<5.0 +Django<6.0 # elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. # elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html # See https://github.com/openedx/edx-platform/issues/35126 for more info elasticsearch<7.14.0 - -# django-simple-history>3.0.0 adds indexing and causes a lot of migrations to be affected -django-simple-history==3.0.0 - -# Cause: https://github.com/openedx/edx-lint/issues/458 -# This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved. -pip<24.3 - -# Cause: https://github.com/openedx/edx-lint/issues/475 -# This can be unpinned once https://github.com/openedx/edx-lint/issues/476 has been resolved. -urllib3<2.3.0 diff --git a/requirements/dev.txt b/requirements/dev.txt index cbee17b1..4cd91a26 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,75 +1,77 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -annotated-types==0.7.0 - # via pydantic -anyio==4.9.0 - # via starlette +annotated-doc==0.0.4 + # via typer appdirs==1.4.4 # via fs -asgiref==3.8.1 +asgiref==3.11.1 # via django -astroid==3.3.9 +astroid==4.0.4 # via # pylint # pylint-celery -backports-tarfile==1.2.0 - # via jaraco-context -cachetools==5.5.2 +boto3==1.42.62 + # via -r requirements/test.in +botocore==1.42.62 + # via + # boto3 + # s3transfer +cachetools==7.0.3 # via # -r requirements/base.in # tox -certifi==2025.4.26 +certifi==2026.2.25 # via requests -cffi==1.17.1 +cffi==2.0.0 # via # cryptography - # pact-python + # pact-python-ffi # pynacl -chardet==5.2.0 +chardet==7.0.1 # via # diff-cover # pysrt - # tox -charset-normalizer==3.4.2 +charset-normalizer==3.4.5 # via requests -click==8.1.8 +click==8.3.1 # via # click-log # code-annotations # edx-django-utils # edx-lint - # pact-python - # uvicorn + # typer click-log==0.4.0 # via edx-lint -code-annotations==2.3.0 +code-annotations==2.3.2 # via # edx-lint # edx-toggles colorama==0.4.6 # via tox -coverage[toml]==7.8.0 +coverage[toml]==7.13.4 # via # -r requirements/test.in # coveralls # pytest-cov -coveralls==4.0.1 +coveralls==4.1.0 # via -r requirements/ci.in -cryptography==44.0.3 - # via pyjwt +cryptography==46.0.5 + # via + # pyjwt + # secretstorage ddt==1.7.2 # via -r requirements/test.in -diff-cover==9.2.4 +diff-cover==10.2.0 # via -r requirements/dev.in -dill==0.4.0 +dill==0.4.1 # via pylint -distlib==0.3.9 +distlib==0.4.0 # via virtualenv -django==4.2.20 +django==5.2.12 # via # -c requirements/common_constraints.txt # -r requirements/base.in @@ -91,26 +93,24 @@ django-model-utils==5.0.0 # via -r requirements/base.in django-storages==1.14.6 # via -r requirements/base.in -django-waffle==4.2.0 +django-waffle==5.0.0 # via # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.16.0 +djangorestframework==3.16.1 # via # drf-jwt # edx-drf-extensions -dnspython==2.7.0 +dnspython==2.8.0 # via pymongo -docopt==0.6.2 - # via coveralls -docutils==0.21.2 +docutils==0.22.4 # via readme-renderer drf-jwt==1.19.2 # via edx-drf-extensions edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.1 # via # edx-drf-extensions # edx-toggles @@ -118,52 +118,54 @@ edx-drf-extensions==10.6.0 # via -r requirements/base.in edx-lint==5.6.0 # via -r requirements/quality.in -edx-opaque-keys==3.0.0 +edx-opaque-keys==3.1.0 # via edx-drf-extensions -edx-toggles==5.3.0 +edx-toggles==5.4.1 # via -r requirements/base.in -fastapi==0.115.12 - # via pact-python -filelock==3.18.0 +filelock==3.25.0 # via + # python-discovery # tox # virtualenv fs==2.4.16 # via -r requirements/test.in -h11==0.16.0 - # via uvicorn -id==1.5.0 +id==1.6.1 # via twine -idna==3.10 +idna==3.11 # via - # anyio # requests # yarl -importlib-metadata==8.7.0 - # via keyring -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest -isort==6.0.1 +isort==8.0.1 # via # -r requirements/quality.in # pylint jaraco-classes==3.4.0 # via keyring -jaraco-context==6.0.1 +jaraco-context==6.1.0 # via keyring -jaraco-functools==4.1.0 +jaraco-functools==4.4.0 # via keyring +jeepney==0.9.0 + # via + # keyring + # secretstorage jinja2==3.1.6 # via # code-annotations # diff-cover -keyring==25.6.0 +jmespath==1.1.0 + # via + # boto3 + # botocore +keyring==25.7.0 # via twine -lxml==5.4.0 +lxml==6.0.2 # via -r requirements/base.in -markdown-it-py==3.0.0 +markdown-it-py==4.0.0 # via rich -markupsafe==3.0.2 +markupsafe==3.0.3 # via jinja2 mccabe==0.7.0 # via pylint @@ -171,64 +173,59 @@ mdurl==0.1.2 # via markdown-it-py mock==5.2.0 # via -r requirements/test.in -more-itertools==10.7.0 +more-itertools==10.8.0 # via # jaraco-classes # jaraco-functools -multidict==6.4.3 +multidict==6.7.1 # via yarl -newrelic==10.11.0 - # via edx-django-utils -nh3==0.2.21 +nh3==0.3.3 # via readme-renderer -packaging==25.0 +packaging==26.0 # via # pyproject-api # pytest # tox # twine -pact-python==2.3.1 +pact-python==3.2.1 # via -r requirements/test.in -pbr==6.1.1 - # via stevedore -pillow==11.2.1 +pact-python-ffi==0.4.28.2 + # via pact-python +pillow==12.1.1 # via -r requirements/base.in -platformdirs==4.3.7 +platformdirs==4.9.4 # via # pylint + # python-discovery # tox # virtualenv -pluggy==1.5.0 +pluggy==1.6.0 # via # diff-cover # pytest + # pytest-cov # tox -propcache==0.3.1 +propcache==0.4.1 # via yarl -psutil==6.1.1 - # via - # edx-django-utils - # pact-python -pycodestyle==2.13.0 +psutil==7.2.2 + # via edx-django-utils +pycodestyle==2.14.0 # via -r requirements/quality.in -pycparser==2.22 +pycparser==3.0 # via cffi -pydantic==2.11.4 - # via fastapi -pydantic-core==2.33.2 - # via pydantic pydocstyle==6.3.0 # via -r requirements/quality.in -pygments==2.19.1 +pygments==2.19.2 # via # diff-cover + # pytest # readme-renderer # rich -pyjwt[crypto]==2.10.1 +pyjwt[crypto]==2.11.0 # via # drf-jwt # edx-drf-extensions -pylint==3.3.7 +pylint==4.0.5 # via # edx-lint # pylint-celery @@ -236,107 +233,108 @@ pylint==3.3.7 # pylint-plugin-utils pylint-celery==0.3 # via edx-lint -pylint-django==2.6.1 +pylint-django==2.7.0 # via edx-lint -pylint-plugin-utils==0.8.2 +pylint-plugin-utils==0.9.0 # via # pylint-celery # pylint-django -pymongo==4.12.1 +pymongo==4.16.0 # via edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.2 # via edx-django-utils -pyproject-api==1.9.0 +pyproject-api==1.10.0 # via tox pysrt==1.1.2 # via -r requirements/base.in -pytest==8.3.5 +pytest==9.0.2 # via # pytest-cov # pytest-django -pytest-cov==6.1.1 +pytest-cov==7.0.0 # via -r requirements/test.in -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/test.in +python-dateutil==2.9.0.post0 + # via botocore +python-discovery==1.1.0 + # via virtualenv python-slugify==8.0.4 # via code-annotations -pyyaml==6.0.2 +pyyaml==6.0.3 # via # code-annotations # edx-django-release-util # responses readme-renderer==44.0 # via twine -requests==2.32.3 +requests==2.32.5 # via # coveralls # edx-drf-extensions - # id - # pact-python # requests-toolbelt # responses # twine requests-toolbelt==1.0.0 # via twine -responses==0.25.7 +responses==0.26.0 # via -r requirements/test.in rfc3986==2.0.0 # via twine -rich==14.0.0 - # via twine +rich==14.3.3 + # via + # twine + # typer +s3transfer==0.16.0 + # via boto3 +secretstorage==3.5.0 + # via keyring semantic-version==2.10.0 # via edx-drf-extensions +shellingham==1.5.4 + # via typer six==1.17.0 # via # edx-django-release-util # edx-lint # fs - # pact-python -sniffio==1.3.1 - # via anyio -snowballstemmer==2.2.0 + # python-dateutil +snowballstemmer==3.0.1 # via pydocstyle -sqlparse==0.5.3 +sqlparse==0.5.5 # via django -starlette==0.46.2 - # via fastapi -stevedore==5.4.1 +stevedore==5.7.0 # via # code-annotations # edx-django-utils # edx-opaque-keys text-unidecode==1.3 # via python-slugify -tomlkit==0.13.2 +tomli-w==1.2.0 + # via tox +tomlkit==0.14.0 # via pylint -tox==4.25.0 +tox==4.49.0 # via -r requirements/ci.in -twine==6.1.0 +twine==6.2.0 # via -r requirements/quality.in -typing-extensions==4.13.2 +typer==0.24.1 + # via coveralls +typing-extensions==4.15.0 # via - # anyio # edx-opaque-keys - # fastapi - # pydantic - # pydantic-core - # typing-inspection -typing-inspection==0.4.0 - # via pydantic -urllib3==2.2.3 + # pact-python +urllib3==2.6.3 # via - # -c requirements/common_constraints.txt + # botocore + # id # requests # responses # twine -uvicorn==0.34.2 - # via pact-python -virtualenv==20.30.0 +virtualenv==21.1.0 # via tox -yarl==1.20.0 +yarl==1.23.0 # via pact-python -zipp==3.21.0 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 1dd71b5e..d89516b8 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,22 +1,24 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -build==1.2.2.post1 +build==1.4.0 # via pip-tools -click==8.1.8 +click==8.3.1 # via pip-tools -packaging==25.0 - # via build -pip-tools==7.4.1 +packaging==26.0 + # via + # build + # wheel +pip-tools==7.5.3 # via -r requirements/pip-tools.in pyproject-hooks==1.2.0 # via # build # pip-tools -wheel==0.45.1 +wheel==0.46.3 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pip.txt b/requirements/pip.txt index 5d3482a4..084d708e 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,16 +1,16 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -wheel==0.45.1 +packaging==26.0 + # via wheel +wheel==0.46.3 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==24.2 - # via - # -c requirements/common_constraints.txt - # -r requirements/pip.in -setuptools==80.3.1 +pip==26.0.1 + # via -r requirements/pip.in +setuptools==82.0.0 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 63b1b541..2fc72618 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,61 +1,61 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -annotated-types==0.7.0 - # via pydantic -anyio==4.9.0 - # via starlette appdirs==1.4.4 # via fs -asgiref==3.8.1 +asgiref==3.11.1 # via django -astroid==3.3.9 +astroid==4.0.4 # via # pylint # pylint-celery -backports-tarfile==1.2.0 - # via jaraco-context -cachetools==5.5.2 +boto3==1.42.62 + # via -r requirements/test.in +botocore==1.42.62 + # via + # boto3 + # s3transfer +cachetools==7.0.3 # via -r requirements/base.in -certifi==2025.4.26 +certifi==2026.2.25 # via requests -cffi==1.17.1 +cffi==2.0.0 # via # cryptography - # pact-python + # pact-python-ffi # pynacl -chardet==5.2.0 +chardet==7.0.1 # via pysrt -charset-normalizer==3.4.2 +charset-normalizer==3.4.5 # via requests -click==8.1.8 +click==8.3.1 # via # click-log # code-annotations # edx-django-utils # edx-lint - # pact-python - # uvicorn click-log==0.4.0 # via edx-lint -code-annotations==2.3.0 +code-annotations==2.3.2 # via # edx-lint # edx-toggles -coverage[toml]==7.8.0 +coverage[toml]==7.13.4 # via # -r requirements/test.in # pytest-cov -cryptography==44.0.3 - # via pyjwt +cryptography==46.0.5 + # via + # pyjwt + # secretstorage ddt==1.7.2 # via -r requirements/test.in -dill==0.4.0 +dill==0.4.1 # via pylint -django==4.2.20 +django==5.2.12 # via # -c requirements/common_constraints.txt # -r requirements/base.in @@ -77,24 +77,24 @@ django-model-utils==5.0.0 # via -r requirements/base.in django-storages==1.14.6 # via -r requirements/base.in -django-waffle==4.2.0 +django-waffle==5.0.0 # via # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.16.0 +djangorestframework==3.16.1 # via # drf-jwt # edx-drf-extensions -dnspython==2.7.0 +dnspython==2.8.0 # via pymongo -docutils==0.21.2 +docutils==0.22.4 # via readme-renderer drf-jwt==1.19.2 # via edx-drf-extensions edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.1 # via # edx-drf-extensions # edx-toggles @@ -102,46 +102,47 @@ edx-drf-extensions==10.6.0 # via -r requirements/base.in edx-lint==5.6.0 # via -r requirements/quality.in -edx-opaque-keys==3.0.0 +edx-opaque-keys==3.1.0 # via edx-drf-extensions -edx-toggles==5.3.0 +edx-toggles==5.4.1 # via -r requirements/base.in -fastapi==0.115.12 - # via pact-python fs==2.4.16 # via -r requirements/test.in -h11==0.16.0 - # via uvicorn -id==1.5.0 +id==1.6.1 # via twine -idna==3.10 +idna==3.11 # via - # anyio # requests # yarl -importlib-metadata==8.7.0 - # via keyring -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest -isort==6.0.1 +isort==8.0.1 # via # -r requirements/quality.in # pylint jaraco-classes==3.4.0 # via keyring -jaraco-context==6.0.1 +jaraco-context==6.1.0 # via keyring -jaraco-functools==4.1.0 +jaraco-functools==4.4.0 # via keyring +jeepney==0.9.0 + # via + # keyring + # secretstorage jinja2==3.1.6 # via code-annotations -keyring==25.6.0 +jmespath==1.1.0 + # via + # boto3 + # botocore +keyring==25.7.0 # via twine -lxml==5.4.0 +lxml==6.0.2 # via -r requirements/base.in -markdown-it-py==3.0.0 +markdown-it-py==4.0.0 # via rich -markupsafe==3.0.2 +markupsafe==3.0.3 # via jinja2 mccabe==0.7.0 # via pylint @@ -149,55 +150,50 @@ mdurl==0.1.2 # via markdown-it-py mock==5.2.0 # via -r requirements/test.in -more-itertools==10.7.0 +more-itertools==10.8.0 # via # jaraco-classes # jaraco-functools -multidict==6.4.3 +multidict==6.7.1 # via yarl -newrelic==10.11.0 - # via edx-django-utils -nh3==0.2.21 +nh3==0.3.3 # via readme-renderer -packaging==25.0 +packaging==26.0 # via # pytest # twine -pact-python==2.3.1 +pact-python==3.2.1 # via -r requirements/test.in -pbr==6.1.1 - # via stevedore -pillow==11.2.1 +pact-python-ffi==0.4.28.2 + # via pact-python +pillow==12.1.1 # via -r requirements/base.in -platformdirs==4.3.7 +platformdirs==4.9.4 # via pylint -pluggy==1.5.0 - # via pytest -propcache==0.3.1 - # via yarl -psutil==6.1.1 +pluggy==1.6.0 # via - # edx-django-utils - # pact-python -pycodestyle==2.13.0 + # pytest + # pytest-cov +propcache==0.4.1 + # via yarl +psutil==7.2.2 + # via edx-django-utils +pycodestyle==2.14.0 # via -r requirements/quality.in -pycparser==2.22 +pycparser==3.0 # via cffi -pydantic==2.11.4 - # via fastapi -pydantic-core==2.33.2 - # via pydantic pydocstyle==6.3.0 # via -r requirements/quality.in -pygments==2.19.1 +pygments==2.19.2 # via + # pytest # readme-renderer # rich -pyjwt[crypto]==2.10.1 +pyjwt[crypto]==2.11.0 # via # drf-jwt # edx-drf-extensions -pylint==3.3.7 +pylint==4.0.5 # via # edx-lint # pylint-celery @@ -205,51 +201,55 @@ pylint==3.3.7 # pylint-plugin-utils pylint-celery==0.3 # via edx-lint -pylint-django==2.6.1 +pylint-django==2.7.0 # via edx-lint -pylint-plugin-utils==0.8.2 +pylint-plugin-utils==0.9.0 # via # pylint-celery # pylint-django -pymongo==4.12.1 +pymongo==4.16.0 # via edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.2 # via edx-django-utils pysrt==1.1.2 # via -r requirements/base.in -pytest==8.3.5 +pytest==9.0.2 # via # pytest-cov # pytest-django -pytest-cov==6.1.1 +pytest-cov==7.0.0 # via -r requirements/test.in -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/test.in +python-dateutil==2.9.0.post0 + # via botocore python-slugify==8.0.4 # via code-annotations -pyyaml==6.0.2 +pyyaml==6.0.3 # via # code-annotations # edx-django-release-util # responses readme-renderer==44.0 # via twine -requests==2.32.3 +requests==2.32.5 # via # edx-drf-extensions - # id - # pact-python # requests-toolbelt # responses # twine requests-toolbelt==1.0.0 # via twine -responses==0.25.7 +responses==0.26.0 # via -r requirements/test.in rfc3986==2.0.0 # via twine -rich==14.0.0 +rich==14.3.3 # via twine +s3transfer==0.16.0 + # via boto3 +secretstorage==3.5.0 + # via keyring semantic-version==2.10.0 # via edx-drf-extensions six==1.17.0 @@ -257,48 +257,35 @@ six==1.17.0 # edx-django-release-util # edx-lint # fs - # pact-python -sniffio==1.3.1 - # via anyio -snowballstemmer==2.2.0 + # python-dateutil +snowballstemmer==3.0.1 # via pydocstyle -sqlparse==0.5.3 +sqlparse==0.5.5 # via django -starlette==0.46.2 - # via fastapi -stevedore==5.4.1 +stevedore==5.7.0 # via # code-annotations # edx-django-utils # edx-opaque-keys text-unidecode==1.3 # via python-slugify -tomlkit==0.13.2 +tomlkit==0.14.0 # via pylint -twine==6.1.0 +twine==6.2.0 # via -r requirements/quality.in -typing-extensions==4.13.2 +typing-extensions==4.15.0 # via - # anyio # edx-opaque-keys - # fastapi - # pydantic - # pydantic-core - # typing-inspection -typing-inspection==0.4.0 - # via pydantic -urllib3==2.2.3 + # pact-python +urllib3==2.6.3 # via - # -c requirements/common_constraints.txt + # botocore + # id # requests # responses # twine -uvicorn==0.34.2 - # via pact-python -yarl==1.20.0 +yarl==1.23.0 # via pact-python -zipp==3.21.0 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/test.txt b/requirements/test.txt index 70844c77..a8962729 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,49 +1,43 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -annotated-types==0.7.0 - # via pydantic -anyio==4.9.0 - # via starlette appdirs==1.4.4 # via fs -asgiref==3.8.1 +asgiref==3.11.1 # via django -boto3==1.38.8 +boto3==1.42.62 # via -r requirements/test.in -botocore==1.38.8 +botocore==1.42.62 # via # boto3 # s3transfer -cachetools==5.5.2 +cachetools==7.0.3 # via -r requirements/base.in -certifi==2025.4.26 +certifi==2026.2.25 # via requests -cffi==1.17.1 +cffi==2.0.0 # via # cryptography - # pact-python + # pact-python-ffi # pynacl -chardet==5.2.0 +chardet==7.0.1 # via pysrt -charset-normalizer==3.4.2 +charset-normalizer==3.4.5 # via requests -click==8.1.8 +click==8.3.1 # via # code-annotations # edx-django-utils - # pact-python - # uvicorn -code-annotations==2.3.0 +code-annotations==2.3.2 # via edx-toggles -coverage[toml]==7.8.0 +coverage[toml]==7.13.4 # via # -r requirements/test.in # pytest-cov -cryptography==44.0.3 +cryptography==46.0.5 # via pyjwt ddt==1.7.2 # via -r requirements/test.in @@ -68,111 +62,107 @@ django-model-utils==5.0.0 # via -r requirements/base.in django-storages==1.14.6 # via -r requirements/base.in -django-waffle==4.2.0 +django-waffle==5.0.0 # via # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.16.0 +djangorestframework==3.16.1 # via # drf-jwt # edx-drf-extensions -dnspython==2.7.0 +dnspython==2.8.0 # via pymongo drf-jwt==1.19.2 # via edx-drf-extensions edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.1 # via # edx-drf-extensions # edx-toggles edx-drf-extensions==10.6.0 # via -r requirements/base.in -edx-opaque-keys==3.0.0 +edx-opaque-keys==3.1.0 # via edx-drf-extensions -edx-toggles==5.3.0 +edx-toggles==5.4.1 # via -r requirements/base.in -fastapi==0.115.12 - # via pact-python fs==2.4.16 # via -r requirements/test.in -h11==0.16.0 - # via uvicorn -idna==3.10 +idna==3.11 # via - # anyio # requests # yarl -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest jinja2==3.1.6 # via code-annotations -lxml==5.4.0 +jmespath==1.1.0 + # via + # boto3 + # botocore +lxml==6.0.2 # via -r requirements/base.in -markupsafe==3.0.2 +markupsafe==3.0.3 # via jinja2 mock==5.2.0 # via -r requirements/test.in -multidict==6.4.3 +multidict==6.7.1 # via yarl -newrelic==10.11.0 - # via edx-django-utils -packaging==25.0 +packaging==26.0 # via pytest -pact-python==2.3.1 +pact-python==3.2.1 # via -r requirements/test.in -pbr==6.1.1 - # via stevedore -pillow==11.2.1 +pact-python-ffi==0.4.28.2 + # via pact-python +pillow==12.1.1 # via -r requirements/base.in -pluggy==1.5.0 - # via pytest -propcache==0.3.1 - # via yarl -psutil==6.1.1 +pluggy==1.6.0 # via - # edx-django-utils - # pact-python -pycparser==2.22 + # pytest + # pytest-cov +propcache==0.4.1 + # via yarl +psutil==7.2.2 + # via edx-django-utils +pycparser==3.0 # via cffi -pydantic==2.11.4 - # via fastapi -pydantic-core==2.33.2 - # via pydantic -pyjwt[crypto]==2.10.1 +pygments==2.19.2 + # via pytest +pyjwt[crypto]==2.11.0 # via # drf-jwt # edx-drf-extensions -pymongo==4.12.1 +pymongo==4.16.0 # via edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.2 # via edx-django-utils pysrt==1.1.2 # via -r requirements/base.in -pytest==8.3.5 +pytest==9.0.2 # via # pytest-cov # pytest-django -pytest-cov==6.1.1 +pytest-cov==7.0.0 # via -r requirements/test.in -pytest-django==4.11.1 +pytest-django==4.12.0 # via -r requirements/test.in +python-dateutil==2.9.0.post0 + # via botocore python-slugify==8.0.4 # via code-annotations -pyyaml==6.0.2 +pyyaml==6.0.3 # via # code-annotations # edx-django-release-util # responses -requests==2.32.3 +requests==2.32.5 # via # edx-drf-extensions - # pact-python # responses -responses==0.25.7 +responses==0.26.0 # via -r requirements/test.in -s3transfer==0.12.0 +s3transfer==0.16.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions @@ -180,38 +170,26 @@ six==1.17.0 # via # edx-django-release-util # fs - # pact-python -sniffio==1.3.1 - # via anyio -sqlparse==0.5.3 + # python-dateutil +sqlparse==0.5.5 # via django -starlette==0.46.2 - # via fastapi -stevedore==5.4.1 +stevedore==5.7.0 # via # code-annotations # edx-django-utils # edx-opaque-keys text-unidecode==1.3 # via python-slugify -typing-extensions==4.13.2 +typing-extensions==4.15.0 # via - # anyio # edx-opaque-keys - # fastapi - # pydantic - # pydantic-core - # typing-inspection -typing-inspection==0.4.0 - # via pydantic -urllib3==2.2.3 + # pact-python +urllib3==2.6.3 # via - # -c requirements/common_constraints.txt + # botocore # requests # responses -uvicorn==0.34.2 - # via pact-python -yarl==1.20.0 +yarl==1.23.0 # via pact-python # The following packages are considered to be unsafe in a requirements file: From c8933ab8a352fef862e97e015e44bff654f81d91 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 17:03:23 -0500 Subject: [PATCH 3/6] chore: bump version to 4.0.0 Co-Authored-By: Claude Sonnet 4.6 --- edxval/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edxval/__init__.py b/edxval/__init__.py index b5a91c28..cde3e292 100644 --- a/edxval/__init__.py +++ b/edxval/__init__.py @@ -2,4 +2,4 @@ init """ -__version__ = '3.2.0' +__version__ = '4.0.0' From 509254f7920f5dacb653d8fab93b49fd84343d32 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Wed, 11 Mar 2026 13:55:49 -0400 Subject: [PATCH 4/6] fix: pin setuptools<82 to keep pkg_resources available for fs fs (pyfilesystem2) 2.4.16 uses pkg_resources for namespace package declarations in fs/__init__.py. setuptools 82+ removed pkg_resources. Pin to setuptools<82 and add --allow-unsafe to pip-compile so the constraint is properly reflected in pinned requirements files. See: https://github.com/PyFilesystem/pyfilesystem2/issues/577 Co-Authored-By: Claude Sonnet 4.6 --- Makefile | 12 +++++++++--- requirements/ci.txt | 10 +++++----- requirements/constraints.txt | 5 +++++ requirements/dev.txt | 21 ++++++++++++--------- requirements/pip.txt | 6 ++++-- requirements/quality.txt | 13 ++++++++----- requirements/test.txt | 11 +++++++---- 7 files changed, 50 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index d691630f..4a1c1c99 100644 --- a/Makefile +++ b/Makefile @@ -45,9 +45,15 @@ upgrade: $(COMMON_CONSTRAINTS_TXT) pip-compile --rebuild --upgrade -o requirements/pip-tools.txt requirements/pip-tools.in pip install -qr requirements/pip.txt pip install -qr requirements/pip-tools.txt - pip-compile --rebuild --upgrade -o requirements/dev.txt requirements/base.in requirements/dev.in requirements/quality.in requirements/test.in requirements/ci.in - pip-compile --rebuild --upgrade -o requirements/quality.txt requirements/base.in requirements/quality.in requirements/test.in - pip-compile --rebuild --upgrade -o requirements/test.txt requirements/base.in requirements/test.in + # --allow-unsafe is required here because fs (pyfilesystem2) depends on setuptools + # (via pkg_resources for namespace package declarations). Without it, pip-compile + # silently omits setuptools from the output, causing ImportError at runtime. + # TODO: remove --allow-unsafe and the setuptools<82 constraint in constraints.txt + # once a version of fs is available that does not depend on pkg_resources. + # Track: https://github.com/PyFilesystem/pyfilesystem2/issues/577 + pip-compile --rebuild --upgrade --allow-unsafe -o requirements/dev.txt requirements/base.in requirements/dev.in requirements/quality.in requirements/test.in requirements/ci.in + pip-compile --rebuild --upgrade --allow-unsafe -o requirements/quality.txt requirements/base.in requirements/quality.in requirements/test.in + pip-compile --rebuild --upgrade --allow-unsafe -o requirements/test.txt requirements/base.in requirements/test.in pip-compile --rebuild --upgrade -o requirements/ci.txt requirements/ci.in # Let tox control the Django version for tests sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp diff --git a/requirements/ci.txt b/requirements/ci.txt index 25c0a71b..535be5bb 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -6,7 +6,7 @@ # annotated-doc==0.0.4 # via typer -cachetools==7.0.3 +cachetools==7.0.5 # via tox certifi==2026.2.25 # via requests @@ -22,7 +22,7 @@ coveralls==4.1.0 # via -r requirements/ci.in distlib==0.4.0 # via virtualenv -filelock==3.25.0 +filelock==3.25.1 # via # python-discovery # tox @@ -48,7 +48,7 @@ pygments==2.19.2 # via rich pyproject-api==1.10.0 # via tox -python-discovery==1.1.0 +python-discovery==1.1.3 # via virtualenv requests==2.32.5 # via coveralls @@ -58,11 +58,11 @@ shellingham==1.5.4 # via typer tomli-w==1.2.0 # via tox -tox==4.49.0 +tox==4.49.1 # via -r requirements/ci.in typer==0.24.1 # via coveralls urllib3==2.6.3 # via requests -virtualenv==21.1.0 +virtualenv==21.2.0 # via tox diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 116e8bf2..9955a103 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -10,3 +10,8 @@ # Common constraints for edx repos -c common_constraints.txt + +# setuptools 82+ removed pkg_resources, which fs (pyfilesystem2) uses for +# namespace package declarations in fs/__init__.py. Pin until fs is updated. +# See: https://github.com/PyFilesystem/pyfilesystem2/issues/577 +setuptools<82 diff --git a/requirements/dev.txt b/requirements/dev.txt index 4cd91a26..bee10284 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -14,13 +14,13 @@ astroid==4.0.4 # via # pylint # pylint-celery -boto3==1.42.62 +boto3==1.42.65 # via -r requirements/test.in -botocore==1.42.62 +botocore==1.42.65 # via # boto3 # s3transfer -cachetools==7.0.3 +cachetools==7.0.5 # via # -r requirements/base.in # tox @@ -122,7 +122,7 @@ edx-opaque-keys==3.1.0 # via edx-drf-extensions edx-toggles==5.4.1 # via -r requirements/base.in -filelock==3.25.0 +filelock==3.25.1 # via # python-discovery # tox @@ -143,7 +143,7 @@ isort==8.0.1 # pylint jaraco-classes==3.4.0 # via keyring -jaraco-context==6.1.0 +jaraco-context==6.1.1 # via keyring jaraco-functools==4.4.0 # via keyring @@ -257,7 +257,7 @@ pytest-django==4.12.0 # via -r requirements/test.in python-dateutil==2.9.0.post0 # via botocore -python-discovery==1.1.0 +python-discovery==1.1.3 # via virtualenv python-slugify==8.0.4 # via code-annotations @@ -314,7 +314,7 @@ tomli-w==1.2.0 # via tox tomlkit==0.14.0 # via pylint -tox==4.49.0 +tox==4.49.1 # via -r requirements/ci.in twine==6.2.0 # via -r requirements/quality.in @@ -331,10 +331,13 @@ urllib3==2.6.3 # requests # responses # twine -virtualenv==21.1.0 +virtualenv==21.2.0 # via tox yarl==1.23.0 # via pact-python # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==81.0.0 + # via + # -c requirements/constraints.txt + # fs diff --git a/requirements/pip.txt b/requirements/pip.txt index 084d708e..8bd16d64 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -12,5 +12,7 @@ wheel==0.46.3 # The following packages are considered to be unsafe in a requirements file: pip==26.0.1 # via -r requirements/pip.in -setuptools==82.0.0 - # via -r requirements/pip.in +setuptools==81.0.0 + # via + # -c requirements/constraints.txt + # -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 2fc72618..b0daee56 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -12,13 +12,13 @@ astroid==4.0.4 # via # pylint # pylint-celery -boto3==1.42.62 +boto3==1.42.65 # via -r requirements/test.in -botocore==1.42.62 +botocore==1.42.65 # via # boto3 # s3transfer -cachetools==7.0.3 +cachetools==7.0.5 # via -r requirements/base.in certifi==2026.2.25 # via requests @@ -122,7 +122,7 @@ isort==8.0.1 # pylint jaraco-classes==3.4.0 # via keyring -jaraco-context==6.1.0 +jaraco-context==6.1.1 # via keyring jaraco-functools==4.4.0 # via keyring @@ -288,4 +288,7 @@ yarl==1.23.0 # via pact-python # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==81.0.0 + # via + # -c requirements/constraints.txt + # fs diff --git a/requirements/test.txt b/requirements/test.txt index a8962729..15aa5369 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -8,13 +8,13 @@ appdirs==1.4.4 # via fs asgiref==3.11.1 # via django -boto3==1.42.62 +boto3==1.42.65 # via -r requirements/test.in -botocore==1.42.62 +botocore==1.42.65 # via # boto3 # s3transfer -cachetools==7.0.3 +cachetools==7.0.5 # via -r requirements/base.in certifi==2026.2.25 # via requests @@ -193,4 +193,7 @@ yarl==1.23.0 # via pact-python # The following packages are considered to be unsafe in a requirements file: -# setuptools +setuptools==81.0.0 + # via + # -c requirements/constraints.txt + # fs From 97fa9c43fe36941c2d7aeb52087286f005e4cf2f Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Thu, 12 Mar 2026 11:18:50 -0400 Subject: [PATCH 5/6] fix: pin pact-python<3 and suppress pylint 4.x false positive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pact-python 3.x has a breaking API change from 2.x; pin to <3 until verify_pact.py is updated. Track: openedx/edx-val#598 Also suppress a pylint 4.x false positive (no-member on super().deconstruct() in ListField) — Django's Field.deconstruct() clearly exists but pylint 4 fails to see it through the TextField inheritance chain. Co-Authored-By: Claude Sonnet 4.6 --- edxval/models.py | 2 +- requirements/constraints.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/edxval/models.py b/edxval/models.py index 72773398..60ff04c0 100644 --- a/edxval/models.py +++ b/edxval/models.py @@ -298,7 +298,7 @@ def validate_list(self, value): return validate_generated_images(value, self.max_items) def deconstruct(self): - name, path, args, kwargs = super().deconstruct() + name, path, args, kwargs = super().deconstruct() # pylint: disable=no-member # Only include kwarg if it's not the default if self.max_items != LIST_MAX_ITEMS: kwargs['max_items'] = self.max_items diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 9955a103..53ab4a7a 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -15,3 +15,9 @@ # namespace package declarations in fs/__init__.py. Pin until fs is updated. # See: https://github.com/PyFilesystem/pyfilesystem2/issues/577 setuptools<82 + +# pact-python 3.x has a completely different API from 2.x. +# The verify_pact.py code uses the 2.x API (Verifier with provider/provider_base_url kwargs). +# Pin until the code is updated to use the new API. +# See: https://github.com/openedx/edx-val/issues/598 +pact-python<3 From e0043abf6d4a72ab64c827290f288037dc2b6f5d Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Thu, 12 Mar 2026 11:19:17 -0400 Subject: [PATCH 6/6] chore: regenerate requirements after pact-python<3 pin Co-Authored-By: Claude Sonnet 4.6 --- requirements/ci.txt | 2 +- requirements/dev.txt | 64 ++++++++++++++++++++++++++++++---------- requirements/quality.txt | 60 +++++++++++++++++++++++++++++-------- requirements/test.txt | 60 +++++++++++++++++++++++++++++-------- 4 files changed, 144 insertions(+), 42 deletions(-) diff --git a/requirements/ci.txt b/requirements/ci.txt index 535be5bb..17984d38 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -22,7 +22,7 @@ coveralls==4.1.0 # via -r requirements/ci.in distlib==0.4.0 # via virtualenv -filelock==3.25.1 +filelock==3.25.2 # via # python-discovery # tox diff --git a/requirements/dev.txt b/requirements/dev.txt index bee10284..21373adc 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -5,7 +5,13 @@ # make upgrade # annotated-doc==0.0.4 - # via typer + # via + # fastapi + # typer +annotated-types==0.7.0 + # via pydantic +anyio==4.12.1 + # via starlette appdirs==1.4.4 # via fs asgiref==3.11.1 @@ -14,9 +20,9 @@ astroid==4.0.4 # via # pylint # pylint-celery -boto3==1.42.65 +boto3==1.42.66 # via -r requirements/test.in -botocore==1.42.65 +botocore==1.42.66 # via # boto3 # s3transfer @@ -26,12 +32,12 @@ cachetools==7.0.5 # tox certifi==2026.2.25 # via requests -cffi==2.0.0 +cffi==1.17.1 # via # cryptography - # pact-python-ffi + # pact-python # pynacl -chardet==7.0.1 +chardet==7.1.0 # via # diff-cover # pysrt @@ -43,7 +49,9 @@ click==8.3.1 # code-annotations # edx-django-utils # edx-lint + # pact-python # typer + # uvicorn click-log==0.4.0 # via edx-lint code-annotations==2.3.2 @@ -59,7 +67,7 @@ coverage[toml]==7.13.4 # pytest-cov coveralls==4.1.0 # via -r requirements/ci.in -cryptography==46.0.5 +cryptography==46.0.0 # via # pyjwt # secretstorage @@ -122,17 +130,22 @@ edx-opaque-keys==3.1.0 # via edx-drf-extensions edx-toggles==5.4.1 # via -r requirements/base.in -filelock==3.25.1 +fastapi==0.135.1 + # via pact-python +filelock==3.25.2 # via # python-discovery # tox # virtualenv fs==2.4.16 # via -r requirements/test.in +h11==0.16.0 + # via uvicorn id==1.6.1 # via twine idna==3.11 # via + # anyio # requests # yarl iniconfig==2.3.0 @@ -187,10 +200,10 @@ packaging==26.0 # pytest # tox # twine -pact-python==3.2.1 - # via -r requirements/test.in -pact-python-ffi==0.4.28.2 - # via pact-python +pact-python==2.3.3 + # via + # -c requirements/constraints.txt + # -r requirements/test.in pillow==12.1.1 # via -r requirements/base.in platformdirs==4.9.4 @@ -208,11 +221,17 @@ pluggy==1.6.0 propcache==0.4.1 # via yarl psutil==7.2.2 - # via edx-django-utils + # via + # edx-django-utils + # pact-python pycodestyle==2.14.0 # via -r requirements/quality.in pycparser==3.0 # via cffi +pydantic==2.12.5 + # via fastapi +pydantic-core==2.41.5 + # via pydantic pydocstyle==6.3.0 # via -r requirements/quality.in pygments==2.19.2 @@ -241,7 +260,7 @@ pylint-plugin-utils==0.9.0 # pylint-django pymongo==4.16.0 # via edx-opaque-keys -pynacl==1.6.2 +pynacl==1.6.0 # via edx-django-utils pyproject-api==1.10.0 # via tox @@ -272,6 +291,7 @@ requests==2.32.5 # via # coveralls # edx-drf-extensions + # pact-python # requests-toolbelt # responses # twine @@ -298,11 +318,14 @@ six==1.17.0 # edx-django-release-util # edx-lint # fs + # pact-python # python-dateutil snowballstemmer==3.0.1 # via pydocstyle sqlparse==0.5.5 # via django +starlette==0.52.1 + # via fastapi stevedore==5.7.0 # via # code-annotations @@ -322,8 +345,17 @@ typer==0.24.1 # via coveralls typing-extensions==4.15.0 # via + # anyio # edx-opaque-keys - # pact-python + # fastapi + # pydantic + # pydantic-core + # starlette + # typing-inspection +typing-inspection==0.4.2 + # via + # fastapi + # pydantic urllib3==2.6.3 # via # botocore @@ -331,6 +363,8 @@ urllib3==2.6.3 # requests # responses # twine +uvicorn==0.41.0 + # via pact-python virtualenv==21.2.0 # via tox yarl==1.23.0 diff --git a/requirements/quality.txt b/requirements/quality.txt index b0daee56..c5b0c116 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -4,6 +4,12 @@ # # make upgrade # +annotated-doc==0.0.4 + # via fastapi +annotated-types==0.7.0 + # via pydantic +anyio==4.12.1 + # via starlette appdirs==1.4.4 # via fs asgiref==3.11.1 @@ -12,9 +18,9 @@ astroid==4.0.4 # via # pylint # pylint-celery -boto3==1.42.65 +boto3==1.42.66 # via -r requirements/test.in -botocore==1.42.65 +botocore==1.42.66 # via # boto3 # s3transfer @@ -22,12 +28,12 @@ cachetools==7.0.5 # via -r requirements/base.in certifi==2026.2.25 # via requests -cffi==2.0.0 +cffi==1.17.1 # via # cryptography - # pact-python-ffi + # pact-python # pynacl -chardet==7.0.1 +chardet==7.1.0 # via pysrt charset-normalizer==3.4.5 # via requests @@ -37,6 +43,8 @@ click==8.3.1 # code-annotations # edx-django-utils # edx-lint + # pact-python + # uvicorn click-log==0.4.0 # via edx-lint code-annotations==2.3.2 @@ -47,7 +55,7 @@ coverage[toml]==7.13.4 # via # -r requirements/test.in # pytest-cov -cryptography==46.0.5 +cryptography==46.0.0 # via # pyjwt # secretstorage @@ -106,12 +114,17 @@ edx-opaque-keys==3.1.0 # via edx-drf-extensions edx-toggles==5.4.1 # via -r requirements/base.in +fastapi==0.135.1 + # via pact-python fs==2.4.16 # via -r requirements/test.in +h11==0.16.0 + # via uvicorn id==1.6.1 # via twine idna==3.11 # via + # anyio # requests # yarl iniconfig==2.3.0 @@ -162,10 +175,10 @@ packaging==26.0 # via # pytest # twine -pact-python==3.2.1 - # via -r requirements/test.in -pact-python-ffi==0.4.28.2 - # via pact-python +pact-python==2.3.3 + # via + # -c requirements/constraints.txt + # -r requirements/test.in pillow==12.1.1 # via -r requirements/base.in platformdirs==4.9.4 @@ -177,11 +190,17 @@ pluggy==1.6.0 propcache==0.4.1 # via yarl psutil==7.2.2 - # via edx-django-utils + # via + # edx-django-utils + # pact-python pycodestyle==2.14.0 # via -r requirements/quality.in pycparser==3.0 # via cffi +pydantic==2.12.5 + # via fastapi +pydantic-core==2.41.5 + # via pydantic pydocstyle==6.3.0 # via -r requirements/quality.in pygments==2.19.2 @@ -209,7 +228,7 @@ pylint-plugin-utils==0.9.0 # pylint-django pymongo==4.16.0 # via edx-opaque-keys -pynacl==1.6.2 +pynacl==1.6.0 # via edx-django-utils pysrt==1.1.2 # via -r requirements/base.in @@ -235,6 +254,7 @@ readme-renderer==44.0 requests==2.32.5 # via # edx-drf-extensions + # pact-python # requests-toolbelt # responses # twine @@ -257,11 +277,14 @@ six==1.17.0 # edx-django-release-util # edx-lint # fs + # pact-python # python-dateutil snowballstemmer==3.0.1 # via pydocstyle sqlparse==0.5.5 # via django +starlette==0.52.1 + # via fastapi stevedore==5.7.0 # via # code-annotations @@ -275,8 +298,17 @@ twine==6.2.0 # via -r requirements/quality.in typing-extensions==4.15.0 # via + # anyio # edx-opaque-keys - # pact-python + # fastapi + # pydantic + # pydantic-core + # starlette + # typing-inspection +typing-inspection==0.4.2 + # via + # fastapi + # pydantic urllib3==2.6.3 # via # botocore @@ -284,6 +316,8 @@ urllib3==2.6.3 # requests # responses # twine +uvicorn==0.41.0 + # via pact-python yarl==1.23.0 # via pact-python diff --git a/requirements/test.txt b/requirements/test.txt index 15aa5369..cbab2a37 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,13 +4,19 @@ # # make upgrade # +annotated-doc==0.0.4 + # via fastapi +annotated-types==0.7.0 + # via pydantic +anyio==4.12.1 + # via starlette appdirs==1.4.4 # via fs asgiref==3.11.1 # via django -boto3==1.42.65 +boto3==1.42.66 # via -r requirements/test.in -botocore==1.42.65 +botocore==1.42.66 # via # boto3 # s3transfer @@ -18,12 +24,12 @@ cachetools==7.0.5 # via -r requirements/base.in certifi==2026.2.25 # via requests -cffi==2.0.0 +cffi==1.17.1 # via # cryptography - # pact-python-ffi + # pact-python # pynacl -chardet==7.0.1 +chardet==7.1.0 # via pysrt charset-normalizer==3.4.5 # via requests @@ -31,13 +37,15 @@ click==8.3.1 # via # code-annotations # edx-django-utils + # pact-python + # uvicorn code-annotations==2.3.2 # via edx-toggles coverage[toml]==7.13.4 # via # -r requirements/test.in # pytest-cov -cryptography==46.0.5 +cryptography==46.0.0 # via pyjwt ddt==1.7.2 # via -r requirements/test.in @@ -87,10 +95,15 @@ edx-opaque-keys==3.1.0 # via edx-drf-extensions edx-toggles==5.4.1 # via -r requirements/base.in +fastapi==0.135.1 + # via pact-python fs==2.4.16 # via -r requirements/test.in +h11==0.16.0 + # via uvicorn idna==3.11 # via + # anyio # requests # yarl iniconfig==2.3.0 @@ -111,10 +124,10 @@ multidict==6.7.1 # via yarl packaging==26.0 # via pytest -pact-python==3.2.1 - # via -r requirements/test.in -pact-python-ffi==0.4.28.2 - # via pact-python +pact-python==2.3.3 + # via + # -c requirements/constraints.txt + # -r requirements/test.in pillow==12.1.1 # via -r requirements/base.in pluggy==1.6.0 @@ -124,9 +137,15 @@ pluggy==1.6.0 propcache==0.4.1 # via yarl psutil==7.2.2 - # via edx-django-utils + # via + # edx-django-utils + # pact-python pycparser==3.0 # via cffi +pydantic==2.12.5 + # via fastapi +pydantic-core==2.41.5 + # via pydantic pygments==2.19.2 # via pytest pyjwt[crypto]==2.11.0 @@ -135,7 +154,7 @@ pyjwt[crypto]==2.11.0 # edx-drf-extensions pymongo==4.16.0 # via edx-opaque-keys -pynacl==1.6.2 +pynacl==1.6.0 # via edx-django-utils pysrt==1.1.2 # via -r requirements/base.in @@ -159,6 +178,7 @@ pyyaml==6.0.3 requests==2.32.5 # via # edx-drf-extensions + # pact-python # responses responses==0.26.0 # via -r requirements/test.in @@ -170,9 +190,12 @@ six==1.17.0 # via # edx-django-release-util # fs + # pact-python # python-dateutil sqlparse==0.5.5 # via django +starlette==0.52.1 + # via fastapi stevedore==5.7.0 # via # code-annotations @@ -182,13 +205,24 @@ text-unidecode==1.3 # via python-slugify typing-extensions==4.15.0 # via + # anyio # edx-opaque-keys - # pact-python + # fastapi + # pydantic + # pydantic-core + # starlette + # typing-inspection +typing-inspection==0.4.2 + # via + # fastapi + # pydantic urllib3==2.6.3 # via # botocore # requests # responses +uvicorn==0.41.0 + # via pact-python yarl==1.23.0 # via pact-python