diff --git a/.github/workflows/pycon-backend-checks.yml b/.github/workflows/pycon-backend-checks.yml index 48648296c2..8c2c162352 100644 --- a/.github/workflows/pycon-backend-checks.yml +++ b/.github/workflows/pycon-backend-checks.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: - python-version: "3.9.15" + python-version: "3.11.6" - run: pip install poetry - name: Cache Poetry diff --git a/.github/workflows/pycon-backend-test.yml b/.github/workflows/pycon-backend-test.yml index 8d7ed460de..92bd397769 100644 --- a/.github/workflows/pycon-backend-test.yml +++ b/.github/workflows/pycon-backend-test.yml @@ -27,7 +27,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: - python-version: "3.9.15" + python-version: "3.11.6" - run: pip install poetry==1.4.2 - name: Cache Poetry diff --git a/.github/workflows/python-lint.yml b/.github/workflows/python-lint.yml index 66f6a2789f..aa6e7076fb 100644 --- a/.github/workflows/python-lint.yml +++ b/.github/workflows/python-lint.yml @@ -29,7 +29,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: - python-version: "3.9.15" + python-version: "3.11.6" - run: pip install poetry if: steps.changed.outputs.changed.${{ matrix.service.name }} == 'true' - name: Set Poetry config diff --git a/Dockerfile.python.local b/Dockerfile.python.local index bac179b7f7..4d85e09d4b 100644 --- a/Dockerfile.python.local +++ b/Dockerfile.python.local @@ -1,6 +1,6 @@ ARG FUNCTION_DIR="/home/app/" -FROM python:3.9 +FROM python:3.11 RUN apt update -y && apt install -y ffmpeg libsm6 libxext6 diff --git a/backend/.tool-versions b/backend/.tool-versions new file mode 100644 index 0000000000..b4736d5dc2 --- /dev/null +++ b/backend/.tool-versions @@ -0,0 +1 @@ +python 3.11.6 diff --git a/backend/Dockerfile b/backend/Dockerfile index e636c4e549..68b7abd9c2 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,6 +1,6 @@ ARG FUNCTION_DIR="/home/app/" -FROM python:3.9-slim as build-stage +FROM python:3.11-slim as build-stage ARG FUNCTION_DIR @@ -8,42 +8,42 @@ RUN mkdir -p ${FUNCTION_DIR} WORKDIR ${FUNCTION_DIR} RUN apt-get update -y && apt-get install -y \ - gcc libpq-dev git \ - # Pillow - libtiff5-dev libjpeg62 libopenjp2-7-dev zlib1g-dev \ - libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk \ - libharfbuzz-dev libfribidi-dev libxcb1-dev libldap2-dev libldap-2.5-0 \ - ffmpeg libsm6 libxext6 libglib2.0-0 + gcc libpq-dev git \ + # Pillow + libtiff5-dev libjpeg62 libopenjp2-7-dev zlib1g-dev \ + libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk \ + libharfbuzz-dev libfribidi-dev libxcb1-dev libldap2-dev libldap-2.5-0 \ + ffmpeg libsm6 libxext6 libglib2.0-0 ENV LIBRARY_PATH=/lib:/usr/lib RUN pip3 install poetry==1.3.2 RUN tar -czvf /libs.tar.gz /usr/lib/x86_64-linux-gnu/libpq* \ - /usr/lib/x86_64-linux-gnu/libpq* \ - /usr/lib/x86_64-linux-gnu/libldap_r* \ - /usr/lib/x86_64-linux-gnu/libldap* \ - /usr/lib/x86_64-linux-gnu/liblber* \ - /usr/lib/x86_64-linux-gnu/libsasl* \ - /usr/lib/x86_64-linux-gnu/libxml2* \ - /usr/lib/x86_64-linux-gnu/libgcrypt* \ - /usr/lib/x86_64-linux-gnu/libstdc++* \ - /usr/lib/x86_64-linux-gnu/libjpeg* \ - /usr/lib/x86_64-linux-gnu/libopenjp2* \ - /usr/lib/x86_64-linux-gnu/libdeflate* \ - /usr/lib/x86_64-linux-gnu/libjbig* \ - /usr/lib/x86_64-linux-gnu/liblcms2* \ - /usr/lib/x86_64-linux-gnu/libwebp* \ - /usr/lib/x86_64-linux-gnu/libtiff* \ - /usr/lib/x86_64-linux-gnu/libGL* \ - /usr/lib/x86_64-linux-gnu/libgthread* \ - /usr/lib/x86_64-linux-gnu/libglib-* \ - /usr/lib/x86_64-linux-gnu/libX11* \ - /usr/lib/x86_64-linux-gnu/libxcb* \ - /usr/lib/x86_64-linux-gnu/libXau* \ - /usr/lib/x86_64-linux-gnu/libXdmcp* \ - /usr/lib/x86_64-linux-gnu/libXext* \ - /usr/lib/x86_64-linux-gnu/libbsd* + /usr/lib/x86_64-linux-gnu/libpq* \ + /usr/lib/x86_64-linux-gnu/libldap_r* \ + /usr/lib/x86_64-linux-gnu/libldap* \ + /usr/lib/x86_64-linux-gnu/liblber* \ + /usr/lib/x86_64-linux-gnu/libsasl* \ + /usr/lib/x86_64-linux-gnu/libxml2* \ + /usr/lib/x86_64-linux-gnu/libgcrypt* \ + /usr/lib/x86_64-linux-gnu/libstdc++* \ + /usr/lib/x86_64-linux-gnu/libjpeg* \ + /usr/lib/x86_64-linux-gnu/libopenjp2* \ + /usr/lib/x86_64-linux-gnu/libdeflate* \ + /usr/lib/x86_64-linux-gnu/libjbig* \ + /usr/lib/x86_64-linux-gnu/liblcms2* \ + /usr/lib/x86_64-linux-gnu/libwebp* \ + /usr/lib/x86_64-linux-gnu/libtiff* \ + /usr/lib/x86_64-linux-gnu/libGL* \ + /usr/lib/x86_64-linux-gnu/libgthread* \ + /usr/lib/x86_64-linux-gnu/libglib-* \ + /usr/lib/x86_64-linux-gnu/libX11* \ + /usr/lib/x86_64-linux-gnu/libxcb* \ + /usr/lib/x86_64-linux-gnu/libXau* \ + /usr/lib/x86_64-linux-gnu/libXdmcp* \ + /usr/lib/x86_64-linux-gnu/libXext* \ + /usr/lib/x86_64-linux-gnu/libbsd* COPY poetry.lock ${FUNCTION_DIR} COPY pyproject.toml ${FUNCTION_DIR} @@ -51,7 +51,7 @@ COPY pyproject.toml ${FUNCTION_DIR} RUN poetry config virtualenvs.in-project true RUN poetry install --no-dev -E lambda -FROM python:3.9-slim +FROM python:3.11-slim ARG FUNCTION_DIR @@ -70,16 +70,16 @@ COPY . ${FUNCTION_DIR} ENV DJANGO_SETTINGS_MODULE=pycon.settings.prod RUN USERS_SERVICE=empty \ - ASSOCIATION_BACKEND_SERVICE=empty \ - SERVICE_TO_SERVICE_SECRET=empty \ - AWS_MEDIA_BUCKET=example \ - AWS_REGION_NAME=eu-central-1 \ - SECRET_KEY=DEMO \ - PASTAPORTO_SECRET=demo \ - STRIPE_SECRET_API_KEY=demo \ - STRIPE_SUBSCRIPTION_PRICE_ID=demo \ - STRIPE_WEBHOOK_SIGNATURE_SECRET=demo \ - ${FUNCTION_DIR}/.venv/bin/python manage.py collectstatic --noinput + ASSOCIATION_BACKEND_SERVICE=empty \ + SERVICE_TO_SERVICE_SECRET=empty \ + AWS_MEDIA_BUCKET=example \ + AWS_REGION_NAME=eu-central-1 \ + SECRET_KEY=DEMO \ + PASTAPORTO_SECRET=demo \ + STRIPE_SECRET_API_KEY=demo \ + STRIPE_SUBSCRIPTION_PRICE_ID=demo \ + STRIPE_WEBHOOK_SIGNATURE_SECRET=demo \ + ${FUNCTION_DIR}/.venv/bin/python manage.py collectstatic --noinput ENTRYPOINT ["/home/app/.venv/bin/python", "-m", "awslambdaric"] CMD [ "wsgi_handler.handler" ] diff --git a/backend/association_membership/handlers/pretix/api.py b/backend/association_membership/handlers/pretix/api.py index 543a3ebb59..19d31b4ab9 100644 --- a/backend/association_membership/handlers/pretix/api.py +++ b/backend/association_membership/handlers/pretix/api.py @@ -1,6 +1,6 @@ from typing import Literal -import httpx +import requests from django.conf import settings @@ -24,8 +24,7 @@ def _request( if qs: url = f"{url}?" + "&".join([f"{key}={value}" for key, value in qs.items()]) - with httpx.Client(headers=headers) as client: - response = getattr(client, method)(url) + response = getattr(requests, method)(url, headers=headers) response.raise_for_status() return response diff --git a/backend/association_membership/tests/handlers/pretix/test_pretix_event_order_paid.py b/backend/association_membership/tests/handlers/pretix/test_pretix_event_order_paid.py index 595a5b6f73..5a9e9df290 100644 --- a/backend/association_membership/tests/handlers/pretix/test_pretix_event_order_paid.py +++ b/backend/association_membership/tests/handlers/pretix/test_pretix_event_order_paid.py @@ -2,7 +2,6 @@ import datetime from datetime import timezone -import respx import time_machine from django.conf import settings from association_membership.models import ( @@ -36,20 +35,20 @@ pytestmark = pytest.mark.django_db -def test_receive_order_paid_with_membership(): +def test_receive_order_paid_with_membership(requests_mock): user = UserFactory(email="pretix@example.org") - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) pretix_event_order_paid(ORDER_PAID) @@ -78,21 +77,21 @@ def test_receive_order_paid_with_membership(): assert pretix_payment.event_id == "local-conf-test" -def test_receive_order_paid_twice_doesnt_process_the_payment_twice(): +def test_receive_order_paid_twice_doesnt_process_the_payment_twice(requests_mock): user = UserFactory(email="pretix@example.org") - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) pretix_event_order_paid(ORDER_PAID) @@ -109,38 +108,38 @@ def test_receive_order_paid_twice_doesnt_process_the_payment_twice(): assert created_membership.payments.count() == 1 -def test_receive_order_paid_without_membership_purchase(): - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITHOUT_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} +def test_receive_order_paid_without_membership_purchase(requests_mock): + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITHOUT_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) pretix_event_order_paid(ORDER_PAID) assert not Membership.objects.filter(user_id=1).exists() -def test_receive_order_paid_fails_if_no_user_maps_to_the_email(): - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": None}} +def test_receive_order_paid_fails_if_no_user_maps_to_the_email(requests_mock): + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) with pytest.raises( @@ -152,7 +151,7 @@ def test_receive_order_paid_fails_if_no_user_maps_to_the_email(): assert not Membership.objects.exists() -def test_receive_order_paid_with_canceled_subscription(): +def test_receive_order_paid_with_canceled_subscription(requests_mock): """ Test receiving an order paid with a canceled subscription. """ @@ -161,19 +160,20 @@ def test_receive_order_paid_with_canceled_subscription(): user=user, status=MembershipStatus.CANCELED ) - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, + ) + pretix_event_order_paid(ORDER_PAID) created_membership = Membership.objects.get(user=user) @@ -184,24 +184,24 @@ def test_receive_order_paid_with_canceled_subscription(): assert created_membership.payments.count() == 1 -def test_receive_order_paid_of_period_outside_current_one(): +def test_receive_order_paid_of_period_outside_current_one(requests_mock): """ Test receiving an order paid of a period outside the current one. """ user = UserFactory(email="pretix@example.org") - with respx.mock as mock, time_machine.travel("2023-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2023-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) pretix_event_order_paid(ORDER_PAID) @@ -213,25 +213,27 @@ def test_receive_order_paid_of_period_outside_current_one(): assert created_membership.payments.count() == 1 -def test_receive_order_paid_of_already_subscribed_fails_with_error_message(): +def test_receive_order_paid_of_already_subscribed_fails_with_error_message( + requests_mock, +): """ Test receiving an order paid of a user who is already subscribed to the association. """ user = UserFactory(email="pretix@example.org") MembershipFactory(user=user, status=MembershipStatus.ACTIVE) - with respx.mock as mock, time_machine.travel("2023-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2023-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) with pytest.raises( @@ -246,24 +248,28 @@ def test_receive_order_paid_of_already_subscribed_fails_with_error_message(): assert created_membership.payments.count() == 0 -def test_can_subscribe_with_mix_of_manual_and_refunds(): +def test_can_subscribe_with_mix_of_manual_and_refunds(requests_mock): """ Test subscribing with a mix of manual and refunds. """ user = UserFactory(email="pretix@example.org") - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_REFUNDS) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_REFUNDS, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, + ) + requests_mock.post( + "http://users-backend-url/internal-api", + json={"data": {"userByEmail": {"id": 1}}}, ) pretix_event_order_paid(ORDER_PAID) @@ -278,25 +284,29 @@ def test_can_subscribe_with_mix_of_manual_and_refunds(): assert payment.total == 1000 -def test_receive_order_paid_with_refunds_but_enough_to_cover_membership(): +def test_receive_order_paid_with_refunds_but_enough_to_cover_membership(requests_mock): """ If some has been refunded but the user paid enough to cover the membership price it gets accepted. """ user = UserFactory(email="pretix@example.org") - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond(json=ORDER_DATA_WITH_REFUND_EVERYTHING_BUT_MEMBERSHIP) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_REFUND_EVERYTHING_BUT_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, + ) + requests_mock.post( + "http://users-backend-url/internal-api", + json={"data": {"userByEmail": {"id": 1}}}, ) pretix_event_order_paid(ORDER_PAID) @@ -311,23 +321,21 @@ def test_receive_order_paid_with_refunds_but_enough_to_cover_membership(): assert payment.total == 1000 -def test_order_rejected_if_not_enough_paid(): +def test_order_rejected_if_not_enough_paid(requests_mock): user = UserFactory(email="pretix@example.org") - with respx.mock as mock, time_machine.travel("2021-12-16 01:04:50Z", tick=False): - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/" - ).respond( - json=ORDER_DATA_WITH_REFUND_EVERYTHING_AND_NOT_ENOUGH_TO_COVER_MEMBERSHIP - ) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25" - ).respond(json=ITEMS_WITH_CATEGORY) - mock.get( - f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/" - ).respond(json=CATEGORIES) - mock.post("http://users-backend-url/internal-api").respond( - json={"data": {"userByEmail": {"id": 1}}} + with time_machine.travel("2021-12-16 01:04:50Z", tick=False): + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/orders/9YKZK/", + json=ORDER_DATA_WITH_REFUND_EVERYTHING_AND_NOT_ENOUGH_TO_COVER_MEMBERSHIP, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/items/?active=true&category=25", + json=ITEMS_WITH_CATEGORY, + ) + requests_mock.get( + f"{settings.PRETIX_API}organizers/test-organizer/events/local-conf-test/categories/", + json=CATEGORIES, ) with pytest.raises(NotEnoughPaid): diff --git a/backend/conferences/tests/test_admin.py b/backend/conferences/tests/test_admin.py index 4961cef884..ad9668eb5e 100644 --- a/backend/conferences/tests/test_admin.py +++ b/backend/conferences/tests/test_admin.py @@ -216,7 +216,8 @@ def test_send_voucher_via_email( [ call(speaker_voucher_1), call(speaker_voucher_2), - ] + ], + any_order=True, ) @@ -342,6 +343,7 @@ def test_create_speaker_vouchers_on_pretix( value="25.00", ), ], + any_order=True, ) voucher_1.refresh_from_db() diff --git a/backend/domain_events/tests/test_handler.py b/backend/domain_events/tests/test_handler.py index 4db8bd58eb..5713a3986c 100644 --- a/backend/domain_events/tests/test_handler.py +++ b/backend/domain_events/tests/test_handler.py @@ -7,7 +7,6 @@ from grants.tests.factories import GrantFactory from users.tests.factories import UserFactory from schedule.models import ScheduleItem -import respx from django.utils import timezone from pythonit_toolkit.emails.templates import EmailTemplate @@ -139,7 +138,7 @@ def test_handle_submission_time_slot_changed(): "submission_title": "Title title", } - with patch("domain_events.handler.send_email") as email_mock, respx.mock: + with patch("domain_events.handler.send_email") as email_mock: handle_submission_time_slot_changed(data) email_mock.assert_called_once_with( @@ -237,9 +236,7 @@ def test_handle_speaker_voucher_email_sent_cospeaker(settings, speaker_voucher_f "speaker_voucher_id": speaker_voucher.id, } - with patch( - "domain_events.handler.send_email" - ) as email_mock, respx.mock, time_machine.travel( + with patch("domain_events.handler.send_email") as email_mock, time_machine.travel( "2020-10-10 10:00:00Z", tick=False ): handle_speaker_voucher_email_sent(data) @@ -539,7 +536,7 @@ def test_handle_speaker_communication_sent_to_speakers_without_ticket( json={"user_has_admission_ticket": has_ticket}, ) - with patch("domain_events.handler.send_email") as email_mock, respx.mock: + with patch("domain_events.handler.send_email") as email_mock: handle_speaker_communication_sent(data) if not has_ticket: diff --git a/backend/grants/tests/test_admin.py b/backend/grants/tests/test_admin.py index e854fbfd9e..f0f224ff31 100644 --- a/backend/grants/tests/test_admin.py +++ b/backend/grants/tests/test_admin.py @@ -231,6 +231,7 @@ def test_create_grant_vouchers_on_pretix(rf, conference_factory, grant_factory, value="0.00", ), ], + any_order=True, ) grant_1.refresh_from_db() diff --git a/backend/i18n/tests/factories.py b/backend/i18n/tests/factories.py index 303886fe1d..4322c37237 100644 --- a/backend/i18n/tests/factories.py +++ b/backend/i18n/tests/factories.py @@ -1,20 +1,33 @@ +import faker import factory from django.conf import settings from i18n.strings import LazyI18nString -class LanguageFactory(factory.Faker): - def generate(self, extra_kwargs=None): - kwargs = {} - kwargs.update(extra_kwargs or {}) - kwargs.pop("locale") +class LanguageFactory(factory.fuzzy.BaseFuzzyAttribute): + _registry = {} - locale_to_faker = {"en": "en_US", "it": "it_IT"} + def __init__(self, provider, extra_kwargs=None, defaults=None): + self.provider = provider + self.extra_kwargs = extra_kwargs or {} + self._defaults = defaults or {} + def fuzz(self): data = {} for lang, _ in settings.LANGUAGES: - fake = self._get_faker(locale_to_faker[lang]) - data[lang] = fake.format(self.provider, **kwargs) + fake = self.get_faker(lang) + data[lang] = fake.format(self.provider, **self.extra_kwargs) return LazyI18nString(data) + + @classmethod + def get_faker(cls, lang): + locale_to_faker = {"en": "en_US", "it": "it_IT"} + locale = locale_to_faker[lang] + + if locale in cls._registry: + return cls._registry[locale] + + cls._registry[locale] = faker.Faker(locale=locale) + return cls._registry[locale] diff --git a/backend/poetry.lock b/backend/poetry.lock index bd87dcb7bc..d1e382ead6 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -37,7 +37,6 @@ files = [ ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" @@ -117,28 +116,21 @@ files = [ {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, ] -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "2.5" +version = "3.0.1" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8.0" files = [ - {file = "astroid-2.5-py3-none-any.whl", hash = "sha256:87ae7f2398b8a0ae5638ddecf9987f081b756e0e9fc071aeebdca525671fc4dc"}, - {file = "astroid-2.5.tar.gz", hash = "sha256:b31c92f545517dcc452f284bc9c044050862fbe6d93d2b3de4a215a6b384bf0d"}, + {file = "astroid-3.0.1-py3-none-any.whl", hash = "sha256:7d5895c9825e18079c5aeac0572bc2e4c83205c95d416e0b4fee8bc361d2d9ca"}, + {file = "astroid-3.0.1.tar.gz", hash = "sha256:86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e"}, ] -[package.dependencies] -lazy-object-proxy = ">=1.4.0" -wrapt = ">=1.11,<1.13" - [[package]] name = "async-timeout" version = "4.0.3" @@ -151,17 +143,6 @@ files = [ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - [[package]] name = "attrs" version = "23.1.0" @@ -183,35 +164,35 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "awslambdaric" -version = "2.0.7" +version = "2.0.8" description = "AWS Lambda Runtime Interface Client for Python" category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "awslambdaric-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df0f7833c87a67c428e2b9dd5ce1e5c40d65d6baf2a92d11eebb22f98cb25bf7"}, - {file = "awslambdaric-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51d9535eec9f207e8c4bf9b7fae13a4932b8e5aaabed0a65c6324e7db4901b47"}, - {file = "awslambdaric-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eeb0b7537a4a5ccddca73149536818b724e8a4ad18f46af81fb3573655d1d14"}, - {file = "awslambdaric-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29cdc5bc304ba89c60b4a16a336a99e68db15bb18f59e835df1015e3d6426a48"}, - {file = "awslambdaric-2.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b35d9175e11d999f47ab9aae621003360b3b1467fdf0eec6776d4f9b18d4ea1e"}, - {file = "awslambdaric-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:232e48dd28ecbdeae19e3678ab49806e49d2f78f8aed171dd645104422601d16"}, - {file = "awslambdaric-2.0.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f159a3a16e9c964d613ed6ece838db8b8f93d685b4cc89b4db4f93ded0f1ecfd"}, - {file = "awslambdaric-2.0.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c372f9a969c7ff07cc5581e4d0334942d4387e76e900d151b30cf7748684e94e"}, - {file = "awslambdaric-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:708aea40ea478e8e146abc608a10770732ff9a52cbe311eb498fb790b8084853"}, - {file = "awslambdaric-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e46e5d68ddeaec134824b8b10b0328119a5b53c02f2cd44f9791deda0f51bfd"}, - {file = "awslambdaric-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da6585dc92737a96788d2adcb552f5d1fa18f1ba19bad800aafe5a93626c40cf"}, - {file = "awslambdaric-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95aaf5ee3b120f9ca9e82dbf30ff862867cc3c942e7b2cdb7393fcec05d943a"}, - {file = "awslambdaric-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac69b5882ad23ea7e20548d3a791f4238560036d7728a52ea9273d51df57f255"}, - {file = "awslambdaric-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:033ffa9982144c84dcba6f8d8a28cfee22ca1d42c8ca12db654a6bc92de5472a"}, - {file = "awslambdaric-2.0.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e1e32a5ab504a1884ef0a03649a840118e462eaa18f889f298976d80ce53d37"}, - {file = "awslambdaric-2.0.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5741d4ba4da15ea6a661363662ff5914ca2619d871d82ea370ef2b56f8f1b7bb"}, - {file = "awslambdaric-2.0.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:609dfa86c2dd5768e04f5286720bae40a6a284e31f1eed251234ced5c208b961"}, - {file = "awslambdaric-2.0.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b2018af3867d1b26a21a2136269a52cd7d6d27af3694971ab1791f5e41ace"}, - {file = "awslambdaric-2.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a747423055af5233736a4c4d6fbb423c2520741f5c11bdfc84abba39dad4d978"}, - {file = "awslambdaric-2.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf4fa7cc92a14ee39b04566c65c423c10a6dbfbb16f9ce0d5437eb1f626cf04"}, - {file = "awslambdaric-2.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47351fdd12ab5773b5bee2a89d6d63500bb418828084627556368ffbc1ce6236"}, - {file = "awslambdaric-2.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11adfad2a847819e4884706cf70a1a0a854d774592747f89adabc61af5075b"}, - {file = "awslambdaric-2.0.7.tar.gz", hash = "sha256:d2705914957b218f32412513b59d0af2d6f33d0c49fbc7e4f6f0a2bf0777dc13"}, + {file = "awslambdaric-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9363260e0a2194ee47453ba5daad081005d2add0d49016ecdddc55ad67bff773"}, + {file = "awslambdaric-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f2fd3f3c5e86a91f9dafb3299d52b0b303467444a8399ac10aabf2737d5e1a"}, + {file = "awslambdaric-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e798e8e9264758fe6f9d468e3ae161e578075a1f7412469a81325ee25483578e"}, + {file = "awslambdaric-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e727ce87de98391dcd23aede1f294d380813e641819f968ce2053da5c11d1844"}, + {file = "awslambdaric-2.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:344cec13462637e35925f520cc34ed3d8d66d72631bce6b4cb10c610f45f6793"}, + {file = "awslambdaric-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b37d3c5e0a0811362cfb88e573d1fcb82c1210c6c9019503bdf8d05dd38285b"}, + {file = "awslambdaric-2.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b26ca34724dfa4f8433aaa307d5dac1fdea11c616dd6553977aa7b55a12535e"}, + {file = "awslambdaric-2.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54214a6a951dba8168c38d8a89a9235dc1cafe5ed995c862dc91a939bd6f8912"}, + {file = "awslambdaric-2.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e4fb3d95cfe318973a492f267ccf989e428d9fe7a8a861d553c3732d9a84452"}, + {file = "awslambdaric-2.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d43a9042cccdab1f5419169a0bc0f8765e65d4f356d37ef98959d1ef877794"}, + {file = "awslambdaric-2.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6c7dc49f9c1bc42a82d6f8c9a68d63ba9056a635f3f15d75c2a97567223300"}, + {file = "awslambdaric-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e206aa1b888017a3397e621b32fc1a11999b9c6fc7a92e52f916a862dbbaa1"}, + {file = "awslambdaric-2.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd6d1b1dc218366e856728073d63295966aba4a99dc21f0c879b936129aea17b"}, + {file = "awslambdaric-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a491b65417b1f273fef28f26fe0d108a82b42994c374421ab1afb4417680c15e"}, + {file = "awslambdaric-2.0.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb912bc618cf4acee3e32b8f4c1ff9c3ad372bef3ef737564a6e7d87c05c0878"}, + {file = "awslambdaric-2.0.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08140f5a922da004da2ca15322d324d69d4d17de92a0fba875f18ea5a486d854"}, + {file = "awslambdaric-2.0.8-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496941acb3bcdd2988d1a78f0d17eb9fb282b1a6eae1ee3cc105a1d7788da43"}, + {file = "awslambdaric-2.0.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06afcf91dc1661ec9695d480d8d1aceb77fc9fb626e1f3c93c8081c009fe01d8"}, + {file = "awslambdaric-2.0.8-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67917bf30c23a0d8995818d44b5ce8f79753773b25168a60a6d73aabbb50c120"}, + {file = "awslambdaric-2.0.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e11996f6c9c259289b631ac76e3093c0e9d7141efcb4265c4c1365d7ed39b9"}, + {file = "awslambdaric-2.0.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07c3e3b6c8014084430a11a3ea9032fd5863376099b5bdbfaba26928fa36fa61"}, + {file = "awslambdaric-2.0.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa64b8602f44389cda7aa1e4030d4234c3cbe6c17808206761449bd6f106b26"}, + {file = "awslambdaric-2.0.8.tar.gz", hash = "sha256:1fb1b240208c339105670d5446bd9027b5536b625af3a6e9ec084a828a3c70c5"}, ] [package.dependencies] @@ -278,32 +259,43 @@ aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] [[package]] name = "black" -version = "21.12b0" +version = "23.10.1" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.8" files = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, -] - -[package.dependencies] -click = ">=7.1.2" + {file = "black-23.10.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:ec3f8e6234c4e46ff9e16d9ae96f4ef69fa328bb4ad08198c8cee45bb1f08c69"}, + {file = "black-23.10.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:1b917a2aa020ca600483a7b340c165970b26e9029067f019e3755b56e8dd5916"}, + {file = "black-23.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c74de4c77b849e6359c6f01987e94873c707098322b91490d24296f66d067dc"}, + {file = "black-23.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4d10b0f016616a0d93d24a448100adf1699712fb7a4efd0e2c32bbb219b173"}, + {file = "black-23.10.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b15b75fc53a2fbcac8a87d3e20f69874d161beef13954747e053bca7a1ce53a0"}, + {file = "black-23.10.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:e293e4c2f4a992b980032bbd62df07c1bcff82d6964d6c9496f2cd726e246ace"}, + {file = "black-23.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56124b7a61d092cb52cce34182a5280e160e6aff3137172a68c2c2c4b76bcb"}, + {file = "black-23.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f157a8945a7b2d424da3335f7ace89c14a3b0625e6593d21139c2d8214d55ce"}, + {file = "black-23.10.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:cfcce6f0a384d0da692119f2d72d79ed07c7159879d0bb1bb32d2e443382bf3a"}, + {file = "black-23.10.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:33d40f5b06be80c1bbce17b173cda17994fbad096ce60eb22054da021bf933d1"}, + {file = "black-23.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840015166dbdfbc47992871325799fd2dc0dcf9395e401ada6d88fe11498abad"}, + {file = "black-23.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:037e9b4664cafda5f025a1728c50a9e9aedb99a759c89f760bd83730e76ba884"}, + {file = "black-23.10.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:7cb5936e686e782fddb1c73f8aa6f459e1ad38a6a7b0e54b403f1f05a1507ee9"}, + {file = "black-23.10.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:7670242e90dc129c539e9ca17665e39a146a761e681805c54fbd86015c7c84f7"}, + {file = "black-23.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed45ac9a613fb52dad3b61c8dea2ec9510bf3108d4db88422bacc7d1ba1243d"}, + {file = "black-23.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6d23d7822140e3fef190734216cefb262521789367fbdc0b3f22af6744058982"}, + {file = "black-23.10.1-py3-none-any.whl", hash = "sha256:d431e6739f727bb2e0495df64a6c7a5310758e87505f5f8cde9ff6c0f2d7e4fe"}, + {file = "black-23.10.1.tar.gz", hash = "sha256:1f8ce316753428ff68749c65a5f7844631aa18c8679dfd3ca9dc1a289979c258"}, +] + +[package.dependencies] +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +packaging = ">=22.0" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = ">=3.10.0.0,<3.10.0.1 || >3.10.0.1", markers = "python_version >= \"3.10\""}, -] [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -328,43 +320,43 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "boto3" -version = "1.26.101" +version = "1.28.78" description = "The AWS SDK for Python" category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "boto3-1.26.101-py3-none-any.whl", hash = "sha256:5f5279a63b359ba8889e9a81b319e745b14216608ffb5a39fcbf269d1af1ea83"}, - {file = "boto3-1.26.101.tar.gz", hash = "sha256:670ae4d1875a2162e11c6e941888817c3e9cf1bb9a3335b3588d805b7d24da31"}, + {file = "boto3-1.28.78-py3-none-any.whl", hash = "sha256:ff8df4bb5aeb69acc64959a74b31042bfc52d64ca77dbe845a72c8062c48d179"}, + {file = "boto3-1.28.78.tar.gz", hash = "sha256:aa970b1571321846543a6e615848352fe7621f1cb96b4454e919421924af95f7"}, ] [package.dependencies] -botocore = ">=1.29.101,<1.30.0" +botocore = ">=1.31.78,<1.32.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" +s3transfer = ">=0.7.0,<0.8.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.165" +version = "1.31.78" description = "Low-level, data-driven core of boto 3." category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "botocore-1.29.165-py3-none-any.whl", hash = "sha256:6f35d59e230095aed7cd747604fe248fa384bebb7d09549077892f936a8ca3df"}, - {file = "botocore-1.29.165.tar.gz", hash = "sha256:988b948be685006b43c4bbd8f5c0cb93e77c66deb70561994e0c5b31b5a67210"}, + {file = "botocore-1.31.78-py3-none-any.whl", hash = "sha256:a9ca8deeb3f47a10a25637859fee8d81cac2db37ace819d24471279e44879547"}, + {file = "botocore-1.31.78.tar.gz", hash = "sha256:320c70bc412157813c2cf60217a592b4b345f8e97e4bf3b1ce49b6be69ed8965"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.16.9)"] +crt = ["awscrt (==0.16.26)"] [[package]] name = "cachetools" @@ -585,9 +577,6 @@ files = [ {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, ] -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - [package.extras] toml = ["tomli"] @@ -679,6 +668,21 @@ files = [ [package.extras] dev = ["attribution (==1.6.2)", "black (==23.3.0)", "flit (==3.8.0)", "mypy (==1.2.0)", "ufmt (==2.1.0)", "usort (==1.0.6)"] +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + [[package]] name = "django" version = "4.2.3" @@ -953,21 +957,6 @@ files = [ {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, ] -[[package]] -name = "exceptiongroup" -version = "1.1.3" -description = "Backport of PEP 654 (exception groups)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "execnet" version = "2.0.2" @@ -985,33 +974,33 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "factory-boy" -version = "3.1.0" +version = "3.3.0" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "factory_boy-3.1.0-py2.py3-none-any.whl", hash = "sha256:d8626622550c8ba31392f9e19fdbcef9f139cf1ad643c5923f20490a7b3e2e3d"}, - {file = "factory_boy-3.1.0.tar.gz", hash = "sha256:ded73e49135c24bd4d3f45bf1eb168f8d290090f5cf4566b8df3698317dc9c08"}, + {file = "factory_boy-3.3.0-py2.py3-none-any.whl", hash = "sha256:a2cdbdb63228177aa4f1c52f4b6d83fab2b8623bf602c7dedd7eb83c0f69c04c"}, + {file = "factory_boy-3.3.0.tar.gz", hash = "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1"}, ] [package.dependencies] Faker = ">=0.7.0" [package.extras] -dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] -doc = ["Sphinx", "sphinx-rtd-theme"] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "sqlalchemy-utils", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] [[package]] name = "faker" -version = "19.12.0" +version = "19.13.0" description = "Faker is a Python package that generates fake data for you." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "Faker-19.12.0-py3-none-any.whl", hash = "sha256:5990380a8ee81cf189d6b85d5fdc1fb43772cb136aca0385a08ff24ef01b9fdf"}, - {file = "Faker-19.12.0.tar.gz", hash = "sha256:91438f6b1713274ec3f24970ba303617be86ce5caf6f6a0776f1d04777b6ff5f"}, + {file = "Faker-19.13.0-py3-none-any.whl", hash = "sha256:da880a76322db7a879c848a0771e129338e0a680a9f695fd9a3e7a6ac82b45e1"}, + {file = "Faker-19.13.0.tar.gz", hash = "sha256:14ccb0aec342d33aa3889a864a56e5b3c2d56bce1b89f9189f4fbc128b9afc1e"}, ] [package.dependencies] @@ -1035,20 +1024,20 @@ pyrepl = ">=0.8.2" [[package]] name = "flake8" -version = "3.9.2" +version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.8.1" files = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, ] [package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "future" @@ -1086,14 +1075,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.105.0" +version = "2.106.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.105.0.tar.gz", hash = "sha256:0a8b32cfc2d9b3c1868ae6faef7ee1ab9c89a6cec30be709ea9c97f9a3e5902d"}, - {file = "google_api_python_client-2.105.0-py2.py3-none-any.whl", hash = "sha256:571ce7c41e53415e385aab5a955725f71780550683ffcb71596f5809677d40b7"}, + {file = "google-api-python-client-2.106.0.tar.gz", hash = "sha256:f6a3862be2f6e5e0536d7bd47b5af3f24ac0b9147c76c830cafb3329d71d5724"}, + {file = "google_api_python_client-2.106.0-py2.py3-none-any.whl", hash = "sha256:c47c0dae5dd20aa43e4ea184566fe59d0c8fd0b86dd223b29040d8ea4f7ed6ea"}, ] [package.dependencies] @@ -1105,14 +1094,14 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.23.3" +version = "2.23.4" description = "Google Authentication Library" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.23.3.tar.gz", hash = "sha256:6864247895eea5d13b9c57c9e03abb49cb94ce2dc7c58e91cba3248c7477c9e3"}, - {file = "google_auth-2.23.3-py2.py3-none-any.whl", hash = "sha256:a8f4608e65c244ead9e0538f181a96c6e11199ec114d41f1d7b1bffa96937bda"}, + {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, + {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, ] [package.dependencies] @@ -1355,27 +1344,28 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 [[package]] name = "httpx" -version = "0.20.0" +version = "0.25.1" description = "The next generation HTTP client." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "httpx-0.20.0-py3-none-any.whl", hash = "sha256:33af5aad9bdc82ef1fc89219c1e36f5693bf9cd0ebe330884df563445682c0f8"}, - {file = "httpx-0.20.0.tar.gz", hash = "sha256:09606d630f070d07f9ff28104fbcea429ea0014c1e89ac90b4d8de8286c40e7b"}, + {file = "httpx-0.25.1-py3-none-any.whl", hash = "sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a"}, + {file = "httpx-0.25.1.tar.gz", hash = "sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0"}, ] [package.dependencies] +anyio = "*" certifi = "*" -charset-normalizer = "*" -httpcore = ">=0.13.3,<0.14.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +httpcore = "*" +idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10.0.0,<11.0.0)"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "idna" @@ -1389,26 +1379,6 @@ files = [ {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"}, ] -[[package]] -name = "importlib-metadata" -version = "6.8.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] - [[package]] name = "inflection" version = "0.5.1" @@ -1500,90 +1470,45 @@ six = ">=1.11.0" format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - [[package]] name = "libcst" -version = "0.4.10" +version = "1.1.0" description = "A concrete syntax tree with AST-like properties for Python 3.5, 3.6, 3.7, 3.8, 3.9, and 3.10 programs." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "libcst-0.4.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8fa0ec646ed7bce984d0ee9dbf514af278050bdb16a4fb986e916ace534eebc6"}, - {file = "libcst-0.4.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cb3b7821eac00713844cda079583230c546a589b22ed5f03f2ddc4f985c384b"}, - {file = "libcst-0.4.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7acfa747112ae40b032739661abd7c81aff37191294f7c2dab8bbd72372e78f"}, - {file = "libcst-0.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1312e293b864ef3cb4b09534ed5f104c2dc45b680233c68bf76237295041c781"}, - {file = "libcst-0.4.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76884b1afe475e8e68e704bf26eb9f9a2867029643e58f2f26a0286e3b6e998e"}, - {file = "libcst-0.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:1069b808a711db5cd47538f27eb2c73206317aa0d8b5a3500b23aab24f86eb2e"}, - {file = "libcst-0.4.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:50be085346a35812535c7f876319689e15a7bfd1bd8efae8fd70589281d944b6"}, - {file = "libcst-0.4.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb9f10e5763e361e8bd8ff765fc0f1bcf744f242ff8b6d3e50ffec4dda3972ac"}, - {file = "libcst-0.4.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfeeabb528b5df7b4be1817b584ce79e9a1a66687bd72f6de9c22272462812f1"}, - {file = "libcst-0.4.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5648aeae8c90a2abab1f7b1bf205769a0179ed2cfe1ea7f681f6885e87b8b193"}, - {file = "libcst-0.4.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a144f20aff4643b00374facf8409d30c7935db8176e5b2a07e1fd44004db2c1f"}, - {file = "libcst-0.4.10-cp311-cp311-win_amd64.whl", hash = "sha256:a10adc2e8ea2dda2b70eabec631ead2fc4a7a7ab633d6c2b690823c698b8431a"}, - {file = "libcst-0.4.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58fe90458a26a55358207f74abf8a05dff51d662069f070b4bd308a000a80c09"}, - {file = "libcst-0.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:999fbbe467f61cbce9e6e054f86cd1c5ffa3740fd3dc8ebdd600db379f699256"}, - {file = "libcst-0.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83ee7e7be4efac4c140a97d772e1f6b3553f98fa5f46ad78df5dfe51e5a4aa4d"}, - {file = "libcst-0.4.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:158478e8f45578fb26621b3dc0fe275f9e004297e9afdcf08936ecda05681174"}, - {file = "libcst-0.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:5ed101fee1af7abea3684fcff7fab5b170ceea4040756f54c15c870539daec66"}, - {file = "libcst-0.4.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:349f2b4ee4b982fe254c65c78d941fc96299f3c422b79f95ef8c7bba2b7f0f90"}, - {file = "libcst-0.4.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7cfa4d4beb84d0d63247aca27f1a15c63984512274c5b23040f8b4ba511036d7"}, - {file = "libcst-0.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24582506da24e31f2644f862f11413a6b80fbad68d15194bfcc3f7dfebf2ec5e"}, - {file = "libcst-0.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cdf2d0157438d3d52d310b0b6be31ff99bed19de489b2ebd3e2a4cd9946da45"}, - {file = "libcst-0.4.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a677103d2f1ab0e50bc3a7cc6c96c7d64bcbac826d785e4cbf5ee9aaa9fcfa25"}, - {file = "libcst-0.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:a8fdfd4a7d301adb785aa4b98e4a7cca45c5ff8cfb460b485d081efcfaaeeab7"}, - {file = "libcst-0.4.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b1569d87536bed4e9c11dd5c94a137dc0bce2a2b05961489c6016bf4521bb7cf"}, - {file = "libcst-0.4.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:72dff8783ac79cd10f2bd2fde0b28f262e9a22718ae26990948ba6131b85ca8b"}, - {file = "libcst-0.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76adc53660ef094ff83f77a2550a7e00d1cab8e5e63336e071c17c09b5a89fe2"}, - {file = "libcst-0.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3e9d9fdd9a9b9b8991936ff1c07527ce7ef396c8233280ba9a7137e72c2e48e"}, - {file = "libcst-0.4.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e1b4cbaf7b1cdad5fa3eababe42d5b46c0d52afe13c5ba4eac2495fc57630ea"}, - {file = "libcst-0.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:bcbd07cec3d7a7be6f0299b0c246e085e3d6cc8af367e2c96059183b97c2e2fe"}, - {file = "libcst-0.4.10.tar.gz", hash = "sha256:b98a829d96e8b209fb761b00cd1bacc27c70eae77d00e57976e5ae2c718c3f81"}, + {file = "libcst-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:63f75656fd733dc20354c46253fde3cf155613e37643c3eaf6f8818e95b7a3d1"}, + {file = "libcst-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ae11eb1ea55a16dc0cdc61b41b29ac347da70fec14cc4381248e141ee2fbe6c"}, + {file = "libcst-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bc745d0c06420fe2644c28d6ddccea9474fb68a2135904043676deb4fa1e6bc"}, + {file = "libcst-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1f2da45f1c45634090fd8672c15e0159fdc46853336686959b2d093b6e10fa"}, + {file = "libcst-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:003e5e83a12eed23542c4ea20fdc8de830887cc03662432bb36f84f8c4841b81"}, + {file = "libcst-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:3ebbb9732ae3cc4ae7a0e97890bed0a57c11d6df28790c2b9c869f7da653c7c7"}, + {file = "libcst-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d68c34e3038d3d1d6324eb47744cbf13f2c65e1214cf49db6ff2a6603c1cd838"}, + {file = "libcst-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9dffa1795c2804d183efb01c0f1efd20a7831db6a21a0311edf90b4100d67436"}, + {file = "libcst-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc9b6ac36d7ec9db2f053014ea488086ca2ed9c322be104fbe2c71ca759da4bb"}, + {file = "libcst-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b7a38ec4c1c009ac39027d51558b52851fb9234669ba5ba62283185963a31c"}, + {file = "libcst-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5297a16e575be8173185e936b7765c89a3ca69d4ae217a4af161814a0f9745a7"}, + {file = "libcst-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:7ccaf53925f81118aeaadb068a911fac8abaff608817d7343da280616a5ca9c1"}, + {file = "libcst-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:75816647736f7e09c6120bdbf408456f99b248d6272277eed9a58cf50fb8bc7d"}, + {file = "libcst-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8f26250f87ca849a7303ed7a4fd6b2c7ac4dec16b7d7e68ca6a476d7c9bfcdb"}, + {file = "libcst-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d37326bd6f379c64190a28947a586b949de3a76be00176b0732c8ee87d67ebe"}, + {file = "libcst-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d8cf974cfa2487b28f23f56c4bff90d550ef16505e58b0dca0493d5293784b"}, + {file = "libcst-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d1271403509b0a4ee6ff7917c2d33b5a015f44d1e208abb1da06ba93b2a378"}, + {file = "libcst-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bca1841693941fdd18371824bb19a9702d5784cd347cb8231317dbdc7062c5bc"}, + {file = "libcst-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f36f592e035ef84f312a12b75989dde6a5f6767fe99146cdae6a9ee9aff40dd0"}, + {file = "libcst-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f561c9a84eca18be92f4ad90aa9bd873111efbea995449301719a1a7805dbc5c"}, + {file = "libcst-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97fbc73c87e9040e148881041fd5ffa2a6ebf11f64b4ccb5b52e574b95df1a15"}, + {file = "libcst-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99fdc1929703fd9e7408aed2e03f58701c5280b05c8911753a8d8619f7dfdda5"}, + {file = "libcst-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bf69cbbab5016d938aac4d3ae70ba9ccb3f90363c588b3b97be434e6ba95403"}, + {file = "libcst-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fe41b33aa73635b1651f64633f429f7aa21f86d2db5748659a99d9b7b1ed2a90"}, + {file = "libcst-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73c086705ed34dbad16c62c9adca4249a556c1b022993d511da70ea85feaf669"}, + {file = "libcst-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a07ecfabbbb8b93209f952a365549e65e658831e9231649f4f4e4263cad24b1"}, + {file = "libcst-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c653d9121d6572d8b7f8abf20f88b0a41aab77ff5a6a36e5a0ec0f19af0072e8"}, + {file = "libcst-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f1cd308a4c2f71d5e4eec6ee693819933a03b78edb2e4cc5e3ad1afd5fb3f07"}, + {file = "libcst-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8afb6101b8b3c86c5f9cec6b90ab4da16c3c236fe7396f88e8b93542bb341f7c"}, + {file = "libcst-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:d22d1abfe49aa60fc61fa867e10875a9b3024ba5a801112f4d7ba42d8d53242e"}, + {file = "libcst-1.1.0.tar.gz", hash = "sha256:0acbacb9a170455701845b7e940e2d7b9519db35a86768d86330a0b0deae1086"}, ] [package.dependencies] @@ -1592,7 +1517,7 @@ typing-extensions = ">=3.7.4.2" typing-inspect = ">=0.4.0" [package.extras] -dev = ["Sphinx (>=5.1.1)", "black (==23.1.0)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==0.1.1)", "flake8 (>=3.7.8,<5)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.2)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<0.14)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.10)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.1.0)", "usort (==1.0.6)"] +dev = ["Sphinx (>=5.1.1)", "black (==23.9.1)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==2.0.0.post1)", "flake8 (>=3.7.8,<5)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.2)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<0.16)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.2.0)", "usort (==1.0.7)"] [[package]] name = "lxml" @@ -1704,19 +1629,16 @@ source = ["Cython (>=0.29.35)"] [[package]] name = "markdown" -version = "3.5" +version = "3.5.1" description = "Python implementation of John Gruber's Markdown." category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5-py3-none-any.whl", hash = "sha256:4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3"}, - {file = "Markdown-3.5.tar.gz", hash = "sha256:a807eb2e4778d9156c8f07876c6e4d50b5494c5665c4834f67b06459dfd877b3"}, + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, ] -[package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} - [package.extras] docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] @@ -1759,14 +1681,14 @@ files = [ [[package]] name = "mccabe" -version = "0.6.1" +version = "0.7.0" description = "McCabe checker, plugin for flake8" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] @@ -1783,14 +1705,14 @@ files = [ [[package]] name = "msal" -version = "1.24.1" +version = "1.25.0" description = "The Microsoft Authentication Library (MSAL) for Python library" category = "main" optional = false python-versions = ">=2.7" files = [ - {file = "msal-1.24.1-py2.py3-none-any.whl", hash = "sha256:ce4320688f95c301ee74a4d0e9dbcfe029a63663a8cc61756f40d0d0d36574ad"}, - {file = "msal-1.24.1.tar.gz", hash = "sha256:aa0972884b3c6fdec53d9a0bd15c12e5bd7b71ac1b66d746f54d128709f3f8f8"}, + {file = "msal-1.25.0-py2.py3-none-any.whl", hash = "sha256:386df621becb506bc315a713ec3d4d5b5d6163116955c7dde23622f156b81af6"}, + {file = "msal-1.25.0.tar.gz", hash = "sha256:f44329fdb59f4f044c779164a34474b8a44ad9e4940afbc4c3a3a2bbe90324d9"}, ] [package.dependencies] @@ -1859,7 +1781,6 @@ files = [ [package.dependencies] mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=4.1.0" [package.extras] @@ -1914,48 +1835,6 @@ files = [ {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, ] -[[package]] -name = "numpy" -version = "1.26.1" -description = "Fundamental package for array computing in Python" -category = "main" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "numpy-1.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af"}, - {file = "numpy-1.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575"}, - {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244"}, - {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67"}, - {file = "numpy-1.26.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2"}, - {file = "numpy-1.26.1-cp310-cp310-win32.whl", hash = "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297"}, - {file = "numpy-1.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab"}, - {file = "numpy-1.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a"}, - {file = "numpy-1.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9"}, - {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3"}, - {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974"}, - {file = "numpy-1.26.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c"}, - {file = "numpy-1.26.1-cp311-cp311-win32.whl", hash = "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b"}, - {file = "numpy-1.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53"}, - {file = "numpy-1.26.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f"}, - {file = "numpy-1.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24"}, - {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e"}, - {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124"}, - {file = "numpy-1.26.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c"}, - {file = "numpy-1.26.1-cp312-cp312-win32.whl", hash = "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66"}, - {file = "numpy-1.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7"}, - {file = "numpy-1.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e"}, - {file = "numpy-1.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617"}, - {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e"}, - {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908"}, - {file = "numpy-1.26.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5"}, - {file = "numpy-1.26.1-cp39-cp39-win32.whl", hash = "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104"}, - {file = "numpy-1.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f"}, - {file = "numpy-1.26.1.tar.gz", hash = "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe"}, -] - [[package]] name = "oauthlib" version = "3.2.2" @@ -2006,13 +1885,12 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, - {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, - {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, - {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, + {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, + {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, ] [[package]] @@ -2188,18 +2066,19 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co [[package]] name = "pluggy" -version = "0.13.1" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" @@ -2223,25 +2102,23 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "protobuf" -version = "4.24.4" +version = "4.25.0" description = "" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-4.24.4-cp310-abi3-win32.whl", hash = "sha256:ec9912d5cb6714a5710e28e592ee1093d68c5ebfeda61983b3f40331da0b1ebb"}, - {file = "protobuf-4.24.4-cp310-abi3-win_amd64.whl", hash = "sha256:1badab72aa8a3a2b812eacfede5020472e16c6b2212d737cefd685884c191085"}, - {file = "protobuf-4.24.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e61a27f362369c2f33248a0ff6896c20dcd47b5d48239cb9720134bef6082e4"}, - {file = "protobuf-4.24.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:bffa46ad9612e6779d0e51ae586fde768339b791a50610d85eb162daeb23661e"}, - {file = "protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:b493cb590960ff863743b9ff1452c413c2ee12b782f48beca77c8da3e2ffe9d9"}, - {file = "protobuf-4.24.4-cp37-cp37m-win32.whl", hash = "sha256:dbbed8a56e56cee8d9d522ce844a1379a72a70f453bde6243e3c86c30c2a3d46"}, - {file = "protobuf-4.24.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6b7d2e1c753715dcfe9d284a25a52d67818dd43c4932574307daf836f0071e37"}, - {file = "protobuf-4.24.4-cp38-cp38-win32.whl", hash = "sha256:02212557a76cd99574775a81fefeba8738d0f668d6abd0c6b1d3adcc75503dbe"}, - {file = "protobuf-4.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:2fa3886dfaae6b4c5ed2730d3bf47c7a38a72b3a1f0acb4d4caf68e6874b947b"}, - {file = "protobuf-4.24.4-cp39-cp39-win32.whl", hash = "sha256:b77272f3e28bb416e2071186cb39efd4abbf696d682cbb5dc731308ad37fa6dd"}, - {file = "protobuf-4.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:9fee5e8aa20ef1b84123bb9232b3f4a5114d9897ed89b4b8142d81924e05d79b"}, - {file = "protobuf-4.24.4-py3-none-any.whl", hash = "sha256:80797ce7424f8c8d2f2547e2d42bfbb6c08230ce5832d6c099a37335c9c90a92"}, - {file = "protobuf-4.24.4.tar.gz", hash = "sha256:5a70731910cd9104762161719c3d883c960151eea077134458503723b60e3667"}, + {file = "protobuf-4.25.0-cp310-abi3-win32.whl", hash = "sha256:5c1203ac9f50e4853b0a0bfffd32c67118ef552a33942982eeab543f5c634395"}, + {file = "protobuf-4.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:c40ff8f00aa737938c5378d461637d15c442a12275a81019cc2fef06d81c9419"}, + {file = "protobuf-4.25.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:cf21faba64cd2c9a3ed92b7a67f226296b10159dbb8fbc5e854fc90657d908e4"}, + {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:32ac2100b0e23412413d948c03060184d34a7c50b3e5d7524ee96ac2b10acf51"}, + {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:683dc44c61f2620b32ce4927de2108f3ebe8ccf2fd716e1e684e5a50da154054"}, + {file = "protobuf-4.25.0-cp38-cp38-win32.whl", hash = "sha256:1a3ba712877e6d37013cdc3476040ea1e313a6c2e1580836a94f76b3c176d575"}, + {file = "protobuf-4.25.0-cp38-cp38-win_amd64.whl", hash = "sha256:b2cf8b5d381f9378afe84618288b239e75665fe58d0f3fd5db400959274296e9"}, + {file = "protobuf-4.25.0-cp39-cp39-win32.whl", hash = "sha256:63714e79b761a37048c9701a37438aa29945cd2417a97076048232c1df07b701"}, + {file = "protobuf-4.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:d94a33db8b7ddbd0af7c467475fb9fde0c705fb315a8433c0e2020942b863a1f"}, + {file = "protobuf-4.25.0-py3-none-any.whl", hash = "sha256:1a53d6f64b00eecf53b65ff4a8c23dc95df1fa1e97bb06b8122e5a64f49fc90a"}, + {file = "protobuf-4.25.0.tar.gz", hash = "sha256:68f7caf0d4f012fd194a301420cf6aa258366144d814f358c5b32558228afa7c"}, ] [[package]] @@ -2267,18 +2144,6 @@ files = [ {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, ] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pyasn1" version = "0.5.0" @@ -2308,14 +2173,14 @@ pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.11.1" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, ] [[package]] @@ -2482,14 +2347,14 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyflakes" -version = "2.3.1" +version = "3.1.0" description = "passive checker of Python programs" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, ] [[package]] @@ -2509,63 +2374,71 @@ plugins = ["importlib-metadata"] [[package]] name = "pyjwt" -version = "2.4.0" +version = "2.8.0" description = "JSON Web Token implementation in Python" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"}, - {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.dependencies] -cryptography = {version = ">=3.3.1", optional = true, markers = "extra == \"crypto\""} +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} [package.extras] -crypto = ["cryptography (>=3.3.1)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.3.1)", "mypy", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "2.6.0" +version = "3.0.2" description = "python code static checker" category = "dev" optional = false -python-versions = ">=3.5.*" +python-versions = ">=3.8.0" files = [ - {file = "pylint-2.6.0-py3-none-any.whl", hash = "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"}, - {file = "pylint-2.6.0.tar.gz", hash = "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210"}, + {file = "pylint-3.0.2-py3-none-any.whl", hash = "sha256:60ed5f3a9ff8b61839ff0348b3624ceeb9e6c2a92c514d81c9cc273da3b6bcda"}, + {file = "pylint-3.0.2.tar.gz", hash = "sha256:0d4c286ef6d2f66c8bfb527a7f8a629009e42c99707dec821a03e1b51a4c1496"}, ] [package.dependencies] -astroid = ">=2.4.0,<=2.5" -colorama = {version = "*", markers = "sys_platform == \"win32\""} +astroid = ">=3.0.1,<=3.1.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, +] isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.7" -toml = ">=0.7.1" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pylint-django" -version = "2.0.13" +version = "2.5.5" description = "A Pylint plugin to help Pylint understand the Django web framework" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7,<4.0" files = [ - {file = "pylint-django-2.0.13.tar.gz", hash = "sha256:440beb814464928aedd2e21196bb6e47a83b63e2cbe886a701ba0f4a64206bbb"}, - {file = "pylint_django-2.0.13-py3-none-any.whl", hash = "sha256:d5d113605a64cf0e638b707d4cb42106e626f8851bc30a44d5b22bd698ad8483"}, + {file = "pylint_django-2.5.5-py3-none-any.whl", hash = "sha256:5abd5c2228e0e5e2a4cb6d0b4fc1d1cef1e773d0be911412f4dd4fc1a1a440b7"}, + {file = "pylint_django-2.5.5.tar.gz", hash = "sha256:2f339e4bf55776958283395c5139c37700c91bd5ef1d8251ef6ac88b5abbba9b"}, ] [package.dependencies] -pylint = ">=2.0" -pylint-plugin-utils = ">=0.5" +pylint = ">=2.0,<4" +pylint-plugin-utils = ">=0.8" [package.extras] -for-tests = ["coverage", "django-tables2", "factory-boy", "pytest"] -with-django = ["Django"] +with-django = ["Django (>=2.2)"] [[package]] name = "pylint-plugin-utils" @@ -2663,28 +2536,24 @@ files = [ [[package]] name = "pytest" -version = "6.2.1" +version = "7.4.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-6.2.1-py3-none-any.whl", hash = "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8"}, - {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" -py = ">=1.8.2" -toml = "*" +pluggy = ">=0.12,<2.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cache" @@ -2703,14 +2572,14 @@ pytest = ">=2.2" [[package]] name = "pytest-cov" -version = "3.0.0" +version = "4.1.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] [package.dependencies] @@ -2722,18 +2591,18 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-django" -version = "4.5.2" +version = "4.6.0" description = "A Django plugin for pytest." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "pytest-django-4.5.2.tar.gz", hash = "sha256:d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2"}, - {file = "pytest_django-4.5.2-py3-none-any.whl", hash = "sha256:c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e"}, + {file = "pytest-django-4.6.0.tar.gz", hash = "sha256:ebc12a64f822a1284a281caf434d693f96bff69a9b09c677f538ecaa2f470b37"}, + {file = "pytest_django-4.6.0-py3-none-any.whl", hash = "sha256:7e90a183dec8c715714864e5dc8da99bb219502d437a9769a3c9e524af57e43a"}, ] [package.dependencies] -pytest = ">=5.4.0" +pytest = ">=7.0.0" [package.extras] docs = ["sphinx", "sphinx-rtd-theme"] @@ -2741,19 +2610,21 @@ testing = ["Django", "django-configurations (>=2.0)"] [[package]] name = "pytest-factoryboy" -version = "2.0.3" +version = "2.6.0" description = "Factory Boy support for pytest." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "pytest-factoryboy-2.0.3.tar.gz", hash = "sha256:ffef3fb7ddec1299d3df0d334846259023f3d1da5ab887ad880139a8253a5a1a"}, + {file = "pytest_factoryboy-2.6.0-py3-none-any.whl", hash = "sha256:23facf586a1beedea03e875159001bfeb8393fb56ab104d87ad06f688d269e5b"}, + {file = "pytest_factoryboy-2.6.0.tar.gz", hash = "sha256:d09c37178693d8e594a96faf3c56e870b7753d2622710298b850ef79eb02d63d"}, ] [package.dependencies] factory_boy = ">=2.10.0" inflection = "*" -pytest = ">=3.3.2" +pytest = ">=6.2" +typing_extensions = "*" [[package]] name = "pytest-mock" @@ -2775,20 +2646,19 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "pytest-pylint" -version = "0.18.0" +version = "0.21.0" description = "pytest plugin to check source code with pylint" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "pytest-pylint-0.18.0.tar.gz", hash = "sha256:790c7a8019fab08e59bd3812db1657a01995a975af8b1c6ce95b9aa39d61da27"}, - {file = "pytest_pylint-0.18.0-py3-none-any.whl", hash = "sha256:b63aaf8b80ff33c8ceaa7f68323ed04102c7790093ccf6bdb261a4c2dc6fd564"}, + {file = "pytest-pylint-0.21.0.tar.gz", hash = "sha256:88764b8e1d5cfa18809248e0ccc2fc05035f08c35f0b0222ddcfea1c3c4e553e"}, + {file = "pytest_pylint-0.21.0-py3-none-any.whl", hash = "sha256:f10d9eaa72b9fbe624ee4b55da0481f56482eee0a467afc1ee3ae8b1fefbd0b4"}, ] [package.dependencies] -pylint = ">=2.3.0" -pytest = ">=5.4" -toml = ">=0.7.1" +pylint = ">=2.15.0" +pytest = ">=7.0" [[package]] name = "python-dateutil" @@ -2807,23 +2677,23 @@ six = ">=1.5" [[package]] name = "pythonit-toolkit" -version = "0.1.87" +version = "0.1.92" description = "" category = "main" optional = false -python-versions = ">=3.9,<4.0" +python-versions = ">=3.8,<4.0.0" files = [ - {file = "pythonit_toolkit-0.1.87-py3-none-any.whl", hash = "sha256:20015cdcef2b51b22d62201efecd24ae3d5c1a76d2696f623fd021ba892ee6be"}, - {file = "pythonit_toolkit-0.1.87.tar.gz", hash = "sha256:b0eef7c8341b2afda229f29aa710246c4653796a07337b051d9a1739edce1f2d"}, + {file = "pythonit_toolkit-0.1.92-py3-none-any.whl", hash = "sha256:9174afaddaf5572b13fb2b9357a3b530713f9346dd127e531281e532681e8b0c"}, + {file = "pythonit_toolkit-0.1.92.tar.gz", hash = "sha256:9563a287d9cae26ddb587301a025af8107ca93909f8bdcae4910ff6b8a303d6a"}, ] [package.dependencies] -boto3 = ">=1.17.39,<2.0.0" -httpx = ">=0.20.0,<0.21.0" +boto3 = ">=1.28.9,<2.0.0" +httpx = ">=0.25.1,<0.26.0" pydantic = "*" -PyJWT = "2.4.0" -sentry-sdk = ">=1.1.0,<2.0.0" -starlette = ">=0.14.2,<0.15.0" +PyJWT = ">=2.8.0,<3.0.0" +sentry-sdk = ">=1.28.1,<2.0.0" +starlette = ">=0.30.0,<0.31.0" strawberry-graphql = "*" [[package]] @@ -2875,6 +2745,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2882,8 +2753,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2900,6 +2778,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2907,6 +2786,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2993,39 +2873,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "respx" -version = "0.18.2" -description = "A utility for mocking out the Python HTTPX and HTTP Core libraries." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "respx-0.18.2-py2.py3-none-any.whl", hash = "sha256:09fb4fc49f3900fb124d13b188c90355a45efde29fd18c5e2f513804cf7f84c6"}, - {file = "respx-0.18.2.tar.gz", hash = "sha256:d39ff874f514dc4293b2e1f7c5e6c8c2ad871ee02ef49b3f57535257008495d8"}, -] - -[package.dependencies] -httpx = ">=0.20.0" - -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] - -[package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - [[package]] name = "rich" version = "13.6.0" @@ -3062,14 +2909,14 @@ pyasn1 = ">=0.1.3" [[package]] name = "s3transfer" -version = "0.6.2" +version = "0.7.0" description = "An Amazon S3 Transfer Manager" category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, - {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, + {file = "s3transfer-0.7.0-py3-none-any.whl", hash = "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a"}, + {file = "s3transfer-0.7.0.tar.gz", hash = "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"}, ] [package.dependencies] @@ -3239,18 +3086,21 @@ test = ["pytest", "pytest-cov"] [[package]] name = "starlette" -version = "0.14.2" +version = "0.30.0" description = "The little ASGI library that shines." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "starlette-0.14.2-py3-none-any.whl", hash = "sha256:3c8e48e52736b3161e34c9f0e8153b4f32ec5d8995a3ee1d59410d92f75162ed"}, - {file = "starlette-0.14.2.tar.gz", hash = "sha256:7d49f4a27f8742262ef1470608c59ddbc66baf37c148e938c7038e6bc7a998aa"}, + {file = "starlette-0.30.0-py3-none-any.whl", hash = "sha256:cb15a5dfbd8de70c999bd1ae4b7e1ba625d74520bc57b28cc4086c7969431f2d"}, + {file = "starlette-0.30.0.tar.gz", hash = "sha256:9cf6bd5f2fbc091c2f22701f9b7f7dfcbd304a567845cffbf89d706543fd2a03"}, ] +[package.dependencies] +anyio = ">=3.4.0,<5" + [package.extras] -full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] [[package]] name = "strawberry-graphql" @@ -3289,14 +3139,14 @@ starlite = ["starlite (>=1.48.0)"] [[package]] name = "stripe" -version = "7.1.0" +version = "7.3.0" description = "Python bindings for the Stripe API" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "stripe-7.1.0-py2.py3-none-any.whl", hash = "sha256:efd1e54825752c41bb311497cb5b6ae745464a57ca63bbe2847984a2409bcb0a"}, - {file = "stripe-7.1.0.tar.gz", hash = "sha256:9cc2632230d5742eeb779af2b41c1510e724f498a296dfb40507de98d563f9a2"}, + {file = "stripe-7.3.0-py2.py3-none-any.whl", hash = "sha256:77bd0c3020ef7a5f3005127152898f6aabfe6056d11f1175902c50158911e332"}, + {file = "stripe-7.3.0.tar.gz", hash = "sha256:4288d180cf63a60cb4803282830f862a8954e45207eb6e1d0870171b15234c94"}, ] [package.dependencies] @@ -3351,7 +3201,6 @@ files = [ [package.dependencies] protobuf = ">=3.20" -python-dateutil = {version = ">=2.8.2,<3.0.0", markers = "python_version < \"3.11\""} types-protobuf = ">=3.20" typing-extensions = ">=4.2.0,<5.0.0" @@ -3448,27 +3297,15 @@ doc = ["sphinx", "sphinx_rtd_theme"] test = ["flake8", "isort", "pytest"] [[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - -[[package]] -name = "tomli" -version = "1.2.3" -description = "A lil' TOML parser" +name = "tomlkit" +version = "0.12.2" +description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomlkit-0.12.2-py3-none-any.whl", hash = "sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0"}, + {file = "tomlkit-0.12.2.tar.gz", hash = "sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977"}, ] [[package]] @@ -3658,17 +3495,6 @@ attrs = "*" [package.extras] test = ["pytest"] -[[package]] -name = "wrapt" -version = "1.12.1" -description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, -] - [[package]] name = "xlrd" version = "2.0.1" @@ -3698,26 +3524,10 @@ files = [ {file = "xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88"}, ] -[[package]] -name = "zipp" -version = "3.17.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - [extras] lambda = ["awslambdaric"] [metadata] lock-version = "2.0" -python-versions = "^3.9" -content-hash = "8e68ec59b40ccd302bc28c6405b6d0420d91c32542e64bec94c865c3f972779e" +python-versions = "^3.11" +content-hash = "4d88292ae7bf91f4576ee4645e0d71d64b9c43efb7bfc33e8792a3b4120272a8" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 958ce73948..5459c07de5 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Python Italia"] license = "MIT" [tool.poetry.dependencies] -python = "^3.9" +python = "^3.11" Django = "4.2.3" django-environ = "0.10.0" django-model-utils = "=4.1.1" @@ -24,7 +24,7 @@ django-ordered-model = "3.5" uWSGI = "2.0.21" django-storages = { extras = ["azure"], version = "^1.13.2" } sentry-sdk = "1.32.0" -boto3 = "1.26.101" +boto3 = "^1.28.78" pycountry = "^19.8" countries = "^0.2.0" django-ses = "^1.0.3" @@ -36,7 +36,7 @@ unidecode = "^1.1.1" jsonschema = "^3.2.0" strawberry-graphql = "0.211.1" Werkzeug = "^1.0.1" -pythonit-toolkit = "0.1.87" +pythonit-toolkit = "0.1.92" django-import-export = "^3.2.0" awslambdaric = { version = "^2.0.4", optional = true } azure-identity = "^1.12.0" @@ -57,25 +57,6 @@ argon2-cffi = "^23.1.0" stripe = "^7.0.0" djangorestframework = "^3.14.0" -[tool.poetry.dev-dependencies] -pylint = "=2.6.0" -pylint-django = "=2.0.13" -pytest = "6.2.1" -pytest-cov = "=3.0.0" -pytest-django = "=4.5.2" -pytest-pylint = "=0.18.0" -pytest-factoryboy = "=2.0.3" -factory-boy = "=3.1.0" -pdbpp = "^0.10.2" -flake8 = "^3.7" -black = { version = "^21.12b0", allow-prereleases = true } -requests-mock = "^1.7" -pytest-mock = "^3.4" -pytest-cache = "^1.0" -time-machine = "^2.4.1" -respx = "0.18.2" -rich = "^13.3.1" -libcst = "^0.4.9" [tool.poetry.extras] lambda = ["awslambdaric"] @@ -83,6 +64,23 @@ lambda = ["awslambdaric"] [tool.poetry.group.dev.dependencies] mypy = "^1.2.0" typer = "^0.9.0" +pylint = "=3.0.2" +pylint-django = "=2.5.5" +pytest = "7.4.3" +pytest-cov = "=4.1.0" +pytest-django = "=4.6.0" +pytest-pylint = "=0.21.0" +pytest-factoryboy = "=2.6.0" +factory-boy = "=3.3.0" +pdbpp = "^0.10.3" +flake8 = "^6.1.0" +black = "23.10.1" +requests-mock = "^1.11.0" +pytest-mock = "^3.12.0" +pytest-cache = "^1.0" +time-machine = "^2.13.0" +rich = "^13.6.0" +libcst = "^1.1.0" [build-system] requires = ["poetry>=0.12"] @@ -91,4 +89,4 @@ build-backend = "poetry.masonry.api" [tool.ruff] line-length = 88 exclude = ["migrations"] -target-version = "py39" +target-version = "py311" diff --git a/backend/voting/tests/test_helpers.py b/backend/voting/tests/test_helpers.py index cffcf8c2ec..f74ae09d1b 100644 --- a/backend/voting/tests/test_helpers.py +++ b/backend/voting/tests/test_helpers.py @@ -2,7 +2,7 @@ MembershipFactory, ) import pytest -import respx +from association_membership.enums import MembershipStatus from voting.helpers import check_if_user_can_vote @@ -44,7 +44,10 @@ def test_user_can_vote_if_is_a_member_of_python_italia( user, conference, mocker, is_member ): mocker.patch("voting.helpers.user_has_admission_ticket", return_value=False) - MembershipFactory(user=user, status="ACTIVE" if is_member else "PENDING") + MembershipFactory( + user=user, + status=MembershipStatus.ACTIVE if is_member else MembershipStatus.PENDING, + ) assert check_if_user_can_vote(user, conference) == is_member @@ -65,5 +68,4 @@ def side_effect(email, event_organizer, event_slug, additional_events): pretix_event_id="event-slug", ) - with respx.mock: - assert check_if_user_can_vote(user, conference) is True + assert check_if_user_can_vote(user, conference) is True diff --git a/backend/voting/tests/test_schema.py b/backend/voting/tests/test_schema.py index ba2dc4608c..1263c53aff 100644 --- a/backend/voting/tests/test_schema.py +++ b/backend/voting/tests/test_schema.py @@ -1,4 +1,3 @@ -import respx from pytest import mark @@ -46,25 +45,20 @@ def test_cannot_get_my_vote_without_ticket( json={"user_has_admission_ticket": False}, ) - with respx.mock as mock: - mock.post(f"{settings.ASSOCIATION_BACKEND_SERVICE}/internal-api").respond( - json={"data": {"userIdIsMember": False}} - ) - - graphql_client.force_login(user) - response = graphql_client.query( - """query MyVote($conference: String!) { - submissions(code: $conference) { - items { - myVote { - value - } + graphql_client.force_login(user) + response = graphql_client.query( + """query MyVote($conference: String!) { + submissions(code: $conference) { + items { + myVote { + value } } } - """, - variables={"conference": vote.submission.conference.code}, - ) + } + """, + variables={"conference": vote.submission.conference.code}, + ) assert ( response["errors"][0]["message"] @@ -83,24 +77,20 @@ def test_cannot_get_my_vote_unlogged( f"{settings.PRETIX_API}organizers/{conference.pretix_organizer_id}/events/{conference.pretix_event_id}/tickets/attendee-has-ticket/", json={"user_has_admission_ticket": False}, ) - with respx.mock as mock: - mock.post(f"{settings.ASSOCIATION_BACKEND_SERVICE}/internal-api").respond( - json={"data": {"userIdIsMember": False}} - ) - - response = graphql_client.query( - """query MyVote($conference: String!) { - submissions(code: $conference) { - items { - myVote { - value - } + + response = graphql_client.query( + """query MyVote($conference: String!) { + submissions(code: $conference) { + items { + myVote { + value } } } - """, - variables={"conference": vote.submission.conference.code}, - ) + } + """, + variables={"conference": vote.submission.conference.code}, + ) assert response["errors"][0]["message"] == "User not logged in" assert response["errors"][0]["path"] == ["submissions"] @@ -118,25 +108,20 @@ def test_get_my_vote_when_the_user_never_voted( json={"user_has_admission_ticket": True}, ) - with respx.mock as mock: - mock.post(f"{settings.ASSOCIATION_BACKEND_SERVICE}/internal-api").respond( - json={"data": {"userIdIsMember": False}} - ) - - graphql_client.force_login(user) + graphql_client.force_login(user) - response = graphql_client.query( - """query MyVote($conference: String!) { - submissions(code: $conference) { - items { - myVote { - value - } + response = graphql_client.query( + """query MyVote($conference: String!) { + submissions(code: $conference) { + items { + myVote { + value } } } - """, - variables={"conference": conference.code}, - ) + } + """, + variables={"conference": conference.code}, + ) assert response["data"]["submissions"]["items"][0]["myVote"] is None diff --git a/backend/voting/tests/test_send_vote.py b/backend/voting/tests/test_send_vote.py index e736c783e1..2f1c0e3263 100644 --- a/backend/voting/tests/test_send_vote.py +++ b/backend/voting/tests/test_send_vote.py @@ -1,4 +1,3 @@ -import respx from django.conf import settings from pytest import mark, raises @@ -165,11 +164,7 @@ def test_cannot_vote_without_a_ticket_or_membership( json={"user_has_admission_ticket": False}, ) - with respx.mock as mock: - mock.post(f"{settings.ASSOCIATION_BACKEND_SERVICE}/internal-api").respond( - json={"data": {"userIdIsMember": False}} - ) - resp, _ = _submit_vote(graphql_client, submission, value_index=3) + resp, _ = _submit_vote(graphql_client, submission, value_index=3) assert not resp.get("errors") assert resp["data"]["sendVote"]["__typename"] == "SendVoteErrors"