From 117d67d2f69389abbe8880d86792d71ea0982e49 Mon Sep 17 00:00:00 2001 From: Robert Raposa Date: Tue, 11 Apr 2023 16:30:45 -0400 Subject: [PATCH 1/4] feat!: remove custom JWT decoding Removes the ecommerce custom JWT decoding, and replaces with the simple decoding from the edx-drf-extensions library. --- ecommerce/extensions/api/handlers.py | 120 -------------- .../extensions/api/tests/test_handlers.py | 146 ------------------ .../api/v2/tests/views/test_courses.py | 16 +- .../api/v2/tests/views/test_refunds.py | 6 +- .../extensions/checkout/tests/test_mixins.py | 2 +- .../offer/dynamic_conditional_offer.py | 4 +- .../tests/test_dynamic_conditional_offer.py | 4 +- .../extensions/refund/tests/test_signals.py | 2 +- ecommerce/management/tests/test_views.py | 7 +- ecommerce/settings/base.py | 2 +- ecommerce/tests/mixins.py | 60 +++---- 11 files changed, 53 insertions(+), 316 deletions(-) delete mode 100644 ecommerce/extensions/api/handlers.py delete mode 100644 ecommerce/extensions/api/tests/test_handlers.py diff --git a/ecommerce/extensions/api/handlers.py b/ecommerce/extensions/api/handlers.py deleted file mode 100644 index f40b252869d..00000000000 --- a/ecommerce/extensions/api/handlers.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -Handler overrides for JWT authentication. - -See ARCH-276 for details of removing additional issuers and retiring this -custom jwt_decode_handler. - -""" -import logging - -import jwt -import waffle -from django.conf import settings -from edx_django_utils import monitoring as monitoring_utils -from edx_rest_framework_extensions.auth.jwt.decoder import jwt_decode_handler as edx_drf_extensions_jwt_decode_handler -from rest_framework_jwt.settings import api_settings - -logger = logging.getLogger(__name__) - - -def _ecommerce_jwt_decode_handler_multiple_issuers(token): - """ - Unlike the edx-drf-extensions jwt_decode_handler implementation, this - jwt_decode_handler loops over multiple issuers using the same config - format as the edx-drf-extensions decoder. Example:: - - JWT_AUTH: - JWT_ISSUERS: - - AUDIENCE: '{{ COMMON_JWT_AUDIENCE }}' - ISSUER: '{{ COMMON_JWT_ISSUER }}' - SECRET_KEY: '{{ COMMON_JWT_SECRET_KEY }}' - - See ARCH-276 for details of removing additional issuers and retiring this - custom jwt_decode_handler. - - """ - options = { - 'verify_exp': api_settings.JWT_VERIFY_EXPIRATION, - 'verify_aud': settings.JWT_AUTH['JWT_VERIFY_AUDIENCE'], - } - error_msg = '' - - # JWT_ISSUERS is not one of DRF-JWT's default settings, and cannot be accessed - # using the `api_settings` object without overriding DRF-JWT's defaults. - issuers = settings.JWT_AUTH['JWT_ISSUERS'] - - for issuer in issuers: - try: - return jwt.decode( - token, - issuer['SECRET_KEY'], - api_settings.JWT_VERIFY, - options=options, - leeway=api_settings.JWT_LEEWAY, - audience=issuer['AUDIENCE'], - issuer=issuer['ISSUER'], - algorithms=[api_settings.JWT_ALGORITHM] - ) - except jwt.InvalidIssuerError: - # Ignore these errors since we have multiple issuers - error_msg += "Issuer {} does not match token. ".format(issuer['ISSUER']) - except jwt.DecodeError: - # Ignore these errors since we have multiple issuers - error_msg += "Wrong secret_key for issuer {}. ".format(issuer['ISSUER']) - except jwt.InvalidAlgorithmError: # pragma: no cover - # These should all fail because asymmetric keys are not supported - error_msg += "Algorithm not supported. " - break - except jwt.InvalidTokenError: - error_msg += "Invalid token found using issuer {}. ".format(issuer['ISSUER']) - logger.exception('Custom config JWT decode failed!') - - raise jwt.InvalidTokenError( - 'All combinations of JWT issuers with updated config failed to validate the token. ' + error_msg - ) - - -def jwt_decode_handler(token): - """ - Attempt to decode the given token with each of the configured JWT issuers. - - Args: - token (str): The JWT to decode. - - Returns: - dict: The JWT's payload. - - Raises: - InvalidTokenError: If the token is invalid, or if none of the - configured issuer/secret-key combos can properly decode the token. - - """ - - # First, try jwt_decode_handler from edx_drf_extensions - # Note: this jwt_decode_handler can handle asymmetric keys, but only a - # single issuer. Therefore, the LMS must be the first configured issuer. - try: - jwt_payload = edx_drf_extensions_jwt_decode_handler(token) - # Note: use increment in case there are multiple calls for different JWTs in the same transaction. - monitoring_utils.increment("ecom_jwt_decode_standard") - return jwt_payload - except Exception: # pylint: disable=broad-except - # continue and try again - if waffle.switch_is_active('jwt_decode_handler.log_exception.edx-drf-extensions'): - logger.info('Failed to use edx-drf-extensions jwt_decode_handler.', exc_info=True) - - # Next, try ecommerce decoder that handles multiple issuers. - # See ARCH-276 for details of removing additional issuers and retiring this - # custom jwt_decode_handler. - try: - jwt_payload = _ecommerce_jwt_decode_handler_multiple_issuers(token) - # Ultimately we want there to be no JWTs that aren't handled by the first case. - # This enables monitoring to see if there are still cases where the custom JWT - # decoder is in use. - monitoring_utils.increment("ecom_jwt_decode_custom") - return jwt_payload - except Exception: # pylint: disable=broad-except - if waffle.switch_is_active('jwt_decode_handler.log_exception.ecommerce-multiple-issuers'): - logger.info('Failed to use ecommerce multiple issuer jwt_decode_handler.', exc_info=True) - monitoring_utils.increment("ecom_jwt_decode_failed") - raise diff --git a/ecommerce/extensions/api/tests/test_handlers.py b/ecommerce/extensions/api/tests/test_handlers.py deleted file mode 100644 index 8893738ab0f..00000000000 --- a/ecommerce/extensions/api/tests/test_handlers.py +++ /dev/null @@ -1,146 +0,0 @@ -""" Tests for handler functions. """ - - -from time import time - -import jwt -import mock -from django.conf import settings -from django.test import override_settings -from waffle.testutils import override_switch - -from ecommerce.extensions.api.handlers import jwt_decode_handler -from ecommerce.tests.factories import UserFactory -from ecommerce.tests.testcases import TestCase - - -def generate_jwt_token(payload, signing_key): - """Generate a valid JWT token for authenticated requests.""" - return jwt.encode(payload, signing_key).decode('utf-8') - - -def generate_jwt_payload(user, issuer_name): - """Generate a valid JWT payload given a user.""" - now = int(time()) - ttl = 5 - return { - 'iss': issuer_name, - 'username': user.username, - 'email': user.email, - 'iat': now, - 'exp': now + ttl - } - - -class JWTDecodeHandlerTests(TestCase): - """ Tests for the `jwt_decode_handler` utility function. """ - - def setUp(self): - super(JWTDecodeHandlerTests, self).setUp() - self.user = UserFactory() - - @override_settings( - JWT_AUTH={ - 'JWT_ISSUERS': [{ - 'AUDIENCE': 'test-audience', - 'ISSUER': 'test-issuer', - 'SECRET_KEY': 'test-secret-key', - }], - 'JWT_VERIFY_AUDIENCE': False, - } - ) - @mock.patch('edx_django_utils.monitoring.increment') - @mock.patch('ecommerce.extensions.api.handlers._ecommerce_jwt_decode_handler_multiple_issuers') - def test_decode_success_edx_drf_extensions(self, mock_multiple_issuer_decoder, mock_increment): - """ - Should pass using the edx-drf-extensions jwt_decode_handler. - - This would happen if ``_ecommerce_jwt_decode_handler_multiple_issuers`` - should fail (e.g. using asymmetric tokens). - """ - mock_multiple_issuer_decoder.side_effect = jwt.InvalidTokenError() - first_issuer = settings.JWT_AUTH['JWT_ISSUERS'][0] - payload = generate_jwt_payload(self.user, issuer_name=first_issuer['ISSUER']) - token = generate_jwt_token(payload, first_issuer['SECRET_KEY']) - self.assertDictContainsSubset(payload, jwt_decode_handler(token)) - mock_increment.assert_called_with('ecom_jwt_decode_standard') - - @override_settings( - JWT_AUTH={ - 'JWT_ISSUERS': [ - { - 'AUDIENCE': 'test-audience', - 'ISSUER': 'test-issuer', - 'SECRET_KEY': 'test-secret-key', - }, - { - 'AUDIENCE': 'test-audience', - 'ISSUER': 'test-invalid-issuer', - 'SECRET_KEY': 'test-secret-key-2', - }, - { - 'AUDIENCE': 'test-audience', - 'ISSUER': 'test-issuer-2', - 'SECRET_KEY': 'test-secret-key-2', - }, - ], - 'JWT_VERIFY_AUDIENCE': False, - } - ) - @mock.patch('edx_django_utils.monitoring.increment') - @mock.patch('ecommerce.extensions.api.handlers.logger') - def test_decode_success_multiple_issuers(self, mock_logger, mock_increment): - """ - Should pass using ``_ecommerce_jwt_decode_handler_multiple_issuers``. - - This would happen with the combination of the JWT_ISSUERS configured in - the way that edx-drf-extensions is expected, but when the token was - generated from the second (or third+) issuer. - """ - non_first_issuer = settings.JWT_AUTH['JWT_ISSUERS'][2] - payload = generate_jwt_payload(self.user, issuer_name=non_first_issuer['ISSUER']) - token = generate_jwt_token(payload, non_first_issuer['SECRET_KEY']) - self.assertDictContainsSubset(payload, jwt_decode_handler(token)) - mock_increment.assert_called_with('ecom_jwt_decode_custom') - mock_logger.exception.assert_not_called() - mock_logger.warning.assert_not_called() - mock_logger.error.assert_not_called() - mock_logger.info.assert_not_called() - - @override_settings( - JWT_AUTH={ - 'JWT_ISSUERS': [ - { - 'AUDIENCE': 'test-audience', - 'ISSUER': 'test-issuer', - 'SECRET_KEY': 'test-secret-key', - }, - { - 'AUDIENCE': 'test-audience', - 'ISSUER': 'test-issuer-2', - 'SECRET_KEY': 'test-secret-key-2', - }, - ], - 'JWT_VERIFY_AUDIENCE': False, - } - ) - @override_switch('jwt_decode_handler.log_exception.ecommerce-multiple-issuers', active=True) - @override_switch('jwt_decode_handler.log_exception.edx-drf-extensions', active=True) - @mock.patch('ecommerce.extensions.api.handlers.logger') - def test_decode_error_invalid_token(self, mock_logger): - """ - Invalid token will fail both multiple-issuers and the fallback of - edx-drf-extensions jwt_decode_handler. - """ - # Update the payload to ensure a validation error - payload = generate_jwt_payload(self.user, issuer_name='test-issuer-2') - payload['exp'] = 0 - token = generate_jwt_token(payload, 'test-secret-key-2') - with self.assertRaises(jwt.InvalidTokenError): - jwt_decode_handler(token) - - mock_logger.exception.assert_called_with('Custom config JWT decode failed!') - mock_logger.info.assert_has_calls(calls=[ - mock.call('Failed to use edx-drf-extensions jwt_decode_handler.', exc_info=True), - mock.call('Failed to use ecommerce multiple issuer jwt_decode_handler.', exc_info=True), - ]) diff --git a/ecommerce/extensions/api/v2/tests/views/test_courses.py b/ecommerce/extensions/api/v2/tests/views/test_courses.py index 885fb65f173..c20a75ef340 100644 --- a/ecommerce/extensions/api/v2/tests/views/test_courses.py +++ b/ecommerce/extensions/api/v2/tests/views/test_courses.py @@ -2,9 +2,7 @@ import json -import jwt import mock -from django.conf import settings from django.contrib.auth import get_user_model from django.urls import reverse from oscar.core.loading import get_class, get_model @@ -16,6 +14,7 @@ from ecommerce.courses.tests.factories import CourseFactory from ecommerce.extensions.api.v2.tests.views import JSON_CONTENT_TYPE, ProductSerializerMixin from ecommerce.extensions.catalogue.tests.mixins import DiscoveryTestMixin +from ecommerce.tests.mixins import JwtMixin from ecommerce.tests.testcases import TestCase Product = get_model('catalogue', 'Product') @@ -24,7 +23,7 @@ User = get_user_model() -class CourseViewSetTests(ProductSerializerMixin, DiscoveryTestMixin, TestCase): +class CourseViewSetTests(JwtMixin, ProductSerializerMixin, DiscoveryTestMixin, TestCase): list_path = reverse('api:v2:course-list') def setUp(self): @@ -75,14 +74,9 @@ def test_jwt_authentication(self): """ Verify the endpoint supports JWT authentication and user creation. """ username = 'some-user' email = 'some-user@example.com' - payload = { - 'administrator': True, - 'username': username, - 'email': email, - 'iss': settings.JWT_AUTH['JWT_ISSUERS'][0]['ISSUER'] - } - auth_header = "JWT {token}".format( - token=jwt.encode(payload, settings.JWT_AUTH['JWT_SECRET_KEY']).decode('utf-8')) + is_staff = True + + auth_header = f'JWT {self.generate_new_user_token(username, email, is_staff)}' self.assertFalse(User.objects.filter(username=username).exists()) response = self.client.get( diff --git a/ecommerce/extensions/api/v2/tests/views/test_refunds.py b/ecommerce/extensions/api/v2/tests/views/test_refunds.py index d596b1a4180..df04e8bf56c 100644 --- a/ecommerce/extensions/api/v2/tests/views/test_refunds.py +++ b/ecommerce/extensions/api/v2/tests/views/test_refunds.py @@ -19,14 +19,14 @@ from ecommerce.extensions.refund.tests.factories import RefundFactory, RefundLineFactory from ecommerce.extensions.refund.tests.mixins import RefundTestMixin from ecommerce.extensions.test.factories import create_order -from ecommerce.tests.mixins import JwtMixin, ThrottlingMixin +from ecommerce.tests.mixins import ThrottlingMixin from ecommerce.tests.testcases import TestCase Option = get_model('catalogue', 'Option') Refund = get_model('refund', 'Refund') -class RefundCreateViewTests(RefundTestMixin, AccessTokenMixin, JwtMixin, TestCase): +class RefundCreateViewTests(RefundTestMixin, AccessTokenMixin, TestCase): MODEL_LOGGER_NAME = 'ecommerce.core.models' path = reverse('api:v2:refunds:create') @@ -104,7 +104,7 @@ def test_jwt_authentication(self): self.client.logout() data = self._get_data(self.user.username, self.course_id) - auth_header = 'JWT ' + self.generate_token({'username': self.user.username}) + auth_header = self.generate_jwt_token_header(self.user) response = self.client.post(self.path, data, JSON_CONTENT_TYPE, HTTP_AUTHORIZATION=auth_header) self.assert_ok_response(response) diff --git a/ecommerce/extensions/checkout/tests/test_mixins.py b/ecommerce/extensions/checkout/tests/test_mixins.py index f8a9b81b7f4..ab4c232afbc 100644 --- a/ecommerce/extensions/checkout/tests/test_mixins.py +++ b/ecommerce/extensions/checkout/tests/test_mixins.py @@ -310,7 +310,7 @@ def test_handle_successful_order_segment_error(self, mock_track): # ensure that analytics.track was called, but the exception was caught self.assertTrue(mock_track.called) # ensure we logged a warning. - self.assertTrue(mock_log_exc.called_with("Failed to emit tracking event upon order placement.")) + mock_log_exc.assert_called_with("Failed to emit tracking event upon order completion.") def test_handle_successful_async_order(self, __): """ diff --git a/ecommerce/extensions/offer/dynamic_conditional_offer.py b/ecommerce/extensions/offer/dynamic_conditional_offer.py index fbedc154ca0..02773569297 100644 --- a/ecommerce/extensions/offer/dynamic_conditional_offer.py +++ b/ecommerce/extensions/offer/dynamic_conditional_offer.py @@ -5,9 +5,9 @@ import crum import waffle from edx_django_utils.monitoring import set_custom_attribute +from edx_rest_framework_extensions.auth.jwt.decoder import configured_jwt_decode_handler from oscar.core.loading import get_class, get_model -from ecommerce.extensions.api.handlers import jwt_decode_handler from ecommerce.extensions.offer.constants import DYNAMIC_DISCOUNT_FLAG from ecommerce.extensions.offer.mixins import ( BenefitWithoutRangeMixin, @@ -35,7 +35,7 @@ def get_decoded_jwt_discount_from_request(): return None set_custom_attribute('ecom_discount_jwt', 'found') - return jwt_decode_handler(discount_jwt) + return configured_jwt_decode_handler(discount_jwt) def get_percentage_from_request(): diff --git a/ecommerce/extensions/offer/tests/test_dynamic_conditional_offer.py b/ecommerce/extensions/offer/tests/test_dynamic_conditional_offer.py index cc42fe90f2a..a3ce50c5a1d 100644 --- a/ecommerce/extensions/offer/tests/test_dynamic_conditional_offer.py +++ b/ecommerce/extensions/offer/tests/test_dynamic_conditional_offer.py @@ -43,7 +43,7 @@ class DynamicPercentageDiscountBenefitTests(BenefitTestMixin, TestCase): @override_flag(DYNAMIC_DISCOUNT_FLAG, active=True) @patch('crum.get_current_request') - @patch('ecommerce.extensions.offer.dynamic_conditional_offer.jwt_decode_handler', + @patch('ecommerce.extensions.offer.dynamic_conditional_offer.configured_jwt_decode_handler', side_effect=_mock_jwt_decode_handler) @patch('ecommerce.enterprise.utils.get_decoded_jwt', side_effect=_mock_get_decoded_jwt) @@ -104,7 +104,7 @@ def test_name(self): @override_flag(DYNAMIC_DISCOUNT_FLAG, active=True) @patch('crum.get_current_request') - @patch('ecommerce.extensions.offer.dynamic_conditional_offer.jwt_decode_handler', + @patch('ecommerce.extensions.offer.dynamic_conditional_offer.configured_jwt_decode_handler', side_effect=_mock_jwt_decode_handler) @ddt.data( {'discount_applicable': True, 'discount_percent': 15}, diff --git a/ecommerce/extensions/refund/tests/test_signals.py b/ecommerce/extensions/refund/tests/test_signals.py index 4aec4ebb944..6998f7ff834 100644 --- a/ecommerce/extensions/refund/tests/test_signals.py +++ b/ecommerce/extensions/refund/tests/test_signals.py @@ -106,4 +106,4 @@ def test_successful_refund_tracking_segment_error(self, mock_track): self.assertTrue(mock_track.called) # Verify that an error message was logged. - self.assertTrue(mock_log_exc.called_with('Failed to emit tracking event upon refund completion.')) + mock_log_exc.assert_called_with('Failed to emit tracking event upon refund completion.') diff --git a/ecommerce/management/tests/test_views.py b/ecommerce/management/tests/test_views.py index b2c460e057c..232821a8235 100644 --- a/ecommerce/management/tests/test_views.py +++ b/ecommerce/management/tests/test_views.py @@ -45,9 +45,12 @@ def test_invalid_action(self): self.assert_first_message(response, messages.ERROR, 'invalid-action is not a valid action.') def test_refund_basket_transactions(self): - with mock.patch('ecommerce.management.utils.refund_basket_transactions') as mock_refund: + success_count = 0 + failed_count = 0 + result = (success_count, failed_count) + with mock.patch('ecommerce.management.views.refund_basket_transactions', return_value=result) as mock_refund: response = self.client.post(self.path, {'action': 'refund_basket_transactions', 'basket_ids': '1,2,3'}) - assert mock_refund.called_once_with(self.site, [1, 2, 3]) + mock_refund.assert_called_once_with(self.site, [1, 2, 3]) assert response.status_code == 200 expected = 'Finished refunding basket transactions. [0] transactions were successfully refunded. ' \ diff --git a/ecommerce/settings/base.py b/ecommerce/settings/base.py index 6774175f89e..e4dabcdb76a 100644 --- a/ecommerce/settings/base.py +++ b/ecommerce/settings/base.py @@ -446,7 +446,7 @@ 'JWT_AUTH_COOKIE': 'edx-jwt-cookie', 'JWT_VERIFY_EXPIRATION': True, 'JWT_LEEWAY': 1, - 'JWT_DECODE_HANDLER': 'ecommerce.extensions.api.handlers.jwt_decode_handler', + 'JWT_DECODE_HANDLER': 'edx_rest_framework_extensions.auth.jwt.decoder.jwt_decode_handler', # These settings are NOT part of DRF-JWT's defaults. 'JWT_ISSUERS': [ { diff --git a/ecommerce/tests/mixins.py b/ecommerce/tests/mixins.py index 01c83aacbf1..a03154b06d6 100644 --- a/ecommerce/tests/mixins.py +++ b/ecommerce/tests/mixins.py @@ -5,8 +5,8 @@ import datetime import json from decimal import Decimal +from unittest.mock import Mock -import jwt import responses from crum import set_current_request from django.conf import settings @@ -17,7 +17,11 @@ from edx_django_utils.cache import TieredCache from edx_rest_api_client.client import _get_oauth_url from edx_rest_framework_extensions.auth.jwt.cookies import jwt_cookie_name -from edx_rest_framework_extensions.auth.jwt.tests.utils import generate_jwt_token, generate_unversioned_payload +from edx_rest_framework_extensions.auth.jwt.tests.utils import ( + generate_jwt, + generate_jwt_token, + generate_unversioned_payload +) from mock import patch from oscar.core.loading import get_class, get_model from oscar.test import factories @@ -82,26 +86,9 @@ def set_user_id_in_social_auth(self, user, user_id=None): user_id = user_id or self.user_id UserSocialAuth.objects.create(user=user, extra_data={'user_id': user_id}) - def generate_jwt_token_header(self, user, secret=None): + def generate_jwt_token_header(self, user): """Generate a valid JWT token header for authenticated requests.""" - secret = secret or settings.JWT_AUTH['JWT_SECRET_KEY'] - - # WARNING: - # If any test that uses this function fails with an error about a missing 'exp' or 'iat' or - # 'is_restricted' claim in the payload, then do one of the following: - # - # 1. If Ecommerce's JWT_DECODE_HANDLER setting still points to a custom decoder inside Ecommerce, - # then a bug was introduced and the setting is no longer respected. If this is the case, do not - # add the claims to this test, and instead fix the bug. Or, - # 2. If Ecommerce is being updated to no longer use a custom JWT_DECODE_HANDLER from Ecommerce, but is - # instead using the decode handler directly from edx-drf-extensions, any required claims can be - # added to this test and this warning can be removed. - payload = { - 'username': user.username, - 'email': user.email, - 'iss': settings.JWT_AUTH['JWT_ISSUERS'][0]['ISSUER'] - } - return "JWT {token}".format(token=jwt.encode(payload, secret).decode('utf-8')) + return "JWT {token}".format(token=generate_jwt(user)) class ThrottlingMixin: @@ -116,14 +103,13 @@ def setUp(self): class JwtMixin: """ Mixin with JWT-related helper functions. """ - JWT_SECRET_KEY = settings.JWT_AUTH['JWT_SECRET_KEY'] + JWT_SECRET_KEY = settings.JWT_AUTH['JWT_ISSUERS'][0]['SECRET_KEY'] issuer = settings.JWT_AUTH['JWT_ISSUERS'][0]['ISSUER'] def generate_token(self, payload, secret=None): """Generate a JWT token with the provided payload.""" secret = secret or self.JWT_SECRET_KEY - token = jwt.encode(dict(payload, iss=self.issuer), secret).decode('utf-8') - return token + return generate_jwt_token(payload, secret) def set_jwt_cookie(self, system_wide_role=SYSTEM_ENTERPRISE_ADMIN_ROLE, context='some_context'): """ @@ -141,6 +127,26 @@ def set_jwt_cookie(self, system_wide_role=SYSTEM_ENTERPRISE_ADMIN_ROLE, context= self.client.cookies[jwt_cookie_name()] = jwt_token + def generate_new_user_token(self, username, email, is_staff): + """ + Generates a JWT token for a user with provided attributes. + + Note: Doesn't actually create the user object, so it can be created + during JWT authentication. + """ + # create a mock user, and not the actual user, because we want to confirm that + # the user is created during JWT authentication + user = Mock() + user.username = username + user.email = email + user.is_staff = is_staff + + payload = generate_unversioned_payload(user) + # At this time, generate_unversioned_payload isn't setting 'administrator', but + # it should. + payload['administrator'] = is_staff + return self.generate_token(payload) + class BasketCreationMixin(UserMixin, JwtMixin): """Provides utility methods for creating baskets in test cases.""" @@ -209,7 +215,7 @@ def assert_successful_basket_creation( # Ideally, we'd use Oscar's ShippingEventTypeFactory here, but it's not exposed/public. ShippingEventType.objects.get_or_create(name=SHIPPING_EVENT_NAME) - with patch('ecommerce.extensions.analytics.utils.audit_log') as mock_audit_log: + with patch('ecommerce.extensions.api.v2.views.baskets.audit_log') as mock_audit_log: response = self.create_basket(skus=skus, checkout=checkout, payment_processor_name=payment_processor_name) self.assertEqual(response.status_code, 200) @@ -219,13 +225,13 @@ def assert_successful_basket_creation( self.assertEqual(response.data['id'], basket.id) if checkout: - self.assertTrue(mock_audit_log.called_with( + mock_audit_log.assert_called_with( 'basket_frozen', amount=basket.total_excl_tax, basket_id=basket.id, currency=basket.currency, user_id=basket.owner.id - )) + ) if requires_payment: self.assertIsNone(response.data['order']) From 7231120ec0abd9bd3e5d85649b49eb0634357913 Mon Sep 17 00:00:00 2001 From: Robert Raposa Date: Wed, 12 Apr 2023 00:52:52 -0400 Subject: [PATCH 2/4] fix: drop constraints and make upgrade --- requirements/base.txt | 80 ++++----- requirements/constraints.txt | 15 +- requirements/dev.txt | 338 ++++++++++++++++++----------------- requirements/docs.txt | 20 ++- requirements/e2e.txt | 65 ++++--- requirements/pip.txt | 4 +- requirements/pip_tools.txt | 6 +- requirements/production.txt | 264 +++++++++++++-------------- requirements/test.txt | 317 +++++++++++++++----------------- requirements/tox.txt | 6 +- 10 files changed, 541 insertions(+), 574 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 89565084af9..6cb4e079580 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # make upgrade @@ -37,9 +37,9 @@ billiard==3.6.4.0 # via celery bleach==6.0.0 # via -r requirements/base.in -boto3==1.26.98 +boto3==1.26.111 # via -r requirements/base.in -botocore==1.29.98 +botocore==1.29.111 # via # boto3 # s3transfer @@ -76,11 +76,11 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -coverage==7.2.2 +coverage==7.2.3 # via cybersource-rest-client-python crypto==1.4.1 # via cybersource-rest-client-python -cryptography==40.0.0 +cryptography==40.0.1 # via # cybersource-rest-client-python # paramiko @@ -131,7 +131,7 @@ django==3.2.18 # edx-rbac # jsonfield # jsonfield2 - # rest-condition + # social-auth-app-django # xss-utils django-appconf==1.0.5 # via django-compressor @@ -153,7 +153,7 @@ django-extensions==3.2.1 # via -r requirements/base.in django-extra-views==0.13.0 # via django-oscar -django-filter==22.1 +django-filter==23.1 # via -r requirements/base.in django-haystack==3.2.1 # via django-oscar @@ -196,7 +196,6 @@ djangorestframework==3.14.0 # drf-jwt # drf-yasg # edx-drf-extensions - # rest-condition djangorestframework-csv==2.1.1 # via -r requirements/base.in djangorestframework-datatables==0.7.0 @@ -205,30 +204,25 @@ drf-extensions==0.7.1 # via -r requirements/base.in drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.20.0 - # via - # -c requirements/constraints.txt - # -r requirements/base.in -edx-auth-backends==3.4.0 - # via - # -c requirements/constraints.txt - # -r requirements/base.in +drf-yasg==1.21.5 + # via -r requirements/base.in +edx-auth-backends==4.1.0 + # via -r requirements/base.in edx-braze-client==0.1.6 # via edx-ecommerce-worker edx-django-release-util==1.2.0 # via -r requirements/base.in edx-django-sites-extensions==4.0.0 # via -r requirements/base.in -edx-django-utils==5.3.0 +edx-django-utils==5.4.0 # via # -r requirements/base.in # django-config-models # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients -edx-drf-extensions==6.6.0 +edx-drf-extensions==8.5.3 # via - # -c requirements/constraints.txt # -r requirements/base.in # edx-rbac edx-ecommerce-worker==3.3.2 @@ -251,7 +245,7 @@ extras==1.0.0 # python-subunit factory-boy==2.12.0 # via django-oscar -faker==18.3.1 +faker==18.4.0 # via factory-boy fixtures==4.0.1 # via @@ -273,7 +267,7 @@ google-api-python-client==2.31.0 # via # -r requirements/base.in # inapppy -google-auth==2.16.3 +google-auth==2.17.2 # via # google-api-core # google-api-python-client @@ -294,6 +288,8 @@ idna==2.7 # cybersource-rest-client-python # requests # yarl +importlib-resources==5.12.0 + # via jsonschema inapppy==2.5.2 # via -r requirements/base.in inflection==0.5.1 @@ -350,7 +346,7 @@ naked==0.1.32 # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/base.in -newrelic==8.7.1 +newrelic==8.8.0 # via # -r requirements/base.in # edx-django-utils @@ -363,7 +359,7 @@ oauthlib==3.2.2 # getsmarter-api-clients # requests-oauthlib # social-auth-core -packaging==23.0 +packaging==23.1 # via drf-yasg paramiko==3.1.0 # via cybersource-rest-client-python @@ -377,11 +373,13 @@ pbr==5.11.1 # fixtures # stevedore # testtools -phonenumbers==8.13.7 +phonenumbers==8.13.9 # via django-oscar -pillow==9.4.0 +pillow==9.5.0 # via django-oscar -platformdirs==3.1.1 +pkgutil-resolve-name==1.3.10 + # via jsonschema +platformdirs==3.2.0 # via zeep premailer==2.9.2 # via -r requirements/base.in @@ -417,15 +415,16 @@ pycryptodomex==3.17 # via # cybersource-rest-client-python # pyjwkest -pygments==2.14.0 +pygments==2.15.0 # via -r requirements/base.in pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==1.7.1 +pyjwt[crypto]==2.6.0 # via # cybersource-rest-client-python # drf-jwt # edx-auth-backends + # edx-drf-extensions # edx-rest-api-client # social-auth-core pymongo==3.13.0 @@ -435,7 +434,7 @@ pynacl==1.5.0 # cybersource-rest-client-python # edx-django-utils # paramiko -pyopenssl==23.1.0 +pyopenssl==23.1.1 # via # cybersource-rest-client-python # ndg-httpsclient @@ -463,16 +462,17 @@ python3-openid==3.2.0 # via # -r requirements/base.in # social-auth-core -pytz==2016.10 +pytz==2023.3 # via - # -c requirements/constraints.txt # -r requirements/base.in + # babel # celery # cybersource-rest-client-python # datetime # django # djangorestframework # djangorestframework-datatables + # drf-yasg # getsmarter-api-clients # zeep pyyaml==6.0 @@ -482,7 +482,7 @@ pyyaml==6.0 # naked rcssmin==1.1.1 # via django-compressor -redis==4.5.3 +redis==4.5.4 # via edx-ecommerce-worker requests==2.28.2 # via @@ -512,8 +512,6 @@ requests-oauthlib==1.3.1 # social-auth-core requests-toolbelt==0.10.1 # via zeep -rest-condition==1.0.3 - # via edx-drf-extensions rjsmin==1.2.1 # via django-compressor rsa==4.9 @@ -536,7 +534,7 @@ shellescape==3.8.1 # via # crypto # cybersource-rest-client-python -simplejson==3.18.4 +simplejson==3.19.1 # via -r requirements/base.in six==1.16.0 # via @@ -560,18 +558,14 @@ six==1.16.0 # pyjwkest # python-dateutil # requests-file - # social-auth-app-django - # social-auth-core slumber==0.7.1 # via edx-rest-api-client -social-auth-app-django==4.0.0 +social-auth-app-django==5.2.0 # via - # -c requirements/constraints.txt # -r requirements/base.in # edx-auth-backends -social-auth-core==4.0.2 +social-auth-core==4.4.1 # via - # -c requirements/constraints.txt # edx-auth-backends # social-auth-app-django sorl-thumbnail==12.9.0 @@ -582,7 +576,7 @@ stevedore==5.0.0 # via # edx-django-utils # edx-opaque-keys -stripe==5.3.0 +stripe==5.4.0 # via -r requirements/base.in testtools==2.6.0 # via @@ -623,6 +617,8 @@ yarl==1.8.2 # via aiohttp zeep==4.2.1 # via -r requirements/base.in +zipp==3.15.0 + # via importlib-resources zope-interface==6.0 # via # cybersource-rest-client-python diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 094b00c6dea..0574dc7395b 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -17,11 +17,6 @@ cybersource-rest-client-python==0.0.21 # Django 3.2 support is added in version 2.2 so pinning it to 2.2 django-oscar==2.2 -# Pinned to preserve the status quo -pytz==2016.10 -# drf-yasg>=1.20.3 requires pytz>2021.10 so pinning the version untill pytz is upgraded -drf-yasg<1.20.3 - # Pinned because transifex-client==0.13.6 pins it urllib3>=1.24.2,<2.0.0 @@ -38,17 +33,9 @@ idna==2.7 # TODO : Pinning this until we are sure there aren't any breaking changes, then we'll upgrade. celery<5.0.0 -# Latest version requires PyJWT>=2.0.0 but drf-jwt requires PyJWT[crypto]<2.0.0,>=1.5.2 -social-auth-core<4.0.3 - -# Versions higher than this need new PyJWT 2.1.0 -# pinning these to unstick 'make upgrade' until we're ready to upgrade PyJWT -edx-drf-extensions<7.0.0 -edx-auth-backends<4.0.0 -social-auth-app-django<5.0.0 # version 5.0.0 requires social-auth-core>=4.1.0 - # bok-choy 1.1.1 requires <4 (can remove once we have a version without that requirement) selenium<4.0.0 +pytest-selenium<4.0.0 # pylint>2.12.2 requires a lot of quality fixes. Can be resolved later on. pylint==2.12.2 diff --git a/requirements/dev.txt b/requirements/dev.txt index d1515d0b83c..c7f3d78c3a9 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,14 +1,22 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -aiohttp==3.8.0 +accessible-pygments==0.0.4 + # via + # -r requirements/docs.txt + # pydata-sphinx-theme +aiohttp==3.8.4 # via # -r requirements/test.txt # inapppy -alabaster==0.7.12 +aiosignal==1.3.1 + # via + # -r requirements/test.txt + # aiohttp +alabaster==0.7.13 # via # -r requirements/docs.txt # sphinx @@ -16,9 +24,9 @@ amqp==2.6.1 # via # -r requirements/test.txt # kombu -analytics-python==1.4.0 +analytics-python==1.4.post1 # via -r requirements/test.txt -asgiref==3.5.2 +asgiref==3.6.0 # via # -r requirements/test.txt # django @@ -33,53 +41,53 @@ astroid==2.9.3 async-timeout==4.0.2 # via # -r requirements/test.txt + # aiohttp # redis -attrs==22.1.0 +attrs==22.2.0 # via # -r requirements/test.txt # aiohttp # jsonschema # pytest # zeep -babel==2.10.3 +babel==2.12.1 # via # -r requirements/docs.txt # -r requirements/test.txt # django-oscar + # pydata-sphinx-theme # sphinx backoff==1.10.0 # via # -r requirements/test.txt # analytics-python -bcrypt==4.0.0 +bcrypt==4.0.1 # via # -r requirements/test.txt # cybersource-rest-client-python # paramiko -beautifulsoup4==4.11.1 +beautifulsoup4==4.12.2 # via + # -r requirements/docs.txt # -r requirements/test.txt + # pydata-sphinx-theme # webtest billiard==3.6.4.0 # via # -r requirements/test.txt # celery -bleach==5.0.1 +bleach==6.0.0 # via -r requirements/test.txt bok-choy==1.1.1 # via -r requirements/test.txt -boto3==1.24.73 +boto3==1.26.111 # via -r requirements/test.txt -botocore==1.27.73 +botocore==1.29.111 # via # -r requirements/test.txt # boto3 # s3transfer -cached-property==1.5.2 - # via - # -r requirements/test.txt - # zeep -cachetools==4.2.2 +cachetools==5.3.0 # via # -r requirements/test.txt # google-auth @@ -87,7 +95,7 @@ celery==4.4.7 # via # -r requirements/test.txt # edx-ecommerce-worker -certifi==2022.9.14 +certifi==2022.12.7 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -99,16 +107,16 @@ cffi==1.15.1 # cryptography # cybersource-rest-client-python # pynacl -chardet==5.0.0 +chardet==5.1.0 # via # -r requirements/test.txt - # aiohttp # cybersource-rest-client-python # diff-cover -charset-normalizer==2.1.1 +charset-normalizer==3.1.0 # via # -r requirements/docs.txt # -r requirements/test.txt + # aiohttp # requests click==8.1.3 # via @@ -127,7 +135,7 @@ coreschema==0.0.4 # -r requirements/test.txt # coreapi # drf-yasg -coverage[toml]==6.4.4 +coverage[toml]==7.2.3 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -136,7 +144,7 @@ crypto==1.4.1 # via # -r requirements/test.txt # cybersource-rest-client-python -cryptography==38.0.1 +cryptography==40.0.1 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -144,7 +152,7 @@ cryptography==38.0.1 # pyjwt # pyopenssl # social-auth-core -cssselect==1.1.0 +cssselect==1.2.0 # via # -r requirements/test.txt # premailer @@ -154,7 +162,7 @@ cssutils==2.6.0 # premailer cybersource-rest-client-python==0.0.21 # via -r requirements/test.txt -datetime==4.7 +datetime==5.1 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -165,18 +173,15 @@ defusedxml==0.7.1 # -r requirements/test.txt # python3-openid # social-auth-core -deprecated==1.2.13 - # via - # -r requirements/test.txt - # redis -diff-cover==6.5.1 +diff-cover==7.5.0 # via -r requirements/test.txt -django==3.2.15 +django==3.2.18 # via # -r requirements/test.txt # django-appconf # django-config-models # django-cors-headers + # django-crispy-forms # django-crum # django-debug-toolbar # django-extensions @@ -200,28 +205,29 @@ django==3.2.15 # edx-i18n-tools # edx-rbac # jsonfield - # rest-condition + # jsonfield2 + # social-auth-app-django # xss-utils django-appconf==1.0.5 # via # -r requirements/test.txt # django-compressor -django-compressor==4.1 +django-compressor==4.3.1 # via # -r requirements/test.txt # django-libsass django-config-models==2.3.0 # via -r requirements/test.txt -django-cors-headers==3.13.0 +django-cors-headers==3.14.0 # via -r requirements/test.txt -django-crispy-forms==1.14.0 +django-crispy-forms==2.0 # via -r requirements/test.txt django-crum==0.7.9 # via # -r requirements/test.txt # edx-django-utils # edx-rbac -django-debug-toolbar==3.6.0 +django-debug-toolbar==4.0.0 # via -r requirements/dev.in django-extensions==3.2.1 # via -r requirements/test.txt @@ -229,15 +235,15 @@ django-extra-views==0.13.0 # via # -r requirements/test.txt # django-oscar -django-filter==22.1 +django-filter==23.1 # via -r requirements/test.txt -django-haystack==3.1.1 +django-haystack==3.2.1 # via # -r requirements/test.txt # django-oscar django-libsass==0.9 # via -r requirements/test.txt -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # -r requirements/test.txt # edx-rbac @@ -272,7 +278,7 @@ django-widget-tweaks==1.4.12 # via # -r requirements/test.txt # django-oscar -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/test.txt # django-config-models @@ -282,7 +288,6 @@ djangorestframework==3.13.1 # drf-jwt # drf-yasg # edx-drf-extensions - # rest-condition djangorestframework-csv==2.1.1 # via -r requirements/test.txt djangorestframework-datatables==0.7.0 @@ -290,6 +295,7 @@ djangorestframework-datatables==0.7.0 docutils==0.19 # via # -r requirements/docs.txt + # pydata-sphinx-theme # sphinx drf-extensions==0.7.1 # via -r requirements/test.txt @@ -297,11 +303,11 @@ drf-jwt==1.19.2 # via # -r requirements/test.txt # edx-drf-extensions -drf-yasg==1.20.0 +drf-yasg==1.21.5 # via -r requirements/test.txt -edx-auth-backends==3.4.0 +edx-auth-backends==4.1.0 # via -r requirements/test.txt -edx-braze-client==0.1.4 +edx-braze-client==0.1.6 # via # -r requirements/test.txt # edx-ecommerce-worker @@ -309,20 +315,20 @@ edx-django-release-util==1.2.0 # via -r requirements/test.txt edx-django-sites-extensions==4.0.0 # via -r requirements/test.txt -edx-django-utils==5.0.1 +edx-django-utils==5.4.0 # via # -r requirements/test.txt # django-config-models # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients -edx-drf-extensions==6.6.0 +edx-drf-extensions==8.5.3 # via # -r requirements/test.txt # edx-rbac edx-ecommerce-worker==3.3.2 # via -r requirements/test.txt -edx-i18n-tools==0.9.1 +edx-i18n-tools==0.9.2 # via -r requirements/test.txt edx-opaque-keys==2.3.0 # via @@ -334,8 +340,6 @@ edx-rest-api-client==5.5.0 # via # -r requirements/test.txt # edx-ecommerce-worker -edx-sphinx-theme==3.0.0 - # via -r requirements/docs.txt enum34==1.1.10 # via # -r requirements/test.txt @@ -345,81 +349,90 @@ extras==1.0.0 # -r requirements/test.txt # cybersource-rest-client-python # python-subunit - # testtools factory-boy==2.12.0 # via # -r requirements/test.txt # django-oscar -faker==14.2.0 +faker==18.4.0 # via # -r requirements/test.txt # factory-boy -filelock==3.8.0 +filelock==3.11.0 # via # -r requirements/test.txt # tox -fixtures==3.0.0 +fixtures==4.0.1 # via # -r requirements/test.txt # cybersource-rest-client-python # testtools freezegun==1.2.2 # via -r requirements/test.txt +frozenlist==1.3.3 + # via + # -r requirements/test.txt + # aiohttp + # aiosignal funcsigs==1.0.2 # via # -r requirements/test.txt # cybersource-rest-client-python -future==0.18.2 +future==0.18.3 # via # -r requirements/test.txt # pyjwkest getsmarter-api-clients==0.5.0 # via -r requirements/test.txt -gitdb==4.0.9 +gitdb==4.0.10 # via gitpython -gitpython==3.1.27 +gitpython==3.1.31 # via transifex-client -google-api-core==1.30.0 +google-api-core==2.11.0 # via # -r requirements/test.txt # google-api-python-client google-api-python-client==2.31.0 - # via -r requirements/base.in -google-auth-httplib2==0.1.0 # via # -r requirements/test.txt - # google-api-python-client -google-auth==1.32.1 + # inapppy +google-auth==2.17.2 # via # -r requirements/test.txt # google-api-core # google-api-python-client # google-auth-httplib2 -googleapis-common-protos==1.53.0 +google-auth-httplib2==0.1.0 + # via + # -r requirements/test.txt + # google-api-python-client +googleapis-common-protos==1.59.0 # via # -r requirements/test.txt # google-api-core httplib2==0.20.2 - # via -r requirements/base.in -httpretty==0.9.7 - # via -r requirements/test.txt + # via + # -r requirements/test.txt + # google-api-python-client + # google-auth-httplib2 + # oauth2client idna==2.7 # via # -r requirements/docs.txt # -r requirements/test.txt # cybersource-rest-client-python # requests + # yarl imagesize==1.4.1 # via # -r requirements/docs.txt # sphinx -importlib-metadata==4.12.0 +importlib-metadata==6.3.0 # via # -r requirements/docs.txt # -r requirements/test.txt # pytest-randomly # sphinx -importlib-resources==5.9.0 +importlib-resources==5.12.0 # via # -r requirements/test.txt # jsonschema @@ -429,7 +442,7 @@ inflection==0.5.1 # via # -r requirements/test.txt # drf-yasg -iniconfig==1.1.1 +iniconfig==2.0.0 # via # -r requirements/test.txt # pytest @@ -441,7 +454,7 @@ isodate==0.6.1 # via # -r requirements/test.txt # zeep -isort==5.10.1 +isort==5.12.0 # via # -r requirements/test.txt # pylint @@ -463,7 +476,9 @@ jmespath==1.0.1 # botocore jsonfield==3.1.0 # via -r requirements/test.txt -jsonschema==4.16.0 +jsonfield2==4.0.0.post0 + # via -r requirements/test.txt +jsonschema==4.17.3 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -471,11 +486,11 @@ kombu==4.6.11 # via # -r requirements/test.txt # celery -lazy==1.4 +lazy==1.5 # via # -r requirements/test.txt # bok-choy -lazy-object-proxy==1.7.1 +lazy-object-proxy==1.9.0 # via # -r requirements/test.txt # astroid @@ -492,14 +507,14 @@ logger==1.4 # via # -r requirements/test.txt # cybersource-rest-client-python -lxml==4.9.1 +lxml==4.9.2 # via # -r requirements/test.txt # premailer # zeep markdown==2.6.9 # via -r requirements/test.txt -markupsafe==2.1.1 +markupsafe==2.1.2 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -508,31 +523,27 @@ mccabe==0.6.1 # via # -r requirements/test.txt # pylint -mock==4.0.3 +mock==5.0.1 # via -r requirements/test.txt monotonic==1.6 # via # -r requirements/test.txt # analytics-python -more-itertools==8.8.0 - # via - # -r requirements/test.txt - # pytest -multidict==5.1.0 +multidict==6.0.4 # via # -r requirements/test.txt # aiohttp # yarl mysqlclient==1.4.6 # via -r requirements/test.txt -naked==0.1.31 +naked==0.1.32 # via # -r requirements/test.txt # crypto # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/test.txt -newrelic==8.1.0.180 +newrelic==8.8.0 # via # -r requirements/test.txt # edx-django-utils @@ -544,30 +555,26 @@ oauth2client==4.1.3 # via # -r requirements/test.txt # inapppy -oauthlib==3.2.1 +oauthlib==3.2.2 # via # -r requirements/test.txt # getsmarter-api-clients # requests-oauthlib # social-auth-core -openapi-codec==1.3.2 - # via - # -r requirements/test.txt - # django-rest-swagger -packaging==21.3 +packaging==23.1 # via # -r requirements/docs.txt # -r requirements/test.txt # drf-yasg + # pydata-sphinx-theme # pytest - # redis # sphinx # tox -paramiko==2.11.0 +paramiko==3.1.0 # via # -r requirements/test.txt # cybersource-rest-client-python -path==16.4.0 +path==16.6.0 # via # -r requirements/test.txt # edx-i18n-tools @@ -575,18 +582,18 @@ path-py==7.2 # via -r requirements/test.txt paypalrestsdk==1.13.1 # via -r requirements/test.txt -pbr==5.10.0 +pbr==5.11.1 # via # -r requirements/test.txt # cybersource-rest-client-python # fixtures # stevedore # testtools -phonenumbers==8.12.55 +phonenumbers==8.13.9 # via # -r requirements/test.txt # django-oscar -pillow==9.2.0 +pillow==9.5.0 # via # -r requirements/test.txt # django-oscar @@ -594,7 +601,7 @@ pkgutil-resolve-name==1.3.10 # via # -r requirements/test.txt # jsonschema -platformdirs==2.5.2 +platformdirs==3.2.0 # via # -r requirements/test.txt # pylint @@ -605,18 +612,18 @@ pluggy==0.13.1 # diff-cover # pytest # tox -polib==1.1.1 +polib==1.2.0 # via # -r requirements/test.txt # edx-i18n-tools premailer==2.9.2 # via -r requirements/test.txt -protobuf==3.17.3 +protobuf==4.22.1 # via # -r requirements/test.txt # google-api-core # googleapis-common-protos -psutil==5.9.2 +psutil==5.9.4 # via # -r requirements/test.txt # edx-django-utils @@ -630,12 +637,8 @@ py==1.11.0 # via # -r requirements/test.txt # pytest + # pytest-html # tox -pyasn1-modules==0.2.8 - # via - # -r requirements/test.txt - # google-auth - # oauth2client pyasn1==0.4.8 # via # -r requirements/test.txt @@ -645,7 +648,12 @@ pyasn1==0.4.8 # pyasn1-modules # rsa # x509 -pycodestyle==2.9.1 +pyasn1-modules==0.2.8 + # via + # -r requirements/test.txt + # google-auth + # oauth2client +pycodestyle==2.10.0 # via -r requirements/test.txt pycountry==17.1.8 # via -r requirements/test.txt @@ -654,36 +662,43 @@ pycparser==2.21 # -r requirements/test.txt # cffi # cybersource-rest-client-python -pycryptodome==3.15.0 +pycryptodome==3.17 # via # -r requirements/test.txt # cybersource-rest-client-python -pycryptodomex==3.15.0 +pycryptodomex==3.17 # via # -r requirements/test.txt # cybersource-rest-client-python # pyjwkest -pygments==2.13.0 +pydata-sphinx-theme==0.13.3 + # via + # -r requirements/docs.txt + # sphinx-book-theme +pygments==2.15.0 # via # -r requirements/docs.txt # -r requirements/test.txt + # accessible-pygments # diff-cover + # pydata-sphinx-theme # sphinx pyjwkest==1.4.2 # via # -r requirements/test.txt # edx-drf-extensions -pyjwt[crypto]==1.7.1 +pyjwt[crypto]==2.6.0 # via # -r requirements/test.txt # cybersource-rest-client-python # drf-jwt # edx-auth-backends + # edx-drf-extensions # edx-rest-api-client # social-auth-core pylint==2.12.2 # via -r requirements/test.txt -pymongo==3.12.3 +pymongo==3.13.0 # via # -r requirements/test.txt # edx-opaque-keys @@ -693,7 +708,7 @@ pynacl==1.5.0 # cybersource-rest-client-python # edx-django-utils # paramiko -pyopenssl==22.0.0 +pyopenssl==23.1.1 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -701,15 +716,13 @@ pyopenssl==22.0.0 # paypalrestsdk pyparsing==3.0.9 # via - # -r requirements/docs.txt # -r requirements/test.txt # httplib2 - # packaging pypi==2.1 # via # -r requirements/test.txt # cybersource-rest-client-python -pyrsistent==0.18.1 +pyrsistent==0.19.3 # via # -r requirements/test.txt # jsonschema @@ -729,15 +742,15 @@ pytest-base-url==1.4.2 # via # -r requirements/test.txt # pytest-selenium -pytest-cov==3.0.0 +pytest-cov==4.0.0 # via -r requirements/test.txt pytest-django==4.5.2 # via -r requirements/test.txt -pytest-html==3.1.1 +pytest-html==3.2.0 # via # -r requirements/test.txt # pytest-selenium -pytest-metadata==2.0.2 +pytest-metadata==2.0.4 # via # -r requirements/test.txt # pytest-html @@ -759,7 +772,7 @@ python-dateutil==2.8.2 # edx-drf-extensions # faker # freezegun -python-dotenv==0.21.0 +python-dotenv==1.0.0 # via -r requirements/test.txt python-memcached==1.59 # via -r requirements/test.txt @@ -769,7 +782,7 @@ python-mimeparse==1.6.0 # cybersource-rest-client-python python-slugify==4.0.1 # via transifex-client -python-subunit==1.4.0 +python-subunit==1.4.2 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -781,7 +794,7 @@ python3-openid==3.2.0 # via # -r requirements/test.txt # social-auth-core -pytz==2016.10 +pytz==2023.3 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -792,6 +805,7 @@ pytz==2016.10 # django # djangorestframework # djangorestframework-datatables + # drf-yasg # getsmarter-api-clients # zeep pywatchman==1.4.1 @@ -803,15 +817,16 @@ pyyaml==6.0 # edx-django-release-util # edx-i18n-tools # naked -rcssmin==1.1.0 + # responses +rcssmin==1.1.1 # via # -r requirements/test.txt # django-compressor -redis==4.3.4 +redis==4.5.4 # via # -r requirements/test.txt # edx-ecommerce-worker -requests==2.28.1 +requests==2.28.2 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -846,17 +861,13 @@ requests-oauthlib==1.3.1 # -r requirements/test.txt # getsmarter-api-clients # social-auth-core -requests-toolbelt==0.9.1 +requests-toolbelt==0.10.1 # via # -r requirements/test.txt # zeep -responses==0.21.0 +responses==0.23.1 # via -r requirements/test.txt -rest-condition==1.0.3 - # via - # -r requirements/test.txt - # edx-drf-extensions -rjsmin==1.2.0 +rjsmin==1.2.1 # via # -r requirements/test.txt # django-compressor @@ -864,11 +875,14 @@ rsa==4.9 # via # -r requirements/test.txt # cybersource-rest-client-python + # google-auth + # inapppy + # oauth2client ruamel-yaml==0.17.21 # via # -r requirements/test.txt # drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via # -r requirements/test.txt # ruamel-yaml @@ -892,11 +906,10 @@ shellescape==3.8.1 # -r requirements/test.txt # crypto # cybersource-rest-client-python -simplejson==3.17.6 +simplejson==3.19.1 # via -r requirements/test.txt six==1.16.0 # via - # -r requirements/docs.txt # -r requirements/test.txt # analytics-python # bleach @@ -909,26 +922,17 @@ six==1.16.0 # edx-drf-extensions # edx-ecommerce-worker # edx-rbac - # edx-sphinx-theme - # fixtures - # google-api-core - # google-api-python-client # google-auth # google-auth-httplib2 - # httpretty # isodate # libsass # oauth2client - # paramiko # paypalrestsdk - # protobuf # purl # pyjwkest # python-dateutil # python-memcached # requests-file - # social-auth-app-django - # social-auth-core # tenacity # tox # transifex-client @@ -942,26 +946,30 @@ snowballstemmer==2.2.0 # via # -r requirements/docs.txt # sphinx -social-auth-app-django==4.0.0 +social-auth-app-django==5.2.0 # via # -r requirements/test.txt # edx-auth-backends -social-auth-core==4.0.2 +social-auth-core==4.4.1 # via # -r requirements/test.txt # edx-auth-backends # social-auth-app-django sorl-thumbnail==12.9.0 # via -r requirements/test.txt -soupsieve==2.3.2.post1 +soupsieve==2.4 # via + # -r requirements/docs.txt # -r requirements/test.txt # beautifulsoup4 -sphinx==5.1.1 +sphinx==5.3.0 # via # -r requirements/docs.txt - # edx-sphinx-theme -sphinxcontrib-applehelp==1.0.2 + # pydata-sphinx-theme + # sphinx-book-theme +sphinx-book-theme==1.0.1 + # via -r requirements/docs.txt +sphinxcontrib-applehelp==1.0.4 # via # -r requirements/docs.txt # sphinx @@ -969,7 +977,7 @@ sphinxcontrib-devhelp==1.0.2 # via # -r requirements/docs.txt # sphinx -sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-htmlhelp==2.0.1 # via # -r requirements/docs.txt # sphinx @@ -985,25 +993,25 @@ sphinxcontrib-serializinghtml==1.1.5 # via # -r requirements/docs.txt # sphinx -sqlparse==0.4.2 +sqlparse==0.4.3 # via # -r requirements/test.txt # django # django-debug-toolbar -stevedore==4.0.0 +stevedore==5.0.0 # via # -r requirements/test.txt # edx-django-utils # edx-opaque-keys -stripe==4.1.0 +stripe==5.4.0 # via -r requirements/test.txt tenacity==6.3.1 # via # -r requirements/test.txt # pytest-selenium -testfixtures==7.0.0 +testfixtures==7.1.0 # via -r requirements/test.txt -testtools==2.5.0 +testtools==2.6.0 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -1032,14 +1040,20 @@ traceback2==1.4.0 # cybersource-rest-client-python transifex-client==0.14.4 # via -r requirements/dev.in +types-pyyaml==6.0.12.9 + # via + # -r requirements/test.txt + # responses typing==3.7.4.3 # via # -r requirements/test.txt # cybersource-rest-client-python -typing-extensions==4.3.0 +typing-extensions==4.5.0 # via + # -r requirements/docs.txt # -r requirements/test.txt # astroid + # pydata-sphinx-theme # pylint unicodecsv==0.14.1 # via @@ -1050,7 +1064,8 @@ uritemplate==4.1.1 # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.12 + # google-api-python-client +urllib3==1.26.15 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -1085,7 +1100,7 @@ webtest==3.0.0 # via # -r requirements/test.txt # django-webtest -wheel==0.37.1 +wheel==0.40.0 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -1093,26 +1108,25 @@ wrapt==1.13.3 # via # -r requirements/test.txt # astroid - # deprecated x509==0.1 # via # -r requirements/test.txt # cybersource-rest-client-python xss-utils==0.4.0 # via -r requirements/test.txt -yarl==1.6.3 +yarl==1.8.2 # via # -r requirements/test.txt # aiohttp -zeep==4.1.0 +zeep==4.2.1 # via -r requirements/test.txt -zipp==3.8.1 +zipp==3.15.0 # via # -r requirements/docs.txt # -r requirements/test.txt # importlib-metadata # importlib-resources -zope-interface==5.4.0 +zope-interface==6.0 # via # -r requirements/test.txt # cybersource-rest-client-python diff --git a/requirements/docs.txt b/requirements/docs.txt index 5c17e78fcff..0784bce9c75 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # make upgrade @@ -12,7 +12,7 @@ babel==2.12.1 # via # pydata-sphinx-theme # sphinx -beautifulsoup4==4.12.0 +beautifulsoup4==4.12.2 # via pydata-sphinx-theme certifi==2022.12.7 # via requests @@ -28,21 +28,25 @@ idna==2.7 # requests imagesize==1.4.1 # via sphinx +importlib-metadata==6.3.0 + # via sphinx jinja2==3.1.2 # via sphinx markupsafe==2.1.2 # via jinja2 -packaging==23.0 +packaging==23.1 # via # pydata-sphinx-theme # sphinx -pydata-sphinx-theme==0.13.1 +pydata-sphinx-theme==0.13.3 # via sphinx-book-theme -pygments==2.14.0 +pygments==2.15.0 # via # accessible-pygments # pydata-sphinx-theme # sphinx +pytz==2023.3 + # via babel requests==2.28.2 # via sphinx snowballstemmer==2.2.0 @@ -55,7 +59,7 @@ sphinx==5.3.0 # -r requirements/docs.in # pydata-sphinx-theme # sphinx-book-theme -sphinx-book-theme==1.0.0 +sphinx-book-theme==1.0.1 # via -r requirements/docs.in sphinxcontrib-applehelp==1.0.4 # via sphinx @@ -69,7 +73,11 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx +typing-extensions==4.5.0 + # via pydata-sphinx-theme urllib3==1.26.15 # via # -c requirements/constraints.txt # requests +zipp==3.15.0 + # via importlib-metadata diff --git a/requirements/e2e.txt b/requirements/e2e.txt index 8f3a5412109..fd77a737b5b 100644 --- a/requirements/e2e.txt +++ b/requirements/e2e.txt @@ -1,18 +1,18 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -asgiref==3.5.2 +asgiref==3.6.0 # via # -c requirements/base.txt # django -attrs==22.1.0 +attrs==22.2.0 # via # -c requirements/base.txt # pytest -certifi==2022.9.14 +certifi==2022.12.7 # via # -c requirements/base.txt # requests @@ -21,7 +21,7 @@ cffi==1.15.1 # -c requirements/base.txt # cryptography # pynacl -charset-normalizer==2.1.1 +charset-normalizer==3.1.0 # via # -c requirements/base.txt # requests @@ -29,11 +29,11 @@ click==8.1.3 # via # -c requirements/base.txt # edx-django-utils -cryptography==38.0.1 +cryptography==40.0.1 # via # -c requirements/base.txt # pyjwt -django==3.2.15 +django==3.2.18 # via # -c requirements/base.txt # -c requirements/common_constraints.txt @@ -47,7 +47,7 @@ django-waffle==3.0.0 # via # -c requirements/base.txt # edx-django-utils -edx-django-utils==5.0.1 +edx-django-utils==5.4.0 # via # -c requirements/base.txt # edx-rest-api-client @@ -60,19 +60,19 @@ idna==2.7 # -c requirements/base.txt # -c requirements/constraints.txt # requests -importlib-metadata==4.12.0 +importlib-metadata==6.3.0 # via pytest-randomly -iniconfig==1.1.1 +iniconfig==2.0.0 # via pytest -newrelic==8.1.0.180 +newrelic==8.8.0 # via # -c requirements/base.txt # edx-django-utils -packaging==21.3 +packaging==23.1 # via # -c requirements/base.txt # pytest -pbr==5.10.0 +pbr==5.11.1 # via # -c requirements/base.txt # stevedore @@ -80,17 +80,19 @@ pluggy==0.13.1 # via # -c requirements/constraints.txt # pytest -psutil==5.9.2 +psutil==5.9.4 # via # -c requirements/base.txt # edx-django-utils py==1.11.0 - # via pytest + # via + # pytest + # pytest-html pycparser==2.21 # via # -c requirements/base.txt # cffi -pyjwt[crypto]==1.7.1 +pyjwt[crypto]==2.6.0 # via # -c requirements/base.txt # edx-rest-api-client @@ -98,10 +100,6 @@ pynacl==1.5.0 # via # -c requirements/base.txt # edx-django-utils -pyparsing==3.0.9 - # via - # -c requirements/base.txt - # packaging pytest==6.2.5 # via # -r requirements/e2e.in @@ -114,26 +112,27 @@ pytest==6.2.5 # pytest-variables pytest-base-url==1.4.2 # via pytest-selenium -pytest-html==3.1.1 +pytest-html==3.2.0 # via pytest-selenium -pytest-metadata==2.0.2 +pytest-metadata==2.0.4 # via pytest-html pytest-randomly==3.12.0 # via -r requirements/e2e.in pytest-selenium==3.0.0 - # via -r requirements/e2e.in + # via + # -c requirements/constraints.txt + # -r requirements/e2e.in pytest-timeout==2.1.0 # via -r requirements/e2e.in pytest-variables==1.9.0 # via pytest-selenium -python-dotenv==0.21.0 +python-dotenv==1.0.0 # via -r requirements/e2e.in -pytz==2016.10 +pytz==2023.3 # via # -c requirements/base.txt - # -c requirements/constraints.txt # django -requests==2.28.1 +requests==2.28.2 # via # -c requirements/base.txt # edx-rest-api-client @@ -153,11 +152,11 @@ slumber==0.7.1 # via # -c requirements/base.txt # edx-rest-api-client -sqlparse==0.4.2 +sqlparse==0.4.3 # via # -c requirements/base.txt # django -stevedore==4.0.0 +stevedore==5.0.0 # via # -c requirements/base.txt # edx-django-utils @@ -165,15 +164,13 @@ tenacity==6.3.1 # via pytest-selenium toml==0.10.2 # via pytest -urllib3==1.26.12 +urllib3==1.26.15 # via # -c requirements/base.txt # -c requirements/constraints.txt # requests # selenium -wcwidth==0.2.5 - # via pytest -zipp==3.8.1 +zipp==3.15.0 # via # -c requirements/base.txt # importlib-metadata diff --git a/requirements/pip.txt b/requirements/pip.txt index 1690ea83941..896a85cea36 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # make upgrade @@ -10,5 +10,5 @@ wheel==0.40.0 # The following packages are considered to be unsafe in a requirements file: pip==23.0.1 # via -r requirements/pip.in -setuptools==67.6.0 +setuptools==67.6.1 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 9c7e7da31c7..b6150065453 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.10 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # make upgrade @@ -8,9 +8,9 @@ build==0.10.0 # via pip-tools click==8.1.3 # via pip-tools -packaging==23.0 +packaging==23.1 # via build -pip-tools==6.12.3 +pip-tools==6.13.0 # via -r requirements/pip_tools.in pyproject-hooks==1.0.0 # via build diff --git a/requirements/production.txt b/requirements/production.txt index f6eeea9ca95..4b7870bf333 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1,55 +1,57 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -aiohttp==3.8.0 +aiohttp==3.8.4 # via inapppy +aiosignal==1.3.1 + # via aiohttp amqp==2.6.1 # via kombu -analytics-python==1.4.0 +analytics-python==1.4.post1 # via -r requirements/base.in -asgiref==3.5.2 +asgiref==3.6.0 # via django asn1crypto==1.5.1 # via cybersource-rest-client-python async-timeout==4.0.2 - # via redis -attrs==22.1.0 + # via + # aiohttp + # redis +attrs==22.2.0 # via # aiohttp # jsonschema # zeep -babel==2.10.3 +babel==2.12.1 # via django-oscar backoff==1.10.0 # via analytics-python -bcrypt==4.0.0 +bcrypt==4.0.1 # via # cybersource-rest-client-python # paramiko billiard==3.6.4.0 # via celery -bleach==5.0.1 +bleach==6.0.0 # via -r requirements/base.in -boto3==1.24.73 +boto3==1.26.111 # via # -r requirements/base.in # django-ses -botocore==1.27.73 +botocore==1.29.111 # via # boto3 # s3transfer -cached-property==1.5.2 - # via zeep -cachetools==4.2.2 +cachetools==5.3.0 # via google-auth celery==4.4.7 # via # -c requirements/constraints.txt # edx-ecommerce-worker -certifi==2022.9.14 +certifi==2022.12.7 # via # cybersource-rest-client-python # requests @@ -58,13 +60,12 @@ cffi==1.15.1 # cryptography # cybersource-rest-client-python # pynacl -chardet==5.0.0 +chardet==5.1.0 + # via cybersource-rest-client-python +charset-normalizer==3.1.0 # via # aiohttp - # cybersource-rest-client-python # requests -charset-normalizer==2.1.1 - # via requests click==8.1.3 # via edx-django-utils configparser==5.3.0 @@ -77,18 +78,18 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -coverage==6.4.4 +coverage==7.2.3 # via cybersource-rest-client-python crypto==1.4.1 # via cybersource-rest-client-python -cryptography==38.0.1 +cryptography==40.0.1 # via # cybersource-rest-client-python # paramiko # pyjwt # pyopenssl # social-auth-core -cssselect==1.1.0 +cssselect==1.2.0 # via premailer cssutils==2.6.0 # via premailer @@ -96,21 +97,20 @@ cybersource-rest-client-python==0.0.21 # via # -c requirements/constraints.txt # -r requirements/base.in -datetime==4.7 +datetime==5.1 # via cybersource-rest-client-python defusedxml==0.7.1 # via # python3-openid # social-auth-core -deprecated==1.2.13 - # via redis -django==3.2.15 +django==3.2.18 # via # -c requirements/common_constraints.txt # -r requirements/base.in # django-appconf # django-config-models # django-cors-headers + # django-crispy-forms # django-crum # django-extensions # django-extra-views @@ -133,19 +133,20 @@ django==3.2.15 # edx-drf-extensions # edx-rbac # jsonfield - # rest-condition + # jsonfield2 + # social-auth-app-django # xss-utils django-appconf==1.0.5 # via django-compressor -django-compressor==4.1 +django-compressor==4.3.1 # via # -r requirements/base.in # django-libsass django-config-models==2.3.0 # via -r requirements/base.in -django-cors-headers==3.13.0 +django-cors-headers==3.14.0 # via -r requirements/base.in -django-crispy-forms==1.14.0 +django-crispy-forms==2.0 # via -r requirements/base.in django-crum==0.7.9 # via @@ -155,13 +156,13 @@ django-extensions==3.2.1 # via -r requirements/base.in django-extra-views==0.13.0 # via django-oscar -django-filter==22.1 +django-filter==23.1 # via -r requirements/base.in -django-haystack==3.1.1 +django-haystack==3.2.1 # via django-oscar django-libsass==0.9 # via -r requirements/base.in -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via edx-rbac django-oscar==2.2 # via @@ -169,7 +170,7 @@ django-oscar==2.2 # -r requirements/base.in django-phonenumber-field==5.0.0 # via django-oscar -django-ses==3.1.2 +django-ses==3.3.0 # via -r requirements/production.in django-simple-history==3.0.0 # via @@ -190,7 +191,7 @@ django-waffle==3.0.0 # edx-drf-extensions django-widget-tweaks==1.4.12 # via django-oscar -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.in # django-config-models @@ -200,7 +201,6 @@ djangorestframework==3.13.1 # drf-jwt # drf-yasg # edx-drf-extensions - # rest-condition djangorestframework-csv==2.1.1 # via -r requirements/base.in djangorestframework-datatables==0.7.0 @@ -209,30 +209,25 @@ drf-extensions==0.7.1 # via -r requirements/base.in drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.20.0 - # via - # -c requirements/constraints.txt - # -r requirements/base.in -edx-auth-backends==3.4.0 - # via - # -c requirements/constraints.txt - # -r requirements/base.in -edx-braze-client==0.1.4 +drf-yasg==1.21.5 + # via -r requirements/base.in +edx-auth-backends==4.1.0 + # via -r requirements/base.in +edx-braze-client==0.1.6 # via edx-ecommerce-worker edx-django-release-util==1.2.0 # via -r requirements/base.in edx-django-sites-extensions==4.0.0 # via -r requirements/base.in -edx-django-utils==5.0.1 +edx-django-utils==5.4.0 # via # -r requirements/base.in # django-config-models # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients -edx-drf-extensions==6.6.0 +edx-drf-extensions==8.5.3 # via - # -c requirements/constraints.txt # -r requirements/base.in # edx-rbac edx-ecommerce-worker==3.3.2 @@ -253,49 +248,54 @@ extras==1.0.0 # via # cybersource-rest-client-python # python-subunit - # testtools factory-boy==2.12.0 # via django-oscar -faker==14.2.0 +faker==18.4.0 # via factory-boy -fixtures==3.0.0 +fixtures==4.0.1 # via # cybersource-rest-client-python # testtools +frozenlist==1.3.3 + # via + # aiohttp + # aiosignal funcsigs==1.0.2 # via cybersource-rest-client-python -future==0.18.2 - # via - # django-ses - # pyjwkest +future==0.18.3 + # via pyjwkest getsmarter-api-clients==0.5.0 # via -r requirements/base.in - # via - # django-ses - # pyjwkest -google-api-core==1.30.0 +google-api-core==2.11.0 # via google-api-python-client google-api-python-client==2.31.0 - # via -r requirements/base.in -google-auth-httplib2==0.1.0 - # via google-api-python-client -google-auth==1.32.1 + # via + # -r requirements/base.in + # inapppy +google-auth==2.17.2 # via # google-api-core # google-api-python-client # google-auth-httplib2 -googleapis-common-protos==1.53.0 +google-auth-httplib2==0.1.0 + # via google-api-python-client +googleapis-common-protos==1.59.0 # via google-api-core gunicorn==19.7.1 # via -r requirements/production.in httplib2==0.20.2 - # via -r requirements/base.in + # via + # -r requirements/base.in + # google-api-python-client + # google-auth-httplib2 + # oauth2client idna==2.7 # via # -c requirements/constraints.txt # cybersource-rest-client-python # requests -importlib-resources==5.9.0 + # yarl +importlib-resources==5.12.0 # via jsonschema inapppy==2.5.2 # via -r requirements/base.in @@ -315,7 +315,9 @@ jmespath==1.0.1 # botocore jsonfield==3.1.0 # via -r requirements/base.in -jsonschema==4.16.0 +jsonfield2==4.0.0.post0 + # via -r requirements/base.in +jsonschema==4.17.3 # via cybersource-rest-client-python kombu==4.6.11 # via celery @@ -329,23 +331,23 @@ linecache2==1.0.0 # traceback2 logger==1.4 # via cybersource-rest-client-python -lxml==4.9.1 +lxml==4.9.2 # via # premailer # zeep markdown==2.6.9 # via -r requirements/base.in -markupsafe==2.1.1 +markupsafe==2.1.2 # via jinja2 monotonic==1.6 # via analytics-python -multidict==5.1.0 +multidict==6.0.4 # via # aiohttp # yarl mysqlclient==1.4.6 # via -r requirements/base.in -naked==0.1.31 +naked==0.1.32 # via # crypto # cybersource-rest-client-python @@ -362,51 +364,43 @@ nose==1.3.7 # via cybersource-rest-client-python oauth2client==4.1.3 # via inapppy -oauthlib==3.2.1 +oauthlib==3.2.2 # via # getsmarter-api-clients # requests-oauthlib # social-auth-core -openapi-codec==1.3.2 - # via django-rest-swagger -packaging==21.3 - # via - # drf-yasg - # redis -paramiko==2.11.0 +packaging==23.1 + # via drf-yasg +paramiko==3.1.0 # via cybersource-rest-client-python path-py==7.2 # via -r requirements/base.in paypalrestsdk==1.13.1 # via -r requirements/base.in -pbr==5.10.0 +pbr==5.11.1 # via # cybersource-rest-client-python # fixtures # stevedore # testtools -phonenumbers==8.12.55 +phonenumbers==8.13.9 # via django-oscar -pillow==9.2.0 +pillow==9.5.0 # via django-oscar pkgutil-resolve-name==1.3.10 # via jsonschema -platformdirs==2.5.2 +platformdirs==3.2.0 # via zeep premailer==2.9.2 # via -r requirements/base.in -protobuf==3.17.3 +protobuf==4.22.1 # via # google-api-core # googleapis-common-protos -psutil==5.9.2 +psutil==5.9.4 # via edx-django-utils purl==1.6 # via django-oscar -pyasn1-modules==0.2.8 - # via - # google-auth - # oauth2client pyasn1==0.4.8 # via # cybersource-rest-client-python @@ -415,46 +409,51 @@ pyasn1==0.4.8 # pyasn1-modules # rsa # x509 +pyasn1-modules==0.2.8 + # via + # google-auth + # oauth2client pycountry==17.1.8 # via -r requirements/base.in pycparser==2.21 # via # cffi # cybersource-rest-client-python -pycryptodome==3.15.0 +pycryptodome==3.17 # via cybersource-rest-client-python -pycryptodomex==3.15.0 +pycryptodomex==3.17 # via # cybersource-rest-client-python # pyjwkest -pygments==2.13.0 +pygments==2.15.0 # via -r requirements/base.in pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==1.7.1 +pyjwt[crypto]==2.6.0 # via # cybersource-rest-client-python # drf-jwt # edx-auth-backends + # edx-drf-extensions # edx-rest-api-client # social-auth-core -pymongo==3.12.3 +pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via # cybersource-rest-client-python # edx-django-utils # paramiko -pyopenssl==22.0.0 +pyopenssl==23.1.1 # via # cybersource-rest-client-python # ndg-httpsclient # paypalrestsdk pyparsing==3.0.9 - # via packaging + # via httplib2 pypi==2.1 # via cybersource-rest-client-python -pyrsistent==0.18.1 +pyrsistent==0.19.3 # via jsonschema python-dateutil==2.8.2 # via @@ -467,7 +466,7 @@ python-memcached==1.59 # via -r requirements/production.in python-mimeparse==1.6.0 # via cybersource-rest-client-python -python-subunit==1.4.0 +python-subunit==1.4.2 # via cybersource-rest-client-python python-toolbox==1.0.11 # via cybersource-rest-client-python @@ -475,9 +474,8 @@ python3-openid==3.2.0 # via # -r requirements/base.in # social-auth-core -pytz==2016.10 +pytz==2023.3 # via - # -c requirements/constraints.txt # -r requirements/base.in # babel # celery @@ -487,6 +485,7 @@ pytz==2016.10 # django-ses # djangorestframework # djangorestframework-datatables + # drf-yasg # getsmarter-api-clients # zeep pyyaml==6.0 @@ -495,13 +494,13 @@ pyyaml==6.0 # cybersource-rest-client-python # edx-django-release-util # naked -rcssmin==1.1.0 +rcssmin==1.1.1 # via django-compressor -redis==4.3.4 +redis==4.5.4 # via # -r requirements/production.in # edx-ecommerce-worker -requests==2.28.1 +requests==2.28.2 # via # -r requirements/base.in # analytics-python @@ -527,17 +526,19 @@ requests-oauthlib==1.3.1 # via # getsmarter-api-clients # social-auth-core -requests-toolbelt==0.9.1 +requests-toolbelt==0.10.1 # via zeep -rest-condition==1.0.3 - # via edx-drf-extensions -rjsmin==1.2.0 +rjsmin==1.2.1 # via django-compressor rsa==4.9 - # via cybersource-rest-client-python + # via + # cybersource-rest-client-python + # google-auth + # inapppy + # oauth2client ruamel-yaml==0.17.21 # via drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via ruamel-yaml rules==3.3 # via -r requirements/base.in @@ -549,7 +550,7 @@ shellescape==3.8.1 # via # crypto # cybersource-rest-client-python -simplejson==3.17.6 +simplejson==3.19.1 # via -r requirements/base.in six==1.16.0 # via @@ -563,66 +564,55 @@ six==1.16.0 # edx-drf-extensions # edx-ecommerce-worker # edx-rbac - # google-api-core - # google-api-python-client # google-auth # google-auth-httplib2 # isodate # libsass # oauth2client - # paramiko # paypalrestsdk - # protobuf # purl # pyjwkest # python-dateutil # python-memcached # requests-file - # social-auth-app-django - # social-auth-core slumber==0.7.1 # via edx-rest-api-client -social-auth-app-django==4.0.0 +social-auth-app-django==5.2.0 # via - # -c requirements/constraints.txt # -r requirements/base.in # edx-auth-backends -social-auth-core==4.0.2 +social-auth-core==4.4.1 # via - # -c requirements/constraints.txt # edx-auth-backends # social-auth-app-django sorl-thumbnail==12.9.0 # via -r requirements/base.in -sqlparse==0.4.2 +sqlparse==0.4.3 # via django -stevedore==4.0.0 +stevedore==5.0.0 # via # edx-django-utils # edx-opaque-keys -stripe==4.1.0 +stripe==5.4.0 # via -r requirements/base.in -testtools==2.5.0 +testtools==2.6.0 # via # cybersource-rest-client-python # python-subunit traceback2==1.4.0 # via cybersource-rest-client-python -typing-extensions==4.0.1 - # via aiohttp typing==3.7.4.3 # via cybersource-rest-client-python unicodecsv==0.14.1 # via # -r requirements/base.in # djangorestframework-csv -unittest2==1.1.0 - # via testtools uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.12 + # google-api-python-client +urllib3==1.26.15 # via # -c requirements/constraints.txt # botocore @@ -634,23 +624,19 @@ vine==1.3.0 # celery webencodings==0.5.1 # via bleach -wheel==0.37.1 +wheel==0.40.0 # via cybersource-rest-client-python -wrapt==1.13.3 - # via - # -c requirements/constraints.txt - # deprecated x509==0.1 # via cybersource-rest-client-python xss-utils==0.4.0 # via -r requirements/base.in -yarl==1.6.3 +yarl==1.8.2 # via aiohttp -zeep==4.1.0 +zeep==4.2.1 # via -r requirements/base.in -zipp==3.8.1 +zipp==3.15.0 # via importlib-resources -zope-interface==5.4.0 +zope-interface==6.0 # via # cybersource-rest-client-python # datetime diff --git a/requirements/test.txt b/requirements/test.txt index 45bb8b087d5..fe3b065b33b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,20 +1,24 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -aiohttp==3.8.0 +aiohttp==3.8.4 # via # -r requirements/base.txt # inapppy +aiosignal==1.3.1 + # via + # -r requirements/base.txt + # aiohttp amqp==2.6.1 # via # -r requirements/base.txt # kombu -analytics-python==1.4.0 +analytics-python==1.4.post1 # via -r requirements/base.txt -asgiref==3.5.2 +asgiref==3.6.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -28,8 +32,9 @@ astroid==2.9.3 async-timeout==4.0.2 # via # -r requirements/base.txt + # aiohttp # redis -attrs==22.1.0 +attrs==22.2.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -37,7 +42,7 @@ attrs==22.1.0 # jsonschema # pytest # zeep -babel==2.10.3 +babel==2.12.1 # via # -r requirements/base.txt # django-oscar @@ -45,33 +50,29 @@ backoff==1.10.0 # via # -r requirements/base.txt # analytics-python -bcrypt==4.0.0 +bcrypt==4.0.1 # via # -r requirements/base.txt # cybersource-rest-client-python # paramiko -beautifulsoup4==4.11.1 +beautifulsoup4==4.12.2 # via webtest billiard==3.6.4.0 # via # -r requirements/base.txt # celery -bleach==5.0.1 +bleach==6.0.0 # via -r requirements/base.txt bok-choy==1.1.1 # via -r requirements/test.in -boto3==1.24.73 +boto3==1.26.111 # via -r requirements/base.txt -botocore==1.27.73 +botocore==1.29.111 # via # -r requirements/base.txt # boto3 # s3transfer -cached-property==1.5.2 - # via - # -r requirements/base.txt - # zeep -cachetools==4.2.2 +cachetools==5.3.0 # via # -r requirements/base.txt # google-auth @@ -80,7 +81,7 @@ celery==4.4.7 # -c requirements/constraints.txt # -r requirements/base.txt # edx-ecommerce-worker -certifi==2022.9.14 +certifi==2022.12.7 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -93,17 +94,16 @@ cffi==1.15.1 # cryptography # cybersource-rest-client-python # pynacl -chardet==5.0.0 +chardet==5.1.0 # via # -r requirements/base.txt - # -r requirements/e2e.txt - # aiohttp # cybersource-rest-client-python # diff-cover -charset-normalizer==2.1.1 +charset-normalizer==3.1.0 # via # -r requirements/base.txt # -r requirements/e2e.txt + # aiohttp # requests click==8.1.3 # via @@ -123,7 +123,7 @@ coreschema==0.0.4 # -r requirements/base.txt # coreapi # drf-yasg -coverage[toml]==6.4.4 +coverage[toml]==7.2.3 # via # -r requirements/base.txt # -r requirements/test.in @@ -133,7 +133,7 @@ crypto==1.4.1 # via # -r requirements/base.txt # cybersource-rest-client-python -cryptography==38.0.1 +cryptography==40.0.1 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -142,7 +142,7 @@ cryptography==38.0.1 # pyjwt # pyopenssl # social-auth-core -cssselect==1.1.0 +cssselect==1.2.0 # via # -r requirements/base.txt # premailer @@ -154,7 +154,7 @@ cybersource-rest-client-python==0.0.21 # via # -c requirements/constraints.txt # -r requirements/base.txt -datetime==4.7 +datetime==5.1 # via # -r requirements/base.txt # cybersource-rest-client-python @@ -165,11 +165,7 @@ defusedxml==0.7.1 # -r requirements/base.txt # python3-openid # social-auth-core -deprecated==1.2.13 - # via - # -r requirements/base.txt - # redis -diff-cover==6.5.1 +diff-cover==7.5.0 # via -r requirements/test.in # via # -c requirements/common_constraints.txt @@ -178,6 +174,7 @@ diff-cover==6.5.1 # django-appconf # django-config-models # django-cors-headers + # django-crispy-forms # django-crum # django-extensions # django-extra-views @@ -200,21 +197,22 @@ diff-cover==6.5.1 # edx-i18n-tools # edx-rbac # jsonfield - # rest-condition + # jsonfield2 + # social-auth-app-django # xss-utils django-appconf==1.0.5 # via # -r requirements/base.txt # django-compressor -django-compressor==4.1 +django-compressor==4.3.1 # via # -r requirements/base.txt # django-libsass django-config-models==2.3.0 # via -r requirements/base.txt -django-cors-headers==3.13.0 +django-cors-headers==3.14.0 # via -r requirements/base.txt -django-crispy-forms==1.14.0 +django-crispy-forms==2.0 # via -r requirements/base.txt django-crum==0.7.9 # via @@ -228,15 +226,15 @@ django-extra-views==0.13.0 # via # -r requirements/base.txt # django-oscar -django-filter==22.1 +django-filter==23.1 # via -r requirements/base.txt -django-haystack==3.1.1 +django-haystack==3.2.1 # via # -r requirements/base.txt # django-oscar django-libsass==0.9 # via -r requirements/base.txt -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # -r requirements/base.txt # edx-rbac @@ -276,7 +274,7 @@ django-widget-tweaks==1.4.12 # via # -r requirements/base.txt # django-oscar -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.txt # django-config-models @@ -286,7 +284,6 @@ djangorestframework==3.13.1 # drf-jwt # drf-yasg # edx-drf-extensions - # rest-condition djangorestframework-csv==2.1.1 # via -r requirements/base.txt djangorestframework-datatables==0.7.0 @@ -297,15 +294,11 @@ drf-jwt==1.19.2 # via # -r requirements/base.txt # edx-drf-extensions -drf-yasg==1.20.0 - # via - # -c requirements/constraints.txt - # -r requirements/base.txt -edx-auth-backends==3.4.0 - # via - # -c requirements/constraints.txt - # -r requirements/base.txt -edx-braze-client==0.1.4 +drf-yasg==1.21.5 + # via -r requirements/base.txt +edx-auth-backends==4.1.0 + # via -r requirements/base.txt +edx-braze-client==0.1.6 # via # -r requirements/base.txt # edx-ecommerce-worker @@ -313,7 +306,7 @@ edx-django-release-util==1.2.0 # via -r requirements/base.txt edx-django-sites-extensions==4.0.0 # via -r requirements/base.txt -edx-django-utils==5.0.1 +edx-django-utils==5.4.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -321,14 +314,13 @@ edx-django-utils==5.0.1 # edx-drf-extensions # edx-rest-api-client # getsmarter-api-clients -edx-drf-extensions==6.6.0 +edx-drf-extensions==8.5.3 # via - # -c requirements/constraints.txt # -r requirements/base.txt # edx-rbac edx-ecommerce-worker==3.3.2 # via -r requirements/base.txt -edx-i18n-tools==0.9.1 +edx-i18n-tools==0.9.2 # via -r requirements/test.in edx-opaque-keys==2.3.0 # via @@ -350,63 +342,69 @@ extras==1.0.0 # -r requirements/base.txt # cybersource-rest-client-python # python-subunit - # testtools factory-boy==2.12.0 # via # -r requirements/base.txt # -r requirements/test.in # django-oscar -faker==14.2.0 +faker==18.4.0 # via # -r requirements/base.txt # factory-boy -filelock==3.8.0 +filelock==3.11.0 # via # -r requirements/tox.txt # tox -fixtures==3.0.0 +fixtures==4.0.1 # via # -r requirements/base.txt # cybersource-rest-client-python # testtools freezegun==1.2.2 # via -r requirements/test.in +frozenlist==1.3.3 + # via + # -r requirements/base.txt + # aiohttp + # aiosignal funcsigs==1.0.2 # via # -r requirements/base.txt # cybersource-rest-client-python -future==0.18.2 +future==0.18.3 # via # -r requirements/base.txt # pyjwkest getsmarter-api-clients==0.5.0 # via -r requirements/base.txt -google-api-core==1.30.0 +google-api-core==2.11.0 # via # -r requirements/base.txt # google-api-python-client google-api-python-client==2.31.0 - # via -r requirements/base.in -google-auth-httplib2==0.1.0 # via # -r requirements/base.txt - # google-api-python-client -google-auth==1.32.1 + # inapppy +google-auth==2.17.2 # via # -r requirements/base.txt # google-api-core # google-api-python-client # google-auth-httplib2 -googleapis-common-protos==1.53.0 +google-auth-httplib2==0.1.0 + # via + # -r requirements/base.txt + # google-api-python-client +googleapis-common-protos==1.59.0 # via # -r requirements/base.txt # google-api-core httplib2==0.20.2 - # via -r requirements/base.in -httpretty==0.9.7 # via - # -c requirements/pins.txt - # -r requirements/test.in + # -r requirements/base.txt + # google-api-python-client + # google-auth-httplib2 + # oauth2client idna==2.7 # via # -c requirements/constraints.txt @@ -414,21 +412,22 @@ idna==2.7 # -r requirements/e2e.txt # cybersource-rest-client-python # requests -importlib-metadata==4.12.0 + # yarl +importlib-metadata==6.3.0 # via # -r requirements/e2e.txt # pytest-randomly -inapppy==2.5.2 - # via -r requirements/base.txt -importlib-resources==5.9.0 +importlib-resources==5.12.0 # via # -r requirements/base.txt # jsonschema +inapppy==2.5.2 + # via -r requirements/base.txt inflection==0.5.1 # via # -r requirements/base.txt # drf-yasg -iniconfig==1.1.1 +iniconfig==2.0.0 # via # -r requirements/e2e.txt # pytest @@ -440,7 +439,7 @@ isodate==0.6.1 # via # -r requirements/base.txt # zeep -isort==5.10.1 +isort==5.12.0 # via # -r requirements/test.in # pylint @@ -460,7 +459,9 @@ jmespath==1.0.1 # botocore jsonfield==3.1.0 # via -r requirements/base.txt -jsonschema==4.16.0 +jsonfield2==4.0.0.post0 + # via -r requirements/base.txt +jsonschema==4.17.3 # via # -r requirements/base.txt # cybersource-rest-client-python @@ -468,9 +469,9 @@ kombu==4.6.11 # via # -r requirements/base.txt # celery -lazy==1.4 +lazy==1.5 # via bok-choy -lazy-object-proxy==1.7.1 +lazy-object-proxy==1.9.0 # via astroid libsass==0.9.2 # via @@ -485,7 +486,7 @@ logger==1.4 # via # -r requirements/base.txt # cybersource-rest-client-python -lxml==4.9.1 +lxml==4.9.2 # via # -r requirements/base.txt # -r requirements/test.in @@ -493,7 +494,7 @@ lxml==4.9.1 # zeep markdown==2.6.9 # via -r requirements/base.txt -markupsafe==2.1.1 +markupsafe==2.1.2 # via # -r requirements/base.txt # jinja2 @@ -501,31 +502,27 @@ mccabe==0.6.1 # via # -c requirements/constraints.txt # pylint -mock==4.0.3 +mock==5.0.1 # via -r requirements/test.in monotonic==1.6 # via # -r requirements/base.txt # analytics-python -more-itertools==8.8.0 - # via - # -r requirements/e2e.txt - # pytest -multidict==5.1.0 +multidict==6.0.4 # via # -r requirements/base.txt # aiohttp # yarl mysqlclient==1.4.6 # via -r requirements/base.txt -naked==0.1.31 +naked==0.1.32 # via # -r requirements/base.txt # crypto # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/base.txt -newrelic==8.1.0.180 +newrelic==8.8.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -538,37 +535,31 @@ oauth2client==4.1.3 # via # -r requirements/base.txt # inapppy -oauthlib==3.2.1 +oauthlib==3.2.2 # via # -r requirements/base.txt # getsmarter-api-clients # requests-oauthlib # social-auth-core -openapi-codec==1.3.2 - # via - # -r requirements/base.txt - # django-rest-swagger -packaging==21.3 +packaging==23.1 # via # -r requirements/base.txt # -r requirements/e2e.txt # -r requirements/tox.txt # drf-yasg - # google-api-core # pytest - # redis # tox -paramiko==2.11.0 +paramiko==3.1.0 # via # -r requirements/base.txt # cybersource-rest-client-python -path==16.4.0 +path==16.6.0 # via edx-i18n-tools path-py==7.2 # via -r requirements/base.txt paypalrestsdk==1.13.1 # via -r requirements/base.txt -pbr==5.10.0 +pbr==5.11.1 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -576,11 +567,11 @@ pbr==5.10.0 # fixtures # stevedore # testtools -phonenumbers==8.12.55 +phonenumbers==8.13.9 # via # -r requirements/base.txt # django-oscar -pillow==9.2.0 +pillow==9.5.0 # via # -r requirements/base.txt # django-oscar @@ -588,7 +579,7 @@ pkgutil-resolve-name==1.3.10 # via # -r requirements/base.txt # jsonschema -platformdirs==2.5.2 +platformdirs==3.2.0 # via # -r requirements/base.txt # pylint @@ -601,16 +592,16 @@ pluggy==0.13.1 # diff-cover # pytest # tox -polib==1.1.1 +polib==1.2.0 # via edx-i18n-tools premailer==2.9.2 # via -r requirements/base.txt -protobuf==3.17.3 +protobuf==4.22.1 # via # -r requirements/base.txt # google-api-core # googleapis-common-protos -psutil==5.9.2 +psutil==5.9.4 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -624,12 +615,8 @@ py==1.11.0 # -r requirements/e2e.txt # -r requirements/tox.txt # pytest + # pytest-html # tox -pyasn1-modules==0.2.8 - # via - # -r requirements/base.txt - # google-auth - # oauth2client pyasn1==0.4.8 # via # -r requirements/base.txt @@ -639,7 +626,12 @@ pyasn1==0.4.8 # pyasn1-modules # rsa # x509 -pycodestyle==2.9.1 +pyasn1-modules==0.2.8 + # via + # -r requirements/base.txt + # google-auth + # oauth2client +pycodestyle==2.10.0 # via -r requirements/test.in pycountry==17.1.8 # via -r requirements/base.txt @@ -649,16 +641,16 @@ pycparser==2.21 # -r requirements/e2e.txt # cffi # cybersource-rest-client-python -pycryptodome==3.15.0 +pycryptodome==3.17 # via # -r requirements/base.txt # cybersource-rest-client-python -pycryptodomex==3.15.0 +pycryptodomex==3.17 # via # -r requirements/base.txt # cybersource-rest-client-python # pyjwkest -pygments==2.13.0 +pygments==2.15.0 # via # -r requirements/base.txt # diff-cover @@ -666,20 +658,21 @@ pyjwkest==1.4.2 # via # -r requirements/base.txt # edx-drf-extensions -pyjwt[crypto]==1.7.1 +pyjwt[crypto]==2.6.0 # via # -r requirements/base.txt # -r requirements/e2e.txt # cybersource-rest-client-python # drf-jwt # edx-auth-backends + # edx-drf-extensions # edx-rest-api-client # social-auth-core pylint==2.12.2 # via # -c requirements/constraints.txt # -r requirements/test.in -pymongo==3.12.3 +pymongo==3.13.0 # via # -r requirements/base.txt # edx-opaque-keys @@ -690,7 +683,7 @@ pynacl==1.5.0 # cybersource-rest-client-python # edx-django-utils # paramiko -pyopenssl==22.0.0 +pyopenssl==23.1.1 # via # -r requirements/base.txt # cybersource-rest-client-python @@ -699,15 +692,12 @@ pyopenssl==22.0.0 pyparsing==3.0.9 # via # -r requirements/base.txt - # -r requirements/e2e.txt - # -r requirements/tox.txt # httplib2 - # packaging pypi==2.1 # via # -r requirements/base.txt # cybersource-rest-client-python -pyrsistent==0.18.1 +pyrsistent==0.19.3 # via # -r requirements/base.txt # jsonschema @@ -728,22 +718,24 @@ pytest-base-url==1.4.2 # via # -r requirements/e2e.txt # pytest-selenium -pytest-cov==3.0.0 +pytest-cov==4.0.0 # via -r requirements/test.in pytest-django==4.5.2 # via -r requirements/test.in -pytest-html==3.1.1 +pytest-html==3.2.0 # via # -r requirements/e2e.txt # pytest-selenium -pytest-metadata==2.0.2 +pytest-metadata==2.0.4 # via # -r requirements/e2e.txt # pytest-html pytest-randomly==3.12.0 # via -r requirements/e2e.txt pytest-selenium==3.0.0 - # via -r requirements/e2e.txt + # via + # -c requirements/constraints.txt + # -r requirements/e2e.txt pytest-timeout==2.1.0 # via -r requirements/e2e.txt pytest-variables==1.9.0 @@ -758,7 +750,7 @@ python-dateutil==2.8.2 # edx-drf-extensions # faker # freezegun -python-dotenv==0.21.0 +python-dotenv==1.0.0 # via -r requirements/e2e.txt python-memcached==1.59 # via -r requirements/test.in @@ -766,7 +758,7 @@ python-mimeparse==1.6.0 # via # -r requirements/base.txt # cybersource-rest-client-python -python-subunit==1.4.0 +python-subunit==1.4.2 # via # -r requirements/base.txt # cybersource-rest-client-python @@ -778,9 +770,8 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core -pytz==2016.10 +pytz==2023.3 # via - # -c requirements/constraints.txt # -r requirements/base.txt # -r requirements/e2e.txt # babel @@ -790,8 +781,8 @@ pytz==2016.10 # django # djangorestframework # djangorestframework-datatables + # drf-yasg # getsmarter-api-clients - # google-api-core # zeep pyyaml==6.0 # via @@ -800,15 +791,16 @@ pyyaml==6.0 # edx-django-release-util # edx-i18n-tools # naked -rcssmin==1.1.0 + # responses +rcssmin==1.1.1 # via # -r requirements/base.txt # django-compressor -redis==4.3.4 +redis==4.5.4 # via # -r requirements/base.txt # edx-ecommerce-worker -requests==2.28.1 +requests==2.28.2 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -841,17 +833,13 @@ requests-oauthlib==1.3.1 # -r requirements/base.txt # getsmarter-api-clients # social-auth-core -requests-toolbelt==0.9.1 +requests-toolbelt==0.10.1 # via # -r requirements/base.txt # zeep -responses==0.21.0 +responses==0.23.1 # via -r requirements/test.in -rest-condition==1.0.3 - # via - # -r requirements/base.txt - # edx-drf-extensions -rjsmin==1.2.0 +rjsmin==1.2.1 # via # -r requirements/base.txt # django-compressor @@ -866,7 +854,7 @@ ruamel-yaml==0.17.21 # via # -r requirements/base.txt # drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via # -r requirements/base.txt # ruamel-yaml @@ -892,7 +880,7 @@ shellescape==3.8.1 # -r requirements/base.txt # crypto # cybersource-rest-client-python -simplejson==3.17.6 +simplejson==3.19.1 # via -r requirements/base.txt six==1.16.0 # via @@ -910,23 +898,17 @@ six==1.16.0 # edx-drf-extensions # edx-ecommerce-worker # edx-rbac - # google-api-core - # google-api-python-client # google-auth # google-auth-httplib2 # isodate # libsass # oauth2client - # paramiko # paypalrestsdk - # protobuf # purl # pyjwkest # python-dateutil # python-memcached # requests-file - # social-auth-app-django - # social-auth-core # tenacity # tox slumber==0.7.1 @@ -934,41 +916,39 @@ slumber==0.7.1 # -r requirements/base.txt # -r requirements/e2e.txt # edx-rest-api-client -social-auth-app-django==4.0.0 +social-auth-app-django==5.2.0 # via - # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends -social-auth-core==4.0.2 +social-auth-core==4.4.1 # via - # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends # social-auth-app-django sorl-thumbnail==12.9.0 # via -r requirements/base.txt -soupsieve==2.3.2.post1 +soupsieve==2.4 # via beautifulsoup4 -sqlparse==0.4.2 +sqlparse==0.4.3 # via # -r requirements/base.txt # -r requirements/e2e.txt # django -stevedore==4.0.0 +stevedore==5.0.0 # via # -r requirements/base.txt # -r requirements/e2e.txt # edx-django-utils # edx-opaque-keys -stripe==4.1.0 +stripe==5.4.0 # via -r requirements/base.txt tenacity==6.3.1 # via # -r requirements/e2e.txt # pytest-selenium -testfixtures==7.0.0 +testfixtures==7.1.0 # via -r requirements/test.in -testtools==2.5.0 +testtools==2.6.0 # via # -r requirements/base.txt # cybersource-rest-client-python @@ -979,12 +959,12 @@ toml==0.10.2 # -r requirements/tox.txt # pylint # pytest - # pytest-cov # tox tomli==2.0.1 # via coverage tox==3.14.6 # via + # -c requirements/common_constraints.txt # -c requirements/constraints.txt # -r requirements/tox.txt # tox-battery @@ -994,13 +974,13 @@ traceback2==1.4.0 # via # -r requirements/base.txt # cybersource-rest-client-python - # testtools - # unittest2 +types-pyyaml==6.0.12.9 + # via responses typing==3.7.4.3 # via # -r requirements/base.txt # cybersource-rest-client-python -typing-extensions==4.3.0 +typing-extensions==4.5.0 # via # astroid # pylint @@ -1013,7 +993,8 @@ uritemplate==4.1.1 # -r requirements/base.txt # coreapi # drf-yasg -urllib3==1.26.12 + # google-api-python-client +urllib3==1.26.15 # via # -c requirements/constraints.txt # -r requirements/base.txt @@ -1043,35 +1024,33 @@ webob==1.8.7 # via webtest webtest==3.0.0 # via django-webtest -wheel==0.37.1 +wheel==0.40.0 # via # -r requirements/base.txt # cybersource-rest-client-python wrapt==1.13.3 # via # -c requirements/constraints.txt - # -r requirements/base.txt # astroid - # deprecated x509==0.1 # via # -r requirements/base.txt # cybersource-rest-client-python xss-utils==0.4.0 # via -r requirements/base.txt -yarl==1.6.3 +yarl==1.8.2 # via # -r requirements/base.txt # aiohttp -zeep==4.1.0 +zeep==4.2.1 # via -r requirements/base.txt -zipp==3.8.1 +zipp==3.15.0 # via # -r requirements/base.txt # -r requirements/e2e.txt # importlib-metadata # importlib-resources -zope-interface==5.4.0 +zope-interface==6.0 # via # -r requirements/base.txt # cybersource-rest-client-python diff --git a/requirements/tox.txt b/requirements/tox.txt index e8729ae64a4..fb45f35e590 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -1,12 +1,12 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # make upgrade # -filelock==3.10.3 +filelock==3.11.0 # via tox -packaging==23.0 +packaging==23.1 # via tox pluggy==0.13.1 # via From 699a59f7c964c75fe5652865f0ee68712f244978 Mon Sep 17 00:00:00 2001 From: Robert Raposa Date: Wed, 12 Apr 2023 14:31:59 -0400 Subject: [PATCH 3/4] fix: handle major upgrade of django-crispy-forms The major upgrade of django-crispy-forms called for some changes related to bootstrap3 and dependencies. See https://github.com/django-crispy-forms/django-crispy-forms/blob/main/CHANGELOG.md#major-changes-and-migration-guide --- ecommerce/settings/base.py | 2 ++ requirements/base.in | 1 + requirements/base.txt | 7 ++++++- requirements/dev.txt | 7 ++++++- requirements/production.txt | 7 ++++++- requirements/test.txt | 7 ++++++- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ecommerce/settings/base.py b/ecommerce/settings/base.py index e4dabcdb76a..fb0416ce77f 100644 --- a/ecommerce/settings/base.py +++ b/ecommerce/settings/base.py @@ -310,6 +310,7 @@ 'django_filters', 'release_util', 'crispy_forms', + 'crispy_bootstrap3', 'solo', 'social_django', 'drf_yasg', @@ -663,6 +664,7 @@ # Affiliate cookie key AFFILIATE_COOKIE_KEY = 'affiliate_id' +CRISPY_ALLOWED_TEMPLATE_PACKS = 'bootstrap3' CRISPY_TEMPLATE_PACK = 'bootstrap3' # ENTERPRISE CONFIGURATION diff --git a/requirements/base.in b/requirements/base.in index 7eefe874a30..1fc6eebc7f6 100755 --- a/requirements/base.in +++ b/requirements/base.in @@ -4,6 +4,7 @@ analytics-python bleach boto3>=1.17.80 coreapi +crispy-bootstrap3 cybersource-rest-client-python django>=3.2,<4.0 django-compressor diff --git a/requirements/base.txt b/requirements/base.txt index 6cb4e079580..59a22f1d8ac 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -78,6 +78,8 @@ coreschema==0.0.4 # drf-yasg coverage==7.2.3 # via cybersource-rest-client-python +crispy-bootstrap3==2022.1 + # via -r requirements/base.in crypto==1.4.1 # via cybersource-rest-client-python cryptography==40.0.1 @@ -105,6 +107,7 @@ django==3.2.18 # via # -c requirements/common_constraints.txt # -r requirements/base.in + # crispy-bootstrap3 # django-appconf # django-config-models # django-cors-headers @@ -144,7 +147,9 @@ django-config-models==2.3.0 django-cors-headers==3.14.0 # via -r requirements/base.in django-crispy-forms==2.0 - # via -r requirements/base.in + # via + # -r requirements/base.in + # crispy-bootstrap3 django-crum==0.7.9 # via # edx-django-utils diff --git a/requirements/dev.txt b/requirements/dev.txt index c7f3d78c3a9..c94d75abe6b 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -140,6 +140,8 @@ coverage[toml]==7.2.3 # -r requirements/test.txt # cybersource-rest-client-python # pytest-cov +crispy-bootstrap3==2022.1 + # via -r requirements/test.txt crypto==1.4.1 # via # -r requirements/test.txt @@ -178,6 +180,7 @@ diff-cover==7.5.0 django==3.2.18 # via # -r requirements/test.txt + # crispy-bootstrap3 # django-appconf # django-config-models # django-cors-headers @@ -221,7 +224,9 @@ django-config-models==2.3.0 django-cors-headers==3.14.0 # via -r requirements/test.txt django-crispy-forms==2.0 - # via -r requirements/test.txt + # via + # -r requirements/test.txt + # crispy-bootstrap3 django-crum==0.7.9 # via # -r requirements/test.txt diff --git a/requirements/production.txt b/requirements/production.txt index 4b7870bf333..a0c7d6e08bb 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -80,6 +80,8 @@ coreschema==0.0.4 # drf-yasg coverage==7.2.3 # via cybersource-rest-client-python +crispy-bootstrap3==2022.1 + # via -r requirements/base.in crypto==1.4.1 # via cybersource-rest-client-python cryptography==40.0.1 @@ -107,6 +109,7 @@ django==3.2.18 # via # -c requirements/common_constraints.txt # -r requirements/base.in + # crispy-bootstrap3 # django-appconf # django-config-models # django-cors-headers @@ -147,7 +150,9 @@ django-config-models==2.3.0 django-cors-headers==3.14.0 # via -r requirements/base.in django-crispy-forms==2.0 - # via -r requirements/base.in + # via + # -r requirements/base.in + # crispy-bootstrap3 django-crum==0.7.9 # via # edx-django-utils diff --git a/requirements/test.txt b/requirements/test.txt index fe3b065b33b..4ab2a8445f7 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -129,6 +129,8 @@ coverage[toml]==7.2.3 # -r requirements/test.in # cybersource-rest-client-python # pytest-cov +crispy-bootstrap3==2022.1 + # via -r requirements/base.txt crypto==1.4.1 # via # -r requirements/base.txt @@ -171,6 +173,7 @@ diff-cover==7.5.0 # -c requirements/common_constraints.txt # -r requirements/base.txt # -r requirements/e2e.txt + # crispy-bootstrap3 # django-appconf # django-config-models # django-cors-headers @@ -213,7 +216,9 @@ django-config-models==2.3.0 django-cors-headers==3.14.0 # via -r requirements/base.txt django-crispy-forms==2.0 - # via -r requirements/base.txt + # via + # -r requirements/base.txt + # crispy-bootstrap3 django-crum==0.7.9 # via # -r requirements/base.txt From 099ef7e606ba8aa71f89cdbce5da5f1154081a74 Mon Sep 17 00:00:00 2001 From: Robert Raposa Date: Wed, 12 Apr 2023 21:07:29 -0400 Subject: [PATCH 4/4] fix: code coverage reporting Codecov no longer exists on PyPI, so switch to github action to run coverage report. --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bbe9592de38..4d11de37d26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,9 +52,10 @@ jobs: architecture: x64 - name: Report coverage if: matrix.testname == 'test-python' - run: | - pip install codecov - codecov + uses: codecov/codecov-action@v3 + with: + flags: unittests + fail_ci_if_error: false docs: runs-on: ubuntu-latest