From 4a07e48130e12371ec9c03295dbb1351c522681c Mon Sep 17 00:00:00 2001 From: Usama Sadiq Date: Mon, 9 Sep 2024 20:04:44 +0500 Subject: [PATCH] feat!: Python 3.12 Upgrade (#4405) --- .github/workflows/ci.yml | 12 +-- .github/workflows/migrations-check-mysql8.yml | 2 +- .github/workflows/requirements-upgrade.yml | 2 +- Dockerfile | 15 +++- Makefile | 2 - .../api/v1/tests/test_views/test_catalogs.py | 4 +- .../api/v1/tests/test_views/test_search.py | 29 +----- .../apps/course_metadata/admin.py | 4 +- .../apps/course_metadata/models.py | 4 +- .../apps/course_metadata/tests/test_utils.py | 2 +- .../apps/course_metadata/utils.py | 1 - requirements/django.txt | 2 +- requirements/docs.txt | 26 +++--- requirements/local.txt | 90 ++++++------------- requirements/pip.txt | 4 +- requirements/pip_tools.txt | 10 +-- requirements/production.txt | 50 +++-------- tox.ini | 2 +- 18 files changed, 85 insertions(+), 176 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9fc84af3fd..7483eac258 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['py38', 'py311', 'py312'] + python-version: ['py312'] django-version: ['django42'] db-version: ['mysql80'] pytest-split-group: [1, 2, 3, 4, 5, 6] @@ -23,8 +23,8 @@ jobs: shell: bash run: | # Remove 'py' and insert a dot to format the version - FORMATTED_VERSION=${{ matrix.python-version }} # e.g., py38 - FORMATTED_VERSION=${FORMATTED_VERSION/py3/3.} # becomes 3.8 + FORMATTED_VERSION=${{ matrix.python-version }} # e.g., py312 + FORMATTED_VERSION=${FORMATTED_VERSION/py3/3.} # becomes 3.12 # Set environment variables echo "PYTHON_VERSION=$FORMATTED_VERSION" >> $GITHUB_ENV @@ -57,7 +57,7 @@ jobs: - uses: actions/checkout@v3 - run: make ci_up env: - PYTHON_VERSION: 3.8 + PYTHON_VERSION: 3.12 - name: Download all artifacts # Downloads coverage1, coverage2, etc. uses: actions/download-artifact@v2 @@ -71,14 +71,14 @@ jobs: - uses: actions/checkout@v3 - run: make ci_up env: - PYTHON_VERSION: 3.8 + PYTHON_VERSION: 3.12 - run: make ci_quality semgrep: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.11', '3.12'] + python-version: ['3.12'] steps: - uses: actions/checkout@v3 - run: make ci_up diff --git a/.github/workflows/migrations-check-mysql8.yml b/.github/workflows/migrations-check-mysql8.yml index 1267ebb5da..7a9e830da7 100644 --- a/.github/workflows/migrations-check-mysql8.yml +++ b/.github/workflows/migrations-check-mysql8.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: os: [ ubuntu-20.04 ] - python-version: [ 3.8 ] + python-version: [ 3.12 ] steps: - name: Checkout repo diff --git a/.github/workflows/requirements-upgrade.yml b/.github/workflows/requirements-upgrade.yml index 527ad7ab7f..c4daddefde 100644 --- a/.github/workflows/requirements-upgrade.yml +++ b/.github/workflows/requirements-upgrade.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: - python-version: [ '3.8' ] + python-version: [ '3.12' ] steps: - name: setup target branch diff --git a/Dockerfile b/Dockerfile index f52fcdf996..1def84d725 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,10 @@ FROM ubuntu:focal as app -ARG PYTHON_VERSION=3.8 +ARG PYTHON_VERSION=3.12 ENV DEBIAN_FRONTEND noninteractive +ENV TZ=UTC + # System requirements. RUN apt-get update && \ apt-get install -y software-properties-common && \ @@ -14,8 +16,6 @@ RUN apt-get update && \ git \ language-pack-en \ build-essential \ - python${PYTHON_VERSION}-dev \ - python${PYTHON_VERSION}-distutils \ libmysqlclient-dev \ libssl-dev \ # TODO: Current version of Pillow (9.5.0) doesn't provide pre-built wheel for python 3.12, @@ -24,7 +24,11 @@ RUN apt-get update && \ libjpeg-dev \ # mysqlclient >= 2.2.0 requires pkg-config. pkg-config \ - libcairo2-dev && \ + libcairo2-dev \ + python3-pip \ + python${PYTHON_VERSION} \ + python${PYTHON_VERSION}-dev \ + python${PYTHON_VERSION}-distutils && \ rm -rf /var/lib/apt/lists/* # Use UTF-8. @@ -47,6 +51,9 @@ ENV DISCOVERY_CODE_DIR "${DISCOVERY_CODE_DIR}" ENV DISCOVERY_APP_DIR "${DISCOVERY_APP_DIR}" ENV PYTHON_VERSION "${PYTHON_VERSION}" +# Setup zoneinfo for Python 3.12 +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} RUN pip install virtualenv diff --git a/Makefile b/Makefile index 17fc1893b3..eac7b4cb87 100644 --- a/Makefile +++ b/Makefile @@ -55,8 +55,6 @@ $(COMMON_CONSTRAINTS_TXT): upgrade: $(COMMON_CONSTRAINTS_TXT) sed 's/django-simple-history==3.0.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp mv requirements/common_constraints.tmp requirements/common_constraints.txt - sed 's/Django<4.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp - mv requirements/common_constraints.tmp requirements/common_constraints.txt pip install -q -r requirements/pip_tools.txt pip-compile --allow-unsafe --upgrade -o requirements/pip.txt requirements/pip.in pip-compile --upgrade -o requirements/pip_tools.txt requirements/pip_tools.in diff --git a/course_discovery/apps/api/v1/tests/test_views/test_catalogs.py b/course_discovery/apps/api/v1/tests/test_views/test_catalogs.py index 9a1e703358..60113be88d 100644 --- a/course_discovery/apps/api/v1/tests/test_views/test_catalogs.py +++ b/course_discovery/apps/api/v1/tests/test_views/test_catalogs.py @@ -269,7 +269,7 @@ def test_courses_with_subjects_and_negative_query(self): start=datetime.datetime(2015, 9, 1, tzinfo=pytz.UTC), status=CourseRunStatus.Published, type__is_marketable=True, - key=f'{name}/{factory.Faker("word").evaluate(None, None, {"locale":"en"})}/test', + key=f'{name}/{factory.Faker("word").evaluate(None, None, {"locale": "en"})}/test', ) SeatFactory.create(course_run=course_run) @@ -279,7 +279,7 @@ def test_courses_with_subjects_and_negative_query(self): start=datetime.datetime(2015, 9, 1, tzinfo=pytz.UTC), status=CourseRunStatus.Published, type__is_marketable=True, - key=f'{name}/{factory.Faker("word").evaluate(None, None, {"locale":"en"})}/test', + key=f'{name}/{factory.Faker("word").evaluate(None, None, {"locale": "en"})}/test', ) SeatFactory.create(course_run=course_run) desired_courses.append(course_run.course) diff --git a/course_discovery/apps/api/v1/tests/test_views/test_search.py b/course_discovery/apps/api/v1/tests/test_views/test_search.py index 5b07b7e348..3bd5b70a71 100644 --- a/course_discovery/apps/api/v1/tests/test_views/test_search.py +++ b/course_discovery/apps/api/v1/tests/test_views/test_search.py @@ -1,6 +1,5 @@ import datetime import json -import sys import urllib.parse import uuid @@ -69,12 +68,7 @@ def assert_successful_search(self, path=None, serializer=None): 'next': None, } actual = response_data['objects'] if path == self.faceted_path else response_data - if sys.version_info > (3, 9): - # Remove this pylint disable once discovery reaches python 3.11+ - # pylint: disable=unsupported-binary-operation - self.assertEqual(actual, actual | expected) # pragma: no cover - else: - self.assertDictContainsSubset(expected, actual) + self.assertEqual(actual, actual | expected) # pragma: no cover return course_run, response_data @@ -99,12 +93,7 @@ def assert_response_includes_availability_facets(self, response_data): }, } - if sys.version_info > (3, 9): - # Remove this pylint disable once discovery reaches python 3.11+ - # pylint: disable=unsupported-binary-operation - self.assertEqual(response_data['queries'], response_data['queries'] | expected) # pragma: no cover - else: - self.assertDictContainsSubset(expected, response_data['queries']) + self.assertEqual(response_data['queries'], response_data['queries'] | expected) # pragma: no cover @ddt.data(faceted_path, list_path, detailed_path) def test_authentication(self, path): @@ -160,12 +149,7 @@ def test_faceted_search(self): 'count': 1, } actual = response_data['fields']['pacing_type'][0] - if sys.version_info > (3, 9): - # Remove this pylint disable once discovery reaches python 3.11+ - # pylint: disable=unsupported-binary-operation - self.assertEqual(actual, actual | expected) # pragma: no cover - else: - self.assertDictContainsSubset(expected, actual) + self.assertEqual(actual, actual | expected) # pragma: no cover def test_invalid_query_facet(self): """ Verify the endpoint returns HTTP 400 if an invalid facet is requested. """ @@ -250,12 +234,7 @@ def test_exclude_unavailable_program_types(self, path, serializer, result_locati self.serialize_course_run_search(course_run, serializer=serializer) ] } - if sys.version_info > (3, 9): - # Remove this pylint disable once discovery reaches python 3.11+ - # pylint: disable=unsupported-binary-operation - self.assertEqual(response_data, response_data | expected) # pragma: no cover - else: - self.assertDictContainsSubset(expected, response_data) + self.assertEqual(response_data, response_data | expected) # pragma: no cover # Check that the program is indeed the active one. for key in result_location_keys: diff --git a/course_discovery/apps/course_metadata/admin.py b/course_discovery/apps/course_metadata/admin.py index 0529400a8b..0917a96cea 100644 --- a/course_discovery/apps/course_metadata/admin.py +++ b/course_discovery/apps/course_metadata/admin.py @@ -877,7 +877,7 @@ def display_degrees_on_org_page(self, request, queryset): updated = queryset.update(display_on_org_page=True) self.message_user( request, - f"{updated} {'degrees were' if updated>1 else 'degree was'} successfully set to display on org page.", + f"{updated} {'degrees were' if updated > 1 else 'degree was'} successfully set to display on org page.", messages.SUCCESS, ) @@ -886,7 +886,7 @@ def hide_degrees_on_org_page(self, request, queryset): updated = queryset.update(display_on_org_page=False) self.message_user( request, - f"{updated} {'degrees were' if updated>1 else 'degree was'} successfully set to be hidden on org page.", + f"{updated} {'degrees were' if updated > 1 else 'degree was'} successfully set to be hidden on org page.", messages.SUCCESS, ) diff --git a/course_discovery/apps/course_metadata/models.py b/course_discovery/apps/course_metadata/models.py index e50157b3ab..d93a888a18 100644 --- a/course_discovery/apps/course_metadata/models.py +++ b/course_discovery/apps/course_metadata/models.py @@ -2384,7 +2384,9 @@ def is_current(self): now = datetime.datetime.now(pytz.UTC) two_weeks = datetime.timedelta(days=14) after_start = (not self.start) or self.start < now - ends_in_more_than_two_weeks = (not self.end) or (now.date() <= self.end.date() - two_weeks) + ends_in_more_than_two_weeks = (not self.end) or ( + now.date() <= self.end.date() - two_weeks # pylint: disable=no-member + ) return after_start and ends_in_more_than_two_weeks def is_current_and_still_upgradeable(self): diff --git a/course_discovery/apps/course_metadata/tests/test_utils.py b/course_discovery/apps/course_metadata/tests/test_utils.py index 9898f953c5..7e110477a9 100644 --- a/course_discovery/apps/course_metadata/tests/test_utils.py +++ b/course_discovery/apps/course_metadata/tests/test_utils.py @@ -1328,7 +1328,7 @@ def test_get_slug_for_course__with_existing_url_slug(self): slug, error = utils.get_slug_for_course(course) assert error is None - slug_end_prefix = f"-{course_count+1}" if course_count else "" + slug_end_prefix = f"-{course_count + 1}" if course_count else "" assert slug == f"learn/{subject.slug}/{organization.name}-{course.title}{slug_end_prefix}" course.set_active_url_slug(slug) diff --git a/course_discovery/apps/course_metadata/utils.py b/course_discovery/apps/course_metadata/utils.py index 4c3549f961..ad3dbd3f95 100644 --- a/course_discovery/apps/course_metadata/utils.py +++ b/course_discovery/apps/course_metadata/utils.py @@ -692,7 +692,6 @@ def get_salesforce_util(partner): class HTML2TextWithLangSpans(html2text.HTML2Text): - # pylint: disable=abstract-method def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/requirements/django.txt b/requirements/django.txt index 16bc98be52..64aaf996fb 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==4.2.15 +django==4.2.16 diff --git a/requirements/docs.txt b/requirements/docs.txt index 55424655fc..5e107c6982 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,12 +1,12 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --output-file=requirements/docs.txt requirements/docs.in # -accessible-pygments==0.0.4 +accessible-pygments==0.0.5 # via pydata-sphinx-theme -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx babel==2.16.0 # via @@ -39,8 +39,6 @@ idna==3.8 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==8.4.0 - # via sphinx jinja2==3.1.4 # via sphinx markupsafe==2.1.5 @@ -49,7 +47,7 @@ packaging==24.1 # via # pydata-sphinx-theme # sphinx -pydata-sphinx-theme==0.14.4 +pydata-sphinx-theme==0.15.4 # via sphinx-book-theme pygments==2.18.0 # via @@ -58,8 +56,6 @@ pygments==2.18.0 # sphinx python-dateutil==2.9.0.post0 # via elasticsearch-dsl -pytz==2024.1 - # via babel requests==2.32.3 # via sphinx six==1.16.0 @@ -77,19 +73,19 @@ sphinx==5.3.0 # -r requirements/docs.in # pydata-sphinx-theme # sphinx-book-theme -sphinx-book-theme==1.0.1 +sphinx-book-theme==1.1.3 # via -r requirements/docs.in -sphinxcontrib-applehelp==1.0.4 +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx typing-extensions==4.12.2 # via pydata-sphinx-theme @@ -97,5 +93,3 @@ urllib3==1.26.20 # via # elasticsearch # requests -zipp==3.20.1 - # via importlib-metadata diff --git a/requirements/local.txt b/requirements/local.txt index 843fd28535..8ab0ceedc9 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --output-file=requirements/local.txt requirements/local.in # -accessible-pygments==0.0.4 +accessible-pygments==0.0.5 # via pydata-sphinx-theme aiohappyeyeballs==2.4.0 # via aiohttp @@ -12,7 +12,7 @@ aiohttp==3.10.5 # via openai aiosignal==1.3.1 # via aiohttp -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx algoliasearch==1.20.0 # via @@ -36,10 +36,6 @@ astroid==3.2.4 # via # pylint # pylint-celery -async-timeout==4.0.3 - # via - # aiohttp - # redis attrs==21.4.0 # via # aiohttp @@ -56,14 +52,6 @@ babel==2.16.0 # sphinx backoff==2.2.1 # via -r requirements/base.in -backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" - # via - # -c requirements/constraints.txt - # celery - # django - # django-ses - # djangorestframework - # kombu beautifulsoup4==4.12.3 # via # -r requirements/base.in @@ -76,9 +64,9 @@ boltons==21.0.0 # face # glom # semgrep -boto3==1.35.10 +boto3==1.35.12 # via django-ses -botocore==1.35.10 +botocore==1.35.12 # via # boto3 # s3transfer @@ -104,7 +92,7 @@ certifi==2024.8.30 # requests # selenium # snowflake-connector-python -cffi==1.17.0 +cffi==1.17.1 # via # cairocffi # cryptography @@ -152,7 +140,7 @@ coverage[toml]==7.6.1 # via # -r requirements/test.in # pytest-cov -cryptography==43.0.0 +cryptography==43.0.1 # via # pyjwt # pyopenssl @@ -280,7 +268,7 @@ django-libsass==0.9 # via -r requirements/base.in django-localflavor==4.0 # via -r requirements/base.in -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via taxonomy-connector django-multi-email-field==0.7.0 # via -r requirements/base.in @@ -384,7 +372,7 @@ edx-django-utils==5.15.0 # getsmarter-api-clients # openedx-events # taxonomy-connector -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/base.in edx-event-bus-kafka==5.8.1 # via -r requirements/base.in @@ -393,8 +381,10 @@ edx-event-bus-redis==0.5.0 edx-i18n-tools==1.6.2 # via -r requirements/local.in edx-lint==5.3.7 - # via -r requirements/test.in -edx-opaque-keys[django]==2.10.0 + # via + # -c requirements/constraints.txt + # -r requirements/test.in +edx-opaque-keys[django]==2.11.0 # via # -r requirements/base.in # edx-ccx-keys @@ -422,18 +412,13 @@ elasticsearch-dsl==7.4.1 # -r requirements/base.in # django-elasticsearch-dsl # django-elasticsearch-dsl-drf -exceptiongroup==1.2.2 - # via - # pytest - # trio - # trio-websocket execnet==2.1.1 # via pytest-xdist face==22.0.0 # via glom factory-boy==3.3.1 # via -r requirements/test.in -faker==28.1.0 +faker==28.4.1 # via factory-boy fastavro==1.9.5 # via openedx-events @@ -490,12 +475,7 @@ idna==3.8 imagesize==1.4.1 # via sphinx importlib-metadata==8.4.0 - # via - # -r requirements/base.in - # markdown - # sphinx -importlib-resources==6.4.4 - # via pycountry + # via -r requirements/base.in inflection==0.5.1 # via drf-yasg iniconfig==2.0.0 @@ -625,7 +605,7 @@ pycountry==24.6.1 # via -r requirements/base.in pycparser==2.22 # via cffi -pydata-sphinx-theme==0.14.4 +pydata-sphinx-theme==0.15.4 # via sphinx-book-theme pygments==2.18.0 # via @@ -685,7 +665,7 @@ pytest==8.3.2 # pytest-xdist pytest-cov==5.0.0 # via -r requirements/test.in -pytest-django==4.8.0 +pytest-django==4.9.0 # via -r requirements/test.in pytest-responses==0.5.1 # via -r requirements/test.in @@ -721,7 +701,6 @@ python3-openid==3.2.0 pytz==2024.1 # via # -r requirements/base.in - # babel # drf-yasg # getsmarter-api-clients # snowflake-connector-python @@ -840,19 +819,19 @@ sphinx==5.3.0 # -r requirements/docs.in # pydata-sphinx-theme # sphinx-book-theme -sphinx-book-theme==1.0.1 +sphinx-book-theme==1.1.3 # via -r requirements/docs.in -sphinxcontrib-applehelp==1.0.4 +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx sqlparse==0.5.1 # via @@ -873,13 +852,6 @@ tinycss2==1.3.0 # via # cairosvg # cssselect2 -tomli==2.0.1 - # via - # coverage - # pylint - # pyproject-api - # pytest - # tox tomlkit==0.13.2 # via # pylint @@ -898,21 +870,14 @@ trio-websocket==0.11.1 # via selenium typing-extensions==4.12.2 # via - # asgiref - # astroid # django-countries - # django-solo # edx-opaque-keys - # kombu # pydata-sphinx-theme - # pylint # semgrep # simple-salesforce # snowflake-connector-python tzdata==2024.1 - # via - # backports-zoneinfo - # celery + # via celery ujson==5.10.0 # via python-lsp-jsonrpc unicodecsv==0.14.1 @@ -929,7 +894,6 @@ urllib3[socks]==1.26.20 # responses # selenium # semgrep - # snowflake-connector-python vine==5.1.0 # via # amqp @@ -951,14 +915,12 @@ wsproto==1.2.0 # via trio-websocket xss-utils==0.6.0 # via -r requirements/base.in -yarl==1.9.7 +yarl==1.9.11 # via aiohttp zeep==4.2.1 # via simple-salesforce zipp==3.20.1 - # via - # importlib-metadata - # importlib-resources + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/pip.txt b/requirements/pip.txt index f3fa6b47d5..f72a524c92 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/pip.txt requirements/pip.in @@ -10,5 +10,5 @@ wheel==0.44.0 # The following packages are considered to be unsafe in a requirements file: pip==24.2 # via -r requirements/pip.in -setuptools==74.0.0 +setuptools==74.1.2 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index ffa11c3343..75568e9e4c 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --output-file=requirements/pip_tools.txt requirements/pip_tools.in @@ -8,8 +8,6 @@ build==1.2.1 # via pip-tools click==8.1.7 # via pip-tools -importlib-metadata==8.4.0 - # via build packaging==24.1 # via build pip-tools==7.4.1 @@ -18,14 +16,8 @@ pyproject-hooks==1.1.0 # via # build # pip-tools -tomli==2.0.1 - # via - # build - # pip-tools wheel==0.44.0 # via pip-tools -zipp==3.20.1 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/requirements/production.txt b/requirements/production.txt index d19cd544bf..dcdb7924ed 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --output-file=requirements/production.txt requirements/production.in @@ -28,10 +28,6 @@ asgiref==3.8.1 # django-countries asn1crypto==1.5.1 # via snowflake-connector-python -async-timeout==4.0.3 - # via - # aiohttp - # redis attrs==24.2.0 # via # aiohttp @@ -39,23 +35,15 @@ attrs==24.2.0 # zeep backoff==2.2.1 # via -r requirements/base.in -backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" - # via - # -c requirements/constraints.txt - # celery - # django - # django-ses - # djangorestframework - # kombu beautifulsoup4==4.12.3 # via # -r requirements/base.in # taxonomy-connector billiard==4.2.0 # via celery -boto3==1.35.10 +boto3==1.35.12 # via django-ses -botocore==1.35.10 +botocore==1.35.12 # via # boto3 # s3transfer @@ -77,7 +65,7 @@ certifi==2024.8.30 # elasticsearch # requests # snowflake-connector-python -cffi==1.17.0 +cffi==1.17.1 # via # cairocffi # cryptography @@ -105,7 +93,7 @@ code-annotations==1.8.0 # via edx-toggles contentful==2.2.0 # via -r requirements/base.in -cryptography==43.0.0 +cryptography==43.0.1 # via # pyjwt # pyopenssl @@ -119,7 +107,7 @@ defusedxml==0.7.1 # djangorestframework-xml # python3-openid # social-auth-core -django==4.2.15 +django==4.2.16 # via # -c requirements/common_constraints.txt # -c requirements/constraints.txt @@ -218,7 +206,7 @@ django-libsass==0.9 # via -r requirements/base.in django-localflavor==4.0 # via -r requirements/base.in -django-model-utils==4.5.1 +django-model-utils==5.0.0 # via taxonomy-connector django-multi-email-field==0.7.0 # via -r requirements/base.in @@ -320,13 +308,13 @@ edx-django-utils==5.15.0 # getsmarter-api-clients # openedx-events # taxonomy-connector -edx-drf-extensions==10.3.0 +edx-drf-extensions==10.4.0 # via -r requirements/base.in edx-event-bus-kafka==5.8.1 # via -r requirements/base.in edx-event-bus-redis==0.5.0 # via -r requirements/base.in -edx-opaque-keys[django]==2.10.0 +edx-opaque-keys[django]==2.11.0 # via # -r requirements/base.in # edx-ccx-keys @@ -403,11 +391,7 @@ idna==3.8 # snowflake-connector-python # yarl importlib-metadata==8.4.0 - # via - # -r requirements/base.in - # markdown -importlib-resources==6.4.4 - # via pycountry + # via -r requirements/base.in inflection==0.5.1 # via drf-yasg isodate==0.6.1 @@ -646,17 +630,12 @@ tqdm==4.66.5 # via openai typing-extensions==4.12.2 # via - # asgiref # django-countries - # django-solo # edx-opaque-keys - # kombu # simple-salesforce # snowflake-connector-python tzdata==2024.1 - # via - # backports-zoneinfo - # celery + # via celery unicodecsv==0.14.1 # via -r requirements/base.in uritemplate==4.1.1 @@ -668,7 +647,6 @@ urllib3==1.26.20 # botocore # elasticsearch # requests - # snowflake-connector-python vine==5.1.0 # via # amqp @@ -684,14 +662,12 @@ webencodings==0.5.1 # tinycss2 xss-utils==0.6.0 # via -r requirements/base.in -yarl==1.9.7 +yarl==1.9.11 # via aiohttp zeep==4.2.1 # via simple-salesforce zipp==3.20.1 - # via - # importlib-metadata - # importlib-resources + # via importlib-metadata zope-event==5.0 # via gevent zope-interface==7.0.3 diff --git a/tox.ini b/tox.ini index f0562122ba..f164b27827 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{38, 311, 312}-django{42} +envlist = py{312}-django{42} skipsdist=true [pytest]