From 36bc403a5ce19ccda475ad63c1ff6ad9e81b7fe5 Mon Sep 17 00:00:00 2001 From: Tim McCormack Date: Mon, 5 Aug 2024 17:59:02 +0000 Subject: [PATCH] feat!: Detect anomalous Datadog traces; upgrade to Python 3.11 (#757) - Detect and log anomalous traces in DatadogDiagnosticMiddleware. - Drop Python 3.8 support and change to Python 3.11 minimum due to testing needs. - Add tests for existing middleware code Manual testing: 1. Install in devstack, add middleware to lms/envs/devstack.py, and enable Waffle flag. 2. Make some requests and observe lack of new logging. 3. Add `self.dd_tracer.current_root_span().finish()` to start of `process_view` (faking an anomalous trace) and reinstall in devstack 4. Make some more requests and observe log output like the following: `Anomalous Datadog local root span (duration already set): id = 66abf66b000000001168265a391d04a3; duration = 0.108 sec; worker age = 1.560 sec` Unit test improvements: - Install ddtrace at the test.in level - Add tests for new and existing middleware functionality - Test with Python 3.11, not 3.8. This isn't just because we're upgrading to 3.11 across our repos, but also because I ran into a really weird bug with ddtrace and/or jsonschema that only occurs with Python 3.8: https://github.com/DataDog/dd-trace-py/issues/9950 --- .github/workflows/ci.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/test_publish.yml | 2 +- CHANGELOG.rst | 10 + README.rst | 2 +- docs/conf.py | 2 +- edx_arch_experiments/__init__.py | 2 +- .../datadog_diagnostics/README.rst | 7 - .../datadog_diagnostics/middleware.py | 33 ++- .../tests/test_middleware.py | 110 ++++++++++ requirements/base.txt | 60 +++-- requirements/ci.txt | 18 +- requirements/dev.txt | 206 ++++++++++++------ requirements/doc.txt | 143 ++++++++---- requirements/pip-tools.txt | 16 +- requirements/pip.txt | 8 +- requirements/quality.txt | 180 ++++++++++----- requirements/scripts.txt | 75 ++++--- requirements/test.in | 3 +- requirements/test.txt | 102 ++++++--- setup.py | 4 +- tox.ini | 2 +- 22 files changed, 674 insertions(+), 315 deletions(-) create mode 100644 edx_arch_experiments/datadog_diagnostics/tests/test_middleware.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6c28a6..710b093 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.11', '3.12'] tox-env: [quality, django42] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 92bb4da..1c5ee6d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,7 +16,7 @@ jobs: - name: setup python uses: actions/setup-python@v4 with: - python-version: 3.8 + python-version: 3.11 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/.github/workflows/test_publish.yml b/.github/workflows/test_publish.yml index 494c28d..c2837c3 100644 --- a/.github/workflows/test_publish.yml +++ b/.github/workflows/test_publish.yml @@ -10,7 +10,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: - python-version: '3.8' + python-version: '3.11' architecture: x64 - name: Install pip run: pip install -r requirements/pip.txt diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8a601f0..6e5207d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,16 @@ Change Log Unreleased ~~~~~~~~~~ +[4.0.0] - 2024-08-05 +~~~~~~~~~~~~~~~~~~~~ +Changed +------- +* Dropped support for Python 3.8; only testing with 3.11 and above now. + +Added +----- +* ``DatadogDiagnosticMiddleware`` can now detect and log anomalous traces, enabled by Waffle flag ``datadog.diagnostics.detect_anomalous_trace`` + [3.6.0] - 2024-07-24 ~~~~~~~~~~~~~~~~~~~~ Added diff --git a/README.rst b/README.rst index bb56fa0..45b4395 100644 --- a/README.rst +++ b/README.rst @@ -24,7 +24,7 @@ One Time Setup cd edx-arch-experiments # Set up a virtualenv using virtualenvwrapper with the same name as the repo and activate it - mkvirtualenv -p python3.8 edx-arch-experiments + mkvirtualenv -p python3.11 edx-arch-experiments Local testing ~~~~~~~~~~~~~ diff --git a/docs/conf.py b/docs/conf.py index d781071..fd05e10 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -469,7 +469,7 @@ def get_version(*file_paths): # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'python': ('https://docs.python.org/3.8', None), + 'python': ('https://docs.python.org/3.11', None), 'django': ('https://docs.djangoproject.com/en/2.2/', 'https://docs.djangoproject.com/en/2.2/_objects/'), 'model_utils': ('https://django-model-utils.readthedocs.io/en/latest/', None), } diff --git a/edx_arch_experiments/__init__.py b/edx_arch_experiments/__init__.py index ebdb6b8..a00a1e5 100644 --- a/edx_arch_experiments/__init__.py +++ b/edx_arch_experiments/__init__.py @@ -2,4 +2,4 @@ A plugin to include applications under development by the architecture team at 2U. """ -__version__ = '3.6.0' +__version__ = '4.0.0' diff --git a/edx_arch_experiments/datadog_diagnostics/README.rst b/edx_arch_experiments/datadog_diagnostics/README.rst index c51dd6d..364ad6d 100644 --- a/edx_arch_experiments/datadog_diagnostics/README.rst +++ b/edx_arch_experiments/datadog_diagnostics/README.rst @@ -4,10 +4,3 @@ Datadog Diagnostics When installed in the LMS as a plugin app, the ``datadog_diagnostics`` app adds additional logging for debugging our Datadog integration. This is intended as a temporary situation while we debug the `trace concatenation issue `_. - -Usage -***** - -In LMS: - -- Install ``edx-arch-experiments`` as a dependency diff --git a/edx_arch_experiments/datadog_diagnostics/middleware.py b/edx_arch_experiments/datadog_diagnostics/middleware.py index ae3ffed..844695c 100644 --- a/edx_arch_experiments/datadog_diagnostics/middleware.py +++ b/edx_arch_experiments/datadog_diagnostics/middleware.py @@ -1,14 +1,31 @@ """ Diagnostic middleware for Datadog. + +To use, install edx-arch-experiments and add +``edx_arch_experiments.datadog_diagnostics.middleware.DatadogDiagnosticMiddleware`` +to ``MIDDLEWARE``, then set the below settings as needed. """ import logging +import time from django.core.exceptions import MiddlewareNotUsed from edx_toggles.toggles import WaffleFlag log = logging.getLogger(__name__) +# .. toggle_name: datadog.diagnostics.detect_anomalous_trace +# .. toggle_implementation: WaffleFlag +# .. toggle_default: False +# .. toggle_description: Enables logging of anomalous Datadog traces for web requests. +# .. toggle_warning: This is a noisy feature and so it should only be enabled +# for a percentage of requests. +# .. toggle_use_cases: temporary +# .. toggle_creation_date: 2024-08-01 +# .. toggle_target_removal_date: 2024-11-01 +# .. toggle_tickets: https://github.com/edx/edx-arch-experiments/issues/692 +DETECT_ANOMALOUS_TRACE = WaffleFlag('datadog.diagnostics.detect_anomalous_trace', module_name=__name__) + # .. toggle_name: datadog.diagnostics.log_root_span # .. toggle_implementation: WaffleFlag # .. toggle_default: False @@ -43,6 +60,8 @@ def __init__(self, get_response): # If import fails, don't even load this middleware. raise MiddlewareNotUsed # pylint: disable=raise-missing-from + self.worker_start_epoch = time.time() + def __call__(self, request): return self.get_response(request) @@ -63,9 +82,21 @@ def log_diagnostics(self, request): """ Contains all the actual logging logic. """ + local_root_span = self.dd_tracer.current_root_span() + + if DETECT_ANOMALOUS_TRACE.is_enabled(): + root_duration_s = local_root_span.duration + if root_duration_s is not None: + worker_run_time_s = time.time() - self.worker_start_epoch + log.warning( + f"Anomalous Datadog local root span (duration already set): " + f"id = {local_root_span.trace_id:x}; " + f"duration = {root_duration_s:0.3f} sec; " + f"worker age = {worker_run_time_s:0.3f} sec" + ) + if LOG_ROOT_SPAN.is_enabled(): route_pattern = getattr(request.resolver_match, 'route', None) - local_root_span = self.dd_tracer.current_root_span() current_span = self.dd_tracer.current_span() # pylint: disable=protected-access log.info( diff --git a/edx_arch_experiments/datadog_diagnostics/tests/test_middleware.py b/edx_arch_experiments/datadog_diagnostics/tests/test_middleware.py new file mode 100644 index 0000000..4e48619 --- /dev/null +++ b/edx_arch_experiments/datadog_diagnostics/tests/test_middleware.py @@ -0,0 +1,110 @@ +""" +Tests for diagnostic middleware. +""" + +import re +from unittest.mock import Mock, patch + +import ddt +import ddtrace +from django.test import TestCase + +from ..middleware import DETECT_ANOMALOUS_TRACE, LOG_ROOT_SPAN, DatadogDiagnosticMiddleware + + +def fake_view(_request): + """Fake get_response for middleware.""" + + +@ddt.ddt +class TestDatadogDiagnosticMiddleware(TestCase): + """Tests for DatadogDiagnosticMiddleware.""" + + def setUp(self): + self.middleware = DatadogDiagnosticMiddleware(fake_view) + + def run_middleware(self): + """Run the middleware using a fake request.""" + resolver = Mock() + resolver.route = "/some/path" + request = Mock() + request.resolver_match = resolver + self.middleware.process_view(request, None, None, None) + + @patch('edx_arch_experiments.datadog_diagnostics.middleware.log.error') + def test_log_diagnostics_error_only_once(self, mock_log_error): + """ + If the log_diagnostics function is broken, only log the error once. + The method should still be called every time in case it is still doing + useful work before the error, though. + """ + + bad_method = Mock(side_effect=lambda request: 1/0) + self.middleware.log_diagnostics = bad_method + + self.run_middleware() + self.run_middleware() + + # Called twice + assert len(bad_method.call_args_list) == 2 + + # But only log once + mock_log_error.assert_called_once_with( + "Encountered error in DatadogDiagnosticMiddleware (suppressing further errors): " + "ZeroDivisionError('division by zero')" + ) + + @ddt.data( + # Feature disabled + (False, False), + (False, True), + # Enabled, but nothing anomalous + (True, False), + # Enabled and anomaly detected + (True, True), + ) + @ddt.unpack + @patch('edx_arch_experiments.datadog_diagnostics.middleware.log.warning') + def test_anomalous_trace(self, enabled, cause_anomaly, mock_log_warning): + with ( + patch.object(DETECT_ANOMALOUS_TRACE, 'is_enabled', return_value=enabled), + patch.object(LOG_ROOT_SPAN, 'is_enabled', return_value=False), + # Need at least two levels of spans in order to fake + # an anomaly. (Otherwise current_root_span returns None.) + ddtrace.tracer.trace("test_local_root"), + ddtrace.tracer.trace("inner_span"), + ): + if cause_anomaly: + ddtrace.tracer.current_root_span().finish() + self.run_middleware() + + if enabled and cause_anomaly: + mock_log_warning.assert_called_once() + log_msg = mock_log_warning.call_args_list[0][0][0] # first arg of first call + assert re.fullmatch( + r"Anomalous Datadog local root span \(duration already set\): " + r"id = [0-9A-Fa-f]+; duration = [0-9]\.[0-9]{3} sec; worker age = [0-9]\.[0-9]{3} sec", + log_msg + ) + else: + mock_log_warning.assert_not_called() + + @patch('edx_arch_experiments.datadog_diagnostics.middleware.log.info') + def test_log_root_span(self, mock_log_info): + with ( + patch.object(DETECT_ANOMALOUS_TRACE, 'is_enabled', return_value=False), + patch.object(LOG_ROOT_SPAN, 'is_enabled', return_value=True), + # Need at least two levels of spans for interesting logging + ddtrace.tracer.trace("test_local_root"), + ddtrace.tracer.trace("inner_span"), + ): + self.run_middleware() + + mock_log_info.assert_called_once() + log_msg = mock_log_info.call_args_list[0][0][0] # first arg of first call + assert re.fullmatch( + r"Datadog span diagnostics: Route = /some/path; " + r"local root span = name='test_local_root' .*; " + r"current span = name='inner_span' .*", + log_msg + ) diff --git a/requirements/base.txt b/requirements/base.txt index 49b4e84..049726c 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,16 +1,16 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via django attrs==23.2.0 # via # jsonschema # referencing -certifi==2024.2.2 +certifi==2024.7.4 # via requests cffi==1.16.0 # via @@ -22,11 +22,11 @@ click==8.1.7 # via # code-annotations # edx-django-utils -code-annotations==1.6.0 +code-annotations==1.8.0 # via edx-toggles -cryptography==42.0.5 +cryptography==43.0.0 # via pyjwt -django==3.2.24 +django==4.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/base.in @@ -47,67 +47,65 @@ django-waffle==4.1.0 # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.14.0 +djangorestframework==3.15.2 # via # -r requirements/base.in # drf-jwt # edx-drf-extensions +dnspython==2.6.1 + # via pymongo drf-jwt==1.19.2 # via edx-drf-extensions -edx-codejail==3.3.3 +edx-codejail==3.4.1 # via -r requirements/base.in -edx-django-utils==5.10.1 +edx-django-utils==5.15.0 # via # -r requirements/base.in # edx-drf-extensions # edx-toggles -edx-drf-extensions==10.2.0 +edx-drf-extensions==10.3.0 # via -r requirements/base.in -edx-opaque-keys==2.5.1 +edx-opaque-keys==2.10.0 # via edx-drf-extensions -edx-toggles==5.1.1 +edx-toggles==5.2.0 # via -r requirements/base.in -idna==3.6 +idna==3.7 # via requests -jinja2==3.1.3 +jinja2==3.1.4 # via code-annotations -jsonschema==4.21.1 +jsonschema==4.23.0 # via -r requirements/base.in jsonschema-specifications==2023.12.1 # via jsonschema markupsafe==2.1.5 # via jinja2 -newrelic==9.7.0 +newrelic==9.12.0 # via edx-django-utils pbr==6.0.0 # via stevedore -psutil==5.9.8 +psutil==6.0.0 # via edx-django-utils -pycparser==2.21 +pycparser==2.22 # via cffi -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # drf-jwt # edx-drf-extensions -pymongo==3.13.0 +pymongo==4.8.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils python-slugify==8.0.4 # via code-annotations -pytz==2024.1 - # via - # django - # djangorestframework pyyaml==6.0.1 # via code-annotations -referencing==0.33.0 +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.3 # via edx-drf-extensions -rpds-py==0.18.0 +rpds-py==0.19.1 # via # jsonschema # referencing @@ -115,7 +113,7 @@ semantic-version==2.10.0 # via edx-drf-extensions six==1.16.0 # via edx-codejail -sqlparse==0.4.4 +sqlparse==0.5.1 # via django stevedore==5.2.0 # via @@ -124,11 +122,11 @@ stevedore==5.2.0 # edx-opaque-keys text-unidecode==1.3 # via python-slugify -typing-extensions==4.10.0 +typing-extensions==4.12.2 # via edx-opaque-keys -urllib3==2.2.1 +urllib3==2.2.2 # via requests # The following packages are considered to be unsafe in a requirements file: -setuptools==69.1.1 +setuptools==72.1.0 # via -r requirements/base.in diff --git a/requirements/ci.txt b/requirements/ci.txt index 5757c41..564c0f5 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -cachetools==5.3.2 +cachetools==5.4.0 # via tox chardet==5.2.0 # via tox @@ -12,23 +12,23 @@ colorama==0.4.6 # via tox distlib==0.3.8 # via virtualenv -filelock==3.13.1 +filelock==3.15.4 # via # tox # virtualenv -packaging==23.2 +packaging==24.1 # via # pyproject-api # tox -platformdirs==4.2.0 +platformdirs==4.2.2 # via # tox # virtualenv -pluggy==1.4.0 +pluggy==1.5.0 # via tox -pyproject-api==1.6.1 +pyproject-api==1.7.1 # via tox -tox==4.13.0 +tox==4.16.0 # via -r requirements/ci.in -virtualenv==20.25.1 +virtualenv==20.26.3 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 02331a6..3606ea3 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,14 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/quality.txt # django -astroid==3.1.0 +astroid==3.2.4 # via # -r requirements/quality.txt # pylint @@ -16,17 +16,31 @@ astroid==3.1.0 attrs==23.2.0 # via # -r requirements/quality.txt + # cattrs + # ddtrace # jsonschema # referencing -build==1.0.3 +backports-tarfile==1.2.0 + # via + # -r requirements/quality.txt + # jaraco-context +build==1.2.1 # via # -r requirements/pip-tools.txt # pip-tools -cachetools==5.3.2 +bytecode==0.15.1 + # via + # -r requirements/quality.txt + # ddtrace +cachetools==5.4.0 # via # -r requirements/ci.txt # tox -certifi==2024.2.2 +cattrs==23.2.3 + # via + # -r requirements/quality.txt + # ddtrace +certifi==2024.7.4 # via # -r requirements/quality.txt # requests @@ -57,7 +71,7 @@ click-log==0.4.0 # via # -r requirements/quality.txt # edx-lint -code-annotations==1.6.0 +code-annotations==1.8.0 # via # -r requirements/quality.txt # edx-lint @@ -66,17 +80,28 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.4.3 +coverage[toml]==7.6.0 # via # -r requirements/quality.txt # pytest-cov -cryptography==42.0.5 +cryptography==43.0.0 # via # -r requirements/quality.txt # pyjwt + # secretstorage +ddsketch==3.0.1 + # via + # -r requirements/quality.txt + # ddtrace ddt==1.7.2 # via -r requirements/quality.txt -diff-cover==8.0.3 +ddtrace==2.10.1 + # via -r requirements/quality.txt +deprecated==1.2.14 + # via + # -r requirements/quality.txt + # opentelemetry-api +diff-cover==9.1.1 # via -r requirements/dev.in dill==0.3.8 # via @@ -86,7 +111,7 @@ distlib==0.3.8 # via # -r requirements/ci.txt # virtualenv -django==3.2.24 +django==4.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/quality.txt @@ -109,12 +134,16 @@ django-waffle==4.1.0 # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.14.0 +djangorestframework==3.15.2 # via # -r requirements/quality.txt # drf-jwt # edx-drf-extensions -docutils==0.20.1 +dnspython==2.6.1 + # via + # -r requirements/quality.txt + # pymongo +docutils==0.21.2 # via # -r requirements/quality.txt # readme-renderer @@ -122,37 +151,44 @@ drf-jwt==1.19.2 # via # -r requirements/quality.txt # edx-drf-extensions -edx-codejail==3.3.3 +edx-codejail==3.4.1 # via -r requirements/quality.txt -edx-django-utils==5.10.1 +edx-django-utils==5.15.0 # via # -r requirements/quality.txt # edx-drf-extensions # edx-toggles -edx-drf-extensions==10.2.0 +edx-drf-extensions==10.3.0 # via -r requirements/quality.txt -edx-i18n-tools==1.3.0 +edx-i18n-tools==1.6.2 # via -r requirements/dev.in -edx-lint==5.3.6 +edx-lint==5.3.7 # via -r requirements/quality.txt -edx-opaque-keys==2.5.1 +edx-opaque-keys==2.10.0 # via # -r requirements/quality.txt # edx-drf-extensions -edx-toggles==5.1.1 +edx-toggles==5.2.0 # via -r requirements/quality.txt -filelock==3.13.1 +envier==0.5.2 + # via + # -r requirements/quality.txt + # ddtrace +filelock==3.15.4 # via # -r requirements/ci.txt # tox # virtualenv -idna==3.6 +idna==3.7 # via # -r requirements/quality.txt # requests -importlib-metadata==7.0.1 +importlib-metadata==6.11.0 # via + # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/quality.txt + # keyring + # opentelemetry-api # twine iniconfig==2.0.0 # via @@ -162,26 +198,39 @@ isort==5.13.2 # via # -r requirements/quality.txt # pylint -jaraco-classes==3.3.1 +jaraco-classes==3.4.0 # via # -r requirements/quality.txt # keyring -jinja2==3.1.3 +jaraco-context==5.3.0 + # via + # -r requirements/quality.txt + # keyring +jaraco-functools==4.0.2 + # via + # -r requirements/quality.txt + # keyring +jeepney==0.8.0 + # via + # -r requirements/quality.txt + # keyring + # secretstorage +jinja2==3.1.4 # via # -r requirements/quality.txt # code-annotations # diff-cover -jsonschema==4.21.1 +jsonschema==4.23.0 # via -r requirements/quality.txt jsonschema-specifications==2023.12.1 # via # -r requirements/quality.txt # jsonschema -keyring==24.3.0 +keyring==25.2.1 # via # -r requirements/quality.txt # twine -lxml==5.1.0 +lxml==5.2.2 # via edx-i18n-tools markdown-it-py==3.0.0 # via @@ -199,19 +248,24 @@ mdurl==0.1.2 # via # -r requirements/quality.txt # markdown-it-py -more-itertools==10.2.0 +more-itertools==10.3.0 # via # -r requirements/quality.txt # jaraco-classes -newrelic==9.7.0 + # jaraco-functools +newrelic==9.12.0 # via # -r requirements/quality.txt # edx-django-utils -nh3==0.2.15 +nh3==0.2.18 # via # -r requirements/quality.txt # readme-renderer -packaging==23.2 +opentelemetry-api==1.26.0 + # via + # -r requirements/quality.txt + # ddtrace +packaging==24.1 # via # -r requirements/ci.txt # -r requirements/pip-tools.txt @@ -220,26 +274,26 @@ packaging==23.2 # pyproject-api # pytest # tox -path==16.10.0 +path==16.16.0 # via edx-i18n-tools pbr==6.0.0 # via # -r requirements/quality.txt # stevedore -pip-tools==7.4.0 +pip-tools==7.4.1 # via -r requirements/pip-tools.txt -pkginfo==1.9.6 +pkginfo==1.10.0 # via # -r requirements/quality.txt # twine -platformdirs==4.2.0 +platformdirs==4.2.2 # via # -r requirements/ci.txt # -r requirements/quality.txt # pylint # tox # virtualenv -pluggy==1.4.0 +pluggy==1.5.0 # via # -r requirements/ci.txt # -r requirements/quality.txt @@ -248,30 +302,34 @@ pluggy==1.4.0 # tox polib==1.2.0 # via edx-i18n-tools -psutil==5.9.8 +protobuf==5.27.3 + # via + # -r requirements/quality.txt + # ddtrace +psutil==6.0.0 # via # -r requirements/quality.txt # edx-django-utils -pycodestyle==2.11.1 +pycodestyle==2.12.0 # via -r requirements/quality.txt -pycparser==2.21 +pycparser==2.22 # via # -r requirements/quality.txt # cffi pydocstyle==6.3.0 # via -r requirements/quality.txt -pygments==2.17.2 +pygments==2.18.0 # via # -r requirements/quality.txt # diff-cover # readme-renderer # rich -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/quality.txt # drf-jwt # edx-drf-extensions -pylint==3.1.0 +pylint==3.2.6 # via # -r requirements/quality.txt # edx-lint @@ -291,7 +349,7 @@ pylint-plugin-utils==0.8.2 # -r requirements/quality.txt # pylint-celery # pylint-django -pymongo==3.13.0 +pymongo==4.8.0 # via # -r requirements/quality.txt # edx-opaque-keys @@ -299,21 +357,21 @@ pynacl==1.5.0 # via # -r requirements/quality.txt # edx-django-utils -pyproject-api==1.6.1 +pyproject-api==1.7.1 # via # -r requirements/ci.txt # tox -pyproject-hooks==1.0.0 +pyproject-hooks==1.1.0 # via # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.0.2 +pytest==8.3.2 # via # -r requirements/quality.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/quality.txt pytest-django==4.8.0 # via -r requirements/quality.txt @@ -321,26 +379,21 @@ python-slugify==8.0.4 # via # -r requirements/quality.txt # code-annotations -pytz==2024.1 - # via - # -r requirements/quality.txt - # django - # djangorestframework pyyaml==6.0.1 # via # -r requirements/quality.txt # code-annotations # edx-i18n-tools -readme-renderer==42.0 +readme-renderer==44.0 # via # -r requirements/quality.txt # twine -referencing==0.33.0 +referencing==0.35.1 # via # -r requirements/quality.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.3 # via # -r requirements/quality.txt # edx-drf-extensions @@ -354,15 +407,19 @@ rfc3986==2.0.0 # via # -r requirements/quality.txt # twine -rich==13.7.0 +rich==13.7.1 # via # -r requirements/quality.txt # twine -rpds-py==0.18.0 +rpds-py==0.19.1 # via # -r requirements/quality.txt # jsonschema # referencing +secretstorage==3.3.3 + # via + # -r requirements/quality.txt + # keyring semantic-version==2.10.0 # via # -r requirements/quality.txt @@ -370,13 +427,15 @@ semantic-version==2.10.0 six==1.16.0 # via # -r requirements/quality.txt + # ddsketch + # ddtrace # edx-codejail # edx-lint snowballstemmer==2.2.0 # via # -r requirements/quality.txt # pydocstyle -sqlparse==0.4.4 +sqlparse==0.5.1 # via # -r requirements/quality.txt # django @@ -390,42 +449,51 @@ text-unidecode==1.3 # via # -r requirements/quality.txt # python-slugify -tomlkit==0.12.3 +tomlkit==0.13.0 # via # -r requirements/quality.txt # pylint -tox==4.13.0 +tox==4.16.0 # via -r requirements/ci.txt -twine==5.0.0 +twine==5.1.1 # via -r requirements/quality.txt -typing-extensions==4.10.0 +typing-extensions==4.12.2 # via # -r requirements/quality.txt + # ddtrace # edx-opaque-keys -urllib3==2.2.1 +urllib3==2.2.2 # via # -r requirements/quality.txt # requests # twine -virtualenv==20.25.1 +virtualenv==20.26.3 # via # -r requirements/ci.txt # tox -wheel==0.42.0 +wheel==0.43.0 # via # -r requirements/pip-tools.txt # pip-tools -zipp==3.17.0 +wrapt==1.16.0 + # via + # -r requirements/quality.txt + # deprecated +xmltodict==0.13.0 + # via + # -r requirements/quality.txt + # ddtrace +zipp==3.19.2 # via # -r requirements/quality.txt # importlib-metadata # The following packages are considered to be unsafe in a requirements file: -pip==24.0 +pip==24.2 # via # -r requirements/pip-tools.txt # pip-tools -setuptools==69.1.1 +setuptools==72.1.0 # via # -r requirements/pip-tools.txt # -r requirements/quality.txt diff --git a/requirements/doc.txt b/requirements/doc.txt index 476f536..5eac2f6 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,23 +1,33 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # alabaster==0.7.16 # via sphinx -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/test.txt # django attrs==23.2.0 # via # -r requirements/test.txt + # cattrs + # ddtrace # jsonschema # referencing -babel==2.14.0 +babel==2.15.0 # via sphinx -certifi==2024.2.2 +bytecode==0.15.1 + # via + # -r requirements/test.txt + # ddtrace +cattrs==23.2.3 + # via + # -r requirements/test.txt + # ddtrace +certifi==2024.7.4 # via # -r requirements/test.txt # requests @@ -35,21 +45,31 @@ click==8.1.7 # -r requirements/test.txt # code-annotations # edx-django-utils -code-annotations==1.6.0 +code-annotations==1.8.0 # via # -r requirements/test.txt # edx-toggles -coverage[toml]==7.4.3 +coverage[toml]==7.6.0 # via # -r requirements/test.txt # pytest-cov -cryptography==42.0.5 +cryptography==43.0.0 # via # -r requirements/test.txt # pyjwt +ddsketch==3.0.1 + # via + # -r requirements/test.txt + # ddtrace ddt==1.7.2 # via -r requirements/test.txt -django==3.2.24 +ddtrace==2.10.1 + # via -r requirements/test.txt +deprecated==1.2.14 + # via + # -r requirements/test.txt + # opentelemetry-api +django==4.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.txt @@ -71,11 +91,15 @@ django-waffle==4.1.0 # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.14.0 +djangorestframework==3.15.2 # via # -r requirements/test.txt # drf-jwt # edx-drf-extensions +dnspython==2.6.1 + # via + # -r requirements/test.txt + # pymongo doc8==1.1.1 # via -r requirements/doc.in docutils==0.19 @@ -88,39 +112,48 @@ drf-jwt==1.19.2 # via # -r requirements/test.txt # edx-drf-extensions -edx-codejail==3.3.3 +edx-codejail==3.4.1 # via -r requirements/test.txt -edx-django-utils==5.10.1 +edx-django-utils==5.15.0 # via # -r requirements/test.txt # edx-drf-extensions # edx-toggles -edx-drf-extensions==10.2.0 +edx-drf-extensions==10.3.0 # via -r requirements/test.txt -edx-opaque-keys==2.5.1 +edx-opaque-keys==2.10.0 # via # -r requirements/test.txt # edx-drf-extensions edx-sphinx-theme==3.1.0 # via -r requirements/doc.in -edx-toggles==5.1.1 +edx-toggles==5.2.0 # via -r requirements/test.txt -idna==3.6 +envier==0.5.2 + # via + # -r requirements/test.txt + # ddtrace +idna==3.7 # via # -r requirements/test.txt # requests imagesize==1.4.1 # via sphinx +importlib-metadata==6.11.0 + # via + # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt + # -r requirements/test.txt + # opentelemetry-api iniconfig==2.0.0 # via # -r requirements/test.txt # pytest -jinja2==3.1.3 +jinja2==3.1.4 # via # -r requirements/test.txt # code-annotations # sphinx -jsonschema==4.21.1 +jsonschema==4.23.0 # via -r requirements/test.txt jsonschema-specifications==2023.12.1 # via @@ -130,13 +163,17 @@ markupsafe==2.1.5 # via # -r requirements/test.txt # jinja2 -newrelic==9.7.0 +newrelic==9.12.0 # via # -r requirements/test.txt # edx-django-utils -nh3==0.2.15 +nh3==0.2.18 # via readme-renderer -packaging==23.2 +opentelemetry-api==1.26.0 + # via + # -r requirements/test.txt + # ddtrace +packaging==24.1 # via # -r requirements/test.txt # pytest @@ -145,29 +182,33 @@ pbr==6.0.0 # via # -r requirements/test.txt # stevedore -pluggy==1.4.0 +pluggy==1.5.0 # via # -r requirements/test.txt # pytest -psutil==5.9.8 +protobuf==5.27.3 + # via + # -r requirements/test.txt + # ddtrace +psutil==6.0.0 # via # -r requirements/test.txt # edx-django-utils -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi -pygments==2.17.2 +pygments==2.18.0 # via # doc8 # readme-renderer # sphinx -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/test.txt # drf-jwt # edx-drf-extensions -pymongo==3.13.0 +pymongo==4.8.0 # via # -r requirements/test.txt # edx-opaque-keys @@ -175,12 +216,12 @@ pynacl==1.5.0 # via # -r requirements/test.txt # edx-django-utils -pytest==8.0.2 +pytest==8.3.2 # via # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.txt pytest-django==4.8.0 # via -r requirements/test.txt @@ -188,30 +229,25 @@ python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations -pytz==2024.1 - # via - # -r requirements/test.txt - # django - # djangorestframework pyyaml==6.0.1 # via # -r requirements/test.txt # code-annotations -readme-renderer==42.0 +readme-renderer==43.0 # via -r requirements/doc.in -referencing==0.33.0 +referencing==0.35.1 # via # -r requirements/test.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.3 # via # -r requirements/test.txt # edx-drf-extensions # sphinx restructuredtext-lint==1.4.0 # via doc8 -rpds-py==0.18.0 +rpds-py==0.19.1 # via # -r requirements/test.txt # jsonschema @@ -223,6 +259,8 @@ semantic-version==2.10.0 six==1.16.0 # via # -r requirements/test.txt + # ddsketch + # ddtrace # edx-codejail # edx-sphinx-theme snowballstemmer==2.2.0 @@ -231,19 +269,19 @@ sphinx==5.3.0 # via # -r requirements/doc.in # edx-sphinx-theme -sphinxcontrib-applehelp==1.0.8 +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.6 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.5 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.7 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.10 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx -sqlparse==0.4.4 +sqlparse==0.5.1 # via # -r requirements/test.txt # django @@ -258,15 +296,28 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -typing-extensions==4.10.0 +typing-extensions==4.12.2 # via # -r requirements/test.txt + # ddtrace # edx-opaque-keys -urllib3==2.2.1 +urllib3==2.2.2 # via # -r requirements/test.txt # requests +wrapt==1.16.0 + # via + # -r requirements/test.txt + # deprecated +xmltodict==0.13.0 + # via + # -r requirements/test.txt + # ddtrace +zipp==3.19.2 + # via + # -r requirements/test.txt + # importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==69.1.1 +setuptools==72.1.0 # via -r requirements/test.txt diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 3ed9776..b0c1866 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,26 +1,26 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -build==1.0.3 +build==1.2.1 # via pip-tools click==8.1.7 # via pip-tools -packaging==23.2 +packaging==24.1 # via build -pip-tools==7.4.0 +pip-tools==7.4.1 # via -r requirements/pip-tools.in -pyproject-hooks==1.0.0 +pyproject-hooks==1.1.0 # via # build # pip-tools -wheel==0.42.0 +wheel==0.43.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: -pip==24.0 +pip==24.2 # via pip-tools -setuptools==69.1.1 +setuptools==72.1.0 # via pip-tools diff --git a/requirements/pip.txt b/requirements/pip.txt index e45232f..54b0571 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,14 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -wheel==0.42.0 +wheel==0.43.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==24.0 +pip==24.2 # via -r requirements/pip.in -setuptools==69.1.1 +setuptools==72.1.0 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 16a5fdf..e10c684 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,23 +1,35 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/test.txt # django -astroid==3.1.0 +astroid==3.2.4 # via # pylint # pylint-celery attrs==23.2.0 # via # -r requirements/test.txt + # cattrs + # ddtrace # jsonschema # referencing -certifi==2024.2.2 +backports-tarfile==1.2.0 + # via jaraco-context +bytecode==0.15.1 + # via + # -r requirements/test.txt + # ddtrace +cattrs==23.2.3 + # via + # -r requirements/test.txt + # ddtrace +certifi==2024.7.4 # via # -r requirements/test.txt # requests @@ -39,24 +51,35 @@ click==8.1.7 # edx-lint click-log==0.4.0 # via edx-lint -code-annotations==1.6.0 +code-annotations==1.8.0 # via # -r requirements/test.txt # edx-lint # edx-toggles -coverage[toml]==7.4.3 +coverage[toml]==7.6.0 # via # -r requirements/test.txt # pytest-cov -cryptography==42.0.5 +cryptography==43.0.0 # via # -r requirements/test.txt # pyjwt + # secretstorage +ddsketch==3.0.1 + # via + # -r requirements/test.txt + # ddtrace ddt==1.7.2 # via -r requirements/test.txt +ddtrace==2.10.1 + # via -r requirements/test.txt +deprecated==1.2.14 + # via + # -r requirements/test.txt + # opentelemetry-api dill==0.3.8 # via pylint -django==3.2.24 +django==4.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.txt @@ -78,40 +101,53 @@ django-waffle==4.1.0 # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.14.0 +djangorestframework==3.15.2 # via # -r requirements/test.txt # drf-jwt # edx-drf-extensions -docutils==0.20.1 +dnspython==2.6.1 + # via + # -r requirements/test.txt + # pymongo +docutils==0.21.2 # via readme-renderer drf-jwt==1.19.2 # via # -r requirements/test.txt # edx-drf-extensions -edx-codejail==3.3.3 +edx-codejail==3.4.1 # via -r requirements/test.txt -edx-django-utils==5.10.1 +edx-django-utils==5.15.0 # via # -r requirements/test.txt # edx-drf-extensions # edx-toggles -edx-drf-extensions==10.2.0 +edx-drf-extensions==10.3.0 # via -r requirements/test.txt -edx-lint==5.3.6 +edx-lint==5.3.7 # via -r requirements/quality.in -edx-opaque-keys==2.5.1 +edx-opaque-keys==2.10.0 # via # -r requirements/test.txt # edx-drf-extensions -edx-toggles==5.1.1 +edx-toggles==5.2.0 # via -r requirements/test.txt -idna==3.6 +envier==0.5.2 + # via + # -r requirements/test.txt + # ddtrace +idna==3.7 # via # -r requirements/test.txt # requests -importlib-metadata==7.0.1 - # via twine +importlib-metadata==6.11.0 + # via + # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt + # -r requirements/test.txt + # keyring + # opentelemetry-api + # twine iniconfig==2.0.0 # via # -r requirements/test.txt @@ -120,19 +156,27 @@ isort==5.13.2 # via # -r requirements/quality.in # pylint -jaraco-classes==3.3.1 +jaraco-classes==3.4.0 + # via keyring +jaraco-context==5.3.0 # via keyring -jinja2==3.1.3 +jaraco-functools==4.0.2 + # via keyring +jeepney==0.8.0 + # via + # keyring + # secretstorage +jinja2==3.1.4 # via # -r requirements/test.txt # code-annotations -jsonschema==4.21.1 +jsonschema==4.23.0 # via -r requirements/test.txt jsonschema-specifications==2023.12.1 # via # -r requirements/test.txt # jsonschema -keyring==24.3.0 +keyring==25.2.1 # via twine markdown-it-py==3.0.0 # via rich @@ -144,15 +188,21 @@ mccabe==0.7.0 # via pylint mdurl==0.1.2 # via markdown-it-py -more-itertools==10.2.0 - # via jaraco-classes -newrelic==9.7.0 +more-itertools==10.3.0 + # via + # jaraco-classes + # jaraco-functools +newrelic==9.12.0 # via # -r requirements/test.txt # edx-django-utils -nh3==0.2.15 +nh3==0.2.18 # via readme-renderer -packaging==23.2 +opentelemetry-api==1.26.0 + # via + # -r requirements/test.txt + # ddtrace +packaging==24.1 # via # -r requirements/test.txt # pytest @@ -160,36 +210,40 @@ pbr==6.0.0 # via # -r requirements/test.txt # stevedore -pkginfo==1.9.6 +pkginfo==1.10.0 # via twine -platformdirs==4.2.0 +platformdirs==4.2.2 # via pylint -pluggy==1.4.0 +pluggy==1.5.0 # via # -r requirements/test.txt # pytest -psutil==5.9.8 +protobuf==5.27.3 + # via + # -r requirements/test.txt + # ddtrace +psutil==6.0.0 # via # -r requirements/test.txt # edx-django-utils -pycodestyle==2.11.1 +pycodestyle==2.12.0 # via -r requirements/quality.in -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi pydocstyle==6.3.0 # via -r requirements/quality.in -pygments==2.17.2 +pygments==2.18.0 # via # readme-renderer # rich -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/test.txt # drf-jwt # edx-drf-extensions -pylint==3.1.0 +pylint==3.2.6 # via # edx-lint # pylint-celery @@ -203,7 +257,7 @@ pylint-plugin-utils==0.8.2 # via # pylint-celery # pylint-django -pymongo==3.13.0 +pymongo==4.8.0 # via # -r requirements/test.txt # edx-opaque-keys @@ -211,12 +265,12 @@ pynacl==1.5.0 # via # -r requirements/test.txt # edx-django-utils -pytest==8.0.2 +pytest==8.3.2 # via # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.txt pytest-django==4.8.0 # via -r requirements/test.txt @@ -224,23 +278,18 @@ python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations -pytz==2024.1 - # via - # -r requirements/test.txt - # django - # djangorestframework pyyaml==6.0.1 # via # -r requirements/test.txt # code-annotations -readme-renderer==42.0 +readme-renderer==44.0 # via twine -referencing==0.33.0 +referencing==0.35.1 # via # -r requirements/test.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.3 # via # -r requirements/test.txt # edx-drf-extensions @@ -250,13 +299,15 @@ requests-toolbelt==1.0.0 # via twine rfc3986==2.0.0 # via twine -rich==13.7.0 +rich==13.7.1 # via twine -rpds-py==0.18.0 +rpds-py==0.19.1 # via # -r requirements/test.txt # jsonschema # referencing +secretstorage==3.3.3 + # via keyring semantic-version==2.10.0 # via # -r requirements/test.txt @@ -264,11 +315,13 @@ semantic-version==2.10.0 six==1.16.0 # via # -r requirements/test.txt + # ddsketch + # ddtrace # edx-codejail # edx-lint snowballstemmer==2.2.0 # via pydocstyle -sqlparse==0.4.4 +sqlparse==0.5.1 # via # -r requirements/test.txt # django @@ -282,22 +335,33 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -tomlkit==0.12.3 +tomlkit==0.13.0 # via pylint -twine==5.0.0 +twine==5.1.1 # via -r requirements/quality.in -typing-extensions==4.10.0 +typing-extensions==4.12.2 # via # -r requirements/test.txt + # ddtrace # edx-opaque-keys -urllib3==2.2.1 +urllib3==2.2.2 # via # -r requirements/test.txt # requests # twine -zipp==3.17.0 - # via importlib-metadata +wrapt==1.16.0 + # via + # -r requirements/test.txt + # deprecated +xmltodict==0.13.0 + # via + # -r requirements/test.txt + # ddtrace +zipp==3.19.2 + # via + # -r requirements/test.txt + # importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==69.1.1 +setuptools==72.1.0 # via -r requirements/test.txt diff --git a/requirements/scripts.txt b/requirements/scripts.txt index 4c29368..c7740dd 100644 --- a/requirements/scripts.txt +++ b/requirements/scripts.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/base.txt # django @@ -16,7 +16,7 @@ attrs==23.2.0 # referencing avro==1.11.3 # via confluent-kafka -certifi==2024.2.2 +certifi==2024.7.4 # via # -r requirements/base.txt # requests @@ -34,17 +34,17 @@ click==8.1.7 # -r requirements/base.txt # code-annotations # edx-django-utils -code-annotations==1.6.0 +code-annotations==1.8.0 # via # -r requirements/base.txt # edx-toggles -confluent-kafka[avro]==2.3.0 +confluent-kafka[avro]==2.5.0 # via -r requirements/scripts.in -cryptography==42.0.5 +cryptography==43.0.0 # via # -r requirements/base.txt # pyjwt -django==3.2.24 +django==4.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/base.txt @@ -68,50 +68,57 @@ django-waffle==4.1.0 # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.14.0 +djangorestframework==3.15.2 # via # -r requirements/base.txt # drf-jwt # edx-drf-extensions +dnspython==2.6.1 + # via + # -r requirements/base.txt + # pymongo drf-jwt==1.19.2 # via # -r requirements/base.txt # edx-drf-extensions -edx-codejail==3.3.3 +edx-ccx-keys==1.3.0 + # via openedx-events +edx-codejail==3.4.1 # via -r requirements/base.txt -edx-django-utils==5.10.1 +edx-django-utils==5.15.0 # via # -r requirements/base.txt # edx-drf-extensions # edx-event-bus-kafka # edx-toggles # openedx-events -edx-drf-extensions==10.2.0 +edx-drf-extensions==10.3.0 # via -r requirements/base.txt -edx-event-bus-kafka==5.6.0 +edx-event-bus-kafka==5.8.0 # via -r requirements/scripts.in -edx-opaque-keys[django]==2.5.1 +edx-opaque-keys[django]==2.10.0 # via # -r requirements/base.txt + # edx-ccx-keys # edx-drf-extensions # openedx-events -edx-toggles==5.1.1 +edx-toggles==5.2.0 # via # -r requirements/base.txt # edx-event-bus-kafka -fastavro==1.9.4 +fastavro==1.9.5 # via # confluent-kafka # openedx-events -idna==3.6 +idna==3.7 # via # -r requirements/base.txt # requests -jinja2==3.1.3 +jinja2==3.1.4 # via # -r requirements/base.txt # code-annotations -jsonschema==4.21.1 +jsonschema==4.23.0 # via -r requirements/base.txt jsonschema-specifications==2023.12.1 # via @@ -121,30 +128,30 @@ markupsafe==2.1.5 # via # -r requirements/base.txt # jinja2 -newrelic==9.7.0 +newrelic==9.12.0 # via # -r requirements/base.txt # edx-django-utils -openedx-events==9.5.2 +openedx-events==9.11.0 # via edx-event-bus-kafka pbr==6.0.0 # via # -r requirements/base.txt # stevedore -psutil==5.9.8 +psutil==6.0.0 # via # -r requirements/base.txt # edx-django-utils -pycparser==2.21 +pycparser==2.22 # via # -r requirements/base.txt # cffi -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/base.txt # drf-jwt # edx-drf-extensions -pymongo==3.13.0 +pymongo==4.8.0 # via # -r requirements/base.txt # edx-opaque-keys @@ -156,26 +163,21 @@ python-slugify==8.0.4 # via # -r requirements/base.txt # code-annotations -pytz==2024.1 - # via - # -r requirements/base.txt - # django - # djangorestframework pyyaml==6.0.1 # via # -r requirements/base.txt # code-annotations -referencing==0.33.0 +referencing==0.35.1 # via # -r requirements/base.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.3 # via # -r requirements/base.txt # confluent-kafka # edx-drf-extensions -rpds-py==0.18.0 +rpds-py==0.19.1 # via # -r requirements/base.txt # jsonschema @@ -187,8 +189,9 @@ semantic-version==2.10.0 six==1.16.0 # via # -r requirements/base.txt + # edx-ccx-keys # edx-codejail -sqlparse==0.4.4 +sqlparse==0.5.1 # via # -r requirements/base.txt # django @@ -202,15 +205,15 @@ text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify -typing-extensions==4.10.0 +typing-extensions==4.12.2 # via # -r requirements/base.txt # edx-opaque-keys -urllib3==2.2.1 +urllib3==2.2.2 # via # -r requirements/base.txt # requests # The following packages are considered to be unsafe in a requirements file: -setuptools==69.1.1 +setuptools==72.1.0 # via -r requirements/base.txt diff --git a/requirements/test.in b/requirements/test.in index f2e6548..9974b96 100644 --- a/requirements/test.in +++ b/requirements/test.in @@ -6,4 +6,5 @@ pytest-cov # pytest extension for code coverage statistics pytest-django # pytest extension for better Django support code-annotations # provides commands used by the pii_check make target. -ddt # data-driven tests \ No newline at end of file +ddt # data-driven tests +ddtrace # Required for testing datadog_diagnostics app and middleware diff --git a/requirements/test.txt b/requirements/test.txt index 20da224..3d2ee70 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,19 +1,25 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/base.txt # django attrs==23.2.0 # via # -r requirements/base.txt + # cattrs + # ddtrace # jsonschema # referencing -certifi==2024.2.2 +bytecode==0.15.1 + # via ddtrace +cattrs==23.2.3 + # via ddtrace +certifi==2024.7.4 # via # -r requirements/base.txt # requests @@ -31,19 +37,25 @@ click==8.1.7 # -r requirements/base.txt # code-annotations # edx-django-utils -code-annotations==1.6.0 +code-annotations==1.8.0 # via # -r requirements/base.txt # -r requirements/test.in # edx-toggles -coverage[toml]==7.4.3 +coverage[toml]==7.6.0 # via pytest-cov -cryptography==42.0.5 +cryptography==43.0.0 # via # -r requirements/base.txt # pyjwt +ddsketch==3.0.1 + # via ddtrace ddt==1.7.2 # via -r requirements/test.in +ddtrace==2.10.1 + # via -r requirements/test.in +deprecated==1.2.14 + # via opentelemetry-api # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/base.txt @@ -65,41 +77,51 @@ django-waffle==4.1.0 # edx-django-utils # edx-drf-extensions # edx-toggles -djangorestframework==3.14.0 +djangorestframework==3.15.2 # via # -r requirements/base.txt # drf-jwt # edx-drf-extensions +dnspython==2.6.1 + # via + # -r requirements/base.txt + # pymongo drf-jwt==1.19.2 # via # -r requirements/base.txt # edx-drf-extensions -edx-codejail==3.3.3 +edx-codejail==3.4.1 # via -r requirements/base.txt -edx-django-utils==5.10.1 +edx-django-utils==5.15.0 # via # -r requirements/base.txt # edx-drf-extensions # edx-toggles -edx-drf-extensions==10.2.0 +edx-drf-extensions==10.3.0 # via -r requirements/base.txt -edx-opaque-keys==2.5.1 +edx-opaque-keys==2.10.0 # via # -r requirements/base.txt # edx-drf-extensions -edx-toggles==5.1.1 +edx-toggles==5.2.0 # via -r requirements/base.txt -idna==3.6 +envier==0.5.2 + # via ddtrace +idna==3.7 # via # -r requirements/base.txt # requests +importlib-metadata==6.11.0 + # via + # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt + # opentelemetry-api iniconfig==2.0.0 # via pytest -jinja2==3.1.3 +jinja2==3.1.4 # via # -r requirements/base.txt # code-annotations -jsonschema==4.21.1 +jsonschema==4.23.0 # via -r requirements/base.txt jsonschema-specifications==2023.12.1 # via @@ -109,32 +131,36 @@ markupsafe==2.1.5 # via # -r requirements/base.txt # jinja2 -newrelic==9.7.0 +newrelic==9.12.0 # via # -r requirements/base.txt # edx-django-utils -packaging==23.2 +opentelemetry-api==1.26.0 + # via ddtrace +packaging==24.1 # via pytest pbr==6.0.0 # via # -r requirements/base.txt # stevedore -pluggy==1.4.0 +pluggy==1.5.0 # via pytest -psutil==5.9.8 +protobuf==5.27.3 + # via ddtrace +psutil==6.0.0 # via # -r requirements/base.txt # edx-django-utils -pycparser==2.21 +pycparser==2.22 # via # -r requirements/base.txt # cffi -pyjwt[crypto]==2.8.0 +pyjwt[crypto]==2.9.0 # via # -r requirements/base.txt # drf-jwt # edx-drf-extensions -pymongo==3.13.0 +pymongo==4.8.0 # via # -r requirements/base.txt # edx-opaque-keys @@ -142,11 +168,11 @@ pynacl==1.5.0 # via # -r requirements/base.txt # edx-django-utils -pytest==8.0.2 +pytest==8.3.2 # via # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.in pytest-django==4.8.0 # via -r requirements/test.in @@ -154,25 +180,20 @@ python-slugify==8.0.4 # via # -r requirements/base.txt # code-annotations -pytz==2024.1 - # via - # -r requirements/base.txt - # django - # djangorestframework pyyaml==6.0.1 # via # -r requirements/base.txt # code-annotations -referencing==0.33.0 +referencing==0.35.1 # via # -r requirements/base.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.3 # via # -r requirements/base.txt # edx-drf-extensions -rpds-py==0.18.0 +rpds-py==0.19.1 # via # -r requirements/base.txt # jsonschema @@ -184,8 +205,10 @@ semantic-version==2.10.0 six==1.16.0 # via # -r requirements/base.txt + # ddsketch + # ddtrace # edx-codejail -sqlparse==0.4.4 +sqlparse==0.5.1 # via # -r requirements/base.txt # django @@ -199,15 +222,22 @@ text-unidecode==1.3 # via # -r requirements/base.txt # python-slugify -typing-extensions==4.10.0 +typing-extensions==4.12.2 # via # -r requirements/base.txt + # ddtrace # edx-opaque-keys -urllib3==2.2.1 +urllib3==2.2.2 # via # -r requirements/base.txt # requests +wrapt==1.16.0 + # via deprecated +xmltodict==0.13.0 + # via ddtrace +zipp==3.19.2 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==69.1.1 +setuptools==72.1.0 # via -r requirements/base.txt diff --git a/setup.py b/setup.py index 94a6eee..bc11b14 100644 --- a/setup.py +++ b/setup.py @@ -145,7 +145,7 @@ def is_requirement(line): ], include_package_data=True, install_requires=load_requirements('requirements/base.in'), - python_requires=">=3.8", + python_requires=">=3.11", license="AGPL 3.0", zip_safe=False, keywords='Python edx', @@ -157,7 +157,7 @@ def is_requirement(line): 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', 'Natural Language :: English', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.11', ], entry_points={ "lms.djangoapp": [ diff --git a/tox.ini b/tox.ini index 2d29123..096d3f0 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{38, 312}-django{42}, quality +envlist = py{311}-django{42}, quality [doc8] ; D001 = Line too long