From fba1e86ad644a31deab169818cac0a6643ec51af Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 16:52:46 -0500 Subject: [PATCH 1/4] chore: drop Python 3.11 support Remove Python 3.11 from CI matrix, pypi-publish workflow, and package classifiers. Python 3.12 is now the minimum supported version. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yml | 2 +- .github/workflows/pypi-publish.yml | 2 +- setup.py | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 063198ae..8c455dac 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] env: diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml index b7f54680..22a51978 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@v2 with: - python-version: 3.11 + python-version: 3.12 - name: Install pip and pip-tools run: pip install -r requirements/pip-tools.txt diff --git a/setup.py b/setup.py index 8b3d2dbe..73ece471 100755 --- a/setup.py +++ b/setup.py @@ -69,7 +69,6 @@ def get_version(*file_paths): 'License :: OSI Approved :: GNU Affero General Public License v3', 'Operating System :: OS Independent', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Framework :: Django', 'Framework :: Django :: 2.2', From 3b2f851bc261a33348a3113e372a164f09c6a402 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 16:53:34 -0500 Subject: [PATCH 2/4] 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/base.txt | 61 +++++++++++-------- requirements/ci.txt | 22 ++++--- requirements/dev.txt | 118 ++++++++++++++++++++++--------------- requirements/pip-tools.txt | 18 +++--- requirements/quality.txt | 84 +++++++++++++++----------- requirements/testing.txt | 68 +++++++++++++-------- 6 files changed, 223 insertions(+), 148 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 00825937..8d3936c1 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ # -# 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 @@ -8,23 +8,27 @@ amqp==5.3.1 # via kombu annotated-types==0.7.0 # via pydantic -asgiref==3.11.0 +anyio==4.12.1 + # via httpx +asgiref==3.11.1 # via django attrs==25.4.0 # via openedx-events billiard==4.2.4 # via celery -camel-converter[pydantic]==5.0.0 +camel-converter[pydantic]==5.1.0 # via meilisearch -celery==5.6.0 +celery==5.6.2 # via event-tracking -certifi==2025.11.12 +certifi==2026.2.25 # via # elasticsearch + # httpcore + # httpx # requests cffi==2.0.0 # via pynacl -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via requests click==8.3.1 # via @@ -40,9 +44,9 @@ click-plugins==1.1.1.2 # via celery click-repl==0.3.0 # via celery -code-annotations==2.3.0 +code-annotations==2.3.2 # via edx-toggles -django==5.2.9 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/base.in @@ -69,7 +73,7 @@ edx-django-utils==8.0.1 # edx-toggles # event-tracking # openedx-events -edx-opaque-keys[django]==3.0.0 +edx-opaque-keys[django]==3.1.0 # via # edx-ccx-keys # openedx-events @@ -83,51 +87,57 @@ elasticsearch==7.13.4 # -r requirements/base.in event-tracking==3.3.0 # via -r requirements/base.in -exceptiongroup==1.3.1 - # via celery fastavro==1.12.1 # via openedx-events +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via typesense idna==3.11 - # via requests + # via + # anyio + # httpx + # requests jinja2==3.1.6 # via code-annotations -kombu==5.6.1 +kombu==5.6.2 # via celery markupsafe==3.0.3 # via jinja2 -meilisearch==0.38.0 +meilisearch==0.40.0 # via -r requirements/base.in openedx-events==10.5.0 # via event-tracking -packaging==25.0 +packaging==26.0 # via kombu prompt-toolkit==3.0.52 # via click-repl -psutil==7.2.1 +psutil==7.2.2 # via edx-django-utils -pycparser==2.23 +pycparser==3.0 # via cffi pydantic==2.12.5 # via camel-converter pydantic-core==2.41.5 # via pydantic -pymongo==4.15.5 +pymongo==4.16.0 # via # edx-opaque-keys # event-tracking -pynacl==1.6.1 +pynacl==1.6.2 # via edx-django-utils python-dateutil==2.9.0.post0 # via celery python-slugify==8.0.4 # via code-annotations -pytz==2025.2 +pytz==2026.1.post1 # via event-tracking pyyaml==6.0.3 # via code-annotations requests==2.32.5 # via meilisearch - # typesense six==1.17.0 # via # edx-ccx-keys @@ -135,21 +145,22 @@ six==1.17.0 # python-dateutil sqlparse==0.5.5 # via django -stevedore==5.6.0 +stevedore==5.7.0 # via # code-annotations # edx-django-utils # edx-opaque-keys text-unidecode==1.3 # via python-slugify -typesense==1.1.1 +typesense==2.0.0 # via -r requirements/base.in typing-extensions==4.15.0 # via + # anyio # edx-opaque-keys - # exceptiongroup # pydantic # pydantic-core + # typesense # typing-inspection typing-inspection==0.4.2 # via pydantic @@ -166,7 +177,7 @@ vine==5.1.0 # amqp # celery # kombu -wcwidth==0.2.14 +wcwidth==0.6.0 # via prompt-toolkit # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/ci.txt b/requirements/ci.txt index de072109..8e347215 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,34 +1,38 @@ # -# 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==6.2.4 - # via tox -chardet==5.2.0 +cachetools==7.0.3 # via tox colorama==0.4.6 # via tox distlib==0.4.0 # via virtualenv -filelock==3.20.1 +filelock==3.25.0 # via + # python-discovery # tox # virtualenv -packaging==25.0 +packaging==26.0 # via # pyproject-api # tox -platformdirs==4.5.1 +platformdirs==4.9.4 # via + # python-discovery # tox # virtualenv pluggy==1.6.0 # via tox pyproject-api==1.10.0 # via tox -tox==4.32.0 +python-discovery==1.1.0 + # via virtualenv +tomli-w==1.2.0 + # via tox +tox==4.49.0 # via -r requirements/ci.in -virtualenv==20.35.4 +virtualenv==21.1.0 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 66296761..79aae2c6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,5 +1,5 @@ # -# 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 @@ -14,12 +14,17 @@ annotated-types==0.7.0 # -r requirements/quality.txt # -r requirements/testing.txt # pydantic -asgiref==3.11.0 +anyio==4.12.1 + # via + # -r requirements/quality.txt + # -r requirements/testing.txt + # httpx +asgiref==3.11.1 # via # -r requirements/quality.txt # -r requirements/testing.txt # django -astroid==3.3.11 +astroid==4.0.4 # via # -r requirements/quality.txt # pylint @@ -34,40 +39,38 @@ billiard==4.2.4 # -r requirements/quality.txt # -r requirements/testing.txt # celery -build==1.3.0 +build==1.4.0 # via # -r requirements/pip-tools.txt # pip-tools -cachetools==6.2.4 +cachetools==7.0.3 # via # -r requirements/ci.txt # tox -camel-converter[pydantic]==5.0.0 +camel-converter[pydantic]==5.1.0 # via # -r requirements/quality.txt # -r requirements/testing.txt # meilisearch -celery==5.6.0 +celery==5.6.2 # via # -r requirements/quality.txt # -r requirements/testing.txt # event-tracking -certifi==2025.11.12 +certifi==2026.2.25 # via # -r requirements/quality.txt # -r requirements/testing.txt # elasticsearch + # httpcore + # httpx # requests cffi==2.0.0 # via # -r requirements/quality.txt # -r requirements/testing.txt # pynacl -chardet==5.2.0 - # via - # -r requirements/ci.txt - # tox -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -105,7 +108,7 @@ click-repl==0.3.0 # -r requirements/quality.txt # -r requirements/testing.txt # celery -code-annotations==2.3.0 +code-annotations==2.3.2 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -115,7 +118,7 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.13.1 +coverage[toml]==7.13.4 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -125,7 +128,7 @@ ddt==1.3.1 # -c requirements/constraints.txt # -r requirements/quality.txt # -r requirements/testing.txt -dill==0.4.0 +dill==0.4.1 # via # -r requirements/quality.txt # pylint @@ -133,7 +136,7 @@ distlib==0.4.0 # via # -r requirements/ci.txt # virtualenv -django==5.2.9 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/quality.txt @@ -175,7 +178,7 @@ edx-django-utils==8.0.1 # openedx-events edx-lint==5.6.0 # via -r requirements/quality.txt -edx-opaque-keys[django]==3.0.0 +edx-opaque-keys[django]==3.1.0 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -195,32 +198,45 @@ event-tracking==3.3.0 # via # -r requirements/quality.txt # -r requirements/testing.txt -exceptiongroup==1.3.1 - # via - # -r requirements/quality.txt - # -r requirements/testing.txt - # celery fastavro==1.12.1 # via # -r requirements/quality.txt # -r requirements/testing.txt # openedx-events -filelock==3.20.1 +filelock==3.25.0 # via # -r requirements/ci.txt + # python-discovery # tox # virtualenv +h11==0.16.0 + # via + # -r requirements/quality.txt + # -r requirements/testing.txt + # httpcore +httpcore==1.0.9 + # via + # -r requirements/quality.txt + # -r requirements/testing.txt + # httpx +httpx==0.28.1 + # via + # -r requirements/quality.txt + # -r requirements/testing.txt + # typesense idna==3.11 # via # -r requirements/quality.txt # -r requirements/testing.txt + # anyio + # httpx # requests iniconfig==2.3.0 # via # -r requirements/quality.txt # -r requirements/testing.txt # pytest -isort==6.1.0 +isort==8.0.1 # via # -r requirements/quality.txt # pylint @@ -229,7 +245,7 @@ jinja2==3.1.6 # -r requirements/quality.txt # -r requirements/testing.txt # code-annotations -kombu==5.6.1 +kombu==5.6.2 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -243,7 +259,7 @@ mccabe==0.7.0 # via # -r requirements/quality.txt # pylint -meilisearch==0.38.0 +meilisearch==0.40.0 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -256,7 +272,7 @@ openedx-events==10.5.0 # -r requirements/quality.txt # -r requirements/testing.txt # event-tracking -packaging==25.0 +packaging==26.0 # via # -r requirements/ci.txt # -r requirements/pip-tools.txt @@ -267,13 +283,15 @@ packaging==25.0 # pyproject-api # pytest # tox -pip-tools==7.5.2 + # wheel +pip-tools==7.5.3 # via -r requirements/pip-tools.txt -platformdirs==4.5.1 +platformdirs==4.9.4 # via # -r requirements/ci.txt # -r requirements/quality.txt # pylint + # python-discovery # tox # virtualenv pluggy==1.6.0 @@ -289,14 +307,14 @@ prompt-toolkit==3.0.52 # -r requirements/quality.txt # -r requirements/testing.txt # click-repl -psutil==7.2.1 +psutil==7.2.2 # via # -r requirements/quality.txt # -r requirements/testing.txt # edx-django-utils pycodestyle==2.14.0 # via -r requirements/quality.txt -pycparser==2.23 +pycparser==3.0 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -316,7 +334,7 @@ pygments==2.19.2 # -r requirements/quality.txt # -r requirements/testing.txt # pytest -pylint==3.3.9 +pylint==4.0.5 # via # -r requirements/quality.txt # edx-lint @@ -327,7 +345,7 @@ pylint-celery==0.3 # via # -r requirements/quality.txt # edx-lint -pylint-django==2.6.1 +pylint-django==2.7.0 # via # -r requirements/quality.txt # edx-lint @@ -336,13 +354,13 @@ pylint-plugin-utils==0.9.0 # -r requirements/quality.txt # pylint-celery # pylint-django -pymongo==4.15.5 +pymongo==4.16.0 # via # -r requirements/quality.txt # -r requirements/testing.txt # edx-opaque-keys # event-tracking -pynacl==1.6.1 +pynacl==1.6.2 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -370,12 +388,16 @@ python-dateutil==2.9.0.post0 # -r requirements/quality.txt # -r requirements/testing.txt # celery +python-discovery==1.1.0 + # via + # -r requirements/ci.txt + # virtualenv python-slugify==8.0.4 # via # -r requirements/quality.txt # -r requirements/testing.txt # code-annotations -pytz==2025.2 +pytz==2026.1.post1 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -390,7 +412,6 @@ requests==2.32.5 # -r requirements/quality.txt # -r requirements/testing.txt # meilisearch - # typesense six==1.17.0 # via # -r requirements/quality.txt @@ -404,7 +425,7 @@ sqlparse==0.5.5 # -r requirements/quality.txt # -r requirements/testing.txt # django -stevedore==5.6.0 +stevedore==5.7.0 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -416,13 +437,17 @@ text-unidecode==1.3 # -r requirements/quality.txt # -r requirements/testing.txt # python-slugify -tomlkit==0.13.3 +tomli-w==1.2.0 + # via + # -r requirements/ci.txt + # tox +tomlkit==0.14.0 # via # -r requirements/quality.txt # pylint -tox==4.32.0 +tox==4.49.0 # via -r requirements/ci.txt -typesense==1.1.1 +typesense==2.0.0 # via # -r requirements/quality.txt # -r requirements/testing.txt @@ -430,10 +455,11 @@ typing-extensions==4.15.0 # via # -r requirements/quality.txt # -r requirements/testing.txt + # anyio # edx-opaque-keys - # exceptiongroup # pydantic # pydantic-core + # typesense # typing-inspection typing-inspection==0.4.2 # via @@ -463,16 +489,16 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==20.35.4 +virtualenv==21.1.0 # via # -r requirements/ci.txt # tox -wcwidth==0.2.14 +wcwidth==0.6.0 # via # -r requirements/quality.txt # -r requirements/testing.txt # prompt-toolkit -wheel==0.45.1 +wheel==0.46.3 # via # -r requirements/pip-tools.txt # pip-tools diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 15f0cc77..ce8dc38f 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,26 +1,28 @@ # -# 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.3.0 +build==1.4.0 # via pip-tools click==8.3.1 # via pip-tools -packaging==25.0 - # via build -pip-tools==7.5.2 +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: -pip==25.3 +pip==26.0.1 # via pip-tools -setuptools==80.9.0 +setuptools==82.0.0 # via pip-tools diff --git a/requirements/quality.txt b/requirements/quality.txt index 8b52cb9b..ebdab967 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,5 +1,5 @@ # -# 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 @@ -12,11 +12,15 @@ annotated-types==0.7.0 # via # -r requirements/testing.txt # pydantic -asgiref==3.11.0 +anyio==4.12.1 + # via + # -r requirements/testing.txt + # httpx +asgiref==3.11.1 # via # -r requirements/testing.txt # django -astroid==3.3.11 +astroid==4.0.4 # via # pylint # pylint-celery @@ -28,24 +32,26 @@ billiard==4.2.4 # via # -r requirements/testing.txt # celery -camel-converter[pydantic]==5.0.0 +camel-converter[pydantic]==5.1.0 # via # -r requirements/testing.txt # meilisearch -celery==5.6.0 +celery==5.6.2 # via # -r requirements/testing.txt # event-tracking -certifi==2025.11.12 +certifi==2026.2.25 # via # -r requirements/testing.txt # elasticsearch + # httpcore + # httpx # requests cffi==2.0.0 # via # -r requirements/testing.txt # pynacl -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via # -r requirements/testing.txt # requests @@ -74,12 +80,12 @@ click-repl==0.3.0 # via # -r requirements/testing.txt # celery -code-annotations==2.3.0 +code-annotations==2.3.2 # via # -r requirements/testing.txt # edx-lint # edx-toggles -coverage[toml]==7.13.1 +coverage[toml]==7.13.4 # via # -r requirements/quality.in # -r requirements/testing.txt @@ -88,9 +94,9 @@ ddt==1.3.1 # via # -c requirements/constraints.txt # -r requirements/testing.txt -dill==0.4.0 +dill==0.4.1 # via pylint -django==5.2.9 +django==5.2.12 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/testing.txt @@ -126,7 +132,7 @@ edx-django-utils==8.0.1 # openedx-events edx-lint==5.6.0 # via -r requirements/quality.in -edx-opaque-keys[django]==3.0.0 +edx-opaque-keys[django]==3.1.0 # via # -r requirements/testing.txt # edx-ccx-keys @@ -141,29 +147,39 @@ elasticsearch==7.13.4 # -r requirements/testing.txt event-tracking==3.3.0 # via -r requirements/testing.txt -exceptiongroup==1.3.1 - # via - # -r requirements/testing.txt - # celery fastavro==1.12.1 # via # -r requirements/testing.txt # openedx-events +h11==0.16.0 + # via + # -r requirements/testing.txt + # httpcore +httpcore==1.0.9 + # via + # -r requirements/testing.txt + # httpx +httpx==0.28.1 + # via + # -r requirements/testing.txt + # typesense idna==3.11 # via # -r requirements/testing.txt + # anyio + # httpx # requests iniconfig==2.3.0 # via # -r requirements/testing.txt # pytest -isort==6.1.0 +isort==8.0.1 # via pylint jinja2==3.1.6 # via # -r requirements/testing.txt # code-annotations -kombu==5.6.1 +kombu==5.6.2 # via # -r requirements/testing.txt # celery @@ -173,7 +189,7 @@ markupsafe==3.0.3 # jinja2 mccabe==0.7.0 # via pylint -meilisearch==0.38.0 +meilisearch==0.40.0 # via -r requirements/testing.txt mock==5.2.0 # via -r requirements/testing.txt @@ -181,12 +197,12 @@ openedx-events==10.5.0 # via # -r requirements/testing.txt # event-tracking -packaging==25.0 +packaging==26.0 # via # -r requirements/testing.txt # kombu # pytest -platformdirs==4.5.1 +platformdirs==4.9.4 # via pylint pluggy==1.6.0 # via @@ -197,13 +213,13 @@ prompt-toolkit==3.0.52 # via # -r requirements/testing.txt # click-repl -psutil==7.2.1 +psutil==7.2.2 # via # -r requirements/testing.txt # edx-django-utils pycodestyle==2.14.0 # via -r requirements/quality.in -pycparser==2.23 +pycparser==3.0 # via # -r requirements/testing.txt # cffi @@ -219,7 +235,7 @@ pygments==2.19.2 # via # -r requirements/testing.txt # pytest -pylint==3.3.9 +pylint==4.0.5 # via # edx-lint # pylint-celery @@ -227,18 +243,18 @@ pylint==3.3.9 # 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.9.0 # via # pylint-celery # pylint-django -pymongo==4.15.5 +pymongo==4.16.0 # via # -r requirements/testing.txt # edx-opaque-keys # event-tracking -pynacl==1.6.1 +pynacl==1.6.2 # via # -r requirements/testing.txt # edx-django-utils @@ -256,7 +272,7 @@ python-slugify==8.0.4 # via # -r requirements/testing.txt # code-annotations -pytz==2025.2 +pytz==2026.1.post1 # via # -r requirements/testing.txt # event-tracking @@ -268,7 +284,6 @@ requests==2.32.5 # via # -r requirements/testing.txt # meilisearch - # typesense six==1.17.0 # via # -r requirements/testing.txt @@ -280,7 +295,7 @@ sqlparse==0.5.5 # via # -r requirements/testing.txt # django -stevedore==5.6.0 +stevedore==5.7.0 # via # -r requirements/testing.txt # code-annotations @@ -290,17 +305,18 @@ text-unidecode==1.3 # via # -r requirements/testing.txt # python-slugify -tomlkit==0.13.3 +tomlkit==0.14.0 # via pylint -typesense==1.1.1 +typesense==2.0.0 # via -r requirements/testing.txt typing-extensions==4.15.0 # via # -r requirements/testing.txt + # anyio # edx-opaque-keys - # exceptiongroup # pydantic # pydantic-core + # typesense # typing-inspection typing-inspection==0.4.2 # via @@ -325,7 +341,7 @@ vine==5.1.0 # amqp # celery # kombu -wcwidth==0.2.14 +wcwidth==0.6.0 # via # -r requirements/testing.txt # prompt-toolkit diff --git a/requirements/testing.txt b/requirements/testing.txt index 45828003..0fdfce27 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -1,5 +1,5 @@ # -# 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 @@ -12,7 +12,11 @@ annotated-types==0.7.0 # via # -r requirements/base.txt # pydantic -asgiref==3.11.0 +anyio==4.12.1 + # via + # -r requirements/base.txt + # httpx +asgiref==3.11.1 # via # -r requirements/base.txt # django @@ -24,24 +28,26 @@ billiard==4.2.4 # via # -r requirements/base.txt # celery -camel-converter[pydantic]==5.0.0 +camel-converter[pydantic]==5.1.0 # via # -r requirements/base.txt # meilisearch -celery==5.6.0 +celery==5.6.2 # via # -r requirements/base.txt # event-tracking -certifi==2025.11.12 +certifi==2026.2.25 # via # -r requirements/base.txt # elasticsearch + # httpcore + # httpx # requests cffi==2.0.0 # via # -r requirements/base.txt # pynacl -charset-normalizer==3.4.4 +charset-normalizer==3.4.5 # via # -r requirements/base.txt # requests @@ -66,11 +72,11 @@ click-repl==0.3.0 # via # -r requirements/base.txt # celery -code-annotations==2.3.0 +code-annotations==2.3.2 # via # -r requirements/base.txt # edx-toggles -coverage[toml]==7.13.1 +coverage[toml]==7.13.4 # via # -r requirements/testing.in # pytest-cov @@ -111,7 +117,7 @@ edx-django-utils==8.0.1 # edx-toggles # event-tracking # openedx-events -edx-opaque-keys[django]==3.0.0 +edx-opaque-keys[django]==3.1.0 # via # -r requirements/base.txt # edx-ccx-keys @@ -126,17 +132,27 @@ elasticsearch==7.13.4 # -r requirements/base.txt event-tracking==3.3.0 # via -r requirements/base.txt -exceptiongroup==1.3.1 - # via - # -r requirements/base.txt - # celery fastavro==1.12.1 # via # -r requirements/base.txt # openedx-events +h11==0.16.0 + # via + # -r requirements/base.txt + # httpcore +httpcore==1.0.9 + # via + # -r requirements/base.txt + # httpx +httpx==0.28.1 + # via + # -r requirements/base.txt + # typesense idna==3.11 # via # -r requirements/base.txt + # anyio + # httpx # requests iniconfig==2.3.0 # via pytest @@ -144,7 +160,7 @@ jinja2==3.1.6 # via # -r requirements/base.txt # code-annotations -kombu==5.6.1 +kombu==5.6.2 # via # -r requirements/base.txt # celery @@ -152,7 +168,7 @@ markupsafe==3.0.3 # via # -r requirements/base.txt # jinja2 -meilisearch==0.38.0 +meilisearch==0.40.0 # via -r requirements/base.txt mock==5.2.0 # via -r requirements/testing.in @@ -160,7 +176,7 @@ openedx-events==10.5.0 # via # -r requirements/base.txt # event-tracking -packaging==25.0 +packaging==26.0 # via # -r requirements/base.txt # kombu @@ -173,11 +189,11 @@ prompt-toolkit==3.0.52 # via # -r requirements/base.txt # click-repl -psutil==7.2.1 +psutil==7.2.2 # via # -r requirements/base.txt # edx-django-utils -pycparser==2.23 +pycparser==3.0 # via # -r requirements/base.txt # cffi @@ -191,12 +207,12 @@ pydantic-core==2.41.5 # pydantic pygments==2.19.2 # via pytest -pymongo==4.15.5 +pymongo==4.16.0 # via # -r requirements/base.txt # edx-opaque-keys # event-tracking -pynacl==1.6.1 +pynacl==1.6.2 # via # -r requirements/base.txt # edx-django-utils @@ -212,7 +228,7 @@ python-slugify==8.0.4 # via # -r requirements/base.txt # code-annotations -pytz==2025.2 +pytz==2026.1.post1 # via # -r requirements/base.txt # event-tracking @@ -224,7 +240,6 @@ requests==2.32.5 # via # -r requirements/base.txt # meilisearch - # typesense six==1.17.0 # via # -r requirements/base.txt @@ -235,7 +250,7 @@ sqlparse==0.5.5 # via # -r requirements/base.txt # django -stevedore==5.6.0 +stevedore==5.7.0 # via # -r requirements/base.txt # code-annotations @@ -245,15 +260,16 @@ text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify -typesense==1.1.1 +typesense==2.0.0 # via -r requirements/base.txt typing-extensions==4.15.0 # via # -r requirements/base.txt + # anyio # edx-opaque-keys - # exceptiongroup # pydantic # pydantic-core + # typesense # typing-inspection typing-inspection==0.4.2 # via @@ -278,7 +294,7 @@ vine==5.1.0 # amqp # celery # kombu -wcwidth==0.2.14 +wcwidth==0.6.0 # via # -r requirements/base.txt # prompt-toolkit From f6e2fb8adeecbdfafbdd3b4efafcab81ca236e31 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 6 Mar 2026 16:53:52 -0500 Subject: [PATCH 3/4] chore: bump version to 5.0.0 Co-Authored-By: Claude Sonnet 4.6 --- edxsearch/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edxsearch/__init__.py b/edxsearch/__init__.py index a054cbd3..ffaf23fc 100644 --- a/edxsearch/__init__.py +++ b/edxsearch/__init__.py @@ -1,3 +1,3 @@ """ Container module for testing / demoing search """ -__version__ = '4.4.0' +__version__ = '5.0.0' From d7029deaa8780afa9b25bddd5bb7394a0bf58ce6 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Wed, 11 Mar 2026 11:18:27 -0400 Subject: [PATCH 4/4] feat!: upgrade typesense-python to 2.0, requires Typesense Server >= v30.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typesense-python 2.0 is a full rewrite adding async support. The sync client is now generated from async code and lives under typesense.sync.* instead of the top-level typesense.* namespace. Breaking changes from typesense-python 1.x → 2.0: - Collection class moved: typesense.collection → typesense.sync.collection - Requires Typesense Server >= v30.0 (previously >= v28.0) - No official migration guide; see release: https://github.com/typesense/typesense-python/releases/tag/v2.0.0 BREAKING CHANGE: If you use SEARCH_ENGINE = "search.typesense.TypesenseEngine" you must upgrade your Typesense server to >= v30.0 before deploying this version of edx-search. Deploying against an older server will result in API incompatibilities. Co-Authored-By: Claude Sonnet 4.6 --- README.md | 30 ++++++++++++++++++++++++++++++ search/typesense.py | 10 +++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f3abad1c..f9925615 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,36 @@ This is a django application to provide access to search services from within ed Searching is accomplished by creating an index of documents, and then searching within that index for matching information. This application provides a way to add documents to the index, and then search for them. +## Typesense Engine + +edx-search includes an optional `TypesenseEngine` backend (`search.typesense.TypesenseEngine`). + +### Server version requirement + +| typesense-python | Typesense Server | +|------------------|-----------------| +| >= 2.0.0 | >= v30.0 | +| >= 1.0.0 | >= v28.0 | + +**This version of edx-search requires typesense-python >= 2.0.0 and therefore Typesense Server >= v30.0.** +If you are running an older Typesense server you must upgrade it before deploying this version of edx-search. + +See the full compatibility table at https://github.com/typesense/typesense-python#compatibility. + +### Enabling the Typesense engine + +```python +SEARCH_ENGINE = "search.typesense.TypesenseEngine" +``` + +You will also need to configure the Typesense connection in your Django settings (host, port, API key). +After switching, create the indices using the shell (no management command exists yet — see +https://github.com/openedx/edx-platform/issues/36868 for the longer-term plan): + +```shell +./manage.py lms shell -c "import search.typesense; search.typesense.create_indexes()" +``` + ## SearchEngine The SearchEngine is an abstract object which may have multiple implementations _(at the time of writing there are 2 in existence - Elasticsearch and MockSearchEngine, which is primarily used for testing)_ diff --git a/search/typesense.py b/search/typesense.py index a96dc5e1..7ee27461 100644 --- a/search/typesense.py +++ b/search/typesense.py @@ -22,6 +22,14 @@ Typesense. A proper long-term approach is needed for all our search engines, as discussed at https://github.com/openedx/edx-platform/issues/36868 . +Server version requirement +-------------------------- +This module requires typesense-python >= 2.0.0, which in turn requires +Typesense Server >= v30.0. If you are upgrading from a previous version of +edx-search, you must upgrade your Typesense server before deploying. + +See the compatibility table: https://github.com/typesense/typesense-python#compatibility + For more information about the Typesense API in Python, check https://github.com/typesense/typesense-python """ @@ -31,7 +39,7 @@ from django.conf import settings from django.utils import timezone import typesense -from typesense.collection import Collection +from typesense.sync.collection import Collection # moved in typesense-python 2.0 from typesense.exceptions import ObjectNotFound, RequestMalformed, ServerError from typesense.types.collection import RegularCollectionFieldSchema from typesense.types.document import Hit, SearchResponse