diff --git a/ecommerce/core/tests/test_models.py b/ecommerce/core/tests/test_models.py index 4dfe176199f..b4fcf286fcc 100644 --- a/ecommerce/core/tests/test_models.py +++ b/ecommerce/core/tests/test_models.py @@ -1,6 +1,7 @@ import json +import sys import ddt import mock @@ -177,7 +178,10 @@ def test_user_details_uses_jwt(self): # Verify the headers passed to the API were correct. expected = {'Authorization': 'JWT {}'.format(token), } - self.assertDictContainsSubset(expected, last_request.headers) + if sys.version_info > (3, 9): + self.assertLessEqual(expected.items(), last_request.headers.items()) + else: + self.assertDictContainsSubset(expected, last_request.headers) def test_no_user_details(self): """ Verify False is returned when there is a connection error. """ diff --git a/ecommerce/credit/tests/test_views.py b/ecommerce/credit/tests/test_views.py index 40f1eac27ec..f34e0a85dd5 100644 --- a/ecommerce/credit/tests/test_views.py +++ b/ecommerce/credit/tests/test_views.py @@ -2,7 +2,7 @@ Tests for the checkout page. """ - +import sys from datetime import timedelta import ddt @@ -130,7 +130,18 @@ def _assert_success_checkout_page(self, sku=None): response = self.client.get(self.path) self.assertEqual(response.status_code, 200) - self.assertDictContainsSubset({'course': self.course}, response.context) + if sys.version_info > (3, 9): + context = {} + for i, ctx in enumerate(response.context): + if isinstance(ctx, dict): + context.update(ctx) + elif hasattr(ctx, '__iter__') and not isinstance(ctx, str): + for item in ctx: + if isinstance(item, dict): + context.update(item) + self.assertLessEqual({'course': self.course}.items(), context.items()) + else: + self.assertDictContainsSubset({'course': self.course}, response.context) self.assertContains( response, diff --git a/ecommerce/enterprise/tests/test_utils.py b/ecommerce/enterprise/tests/test_utils.py index 1e10d88b313..ccae48c4b30 100644 --- a/ecommerce/enterprise/tests/test_utils.py +++ b/ecommerce/enterprise/tests/test_utils.py @@ -1,5 +1,6 @@ +import sys import uuid import ddt @@ -122,7 +123,10 @@ def test_post_enterprise_customer_user(self, mock_helpers, expected_return): self.learner.username ) - self.assertDictContainsSubset(expected_return, response) + if sys.version_info > (3, 9): + self.assertLessEqual(expected_return.items(), response.items()) + else: + self.assertDictContainsSubset(expected_return, response) @responses.activate def test_ecu_needs_consent(self): diff --git a/ecommerce/extensions/basket/migrations/0018_line_tax_code.py b/ecommerce/extensions/basket/migrations/0018_line_tax_code.py deleted file mode 100644 index 914ac028892..00000000000 --- a/ecommerce/extensions/basket/migrations/0018_line_tax_code.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.25 on 2024-05-28 07:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('basket', '0017_alter_lineattribute_value'), - ] - - operations = [ - migrations.AddField( - model_name='line', - name='tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), - ), - ] diff --git a/ecommerce/extensions/catalogue/migrations/0058_auto_20240528_0754.py b/ecommerce/extensions/catalogue/migrations/0058_auto_20240528_0754.py deleted file mode 100644 index b671354b457..00000000000 --- a/ecommerce/extensions/catalogue/migrations/0058_auto_20240528_0754.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 3.2.25 on 2024-05-28 07:54 - -from django.db import migrations -import oscar.models.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('catalogue', '0057_auto_20231205_1034'), - ] - - operations = [ - migrations.AddField( - model_name='attributeoption', - name='code', - field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Unique identifier'), - ), - migrations.AddField( - model_name='attributeoptiongroup', - name='code', - field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Unique identifier'), - ), - migrations.AddField( - model_name='category', - name='code', - field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Code'), - ), - migrations.AddField( - model_name='historicalcategory', - name='code', - field=oscar.models.fields.NullCharField(db_index=True, max_length=255, verbose_name='Code'), - ), - migrations.AddField( - model_name='productimage', - name='code', - field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Code'), - ), - ] diff --git a/ecommerce/extensions/checkout/tests/test_views.py b/ecommerce/extensions/checkout/tests/test_views.py index 79c120eb74b..311c9dbfa9a 100644 --- a/ecommerce/extensions/checkout/tests/test_views.py +++ b/ecommerce/extensions/checkout/tests/test_views.py @@ -1,5 +1,6 @@ +import sys from decimal import Decimal from urllib import parse @@ -338,7 +339,10 @@ def test_get_receipt_for_existing_order(self, mock_learner_data): } self.assertEqual(response.status_code, 200) - self.assertDictContainsSubset(context_data, response.context_data) + if sys.version_info > (3, 9): + self.assertEqual(response.context_data, response.context_data | context_data) + else: + self.assertDictContainsSubset(context_data, response.context_data) @patch('ecommerce.extensions.checkout.views.fetch_enterprise_learner_data') @responses.activate @@ -371,7 +375,10 @@ def test_get_receipt_for_existing_entitlement_order(self, mock_learner_data): } self.assertEqual(response.status_code, 200) - self.assertDictContainsSubset(context_data, response.context_data) + if sys.version_info > (3, 9): + self.assertEqual(response.context_data, response.context_data | context_data) + else: + self.assertDictContainsSubset(context_data, response.context_data) @patch('ecommerce.extensions.checkout.views.fetch_enterprise_learner_data') @responses.activate @@ -387,7 +394,10 @@ def test_get_receipt_for_existing_order_as_staff_user(self, mock_learner_data): } self.assertEqual(response.status_code, 200) - self.assertDictContainsSubset(context_data, response.context_data) + if sys.version_info > (3, 9): + self.assertEqual(response.context_data, response.context_data | context_data) + else: + self.assertDictContainsSubset(context_data, response.context_data) @patch('ecommerce.extensions.checkout.views.fetch_enterprise_learner_data') @responses.activate @@ -400,7 +410,10 @@ def test_get_receipt_for_existing_order_user_not_owner(self, mock_learner_data): context_data = {'order_history_url': self.site.siteconfiguration.build_lms_url('account/settings')} self.assertEqual(response.status_code, 404) - self.assertDictContainsSubset(context_data, response.context_data) + if sys.version_info > (3, 9): + self.assertEqual(response.context_data, response.context_data | context_data) + else: + self.assertDictContainsSubset(context_data, response.context_data) @patch('ecommerce.extensions.checkout.views.fetch_enterprise_learner_data') @responses.activate @@ -456,7 +469,10 @@ def test_dashboard_link_for_course_purchase(self, mock_learner_data): } self.assertEqual(response.status_code, 200) - self.assertDictContainsSubset(context_data, response.context_data) + if sys.version_info > (3, 9): + self.assertEqual(response.context_data, response.context_data | context_data) + else: + self.assertDictContainsSubset(context_data, response.context_data) @patch('ecommerce.extensions.checkout.views.fetch_enterprise_learner_data') @responses.activate @@ -482,7 +498,10 @@ def test_dashboard_link_for_bundle_purchase(self, mock_learner_data): } self.assertEqual(response.status_code, 200) - self.assertDictContainsSubset(context_data, response.context_data) + if sys.version_info > (3, 9): + self.assertEqual(response.context_data, response.context_data | context_data) + else: + self.assertDictContainsSubset(context_data, response.context_data) @patch('ecommerce.extensions.checkout.views.fetch_enterprise_learner_data') @responses.activate diff --git a/ecommerce/extensions/fulfillment/tests/test_modules.py b/ecommerce/extensions/fulfillment/tests/test_modules.py index 0ee1d7b2fc9..880dcd077f3 100644 --- a/ecommerce/extensions/fulfillment/tests/test_modules.py +++ b/ecommerce/extensions/fulfillment/tests/test_modules.py @@ -3,6 +3,7 @@ import datetime import json +import sys import uuid from decimal import Decimal from urllib.parse import urlencode @@ -212,7 +213,10 @@ def test_enrollment_module_fulfill(self): 'X-Forwarded-For': self.user.tracking_context['lms_ip'], } - self.assertDictContainsSubset(expected_headers, actual_headers) + if sys.version_info > (3, 9): + self.assertLessEqual(expected_headers.items(), actual_headers.items()) + else: + self.assertDictContainsSubset(expected_headers, actual_headers) self.assertEqual(expected_body, actual_body) @responses.activate @@ -377,7 +381,7 @@ def test_revoke_product(self): 'X-Forwarded-For': self.user.tracking_context['lms_ip'], } - self.assertDictContainsSubset(expected_headers, actual_headers) + assert expected_headers.items() <= actual_headers.items() self.assertEqual(expected_body, actual_body) @responses.activate diff --git a/ecommerce/extensions/offer/migrations/0056_auto_20240528_0754.py b/ecommerce/extensions/offer/migrations/0056_auto_20240528_0754.py deleted file mode 100644 index 622374420bd..00000000000 --- a/ecommerce/extensions/offer/migrations/0056_auto_20240528_0754.py +++ /dev/null @@ -1,51 +0,0 @@ -# Generated by Django 3.2.25 on 2024-05-28 07:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('offer', '0055_auto_20231108_1355'), - ] - - operations = [ - migrations.CreateModel( - name='FixedUnitDiscountBenefit', - fields=[ - ], - options={ - 'verbose_name': 'Fixed unit discount benefit', - 'verbose_name_plural': 'Fixed unit discount benefits', - 'proxy': True, - 'indexes': [], - 'constraints': [], - }, - bases=('offer.absolutediscountbenefit',), - ), - migrations.AddField( - model_name='rangeproductfileupload', - name='upload_type', - field=models.CharField(choices=[('included', 'Included products upload'), ('excluded', 'Excluded products upload')], default='included', max_length=8), - ), - migrations.AlterField( - model_name='benefit', - name='type', - field=models.CharField(blank=True, choices=[('Percentage', "Discount is a percentage off of the product's value"), ('Absolute', "Discount is a fixed amount off of the basket's total"), ('Fixed', "Discount is a fixed amount off of the product's value"), ('Multibuy', 'Discount is to give the cheapest product for free'), ('Fixed price', 'Get the products that meet the condition for a fixed price'), ('Shipping absolute', 'Discount is a fixed amount of the shipping cost'), ('Shipping fixed price', 'Get shipping for a fixed price'), ('Shipping percentage', 'Discount is a percentage off of the shipping cost')], max_length=128, verbose_name='Type'), - ), - migrations.AlterField( - model_name='historicalbenefit', - name='type', - field=models.CharField(blank=True, choices=[('Percentage', "Discount is a percentage off of the product's value"), ('Absolute', "Discount is a fixed amount off of the basket's total"), ('Fixed', "Discount is a fixed amount off of the product's value"), ('Multibuy', 'Discount is to give the cheapest product for free'), ('Fixed price', 'Get the products that meet the condition for a fixed price'), ('Shipping absolute', 'Discount is a fixed amount of the shipping cost'), ('Shipping fixed price', 'Get shipping for a fixed price'), ('Shipping percentage', 'Discount is a percentage off of the shipping cost')], max_length=128, verbose_name='Type'), - ), - migrations.AlterField( - model_name='historicalrange', - name='description', - field=models.TextField(blank=True, verbose_name='Description'), - ), - migrations.AlterField( - model_name='range', - name='description', - field=models.TextField(blank=True, verbose_name='Description'), - ), - ] diff --git a/ecommerce/extensions/order/migrations/0029_auto_20240528_0754.py b/ecommerce/extensions/order/migrations/0029_auto_20240528_0754.py deleted file mode 100644 index 1eec0476ee7..00000000000 --- a/ecommerce/extensions/order/migrations/0029_auto_20240528_0754.py +++ /dev/null @@ -1,64 +0,0 @@ -# Generated by Django 3.2.25 on 2024-05-28 07:54 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('order', '0028_alter_lineattribute_value'), - ] - - operations = [ - migrations.AlterModelOptions( - name='surcharge', - options={'ordering': ['pk'], 'verbose_name': 'Surcharge', 'verbose_name_plural': 'Surcharges'}, - ), - migrations.AddField( - model_name='historicalline', - name='tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), - ), - migrations.AddField( - model_name='historicalorder', - name='shipping_tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Shipping VAT rate code'), - ), - migrations.AddField( - model_name='line', - name='tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), - ), - migrations.AddField( - model_name='lineprice', - name='tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), - ), - migrations.AddField( - model_name='order', - name='shipping_tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Shipping VAT rate code'), - ), - migrations.AddField( - model_name='surcharge', - name='tax_code', - field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), - ), - migrations.CreateModel( - name='OrderLineDiscount', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_incl_tax', models.BooleanField()), - ('amount', models.DecimalField(decimal_places=2, default=0, max_digits=12, verbose_name='Line discount (excl. tax)')), - ('line', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='discounts', to='order.line', verbose_name='Line')), - ('order_discount', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='discount_lines', to='order.orderdiscount', verbose_name='Order discount')), - ], - options={ - 'verbose_name': 'Order line discount', - 'verbose_name_plural': 'Order line discounts', - 'ordering': ['pk'], - 'abstract': False, - }, - ), - ] diff --git a/ecommerce/extensions/payment/tests/processors/test_cybersource.py b/ecommerce/extensions/payment/tests/processors/test_cybersource.py index 6f7ea73f46b..fbdac1c3d9f 100644 --- a/ecommerce/extensions/payment/tests/processors/test_cybersource.py +++ b/ecommerce/extensions/payment/tests/processors/test_cybersource.py @@ -3,6 +3,7 @@ import json +import sys from decimal import Decimal from unittest import SkipTest @@ -49,7 +50,10 @@ def assert_processor_response_recorded(self, processor_name, transaction_id, res expected = { 'requestID': transaction_id, } - self.assertDictContainsSubset(expected, ppr.response) + if sys.version_info > (3, 9): + self.assertLessEqual(expected.items(), ppr.response.items()) + else: + self.assertDictContainsSubset(expected, ppr.response) self.assertEqual(ppr.basket, basket) return ppr.id diff --git a/ecommerce/extensions/voucher/tests/test_utils.py b/ecommerce/extensions/voucher/tests/test_utils.py index a96539e675f..e59dfa87339 100644 --- a/ecommerce/extensions/voucher/tests/test_utils.py +++ b/ecommerce/extensions/voucher/tests/test_utils.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- +import sys import uuid import ddt @@ -523,7 +524,10 @@ def test_generate_coupon_report_with_deleted_product(self): __, rows = generate_coupon_report([query_coupon.attr.coupon_vouchers]) self.assert_report_first_row(rows[0], query_coupon, first_voucher) - self.assertDictContainsSubset({'Redeemed For Course ID': 'Unknown'}, rows[2]) + if sys.version_info > (3, 9): + self.assertLessEqual({'Redeemed For Course ID': 'Unknown'}.items(), rows[2].items()) + else: + self.assertDictContainsSubset({'Redeemed For Course ID': 'Unknown'}, rows[2]) def test_report_for_inactive_coupons(self): """ Verify the coupon report show correct status for inactive coupons. """ diff --git a/requirements/base.txt b/requirements/base.txt index 8290ef0700f..4f1435dd396 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -53,9 +53,9 @@ billiard==4.2.0 # via celery bleach==6.1.0 # via -r requirements/base.in -boto3==1.34.111 +boto3==1.34.115 # via -r requirements/base.in -botocore==1.34.111 +botocore==1.34.115 # via # boto3 # s3transfer @@ -105,7 +105,7 @@ coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -coverage==7.5.1 +coverage==7.5.3 # via cybersource-rest-client-python crispy-bootstrap3==2024.1 # via -r requirements/base.in @@ -199,7 +199,7 @@ django-libsass==0.9 # via -r requirements/base.in django-model-utils==4.5.1 # via edx-rbac -django-oscar==3.2.4 +django-oscar==3.2 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -287,7 +287,7 @@ extras==1.0.0 # via cybersource-rest-client-python factory-boy==3.2.1 # via django-oscar -faker==25.2.0 +faker==25.3.0 # via factory-boy fixtures==4.1.0 # via cybersource-rest-client-python @@ -406,7 +406,7 @@ needle==0.5.0 # via # -c requirements/constraints.txt # -r requirements/base.in -newrelic==9.9.1 +newrelic==9.10.0 # via # -r requirements/base.in # edx-django-utils @@ -452,7 +452,7 @@ platformdirs==4.2.2 # zeep premailer==2.9.2 # via -r requirements/base.in -prompt-toolkit==3.0.43 +prompt-toolkit==3.0.45 # via click-repl proto-plus==1.23.0 # via google-api-core @@ -667,7 +667,7 @@ stevedore==5.2.0 # code-annotations # edx-django-utils # edx-opaque-keys -stripe==9.7.0 +stripe==9.8.0 # via -r requirements/base.in testtools==2.7.1 # via @@ -683,7 +683,7 @@ traceback2==1.4.0 # via cybersource-rest-client-python typing==3.7.4.3 # via cybersource-rest-client-python -typing-extensions==4.11.0 +typing-extensions==4.12.0 # via # asgiref # astroid @@ -728,11 +728,11 @@ yarl==1.9.4 # via aiohttp zeep==4.2.1 # via -r requirements/base.in -zipp==3.18.2 +zipp==3.19.0 # via # importlib-metadata # importlib-resources -zope-interface==6.4.post1 +zope-interface==6.4.post2 # via # cybersource-rest-client-python # datetime diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 1e560deead6..69ef8600885 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -15,7 +15,7 @@ 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==3.2.4 +django-oscar==3.2 # Pinned because transifex-client==0.13.6 pins it urllib3>=1.24.2,<2.0.0 diff --git a/requirements/dev.txt b/requirements/dev.txt index 6c45e70ff5f..0f861f45694 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -90,9 +90,9 @@ billiard==4.2.0 # celery bleach==6.1.0 # via -r requirements/test.txt -boto3==1.34.111 +boto3==1.34.115 # via -r requirements/test.txt -botocore==1.34.111 +botocore==1.34.115 # via # -r requirements/test.txt # boto3 @@ -169,7 +169,7 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage[toml]==7.5.1 +coverage[toml]==7.5.3 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -296,7 +296,7 @@ django-model-utils==4.5.1 # via # -r requirements/test.txt # edx-rbac -django-oscar==3.2.4 +django-oscar==3.2 # via -r requirements/test.txt django-phonenumber-field==6.4.0 # via @@ -409,7 +409,7 @@ factory-boy==3.2.1 # via # -r requirements/test.txt # django-oscar -faker==25.2.0 +faker==25.3.0 # via # -r requirements/test.txt # factory-boy @@ -606,7 +606,7 @@ needle==0.5.0 # via # -r requirements/dev.in # -r requirements/test.txt -newrelic==9.9.1 +newrelic==9.10.0 # via # -r requirements/test.txt # edx-django-utils @@ -686,7 +686,7 @@ polib==1.2.0 # edx-i18n-tools premailer==2.9.2 # via -r requirements/test.txt -prompt-toolkit==3.0.43 +prompt-toolkit==3.0.45 # via # -r requirements/test.txt # click-repl @@ -1090,7 +1090,7 @@ stevedore==5.2.0 # code-annotations # edx-django-utils # edx-opaque-keys -stripe==9.7.0 +stripe==9.8.0 # via -r requirements/test.txt tenacity==6.3.1 # via @@ -1137,7 +1137,7 @@ typing==3.7.4.3 # via # -r requirements/test.txt # cybersource-rest-client-python -typing-extensions==4.11.0 +typing-extensions==4.12.0 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -1217,13 +1217,13 @@ yarl==1.9.4 # aiohttp zeep==4.2.1 # via -r requirements/test.txt -zipp==3.18.2 +zipp==3.19.0 # via # -r requirements/docs.txt # -r requirements/test.txt # importlib-metadata # importlib-resources -zope-interface==6.4.post1 +zope-interface==6.4.post2 # via # -r requirements/test.txt # cybersource-rest-client-python diff --git a/requirements/docs.txt b/requirements/docs.txt index 1acc36c0730..a0bba9e36d7 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -76,11 +76,11 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -typing-extensions==4.11.0 +typing-extensions==4.12.0 # via pydata-sphinx-theme urllib3==1.26.18 # via # -c requirements/constraints.txt # requests -zipp==3.18.2 +zipp==3.19.0 # via importlib-metadata diff --git a/requirements/e2e.txt b/requirements/e2e.txt index 7c6fb130fe4..115c342830d 100644 --- a/requirements/e2e.txt +++ b/requirements/e2e.txt @@ -64,7 +64,7 @@ importlib-metadata==7.1.0 # pytest-randomly iniconfig==2.0.0 # via pytest -newrelic==9.9.1 +newrelic==9.10.0 # via # -c requirements/base.txt # edx-django-utils @@ -176,7 +176,7 @@ tenacity==6.3.1 # via pytest-selenium toml==0.10.2 # via pytest -typing-extensions==4.11.0 +typing-extensions==4.12.0 # via # -c requirements/base.txt # asgiref @@ -186,7 +186,7 @@ urllib3==1.26.18 # -c requirements/constraints.txt # requests # selenium -zipp==3.18.2 +zipp==3.19.0 # via # -c requirements/base.txt # importlib-metadata diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 0ae0a48cd90..68847b8975d 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -24,7 +24,7 @@ tomli==2.0.1 # pip-tools wheel==0.43.0 # via pip-tools -zipp==3.18.2 +zipp==3.19.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/production.txt b/requirements/production.txt index 8ee56f70df8..5bc6a72f5f2 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -53,11 +53,11 @@ billiard==4.2.0 # via celery bleach==6.1.0 # via -r requirements/base.in -boto3==1.34.111 +boto3==1.34.115 # via # -r requirements/base.in # django-ses -botocore==1.34.111 +botocore==1.34.115 # via # boto3 # s3transfer @@ -107,7 +107,7 @@ coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -coverage==7.5.1 +coverage==7.5.3 # via cybersource-rest-client-python crispy-bootstrap3==2024.1 # via -r requirements/base.in @@ -202,7 +202,7 @@ django-libsass==0.9 # via -r requirements/base.in django-model-utils==4.5.1 # via edx-rbac -django-oscar==3.2.4 +django-oscar==3.2 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -293,7 +293,7 @@ extras==1.0.0 # via cybersource-rest-client-python factory-boy==3.2.1 # via django-oscar -faker==25.2.0 +faker==25.3.0 # via factory-boy fixtures==4.1.0 # via cybersource-rest-client-python @@ -415,7 +415,7 @@ needle==0.5.0 # -c requirements/constraints.txt # -r requirements/base.in # -r requirements/production.in -newrelic==9.9.1 +newrelic==9.10.0 # via # -r requirements/base.in # -r requirements/production.in @@ -464,7 +464,7 @@ platformdirs==4.2.2 # zeep premailer==2.9.2 # via -r requirements/base.in -prompt-toolkit==3.0.43 +prompt-toolkit==3.0.45 # via click-repl proto-plus==1.23.0 # via google-api-core @@ -686,7 +686,7 @@ stevedore==5.2.0 # code-annotations # edx-django-utils # edx-opaque-keys -stripe==9.7.0 +stripe==9.8.0 # via -r requirements/base.in testtools==2.7.1 # via @@ -702,7 +702,7 @@ traceback2==1.4.0 # via cybersource-rest-client-python typing==3.7.4.3 # via cybersource-rest-client-python -typing-extensions==4.11.0 +typing-extensions==4.12.0 # via # asgiref # astroid @@ -747,11 +747,11 @@ yarl==1.9.4 # via aiohttp zeep==4.2.1 # via -r requirements/base.in -zipp==3.18.2 +zipp==3.19.0 # via # importlib-metadata # importlib-resources -zope-interface==6.4.post1 +zope-interface==6.4.post2 # via # cybersource-rest-client-python # datetime diff --git a/requirements/test.txt b/requirements/test.txt index 007ac44deb7..01769d0fa6d 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -79,9 +79,9 @@ billiard==4.2.0 # celery bleach==6.1.0 # via -r requirements/base.txt -boto3==1.34.111 +boto3==1.34.115 # via -r requirements/base.txt -botocore==1.34.111 +botocore==1.34.115 # via # -r requirements/base.txt # boto3 @@ -161,7 +161,7 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -coverage[toml]==7.5.1 +coverage[toml]==7.5.3 # via # -r requirements/base.txt # -r requirements/test.in @@ -290,7 +290,7 @@ django-model-utils==4.5.1 # via # -r requirements/base.txt # edx-rbac -django-oscar==3.2.4 +django-oscar==3.2 # via # -c requirements/constraints.txt # -r requirements/base.txt @@ -407,7 +407,7 @@ factory-boy==3.2.1 # -r requirements/base.txt # -r requirements/test.in # django-oscar -faker==25.2.0 +faker==25.3.0 # via # -r requirements/base.txt # factory-boy @@ -601,7 +601,7 @@ needle==0.5.0 # via # -c requirements/constraints.txt # -r requirements/base.txt -newrelic==9.9.1 +newrelic==9.10.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -681,7 +681,7 @@ polib==1.2.0 # via edx-i18n-tools premailer==2.9.2 # via -r requirements/base.txt -prompt-toolkit==3.0.43 +prompt-toolkit==3.0.45 # via # -r requirements/base.txt # click-repl @@ -1054,7 +1054,7 @@ stevedore==5.2.0 # code-annotations # edx-django-utils # edx-opaque-keys -stripe==9.7.0 +stripe==9.8.0 # via -r requirements/base.txt tenacity==6.3.1 # via @@ -1101,7 +1101,7 @@ typing==3.7.4.3 # via # -r requirements/base.txt # cybersource-rest-client-python -typing-extensions==4.11.0 +typing-extensions==4.12.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -1175,13 +1175,13 @@ yarl==1.9.4 # aiohttp zeep==4.2.1 # via -r requirements/base.txt -zipp==3.18.2 +zipp==3.19.0 # via # -r requirements/base.txt # -r requirements/e2e.txt # importlib-metadata # importlib-resources -zope-interface==6.4.post1 +zope-interface==6.4.post2 # via # -r requirements/base.txt # cybersource-rest-client-python