From 3346c8f055f3ab846a72485f506fe372052bb5f9 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 22 Aug 2024 21:41:11 -0500 Subject: [PATCH 01/25] app consume one_time token --- breathecode/authenticate/models.py | 21 ++- .../tests/urls/tests_app_token.py | 177 ++++++++++++++++++ breathecode/authenticate/urls.py | 2 + breathecode/authenticate/views.py | 36 ++++ conftest.py | 69 ++++++- 5 files changed, 300 insertions(+), 5 deletions(-) create mode 100644 breathecode/authenticate/tests/urls/tests_app_token.py diff --git a/breathecode/authenticate/models.py b/breathecode/authenticate/models.py index 72e26110a..4deb0ce89 100644 --- a/breathecode/authenticate/models.py +++ b/breathecode/authenticate/models.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Any +from typing import Tuple, TypedDict, Unpack import rest_framework.authtoken.models from django import forms @@ -530,6 +530,15 @@ class CredentialsGoogle(models.Model): updated_at = models.DateTimeField(auto_now=True, editable=False) +class TokenGetOrCreateArgs(TypedDict): + hours_length: int + expires_at: datetime + + +class TokenFilterArgs(TypedDict): + token_type: str + + class Token(rest_framework.authtoken.models.Token): """Bearer Token that support different types like `'login'`, `'temporal'` or `'permanent'`.""" @@ -563,7 +572,7 @@ def delete_expired_tokens() -> None: Token.objects.filter(expires_at__lt=utc_now).delete() @classmethod - def get_or_create(cls, user, token_type: str, **kwargs: Any): + def get_or_create(cls, user, token_type: str, **kwargs: Unpack[TokenGetOrCreateArgs]) -> Tuple["Token", bool]: utc_now = timezone.now() kwargs["token_type"] = token_type @@ -606,12 +615,16 @@ def get_or_create(cls, user, token_type: str, **kwargs: Any): return token, created @classmethod - def get_valid(cls, token: str): + def get_valid(cls, token: str, **kwargs: Unpack[TokenFilterArgs]) -> "Token | None": utc_now = timezone.now() cls.delete_expired_tokens() # find among any non-expired token - return Token.objects.filter(key=token).filter(Q(expires_at__gt=utc_now) | Q(expires_at__isnull=True)).first() + return ( + Token.objects.filter(key=token, **kwargs) + .filter(Q(expires_at__gt=utc_now) | Q(expires_at__isnull=True)) + .first() + ) @classmethod def validate_and_destroy(cls, hash: str) -> User: diff --git a/breathecode/authenticate/tests/urls/tests_app_token.py b/breathecode/authenticate/tests/urls/tests_app_token.py new file mode 100644 index 000000000..905b72583 --- /dev/null +++ b/breathecode/authenticate/tests/urls/tests_app_token.py @@ -0,0 +1,177 @@ +""" +Test cases for /user +""" + +from datetime import datetime, timedelta +from typing import Callable +from unittest.mock import MagicMock + +import pytest +from django.urls.base import reverse_lazy +from rest_framework import status + +from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode +from capyc.rest_framework import pytest as capy + + +def credentials_github_serializer(credentials_github): + return { + "avatar_url": credentials_github.avatar_url, + "name": credentials_github.name, + "username": credentials_github.username, + } + + +def profile_serializer(credentials_github): + return { + "avatar_url": credentials_github.avatar_url, + } + + +def get_serializer(user, credentials_github=None, profile=None, **data): + return { + "email": user.email, + "username": user.username, + "first_name": user.first_name, + "github": credentials_github_serializer(credentials_github) if credentials_github else None, + "id": user.id, + "last_name": user.last_name, + "profile": profile_serializer(profile) if profile else None, + **data, + } + + +@pytest.fixture(autouse=True) +def setup(db, monkeypatch): + from linked_services.django.actions import reset_app_cache + + reset_app_cache() + monkeypatch.setattr("linked_services.django.tasks.check_credentials.delay", MagicMock()) + yield + + +def test_no_auth(bc: Breathecode, client: capy.Client): + url = reverse_lazy("authenticate:app_token") + response = client.post(url) + + json = response.json() + expected = { + "detail": "no-authorization-header", + "status_code": status.HTTP_401_UNAUTHORIZED, + } + + assert json == expected + assert response.status_code == status.HTTP_401_UNAUTHORIZED + assert bc.database.list_of("authenticate.Token") == [] + + +def test_no_data(bc: Breathecode, client: capy.Client, sign_jwt_link: Callable[..., None]): + app = {"require_an_agreement": False, "slug": "rigobot"} + model = bc.database.create( + app=app, + first_party_credentials={ + "app": { + "rigobot": 1, + }, + }, + ) + + sign_jwt_link(client, model.app) + + url = reverse_lazy("authenticate:app_token") + response = client.post(url) + + json = response.json() + expected = {"detail": "token-not-provided", "status_code": 400} + + assert json == expected + assert response.status_code == status.HTTP_400_BAD_REQUEST + assert bc.database.list_of("authenticate.Token") == [] + + +@pytest.mark.parametrize("token_type", [None, "login", "temporal", "permanent"]) +@pytest.mark.parametrize("delta", [-timedelta(hours=10), timedelta(0), timedelta(hours=10)]) +def test_bad_token( + bc: Breathecode, + client: capy.Client, + sign_jwt_link: Callable[..., None], + token_type: str, + delta: timedelta, + utc_now: datetime, + format: capy.Format, +): + extra = {} + app = {"require_an_agreement": False, "slug": "rigobot"} + + if token_type: + extra["user"] = 1 + expires_at = None + if delta: + expires_at = utc_now + delta + + extra["token"] = {"token_type": token_type, "key": "1234", "expires_at": expires_at} + + model = bc.database.create( + app=app, + first_party_credentials={ + "app": { + "rigobot": 1, + }, + }, + **extra, + ) + + sign_jwt_link(client, model.app) + + url = reverse_lazy("authenticate:app_token") + data = {"token": "1234"} + response = client.post(url, data) + + json = response.json() + expected = {"detail": "invalid-token", "status_code": 401} + + assert json == expected + assert response.status_code == status.HTTP_401_UNAUTHORIZED + if "token" in extra and (token_type == "permanent" or delta >= timedelta(0)): + assert bc.database.list_of("authenticate.Token") == [format.to_obj_repr(model.token)] + else: + assert bc.database.list_of("authenticate.Token") == [] + + +@pytest.mark.parametrize("delta", [timedelta(0), timedelta(hours=10)]) +def test_get_token( + bc: Breathecode, client: capy.Client, sign_jwt_link: Callable[..., None], utc_now: datetime, delta: timedelta +): + app = {"require_an_agreement": False, "slug": "rigobot"} + expires_at = None + if delta: + expires_at = utc_now + delta + model = bc.database.create( + user=1, + token={"token_type": "one_time", "key": "1234", "expires_at": expires_at}, + app=app, + first_party_credentials={ + "app": { + "rigobot": 1, + }, + }, + ) + + sign_jwt_link(client, model.app) + + url = reverse_lazy("authenticate:app_token") + data = {"token": "1234"} + response = client.post(url, data) + + json = response.json() + expected = { + "email": model.user.email, + "expires_at": None, + "token": "1234", + "token_type": "one_time", + "user_id": 1, + } + + assert json == expected + assert response.status_code == status.HTTP_200_OK + assert bc.database.list_of("authenticate.Token") == [] diff --git a/breathecode/authenticate/urls.py b/breathecode/authenticate/urls.py index 4fe028076..d97dcd0e1 100644 --- a/breathecode/authenticate/urls.py +++ b/breathecode/authenticate/urls.py @@ -27,6 +27,7 @@ AcademyInviteView, AcademyTokenView, AppSync, + AppTokenView, AppUserAgreementView, AppUserView, ConfirmEmailView, @@ -165,4 +166,5 @@ path("app/user/", AppUserView.as_view(), name="app_user_id"), path("app/webhook", app_webhook, name="app_webhook"), path("me/app//sync", AppSync.as_view(), name="me_app_slug_sync"), + path("app/token", AppTokenView.as_view(), name="app_token"), ] diff --git a/breathecode/authenticate/views.py b/breathecode/authenticate/views.py index 0c8f7739e..a73e7e393 100644 --- a/breathecode/authenticate/views.py +++ b/breathecode/authenticate/views.py @@ -2715,3 +2715,39 @@ async def post(self, request, app_slug: str): } return await s.post("/v1/auth/app/user", data) + + +# app/user/:id +class AppTokenView(APIView): + permission_classes = [AllowAny] + extensions = APIViewExtensions(paginate=True) + + @scope(["read:token"]) + def post(self, request: LinkedHttpRequest, app: LinkedApp, token: LinkedToken, user_id=None): + lang = get_user_language(request) + + hash = request.data.get("token") + if not hash: + raise ValidationException( + translation(lang, en="Token not provided", es="Token no proporcionado", slug="token-not-provided"), + code=400, + ) + + t = Token.get_valid(hash, token_type="one_time") + if t is None: + raise ValidationException( + translation(lang, en="Invalid token", es="Token inválido", slug="invalid-token"), + code=401, + ) + + t.delete() + + return Response( + { + "token": t.key, + "token_type": t.token_type, + "expires_at": t.expires_at, + "user_id": t.user.pk, + "email": t.user.email, + } + ) diff --git a/conftest.py b/conftest.py index 521be6a3e..f97d846d7 100644 --- a/conftest.py +++ b/conftest.py @@ -1,10 +1,12 @@ import os -from typing import Generator +from typing import Generator, Optional from unittest.mock import MagicMock, patch +import jwt import pytest from django.core.cache import cache from django.utils import timezone +from rest_framework.test import APIClient from breathecode.notify.utils.hook_manager import HookManagerClass from breathecode.utils.exceptions import TestError @@ -244,3 +246,68 @@ def wrapper(first: dict | list[dict], second: dict | list[dict]) -> None: assert original == second yield wrapper + + +@pytest.fixture +def sign_jwt_link(): + + def wrapper( + client: APIClient, + app, + user_id: Optional[int] = None, + reverse: bool = False, + ): + """ + Set Json Web Token in the request. + + Usage: + + ```py + # setup the database + model = self.bc.database.create(app=1, user=1) + + # that setup the request to use the credential of user passed + self.bc.request.authenticate(model.app, model.user.id) + ``` + + Keywords arguments: + + - user: a instance of user model `breathecode.authenticate.models.User` + """ + from datetime import datetime, timedelta + + from django.utils import timezone + + now = timezone.now() + + # https://datatracker.ietf.org/doc/html/rfc7519#section-4 + payload = { + "sub": user_id, + "iss": os.getenv("API_URL", "http://localhost:8000"), + "app": app.slug, + "aud": "breathecode", + "exp": datetime.timestamp(now + timedelta(minutes=2)), + "iat": datetime.timestamp(now) - 1, + "typ": "JWT", + } + + if reverse: + payload["aud"] = app.slug + payload["app"] = "breathecode" + + if app.algorithm == "HMAC_SHA256": + + token = jwt.encode(payload, bytes.fromhex(app.private_key), algorithm="HS256") + + elif app.algorithm == "HMAC_SHA512": + token = jwt.encode(payload, bytes.fromhex(app.private_key), algorithm="HS512") + + elif app.algorithm == "ED25519": + token = jwt.encode(payload, bytes.fromhex(app.private_key), algorithm="EdDSA") + + else: + raise Exception("Algorithm not implemented") + + client.credentials(HTTP_AUTHORIZATION=f"Link App={app.slug},Token={token}") + + yield wrapper From 4b18dc287858543e6318e24831b7dc5af30e4bcc Mon Sep 17 00:00:00 2001 From: jefer94 Date: Fri, 23 Aug 2024 16:02:56 -0500 Subject: [PATCH 02/25] add a validation --- .../tests/urls/tests_app_token.py | 51 +++++++++---------- breathecode/authenticate/views.py | 11 +++- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/breathecode/authenticate/tests/urls/tests_app_token.py b/breathecode/authenticate/tests/urls/tests_app_token.py index 905b72583..ce7609eb7 100644 --- a/breathecode/authenticate/tests/urls/tests_app_token.py +++ b/breathecode/authenticate/tests/urls/tests_app_token.py @@ -14,33 +14,6 @@ from capyc.rest_framework import pytest as capy -def credentials_github_serializer(credentials_github): - return { - "avatar_url": credentials_github.avatar_url, - "name": credentials_github.name, - "username": credentials_github.username, - } - - -def profile_serializer(credentials_github): - return { - "avatar_url": credentials_github.avatar_url, - } - - -def get_serializer(user, credentials_github=None, profile=None, **data): - return { - "email": user.email, - "username": user.username, - "first_name": user.first_name, - "github": credentials_github_serializer(credentials_github) if credentials_github else None, - "id": user.id, - "last_name": user.last_name, - "profile": profile_serializer(profile) if profile else None, - **data, - } - - @pytest.fixture(autouse=True) def setup(db, monkeypatch): from linked_services.django.actions import reset_app_cache @@ -65,6 +38,30 @@ def test_no_auth(bc: Breathecode, client: capy.Client): assert bc.database.list_of("authenticate.Token") == [] +def test_external_app(bc: Breathecode, client: capy.Client, sign_jwt_link: Callable[..., None]): + app = {"require_an_agreement": True, "slug": "rigobot"} + model = bc.database.create( + app=app, + first_party_credentials={ + "app": { + "rigobot": 1, + }, + }, + ) + + sign_jwt_link(client, model.app) + + url = reverse_lazy("authenticate:app_token") + response = client.post(url) + + json = response.json() + expected = {"detail": "from-external-app", "status_code": 400} + + assert json == expected + assert response.status_code == status.HTTP_400_BAD_REQUEST + assert bc.database.list_of("authenticate.Token") == [] + + def test_no_data(bc: Breathecode, client: capy.Client, sign_jwt_link: Callable[..., None]): app = {"require_an_agreement": False, "slug": "rigobot"} model = bc.database.create( diff --git a/breathecode/authenticate/views.py b/breathecode/authenticate/views.py index a73e7e393..d26c1eb61 100644 --- a/breathecode/authenticate/views.py +++ b/breathecode/authenticate/views.py @@ -2717,7 +2717,6 @@ async def post(self, request, app_slug: str): return await s.post("/v1/auth/app/user", data) -# app/user/:id class AppTokenView(APIView): permission_classes = [AllowAny] extensions = APIViewExtensions(paginate=True) @@ -2726,6 +2725,16 @@ class AppTokenView(APIView): def post(self, request: LinkedHttpRequest, app: LinkedApp, token: LinkedToken, user_id=None): lang = get_user_language(request) + if app.require_an_agreement: + raise ValidationException( + translation( + lang, + en="Can't get tokens from an external app", + es="No se puede obtener tokens desde una aplicación externa", + slug="from-external-app", + ), + ) + hash = request.data.get("token") if not hash: raise ValidationException( From 01ed846148f5f71a88967fe3481b93cc7559e40a Mon Sep 17 00:00:00 2001 From: gustavomm19 Date: Mon, 26 Aug 2024 16:12:49 +0000 Subject: [PATCH 03/25] add expandable serializer by querystring --- breathecode/registry/serializers.py | 36 +++++++++++++++++++++++++---- breathecode/registry/views.py | 13 +++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/breathecode/registry/serializers.py b/breathecode/registry/serializers.py index 4bc6a35c3..607dacf64 100644 --- a/breathecode/registry/serializers.py +++ b/breathecode/registry/serializers.py @@ -1,5 +1,6 @@ -from django.utils import timezone from urllib.parse import urlparse + +from django.utils import timezone from rest_framework import serializers, status from slugify import slugify @@ -416,16 +417,41 @@ def get_technologies(self, obj): return ParentAssetTechnologySerializer(techs, many=True).data -class AssetAndTechnologySerializer(AssetMidSerializer): +class AssetExpandableSerializer(AssetMidSerializer): - technologies = serpy.MethodField() - - def get_technologies(self, obj): + def format_technologies(self, obj): techs = AssetTechnology.objects.filter( id__in=obj.technologies.filter(visibility__in=["PUBLIC", "UNLISTED"], is_deprecated=False) ) return ParentAssetTechnologySerializer(techs, many=True).data + def __init__(self, *args, expand="", **kwargs): + super().__init__(*args, **kwargs) + self.expand = expand + + def to_value(self, instance): + """ + Override the to_value method to conditionally add fields based on custom arguments. + """ + data = super().to_value(instance) + + # Conditionally add fields based on the custom arguments + if self.expand is not None: + for elem in data: + filter = [e for e in instance if e.slug == elem["slug"]] + obj = filter[0] + if "technologies" in self.expand: + elem["technologies"] = self.format_technologies(obj) + + if "readme" in self.expand: + readme = obj.get_readme(parse=True, remove_frontmatter=True) + elem["readme"] = { + "decoded": readme["decoded"] if "decoded" in readme else None, + "html": readme["html"] if "html" in readme else None, + } + + return data + class AssetTechnologySerializer(ParentAssetTechnologySerializer): parent = ParentAssetTechnologySerializer(required=False) diff --git a/breathecode/registry/views.py b/breathecode/registry/views.py index 6def5526e..d8e62f69f 100644 --- a/breathecode/registry/views.py +++ b/breathecode/registry/views.py @@ -2,7 +2,7 @@ import os import re from pathlib import Path -from slugify import slugify + import requests from circuitbreaker import CircuitBreakerError from django.core.validators import URLValidator @@ -15,6 +15,7 @@ from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.views import APIView +from slugify import slugify from breathecode.admissions.models import Academy from breathecode.authenticate.actions import get_user_language @@ -26,7 +27,6 @@ from breathecode.utils.api_view_extensions.api_view_extensions import APIViewExtensions from breathecode.utils.i18n import translation from breathecode.utils.views import render_message -from .utils import is_url from capyc.rest_framework.exceptions import ValidationException from .actions import ( @@ -56,11 +56,11 @@ AcademyAssetSerializer, AcademyCommentSerializer, AssetAliasSerializer, - AssetAndTechnologySerializer, AssetBigAndTechnologyPublishedSerializer, AssetBigSerializer, AssetBigTechnologySerializer, AssetCategorySerializer, + AssetExpandableSerializer, AssetImageSmallSerializer, AssetKeywordBigSerializer, AssetKeywordSerializer, @@ -86,6 +86,7 @@ VariableSmallSerializer, ) from .tasks import async_pull_from_github +from .utils import is_url logger = logging.getLogger(__name__) @@ -706,10 +707,12 @@ def get(self, request, asset_slug=None): items = items.filter(query, **lookup, visibility="PUBLIC").distinct() items = handler.queryset(items) + expand = self.request.GET.get("expand") + if "big" in self.request.GET: serializer = AssetMidSerializer(items, many=True) - elif "expand" in self.request.GET and self.request.GET.get("expand") == "technologies": - serializer = AssetAndTechnologySerializer(items, many=True) + elif expand is not None: + serializer = AssetExpandableSerializer(items, many=True, expand=expand.split(",")) else: serializer = AssetSerializer(items, many=True) From d45625574d5dd05ff683ab29fc65d231123a8aa2 Mon Sep 17 00:00:00 2001 From: gustavomm19 Date: Tue, 27 Aug 2024 09:47:12 +0000 Subject: [PATCH 04/25] add tests to expandable serializer --- .../registry/tests/urls/v1/tests_asset.py | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/breathecode/registry/tests/urls/v1/tests_asset.py b/breathecode/registry/tests/urls/v1/tests_asset.py index 20bb8d674..1288da255 100644 --- a/breathecode/registry/tests/urls/v1/tests_asset.py +++ b/breathecode/registry/tests/urls/v1/tests_asset.py @@ -102,6 +102,9 @@ def get_mid_serializer(asset, data={}): } +readme = "LS0tCnRpdGxlOiAiV29ya2luZyB3aXRoIG9yIG1hbmlwdWxhdGluZyBzdHJpbmdzIHdpdGggUHl0aG9uIgpzdGF0dXM6ICJwdWJsaXNoZWQiCnN1YnRpdGxlOiAiU3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgdGhlIFdlYiBEZXZlbG9wZXIncyBicmVhZCBhbmQgYnV0dGVyLCBvdXIgam9iIGlzIHRvIGNvbmNhdGVuYXRlIHN0cmluZ3MgdG8gY3JlYXRlIEhUTUwvQ1NTIGRvY3VtZW50cyBwcm9ncmFtbWF0aWNhbGx5IgphdXRob3JzOiBbImFsZXNhbmNoZXpyIl0KY292ZXJfbG9jYWw6ICJodHRwczovL2dpdGh1Yi5jb20vYnJlYXRoZWNvLWRlL2NvbnRlbnQvYmxvYi9tYXN0ZXIvc3JjL2NvbnRlbnQvbGVzc29uLy4uLy4uL2Fzc2V0cy9pbWFnZXMvNGNjNmZhMGItMjUzMC00MDUyLWFhN2UtOGRhYzAzNzg4YWMzLnBuZz9yYXc9dHJ1ZSIKdGV4dENvbG9yOiAid2hpdGUiCmRhdGU6ICIyMDIwLTEwLTE5VDE2OjM2OjMxKzAwOjAwIgpzeW50YXhpczogWyJweXRob24iXQp0YWdzOiBbInB5dGhvbiIsInN0cmluZy1jb25jYXRlbmF0aW9uIl0KCi0tLQoKIyMgV2hhdCBpcyBhIHN0cmluZz8KCkEgYnVuY2ggb2YgbGV0dGVycyBhbmQgY2hhcmFjdGVycyBhbGwgdG9nZXRoZXIgaW4gYSBwYXJ0aWN1bGFyIG9yZGVyLCB0aGUgb25seSB3YXkgdG8gc3RvcmUgYW55IGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGEgbnVtYmVyLCBhcmUgYSBmdW5kYW1lbnRhbCBwYXJ0IG9mIGV2ZXJ5IG1ham9yIHByb2dyYW0uCgpTdHJpbmdzIGFyZSBhbHNvIHBhcnQgb2YgdGhlIG1vc3QgcHJpbWl0aXZlIG9yIGJhc2ljIHNldCBvZiBkYXRhLXR5cGVzOiAKCnwgVHlwZSAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgfCBSZXByZXNlbnRhdGlvbiAgICAgICAgICAgICAgICB8CnwgLS0tICAgICAgIHwgLS0tICAgICAgICAgICAgICAgfCAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgU3RyaW5nICAgIHwgYCJIZWxsbyBXb3JsZCJgICAgfCBzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGp1c3QgY2hhcmFjdGVycyBpbiBhIHNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IE51bWJlciAgICB8IGAyMy4zNGAgICAgICAgICAgIHwgaW50LCBmbG9hdCwgY29tcGxleCAgICAgICAgICAgfCBqdXN0IG51bWJlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBTZXF1ZW5jZSAgfCBgWzIsMywxLDU2LDQuMzRdYCB8IGxpc3QsIHR1cGxlLCByYW5nZSAgICAgICAgICAgIHwgSXRlcmFibGUgbGlzdCBvZiB2YWx1ZXMgd2l0aCBudW1lcmljYWwgaW5kZXhlcyBmb3IgcG9zaXRpb25zICB8CnwgU2V0ICAgICAgIHwgYHsnMSwnMicsJzQ1J31gICAgfCBzZXQsIGZyb3plbnNldCAgICAgICAgICAgICAgICB8IExpa2UgU2VxdWVuY2UgYnV0IHVub3JkZXJlZCBhbmQgd2l0aCBkdXBsaWNhdGUgZWxlbWVudHMgICAgICAgfAp8IE1hcHBpbmcgICB8IGB7Im5hbWUiOiAiQm9iIn1gIHwgZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMaWtlIFNlcXVlbmNlIGJ1dCBpbmRleGVzIGFyZSBjaGFyYWN0ZXJzIGludGVhZCBvZiBpbmNyZW1lbnRhbCBudW1iZXJzIHwKfCBCb29sZWFuICAgfCBgVHJ1ZWAgb3IgYEZhbHNlYCB8IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIHwganVzdCBUcnVlIG9yIEZhbHNlIHwKfCBCaW5hcnkgICAgfCBgMDEwMDEwMTAxMTFgICAgICB8IGJ5dGVzLCBieXRlYXJyYXksIG1lbW9yeXZpZXcgIHwgSWRlYWwgZm9yIGxvdyBsZXZlbCBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyBIb3cgdG8gY3JlYXRlIGEgc3RyaW5nCgpUbyBjcmVhdGUgYSBzdHJpbmcgaW4gcHl0aG9uIGp1c3QgcHV0IGEgYnVuY2ggb2YgY2hhcmFjdGVycyB3aXRoaW4gcXVvdGVzIGxpa2UgdGhpcyBgImhlbGxvImAgb3IgZXZlbiBsaWtlIHRoaXMgYCIyMzIzMiJgLgoKYGBgcHl0aG9uCm5hbWUgPSAiQm9iIgphZ2UgPSAiMjMiICMgPC0tLSB0aGlzIGlzIHN0aWxsIGEgc3RyaW5nIChpdCdzIHdpdGhpbiBxdW90ZXMpCmBgYAoKV2hlbiBjb2RpbmcgYSB3ZWIgYXBwbGljYXRpb24sIGV2ZXJ5dGhpbmcgdGhlIHVzZXIgdHlwZXMgaW4gZm9ybXMgaXQncyBjb25zaWRlcmVkIGEgYHN0cmluZ2AsIGV2ZW4gaWYgdGhlIHVzZXIgdHlwZXMgdGhlIG51bWJlciBgMmAgKHR3bykgaXQgd2lsbCBzdGlsbCBiZSBjb25zaWRlcmVkIHRoZSBzdHJpbmcgYCIyImAgIGFuZCBub3QgYSByZWFsIG51bWJlciwgdGhlIGRldmVsb3BlciB3aWxsIGhhdmUgdG8gZXhwbGljaXRlbHkgY29udmVydCBvciBwYXJzZSB0aGF0IHN0cmluZyBpbnRvIGEgbnVtYmVyIHVzaW5nIHRoZSBmdW5jdGlvbiBgaW50KClgICBvciBgZmxvYXQoKWAuCgo+IDpsaW5rOiBIb3cgdG8gW2NvbnZlcnQgc3RyaW5ncyBpbnRvIGludGVnZXJzIHdpdGggcHl0aG9uXShodHRwczovL2d1aWRlLmZyZWVjb2RlY2FtcC5vcmcvcHl0aG9uL2hvdy10by1jb252ZXJ0LXN0cmluZ3MtaW50by1pbnRlZ2Vycy1pbi1weXRob24vKSAoMyBtaW4gcmVhZCkuCgpUaGUgbW9zdCBjb21tb24gdXNlIGZvciBhIHN0cmluZyBpcyBwcmludGluZyBpdCB1c2luZyB0aGUgZnVuY3Rpb24gYHByaW50YAoKYGBgcHl0aG9uCnByaW50KCJIZWxsbyBXb3JsZCEiKQojIFRoZSBmdW5jdGlvbiBwcmludCgpIHJlY2VpdmVzIGEgc3RyaW5nIGFuZCBkaXNwbGF5cyBpdCBvbiB0aGUgY29tbWFuZCBsaW5lL3Rlcm1pbmFsLgogYGBgCgojIyBIb3cgZG8gd2UgdXNlIHN0cmluZ3M/CgojIyMgU3RyaW5nIGNvbmNhdGVuYXRpb24gKHN1bW1pbmcgc3RyaW5ncykKClB5dGhvbiBhbGxvd3MgdG8gc3VtIHRvZ2V0aGVyIHN0cmluZ3MgdXNpbmcgdGhlIHBsdXMgYCtgIG9wZXJhdG9yLiBUaGUgZm9sbG93aW5nIGZyYWdtZW50IGRlbW9uc3RyYXRlcyBob3cgdG8gYWRkIHR3byBzdHJpbmdzIHRvIGNyZWF0ZSBhICoqZnVsbCBuYW1lKiogZnJvbSAqKmZpcnN0KiogYW5kICoqbGFzdCBuYW1lcyoqLgoKYGBgcHl0aG9uCmZpcnN0X25hbWUgPSAiQWxlamFuZHJvIgpsYXN0X25hbWUgPSAiU2FuY2hleiIKZnVsbF9uYW1lID0gZmlyc3RfbmFtZSArICIgIiArIGxhc3RfbmFtZQpwcmludCgiTXkgbmFtZSBpcyAiK2Z1bGxfbmFtZSkKCiMgT3V0cHV0OiAiTXkgbmFtZSBpcyBBbGVqYW5kcm8gU2FuY2hleiIKIGBgYAoKSW4gdGhpcyBleGFtcGxlIGAiTXkgbmFtZSBpcyAiYCBpdCdzIGJlaW5nIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSB2YWx1ZSBvbiB0aGUgdmFyaWFibGUgYGZ1bGxfbmFtZWAuCgojIyMgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCgpZb3Ugb2Z0ZW4gd2FudCB0byBrbm93IHdoYXQgdGhlIGxlbmd0aCAoc2l6ZSkgb2YgYSBzdHJpbmcgaXMsIGZvciBleGFtcGxlOiBUd2l0dGVyIGRvZXMgbm90IGFsbG93IHR3ZWV0cyB3aXRoIG1vcmUgdGhhbiAyNDAgY2hhcmFjdGVycy4KCmBgYHB5dGhvbgp0d2VldCA9ICJHb29kIG1vcm5pbmchIgpwcmludCgiVGhlIHZhcmlhYmxlIHR3ZWV0IGNvbnRhaW5zICIrc3RyKGxlbih0d2VldCkpKyIgY2hhcmFjdGVycyIpCgojIE91dHB1dDogVGhlIHZhcmlhYmxlIHR3ZWV0IGNvbnRhaW5zIDEzIGNoYXJhY3RlcnMKYGBgCgoKIyMjIEV4dHJhY3RpbmcgY2hhcmFjdGVycwoKQWZ0ZXIgd2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgaW4gYSBwYXJ0aWN1bGFyIHBvc2l0aW9uLCBmb3IgZXhhbXBsZTogSWYgYSBzdHJpbmcgZW5kcyB3aXRoIGEgcXVlc3Rpb24gbWFyayBpdCdzIHByb2JhYmx5IGEgcXVlc3Rpb246CgpgYGBweXRob24KcXVlc3Rpb24gPSAiSG93IGFyZSB5b3U/IgpzaXplID0gbGVuKHF1ZXN0aW9uKQpwcmludCgiVGhlIHN0cmluZ3Mgc3RhcnQgd2l0aCAiICsgcXVlc3Rpb25bMF0pCiMgT3V0cHV0OiBUaGUgc3RyaW5ncyBzdGFydCB3aXRoIEgKcHJpbnQoIlRoZSBzdHJpbmdzIGVuZHMgd2l0aCAiICsgcXVlc3Rpb25bc2l6ZSAtIDFdKQojIE91dHB1dDogVGhlIHN0cmluZ3MgZW5kcyB3aXRoID8KCmBgYAoKPiA6cG9pbnRfdXA6IFRoaXMgbWV0aG9kIG9mIGNoYXJhY3RlciBleHRyYWN0aW9uIG9uIHN0cmluZ3MgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBvbmUgdXNlZCBvbiBsaXN0cyB0byBleHRyYWN0IGFuIGVsZW1lbnQgZnJvbSBhIHBhcnRpY3VsYXIgcG9zaXRpb24gaW4gdGhlIGxpc3QuICAgCgpZb3UgY2FuIGFsc28gZXh0cmFjdCBzZXZlcmFsIGNoYXJhY3RlcnMgYXQgb25jZS4gVGhlIHJhbmdlIG9mIHRoZSBtZXRob2Qgc3RhcnRzIHdpdGggdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgZXh0cmFjdGVkIGFuZCBlbmRzIHdpdGggdGhlIGluZGV4IEFGVEVSIHRoZSBsYXN0IGNoYXJhY3RlciB0byBiZSBleHRyYWN0ZWQ6CgpgYGBweXRob24KbmFtZSA9ICJNeSBuYW1lIGlzIEFsZWphbmRybyBTYW5jaGV6IgpwcmludCgiRXh0cmFjdGVkICIgKyBuYW1lWzExOjIwXSkKIyBPdXRwdXQ6IEV4dHJhY3RlZCBBbGVqYW5kcm8KCnByaW50KCJFeHRyYWN0ZWQgIiArIG5hbWVbMTE6XSkKIyBPdXRwdXQ6IEV4dHJhY3RlZCBBbGVqYW5kcm8gU2FuY2hlegoKcHJpbnQoIkV4dHJhY3RlZCAiICsgbm9tYnJlWzoxMF0pCiMgT3V0cHV0OiBFeHRyYWN0ZWQgTXkgbmFtZSBpcyAKYGBgCgojIyMgQ29tcGFyaW5nIHN0cmluZ3MKCklmIHlvdSB3YW50IHRvIGNvbXBhcmUgdHdvIHN0cmluZ3MgeW91IGNhbiB1c2UgdGhlIGA9PWAgIChkb3VibGUgZXF1YWwpIGFuZCBpdCB3aWxsIHJldHVybiBgVHJ1ZWAgIGlmIHRoZSBzdHJpbmdzIGFyZSBFWEFDVExZIHRoZSBzYW1lLCBzdHJpbmcgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZSwgIkJvYiIgaXMgbm90IGVxdWFsIHRvICJib2IiLgoKYGBgcHl0aG9uCm5hbWUxID0gInBlcGUiOwpuYW1lMiA9ICJqdWFuIjsKaWYgbmFtZTEgPT0gbmFtZTI6CiAgICBwcmludCgiVGhpcyBpcyBGYWxzZSwgSSB3aWxsIG5vdCBnZXQgcHJpbnRlZCIpCmlmIG5hbWUxID09ICJwZXBlIjoKICAgIHByaW50KCJUaGlzIGlzIFRydWUsIEkgd2lsbCBnZXQgcHJpbnRlZCIpCmlmIG5hbWUxICE9IG5hbWUyOgogICAgcHJpbnQoIlRoaXMgaXMgVHJ1ZSwgSSB3aWxsIGdldCBwcmludGVkIikKYGBgCgojIyMgQ29udmVydGluZyB0byBsb3dlciBvciB1cHBlciBjYXNlLgoKYGBgcHl0aG9uCmxvd2VyY2FzZWRfc3RyaW5nID0gbmFtZTEubG93ZXIoKSAjIHdpbGwgY29udmVydCB0byBsb3dlcmNhc2UKdXBwZXJjYXNlZF9zdHJpbmcgPSBuYW1lMi51cHBlcigpICMgd2lsbCBjb252ZXJ0IHRvIHVwcGVyY2FzZQpgYGAKCj4gOnBvaW50X3VwOiBpdCBpcyBnb29kIHByYWN0aWNlIHRvIGFsd2F5cyBsb3dlcmNhc2Ugc3RyaW5ncyBiZWZvcmUgY29tcGFyaW5nIHRoZW0gd2l0aCBvdGhlcnMsIHRoYXQgd2F5IHdlIHdpbGwgYXZvaWQgbWlzc2luZyBjYXNlIHNlbnNpdGl2ZSBkaWZmZXJlbmNlcy4KCiMjIyBDb252ZXJ0IHN0cmluZ3MgdG8gbnVtYmVycyAoYW5kIHZpY2UgdmVyc2EpCgpgYGBweXRob24KbnVtYmVyID0gMy40ICMgSSBhbSBhIG51bWJlcgpudW1iZXJfYXNfc3RyaW5nID0gc3RyKG51bWJlcikgIyBJIGFtIGEgc3RyaW5nIHdpdGggdmFsdWUgIjMuNCIKYGBgCgojIyMgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzdHJpbmdzCgpJZiB5b3Ugd2FudCB0byBsZWFybiBtb3JlLCB3ZSBzdWdnZXN0IHlvdSBzdGFydCBwcmFjdGljaW5nIGluc3RlYWQgb2YgcmVhZGluZyBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgbXVjaCB0byByZWFkIGFib3V0IHN0cmluZ3MsIGhlcmUgaXMgYSBzbWFsbCAzIG1pbiBbdmlkZW8gZXhwbGFpbmluZyBzdHJpbmdzXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWlBelNoa0t6cEpvKS4gCgpLZWVwIHByYWN0aWNpbmchCg==" + + def test_with_no_assets(bc: Breathecode, client): url = reverse_lazy("registry:asset") @@ -140,7 +143,7 @@ def test_many_assets(bc: Breathecode, client): assert bc.database.list_of("registry.Asset") == bc.format.to_dict(model.asset) -def test_assets_technologies_expand(bc: Breathecode, client): +def test_assets_expand_technologies(bc: Breathecode, client): technology = {"slug": "learn-react", "title": "Learn React"} model = bc.database.create( @@ -173,6 +176,75 @@ def test_assets_technologies_expand(bc: Breathecode, client): assert bc.database.list_of("registry.Asset") == bc.format.to_dict(model.asset) +def test_assets_expand_readme(bc: Breathecode, client): + + technology = {"slug": "learn-react", "title": "Learn React"} + model = bc.database.create( + asset_technology=(1, technology), + asset=( + 1, + {"technologies": 1, "status": "PUBLISHED", "readme": readme}, + ), + ) + + url = reverse_lazy("registry:asset") + f"?expand=readme" + response = client.get(url) + json = response.json() + + asset_readme = model.asset.get_readme(parse=True, remove_frontmatter=True) + + expected = [ + get_mid_serializer( + model.asset, + data={ + "updated_at": bc.datetime.to_iso_string(model.asset.updated_at), + "readme": { + "decoded": asset_readme["decoded"], + "html": asset_readme["html"], + }, + }, + ) + ] + + assert json == expected + assert bc.database.list_of("registry.Asset") == [bc.format.to_dict(model.asset)] + + +def test_assets_expand_readme_and_technologies(bc: Breathecode, client): + + technology = {"slug": "learn-react", "title": "Learn React"} + model = bc.database.create( + asset_technology=(1, technology), + asset=( + 1, + {"technologies": 1, "status": "PUBLISHED", "readme": readme}, + ), + ) + + url = reverse_lazy("registry:asset") + f"?expand=technologies,readme" + response = client.get(url) + json = response.json() + + asset_readme = model.asset.get_readme(parse=True, remove_frontmatter=True) + + expected = [ + get_mid_serializer( + model.asset, + data={ + "updated_at": bc.datetime.to_iso_string(model.asset.updated_at), + "readme": { + "decoded": asset_readme["decoded"], + "html": asset_readme["html"], + }, + "technologies": [get_serializer_technology(model.asset_technology)], + }, + ) + ] + + assert json == expected + assert bc.database.list_of("registry.Asset") == [bc.format.to_dict(model.asset)] + + def test_assets_with_slug(bc: Breathecode, client): assets = [ From 7a71999a544c7f916b70df863870183c4d4337dd Mon Sep 17 00:00:00 2001 From: gustavomm19 Date: Tue, 27 Aug 2024 18:36:20 +0000 Subject: [PATCH 05/25] reformat --- breathecode/registry/tests/urls/v1/tests_asset.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/breathecode/registry/tests/urls/v1/tests_asset.py b/breathecode/registry/tests/urls/v1/tests_asset.py index 1288da255..c1c3be902 100644 --- a/breathecode/registry/tests/urls/v1/tests_asset.py +++ b/breathecode/registry/tests/urls/v1/tests_asset.py @@ -198,10 +198,7 @@ def test_assets_expand_readme(bc: Breathecode, client): model.asset, data={ "updated_at": bc.datetime.to_iso_string(model.asset.updated_at), - "readme": { - "decoded": asset_readme["decoded"], - "html": asset_readme["html"], - }, + "readme": {"decoded": asset_readme["decoded"], "html": asset_readme["html"]}, }, ) ] From 40f19c8399f661e2eab0e6e472b96b899deb6d3b Mon Sep 17 00:00:00 2001 From: gustavomm19 Date: Wed, 28 Aug 2024 12:00:00 +0000 Subject: [PATCH 06/25] fix expandable serializer bug with lessons ipynb --- breathecode/registry/serializers.py | 26 ++++++- .../registry/tests/urls/v1/tests_asset.py | 74 ++++++++++++++++++- 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/breathecode/registry/serializers.py b/breathecode/registry/serializers.py index 607dacf64..fdf0259b9 100644 --- a/breathecode/registry/serializers.py +++ b/breathecode/registry/serializers.py @@ -1,3 +1,4 @@ +import re from urllib.parse import urlparse from django.utils import timezone @@ -444,10 +445,31 @@ def to_value(self, instance): elem["technologies"] = self.format_technologies(obj) if "readme" in self.expand: - readme = obj.get_readme(parse=True, remove_frontmatter=True) + url = obj.readme_url + if url is None and obj.asset_type == "LESSON": + url = obj.url + + params = {} + extension = None + if url is not None: + # Extract the extension of the file + ext_extractor = re.compile(r"(?:\.([^.]+))?$") + match = ext_extractor.search(url) + extension = match.group(1) + + if extension is not None and extension != "ipynb": + params["parse"] = True + params["remove_frontmatter"] = True + + readme = obj.get_readme(**params) + + html = obj.html + if html is None: + html = readme["html"] if "html" in readme else None + elem["readme"] = { "decoded": readme["decoded"] if "decoded" in readme else None, - "html": readme["html"] if "html" in readme else None, + "html": html, } return data diff --git a/breathecode/registry/tests/urls/v1/tests_asset.py b/breathecode/registry/tests/urls/v1/tests_asset.py index c1c3be902..4805cc93c 100644 --- a/breathecode/registry/tests/urls/v1/tests_asset.py +++ b/breathecode/registry/tests/urls/v1/tests_asset.py @@ -176,9 +176,10 @@ def test_assets_expand_technologies(bc: Breathecode, client): assert bc.database.list_of("registry.Asset") == bc.format.to_dict(model.asset) -def test_assets_expand_readme(bc: Breathecode, client): +def test_assets_expand_readme_no_readme_url(bc: Breathecode, client): technology = {"slug": "learn-react", "title": "Learn React"} + model = bc.database.create( asset_technology=(1, technology), asset=( @@ -191,6 +192,39 @@ def test_assets_expand_readme(bc: Breathecode, client): response = client.get(url) json = response.json() + asset_readme = model.asset.get_readme() + + expected = [ + get_mid_serializer( + model.asset, + data={ + "updated_at": bc.datetime.to_iso_string(model.asset.updated_at), + "readme": {"decoded": asset_readme["decoded"], "html": None}, + }, + ) + ] + + assert json == expected + assert bc.database.list_of("registry.Asset") == [bc.format.to_dict(model.asset)] + + +def test_assets_expand_readme(bc: Breathecode, client): + + technology = {"slug": "learn-react", "title": "Learn React"} + readme_url = "https://github.com/4GeeksAcademy/03-probability-binomial-with-python.md" + + model = bc.database.create( + asset_technology=(1, technology), + asset=( + 1, + {"technologies": 1, "status": "PUBLISHED", "readme": readme, "readme_url": readme_url}, + ), + ) + + url = reverse_lazy("registry:asset") + f"?expand=readme" + response = client.get(url) + json = response.json() + asset_readme = model.asset.get_readme(parse=True, remove_frontmatter=True) expected = [ @@ -207,14 +241,50 @@ def test_assets_expand_readme(bc: Breathecode, client): assert bc.database.list_of("registry.Asset") == [bc.format.to_dict(model.asset)] +def test_assets_expand_readme_ipynb(bc: Breathecode, client): + + technology = {"slug": "learn-react", "title": "Learn React"} + readme_url_ipynb = "https://github.com/4GeeksAcademy/03-probability-binomial-with-python.ipynb" + html = "

hello

" + + model = bc.database.create( + asset_technology=(1, technology), + asset=( + 1, + {"technologies": 1, "status": "PUBLISHED", "readme": readme, "readme_url": readme_url_ipynb, "html": html}, + ), + ) + + url = reverse_lazy("registry:asset") + f"?expand=readme" + response = client.get(url) + json = response.json() + + asset_readme = model.asset.get_readme() + print(asset_readme) + + expected = [ + get_mid_serializer( + model.asset, + data={ + "updated_at": bc.datetime.to_iso_string(model.asset.updated_at), + "readme": {"decoded": asset_readme["decoded"], "html": model.asset.html}, + }, + ) + ] + + assert json == expected + assert bc.database.list_of("registry.Asset") == [bc.format.to_dict(model.asset)] + + def test_assets_expand_readme_and_technologies(bc: Breathecode, client): technology = {"slug": "learn-react", "title": "Learn React"} + readme_url = "https://github.com/4GeeksAcademy/03-probability-binomial-with-python.md" model = bc.database.create( asset_technology=(1, technology), asset=( 1, - {"technologies": 1, "status": "PUBLISHED", "readme": readme}, + {"technologies": 1, "status": "PUBLISHED", "readme": readme, "readme_url": readme_url}, ), ) From 18e226fefdfb1209c8c9b7115c1961044864cb46 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 29 Aug 2024 16:00:08 -0500 Subject: [PATCH 07/25] changes in capyc directories --- .../management/commands/tests_supervisor.py | 4 ++-- ...ests_supervise_all_consumption_sessions.py | 4 ++-- .../tasks/tests_refund_mentoring_session.py | 2 +- ...ests_me_service_slug_consumptionsession.py | 2 +- .../circuitbreaker}/__init__.py | 0 .../circuitbreaker}/fixtures/__init__.py | 0 .../fixtures/dont_close_the_circuit.py | 0 .../{core/pytest => pytest/core}/__init__.py | 0 .../core}/fixtures/__init__.py | 0 .../core}/fixtures/clean_environment.py | 0 .../pytest => pytest/core}/fixtures/fake.py | 0 .../pytest => pytest/core}/fixtures/format.py | 0 .../pytest => pytest/core}/fixtures/image.py | 0 .../core}/fixtures/no_http_requests.py | 0 .../pytest => pytest/core}/fixtures/random.py | 0 .../pytest => pytest/core}/fixtures/seed.py | 0 .../pytest => pytest/django}/__init__.py | 2 +- .../django}/fixtures/__init__.py | 0 .../django}/fixtures/database.py | 0 .../django}/fixtures/queryset.py | 0 .../django}/fixtures/signals.py | 0 .../pytest => pytest/newrelic}/__init__.py | 0 .../newrelic}/fixtures/__init__.py | 0 .../newrelic}/fixtures/disable_new_relic.py | 0 .../fixtures/disable_newrelic_prints.py | 0 capyc/pytest/rest_framework/__init__.py | 5 +++++ .../rest_framework/fixtures/__init__.py | 3 +++ .../pytest/rest_framework/fixtures/client.py | 19 +++++++++++++++++++ capyc/rest_framework/pytest/__init__.py | 2 +- conftest.py | 14 +++++++------- 30 files changed, 42 insertions(+), 15 deletions(-) rename capyc/{circuitbreaker/pytest => pytest/circuitbreaker}/__init__.py (100%) rename capyc/{circuitbreaker/pytest => pytest/circuitbreaker}/fixtures/__init__.py (100%) rename capyc/{circuitbreaker/pytest => pytest/circuitbreaker}/fixtures/dont_close_the_circuit.py (100%) rename capyc/{core/pytest => pytest/core}/__init__.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/__init__.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/clean_environment.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/fake.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/format.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/image.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/no_http_requests.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/random.py (100%) rename capyc/{core/pytest => pytest/core}/fixtures/seed.py (100%) rename capyc/{django/pytest => pytest/django}/__init__.py (68%) rename capyc/{django/pytest => pytest/django}/fixtures/__init__.py (100%) rename capyc/{django/pytest => pytest/django}/fixtures/database.py (100%) rename capyc/{django/pytest => pytest/django}/fixtures/queryset.py (100%) rename capyc/{django/pytest => pytest/django}/fixtures/signals.py (100%) rename capyc/{newrelic/pytest => pytest/newrelic}/__init__.py (100%) rename capyc/{newrelic/pytest => pytest/newrelic}/fixtures/__init__.py (100%) rename capyc/{newrelic/pytest => pytest/newrelic}/fixtures/disable_new_relic.py (100%) rename capyc/{newrelic/pytest => pytest/newrelic}/fixtures/disable_newrelic_prints.py (100%) create mode 100644 capyc/pytest/rest_framework/__init__.py create mode 100644 capyc/pytest/rest_framework/fixtures/__init__.py create mode 100644 capyc/pytest/rest_framework/fixtures/client.py diff --git a/breathecode/monitoring/tests/management/commands/tests_supervisor.py b/breathecode/monitoring/tests/management/commands/tests_supervisor.py index 42f38c93d..ac2edf695 100644 --- a/breathecode/monitoring/tests/management/commands/tests_supervisor.py +++ b/breathecode/monitoring/tests/management/commands/tests_supervisor.py @@ -4,8 +4,8 @@ import pytest from asgiref.sync import sync_to_async -import capyc.core.pytest.fixtures as cfx -import capyc.django.pytest.fixtures as dfx +import capyc.pytest.core.fixtures as cfx +import capyc.pytest.django.fixtures as dfx from breathecode.monitoring.models import Supervisor as SupervisorModel from breathecode.monitoring.models import SupervisorIssue from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode diff --git a/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py b/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py index 97c248783..55216ef6f 100644 --- a/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py +++ b/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py @@ -5,8 +5,8 @@ import pytest from asgiref.sync import sync_to_async -import capyc.core.pytest.fixtures as cfx -import capyc.django.pytest.fixtures as dfx +import capyc.pytest.core.fixtures as cfx +import capyc.pytest.django.fixtures as dfx from breathecode.monitoring.models import Supervisor as SupervisorModel from breathecode.monitoring.models import SupervisorIssue from breathecode.payments.supervisors import supervise_all_consumption_sessions diff --git a/breathecode/payments/tests/tasks/tests_refund_mentoring_session.py b/breathecode/payments/tests/tasks/tests_refund_mentoring_session.py index a6659810a..1a3cce872 100644 --- a/breathecode/payments/tests/tasks/tests_refund_mentoring_session.py +++ b/breathecode/payments/tests/tasks/tests_refund_mentoring_session.py @@ -10,7 +10,7 @@ from django.utils import timezone from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.django.pytest.fixtures import QuerySet +from capyc.pytest.django.fixtures import QuerySet from ...tasks import refund_mentoring_session diff --git a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py index 9c34500d4..c6b8f4e65 100644 --- a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py +++ b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py @@ -6,7 +6,7 @@ from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework.pytest import fixtures as rfx +from capyc.pytest.rest_framework import fixtures as rfx @pytest.fixture(autouse=True) diff --git a/capyc/circuitbreaker/pytest/__init__.py b/capyc/pytest/circuitbreaker/__init__.py similarity index 100% rename from capyc/circuitbreaker/pytest/__init__.py rename to capyc/pytest/circuitbreaker/__init__.py diff --git a/capyc/circuitbreaker/pytest/fixtures/__init__.py b/capyc/pytest/circuitbreaker/fixtures/__init__.py similarity index 100% rename from capyc/circuitbreaker/pytest/fixtures/__init__.py rename to capyc/pytest/circuitbreaker/fixtures/__init__.py diff --git a/capyc/circuitbreaker/pytest/fixtures/dont_close_the_circuit.py b/capyc/pytest/circuitbreaker/fixtures/dont_close_the_circuit.py similarity index 100% rename from capyc/circuitbreaker/pytest/fixtures/dont_close_the_circuit.py rename to capyc/pytest/circuitbreaker/fixtures/dont_close_the_circuit.py diff --git a/capyc/core/pytest/__init__.py b/capyc/pytest/core/__init__.py similarity index 100% rename from capyc/core/pytest/__init__.py rename to capyc/pytest/core/__init__.py diff --git a/capyc/core/pytest/fixtures/__init__.py b/capyc/pytest/core/fixtures/__init__.py similarity index 100% rename from capyc/core/pytest/fixtures/__init__.py rename to capyc/pytest/core/fixtures/__init__.py diff --git a/capyc/core/pytest/fixtures/clean_environment.py b/capyc/pytest/core/fixtures/clean_environment.py similarity index 100% rename from capyc/core/pytest/fixtures/clean_environment.py rename to capyc/pytest/core/fixtures/clean_environment.py diff --git a/capyc/core/pytest/fixtures/fake.py b/capyc/pytest/core/fixtures/fake.py similarity index 100% rename from capyc/core/pytest/fixtures/fake.py rename to capyc/pytest/core/fixtures/fake.py diff --git a/capyc/core/pytest/fixtures/format.py b/capyc/pytest/core/fixtures/format.py similarity index 100% rename from capyc/core/pytest/fixtures/format.py rename to capyc/pytest/core/fixtures/format.py diff --git a/capyc/core/pytest/fixtures/image.py b/capyc/pytest/core/fixtures/image.py similarity index 100% rename from capyc/core/pytest/fixtures/image.py rename to capyc/pytest/core/fixtures/image.py diff --git a/capyc/core/pytest/fixtures/no_http_requests.py b/capyc/pytest/core/fixtures/no_http_requests.py similarity index 100% rename from capyc/core/pytest/fixtures/no_http_requests.py rename to capyc/pytest/core/fixtures/no_http_requests.py diff --git a/capyc/core/pytest/fixtures/random.py b/capyc/pytest/core/fixtures/random.py similarity index 100% rename from capyc/core/pytest/fixtures/random.py rename to capyc/pytest/core/fixtures/random.py diff --git a/capyc/core/pytest/fixtures/seed.py b/capyc/pytest/core/fixtures/seed.py similarity index 100% rename from capyc/core/pytest/fixtures/seed.py rename to capyc/pytest/core/fixtures/seed.py diff --git a/capyc/django/pytest/__init__.py b/capyc/pytest/django/__init__.py similarity index 68% rename from capyc/django/pytest/__init__.py rename to capyc/pytest/django/__init__.py index 9e9518498..712cc4401 100644 --- a/capyc/django/pytest/__init__.py +++ b/capyc/pytest/django/__init__.py @@ -1,5 +1,5 @@ """Centralized Breathecode fixtures for all our libraries.""" -from capyc.core.pytest import * # noqa: F401 +from capyc.pytest.core import * # noqa: F401 from .fixtures import * # noqa: F401 diff --git a/capyc/django/pytest/fixtures/__init__.py b/capyc/pytest/django/fixtures/__init__.py similarity index 100% rename from capyc/django/pytest/fixtures/__init__.py rename to capyc/pytest/django/fixtures/__init__.py diff --git a/capyc/django/pytest/fixtures/database.py b/capyc/pytest/django/fixtures/database.py similarity index 100% rename from capyc/django/pytest/fixtures/database.py rename to capyc/pytest/django/fixtures/database.py diff --git a/capyc/django/pytest/fixtures/queryset.py b/capyc/pytest/django/fixtures/queryset.py similarity index 100% rename from capyc/django/pytest/fixtures/queryset.py rename to capyc/pytest/django/fixtures/queryset.py diff --git a/capyc/django/pytest/fixtures/signals.py b/capyc/pytest/django/fixtures/signals.py similarity index 100% rename from capyc/django/pytest/fixtures/signals.py rename to capyc/pytest/django/fixtures/signals.py diff --git a/capyc/newrelic/pytest/__init__.py b/capyc/pytest/newrelic/__init__.py similarity index 100% rename from capyc/newrelic/pytest/__init__.py rename to capyc/pytest/newrelic/__init__.py diff --git a/capyc/newrelic/pytest/fixtures/__init__.py b/capyc/pytest/newrelic/fixtures/__init__.py similarity index 100% rename from capyc/newrelic/pytest/fixtures/__init__.py rename to capyc/pytest/newrelic/fixtures/__init__.py diff --git a/capyc/newrelic/pytest/fixtures/disable_new_relic.py b/capyc/pytest/newrelic/fixtures/disable_new_relic.py similarity index 100% rename from capyc/newrelic/pytest/fixtures/disable_new_relic.py rename to capyc/pytest/newrelic/fixtures/disable_new_relic.py diff --git a/capyc/newrelic/pytest/fixtures/disable_newrelic_prints.py b/capyc/pytest/newrelic/fixtures/disable_newrelic_prints.py similarity index 100% rename from capyc/newrelic/pytest/fixtures/disable_newrelic_prints.py rename to capyc/pytest/newrelic/fixtures/disable_newrelic_prints.py diff --git a/capyc/pytest/rest_framework/__init__.py b/capyc/pytest/rest_framework/__init__.py new file mode 100644 index 000000000..5b2cb982f --- /dev/null +++ b/capyc/pytest/rest_framework/__init__.py @@ -0,0 +1,5 @@ +"""Centralized Breathecode fixtures for all our libraries.""" + +from capyc.pytest.django import * # noqa: F401 + +from .fixtures import * # noqa: F401 diff --git a/capyc/pytest/rest_framework/fixtures/__init__.py b/capyc/pytest/rest_framework/fixtures/__init__.py new file mode 100644 index 000000000..64eb8367e --- /dev/null +++ b/capyc/pytest/rest_framework/fixtures/__init__.py @@ -0,0 +1,3 @@ +"""Centralized Breathecode fixtures for all our libraries.""" + +from .client import * # noqa: F401 diff --git a/capyc/pytest/rest_framework/fixtures/client.py b/capyc/pytest/rest_framework/fixtures/client.py new file mode 100644 index 000000000..9f7a5ea90 --- /dev/null +++ b/capyc/pytest/rest_framework/fixtures/client.py @@ -0,0 +1,19 @@ +""" +QuerySet fixtures. +""" + +import pytest +from adrf.test import AsyncAPIClient as AsyncClient +from rest_framework.test import APIClient as Client + +__all__ = ["client", "aclient", "Client", "AsyncClient"] + + +@pytest.fixture +def client(): + return Client() + + +@pytest.fixture +def aclient(): + return AsyncClient() diff --git a/capyc/rest_framework/pytest/__init__.py b/capyc/rest_framework/pytest/__init__.py index 8b6605c5e..5b2cb982f 100644 --- a/capyc/rest_framework/pytest/__init__.py +++ b/capyc/rest_framework/pytest/__init__.py @@ -1,5 +1,5 @@ """Centralized Breathecode fixtures for all our libraries.""" -from capyc.django.pytest import * # noqa: F401 +from capyc.pytest.django import * # noqa: F401 from .fixtures import * # noqa: F401 diff --git a/conftest.py b/conftest.py index f97d846d7..20fc337ea 100644 --- a/conftest.py +++ b/conftest.py @@ -10,19 +10,19 @@ from breathecode.notify.utils.hook_manager import HookManagerClass from breathecode.utils.exceptions import TestError -from capyc.core.pytest.fixtures import Random -from capyc.django.pytest.fixtures.signals import Signals +from capyc.pytest.core.fixtures import Random +from capyc.pytest.django.fixtures.signals import Signals # set ENV as test before run django os.environ["ENV"] = "test" os.environ["DATABASE_URL"] = "sqlite:///:memory:" pytest_plugins = ( - "capyc.core.pytest", - "capyc.newrelic.pytest", - "capyc.django.pytest", - "capyc.rest_framework.pytest", - "capyc.circuitbreaker.pytest", + "capyc.pytest.core", + "capyc.pytest.newrelic", + "capyc.pytest.django", + "capyc.pytest.rest_framework", + "capyc.pytest.circuitbreaker", ) from breathecode.tests.mixins.breathecode_mixin import Breathecode From c994806fe4ed02e1912658994339b45b5c5c467e Mon Sep 17 00:00:00 2001 From: jefer94 Date: Mon, 2 Sep 2024 20:21:16 -0500 Subject: [PATCH 08/25] add 4geeks libraries section --- docs/4geeks-libraries.md | 5 +++++ mkdocs.yml | 1 + 2 files changed, 6 insertions(+) create mode 100644 docs/4geeks-libraries.md diff --git a/docs/4geeks-libraries.md b/docs/4geeks-libraries.md new file mode 100644 index 000000000..155af8190 --- /dev/null +++ b/docs/4geeks-libraries.md @@ -0,0 +1,5 @@ +# 4Geeks libraries + +- [Capy Core](https://breatheco-de.github.io/capy-core/). +- [Celery Task Manager](https://breatheco-de.github.io/celery-task-manager-django-plugin/). +- [Linked Services](https://breatheco-de.github.io/linked-services-django-plugin/). diff --git a/mkdocs.yml b/mkdocs.yml index c96f8b2a3..b0a1efa1a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -25,6 +25,7 @@ theme: # this define the order of menu nav: - "index.md" + - "4geeks-libraries.md" - Getting started: # which version of python install - Set up: From 643b9eba0631d97df5d96325ef73e7bab08d74a8 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Tue, 3 Sep 2024 00:58:20 -0500 Subject: [PATCH 09/25] add capy core package --- Pipfile | 14 +- Pipfile.lock | 3387 +++++++++-------- .../tests_schedule_repository_deletions.py | 2 +- .../tests/urls/tests_user_me_task.py | 2 +- .../tests_async_validate_email_invite.py | 2 +- .../tasks/tests_verify_user_invite_email.py | 2 +- .../tests/urls/tests_app_token.py | 2 +- .../tests/urls/tests_me_event_id_join.py | 6 +- .../tests_no_survey_for_session.py | 2 +- .../tests_supervise_mentorship_survey.py | 6 +- .../tasks/tests_process_student_graduation.py | 2 +- .../tests/settings/tests_del_temp_file.py | 2 +- .../tests/settings/tests_process_media.py | 2 +- .../media/tests/settings/tests_transfer.py | 2 +- .../tests/signals/tests_schedule_deletion.py | 2 +- .../media/tests/tasks/tests_process_file.py | 2 +- .../tests/urls/v2/tests_academy_chunk.py | 2 +- .../urls/v2/tests_academy_chunk_upload.py | 2 +- .../media/tests/urls/v2/tests_me_chunk.py | 2 +- .../tests/urls/v2/tests_me_chunk_upload.py | 2 +- .../tests/urls/v2/tests_operationtype.py | 3 +- .../tests/urls/v2/tests_operationtype_type.py | 3 +- .../mentorship/tests/admin/tests_use_daily.py | 2 +- .../tests/admin/tests_use_google_meet.py | 2 +- .../tests_meet_slug_service_slug.py | 7 +- .../management/commands/tests_supervisor.py | 4 +- .../monitoring/tests/tasks/tests_fix_issue.py | 2 +- .../tests/tasks/tests_run_supervisor.py | 10 +- ...ts_validate_and_create_proof_of_payment.py | 4 +- ...tests_validate_and_create_subscriptions.py | 4 +- ...ests_supervise_all_consumption_sessions.py | 8 +- ...s_set_proof_of_payment_confirmation_url.py | 2 +- .../tests_academy_plan_slug_subscription.py | 2 +- .../tests/urls/tests_bag_id_coupon.py | 14 +- .../payments/tests/urls/tests_coupon.py | 10 +- ...ests_me_service_slug_consumptionsession.py | 12 +- ...me_service_slug_consumptionsession_hash.py | 12 +- ...s_me_service_slug_consumptionsession_id.py | 8 +- .../utils/tests/decorators/tests_consume.py | 2 +- .../tests/decorators/tests_has_permission.py | 2 +- capyc/__about__.py | 29 - capyc/__init__.py | 29 - capyc/circuitbreaker/__init__.py | 0 capyc/core/__init__.py | 1 - capyc/core/i18n.py | 114 - capyc/core/managers.py | 139 - capyc/core/shorteners.py | 16 - capyc/django/__init__.py | 0 capyc/django/serializer.py | 17 - capyc/newrelic/__init__.py | 0 capyc/pytest/circuitbreaker/__init__.py | 3 - .../circuitbreaker/fixtures/__init__.py | 3 - .../fixtures/dont_close_the_circuit.py | 15 - capyc/pytest/core/__init__.py | 3 - capyc/pytest/core/fixtures/__init__.py | 9 - .../pytest/core/fixtures/clean_environment.py | 52 - capyc/pytest/core/fixtures/fake.py | 14 - capyc/pytest/core/fixtures/format.py | 69 - capyc/pytest/core/fixtures/image.py | 72 - .../pytest/core/fixtures/no_http_requests.py | 26 - capyc/pytest/core/fixtures/random.py | 114 - capyc/pytest/core/fixtures/seed.py | 43 - capyc/pytest/django/__init__.py | 5 - capyc/pytest/django/fixtures/__init__.py | 5 - capyc/pytest/django/fixtures/database.py | 562 --- capyc/pytest/django/fixtures/queryset.py | 68 - capyc/pytest/django/fixtures/signals.py | 219 -- capyc/pytest/newrelic/__init__.py | 3 - capyc/pytest/newrelic/fixtures/__init__.py | 4 - .../newrelic/fixtures/disable_new_relic.py | 10 - .../fixtures/disable_newrelic_prints.py | 14 - capyc/pytest/rest_framework/__init__.py | 5 - .../rest_framework/fixtures/__init__.py | 3 - .../pytest/rest_framework/fixtures/client.py | 19 - capyc/rest_framework/__init__.py | 0 capyc/rest_framework/exception_handler.py | 102 - capyc/rest_framework/exceptions.py | 106 - capyc/rest_framework/pytest/__init__.py | 5 - .../pytest/fixtures/__init__.py | 3 - .../rest_framework/pytest/fixtures/client.py | 19 - capyc/tests/__init__.py | 0 capyc/tests/core/__init__.py | 0 capyc/tests/core/tests_managers.py | 144 - capyc/tests/rest_framework/__init__.py | 0 .../rest_framework/tests_exception_handler.py | 530 --- 85 files changed, 1932 insertions(+), 4220 deletions(-) delete mode 100644 capyc/__about__.py delete mode 100644 capyc/__init__.py delete mode 100644 capyc/circuitbreaker/__init__.py delete mode 100644 capyc/core/__init__.py delete mode 100644 capyc/core/i18n.py delete mode 100644 capyc/core/managers.py delete mode 100644 capyc/core/shorteners.py delete mode 100644 capyc/django/__init__.py delete mode 100644 capyc/django/serializer.py delete mode 100644 capyc/newrelic/__init__.py delete mode 100644 capyc/pytest/circuitbreaker/__init__.py delete mode 100644 capyc/pytest/circuitbreaker/fixtures/__init__.py delete mode 100644 capyc/pytest/circuitbreaker/fixtures/dont_close_the_circuit.py delete mode 100644 capyc/pytest/core/__init__.py delete mode 100644 capyc/pytest/core/fixtures/__init__.py delete mode 100644 capyc/pytest/core/fixtures/clean_environment.py delete mode 100644 capyc/pytest/core/fixtures/fake.py delete mode 100644 capyc/pytest/core/fixtures/format.py delete mode 100644 capyc/pytest/core/fixtures/image.py delete mode 100644 capyc/pytest/core/fixtures/no_http_requests.py delete mode 100644 capyc/pytest/core/fixtures/random.py delete mode 100644 capyc/pytest/core/fixtures/seed.py delete mode 100644 capyc/pytest/django/__init__.py delete mode 100644 capyc/pytest/django/fixtures/__init__.py delete mode 100644 capyc/pytest/django/fixtures/database.py delete mode 100644 capyc/pytest/django/fixtures/queryset.py delete mode 100644 capyc/pytest/django/fixtures/signals.py delete mode 100644 capyc/pytest/newrelic/__init__.py delete mode 100644 capyc/pytest/newrelic/fixtures/__init__.py delete mode 100644 capyc/pytest/newrelic/fixtures/disable_new_relic.py delete mode 100644 capyc/pytest/newrelic/fixtures/disable_newrelic_prints.py delete mode 100644 capyc/pytest/rest_framework/__init__.py delete mode 100644 capyc/pytest/rest_framework/fixtures/__init__.py delete mode 100644 capyc/pytest/rest_framework/fixtures/client.py delete mode 100644 capyc/rest_framework/__init__.py delete mode 100644 capyc/rest_framework/exception_handler.py delete mode 100644 capyc/rest_framework/exceptions.py delete mode 100644 capyc/rest_framework/pytest/__init__.py delete mode 100644 capyc/rest_framework/pytest/fixtures/__init__.py delete mode 100644 capyc/rest_framework/pytest/fixtures/client.py delete mode 100644 capyc/tests/__init__.py delete mode 100644 capyc/tests/core/__init__.py delete mode 100644 capyc/tests/core/tests_managers.py delete mode 100644 capyc/tests/rest_framework/__init__.py delete mode 100644 capyc/tests/rest_framework/tests_exception_handler.py diff --git a/Pipfile b/Pipfile index 7c1be716f..cdecf1bed 100644 --- a/Pipfile +++ b/Pipfile @@ -56,6 +56,7 @@ google-apps-meet = "*" google-auth-httplib2 = "*" google-auth-oauthlib = "*" black = "*" +capy-core = {extras = ["pytest"], version = "*"} [packages] django = "*" @@ -128,19 +129,20 @@ brotli = "*" circuitbreaker = "*" kombu = "*" zstandard = "*" -psycopg = {extras = ["pool", "binary"], version = "*"} +psycopg = {extras = ["pool", "binary"] } cryptography = "*" adrf = "*" uvicorn = "*" django-minify-html = "*" -django-storages = {extras = ["google"], version = "*"} -aiohttp = {extras = ["speedups"], version = "*"} +django-storages = {extras = ["google"] } +aiohttp = {extras = ["speedups"] } aiodns = "*" eventlet = "*" -linked-services = {extras = ["django", "aiohttp", "requests"], version = "*"} -celery-task-manager = {extras = ["django"], version = "*"} -django-sql-explorer = {extras = ["xls"], version = "*"} +linked-services = {extras = ["django", "aiohttp", "requests"] } +celery-task-manager = {extras = ["django"] } +django-sql-explorer = {extras = ["xls"] } contextlib2 = "*" google-apps-meet = "*" google-auth-httplib2 = "*" google-auth-oauthlib = "*" +capy-core = {extras = ["django"], version = "*"} diff --git a/Pipfile.lock b/Pipfile.lock index 243143eb5..5f63fbcca 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c119c67feb0df330c2ae17917ea337fd9ef2da6b2d98b5dde56794a9ab3b3be7" + "sha256": "41578d92f01093c438b9e0dfe6c185b583d814b0998eb581b01c9d12b83e2263" }, "pipfile-spec": 6, "requires": {}, @@ -25,12 +25,12 @@ }, "adrf": { "hashes": [ - "sha256:4ed8a07159e97602b27b61cccef5a9f4088d07be6899d62fec1300286a6c500f", - "sha256:8057be8ac17e1ed47fbec17de4bf1772d467243422fd5f7dd78e97735d395ed3" + "sha256:2a29a7621767ea670655e744a65ee1f19e8208fffbc5e71d2cf43def4c352740", + "sha256:815c4ce1179931e41f966eb8d36903fcc36bad6964e61cfc0f360d107725bd18" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.1.6" + "version": "==0.1.7" }, "aiodns": { "hashes": [ @@ -40,90 +40,113 @@ "index": "pypi", "version": "==3.2.0" }, + "aiohappyeyeballs": { + "hashes": [ + "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", + "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, "aiohttp": { "extras": [ "speedups" ], "hashes": [ - "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8", - "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", - "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475", - "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed", - "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", - "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372", - "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", - "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", - "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1", - "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd", - "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", - "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb", - "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46", - "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de", - "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78", - "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c", - "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", - "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb", - "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", - "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", - "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156", - "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", - "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", - "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", - "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", - "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", - "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da", - "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", - "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", - "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb", - "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8", - "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", - "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", - "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", - "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09", - "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031", - "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", - "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", - "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", - "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", - "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe", - "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", - "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2", - "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1", - "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", - "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b", - "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b", - "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106", - "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac", - "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", - "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", - "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", - "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", - "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", - "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", - "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", - "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a", - "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", - "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", - "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", - "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24", - "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed", - "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", - "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e", - "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", - "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a", - "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", - "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", - "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2", - "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", - "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", - "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", - "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11", - "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", - "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", - "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" + "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277", + "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1", + "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe", + "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb", + "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", + "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91", + "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", + "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a", + "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3", + "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", + "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77", + "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b", + "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8", + "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", + "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", + "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf", + "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511", + "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699", + "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", + "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", + "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff", + "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db", + "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", + "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce", + "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", + "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5", + "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7", + "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", + "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", + "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e", + "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf", + "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", + "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", + "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6", + "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", + "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3", + "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a", + "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", + "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088", + "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc", + "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f", + "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", + "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471", + "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e", + "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697", + "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", + "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69", + "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3", + "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32", + "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589", + "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", + "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92", + "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2", + "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", + "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058", + "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857", + "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1", + "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6", + "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22", + "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0", + "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b", + "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", + "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", + "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e", + "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", + "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1", + "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f", + "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", + "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", + "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae", + "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d", + "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b", + "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f", + "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862", + "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", + "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c", + "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683", + "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef", + "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f", + "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", + "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", + "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061", + "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072", + "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11", + "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", + "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", + "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", + "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172", + "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569", + "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", + "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5" ], "markers": "python_version >= '3.8'", - "version": "==3.9.5" + "version": "==3.10.5" }, "aiohttp-retry": { "hashes": [ @@ -198,34 +221,36 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "autobahn": { "hashes": [ - "sha256:ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181" + "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9", + "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81" ], "markers": "python_version >= '3.9'", - "version": "==23.6.2" + "version": "==24.4.2" }, "automat": { "hashes": [ - "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180", - "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e" + "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88", + "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a" ], - "version": "==22.10.0" + "markers": "python_version >= '3.8'", + "version": "==24.8.1" }, "babel": { "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" + "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", + "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.15.0" + "version": "==2.16.0" }, "beautifulsoup4": { "hashes": [ @@ -343,11 +368,22 @@ }, "cachetools": { "hashes": [ - "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474", - "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827" + "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", + "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a" ], "markers": "python_version >= '3.7'", - "version": "==5.4.0" + "version": "==5.5.0" + }, + "capy-core": { + "extras": [ + "django" + ], + "hashes": [ + "sha256:3b644975414d8d6380f4456b8abae3884fa3d57c3552609f7ac7afe6361af10c", + "sha256:bc254beabfc787d8d49e590e7a55b21c6a9420c86de6756d7aa00e977c0219d2" + ], + "markers": "python_version >= '3.11'", + "version": "==1.0.1" }, "celery": { "hashes": [ @@ -371,70 +407,85 @@ }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "version": "==2024.8.30" }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f", + "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab", + "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499", + "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058", + "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693", + "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb", + "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377", + "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885", + "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2", + "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401", + "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4", + "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b", + "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59", + "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f", + "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c", + "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555", + "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa", + "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424", + "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb", + "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2", + "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8", + "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e", + "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9", + "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82", + "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828", + "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759", + "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc", + "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118", + "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf", + "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932", + "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a", + "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29", + "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206", + "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2", + "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c", + "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c", + "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0", + "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a", + "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195", + "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6", + "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9", + "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc", + "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb", + "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0", + "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7", + "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb", + "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a", + "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492", + "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720", + "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42", + "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7", + "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d", + "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d", + "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb", + "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4", + "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2", + "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b", + "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8", + "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e", + "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204", + "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3", + "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150", + "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4", + "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76", + "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e", + "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb", + "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" + "version": "==1.17.0" }, "channels": { "hashes": [ @@ -617,42 +668,37 @@ }, "cryptography": { "hashes": [ - "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", - "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", - "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", - "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", - "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", - "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", - "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", - "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", - "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", - "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", - "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", - "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", - "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", - "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", - "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", - "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", - "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", - "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", - "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", - "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", - "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", - "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", - "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", - "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", - "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", - "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", - "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", - "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", - "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", - "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", - "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", - "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" + "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", + "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069", + "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2", + "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", + "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", + "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", + "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", + "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", + "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", + "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", + "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", + "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", + "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947", + "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", + "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", + "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", + "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", + "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", + "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", + "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", + "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", + "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", + "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", + "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1", + "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", + "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", + "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.0" }, "cssselect": { "hashes": [ @@ -722,12 +768,12 @@ }, "django": { "hashes": [ - "sha256:bd4505cae0b9bd642313e8fb71810893df5dc2ffcacaa67a33af2d5cd61888f2", - "sha256:f216510ace3de5de01329463a315a629f33480e893a9024fc93d8c32c22913da" + "sha256:848a5980e8efb76eea70872fb0e4bc5e371619c70fffbe48e3e1b50b2c09455d", + "sha256:d3b811bf5371a26def053d7ee42a9df1267ef7622323fe70a601936725aa4557" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==5.0.7" + "version": "==5.1" }, "django-appconf": { "hashes": [ @@ -764,12 +810,12 @@ }, "django-minify-html": { "hashes": [ - "sha256:093249aa2adb102e80a141e651b1cc1cd4983061575b8f37d78467f95549e325", - "sha256:2504270b5921a72231b17e3a37eaae3cf6362caa71108eff8c0685a38207f982" + "sha256:c5c66c9c8bdf5e03aea4e680e90b155a20d90667409efceea521e048fa9f0918", + "sha256:d67c6455d6ea7907a403e22888b4e810a997d51c0eaab4f3539accc6ff528d4f" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.8.0" + "version": "==1.9.0" }, "django-phonenumber-field": { "extras": [ @@ -796,11 +842,11 @@ "xls" ], "hashes": [ - "sha256:6e5c1c414a6f1f9fdbfa8c714bac1ffbf28e081e9df53ace834426124c8c2e54", - "sha256:976d6a06c1b960873989ce6943a864260c0ff832f795b8bffb649abbef47811b" + "sha256:960ce31718b688e682b80427abaf1f403b0bb0afc1bee0a9d1c7e30680abe7d2", + "sha256:d6981e092766940ed6c767d29374bb63e15e6b5369af0fbd5e30a64ec521f047" ], "markers": "python_version >= '3.8'", - "version": "==5.0.2" + "version": "==5.2" }, "django-storages": { "extras": [ @@ -1030,28 +1076,28 @@ "grpc" ], "hashes": [ - "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125", - "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd" + "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4", + "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f" ], "markers": "python_version >= '3.7'", - "version": "==2.19.1" + "version": "==2.19.2" }, "google-apps-meet": { "hashes": [ - "sha256:385ec8bc026b068d243643912c9cc644ffabcdee9c362f61f70fe1e7c25c15c7", - "sha256:3faa3ab6d0690d7e343f2ee1c775abd56e63b363fd59dcdb250195324d59a225" + "sha256:36e600f61a8bf0cccee6a3c3c0e77736f46da39ccd7bcbf76162971961739d8d", + "sha256:64e0e4a2e5fa1ce00203997ca633c76e2d97809ddf6de42e8ce61bf58d8701e1" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.1.7" + "version": "==0.1.8" }, "google-auth": { "hashes": [ - "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022", - "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b" + "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65", + "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc" ], "markers": "python_version >= '3.7'", - "version": "==2.32.0" + "version": "==2.34.0" }, "google-auth-httplib2": { "hashes": [ @@ -1096,21 +1142,21 @@ }, "google-cloud-datastore": { "hashes": [ - "sha256:07fc5870a0261f25466c557c134df95a96dfd2537abd088b9d537fbabe99b974", - "sha256:c52086670d4c3779ea7bd8f8353b093a9b5e81c6606f36ffcdf46e6ce9fc80c0" + "sha256:07950b9c8865087c565f45fa3fdd7a05d4c3d99adf79e10c3f596ff08a7d9bba", + "sha256:b9383af24d8e90ed6c5d161d72411d82efd9b21c051fa6f4bbd743a49d37ffb3" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.19.0" + "version": "==2.20.1" }, "google-cloud-firestore": { "hashes": [ - "sha256:3381eb8296ed1028d9b421aa42b9100f198c587f8e33c005d31a6556700b75ae", - "sha256:4ed6243671a00d123642d22e3bc55af2cd7845a0c1e49106fca72934bf33849d" + "sha256:3db5dd42334b9904d82b3786703a5a4b576810fb50f61b8fa83ecf4f17b7fdae", + "sha256:9a735860b692f39f93f900dd3390713ceb9b47ea82cda98360bb551f03d2b916" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.18.0" }, "google-cloud-ndb": { "hashes": [ @@ -1123,21 +1169,21 @@ }, "google-cloud-recaptcha-enterprise": { "hashes": [ - "sha256:3f649247abb3f400dd0f676f0466ae0e60c4c5c730a5e7a1e39db321ae496cde", - "sha256:68ef781bb4796119f8be588de9744c81f4d5925ae8caba962dbef88535a16985" + "sha256:982597a34306de4b5ae7b592aafc9322087ee4abec4940ad0611d32ebc19ed11", + "sha256:dd1173b8f22282a22df68a9796d9cdd0b113f34b60b006a8bdf4bcb2f7cdefff" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==1.21.1" + "version": "==1.22.0" }, "google-cloud-storage": { "hashes": [ - "sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388", - "sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1" + "sha256:97a4d45c368b7d401ed48c4fdfe86e1e1cb96401c9e199e419d289e2c0370166", + "sha256:aaf7acd70cdad9f274d29332673fcab98708d0e1f4dceb5a5356aaef06af4d99" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.17.0" + "version": "==2.18.2" }, "google-crc32c": { "hashes": [ @@ -1215,19 +1261,19 @@ }, "google-resumable-media": { "hashes": [ - "sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c", - "sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33" + "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", + "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0" ], "markers": "python_version >= '3.7'", - "version": "==2.7.1" + "version": "==2.7.2" }, "googleapis-common-protos": { "hashes": [ - "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945", - "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87" + "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63", + "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0" ], "markers": "python_version >= '3.7'", - "version": "==1.63.2" + "version": "==1.65.0" }, "graphene": { "hashes": [ @@ -1329,75 +1375,75 @@ "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], - "markers": "python_version >= '3.11' and platform_python_implementation == 'CPython'", + "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==3.0.3" }, "grpcio": { "hashes": [ - "sha256:12e9bdf3b5fd48e5fbe5b3da382ad8f97c08b47969f3cca81dd9b36b86ed39e2", - "sha256:1bceeec568372cbebf554eae1b436b06c2ff24cfaf04afade729fb9035408c6c", - "sha256:1faaf7355ceed07ceaef0b9dcefa4c98daf1dd8840ed75c2de128c3f4a4d859d", - "sha256:1fbd6331f18c3acd7e09d17fd840c096f56eaf0ef830fbd50af45ae9dc8dfd83", - "sha256:27adee2338d697e71143ed147fe286c05810965d5d30ec14dd09c22479bfe48a", - "sha256:2ca684ba331fb249d8a1ce88db5394e70dbcd96e58d8c4b7e0d7b141a453dce9", - "sha256:2f56b5a68fdcf17a0a1d524bf177218c3c69b3947cb239ea222c6f1867c3ab68", - "sha256:3019fb50128b21a5e018d89569ffaaaa361680e1346c2f261bb84a91082eb3d3", - "sha256:34966cf526ef0ea616e008d40d989463e3db157abb213b2f20c6ce0ae7928875", - "sha256:3c492301988cd720cd145d84e17318d45af342e29ef93141228f9cd73222368b", - "sha256:3dc5f928815b8972fb83b78d8db5039559f39e004ec93ebac316403fe031a062", - "sha256:4effc0562b6c65d4add6a873ca132e46ba5e5a46f07c93502c37a9ae7f043857", - "sha256:54cb822e177374b318b233e54b6856c692c24cdbd5a3ba5335f18a47396bac8f", - "sha256:557de35bdfbe8bafea0a003dbd0f4da6d89223ac6c4c7549d78e20f92ead95d9", - "sha256:5f096ffb881f37e8d4f958b63c74bfc400c7cebd7a944b027357cd2fb8d91a57", - "sha256:5fd7337a823b890215f07d429f4f193d24b80d62a5485cf88ee06648591a0c57", - "sha256:60f1f38eed830488ad2a1b11579ef0f345ff16fffdad1d24d9fbc97ba31804ff", - "sha256:6e71aed8835f8d9fbcb84babc93a9da95955d1685021cceb7089f4f1e717d719", - "sha256:71a05fd814700dd9cb7d9a507f2f6a1ef85866733ccaf557eedacec32d65e4c2", - "sha256:76e81a86424d6ca1ce7c16b15bdd6a964a42b40544bf796a48da241fdaf61153", - "sha256:7ae15275ed98ea267f64ee9ddedf8ecd5306a5b5bb87972a48bfe24af24153e8", - "sha256:7af64838b6e615fff0ec711960ed9b6ee83086edfa8c32670eafb736f169d719", - "sha256:8333ca46053c35484c9f2f7e8d8ec98c1383a8675a449163cea31a2076d93de8", - "sha256:8558f0083ddaf5de64a59c790bffd7568e353914c0c551eae2955f54ee4b857f", - "sha256:8bfd95ef3b097f0cc86ade54eafefa1c8ed623aa01a26fbbdcd1a3650494dd11", - "sha256:8d8143a3e3966f85dce6c5cc45387ec36552174ba5712c5dc6fcc0898fb324c0", - "sha256:941596d419b9736ab548aa0feb5bbba922f98872668847bf0720b42d1d227b9e", - "sha256:941c4869aa229d88706b78187d60d66aca77fe5c32518b79e3c3e03fc26109a2", - "sha256:9a1c84560b3b2d34695c9ba53ab0264e2802721c530678a8f0a227951f453462", - "sha256:9e6a8f3d6c41e6b642870afe6cafbaf7b61c57317f9ec66d0efdaf19db992b90", - "sha256:a6c71575a2fedf259724981fd73a18906513d2f306169c46262a5bae956e6364", - "sha256:a8422dc13ad93ec8caa2612b5032a2b9cd6421c13ed87f54db4a3a2c93afaf77", - "sha256:aaf3c54419a28d45bd1681372029f40e5bfb58e5265e3882eaf21e4a5f81a119", - "sha256:b12c1aa7b95abe73b3e04e052c8b362655b41c7798da69f1eaf8d186c7d204df", - "sha256:b590f1ad056294dfaeac0b7e1b71d3d5ace638d8dd1f1147ce4bd13458783ba8", - "sha256:bbb46330cc643ecf10bd9bd4ca8e7419a14b6b9dedd05f671c90fb2c813c6037", - "sha256:ca931de5dd6d9eb94ff19a2c9434b23923bce6f767179fef04dfa991f282eaad", - "sha256:cb5175f45c980ff418998723ea1b3869cce3766d2ab4e4916fbd3cedbc9d0ed3", - "sha256:d827a6fb9215b961eb73459ad7977edb9e748b23e3407d21c845d1d8ef6597e5", - "sha256:dbb64b4166362d9326f7efbf75b1c72106c1aa87f13a8c8b56a1224fac152f5c", - "sha256:de5b6be29116e094c5ef9d9e4252e7eb143e3d5f6bd6d50a78075553ab4930b0", - "sha256:e4a3cdba62b2d6aeae6027ae65f350de6dc082b72e6215eccf82628e79efe9ba", - "sha256:e75acfa52daf5ea0712e8aa82f0003bba964de7ae22c26d208cbd7bc08500177", - "sha256:f40cebe5edb518d78b8131e87cb83b3ee688984de38a232024b9b44e74ee53d3", - "sha256:f62652ddcadc75d0e7aa629e96bb61658f85a993e748333715b4ab667192e4e8", - "sha256:ff5a84907e51924973aa05ed8759210d8cdae7ffcf9e44fd17646cf4a902df59" - ], - "version": "==1.65.1" + "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e", + "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce", + "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8", + "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d", + "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858", + "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0", + "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a", + "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45", + "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef", + "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2", + "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac", + "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd", + "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1", + "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce", + "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492", + "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e", + "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb", + "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44", + "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb", + "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759", + "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e", + "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761", + "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26", + "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791", + "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c", + "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60", + "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df", + "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a", + "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3", + "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734", + "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f", + "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083", + "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524", + "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d", + "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a", + "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0", + "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb", + "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503", + "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815", + "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22", + "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2", + "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c", + "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d", + "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b", + "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c", + "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9" + ], + "version": "==1.66.1" }, "grpcio-status": { "hashes": [ - "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f", - "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a" + "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485", + "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8" ], - "version": "==1.62.2" + "version": "==1.62.3" }, "gunicorn": { "hashes": [ - "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9", - "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==22.0.0" + "version": "==23.0.0" }, "h11": { "hashes": [ @@ -1416,119 +1462,104 @@ }, "hiredis": { "hashes": [ - "sha256:01b6c24c0840ac7afafbc4db236fd55f56a9a0919a215c25a238f051781f4772", - "sha256:02fc71c8333586871602db4774d3a3e403b4ccf6446dc4603ec12df563127cee", - "sha256:0c0773266e1c38a06e7593bd08870ac1503f5f0ce0f5c63f2b4134b090b5d6a4", - "sha256:0c5f6972d2bdee3cd301d5c5438e31195cf1cabf6fd9274491674d4ceb46914d", - "sha256:0da56915bda1e0a49157191b54d3e27689b70960f0685fdd5c415dacdee2fbed", - "sha256:14c7b43205e515f538a9defb4e411e0f0576caaeeda76bb9993ed505486f7562", - "sha256:16b01d9ceae265d4ab9547be0cd628ecaff14b3360357a9d30c029e5ae8b7e7f", - "sha256:1979334ccab21a49c544cd1b8d784ffb2747f99a51cb0bd0976eebb517628382", - "sha256:1c4c0bcf786f0eac9593367b6279e9b89534e008edbf116dcd0de956524702c8", - "sha256:1d63318ca189fddc7e75f6a4af8eae9c0545863619fb38cfba5f43e81280b286", - "sha256:27e9619847e9dc70b14b1ad2d0fb4889e7ca18996585c3463cff6c951fd6b10b", - "sha256:28adecb308293e705e44087a1c2d557a816f032430d8a2a9bb7873902a1c6d48", - "sha256:28bd184b33e0dd6d65816c16521a4ba1ffbe9ff07d66873c42ea4049a62fed83", - "sha256:322c668ee1c12d6c5750a4b1057e6b4feee2a75b3d25d630922a463cfe5e7478", - "sha256:333b5e04866758b11bda5f5315b4e671d15755fc6ed3b7969721bc6311d0ee36", - "sha256:33d5ebc93c39aed4b5bc769f8ce0819bc50e74bb95d57a35f838f1c4378978e0", - "sha256:380e029bb4b1d34cf560fcc8950bf6b57c2ef0c9c8b7c7ac20b7c524a730fadd", - "sha256:387f655444d912a963ab68abf64bf6e178a13c8e4aa945cb27388fd01a02e6f1", - "sha256:3dd63d0bbbe75797b743f35d37a4cca7ca7ba35423a0de742ae2985752f20c6d", - "sha256:419780f8583ddb544ffa86f9d44a7fcc183cd826101af4e5ffe535b6765f5f6b", - "sha256:4852f4bf88f0e2d9bdf91279892f5740ed22ae368335a37a52b92a5c88691140", - "sha256:49532d7939cc51f8e99efc326090c54acf5437ed88b9c904cc8015b3c4eda9c9", - "sha256:4baf4b579b108062e91bd2a991dc98b9dc3dc06e6288db2d98895eea8acbac22", - "sha256:4d59f88c4daa36b8c38e59ac7bffed6f5d7f68eaccad471484bf587b28ccc478", - "sha256:4fc242e9da4af48714199216eb535b61e8f8d66552c8819e33fc7806bd465a09", - "sha256:532a84a82156a82529ec401d1c25d677c6543c791e54a263aa139541c363995f", - "sha256:5341ce3d01ef3c7418a72e370bf028c7aeb16895e79e115fe4c954fff990489e", - "sha256:53d0f2c59bce399b8010a21bc779b4f8c32d0f582b2284ac8c98dc7578b27bc4", - "sha256:55ce31bf4711da879b96d511208efb65a6165da4ba91cb3a96d86d5a8d9d23e6", - "sha256:56e9b7d6051688ca94e68c0c8a54a243f8db841911b683cedf89a29d4de91509", - "sha256:57c0d0c7e308ed5280a4900d4468bbfec51f0e1b4cde1deae7d4e639bc6b7766", - "sha256:5986fb5f380169270a0293bebebd95466a1c85010b4f1afc2727e4d17c452512", - "sha256:5bd42d0d45ea47a2f96babd82a659fbc60612ab9423a68e4a8191e538b85542a", - "sha256:5c614552c6bd1d0d907f448f75550f6b24fb56cbfce80c094908b7990cad9702", - "sha256:63a090761ddc3c1f7db5e67aa4e247b4b3bb9890080bdcdadd1b5200b8b89ac4", - "sha256:63b99b5ea9fe4f21469fb06a16ca5244307678636f11917359e3223aaeca0b67", - "sha256:66ab949424ac6504d823cba45c4c4854af5c59306a1531edb43b4dd22e17c102", - "sha256:684840b014ce83541a087fcf2d48227196576f56ae3e944d4dfe14c0a3e0ccb7", - "sha256:6871306d8b98a15e53a5f289ec1106a3a1d43e7ab6f4d785f95fcef9a7bd9504", - "sha256:6b4edee59dc089bc3948f4f6fba309f51aa2ccce63902364900aa0a553a85e97", - "sha256:6d7302b4b17fcc1cc727ce84ded7f6be4655701e8d58744f73b09cb9ed2b13df", - "sha256:6dbfe1887ffa5cf3030451a56a8f965a9da2fa82b7149357752b67a335a05fc6", - "sha256:70d226ab0306a5b8d408235cabe51d4bf3554c9e8a72d53ce0b3c5c84cf78881", - "sha256:7298562a49d95570ab1c7fc4051e72824c6a80e907993a21a41ba204223e7334", - "sha256:733e2456b68f3f126ddaf2cd500a33b25146c3676b97ea843665717bda0c5d43", - "sha256:742093f33d374098aa21c1696ac6e4874b52658c870513a297a89265a4d08fe5", - "sha256:7bac7e02915b970c3723a7a7c5df4ba7a11a3426d2a3f181e041aa506a1ff028", - "sha256:7e8bf4444b09419b77ce671088db9f875b26720b5872d97778e2545cd87dba4a", - "sha256:7f39f28ffc65de577c3bc0c7615f149e35bc927802a0f56e612db9b530f316f9", - "sha256:80441b55edbef868e2563842f5030982b04349408396e5ac2b32025fb06b5212", - "sha256:80b02d27864ebaf9b153d4b99015342382eeaed651f5591ce6f07e840307c56d", - "sha256:88cb0b35b63717ef1e41d62f4f8717166f7c6245064957907cfe177cc144357c", - "sha256:8c490191fa1218851f8a80c5a21a05a6f680ac5aebc2e688b71cbfe592f8fec6", - "sha256:8e3f8b1733078ac663dad57e20060e16389a60ab542f18a97931f3a2a2dd64a4", - "sha256:8f34801b251ca43ad70691fb08b606a2e55f06b9c9fb1fc18fd9402b19d70f7b", - "sha256:8fc7197ff33047ce43a67851ccf190acb5b05c52fd4a001bb55766358f04da68", - "sha256:92830c16885f29163e1c2da1f3c1edb226df1210ec7e8711aaabba3dd0d5470a", - "sha256:9412a06b8a8e09abd6313d96864b6d7713c6003a365995a5c70cfb9209df1570", - "sha256:948d9f2ca7841794dd9b204644963a4bcd69ced4e959b0d4ecf1b8ce994a6daa", - "sha256:9a0026cfbf29f07649b0e34509091a2a6016ff8844b127de150efce1c3aff60b", - "sha256:9c431431abf55b64347ddc8df68b3ef840269cb0aa5bc2d26ad9506eb4b1b866", - "sha256:9e14fb70ca4f7efa924f508975199353bf653f452e4ef0a1e47549e208f943d7", - "sha256:a45857e87e9d2b005e81ddac9d815a33efd26ec67032c366629f023fe64fb415", - "sha256:a50c8af811b35b8a43b1590cf890b61ff2233225257a3cad32f43b3ec7ff1b9f", - "sha256:a6481c3b7673a86276220140456c2a6fbfe8d1fb5c613b4728293c8634134824", - "sha256:a6b54dabfaa5dbaa92f796f0c32819b4636e66aa8e9106c3d421624bd2a2d676", - "sha256:a797d8c7df9944314d309b0d9e1b354e2fa4430a05bb7604da13b6ad291bf959", - "sha256:a91a14dd95e24dc078204b18b0199226ee44644974c645dc54ee7b00c3157330", - "sha256:adfbf2e9c38b77d0db2fb32c3bdaea638fa76b4e75847283cd707521ad2475ef", - "sha256:ba3dc0af0def8c21ce7d903c59ea1e8ec4cb073f25ece9edaec7f92a286cd219", - "sha256:bb777a38797c8c7df0444533119570be18d1a4ce5478dffc00c875684df7bfcb", - "sha256:bcbe47da0aebc00a7cfe3ebdcff0373b86ce2b1856251c003e3d69c9db44b5a7", - "sha256:bd1cee053416183adcc8e6134704c46c60c3f66b8faaf9e65bf76191ca59a2f7", - "sha256:bd40d2e2f82a483de0d0a6dfd8c3895a02e55e5c9949610ecbded18188fd0a56", - "sha256:bfa73e3f163c6e8b2ec26f22285d717a5f77ab2120c97a2605d8f48b26950dac", - "sha256:c1f567489f422d40c21e53212a73bef4638d9f21043848150f8544ef1f3a6ad1", - "sha256:c3dde4ca00fe9eee3b76209711f1941bb86db42b8a75d7f2249ff9dfc026ab0e", - "sha256:c8937f1100435698c18e4da086968c4b5d70e86ea718376f833475ab3277c9aa", - "sha256:ca33c175c1cf60222d9c6d01c38fc17ec3a484f32294af781de30226b003e00f", - "sha256:ce42649e2676ad783186264d5ffc788a7612ecd7f9effb62d51c30d413a3eefe", - "sha256:cfa67afe2269b2d203cd1389c00c5bc35a287cd57860441fb0e53b371ea6a029", - "sha256:d47c915897a99d0d34a39fad4be97b4b709ab3d0d3b779ebccf2b6024a8c681e", - "sha256:d4dd676107a1d3c724a56a9d9db38166ad4cf44f924ee701414751bd18a784a0", - "sha256:d711c107e83117129b7f8bd08e9820c43ceec6204fff072a001fd82f6d13db9f", - "sha256:dc1c3fd49930494a67dcec37d0558d99d84eca8eb3f03b17198424538f2608d7", - "sha256:de3a32b4b76d46f1eb42b24a918d51d8ca52411a381748196241d59a895f7c5c", - "sha256:dfa904045d7cebfb0f01dad51352551cce1d873d7c3f80c7ded7d42f8cac8f89", - "sha256:e138d141ec5a6ec800b6d01ddc3e5561ce1c940215e0eb9960876bfde7186aae", - "sha256:e15a408f71a6c8c87b364f1f15a6cd9c1baca12bbc47a326ac8ab99ec7ad3c64", - "sha256:e1d86b75de787481b04d112067a4033e1ecfda2a060e50318a74e4e1c9b2948c", - "sha256:e2674a5a3168349435b08fa0b82998ed2536eb9acccf7087efe26e4cd088a525", - "sha256:e58494f282215fc461b06709e9a195a24c12ba09570f25bdf9efb036acc05101", - "sha256:e627d8ef5e100556e09fb44c9571a432b10e11596d3c4043500080ca9944a91a", - "sha256:e741ffe4e2db78a1b9dd6e5d29678ce37fbaaf65dfe132e5b82a794413302ef1", - "sha256:e81aa4e9a1fcf604c8c4b51aa5d258e195a6ba81efe1da82dea3204443eba01c", - "sha256:e96cd35df012a17c87ae276196ea8f215e77d6eeca90709eb03999e2d5e3fd8a", - "sha256:ea002656a8d974daaf6089863ab0a306962c8b715db6b10879f98b781a2a5bf5", - "sha256:eae62ed60d53b3561148bcd8c2383e430af38c0deab9f2dd15f8874888ffd26f", - "sha256:eb8797b528c1ff81eef06713623562b36db3dafa106b59f83a6468df788ff0d1", - "sha256:eb98038ccd368e0d88bd92ee575c58cfaf33e77f788c36b2a89a84ee1936dc6b", - "sha256:ec444ab8f27562a363672d6a7372bc0700a1bdc9764563c57c5f9efa0e592b5f", - "sha256:ed63e8b75c193c5e5a8288d9d7b011da076cc314fafc3bfd59ec1d8a750d48c8", - "sha256:f2c9c0d910dd3f7df92f0638e7f65d8edd7f442203caf89c62fc79f11b0b73f8", - "sha256:f3020b60e3fc96d08c2a9b011f1c2e2a6bdcc09cb55df93c509b88be5cb791df", - "sha256:f47775e27388b58ce52f4f972f80e45b13c65113e9e6b6bf60148f893871dc9b", - "sha256:f70481213373d44614148f0f2e38e7905be3f021902ae5167289413196de4ba4", - "sha256:f9de7586522e5da6bee83c9cf0dcccac0857a43249cb4d721a2e312d98a684d1", - "sha256:f9f606e810858207d4b4287b4ef0dc622c2aa469548bf02b59dcc616f134f811", - "sha256:fa45f7d771094b8145af10db74704ab0f698adb682fbf3721d8090f90e42cc49" + "sha256:00018f22f38530768b73ea86c11f47e8d4df65facd4e562bd78773bd1baef35e", + "sha256:034925b5fb514f7b11aac38cd55b3fd7e9d3af23bd6497f3f20aa5b8ba58e232", + "sha256:038756db735e417ab36ee6fd7725ce412385ed2bd0767e8179a4755ea11b804f", + "sha256:04ccae6dcd9647eae6025425ab64edb4d79fde8b9e6e115ebfabc6830170e3b2", + "sha256:0aacc0a78e1d94d843a6d191f224a35893e6bdfeb77a4a89264155015c65f126", + "sha256:0bb6f9fd92f147ba11d338ef5c68af4fd2908739c09e51f186e1d90958c68cc1", + "sha256:0dcfa684966f25b335072115de2f920228a3c2caf79d4bfa2b30f6e4f674a948", + "sha256:100431e04d25a522ef2c3b94f294c4219c4de3bfc7d557b6253296145a144c11", + "sha256:120f2dda469b28d12ccff7c2230225162e174657b49cf4cd119db525414ae281", + "sha256:122171ff47d96ed8dd4bba6c0e41d8afaba3e8194949f7720431a62aa29d8895", + "sha256:13c275b483a052dd645eb2cb60d6380f1f5215e4c22d6207e17b86be6dd87ffa", + "sha256:13c345e7278c210317e77e1934b27b61394fee0dec2e8bd47e71570900f75823", + "sha256:1f669212c390eebfbe03c4e20181f5970b82c5d0a0ad1df1785f7ffbe7d61150", + "sha256:1fb8de899f0145d6c4d5d4bd0ee88a78eb980a7ffabd51e9889251b8f58f1785", + "sha256:204b79b30a0e6be0dc2301a4d385bb61472809f09c49f400497f1cdd5a165c66", + "sha256:22c17c96143c2a62dfd61b13803bc5de2ac526b8768d2141c018b965d0333b66", + "sha256:23142a8af92a13fc1e3f2ca1d940df3dcf2af1d176be41fe8d89e30a837a0b60", + "sha256:3d22c53f0ec5c18ecb3d92aa9420563b1c5d657d53f01356114978107b00b860", + "sha256:3dc8043959b50141df58ab4f398e8ae84c6f9e673a2c9407be65fc789138f4a6", + "sha256:3ea635101b739c12effd189cc19b2671c268abb03013fd1f6321ca29df3ca625", + "sha256:41afc0d3c18b59eb50970479a9c0e5544fb4b95e3a79cf2fbaece6ddefb926fe", + "sha256:4664dedcd5933364756d7251a7ea86d60246ccf73a2e00912872dacbfcef8978", + "sha256:466f836dbcf86de3f9692097a7a01533dc9926986022c6617dc364a402b265c5", + "sha256:467d28112c7faa29b7db743f40803d927c8591e9da02b6ce3d5fadc170a542a2", + "sha256:47de0bbccf4c8a9f99d82d225f7672b9dd690d8fd872007b933ef51a302c9fa6", + "sha256:484025d2eb8f6348f7876fc5a2ee742f568915039fcb31b478fd5c242bb0fe3a", + "sha256:48727d7d405d03977d01885f317328dc21d639096308de126c2c4e9950cbd3c9", + "sha256:4b182791c41c5eb1d9ed736f0ff81694b06937ca14b0d4dadde5dadba7ff6dae", + "sha256:4c6efcbb5687cf8d2aedcc2c3ed4ac6feae90b8547427d417111194873b66b06", + "sha256:4ea3a86405baa8eb0d3639ced6926ad03e07113de54cb00fd7510cb0db76a89d", + "sha256:50a196af0ce657fcde9bf8a0bbe1032e22c64d8fcec2bc926a35e7ff68b3a166", + "sha256:50da7a9edf371441dfcc56288d790985ee9840d982750580710a9789b8f4a290", + "sha256:51b99cfac514173d7b8abdfe10338193e8a0eccdfe1870b646009d2fb7cbe4b5", + "sha256:54a6dd7b478e6eb01ce15b3bb5bf771e108c6c148315bf194eb2ab776a3cac4d", + "sha256:562eaf820de045eb487afaa37e6293fe7eceb5b25e158b5a1974b7e40bf04543", + "sha256:5a8dffb5f5b3415a4669d25de48b617fd9d44b0bccfc4c2ab24b06406ecc9ecb", + "sha256:5b5cff42a522a0d81c2ae7eae5e56d0ee7365e0c4ad50c4de467d8957aff4414", + "sha256:63482db3fadebadc1d01ad33afa6045ebe2ea528eb77ccaabd33ee7d9c2bad48", + "sha256:6ca41fa40fa019cde42c21add74aadd775e71458051a15a352eabeb12eb4d084", + "sha256:6eecb343c70629f5af55a8b3e53264e44fa04e155ef7989de13668a0cb102a90", + "sha256:719c32147ba29528cb451f037bf837dcdda4ff3ddb6cdb12c4216b0973174718", + "sha256:77c8006c12154c37691b24ff293c077300c22944018c3ff70094a33e10c1d795", + "sha256:793c80a3d6b0b0e8196a2d5de37a08330125668c8012922685e17aa9108c33ac", + "sha256:7d99b91e42217d7b4b63354b15b41ce960e27d216783e04c4a350224d55842a4", + "sha256:82f794d564f4bc76b80c50b03267fe5d6589e93f08e66b7a2f674faa2fa76ebc", + "sha256:83a29cc7b21b746cb6a480189e49f49b2072812c445e66a9e38d2004d496b81c", + "sha256:869f6d5537d243080f44253491bb30aa1ec3c21754003b3bddeadedeb65842b0", + "sha256:8854969e7480e8d61ed7549eb232d95082a743e94138d98d7222ba4e9f7ecacd", + "sha256:898636a06d9bf575d2c594129085ad6b713414038276a4bfc5db7646b8a5be78", + "sha256:8e0bb6102ebe2efecf8a3292c6660a0e6fac98176af6de67f020bea1c2343717", + "sha256:8fed69bbaa307040c62195a269f82fc3edf46b510a17abb6b30a15d7dab548df", + "sha256:9862db92ef67a8a02e0d5370f07d380e14577ecb281b79720e0d7a89aedb9ee5", + "sha256:98a152052b8878e5e43a2e3a14075218adafc759547c98668a21e9485882696c", + "sha256:99516d99316062824a24d145d694f5b0d030c80da693ea6f8c4ecf71a251d8bb", + "sha256:9b285ef6bf1581310b0d5e8f6ce64f790a1c40e89c660e1320b35f7515433672", + "sha256:a131377493a59fb0f5eaeb2afd49c6540cafcfba5b0b3752bed707be9e7c4eaf", + "sha256:a1c81c89ed765198da27412aa21478f30d54ef69bf5e4480089d9c3f77b8f882", + "sha256:a2537b2cd98192323fce4244c8edbf11f3cac548a9d633dbbb12b48702f379f4", + "sha256:a41be8af1fd78ca97bc948d789a09b730d1e7587d07ca53af05758f31f4b985d", + "sha256:a631e2990b8be23178f655cae8ac6c7422af478c420dd54e25f2e26c29e766f1", + "sha256:a6a49ef161739f8018c69b371528bdb47d7342edfdee9ddc75a4d8caddf45a6e", + "sha256:ac6d929cb33dd12ad3424b75725975f0a54b5b12dbff95f2a2d660c510aa106d", + "sha256:b23291951959141173eec10f8573538e9349fa27f47a0c34323d1970bf891ee5", + "sha256:ba9fc605ac558f0de67463fb588722878641e6fa1dabcda979e8e69ff581d0bd", + "sha256:bdc144d56333c52c853c31b4e2e52cfbdb22d3da4374c00f5f3d67c42158970f", + "sha256:c073848d2b1d5561f3903879ccf4e1a70c9b1e7566c7bdcc98d082fa3e7f0a1d", + "sha256:c1018cc7f12824506f165027eabb302735b49e63af73eb4d5450c66c88f47026", + "sha256:c3ece960008dab66c6b8bb3a1350764677ee7c74ccd6270aaf1b1caf9ccebb46", + "sha256:c3fdad75e7837a475900a1d3a5cc09aa024293c3b0605155da2d42f41bc0e482", + "sha256:c8a1df39d74ec507d79c7a82c8063eee60bf80537cdeee652f576059b9cdd15c", + "sha256:c8a91e9520fbc65a799943e5c970ffbcd67905744d8becf2e75f9f0a5e8414f0", + "sha256:d10fcd9e0eeab835f492832b2a6edb5940e2f1230155f33006a8dfd3bd2c94e4", + "sha256:d435ae89073d7cd51e6b6bf78369c412216261c9c01662e7008ff00978153729", + "sha256:d7a4c1791d7aa7e192f60fe028ae409f18ccdd540f8b1e6aeb0df7816c77e4a4", + "sha256:dc384874a719c767b50a30750f937af18842ee5e288afba95a5a3ed703b1515a", + "sha256:df274e3abb4df40f4c7274dd3e587dfbb25691826c948bc98d5fead019dfb001", + "sha256:e069967cbd5e1900aafc4b5943888f6d34937fc59bf8918a1a546cb729b4b1e4", + "sha256:e194a0d5df9456995d8f510eab9f529213e7326af6b94770abf8f8b7952ddcaa", + "sha256:e1a9c14ae9573d172dc050a6f63a644457df5d01ec4d35a6a0f097f812930f83", + "sha256:e241fab6332e8fb5f14af00a4a9c6aefa22f19a336c069b7ddbf28ef8341e8d6", + "sha256:e421ac9e4b5efc11705a0d5149e641d4defdc07077f748667f359e60dc904420", + "sha256:e43679eca508ba8240d016d8cca9d27342d70184773c15bea78a23c87a1922f1", + "sha256:e584fe5f4e6681d8762982be055f1534e0170f6308a7a90f58d737bab12ff6a8", + "sha256:f114a6c86edbf17554672b050cce72abf489fe58d583c7921904d5f1c9691605", + "sha256:f2f312eef8aafc2255e3585dcf94d5da116c43ef837db91db9ecdc1bc930072d", + "sha256:f359175197fd833c8dd7a8c288f1516be45415bb5c939862ab60c2918e1e1943", + "sha256:f75999ae00a920f7dce6ecae76fa5e8674a3110e5a75f12c7a2c75ae1af53396", + "sha256:f91456507427ba36fd81b2ca11053a8e112c775325acc74e993201ea912d63e9", + "sha256:fa1fcad89d8a41d8dc10b1e54951ec1e161deabd84ed5a2c95c3c7213bdb3514", + "sha256:fa86bf9a0ed339ec9e8a9a9d0ae4dccd8671625c83f9f9f2640729b15e07fbfd", + "sha256:fcdb552ffd97151dab8e7bc3ab556dfa1512556b48a367db94b5c20253a35ee1", + "sha256:fcecbd39bd42cef905c0b51c9689c39d0cc8b88b1671e7f40d4fb213423aef3a", + "sha256:fe91d62b0594db5ea7d23fc2192182b1a7b6973f628a9b8b2e0a42a2be721ac6", + "sha256:fed8581ae26345dea1f1e0d1a96e05041a727a45e7d8d459164583e23c6ac441" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.3.2" + "markers": "python_version >= '3.8'", + "version": "==3.0.0" }, "hpack": { "hashes": [ @@ -1556,11 +1587,11 @@ }, "httpx": { "hashes": [ - "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", - "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5" + "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", + "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2" ], "markers": "python_version >= '3.8'", - "version": "==0.27.0" + "version": "==0.27.2" }, "hyperframe": { "hashes": [ @@ -1588,18 +1619,19 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "incremental": { "hashes": [ - "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0", - "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51" + "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe", + "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9" ], - "version": "==22.10.0" + "markers": "python_version >= '3.8'", + "version": "==24.7.2" }, "inflection": { "hashes": [ @@ -1625,6 +1657,73 @@ "markers": "python_version >= '3.7'", "version": "==3.1.4" }, + "jiter": { + "hashes": [ + "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df", + "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06", + "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566", + "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc", + "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a", + "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148", + "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9", + "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5", + "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646", + "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a", + "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7", + "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61", + "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f", + "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653", + "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614", + "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf", + "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc", + "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a", + "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6", + "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544", + "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961", + "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4", + "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a", + "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14", + "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf", + "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d", + "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e", + "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3", + "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248", + "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e", + "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6", + "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba", + "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e", + "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b", + "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a", + "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749", + "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e", + "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5", + "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb", + "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae", + "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104", + "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28", + "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e", + "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e", + "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389", + "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e", + "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f", + "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e", + "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e", + "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631", + "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3", + "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87", + "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb", + "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1", + "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553", + "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4", + "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403", + "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338", + "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6", + "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf", + "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989" + ], + "markers": "python_version >= '3.8'", + "version": "==0.5.0" + }, "jsonschema": { "hashes": [ "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", @@ -1667,12 +1766,12 @@ }, "kombu": { "hashes": [ - "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf", - "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9" + "sha256:ad200a8dbdaaa2bbc5f26d2ee7d707d9a1fded353a0f4bd751ce8c7d9f449c60", + "sha256:c8dd99820467610b4febbc7a9e8a0d3d7da2d35116b67184418b51cc520ea6b6" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.3.7" + "version": "==5.4.0" }, "launchdarkly-eventsource": { "hashes": [ @@ -1684,12 +1783,12 @@ }, "launchdarkly-server-sdk": { "hashes": [ - "sha256:15fa719526b891a7c251b2e445db96b89ff22df58a76eec54d9b420cc2ac46ac", - "sha256:e1d5e743791c8ceaf8285952548a2fef57ff7ba0a29644af52542fa2af78c02a" + "sha256:42f4cb25ebf547d5ebf228f0852bc3e435f395a6eb437de68c47e393729502b2", + "sha256:e547fe5d49aaf5c9537718467545dc1e38f837bb396259465035e30c1a54798a" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==9.4.0" + "version": "==9.7.1" }, "linked-services": { "extras": [ @@ -1706,161 +1805,157 @@ }, "lxml": { "hashes": [ - "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3", - "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a", - "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0", - "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b", - "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f", - "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6", - "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73", - "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d", - "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad", - "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b", - "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a", - "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5", - "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab", - "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316", - "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6", - "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df", - "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca", - "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264", - "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8", - "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f", - "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b", - "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3", - "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5", - "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed", - "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab", - "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5", - "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726", - "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d", - "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632", - "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706", - "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8", - "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472", - "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835", - "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf", - "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db", - "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d", - "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545", - "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9", - "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be", - "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe", - "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905", - "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438", - "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db", - "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776", - "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c", - "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed", - "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd", - "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484", - "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d", - "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6", - "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30", - "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182", - "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61", - "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425", - "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb", - "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1", - "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511", - "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e", - "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207", - "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b", - "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585", - "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56", - "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391", - "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85", - "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147", - "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18", - "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1", - "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa", - "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48", - "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3", - "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184", - "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67", - "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7", - "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34", - "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706", - "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8", - "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c", - "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115", - "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009", - "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466", - "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526", - "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d", - "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525", - "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14", - "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3", - "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0", - "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b", - "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1", - "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f", - "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf", - "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf", - "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0", - "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b", - "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff", - "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88", - "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2", - "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40", - "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716", - "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2", - "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2", - "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a", - "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734", - "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87", - "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48", - "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36", - "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b", - "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07", - "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c", - "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573", - "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001", - "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9", - "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3", - "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce", - "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3", - "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04", - "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927", - "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083", - "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d", - "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32", - "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9", - "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f", - "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2", - "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c", - "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d", - "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393", - "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8", - "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6", - "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66", - "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5", - "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97", - "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196", - "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836", - "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae", - "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297", - "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421", - "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6", - "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981", - "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30", - "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30", - "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f", - "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324", - "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b" + "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e", + "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229", + "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3", + "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5", + "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70", + "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15", + "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", + "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", + "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22", + "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf", + "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22", + "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", + "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727", + "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e", + "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", + "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f", + "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f", + "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", + "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", + "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de", + "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875", + "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42", + "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e", + "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6", + "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391", + "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc", + "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b", + "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237", + "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4", + "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86", + "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f", + "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a", + "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8", + "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f", + "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903", + "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03", + "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", + "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", + "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7", + "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab", + "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", + "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22", + "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", + "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b", + "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3", + "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be", + "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469", + "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", + "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a", + "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c", + "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a", + "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", + "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94", + "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442", + "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", + "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84", + "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", + "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9", + "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", + "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be", + "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", + "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", + "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21", + "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa", + "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16", + "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d", + "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe", + "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83", + "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba", + "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040", + "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763", + "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8", + "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", + "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2", + "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a", + "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b", + "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce", + "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c", + "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577", + "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", + "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71", + "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512", + "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540", + "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", + "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2", + "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", + "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce", + "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e", + "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2", + "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27", + "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1", + "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d", + "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1", + "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330", + "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920", + "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99", + "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff", + "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18", + "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", + "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c", + "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", + "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080", + "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19", + "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d", + "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70", + "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32", + "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", + "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2", + "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79", + "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", + "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5", + "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", + "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", + "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", + "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b", + "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753", + "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9", + "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", + "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033", + "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", + "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656", + "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab", + "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", + "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", + "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", + "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", + "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11", + "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c", + "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", + "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005", + "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654", + "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80", + "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e", + "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec", + "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7", + "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965", + "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945", + "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==5.2.2" + "version": "==5.3.0" }, "markdown": { "hashes": [ - "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", - "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", + "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.6" + "version": "==3.7" }, "markupsafe": { "hashes": [ @@ -1978,11 +2073,11 @@ }, "more-itertools": { "hashes": [ - "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463", - "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320" + "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27", + "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923" ], "markers": "python_version >= '3.8'", - "version": "==10.3.0" + "version": "==10.4.0" }, "msgpack": { "hashes": [ @@ -2169,91 +2264,98 @@ }, "newrelic": { "hashes": [ - "sha256:0a3debb761aca68491f14fb6e5bc0100eeef1ab314073ab4696d55cd906b4bec", - "sha256:0fff006b6d6eb86a25483a4aed216f98293ec44c29b497c1f18f23f05e059991", - "sha256:12e721c19e78a7e7a1443c327acf133d94b0c12add6ec514235a668656732011", - "sha256:16de826ddc4af4cf45fe607aeca7117dd08c948edd41aaf90b86c596a3f0eaac", - "sha256:1a614a1da090cbfbd9f5ab3fcdafc253408d76ffc0a22a73cc16fd5c97b67b97", - "sha256:2c8168a2bd5db45566471306ef962e925ab2c9fa92079c3f5863d4a4585dfcbd", - "sha256:353a11bfa737043309025a0949cb6d7cfd7c7209cdee7abe8af774af8f44586f", - "sha256:3d93402402a32905950d6e646ec220bdb10a522e896c219941c92e474cfa2cdb", - "sha256:434be59492f52c9b8401adada597a5dca037cf003374d5dd461bca1db64d3ca7", - "sha256:43cccc52c3ec9c0aa457d3d14557bb19383dbad1afe018d9063c0a7ffbe29232", - "sha256:4c73d470a61a9f09a204fd47a4822af0d1e52ccac36a6737f72e0cbb2a22dba6", - "sha256:4cb87e19a2e522417e2b421b799fe0c20cedf953a1e061fbf50bb21683e2420f", - "sha256:4f83f8023a12e8b4ec217e59e1a56375ad141a2f7a620df363a688e1f1d3e93b", - "sha256:51c8c4b3d103db423640fda4d6c6b58c79558097ebd111a62e957408a4cf1c71", - "sha256:61253b5cf43787b0c19d00662eb7e60d4c1018c09374e9b0825338e831cad900", - "sha256:8b4c343c0cf2a0b59467f9daf0f303d28dad6795dc75bc54582d3198e1d2b4da", - "sha256:923e83e40e30fc7ca0f441bb9c745274f7236869bfbe65da487714bfcd4f46c0", - "sha256:98d5bd7222dd96b0fc194dd2142827e9b70959527f2480fef61da82857b00cb2", - "sha256:bae6dfffca34591771bc4b6c493c68c15209d2b4e3d79c46239204014a20e53d", - "sha256:bde6db956d363d8d846d3d0c76d4a4a539c809cebb40e45a53d099a39cdd0ea3", - "sha256:be6315beacb0ac7ac99c24e38b8ef072e3930f4d06970fb2fa84da0a990c3467", - "sha256:c349e3b611e8da446aa8045c92e986d77bcd945903bfa08092b9a7c217036fd9", - "sha256:d5040601cedf308faa818cc9fc5c8e48283bdcb4c02a2e1e468e67e037200f83", - "sha256:d8f3f8f8d27a1bafc3c4cc930a762d96119897f1808bccd162597b510e236de9", - "sha256:df75838fd766252282070a5dcdc78906c4b9e0934280c601815c5eb1cc6ce6ff", - "sha256:e8c1ed86f9c2f0954817d4405a4fa1cb09b0cc720b3c702fa2cac1c4fffeaec1", - "sha256:e94cacdeb15ddfc0a1f8353d896a1069da1302416b4afbf67a953f0706235be2", - "sha256:ec7a46b5c4e77374a1c01b637fca63c187218c153be075bc806663881c53a03e", - "sha256:f2bed7bfbcbd0e95b6ad1c82e30098d79678cbc6410fc2f88c439e6786c6640a" + "sha256:07743279225f860444283c4dcaa7ccd02944e61ce95d666b6ab00188bb1f7f99", + "sha256:0bd29b99dce7402635922df984c338358fbe159f0df9b153d1e913bed77210d3", + "sha256:0e1e40fe4b953925f86590a74a7de2488fa37f1ba9c9f5ebcc3f765b9ba3bd1b", + "sha256:0f5e404d46d6e24c920dfb0ad441e88fde633ced747f9894c1654263c9ed2c59", + "sha256:14894911effd29f7bca70126ff991d4291198c6b1d9a29c9aa10d9743a685c27", + "sha256:273c30db450d2ae3fa0c2bce583e7d64a4cdb2b957c94bf4202bcfb30bfee411", + "sha256:348c298232d6323b31d65d95dc97ac55d9b0117feb713a8f1c6baa056e7f6204", + "sha256:3c5cc86c88302623375e282ec17a1c55da739f2ab58ca48607f85c48a43cba33", + "sha256:3eba2b1a0c1b31d42f5ea1a80f60e57483898faf86bb24474dbd7d0a7fad41b0", + "sha256:49cabe8222da2515d1e6a113f9fccd8a9d41ca3678dec9592e87a01ea0005056", + "sha256:52c801bd2147acfec8cbbf92adba8cab3d8d19982eceaa08409a3938d6f8524a", + "sha256:632435a5f5170dd9a72012b6c21ca62ec2e9e4b24e7d52fc4d895a359dbba652", + "sha256:63636e34ab52a303ad21afd5d7f5c6418e814fcb8d3430266db4a3cfc7e19aef", + "sha256:6ee7edcd5d364c6d2d97922aa436f5d27788a7ab9e8aa845ecaf59ddf7c66457", + "sha256:7405bfc65d6d983a738e756044956f06c366a234fdde0ccf7cf0d52fedfd72e4", + "sha256:743b5ff8a2ad02989ea87334391506dbcb578436a4d8cc49e819421ca2e5f743", + "sha256:75c73cd71005e1467a76b9108dbd355fc256e12b822b2fdc28810bde991cc92e", + "sha256:7ebbef59d94d5feaae5eab56a44df5a677b90ac75e437d48eb6b71ae7d8e6f9d", + "sha256:aa8addb08bf7595eeb65ada2b33d9272541b6e872e519382be28690a920f4785", + "sha256:abc7487cff166de747da8b05b108150a6f7f2c855b3d2547cfb1f53b9330e7dd", + "sha256:b70eed56613147a96a5ae4c559c42f54ea00d4d52e5679ac9b9d93c4d6e572a4", + "sha256:bd417c5873b45c8154cca92d81ab159f6c5058138ff848cba4c9e02f10ad5c61", + "sha256:c59adb97aaa4d111a33e3f936bf85d990f8837cabe51cebb1c6128778006563f", + "sha256:d5fe36aae1154610d2d03cd8cdfc52b6ea3f63a0b672b14185e4e1532016f826", + "sha256:d720f97c844a015cd54d69e052f0956e93e45fcd33b829e8cc20356af6a0b0c4", + "sha256:db3cc230970902c2548e5d747ce96d38bc009d087cf49bef4ce8679cdedc57c1", + "sha256:dbfe4a0f2d34d8d9ef31cee7c73a49d3fe2b9a92129d70819058f1df736cdd38", + "sha256:ec37f7bd9df294b17948fcfa761e0fe06301c7eaea4bbd97f4afe04dc2acbbac", + "sha256:f9ab59b30729532bab64497910c1051665269814366be8ee3fde2391032dd9f6" ], "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==9.12.0" + "version": "==9.13.0" }, "numpy": { "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" + "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", + "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", + "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", + "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", + "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", + "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", + "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", + "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", + "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", + "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", + "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", + "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", + "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", + "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", + "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", + "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", + "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", + "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", + "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", + "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", + "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", + "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", + "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", + "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", + "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", + "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", + "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", + "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", + "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", + "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", + "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", + "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", + "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", + "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", + "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", + "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", + "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", + "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", + "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", + "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", + "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", + "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", + "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", + "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", + "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", + "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", + "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", + "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", + "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", + "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", + "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", + "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.0.0" + "markers": "python_version >= '3.10'", + "version": "==2.1.0" }, "oauthlib": { "hashes": [ @@ -2265,12 +2367,12 @@ }, "openai": { "hashes": [ - "sha256:1b9a6ada4239b91f38f51c426c6ee2746a2069c92cbf25ed8694e5ec00ff4597", - "sha256:307007e2036d57115612c1ecb50e9bc98fcc93537109a9f9efa1b4eedb2ea968" + "sha256:1a748c2728edd3a738a72a0212ba866f4fdbe39c9ae03813508b267d45104abe", + "sha256:e607aff9fc3e28eade107e5edd8ca95a910a4b12589336d3cbb6bfe2ac306b3c" ], "index": "pypi", "markers": "python_full_version >= '3.7.1'", - "version": "==1.35.15" + "version": "==1.43.0" }, "packaging": { "hashes": [ @@ -2326,10 +2428,10 @@ }, "phonenumberslite": { "hashes": [ - "sha256:baa52a1042caaa12b9841cbd701e8de554479c7e4e087e19a36d14c1d05806d4", - "sha256:be52281499cb7aea74ebff9b96fb6cfe5b9d88a58c720c93cd7c154afa27c706" + "sha256:63d650f2fe464602c8b01b7e0cda6b7057811a2410cbd1d21d90374642abdc51", + "sha256:ab6aa6e5fa115c89ea63e3c316c764ff449f8ecb826499cfc925f6a39f29e174" ], - "version": "==8.13.40" + "version": "==8.13.44" }, "pillow": { "hashes": [ @@ -2420,12 +2522,12 @@ }, "pip": { "hashes": [ - "sha256:7cd207eed4c60b0f411b444cd1464198fe186671c323b6cd6d433ed80fc9d247", - "sha256:e5458a0b89f2755e0ee8c0c77613fe5273e05f337907874d64f13171a898a7ff" + "sha256:2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2", + "sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==24.1.2" + "version": "==24.2" }, "platformdirs": { "hashes": [ @@ -2482,20 +2584,20 @@ }, "protobuf": { "hashes": [ - "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", - "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", - "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", - "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", - "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", - "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", - "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", - "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", - "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", - "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", - "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" + "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1", + "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d", + "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040", + "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835", + "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1", + "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca", + "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f", + "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d", + "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978", + "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4", + "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b" ], "markers": "python_version >= '3.8'", - "version": "==4.25.3" + "version": "==4.25.4" }, "psycopg": { "extras": [ @@ -2820,20 +2922,20 @@ }, "pyfcm": { "hashes": [ - "sha256:6e72d0785a22cc317b0c3ad6f293a3e027789453b3b6ab6a46bedf8577b4a8bf", - "sha256:86244a0230f3ba6581160dfb6b3ef190dd8e3857277a35f356ad21d871b3644e" + "sha256:17f7377393514d98ea28ed56fe4360089802819699313c99bc2c80c6e29ed389", + "sha256:e063ef09f1ff0d0caaaec5f63339ec14176dd5d9cc6ffdb5c0110a9ae2665f0a" ], "index": "pypi", - "version": "==2.0.4" + "version": "==2.0.6" }, "pygithub": { "hashes": [ - "sha256:0148d7347a1cdeed99af905077010aef81a4dad988b0ba51d4108bf66b443f7e", - "sha256:65b499728be3ce7b0cd2cd760da3b32f0f4d7bc55e5e0677617f90f6564e793e" + "sha256:6601e22627e87bac192f1e2e39c6e6f69a43152cfb8f307cee575879320b3051", + "sha256:81935aa4bdc939fba98fee1cb47422c09157c56a27966476ff92775602b9ee24" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.3.0" + "markers": "python_version >= '3.8'", + "version": "==2.4.0" }, "pygments": { "hashes": [ @@ -2848,11 +2950,11 @@ "crypto" ], "hashes": [ - "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", - "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" + "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", + "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" ], - "markers": "python_version >= '3.7'", - "version": "==2.8.0" + "markers": "python_version >= '3.8'", + "version": "==2.9.0" }, "pymemcache": { "hashes": [ @@ -2880,18 +2982,18 @@ }, "pyopenssl": { "hashes": [ - "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", - "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f" + "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", + "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d" ], - "version": "==24.1.0" + "version": "==24.2.1" }, "pyparsing": { "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", + "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032" ], "markers": "python_version >= '3.1'", - "version": "==3.1.2" + "version": "==3.1.4" }, "pyrfc3339": { "hashes": [ @@ -2902,20 +3004,20 @@ }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" ], "markers": "python_version >= '3.8'", - "version": "==8.2.2" + "version": "==8.3.2" }, "pytest-django": { "hashes": [ - "sha256:5d054fe011c56f3b10f978f41a8efb2e5adfc7e680ef36fb571ada1f24779d90", - "sha256:ca1ddd1e0e4c227cf9e3e40a6afc6d106b3e70868fd2ac5798a22501271cd0c7" + "sha256:1d83692cb39188682dbb419ff0393867e9904094a549a7d38a3154d5731b2b99", + "sha256:8bf7bc358c9ae6f6fc51b6cebb190fe20212196e6807121f11bd6a3b03428314" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "pytest-env": { "hashes": [ @@ -2961,166 +3063,189 @@ }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "pyzmq": { "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" + "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", + "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", + "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9", + "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", + "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", + "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc", + "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed", + "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097", + "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", + "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", + "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6", + "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6", + "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2", + "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", + "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", + "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732", + "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5", + "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", + "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", + "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", + "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", + "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", + "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277", + "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", + "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", + "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", + "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c", + "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f", + "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", + "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a", + "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44", + "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20", + "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", + "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8", + "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780", + "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", + "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", + "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", + "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", + "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", + "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", + "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", + "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c", + "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f", + "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231", + "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", + "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", + "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", + "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", + "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073", + "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", + "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4", + "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", + "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", + "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", + "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", + "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a", + "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb", + "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd", + "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f", + "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", + "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", + "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", + "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", + "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988", + "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640", + "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c", + "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", + "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1", + "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", + "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289", + "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", + "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", + "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", + "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", + "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", + "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", + "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8", + "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", + "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9", + "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93", + "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", + "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", + "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6", + "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", + "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2", + "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", + "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc", + "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", + "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", + "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", + "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", + "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940", + "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db", + "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", + "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27", + "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3", + "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", + "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98", + "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", + "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", + "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", + "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", + "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec", + "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951", + "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", + "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", + "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6", + "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919" ], "markers": "python_version >= '3.7'", - "version": "==26.0.3" + "version": "==26.2.0" }, "redis": { "extras": [ "hiredis" ], "hashes": [ - "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db", - "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b" + "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870", + "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4" ], "markers": "python_version >= '3.7'", - "version": "==5.0.7" + "version": "==5.0.8" }, "referencing": { "hashes": [ @@ -3149,108 +3274,112 @@ }, "rpds-py": { "hashes": [ - "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834", - "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4", - "sha256:071d4adc734de562bd11d43bd134330fb6249769b2f66b9310dab7460f4bf714", - "sha256:1540d807364c84516417115c38f0119dfec5ea5c0dd9a25332dea60b1d26fc4d", - "sha256:15e65395a59d2e0e96caf8ee5389ffb4604e980479c32742936ddd7ade914b22", - "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34", - "sha256:1c26da90b8d06227d7769f34915913911222d24ce08c0ab2d60b354e2d9c7aff", - "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb", - "sha256:1dd46f309e953927dd018567d6a9e2fb84783963650171f6c5fe7e5c41fd5666", - "sha256:2575efaa5d949c9f4e2cdbe7d805d02122c16065bfb8d95c129372d65a291a0b", - "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b", - "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e", - "sha256:3384d278df99ec2c6acf701d067147320b864ef6727405d6470838476e44d9e8", - "sha256:34a01a4490e170376cd79258b7f755fa13b1a6c3667e872c8e35051ae857a92b", - "sha256:354f3a91718489912f2e0fc331c24eaaf6a4565c080e00fbedb6015857c00582", - "sha256:37f46bb11858717e0efa7893c0f7055c43b44c103e40e69442db5061cb26ed34", - "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b", - "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581", - "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521", - "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8", - "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc", - "sha256:4d438e4c020d8c39961deaf58f6913b1bf8832d9b6f62ec35bd93e97807e9cbc", - "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9", - "sha256:5039e3cef7b3e7a060de468a4a60a60a1f31786da94c6cb054e7a3c75906111c", - "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68", - "sha256:52e466bea6f8f3a44b1234570244b1cff45150f59a4acae3fcc5fd700c2993ca", - "sha256:535d4b52524a961d220875688159277f0e9eeeda0ac45e766092bfb54437543f", - "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb", - "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed", - "sha256:5c872814b77a4e84afa293a1bee08c14daed1068b2bb1cc312edbf020bbbca2b", - "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600", - "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac", - "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5", - "sha256:6b31f059878eb1f5da8b2fd82480cc18bed8dcd7fb8fe68370e2e6285fa86da6", - "sha256:6d45080095e585f8c5097897313def60caa2046da202cdb17a01f147fb263b81", - "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9", - "sha256:6fe87efd7f47266dfc42fe76dae89060038f1d9cb911f89ae7e5084148d1cc08", - "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07", - "sha256:75a6076289b2df6c8ecb9d13ff79ae0cad1d5fb40af377a5021016d58cd691ec", - "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526", - "sha256:79e205c70afddd41f6ee79a8656aec738492a550247a7af697d5bd1aee14f766", - "sha256:7c98298a15d6b90c8f6e3caa6457f4f022423caa5fa1a1ca7a5e9e512bdb77a4", - "sha256:7ec72df7354e6b7f6eb2a17fa6901350018c3a9ad78e48d7b2b54d0412539a67", - "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c", - "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a", - "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479", - "sha256:850720e1b383df199b8433a20e02b25b72f0fded28bc03c5bd79e2ce7ef050be", - "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213", - "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa", - "sha256:8b1a94b8afc154fbe36978a511a1f155f9bd97664e4f1f7a374d72e180ceb0ae", - "sha256:8d6ad132b1bc13d05ffe5b85e7a01a3998bf3a6302ba594b28d61b8c2cf13aaf", - "sha256:8eb488ef928cdbc05a27245e52de73c0d7c72a34240ef4d9893fdf65a8c1a955", - "sha256:90bf55d9d139e5d127193170f38c584ed3c79e16638890d2e36f23aa1630b952", - "sha256:9133d75dc119a61d1a0ded38fb9ba40a00ef41697cc07adb6ae098c875195a3f", - "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210", - "sha256:959179efb3e4a27610e8d54d667c02a9feaa86bbabaf63efa7faa4dfa780d4f1", - "sha256:9625367c8955e4319049113ea4f8fee0c6c1145192d57946c6ffcd8fe8bf48dd", - "sha256:9da6f400eeb8c36f72ef6646ea530d6d175a4f77ff2ed8dfd6352842274c1d8b", - "sha256:9e65489222b410f79711dc3d2d5003d2757e30874096b2008d50329ea4d0f88c", - "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed", - "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55", - "sha256:a5da93debdfe27b2bfc69eefb592e1831d957b9535e0943a0ee8b97996de21b5", - "sha256:a6e605bb9edcf010f54f8b6a590dd23a4b40a8cb141255eec2a03db249bc915b", - "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e", - "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b", - "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a", - "sha256:ab1932ca6cb8c7499a4d87cb21ccc0d3326f172cfb6a64021a889b591bb3045c", - "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378", - "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be", - "sha256:b0da31853ab6e58a11db3205729133ce0df26e6804e93079dee095be3d681dc1", - "sha256:b1c30841f5040de47a0046c243fc1b44ddc87d1b12435a43b8edff7e7cb1e0d0", - "sha256:b228e693a2559888790936e20f5f88b6e9f8162c681830eda303bad7517b4d5a", - "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2", - "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633", - "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d", - "sha256:bcf426a8c38eb57f7bf28932e68425ba86def6e756a5b8cb4731d8e62e4e0223", - "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa", - "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533", - "sha256:c5c9581019c96f865483d031691a5ff1cc455feb4d84fc6920a5ffc48a794d8a", - "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc", - "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248", - "sha256:cb0f6eb3a320f24b94d177e62f4074ff438f2ad9d27e75a46221904ef21a7b05", - "sha256:ce84a7efa5af9f54c0aa7692c45861c1667080814286cacb9958c07fc50294fb", - "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d", - "sha256:dab8d921b55a28287733263c0e4c7db11b3ee22aee158a4de09f13c93283c62d", - "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388", - "sha256:dd36b712d35e757e28bf2f40a71e8f8a2d43c8b026d881aa0c617b450d6865c9", - "sha256:e19509145275d46bc4d1e16af0b57a12d227c8253655a46bbd5ec317e941279d", - "sha256:e21cc693045fda7f745c790cb687958161ce172ffe3c5719ca1764e752237d16", - "sha256:e54548e0be3ac117595408fd4ca0ac9278fde89829b0b518be92863b17ff67a2", - "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709", - "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0", - "sha256:ebcbf356bf5c51afc3290e491d3722b26aaf5b6af3c1c7f6a1b757828a46e336", - "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c", - "sha256:f2afd2164a1e85226fcb6a1da77a5c8896c18bfe08e82e8ceced5181c42d2179", - "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0", - "sha256:f68eea5df6347d3f1378ce992d86b2af16ad7ff4dcb4a19ccdc23dea901b87fb", - "sha256:f757f359f30ec7dcebca662a6bd46d1098f8b9fb1fcd661a9e13f2e8ce343ba1", - "sha256:fb37bd599f031f1a6fb9e58ec62864ccf3ad549cf14bac527dbfa97123edcca4" + "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", + "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", + "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5", + "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6", + "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef", + "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2", + "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29", + "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318", + "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b", + "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399", + "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739", + "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee", + "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", + "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a", + "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344", + "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2", + "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03", + "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5", + "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22", + "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e", + "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96", + "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", + "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752", + "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075", + "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253", + "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee", + "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad", + "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5", + "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce", + "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7", + "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b", + "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", + "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", + "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3", + "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec", + "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209", + "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921", + "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045", + "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074", + "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580", + "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", + "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5", + "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3", + "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0", + "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", + "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", + "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db", + "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc", + "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789", + "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f", + "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", + "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c", + "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232", + "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6", + "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c", + "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", + "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489", + "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94", + "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751", + "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", + "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda", + "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", + "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51", + "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c", + "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8", + "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989", + "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511", + "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1", + "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2", + "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150", + "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c", + "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965", + "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f", + "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58", + "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b", + "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", + "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d", + "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821", + "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de", + "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121", + "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855", + "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272", + "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60", + "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02", + "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1", + "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140", + "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", + "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940", + "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364", + "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4", + "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e", + "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420", + "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5", + "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24", + "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c", + "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf", + "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f", + "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e", + "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab", + "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08", + "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92", + "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", + "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8" ], "markers": "python_version >= '3.8'", - "version": "==0.19.0" + "version": "==0.20.0" }, "rsa": { "hashes": [ @@ -3293,11 +3422,11 @@ }, "setuptools": { "hashes": [ - "sha256:3d8531791a27056f4a38cd3e54084d8b1c4228ff9cf3f2d7dd075ec99f9fd70d", - "sha256:f501b6e6db709818dc76882582d9c516bf3b67b948864c5fa1d1624c09a49207" + "sha256:bea195a800f510ba3a2bc65645c88b7e016fe36709fefc58a880c4ae8a0138d7", + "sha256:cee604bd76cc092355a4e43ec17aee5369095974f41f088676724dc6bc2c9ef8" ], "markers": "python_version >= '3.8'", - "version": "==71.0.3" + "version": "==74.1.0" }, "six": { "hashes": [ @@ -3317,64 +3446,62 @@ }, "soupsieve": { "hashes": [ - "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", - "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" + "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", + "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" ], "markers": "python_version >= '3.8'", - "version": "==2.5" + "version": "==2.6" }, "sqlalchemy": { "hashes": [ - "sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94", - "sha256:1e135fff2e84103bc15c07edd8569612ce317d64bdb391f49ce57124a73f45c5", - "sha256:1f8e1c6a6b7f8e9407ad9afc0ea41c1f65225ce505b79bc0342159de9c890782", - "sha256:24bb0f81fbbb13d737b7f76d1821ec0b117ce8cbb8ee5e8641ad2de41aa916d3", - "sha256:29d4247313abb2015f8979137fe65f4eaceead5247d39603cc4b4a610936cd2b", - "sha256:2c286fab42e49db23c46ab02479f328b8bdb837d3e281cae546cc4085c83b680", - "sha256:2f251af4c75a675ea42766880ff430ac33291c8d0057acca79710f9e5a77383d", - "sha256:346ed50cb2c30f5d7a03d888e25744154ceac6f0e6e1ab3bc7b5b77138d37710", - "sha256:3491c85df263a5c2157c594f54a1a9c72265b75d3777e61ee13c556d9e43ffc9", - "sha256:427988398d2902de042093d17f2b9619a5ebc605bf6372f7d70e29bde6736842", - "sha256:427c282dd0deba1f07bcbf499cbcc9fe9a626743f5d4989bfdfd3ed3513003dd", - "sha256:49e3772eb3380ac88d35495843daf3c03f094b713e66c7d017e322144a5c6b7c", - "sha256:4dae6001457d4497736e3bc422165f107ecdd70b0d651fab7f731276e8b9e12d", - "sha256:5b5de6af8852500d01398f5047d62ca3431d1e29a331d0b56c3e14cb03f8094c", - "sha256:5bbce5dd7c7735e01d24f5a60177f3e589078f83c8a29e124a6521b76d825b85", - "sha256:5bed4f8c3b69779de9d99eb03fd9ab67a850d74ab0243d1be9d4080e77b6af12", - "sha256:618827c1a1c243d2540314c6e100aee7af09a709bd005bae971686fab6723554", - "sha256:6ab773f9ad848118df7a9bbabca53e3f1002387cdbb6ee81693db808b82aaab0", - "sha256:6e41cb5cda641f3754568d2ed8962f772a7f2b59403b95c60c89f3e0bd25f15e", - "sha256:7027be7930a90d18a386b25ee8af30514c61f3852c7268899f23fdfbd3107181", - "sha256:763bd97c4ebc74136ecf3526b34808c58945023a59927b416acebcd68d1fc126", - "sha256:7d0dbc56cb6af5088f3658982d3d8c1d6a82691f31f7b0da682c7b98fa914e91", - "sha256:80e63bbdc5217dad3485059bdf6f65a7d43f33c8bde619df5c220edf03d87296", - "sha256:80e7f697bccc56ac6eac9e2df5c98b47de57e7006d2e46e1a3c17c546254f6ef", - "sha256:84e10772cfc333eb08d0b7ef808cd76e4a9a30a725fb62a0495877a57ee41d81", - "sha256:853fcfd1f54224ea7aabcf34b227d2b64a08cbac116ecf376907968b29b8e763", - "sha256:99224d621affbb3c1a4f72b631f8393045f4ce647dd3262f12fe3576918f8bf3", - "sha256:a251146b921725547ea1735b060a11e1be705017b568c9f8067ca61e6ef85f20", - "sha256:a551d5f3dc63f096ed41775ceec72fdf91462bb95abdc179010dc95a93957800", - "sha256:a5d2e08d79f5bf250afb4a61426b41026e448da446b55e4770c2afdc1e200fce", - "sha256:a752bff4796bf22803d052d4841ebc3c55c26fb65551f2c96e90ac7c62be763a", - "sha256:afb1672b57f58c0318ad2cff80b384e816735ffc7e848d8aa51e0b0fc2f4b7bb", - "sha256:bcdfb4b47fe04967669874fb1ce782a006756fdbebe7263f6a000e1db969120e", - "sha256:bdb7b4d889631a3b2a81a3347c4c3f031812eb4adeaa3ee4e6b0d028ad1852b5", - "sha256:c124912fd4e1bb9d1e7dc193ed482a9f812769cb1e69363ab68e01801e859821", - "sha256:c294ae4e6bbd060dd79e2bd5bba8b6274d08ffd65b58d106394cb6abbf35cf45", - "sha256:ca5ce82b11731492204cff8845c5e8ca1a4bd1ade85e3b8fcf86e7601bfc6a39", - "sha256:cb8f9e4c4718f111d7b530c4e6fb4d28f9f110eb82e7961412955b3875b66de0", - "sha256:d2de46f5d5396d5331127cfa71f837cca945f9a2b04f7cb5a01949cf676db7d1", - "sha256:d913f8953e098ca931ad7f58797f91deed26b435ec3756478b75c608aa80d139", - "sha256:de9acf369aaadb71a725b7e83a5ef40ca3de1cf4cdc93fa847df6b12d3cd924b", - "sha256:e93983cc0d2edae253b3f2141b0a3fb07e41c76cd79c2ad743fc27eb79c3f6db", - "sha256:f12aaf94f4d9679ca475975578739e12cc5b461172e04d66f7a3c39dd14ffc64", - "sha256:f68016f9a5713684c1507cc37133c28035f29925c75c0df2f9d0f7571e23720a", - "sha256:f7ea11727feb2861deaa293c7971a4df57ef1c90e42cb53f0da40c3468388000", - "sha256:f98dbb8fcc6d1c03ae8ec735d3c62110949a3b8bc6e215053aa27096857afb45" + "sha256:0465b8a68f8f4de754c1966c45b187ac784ad97bc9747736f913130f0e1adea0", + "sha256:07ba54f09033d387ae9df8d62cbe211ed7304e0bfbece1f8c55e21db9fae5c11", + "sha256:122d7b5722df1a24402c6748bbb04687ef981493bb559d0cc0beffe722e0e6ed", + "sha256:13fc34b35d8ddb3fbe3f8fcfdf6c2546e676187f0fb20f5774da362ddaf8fa2d", + "sha256:16bb9fa4d00b4581b14d9f0e2224dc7745b854aa4687738279af0f48f7056c98", + "sha256:197065b91456574d70b6459bfa62bc0b52a4960a29ef923c375ec427274a3e05", + "sha256:1a38834b4c183c33daf58544281395aad2e985f0b47cca1e88ea5ada88344e63", + "sha256:1a96aa8d425047551676b0e178ddb0683421e78eda879ab55775128b2e612cae", + "sha256:2774c24c405136c3ef472e2352bdca7330659d481fbf2283f996c0ef9eb90f22", + "sha256:421306c4b936b0271a3ce2dc074928d5ece4a36f9c482daa5770f44ecfc3a883", + "sha256:437592b341a3229dd0443c9c803b0bf0a466f8f539014fef6cdb9c06b7edb7f9", + "sha256:4604d42b2abccba266d3f5bbe883684b5df93e74054024c70d3fbb5eea45e530", + "sha256:4e10ac36f0b994235c13388b39598bf27219ec8bdea5be99bdac612b01cbe525", + "sha256:4fe5168d0249c23f537950b6d75935ff2709365a113e29938a979aec36668ecf", + "sha256:5e6ab710c4c064755fd92d1a417bef360228a19bdf0eee32b03aa0f5f8e9fe0d", + "sha256:5f67b9e9dcac3241781e96575468d55a42332157dee04bdbf781df573dff5f85", + "sha256:616492f5315128a847f293a7c552f3561ac7e996d2aa5dc46bef4fb0d3781f1d", + "sha256:626be971ff89541cfd3e70b54be00b57a7f8557204decb6223ce0428fec058f3", + "sha256:670c7769bf5dcae9aff331247b5d82fe635c63731088a46ce68ba2ba519ef36e", + "sha256:68a614765197b3d13a730d631a78c3bb9b3b72ba58ed7ab295d58d517464e315", + "sha256:6dd06572872ca13ef5a90306a3e5af787498ddaa17fb00109b1243642646cd69", + "sha256:784272ceb5eb71421fea9568749bcbe8bd019261a0e2e710a7efa76057af2499", + "sha256:83a9c3514ff19d9d30d8a8d378b24cd1dfa5528d20891481cb5f196117db6a48", + "sha256:86b11640251f9a9789fd96cd6e5d176b1c230230c70ad40299bcbcc568451b4c", + "sha256:89d8ac4158ef68eea8bb0f6dd0583127d9aa8720606964ba8eee20b254f9c83a", + "sha256:8b8608d162d3bd29d807aab32c3fb6e2f8e225a43d1c54c917fed38513785380", + "sha256:93e90aa3e3b2f8e8cbae4d5509f8e0cf82972378d323c740a8df1c1e9f484172", + "sha256:95123f3a1e0e8020848fd32ba751db889a01a44e4e4fef7e58c87ddd0b2fca59", + "sha256:991e42fdfec561ebc6a4fae7161a86d129d6069fa14210b96b8dd752afa7059c", + "sha256:9d7368df54d3ed45a18955f6cec38ebe075290594ac0d5c87a8ddaff7e10de27", + "sha256:a8c2f2a0b2c4e3b86eb58c9b6bb98548205eea2fba9dae4edfd29dc6aebbe95a", + "sha256:a9d4d132198844bd6828047135ce7b887687c92925049a2468a605fc775c7a1a", + "sha256:b61ac5457d91b5629a3dea2b258deb4cdd35ac8f6fa2031d2b9b2fff5b3396da", + "sha256:bc8be4df55e8fde3006d9cb1f6b3df2ba26db613855dc4df2c0fcd5ec15cb3b7", + "sha256:c05fe05941424c2f3747a8952381b7725e24cba2ca00141380e54789d5b616b6", + "sha256:c0cf8c0af9563892c6632f7343bc393dfce6eeef8e4d10c5fadba9c0390520bd", + "sha256:c15d1f1fcf1f9bec0499ae1d9132b950fcc7730f2d26d10484c8808b4e077816", + "sha256:c58e011e9e6373b3a091d83f20601fb335a3b4bace80bfcb914ac168aad3b70d", + "sha256:cd534c716f86bdf95b7b984a34ee278c91d1b1d7d183e7e5ff878600b1696046", + "sha256:d021699b9007deb7aa715629078830c99a5fec2753d9bdd5ff33290d363ef755", + "sha256:d13d4dfbc6e52363886b47cf02cf68c5d2a37c468626694dc210d7e97d4ad330", + "sha256:eaaeedbceb4dfd688fff2faf25a9a87a391f548811494f7bff7fa701b639abc3", + "sha256:edf094a20a386ff2ec73de65ef18014b250259cb860edc61741e240ca22d6981", + "sha256:fb8e15dfa47f5de11ab073e12aadd6b502cfb7ac4bafd18bd18cfd1c7d13dbbc" ], "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.4.52" + "version": "==1.4.53" }, "sqlalchemy-bigquery": { "extras": [ @@ -3397,12 +3524,12 @@ }, "stripe": { "hashes": [ - "sha256:56515faf0cbee82f27d9b066403988a107301fc80767500be9789a25d65f2bae", - "sha256:95aa10d34e325cb6a19784412d6196621442c278b0c9cd3fe7be2a7ef180c2f8" + "sha256:5d35c06f6995cba6181d7b18e6ce3ef532321cd4dd3fc7ee9b0f0b0d9641819d", + "sha256:7dfdf84e6734e3afd541ec6c26fef8f5f15ba9d8722bcff0613c0a4d2990ea64" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==10.3.0" + "version": "==10.9.0" }, "text-unidecode": { "hashes": [ @@ -3445,11 +3572,11 @@ }, "tqdm": { "hashes": [ - "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644", - "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb" + "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd", + "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad" ], "markers": "python_version >= '3.7'", - "version": "==4.66.4" + "version": "==4.66.5" }, "traitlets": { "hashes": [ @@ -3461,12 +3588,12 @@ }, "twilio": { "hashes": [ - "sha256:76bfc39aa8d854510907cb7f9465814dfdea9e91ec199bb44f0785f05746f4cc", - "sha256:da2255b5f3753cb3bf647fc6c50edbdb367ebc3cde6802806f6f863058a65f75" + "sha256:454b7d075c6bee3b64c81c39151be1f9105c695df6dbb0021b0c43e2930263e7", + "sha256:490da2518c0da370d738d436f9086b2463902707a811cd306ec8dcc8ce831758" ], "index": "pypi", "markers": "python_full_version >= '3.7.0'", - "version": "==9.2.3" + "version": "==9.2.4" }, "twisted": { "extras": [ @@ -3474,11 +3601,11 @@ "tls" ], "hashes": [ - "sha256:039f2e6a49ab5108abd94de187fa92377abe5985c7a72d68d0ad266ba19eae63", - "sha256:6b38b6ece7296b5e122c9eb17da2eeab3d98a198f50ca9efd00fb03e5b4fd4ae" + "sha256:5a60147f044187a127ec7da96d170d49bcce50c6fd36f594e60f4587eff4d394", + "sha256:734832ef98108136e222b5230075b1079dad8a3fc5637319615619a7725b0c81" ], "markers": "python_full_version >= '3.8.0'", - "version": "==24.3.0" + "version": "==24.7.0" }, "txaio": { "hashes": [ @@ -3523,12 +3650,12 @@ }, "uvicorn": { "hashes": [ - "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81", - "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8" + "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788", + "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.30.1" + "version": "==0.30.6" }, "vine": { "hashes": [ @@ -3648,141 +3775,141 @@ }, "yarl": { "hashes": [ - "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", - "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", - "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", - "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", - "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", - "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", - "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", - "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", - "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", - "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", - "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", - "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", - "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", - "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", - "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", - "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", - "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", - "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", - "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", - "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", - "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", - "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", - "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", - "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", - "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", - "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", - "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", - "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", - "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", - "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", - "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", - "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", - "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", - "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", - "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", - "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", - "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", - "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", - "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", - "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", - "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", - "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", - "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", - "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", - "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", - "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", - "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", - "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", - "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", - "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", - "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", - "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", - "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", - "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", - "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", - "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", - "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", - "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", - "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", - "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", - "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", - "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", - "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", - "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", - "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", - "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", - "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", - "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", - "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", - "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", - "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", - "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", - "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", - "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", - "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", - "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", - "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", - "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", - "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", - "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", - "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", - "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", - "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", - "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", - "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", - "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", - "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", - "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", - "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", - "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + "sha256:03e917cc44a01e1be60a83ee1a17550b929490aaa5df2a109adc02137bddf06b", + "sha256:050f3e4d886be55728fef268587d061c5ce6f79a82baba71840801b63441c301", + "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f", + "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b", + "sha256:0fdb156a06208fc9645ae7cc0fca45c40dd40d7a8c4db626e542525489ca81a9", + "sha256:10452727843bc847596b75e30a7fe92d91829f60747301d1bd60363366776b0b", + "sha256:1787dcfdbe730207acb454548a6e19f80ae75e6d2d1f531c5a777bc1ab6f7952", + "sha256:1cd450e10cb53d63962757c3f6f7870be49a3e448c46621d6bd46f8088d532de", + "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2", + "sha256:1fc728857df4087da6544fc68f62d7017fa68d74201d5b878e18ed4822c31fb3", + "sha256:23404842228e6fa8ace235024519df37f3f8e173620407644d40ddca571ff0f4", + "sha256:25508739e9b44d251172145f54c084b71747b09e4d237dc2abb045f46c36a66e", + "sha256:29c80890e0a64fb0e5f71350d48da330995073881f8b8e623154aef631febfb0", + "sha256:2d71a5d818d82586ac46265ae01466e0bda0638760f18b21f1174e0dd58a9d2f", + "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8", + "sha256:316c82b499b6df41444db5dea26ee23ece9356e38cea43a8b2af9e6d8a3558e4", + "sha256:34736fcc9d6d7080ebbeb0998ecb91e4f14ad8f18648cf0b3099e2420a225d86", + "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c", + "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47", + "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08", + "sha256:3dba2ebac677184d56374fa3e452b461f5d6a03aa132745e648ae8859361eb6b", + "sha256:3f53df493ec80b76969d6e1ae6e4411a55ab1360e02b80c84bd4b33d61a567ba", + "sha256:4052dbd0c900bece330e3071c636f99dff06e4628461a29b38c6e222a427cf98", + "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755", + "sha256:48f7a158f3ca67509d21cb02a96964e4798b6f133691cc0c86cf36e26e26ec8f", + "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75", + "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee", + "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00", + "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf", + "sha256:522fa3d300d898402ae4e0fa7c2c21311248ca43827dc362a667de87fdb4f1be", + "sha256:58e3f01673873b8573da3abe138debc63e4e68541b2104a55df4c10c129513a4", + "sha256:596069ddeaf72b5eb36cd714dcd2b5751d0090d05a8d65113b582ed9e1c801fb", + "sha256:5d585c7d834c13f24c7e3e0efaf1a4b7678866940802e11bd6c4d1f99c935e6b", + "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b", + "sha256:60c04415b31a1611ef5989a6084dd6f6b95652c6a18378b58985667b65b2ecb6", + "sha256:60f3b5aec3146b6992640592856414870f5b20eb688c1f1d5f7ac010a7f86561", + "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb", + "sha256:628619008680a11d07243391271b46f07f13b75deb9fe92ef342305058c70722", + "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f", + "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf", + "sha256:65e3098969baf221bb45e3b2f60735fc2b154fc95902131ebc604bae4c629ea6", + "sha256:6639444d161c693cdabb073baaed1945c717d3982ecedf23a219bc55a242e728", + "sha256:71bb1435a84688ed831220c5305d96161beb65cac4a966374475348aa3de4575", + "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8", + "sha256:74d3ef5e81f81507cea04bf5ae22f18ef538607a7c754aac2b6e3029956a2842", + "sha256:78250f635f221dde97d02c57aade3313310469bc291888dfe32acd1012594441", + "sha256:78805148e780a9ca66f3123e04741e344b66cf06b4fb13223e3a209f39a6da55", + "sha256:7ab906a956d2109c6ea11e24c66592b06336e2743509290117f0f7f47d2c1dd3", + "sha256:7fc441408ed0d9c6d2d627a02e281c21f5de43eb5209c16636a17fc704f7d0f8", + "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781", + "sha256:8525f955a2dcc281573b6aadeb8ab9c37e2d3428b64ca6a2feec2a794a69c1da", + "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48", + "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003", + "sha256:8af0bbd4d84f8abdd9b11be9488e32c76b1501889b73c9e2292a15fb925b378b", + "sha256:8e8916b1ff7680b1f2b1608c82dc15c569b9f2cb2da100c747c291f1acf18a14", + "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c", + "sha256:9163d21aa40ff8528db2aee2b0b6752efe098055b41ab8e5422b2098457199fe", + "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56", + "sha256:9d319ac113ca47352319cbea92d1925a37cb7bd61a8c2f3e3cd2e96eb33cccae", + "sha256:a48d2b9f0ae29a456fb766ae461691378ecc6cf159dd9f938507d925607591c3", + "sha256:a564155cc2194ecd9c0d8f8dc57059b822a507de5f08120063675eb9540576aa", + "sha256:a95167ae34667c5cc7d9206c024f793e8ffbadfb307d5c059de470345de58a21", + "sha256:a9552367dc440870556da47bb289a806f08ad06fbc4054072d193d9e5dd619ba", + "sha256:a99cecfb51c84d00132db909e83ae388793ca86e48df7ae57f1be0beab0dcce5", + "sha256:b1557456afce5db3d655b5f8a31cdcaae1f47e57958760525c44b76e812b4987", + "sha256:bc23d870864971c8455cfba17498ccefa53a5719ea9f5fce5e7e9c1606b5755f", + "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842", + "sha256:c81c28221a85add23a0922a6aeb2cdda7f9723e03e2dfae06fee5c57fe684262", + "sha256:ca5e86be84492fa403c4dcd4dcaf8e1b1c4ffc747b5176f7c3d09878c45719b0", + "sha256:cb870907e8b86b2f32541403da9455afc1e535ce483e579bea0e6e79a0cc751c", + "sha256:cddebd096effe4be90fd378e4224cd575ac99e1c521598a6900e94959006e02e", + "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb", + "sha256:cf85599c9336b89b92c313519bcaa223d92fa5d98feb4935a47cce2e8722b4b8", + "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb", + "sha256:d0aabe557446aa615693a82b4d3803c102fd0e7a6a503bf93d744d182a510184", + "sha256:d35f9cdab0ec5e20cf6d2bd46456cf599052cf49a1698ef06b9592238d1cf1b1", + "sha256:d8ad761493d5aaa7ab2a09736e62b8a220cb0b10ff8ccf6968c861cd8718b915", + "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b", + "sha256:dd08da4f2d171e19bd02083c921f1bef89f8f5f87000d0ffc49aa257bc5a9802", + "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8", + "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7", + "sha256:e7f9cabfb8b980791b97a3ae3eab2e38b2ba5eab1af9b7495bdc44e1ce7c89e3", + "sha256:e8362c941e07fbcde851597672a5e41b21dc292b7d5a1dc439b7a93c9a1af5d9", + "sha256:eefda67ba0ba44ab781e34843c266a76f718772b348f7c5d798d8ea55b95517f", + "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7", + "sha256:f3aaf9fa960d55bd7876d55d7ea3cc046f3660df1ff73fc1b8c520a741ed1f21", + "sha256:f5ddad20363f9f1bbedc95789c897da62f939e6bc855793c3060ef8b9f9407bf", + "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05", + "sha256:f87d8645a7a806ec8f66aac5e3b1dcb5014849ff53ffe2a1f0b86ca813f534c7", + "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45", + "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2", + "sha256:ff03f1c1ac474c66d474929ae7e4dd195592c1c7cc8c36418528ed81b1ca0a79" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4" + "markers": "python_version >= '3.8'", + "version": "==1.9.7" }, "zope-interface": { "hashes": [ - "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854", - "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b", - "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827", - "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4", - "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671", - "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e", - "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c", - "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc", - "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438", - "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8", - "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874", - "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4", - "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82", - "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7", - "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede", - "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341", - "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1", - "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e", - "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2", - "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb", - "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530", - "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934", - "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b", - "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43", - "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7", - "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc", - "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde", - "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79", - "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e", - "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9", - "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15", - "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b", - "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5", - "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250", - "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e", - "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1" + "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", + "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1", + "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7", + "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32", + "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958", + "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b", + "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc", + "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7", + "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4", + "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896", + "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d", + "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca", + "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3", + "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd", + "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8", + "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386", + "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58", + "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493", + "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3", + "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4", + "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3", + "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05", + "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b", + "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11", + "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b", + "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996", + "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a", + "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd", + "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1", + "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738", + "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b", + "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca", + "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e", + "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c" ], - "markers": "python_version >= '3.7'", - "version": "==6.4.post2" + "markers": "python_version >= '3.8'", + "version": "==7.0.3" }, "zope.event": { "hashes": [ @@ -3900,66 +4027,77 @@ "develop": { "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "babel": { "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" + "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", + "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.15.0" + "version": "==2.16.0" }, "black": { "hashes": [ - "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474", - "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1", - "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0", - "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8", - "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96", - "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1", - "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04", - "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021", - "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94", - "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d", - "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c", - "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7", - "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c", - "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc", - "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7", - "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d", - "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c", - "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741", - "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce", - "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb", - "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063", - "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e" + "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", + "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", + "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", + "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", + "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", + "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", + "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", + "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", + "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", + "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", + "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", + "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", + "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", + "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", + "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", + "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", + "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", + "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", + "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", + "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", + "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", + "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==24.4.2" + "version": "==24.8.0" }, "cachetools": { "hashes": [ - "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474", - "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827" + "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", + "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a" ], "markers": "python_version >= '3.7'", - "version": "==5.4.0" + "version": "==5.5.0" + }, + "capy-core": { + "extras": [ + "django" + ], + "hashes": [ + "sha256:3b644975414d8d6380f4456b8abae3884fa3d57c3552609f7ac7afe6361af10c", + "sha256:bc254beabfc787d8d49e590e7a55b21c6a9420c86de6756d7aa00e977c0219d2" + ], + "markers": "python_version >= '3.11'", + "version": "==1.0.1" }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "version": "==2024.8.30" }, "cfgv": { "hashes": [ @@ -4086,62 +4224,82 @@ "toml" ], "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==7.6.0" + "version": "==7.6.1" }, "coveralls": { "hashes": [ @@ -4183,21 +4341,21 @@ }, "flake8": { "hashes": [ - "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a", - "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5" + "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38", + "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" ], "index": "pypi", "markers": "python_full_version >= '3.8.1'", - "version": "==7.1.0" + "version": "==7.1.1" }, "flake8-bugbear": { "hashes": [ - "sha256:cb430dd86bc821d79ccc0b030789a9c87a47a369667f12ba06e80f11305e8258", - "sha256:ff8d4ba5719019ebf98e754624c30c05cef0dadcf18a65d91c7567300e52a130" + "sha256:25bc3867f7338ee3b3e0916bf8b8a0b743f53a9a5175782ddc4325ed4f386b89", + "sha256:9b77627eceda28c51c27af94560a72b5b2c97c016651bdce45d8f56c180d2d32" ], "index": "pypi", "markers": "python_full_version >= '3.8.1'", - "version": "==24.4.26" + "version": "==24.8.19" }, "flake8-docstrings": { "hashes": [ @@ -4268,28 +4426,28 @@ "grpc" ], "hashes": [ - "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125", - "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd" + "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4", + "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f" ], "markers": "python_version >= '3.7'", - "version": "==2.19.1" + "version": "==2.19.2" }, "google-apps-meet": { "hashes": [ - "sha256:385ec8bc026b068d243643912c9cc644ffabcdee9c362f61f70fe1e7c25c15c7", - "sha256:3faa3ab6d0690d7e343f2ee1c775abd56e63b363fd59dcdb250195324d59a225" + "sha256:36e600f61a8bf0cccee6a3c3c0e77736f46da39ccd7bcbf76162971961739d8d", + "sha256:64e0e4a2e5fa1ce00203997ca633c76e2d97809ddf6de42e8ce61bf58d8701e1" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.1.7" + "version": "==0.1.8" }, "google-auth": { "hashes": [ - "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022", - "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b" + "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65", + "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc" ], "markers": "python_version >= '3.7'", - "version": "==2.32.0" + "version": "==2.34.0" }, "google-auth-httplib2": { "hashes": [ @@ -4310,11 +4468,11 @@ }, "googleapis-common-protos": { "hashes": [ - "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945", - "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87" + "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63", + "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0" ], "markers": "python_version >= '3.7'", - "version": "==1.63.2" + "version": "==1.65.0" }, "greenlet": { "hashes": [ @@ -4377,74 +4535,74 @@ "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], - "markers": "python_version >= '3.11' and platform_python_implementation == 'CPython'", + "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==3.0.3" }, "griffe": { "hashes": [ - "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f", - "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2" + "sha256:1c9f6ef7455930f3f9b0c4145a961c90385d1e2cbc496f7796fbff560ec60d31", + "sha256:a8b2fcb1ecdc5a412e646b0b4375eb20a5d2eac3a11dd8c10c56967a4097663c" ], "markers": "python_version >= '3.8'", - "version": "==0.48.0" + "version": "==1.2.0" }, "grpcio": { "hashes": [ - "sha256:12e9bdf3b5fd48e5fbe5b3da382ad8f97c08b47969f3cca81dd9b36b86ed39e2", - "sha256:1bceeec568372cbebf554eae1b436b06c2ff24cfaf04afade729fb9035408c6c", - "sha256:1faaf7355ceed07ceaef0b9dcefa4c98daf1dd8840ed75c2de128c3f4a4d859d", - "sha256:1fbd6331f18c3acd7e09d17fd840c096f56eaf0ef830fbd50af45ae9dc8dfd83", - "sha256:27adee2338d697e71143ed147fe286c05810965d5d30ec14dd09c22479bfe48a", - "sha256:2ca684ba331fb249d8a1ce88db5394e70dbcd96e58d8c4b7e0d7b141a453dce9", - "sha256:2f56b5a68fdcf17a0a1d524bf177218c3c69b3947cb239ea222c6f1867c3ab68", - "sha256:3019fb50128b21a5e018d89569ffaaaa361680e1346c2f261bb84a91082eb3d3", - "sha256:34966cf526ef0ea616e008d40d989463e3db157abb213b2f20c6ce0ae7928875", - "sha256:3c492301988cd720cd145d84e17318d45af342e29ef93141228f9cd73222368b", - "sha256:3dc5f928815b8972fb83b78d8db5039559f39e004ec93ebac316403fe031a062", - "sha256:4effc0562b6c65d4add6a873ca132e46ba5e5a46f07c93502c37a9ae7f043857", - "sha256:54cb822e177374b318b233e54b6856c692c24cdbd5a3ba5335f18a47396bac8f", - "sha256:557de35bdfbe8bafea0a003dbd0f4da6d89223ac6c4c7549d78e20f92ead95d9", - "sha256:5f096ffb881f37e8d4f958b63c74bfc400c7cebd7a944b027357cd2fb8d91a57", - "sha256:5fd7337a823b890215f07d429f4f193d24b80d62a5485cf88ee06648591a0c57", - "sha256:60f1f38eed830488ad2a1b11579ef0f345ff16fffdad1d24d9fbc97ba31804ff", - "sha256:6e71aed8835f8d9fbcb84babc93a9da95955d1685021cceb7089f4f1e717d719", - "sha256:71a05fd814700dd9cb7d9a507f2f6a1ef85866733ccaf557eedacec32d65e4c2", - "sha256:76e81a86424d6ca1ce7c16b15bdd6a964a42b40544bf796a48da241fdaf61153", - "sha256:7ae15275ed98ea267f64ee9ddedf8ecd5306a5b5bb87972a48bfe24af24153e8", - "sha256:7af64838b6e615fff0ec711960ed9b6ee83086edfa8c32670eafb736f169d719", - "sha256:8333ca46053c35484c9f2f7e8d8ec98c1383a8675a449163cea31a2076d93de8", - "sha256:8558f0083ddaf5de64a59c790bffd7568e353914c0c551eae2955f54ee4b857f", - "sha256:8bfd95ef3b097f0cc86ade54eafefa1c8ed623aa01a26fbbdcd1a3650494dd11", - "sha256:8d8143a3e3966f85dce6c5cc45387ec36552174ba5712c5dc6fcc0898fb324c0", - "sha256:941596d419b9736ab548aa0feb5bbba922f98872668847bf0720b42d1d227b9e", - "sha256:941c4869aa229d88706b78187d60d66aca77fe5c32518b79e3c3e03fc26109a2", - "sha256:9a1c84560b3b2d34695c9ba53ab0264e2802721c530678a8f0a227951f453462", - "sha256:9e6a8f3d6c41e6b642870afe6cafbaf7b61c57317f9ec66d0efdaf19db992b90", - "sha256:a6c71575a2fedf259724981fd73a18906513d2f306169c46262a5bae956e6364", - "sha256:a8422dc13ad93ec8caa2612b5032a2b9cd6421c13ed87f54db4a3a2c93afaf77", - "sha256:aaf3c54419a28d45bd1681372029f40e5bfb58e5265e3882eaf21e4a5f81a119", - "sha256:b12c1aa7b95abe73b3e04e052c8b362655b41c7798da69f1eaf8d186c7d204df", - "sha256:b590f1ad056294dfaeac0b7e1b71d3d5ace638d8dd1f1147ce4bd13458783ba8", - "sha256:bbb46330cc643ecf10bd9bd4ca8e7419a14b6b9dedd05f671c90fb2c813c6037", - "sha256:ca931de5dd6d9eb94ff19a2c9434b23923bce6f767179fef04dfa991f282eaad", - "sha256:cb5175f45c980ff418998723ea1b3869cce3766d2ab4e4916fbd3cedbc9d0ed3", - "sha256:d827a6fb9215b961eb73459ad7977edb9e748b23e3407d21c845d1d8ef6597e5", - "sha256:dbb64b4166362d9326f7efbf75b1c72106c1aa87f13a8c8b56a1224fac152f5c", - "sha256:de5b6be29116e094c5ef9d9e4252e7eb143e3d5f6bd6d50a78075553ab4930b0", - "sha256:e4a3cdba62b2d6aeae6027ae65f350de6dc082b72e6215eccf82628e79efe9ba", - "sha256:e75acfa52daf5ea0712e8aa82f0003bba964de7ae22c26d208cbd7bc08500177", - "sha256:f40cebe5edb518d78b8131e87cb83b3ee688984de38a232024b9b44e74ee53d3", - "sha256:f62652ddcadc75d0e7aa629e96bb61658f85a993e748333715b4ab667192e4e8", - "sha256:ff5a84907e51924973aa05ed8759210d8cdae7ffcf9e44fd17646cf4a902df59" - ], - "version": "==1.65.1" + "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e", + "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce", + "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8", + "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d", + "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858", + "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0", + "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a", + "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45", + "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef", + "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2", + "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac", + "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd", + "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1", + "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce", + "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492", + "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e", + "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb", + "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44", + "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb", + "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759", + "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e", + "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761", + "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26", + "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791", + "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c", + "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60", + "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df", + "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a", + "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3", + "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734", + "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f", + "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083", + "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524", + "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d", + "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a", + "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0", + "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb", + "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503", + "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815", + "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22", + "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2", + "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c", + "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d", + "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b", + "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c", + "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9" + ], + "version": "==1.66.1" }, "grpcio-status": { "hashes": [ - "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f", - "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a" + "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485", + "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8" ], - "version": "==1.62.2" + "version": "==1.62.3" }, "httplib2": { "hashes": [ @@ -4464,11 +4622,11 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "iniconfig": { "hashes": [ @@ -4488,12 +4646,12 @@ }, "markdown": { "hashes": [ - "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", - "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", + "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.6" + "version": "==3.7" }, "markupsafe": { "hashes": [ @@ -4580,20 +4738,20 @@ }, "mkdocs": { "hashes": [ - "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7", - "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512" + "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", + "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.6.0" + "version": "==1.6.1" }, "mkdocs-autorefs": { "hashes": [ - "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570", - "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971" + "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f", + "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f" ], "markers": "python_version >= '3.8'", - "version": "==1.0.1" + "version": "==1.2.0" }, "mkdocs-get-deps": { "hashes": [ @@ -4605,12 +4763,12 @@ }, "mkdocs-material": { "hashes": [ - "sha256:3e977598ec15a4ddad5c4dfc9e08edab6023edb51e88f0729bd27be77e3d322a", - "sha256:afc1f508e2662ded95f0a35a329e8a5acd73ee88ca07ba73836eb6fcdae5d8b4" + "sha256:1e60ddf716cfb5679dfd65900b8a25d277064ed82d9a53cd5190e3f894df7840", + "sha256:54caa8be708de2b75167fd4d3b9f3d949579294f49cb242515d4653dbee9227e" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==9.5.29" + "version": "==9.5.34" }, "mkdocs-material-extensions": { "hashes": [ @@ -4622,21 +4780,21 @@ }, "mkdocstrings": { "hashes": [ - "sha256:c3a2515f31577f311a9ee58d089e4c51fc6046dbd9e9b4c3de4c3194667fe9bf", - "sha256:da01fcc2670ad61888e8fe5b60afe9fee5781017d67431996832d63e887c2e51" + "sha256:1aa227fe94f88e80737d37514523aacd473fc4b50a7f6852ce41447ab23f2654", + "sha256:ff9d0de28c8fa877ed9b29a42fe407cfe6736d70a1c48177aa84fcc3dc8518cd" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.25.1" + "version": "==0.26.0" }, "mkdocstrings-python": { "hashes": [ - "sha256:92e3c588ef1b41151f55281d075de7558dd8092e422cb07a65b18ee2b0863ebb", - "sha256:acdc2a98cd9d46c7ece508193a16ca03ccabcb67520352b7449f84b57c162bdf" + "sha256:cbe98710a6757dfd4dff79bf36cb9731908fb4c69dd2736b15270ae7a488243d", + "sha256:f344aaa47e727d8a2dc911e063025e58e2b7fb31a41110ccc3902aa6be7ca196" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.10.5" + "version": "==1.10.9" }, "mypy-extensions": { "hashes": [ @@ -4654,6 +4812,65 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", "version": "==1.9.1" }, + "numpy": { + "hashes": [ + "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", + "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", + "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", + "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", + "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", + "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", + "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", + "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", + "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", + "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", + "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", + "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", + "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", + "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", + "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", + "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", + "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", + "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", + "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", + "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", + "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", + "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", + "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", + "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", + "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", + "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", + "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", + "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", + "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", + "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", + "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", + "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", + "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", + "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", + "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", + "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", + "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", + "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", + "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", + "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", + "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", + "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", + "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", + "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", + "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", + "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", + "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", + "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", + "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", + "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", + "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", + "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" + ], + "index": "pypi", + "markers": "python_version >= '3.10'", + "version": "==2.1.0" + }, "oauthlib": { "hashes": [ "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", @@ -4672,9 +4889,10 @@ }, "paginate": { "hashes": [ - "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d" + "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", + "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591" ], - "version": "==0.5.6" + "version": "==0.5.7" }, "pathspec": { "hashes": [ @@ -4693,6 +4911,93 @@ "markers": "python_version >= '3.8'", "version": "==0.14.1" }, + "pillow": { + "hashes": [ + "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", + "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", + "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", + "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", + "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", + "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", + "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", + "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", + "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", + "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", + "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", + "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", + "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", + "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", + "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", + "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", + "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", + "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", + "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", + "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", + "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", + "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", + "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", + "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", + "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", + "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", + "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", + "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", + "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", + "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", + "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", + "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", + "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", + "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", + "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", + "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", + "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", + "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", + "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", + "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", + "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", + "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", + "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", + "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", + "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", + "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", + "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", + "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", + "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", + "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", + "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", + "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", + "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", + "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", + "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", + "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", + "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", + "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", + "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", + "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", + "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", + "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", + "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", + "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", + "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", + "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", + "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", + "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", + "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", + "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", + "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", + "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", + "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", + "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", + "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", + "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", + "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", + "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", + "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", + "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==10.4.0" + }, "platformdirs": { "hashes": [ "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", @@ -4711,12 +5016,12 @@ }, "pre-commit": { "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" + "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", + "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.7.1" + "version": "==3.8.0" }, "proto-plus": { "hashes": [ @@ -4728,20 +5033,20 @@ }, "protobuf": { "hashes": [ - "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", - "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", - "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", - "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", - "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", - "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", - "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", - "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", - "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", - "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", - "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" + "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1", + "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d", + "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040", + "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835", + "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1", + "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca", + "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f", + "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d", + "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978", + "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4", + "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b" ], "markers": "python_version >= '3.8'", - "version": "==4.25.3" + "version": "==4.25.4" }, "pyasn1": { "hashes": [ @@ -4761,11 +5066,11 @@ }, "pycodestyle": { "hashes": [ - "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c", - "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3", + "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521" ], "markers": "python_version >= '3.8'", - "version": "==2.12.0" + "version": "==2.12.1" }, "pydocstyle": { "hashes": [ @@ -4793,36 +5098,36 @@ }, "pymdown-extensions": { "hashes": [ - "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940", - "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb" + "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753", + "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626" ], "markers": "python_version >= '3.8'", - "version": "==10.8.1" + "version": "==10.9" }, "pyparsing": { "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", + "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032" ], "markers": "python_version >= '3.1'", - "version": "==3.1.2" + "version": "==3.1.4" }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" ], "markers": "python_version >= '3.8'", - "version": "==8.2.2" + "version": "==8.3.2" }, "pytest-asyncio": { "hashes": [ - "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2", - "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3" + "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b", + "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.23.8" + "version": "==0.24.0" }, "pytest-cov": { "hashes": [ @@ -4859,63 +5164,73 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, + "pytz": { + "hashes": [ + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + ], + "index": "pypi", + "version": "==2024.1" + }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "pyyaml-env-tag": { "hashes": [ @@ -4927,88 +5242,88 @@ }, "regex": { "hashes": [ - "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649", - "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35", - "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb", - "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68", - "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5", - "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133", - "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0", - "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d", - "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da", - "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f", - "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d", - "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53", - "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa", - "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a", - "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890", - "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67", - "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c", - "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2", - "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced", - "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741", - "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f", - "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa", - "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf", - "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4", - "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5", - "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2", - "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384", - "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7", - "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014", - "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704", - "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5", - "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2", - "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49", - "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1", - "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694", - "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629", - "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6", - "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435", - "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c", - "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835", - "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e", - "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201", - "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62", - "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5", - "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16", - "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f", - "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1", - "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f", - "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f", - "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145", - "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3", - "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed", - "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143", - "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca", - "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9", - "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa", - "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850", - "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80", - "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe", - "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656", - "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388", - "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1", - "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294", - "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3", - "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d", - "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b", - "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40", - "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600", - "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c", - "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569", - "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456", - "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9", - "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb", - "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e", - "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f", - "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d", - "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a", - "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a", - "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796" + "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", + "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535", + "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24", + "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce", + "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", + "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5", + "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce", + "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53", + "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d", + "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", + "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", + "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8", + "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024", + "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", + "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", + "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169", + "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", + "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa", + "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be", + "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53", + "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759", + "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", + "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", + "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", + "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", + "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", + "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2", + "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca", + "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0", + "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293", + "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", + "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e", + "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f", + "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", + "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", + "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", + "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46", + "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9", + "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", + "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", + "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", + "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1", + "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9", + "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", + "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", + "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b", + "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf", + "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5", + "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2", + "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e", + "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", + "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", + "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", + "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7", + "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", + "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57", + "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4", + "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd", + "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b", + "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41", + "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe", + "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59", + "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8", + "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f", + "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", + "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750", + "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1", + "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96", + "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc", + "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", + "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe", + "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", + "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950", + "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", + "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd", + "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", + "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66", + "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3", + "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86" ], "markers": "python_version >= '3.8'", - "version": "==2024.5.15" + "version": "==2024.7.24" }, "requests": { "hashes": [ @@ -5037,11 +5352,11 @@ }, "setuptools": { "hashes": [ - "sha256:3d8531791a27056f4a38cd3e54084d8b1c4228ff9cf3f2d7dd075ec99f9fd70d", - "sha256:f501b6e6db709818dc76882582d9c516bf3b67b948864c5fa1d1624c09a49207" + "sha256:bea195a800f510ba3a2bc65645c88b7e016fe36709fefc58a880c4ae8a0138d7", + "sha256:cee604bd76cc092355a4e43ec17aee5369095974f41f088676724dc6bc2c9ef8" ], "markers": "python_version >= '3.8'", - "version": "==71.0.3" + "version": "==74.1.0" }, "six": { "hashes": [ @@ -5076,41 +5391,39 @@ }, "watchdog": { "hashes": [ - "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7", - "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767", - "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175", - "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459", - "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5", - "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429", - "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6", - "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d", - "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7", - "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28", - "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235", - "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57", - "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a", - "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5", - "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709", - "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee", - "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84", - "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd", - "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba", - "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db", - "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682", - "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35", - "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d", - "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645", - "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253", - "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193", - "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b", - "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44", - "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b", - "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625", - "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e", - "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5" + "sha256:1e8ca9b7f5f03d2f0556a43db1e9adf1e5af6adf52e0890f781324514b67a612", + "sha256:20a28c8b0b3edf4ea2b27fb3527fc0a348e983f22a4317d316bb561524391932", + "sha256:2b8cd627b76194e725ed6f48d9524b1ad93a51a0dc3bd0225c56023716245091", + "sha256:39e828c4270452b966bc9d814911a3c7e24c62d726d2a3245f5841664ff56b5e", + "sha256:39f0de161a822402f0f00c68b82349a4d71c9814e749148ca2b083a25606dbf9", + "sha256:4eaebff2f938f5325788cef26521891b2d8ecc8e7852aa123a9b458815f93875", + "sha256:5541a8765c4090decb4dba55d3dceb57724748a717ceaba8dc4f213edb0026e0", + "sha256:59ec6111f3750772badae3403ef17263489ed6f27ac01ec50c0244b2afa258fb", + "sha256:664917cd513538728875a42d5654584b533da88cf06680452c98e73b45466968", + "sha256:6bb68d9adb9c45f0dc1c2b12f4fb6eab0463a8f9741e371e4ede6769064e0785", + "sha256:6fbb4dd5ace074a2969825fde10034b35b31efcb6973defb22eb945b1d3acc37", + "sha256:70e30116849f4ec52240eb1fad83d27e525eae179bfe1c09b3bf120163d731b6", + "sha256:72dbdffe4aa0c36c59f4a5190bceeb7fdfdf849ab98a562b3a783a64cc6dacdd", + "sha256:753c6a4c1eea9d3b96cd58159b49103e66cb288216a414ab9ad234ccc7642ec2", + "sha256:763c6f82bb65504b47d4aea268462b2fb662676676356e04787f332a11f03eb0", + "sha256:8ba1472b5fa7c644e49641f70d7ccc567f70b54d776defa5d6f755dc2edc3fbb", + "sha256:9b1b32f89f95162f09aea6e15d9384f6e0490152f10d7ed241f8a85cddc50658", + "sha256:a03a6ccb846ead406a25a0b702d0a6b88fdfa77becaf907cfcfce7737ebbda1f", + "sha256:a1cd7c919940b15f253db8279a579fb81e4e4e434b39b11a1cb7f54fe3fa46a6", + "sha256:a6b8c6c82ada78479a0df568d27d69aa07105aba9301ac66d1ae162645f4ba34", + "sha256:a791dfc050ed24b82f7f100ae794192594fe863a7e9bdafcdfa5c6e405a981e5", + "sha256:b21e6601efe8453514c2fc21aca57fb5413c3d8b157bfe520b05b57b1788a167", + "sha256:b2d56425dfa0c1e6f8a510f21d3d54ef7fe50bbc29638943c2cb1394b7b49156", + "sha256:c4ae0b3e95455fa9d959aa3b253c87845ad454ef188a4bf5a69cab287c131216", + "sha256:c92812a358eabebe92b12b9290d16dc95c8003654658f6b2676c9a2103a73ceb", + "sha256:c93aa24899cb4e8a51492c7ccc420bea45ced502fe9ef2e83f9ab1107e5a13b5", + "sha256:e321f1561adea30e447130882efe451af519646178d04189d6ba91a8cd7d88a5", + "sha256:f0180e84e6493ef7c82e051334e8c9b00ffd89fa9de5e0613d3c267f6ccf2d38", + "sha256:f3006361dba2005552cc8aa49c44d16a10e0a1939bb3286e888a14f722122808", + "sha256:f66df2c152edf5a2fe472bb2f8a5d562165bcf6cf9686cee5d75e524c21ca895" ], - "markers": "python_version >= '3.8'", - "version": "==4.0.1" + "markers": "python_version >= '3.9'", + "version": "==5.0.1" }, "zope.event": { "hashes": [ @@ -5122,45 +5435,43 @@ }, "zope.interface": { "hashes": [ - "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854", - "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b", - "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827", - "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4", - "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671", - "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e", - "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c", - "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc", - "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438", - "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8", - "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874", - "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4", - "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82", - "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7", - "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede", - "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341", - "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1", - "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e", - "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2", - "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb", - "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530", - "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934", - "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b", - "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43", - "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7", - "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc", - "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde", - "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79", - "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e", - "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9", - "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15", - "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b", - "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5", - "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250", - "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e", - "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1" + "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", + "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1", + "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7", + "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32", + "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958", + "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b", + "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc", + "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7", + "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4", + "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896", + "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d", + "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca", + "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3", + "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd", + "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8", + "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386", + "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58", + "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493", + "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3", + "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4", + "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3", + "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05", + "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b", + "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11", + "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b", + "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996", + "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a", + "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd", + "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1", + "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738", + "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b", + "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca", + "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e", + "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c" ], - "markers": "python_version >= '3.7'", - "version": "==6.4.post2" + "markers": "python_version >= '3.8'", + "version": "==7.0.3" } } } diff --git a/breathecode/assignments/tests/management/commands/tests_schedule_repository_deletions.py b/breathecode/assignments/tests/management/commands/tests_schedule_repository_deletions.py index 6f8fa6657..7635010e5 100644 --- a/breathecode/assignments/tests/management/commands/tests_schedule_repository_deletions.py +++ b/breathecode/assignments/tests/management/commands/tests_schedule_repository_deletions.py @@ -4,13 +4,13 @@ from unittest.mock import MagicMock +import capyc.pytest as capyc import pytest from dateutil.relativedelta import relativedelta from linked_services.django.actions import reset_app_cache from breathecode.assignments.management.commands.schedule_repository_deletions import Command from breathecode.registry.models import Asset -from capyc.rest_framework import pytest as capyc @pytest.fixture(autouse=True) diff --git a/breathecode/assignments/tests/urls/tests_user_me_task.py b/breathecode/assignments/tests/urls/tests_user_me_task.py index 08fd6d8f9..eff33f8b6 100644 --- a/breathecode/assignments/tests/urls/tests_user_me_task.py +++ b/breathecode/assignments/tests/urls/tests_user_me_task.py @@ -6,6 +6,7 @@ from datetime import datetime from unittest.mock import MagicMock, call, patch +import capyc.pytest as capy import pytest from django.urls.base import reverse_lazy from django.utils import timezone @@ -15,7 +16,6 @@ from breathecode.assignments import tasks from breathecode.assignments.caches import TaskCache from breathecode.utils.api_view_extensions.api_view_extension_handlers import APIViewExtensionHandlers -from capyc.rest_framework import pytest as capy from ..mixins import AssignmentsTestCase diff --git a/breathecode/authenticate/tests/tasks/tests_async_validate_email_invite.py b/breathecode/authenticate/tests/tasks/tests_async_validate_email_invite.py index fe86a1ef0..09ad2da5f 100644 --- a/breathecode/authenticate/tests/tasks/tests_async_validate_email_invite.py +++ b/breathecode/authenticate/tests/tasks/tests_async_validate_email_invite.py @@ -2,10 +2,10 @@ import random from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from breathecode.authenticate.tasks import async_validate_email_invite -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/authenticate/tests/tasks/tests_verify_user_invite_email.py b/breathecode/authenticate/tests/tasks/tests_verify_user_invite_email.py index e818fbfa6..cae9bbc92 100644 --- a/breathecode/authenticate/tests/tasks/tests_verify_user_invite_email.py +++ b/breathecode/authenticate/tests/tasks/tests_verify_user_invite_email.py @@ -2,11 +2,11 @@ import random from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from breathecode.authenticate.tasks import verify_user_invite_email from breathecode.notify import actions -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/authenticate/tests/urls/tests_app_token.py b/breathecode/authenticate/tests/urls/tests_app_token.py index ce7609eb7..b94148cfc 100644 --- a/breathecode/authenticate/tests/urls/tests_app_token.py +++ b/breathecode/authenticate/tests/urls/tests_app_token.py @@ -6,12 +6,12 @@ from typing import Callable from unittest.mock import MagicMock +import capyc.pytest as capy import pytest from django.urls.base import reverse_lazy from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/events/tests/urls/tests_me_event_id_join.py b/breathecode/events/tests/urls/tests_me_event_id_join.py index a3254edf0..3f7248479 100644 --- a/breathecode/events/tests/urls/tests_me_event_id_join.py +++ b/breathecode/events/tests/urls/tests_me_event_id_join.py @@ -3,6 +3,7 @@ from datetime import timedelta from unittest.mock import MagicMock, call, patch +import capyc.pytest as capy import pytest from django.template import loader from django.urls.base import reverse_lazy @@ -11,7 +12,6 @@ from breathecode.events.caches import EventCache from breathecode.payments import tasks from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework.pytest import fixtures as fx from ..mixins.new_events_tests_case import EventTestCase @@ -1557,7 +1557,7 @@ def test_with_consumable__it_try_to_consume__with_live_event__in_the_future__sho @patch("breathecode.admissions.signals.student_edu_status_updated.send_robust", MagicMock(return_value=None)) @patch("breathecode.payments.tasks.end_the_consumption_session.apply_async", MagicMock(return_value=None)) def test__post__auth__no_saas__finantial_status_no_late( - bc: Breathecode, client: fx.Client, academy, cohort, cohort_user + bc: Breathecode, client: capy.Client, academy, cohort, cohort_user ): service = {"consumer": "EVENT_JOIN"} online_meeting_url = bc.fake.url() @@ -1643,7 +1643,7 @@ def test__post__auth__no_saas__finantial_status_no_late( @patch("django.db.models.signals.pre_delete.send_robust", MagicMock(return_value=None)) @patch("breathecode.admissions.signals.student_edu_status_updated.send_robust", MagicMock(return_value=None)) @patch("breathecode.payments.tasks.end_the_consumption_session.apply_async", MagicMock(return_value=None)) -def test__post__auth__no_saas__finantial_status_late(bc: Breathecode, client: fx.Client, academy, cohort): +def test__post__auth__no_saas__finantial_status_late(bc: Breathecode, client: capy.Client, academy, cohort): service = {"consumer": "EVENT_JOIN"} online_meeting_url = bc.fake.url() delta = timedelta(seconds=random.randint(1, 1000)) diff --git a/breathecode/feedback/tests/supervisors/tests_no_survey_for_session.py b/breathecode/feedback/tests/supervisors/tests_no_survey_for_session.py index bdeef8957..6ac058f61 100644 --- a/breathecode/feedback/tests/supervisors/tests_no_survey_for_session.py +++ b/breathecode/feedback/tests/supervisors/tests_no_survey_for_session.py @@ -2,6 +2,7 @@ from logging import Logger from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from asgiref.sync import sync_to_async @@ -11,7 +12,6 @@ from breathecode.monitoring.models import SupervisorIssue from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode from breathecode.utils.decorators import supervisor as supervisor_decorator -from capyc.rest_framework import pytest as capy class Supervisor: diff --git a/breathecode/feedback/tests/supervisors/tests_supervise_mentorship_survey.py b/breathecode/feedback/tests/supervisors/tests_supervise_mentorship_survey.py index 986f40f22..e7c910a6d 100644 --- a/breathecode/feedback/tests/supervisors/tests_supervise_mentorship_survey.py +++ b/breathecode/feedback/tests/supervisors/tests_supervise_mentorship_survey.py @@ -1,7 +1,7 @@ from datetime import datetime, timedelta -from logging import Logger -from unittest.mock import MagicMock, call +from unittest.mock import MagicMock +import capyc.pytest as capy import pytest from asgiref.sync import sync_to_async @@ -9,8 +9,6 @@ from breathecode.monitoring.models import Supervisor as SupervisorModel from breathecode.monitoring.models import SupervisorIssue from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from breathecode.utils.decorators import supervisor as supervisor_decorator -from capyc.rest_framework import pytest as capy class Supervisor: diff --git a/breathecode/feedback/tests/tasks/tests_process_student_graduation.py b/breathecode/feedback/tests/tasks/tests_process_student_graduation.py index 50254f8af..17f923bc7 100644 --- a/breathecode/feedback/tests/tasks/tests_process_student_graduation.py +++ b/breathecode/feedback/tests/tasks/tests_process_student_graduation.py @@ -5,11 +5,11 @@ import logging from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from django.utils import timezone from breathecode.feedback.tasks import process_student_graduation -from capyc.rest_framework import pytest as capy now = timezone.now() diff --git a/breathecode/media/tests/settings/tests_del_temp_file.py b/breathecode/media/tests/settings/tests_del_temp_file.py index dd2d478c8..68a551bfb 100644 --- a/breathecode/media/tests/settings/tests_del_temp_file.py +++ b/breathecode/media/tests/settings/tests_del_temp_file.py @@ -4,11 +4,11 @@ from unittest.mock import MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from breathecode.media.settings import del_temp_file from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/media/tests/settings/tests_process_media.py b/breathecode/media/tests/settings/tests_process_media.py index b28eaa377..d8f80f8a8 100644 --- a/breathecode/media/tests/settings/tests_process_media.py +++ b/breathecode/media/tests/settings/tests_process_media.py @@ -4,11 +4,11 @@ from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from breathecode.media import settings from breathecode.media.settings import MEDIA_SETTINGS, process_media -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/media/tests/settings/tests_transfer.py b/breathecode/media/tests/settings/tests_transfer.py index 53dd0d107..f53442cdf 100644 --- a/breathecode/media/tests/settings/tests_transfer.py +++ b/breathecode/media/tests/settings/tests_transfer.py @@ -5,12 +5,12 @@ from io import BytesIO from unittest.mock import AsyncMock, MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from breathecode.media import settings from breathecode.media.settings import MEDIA_SETTINGS, transfer from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy def mock_download(x: BytesIO) -> None: diff --git a/breathecode/media/tests/signals/tests_schedule_deletion.py b/breathecode/media/tests/signals/tests_schedule_deletion.py index 836fed81e..d4ed7e512 100644 --- a/breathecode/media/tests/signals/tests_schedule_deletion.py +++ b/breathecode/media/tests/signals/tests_schedule_deletion.py @@ -5,12 +5,12 @@ import random from unittest.mock import MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from breathecode.media import settings from breathecode.media.signals import schedule_deletion from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/media/tests/tasks/tests_process_file.py b/breathecode/media/tests/tasks/tests_process_file.py index d791c6fdd..0dd1e876e 100644 --- a/breathecode/media/tests/tasks/tests_process_file.py +++ b/breathecode/media/tests/tasks/tests_process_file.py @@ -5,11 +5,11 @@ from logging import Logger from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from breathecode.media.settings import MEDIA_SETTINGS from breathecode.media.tasks import process_file -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/media/tests/urls/v2/tests_academy_chunk.py b/breathecode/media/tests/urls/v2/tests_academy_chunk.py index 5ad501675..844117042 100644 --- a/breathecode/media/tests/urls/v2/tests_academy_chunk.py +++ b/breathecode/media/tests/urls/v2/tests_academy_chunk.py @@ -6,13 +6,13 @@ from typing import Callable from unittest.mock import MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from django.core.files.uploadedfile import InMemoryUploadedFile, SimpleUploadedFile from django.urls.base import reverse_lazy from rest_framework import status from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy @pytest.fixture diff --git a/breathecode/media/tests/urls/v2/tests_academy_chunk_upload.py b/breathecode/media/tests/urls/v2/tests_academy_chunk_upload.py index 56a7ee3f1..1d17f3851 100644 --- a/breathecode/media/tests/urls/v2/tests_academy_chunk_upload.py +++ b/breathecode/media/tests/urls/v2/tests_academy_chunk_upload.py @@ -7,6 +7,7 @@ from io import BytesIO from unittest.mock import AsyncMock, MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from django.core.files.uploadedfile import SimpleUploadedFile from django.urls.base import reverse_lazy @@ -15,7 +16,6 @@ from breathecode.media.signals import schedule_deletion from breathecode.media.tasks import process_file from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy @pytest.fixture diff --git a/breathecode/media/tests/urls/v2/tests_me_chunk.py b/breathecode/media/tests/urls/v2/tests_me_chunk.py index 77af964c9..591bfc4dc 100644 --- a/breathecode/media/tests/urls/v2/tests_me_chunk.py +++ b/breathecode/media/tests/urls/v2/tests_me_chunk.py @@ -6,13 +6,13 @@ from typing import Callable from unittest.mock import MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from django.core.files.uploadedfile import InMemoryUploadedFile, SimpleUploadedFile from django.urls.base import reverse_lazy from rest_framework import status from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy @pytest.fixture diff --git a/breathecode/media/tests/urls/v2/tests_me_chunk_upload.py b/breathecode/media/tests/urls/v2/tests_me_chunk_upload.py index 27b28e217..6567aa942 100644 --- a/breathecode/media/tests/urls/v2/tests_me_chunk_upload.py +++ b/breathecode/media/tests/urls/v2/tests_me_chunk_upload.py @@ -8,6 +8,7 @@ from typing import Callable from unittest.mock import AsyncMock, MagicMock, PropertyMock, call +import capyc.pytest as capy import pytest from django.core.files.uploadedfile import InMemoryUploadedFile, SimpleUploadedFile from django.urls.base import reverse_lazy @@ -16,7 +17,6 @@ from breathecode.media.signals import schedule_deletion from breathecode.media.tasks import process_file from breathecode.services.google_cloud import File, Storage -from capyc.rest_framework import pytest as capy @pytest.fixture diff --git a/breathecode/media/tests/urls/v2/tests_operationtype.py b/breathecode/media/tests/urls/v2/tests_operationtype.py index da4d87a65..24b104e4c 100644 --- a/breathecode/media/tests/urls/v2/tests_operationtype.py +++ b/breathecode/media/tests/urls/v2/tests_operationtype.py @@ -2,12 +2,11 @@ Test /answer """ +import capyc.pytest as capy from django.urls.base import reverse_lazy from django.utils import timezone from rest_framework import status -from capyc.rest_framework import pytest as capy - UTC_NOW = timezone.now() diff --git a/breathecode/media/tests/urls/v2/tests_operationtype_type.py b/breathecode/media/tests/urls/v2/tests_operationtype_type.py index 0ae9b6a38..1585aabd7 100644 --- a/breathecode/media/tests/urls/v2/tests_operationtype_type.py +++ b/breathecode/media/tests/urls/v2/tests_operationtype_type.py @@ -2,13 +2,12 @@ Test /answer """ +import capyc.pytest as capy import pytest from django.urls.base import reverse_lazy from django.utils import timezone from rest_framework import status -from capyc.rest_framework import pytest as capy - UTC_NOW = timezone.now() diff --git a/breathecode/mentorship/tests/admin/tests_use_daily.py b/breathecode/mentorship/tests/admin/tests_use_daily.py index e431a0b97..c61c410e4 100644 --- a/breathecode/mentorship/tests/admin/tests_use_daily.py +++ b/breathecode/mentorship/tests/admin/tests_use_daily.py @@ -2,10 +2,10 @@ Test mentorships """ +import capyc.pytest as capy import pytest from breathecode.mentorship.admin import use_daily -from capyc.rest_framework import pytest as capy @pytest.mark.fixture(autouse=True) diff --git a/breathecode/mentorship/tests/admin/tests_use_google_meet.py b/breathecode/mentorship/tests/admin/tests_use_google_meet.py index 14efe614b..230ecdf0a 100644 --- a/breathecode/mentorship/tests/admin/tests_use_google_meet.py +++ b/breathecode/mentorship/tests/admin/tests_use_google_meet.py @@ -2,10 +2,10 @@ Test mentorships """ +import capyc.pytest as capy import pytest from breathecode.mentorship.admin import use_google_meet -from capyc.rest_framework import pytest as capy @pytest.mark.fixture(autouse=True) diff --git a/breathecode/mentorship/tests/urls_shortner/tests_meet_slug_service_slug.py b/breathecode/mentorship/tests/urls_shortner/tests_meet_slug_service_slug.py index 5a11870bb..9a2c5f01c 100644 --- a/breathecode/mentorship/tests/urls_shortner/tests_meet_slug_service_slug.py +++ b/breathecode/mentorship/tests/urls_shortner/tests_meet_slug_service_slug.py @@ -2,11 +2,11 @@ Test cases for /academy/:id/member/:id """ -import os import random from datetime import timedelta from unittest.mock import MagicMock, call, patch +import capyc.pytest as capy import pytest import timeago from django.core.handlers.wsgi import WSGIRequest @@ -21,7 +21,6 @@ from breathecode.payments import tasks from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode from breathecode.tests.mocks.requests import apply_requests_request_mock -from capyc.rest_framework.pytest import fixtures as fx from ..mixins import MentorshipTestCase @@ -3496,7 +3495,7 @@ def test_get_pending_sessions_or_create_returns_empty_queryset(self): MagicMock(side_effect=get_empty_mentorship_session_queryset), ) def test__post__auth__no_saas__finantial_status_no_late( - bc: Breathecode, client: fx.Client, academy, cohort, cohort_user + bc: Breathecode, client: capy.Client, academy, cohort, cohort_user ): mentor_profile_cases = [ @@ -3643,7 +3642,7 @@ def test__post__auth__no_saas__finantial_status_no_late( "breathecode.mentorship.actions.get_pending_sessions_or_create", MagicMock(side_effect=get_empty_mentorship_session_queryset), ) -def test__post__auth__no_saas__finantial_status_late(bc: Breathecode, client: fx.Client, academy, cohort): +def test__post__auth__no_saas__finantial_status_late(bc: Breathecode, client: capy.Client, academy, cohort): mentor_profile_cases = [ { diff --git a/breathecode/monitoring/tests/management/commands/tests_supervisor.py b/breathecode/monitoring/tests/management/commands/tests_supervisor.py index ac2edf695..c04bc247f 100644 --- a/breathecode/monitoring/tests/management/commands/tests_supervisor.py +++ b/breathecode/monitoring/tests/management/commands/tests_supervisor.py @@ -1,11 +1,11 @@ from datetime import timedelta from unittest.mock import MagicMock, call +import capyc.pytest.core.fixtures as cfx +import capyc.pytest.django.fixtures as dfx import pytest from asgiref.sync import sync_to_async -import capyc.pytest.core.fixtures as cfx -import capyc.pytest.django.fixtures as dfx from breathecode.monitoring.models import Supervisor as SupervisorModel from breathecode.monitoring.models import SupervisorIssue from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode diff --git a/breathecode/monitoring/tests/tasks/tests_fix_issue.py b/breathecode/monitoring/tests/tasks/tests_fix_issue.py index cc46daee3..a52260fa6 100644 --- a/breathecode/monitoring/tests/tasks/tests_fix_issue.py +++ b/breathecode/monitoring/tests/tasks/tests_fix_issue.py @@ -3,6 +3,7 @@ from logging import Logger from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from asgiref.sync import sync_to_async @@ -13,7 +14,6 @@ from breathecode.utils.decorators import issue as issue_decorator from breathecode.utils.decorators import paths from breathecode.utils.decorators import supervisor as supervisor_decorator -from capyc.rest_framework import pytest as capy PATHS = paths.copy() diff --git a/breathecode/monitoring/tests/tasks/tests_run_supervisor.py b/breathecode/monitoring/tests/tasks/tests_run_supervisor.py index 30a979d26..10ef3ae77 100644 --- a/breathecode/monitoring/tests/tasks/tests_run_supervisor.py +++ b/breathecode/monitoring/tests/tasks/tests_run_supervisor.py @@ -2,10 +2,10 @@ from logging import Logger from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from asgiref.sync import sync_to_async -import capyc.django.pytest.fixtures as dfx from breathecode.monitoring.models import Supervisor as SupervisorModel from breathecode.monitoring.models import SupervisorIssue from breathecode.monitoring.tasks import run_supervisor @@ -95,7 +95,7 @@ def db(data={}): } -def tests_not_found(database: dfx.Database, supervisor: Supervisor): +def tests_not_found(database: capy.Database, supervisor: Supervisor): database.create() run_supervisor.delay(1) @@ -119,7 +119,7 @@ def tests_not_found(database: dfx.Database, supervisor: Supervisor): ), ], ) -def tests_supervisor_handler_not_found(database: dfx.Database, supervisor: Supervisor, task_module, task_name, error): +def tests_supervisor_handler_not_found(database: capy.Database, supervisor: Supervisor, task_module, task_name, error): database.create( supervisor={ "task_module": task_module, @@ -153,7 +153,7 @@ def tests_supervisor_handler_not_found(database: dfx.Database, supervisor: Super ] -def tests_supervision_with_not_issues(database: dfx.Database, supervisor: Supervisor, utc_now: datetime): +def tests_supervision_with_not_issues(database: capy.Database, supervisor: Supervisor, utc_now: datetime): database.create( supervisor={ "task_module": "breathecode.monitoring.tests.tasks.tests_run_supervisor", @@ -186,7 +186,7 @@ def tests_supervision_with_not_issues(database: dfx.Database, supervisor: Superv assert Logger.error.call_args_list == [] -def tests_supervision_with_issues(database: dfx.Database, supervisor: Supervisor, utc_now: datetime): +def tests_supervision_with_issues(database: capy.Database, supervisor: Supervisor, utc_now: datetime): database.create( supervisor={ "task_module": "breathecode.monitoring.tests.tasks.tests_run_supervisor", diff --git a/breathecode/payments/tests/actions/tests_validate_and_create_proof_of_payment.py b/breathecode/payments/tests/actions/tests_validate_and_create_proof_of_payment.py index efac386b6..862084c14 100644 --- a/breathecode/payments/tests/actions/tests_validate_and_create_proof_of_payment.py +++ b/breathecode/payments/tests/actions/tests_validate_and_create_proof_of_payment.py @@ -4,15 +4,15 @@ from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest +from capyc.rest_framework.exceptions import ValidationException from django.core.handlers.wsgi import WSGIRequest from django.utils import timezone from rest_framework.test import APIRequestFactory, force_authenticate from breathecode.payments.actions import validate_and_create_proof_of_payment from breathecode.payments.tasks import set_proof_of_payment_confirmation_url -from capyc.rest_framework import pytest as capy -from capyc.rest_framework.exceptions import ValidationException UTC_NOW = timezone.now() diff --git a/breathecode/payments/tests/actions/tests_validate_and_create_subscriptions.py b/breathecode/payments/tests/actions/tests_validate_and_create_subscriptions.py index 69386c4a8..abfc1e302 100644 --- a/breathecode/payments/tests/actions/tests_validate_and_create_subscriptions.py +++ b/breathecode/payments/tests/actions/tests_validate_and_create_subscriptions.py @@ -5,15 +5,15 @@ from datetime import datetime, timedelta from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest +from capyc.rest_framework.exceptions import ValidationException from django.core.handlers.wsgi import WSGIRequest from django.utils import timezone from rest_framework.test import APIRequestFactory, force_authenticate from breathecode.payments.actions import validate_and_create_subscriptions from breathecode.payments.tasks import build_plan_financing -from capyc.rest_framework import pytest as capy -from capyc.rest_framework.exceptions import ValidationException UTC_NOW = timezone.now() diff --git a/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py b/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py index 55216ef6f..2ba790e46 100644 --- a/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py +++ b/breathecode/payments/tests/supervisors/tests_supervise_all_consumption_sessions.py @@ -1,17 +1,15 @@ from datetime import datetime, timedelta -from logging import Logger -from unittest.mock import MagicMock, call +from unittest.mock import MagicMock +import capyc.pytest.core.fixtures as cfx +import capyc.pytest.django.fixtures as dfx import pytest from asgiref.sync import sync_to_async -import capyc.pytest.core.fixtures as cfx -import capyc.pytest.django.fixtures as dfx from breathecode.monitoring.models import Supervisor as SupervisorModel from breathecode.monitoring.models import SupervisorIssue from breathecode.payments.supervisors import supervise_all_consumption_sessions from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from breathecode.utils.decorators import supervisor as supervisor_decorator class Supervisor: diff --git a/breathecode/payments/tests/tasks/tests_set_proof_of_payment_confirmation_url.py b/breathecode/payments/tests/tasks/tests_set_proof_of_payment_confirmation_url.py index 1ab1a3f07..25b166b77 100644 --- a/breathecode/payments/tests/tasks/tests_set_proof_of_payment_confirmation_url.py +++ b/breathecode/payments/tests/tasks/tests_set_proof_of_payment_confirmation_url.py @@ -2,11 +2,11 @@ from typing import Generator from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from breathecode.media import settings from breathecode.payments import tasks -from capyc.rest_framework import pytest as capy @pytest.fixture(autouse=True) diff --git a/breathecode/payments/tests/urls/tests_academy_plan_slug_subscription.py b/breathecode/payments/tests/urls/tests_academy_plan_slug_subscription.py index 97b78fc48..ca738d8c1 100644 --- a/breathecode/payments/tests/urls/tests_academy_plan_slug_subscription.py +++ b/breathecode/payments/tests/urls/tests_academy_plan_slug_subscription.py @@ -2,12 +2,12 @@ from datetime import timedelta from unittest.mock import MagicMock +import capyc.pytest as capy import pytest from django.urls import reverse_lazy from rest_framework import status from rest_framework.request import Request -import capyc.rest_framework.pytest as capy from breathecode.payments import actions from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode diff --git a/breathecode/payments/tests/urls/tests_bag_id_coupon.py b/breathecode/payments/tests/urls/tests_bag_id_coupon.py index 173f82de5..eb92196cf 100644 --- a/breathecode/payments/tests/urls/tests_bag_id_coupon.py +++ b/breathecode/payments/tests/urls/tests_bag_id_coupon.py @@ -2,13 +2,13 @@ from datetime import UTC, datetime from typing import Any +import capyc.pytest as capy import pytest from django.db.models.query import QuerySet from django.urls import reverse_lazy from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework.pytest import fixtures as rfx def queryset_with_pks(query: Any, pks: list[int]) -> None: @@ -119,7 +119,7 @@ def put_serializer(bag, plans=[], coupons=[], data={}): @pytest.mark.parametrize("plan_pk", [None, ""]) -def test_no_auth(bc: Breathecode, client: rfx.Client, plan_pk): +def test_no_auth(bc: Breathecode, client: capy.Client, plan_pk): url = reverse_lazy("payments:bag_id_coupon", kwargs={"bag_id": 1}) if plan_pk is not None: url += f"?plan={plan_pk}" @@ -137,7 +137,7 @@ def test_no_auth(bc: Breathecode, client: rfx.Client, plan_pk): @pytest.mark.parametrize("plan_pk", [None, ""]) -def test_missing_plan(bc: Breathecode, client: rfx.Client, plan_pk): +def test_missing_plan(bc: Breathecode, client: capy.Client, plan_pk): model = bc.database.create(user=1) client.force_authenticate(user=model.user) @@ -158,7 +158,7 @@ def test_missing_plan(bc: Breathecode, client: rfx.Client, plan_pk): @pytest.mark.parametrize("plan_pk", ["my-plan", 1]) -def test_plan_not_found(bc: Breathecode, client: rfx.Client, plan_pk): +def test_plan_not_found(bc: Breathecode, client: capy.Client, plan_pk): model = bc.database.create(user=1) client.force_authenticate(user=model.user) @@ -179,7 +179,7 @@ def test_plan_not_found(bc: Breathecode, client: rfx.Client, plan_pk): @pytest.mark.parametrize("plan_pk", ["my-plan", 1]) -def test_no_bag(bc: Breathecode, client: rfx.Client, plan_pk): +def test_no_bag(bc: Breathecode, client: capy.Client, plan_pk): plan = { "is_renewable": False, } @@ -216,7 +216,7 @@ def test_no_bag(bc: Breathecode, client: rfx.Client, plan_pk): ("PREVIEW", [{"slug": slug, "auto": False, "discount_value": 1} for slug in ["coupon3", "coupon4"]]), ], ) -def test_plan_found__coupons_not_found(bc: Breathecode, client: rfx.Client, bag_type, plan_pk, coupons): +def test_plan_found__coupons_not_found(bc: Breathecode, client: capy.Client, bag_type, plan_pk, coupons): plan = { "is_renewable": False, } @@ -260,7 +260,7 @@ def test_plan_found__coupons_not_found(bc: Breathecode, client: rfx.Client, bag_ ), ], ) -def test_plan_found__coupons_found(bc: Breathecode, client: rfx.Client, plan_pk, max, coupons, bag_type): +def test_plan_found__coupons_found(bc: Breathecode, client: capy.Client, plan_pk, max, coupons, bag_type): plan = { "is_renewable": False, } diff --git a/breathecode/payments/tests/urls/tests_coupon.py b/breathecode/payments/tests/urls/tests_coupon.py index ba99ccae5..cada64689 100644 --- a/breathecode/payments/tests/urls/tests_coupon.py +++ b/breathecode/payments/tests/urls/tests_coupon.py @@ -1,9 +1,9 @@ +import capyc.pytest as capy import pytest from django.urls import reverse_lazy from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework.pytest import fixtures as rfx @pytest.fixture(autouse=True) @@ -25,7 +25,7 @@ def get_serializer(bc: Breathecode, coupon): @pytest.mark.parametrize("plan_pk", [None, ""]) -def test_missing_plan(bc: Breathecode, client: rfx.Client, plan_pk): +def test_missing_plan(bc: Breathecode, client: capy.Client, plan_pk): url = reverse_lazy("payments:coupon") if plan_pk is not None: url += f"?plan={plan_pk}" @@ -42,7 +42,7 @@ def test_missing_plan(bc: Breathecode, client: rfx.Client, plan_pk): @pytest.mark.parametrize("plan_pk", ["my-plan", 1]) -def test_plan_not_found(bc: Breathecode, client: rfx.Client, plan_pk): +def test_plan_not_found(bc: Breathecode, client: capy.Client, plan_pk): url = reverse_lazy("payments:coupon") if plan_pk is not None: url += f"?plan={plan_pk}" @@ -66,7 +66,7 @@ def test_plan_not_found(bc: Breathecode, client: rfx.Client, plan_pk): ([{"slug": slug, "auto": False, "discount_value": 1} for slug in ["coupon3", "coupon4"]]), ], ) -def test_plan_found__coupons_not_found(bc: Breathecode, client: rfx.Client, plan_pk, coupons): +def test_plan_found__coupons_not_found(bc: Breathecode, client: capy.Client, plan_pk, coupons): plan = { "is_renewable": False, } @@ -105,7 +105,7 @@ def test_plan_found__coupons_not_found(bc: Breathecode, client: rfx.Client, plan ), ], ) -def test_plan_found__coupons_found(bc: Breathecode, client: rfx.Client, plan_pk, max, coupons): +def test_plan_found__coupons_found(bc: Breathecode, client: capy.Client, plan_pk, max, coupons): plan = { "is_renewable": False, } diff --git a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py index c6b8f4e65..7ae5df983 100644 --- a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py +++ b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession.py @@ -1,12 +1,12 @@ import random -from datetime import datetime, timedelta, timezone +from datetime import timedelta +import capyc.pytest as capy import pytest from django.urls import reverse_lazy from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.pytest.rest_framework import fixtures as rfx @pytest.fixture(autouse=True) @@ -52,7 +52,7 @@ def random_duration(): return timedelta(hours=hours, minutes=minutes, seconds=seconds) -def test_no_auth(bc: Breathecode, client: rfx.Client): +def test_no_auth(bc: Breathecode, client: capy.Client): url = reverse_lazy("payments:me_service_slug_consumptionsession", kwargs={"service_slug": "my-service"}) response = client.put(url) @@ -65,7 +65,7 @@ def test_no_auth(bc: Breathecode, client: rfx.Client): assert bc.database.list_of("payments.ConsumptionSession") == [] -def test_no_consumables(bc: Breathecode, client: rfx.Client): +def test_no_consumables(bc: Breathecode, client: capy.Client): url = reverse_lazy("payments:me_service_slug_consumptionsession", kwargs={"service_slug": "my-service"}) model = bc.database.create(user=1) @@ -81,7 +81,7 @@ def test_no_consumables(bc: Breathecode, client: rfx.Client): assert bc.database.list_of("payments.ConsumptionSession") == [] -def test_created(bc: Breathecode, client: rfx.Client, utc_now): +def test_created(bc: Breathecode, client: capy.Client, utc_now): duration = random_duration() model = bc.database.create(user=1, consumable=1, service={"session_duration": duration, "type": "VOID"}) url = reverse_lazy("payments:me_service_slug_consumptionsession", kwargs={"service_slug": model.service.slug}) @@ -109,7 +109,7 @@ def test_created(bc: Breathecode, client: rfx.Client, utc_now): ] -def test_cached(bc: Breathecode, client: rfx.Client, utc_now, fake): +def test_cached(bc: Breathecode, client: capy.Client, utc_now, fake): slug = fake.slug() duration = random_duration() model = bc.database.create( diff --git a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_hash.py b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_hash.py index 4a098744f..e9f4c6217 100644 --- a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_hash.py +++ b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_hash.py @@ -1,12 +1,12 @@ import random -from datetime import datetime, timedelta, timezone +from datetime import timedelta +import capyc.pytest as capy import pytest from django.urls import reverse_lazy from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework.pytest import fixtures as rfx @pytest.fixture(autouse=True) @@ -53,7 +53,7 @@ def random_duration(): return timedelta(hours=hours, minutes=minutes, seconds=seconds) -def test_no_auth(bc: Breathecode, client: rfx.Client): +def test_no_auth(bc: Breathecode, client: capy.Client): url = reverse_lazy( "payments:me_service_slug_consumptionsession_hash", kwargs={"service_slug": "my-service", "hash": "a1234567890123456"}, @@ -69,7 +69,7 @@ def test_no_auth(bc: Breathecode, client: rfx.Client): assert bc.database.list_of("payments.ConsumptionSession") == [] -def test_no_consumables(bc: Breathecode, client: rfx.Client): +def test_no_consumables(bc: Breathecode, client: capy.Client): url = reverse_lazy( "payments:me_service_slug_consumptionsession_hash", kwargs={"service_slug": "my-service", "hash": "a1234567890123456"}, @@ -88,7 +88,7 @@ def test_no_consumables(bc: Breathecode, client: rfx.Client): assert bc.database.list_of("payments.ConsumptionSession") == [] -def test_created(bc: Breathecode, client: rfx.Client, utc_now): +def test_created(bc: Breathecode, client: capy.Client, utc_now): duration = random_duration() model = bc.database.create(user=1, consumable=1, service={"session_duration": duration, "type": "VOID"}) url = reverse_lazy( @@ -119,7 +119,7 @@ def test_created(bc: Breathecode, client: rfx.Client, utc_now): ] -def test_cached(bc: Breathecode, client: rfx.Client, utc_now, fake): +def test_cached(bc: Breathecode, client: capy.Client, utc_now, fake): slug = fake.slug() duration = random_duration() model = bc.database.create( diff --git a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_id.py b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_id.py index bcb16d604..761074fd6 100644 --- a/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_id.py +++ b/breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_id.py @@ -1,12 +1,12 @@ import random from datetime import datetime, timedelta, timezone +import capyc.pytest as capy import pytest from django.urls import reverse_lazy from rest_framework import status from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework.pytest import fixtures as rfx @pytest.fixture(autouse=True) @@ -53,7 +53,7 @@ def db_item(service, data={}): } -def test_no_auth(bc: Breathecode, client: rfx.Client): +def test_no_auth(bc: Breathecode, client: capy.Client): url = reverse_lazy( "payments:me_service_slug_consumptionsession_id", kwargs={"service_slug": "my-service", "consumptionsession_id": 1}, @@ -70,7 +70,7 @@ def test_no_auth(bc: Breathecode, client: rfx.Client): @pytest.mark.parametrize("with_session", [False, True]) -def test_no_sessions(bc: Breathecode, client: rfx.Client, with_session, fake, utc_now): +def test_no_sessions(bc: Breathecode, client: capy.Client, with_session, fake, utc_now): slug = fake.slug() duration = random_duration() url = reverse_lazy( @@ -128,7 +128,7 @@ def test_no_sessions(bc: Breathecode, client: rfx.Client, with_session, fake, ut assert bc.database.list_of("payments.ConsumptionSession") == [] -def test_cancelled(bc: Breathecode, client: rfx.Client, utc_now, fake): +def test_cancelled(bc: Breathecode, client: capy.Client, utc_now, fake): slug = fake.slug() duration = random_duration() model = bc.database.create( diff --git a/breathecode/utils/tests/decorators/tests_consume.py b/breathecode/utils/tests/decorators/tests_consume.py index e9e7b03f1..cc90fe533 100644 --- a/breathecode/utils/tests/decorators/tests_consume.py +++ b/breathecode/utils/tests/decorators/tests_consume.py @@ -3,6 +3,7 @@ from datetime import timedelta from unittest.mock import MagicMock, call +import capyc.pytest as capy import pytest from adrf.decorators import APIView, api_view from asgiref.sync import sync_to_async @@ -20,7 +21,6 @@ from breathecode.payments import signals as payments_signals from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode from breathecode.utils.decorators import ServiceContext -from capyc.rest_framework import pytest as capy SERVICE = random.choice([value for value, _ in models.Service.Consumer.choices]) UTC_NOW = timezone.now() diff --git a/breathecode/utils/tests/decorators/tests_has_permission.py b/breathecode/utils/tests/decorators/tests_has_permission.py index b87a281c1..633860111 100644 --- a/breathecode/utils/tests/decorators/tests_has_permission.py +++ b/breathecode/utils/tests/decorators/tests_has_permission.py @@ -1,5 +1,6 @@ import json +import capyc.pytest as capy import pytest from adrf.decorators import APIView, api_view from asgiref.sync import sync_to_async @@ -13,7 +14,6 @@ import breathecode.utils.decorators as decorators from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.rest_framework import pytest as capy PERMISSION = "can_kill_kenny" UTC_NOW = timezone.now() diff --git a/capyc/__about__.py b/capyc/__about__.py deleted file mode 100644 index 9d514cfba..000000000 --- a/capyc/__about__.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Capy core. - -This package provides the core functionalities for an API Rest. - - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣬⠷⣶⡖⠲⡄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⣠⠶⠋⠁⠀⠸⣿⡀⠀⡁⠈⠙⠢⠤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⢠⠞⠁⠀⠀⠀⠀⠀⠉⠣⠬⢧⠀⠀⠀⠀⠈⠻⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⢀⡴⠃⠀⠀⢠⣴⣿⡿⠀⠀⠀⠐⠋⠀⠀⠀⠀⠀⠀⠘⠿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⢀⡴⠋⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠒⠒⠓⠛⠓⠶⠶⢄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⢠⠎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠦⣀⠀⠀⠀⠀⠀⠀⠀⠀ - ⡞⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⢷⡄⠀⠀⠀⠀⠀⠀ - ⢻⣇⣹⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀ - ⠀⠻⣟⠋⠀⠀⠀⠀⠀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣄⠀⠀⠀ - ⠀⠀⠀⠉⠓⠒⠊⠉⠉⢸⡙⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠘⣆⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣱⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣿⠀⠀⠀⠀⠀⢻⡄⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠟⣧⡀⠀⠀⢀⡄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡿⠇⠀⠀⠀⠀⠀⠀⢣⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⡧⢿⡀⠚⠿⢻⡆⠀⠀⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠘⡆ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⠀⠀⠈⢹⡀⠀⠀⠀⠀⣾⡆⠀⠀⠀⠀⠀⠀⠀⠀⠾⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⢷⣾⠀⠸⡷⠀⠀⠀⠘⡿⠂⠀⠀⠀⢀⡴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡇ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡄⠳⢼⣧⡀⠀⠀⢶⡼⠦⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⡎⣽⠿⣦⣽⣷⠿⠒⠀⠀⠀⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠁⣴⠃⡿⠀⠀⢠⠆⠢⡀⠀⠀⠀⠈⢧⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣠⠏⠀⣸⢰⡇⠀⢠⠏⠀⠀⠘⢦⣀⣀⠀⢀⠙⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠾⠿⢯⣤⣆⣤⣯⠼⠀⠀⢸⠀⠀⠀⠀⠀⣉⠭⠿⠛⠛⠚⠟⡇⠀⠀⣀⠀⢀⡤⠊⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀⢸⣷⣶⣤⣦⡼⠀⠀⠀⣴⣯⠇⡀⣀⣀⠤⠤⠖⠁⠐⠚⠛⠉⠁⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣛⠁⢋⡀⠀⠀⠀⠀⣛⣛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -""" diff --git a/capyc/__init__.py b/capyc/__init__.py deleted file mode 100644 index 9d514cfba..000000000 --- a/capyc/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Capy core. - -This package provides the core functionalities for an API Rest. - - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣬⠷⣶⡖⠲⡄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⣠⠶⠋⠁⠀⠸⣿⡀⠀⡁⠈⠙⠢⠤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⢠⠞⠁⠀⠀⠀⠀⠀⠉⠣⠬⢧⠀⠀⠀⠀⠈⠻⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⢀⡴⠃⠀⠀⢠⣴⣿⡿⠀⠀⠀⠐⠋⠀⠀⠀⠀⠀⠀⠘⠿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⠀⢀⡴⠋⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠒⠒⠓⠛⠓⠶⠶⢄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - ⢠⠎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠦⣀⠀⠀⠀⠀⠀⠀⠀⠀ - ⡞⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⢷⡄⠀⠀⠀⠀⠀⠀ - ⢻⣇⣹⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀ - ⠀⠻⣟⠋⠀⠀⠀⠀⠀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣄⠀⠀⠀ - ⠀⠀⠀⠉⠓⠒⠊⠉⠉⢸⡙⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠘⣆⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣱⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣿⠀⠀⠀⠀⠀⢻⡄⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠟⣧⡀⠀⠀⢀⡄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡿⠇⠀⠀⠀⠀⠀⠀⢣⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⡧⢿⡀⠚⠿⢻⡆⠀⠀⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠘⡆ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⠀⠀⠈⢹⡀⠀⠀⠀⠀⣾⡆⠀⠀⠀⠀⠀⠀⠀⠀⠾⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⢷⣾⠀⠸⡷⠀⠀⠀⠘⡿⠂⠀⠀⠀⢀⡴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡇ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡄⠳⢼⣧⡀⠀⠀⢶⡼⠦⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⡎⣽⠿⣦⣽⣷⠿⠒⠀⠀⠀⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠁⣴⠃⡿⠀⠀⢠⠆⠢⡀⠀⠀⠀⠈⢧⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣠⠏⠀⣸⢰⡇⠀⢠⠏⠀⠀⠘⢦⣀⣀⠀⢀⠙⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠾⠿⢯⣤⣆⣤⣯⠼⠀⠀⢸⠀⠀⠀⠀⠀⣉⠭⠿⠛⠛⠚⠟⡇⠀⠀⣀⠀⢀⡤⠊⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀⢸⣷⣶⣤⣦⡼⠀⠀⠀⣴⣯⠇⡀⣀⣀⠤⠤⠖⠁⠐⠚⠛⠉⠁⠀⠀⠀⠀⠀⠀ - ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣛⠁⢋⡀⠀⠀⠀⠀⣛⣛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -""" diff --git a/capyc/circuitbreaker/__init__.py b/capyc/circuitbreaker/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/core/__init__.py b/capyc/core/__init__.py deleted file mode 100644 index 9848acaad..000000000 --- a/capyc/core/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .shorteners import * # NOQA F401 diff --git a/capyc/core/i18n.py b/capyc/core/i18n.py deleted file mode 100644 index 6dbe0b73d..000000000 --- a/capyc/core/i18n.py +++ /dev/null @@ -1,114 +0,0 @@ -import logging -import os -from functools import cache -from typing import Optional - -from breathecode.utils.exceptions import MalformedLanguageCode - -__all__ = ["translation"] - -IS_TEST_ENV = os.getenv("ENV") == "test" -logger = logging.getLogger(__name__) - - -def get_short_code(code: str) -> str: - return code[:2] - - -def format_and_assert_code(code: str, from_kwargs: bool = False) -> None: - # do not remove the assertions - - is_short = len(code) == 2 - - # first two character only with lowercase - if not code[:2].islower(): - raise MalformedLanguageCode("Lang code is not lowercase") - - # last two character only with lowercase - if not is_short and from_kwargs and not code[3:].islower(): - raise MalformedLanguageCode("Country code is not lowercase") - - # last two character only with uppercase - elif not is_short and not from_kwargs and not code[2:].isupper(): - raise MalformedLanguageCode("Country code is not uppercase") - - separator = "_" if from_kwargs else "-" - - # the format is en or en-US - if not (len(code) == 2 or (len(code) == 5 and code[2] == separator)): - raise MalformedLanguageCode("Code malformed") - - if not from_kwargs: - return code.replace(separator, "_") - - return code - - -def format_languages(code: str) -> list: - """Translate the language to the local language.""" - - languages = set() - - code.replace(" ", "") - - codes = [x for x in code.split(",") if x] - - for code in codes: - priority = 1 - if ";q=" in code: - s = code.split(";q=") - code = s[0] - try: - priority = float(s[1]) - except Exception: - raise MalformedLanguageCode( - 'The priority is not a float, example: "en;q=0.5"', slug="malformed-quantity-language-code" - ) - - languages.add((priority, code)) - - return [x[1] for x in sorted(languages, key=lambda x: (x[0], "-" in x[1], x[1]), reverse=True)] - - -def try_to_translate(code, **kwargs: str) -> str | None: - is_short = len(code) == 2 - - if code.lower() in kwargs: - return kwargs[code.lower()] - - elif not is_short and (short_code := get_short_code(code)) in kwargs: - return kwargs[short_code] - - return None - - -@cache -def translation(code: Optional[str] = "en", slug: Optional[str] = None, **kwargs: str) -> str: - """Get the translation.""" - - if not code: - code = "en" - - languages = [format_and_assert_code(language) for language in format_languages(code)] - - # do the assertions - for key in kwargs: - format_and_assert_code(key, from_kwargs=True) - - # the english if mandatory - if not ("en" in kwargs or "en_us" in kwargs): - raise MalformedLanguageCode("The english translation is mandatory") - - if slug and IS_TEST_ENV: - return slug - - for language in languages: - v = try_to_translate(language, **kwargs) - - if v: - return v - - if "en_us" in kwargs: - return kwargs["en_us"] - - return kwargs["en"] diff --git a/capyc/core/managers.py b/capyc/core/managers.py deleted file mode 100644 index f7856a6a4..000000000 --- a/capyc/core/managers.py +++ /dev/null @@ -1,139 +0,0 @@ -import inspect -import logging -from typing import Any, Callable, Literal, Optional, Tuple, TypedDict, overload - -logger = logging.getLogger(__name__) -__all__ = ["feature"] - - -type FeatureType = Literal["availability", "variant"] - - -class Meta(TypedDict): - frontend: bool - default: bool - name: str - type: FeatureType - - -class Feature: - _flags: dict[FeatureType, dict[str, Tuple[Callable[..., str | bool], list[str], Meta]]] = { - "availability": {}, - "variant": {}, - } - TRUE = ["true", "TRUE", "True", "1", "on", "ON"] - FALSE = ["false", "FALSE", "False", "0", "off", "OFF"] - - @classmethod - def parameters(cls, fn: Callable) -> list[str]: - signature = inspect.signature(fn) - return [ - name - for name, param in signature.parameters.items() - if param.kind not in (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD) - and param.default is inspect.Parameter.empty - ] - - @classmethod - def availability(cls, name: str, frontend=True, default: Optional[bool] = None) -> bool: - - def decorator(fn: Callable[..., bool]) -> Callable[..., bool]: - meta = {"frontend": frontend, "default": default, "name": name, "type": "availability"} - return fn, meta - - return decorator - - @classmethod - def variant(cls, name: str, frontend=True, default: Optional[str] = None) -> str: - - def decorator(fn: Callable[..., str]) -> Callable[..., str]: - meta = {"frontend": frontend, "default": default, "name": name, "type": "variant"} - return fn, meta - - return decorator - - @classmethod - def is_enabled(cls, name: str, context: Optional[dict[str, Any]] = None, default: Optional[bool] = None) -> bool: - return cls._get("availability", name, context, default) - - @classmethod - def get_variant(cls, name: str, context: Optional[dict[str, Any]] = None, default: Optional[str] = None) -> str: - return cls._get("variant", name, context, default) - - @classmethod - def add(cls, *features: Tuple[Callable[..., str | bool], Meta]) -> None: - for fn, meta in features: - if callable(fn) is False: - logger.error(f"Expected a callable, got {type(fn).__name__}") - return - - params = cls.parameters(fn) - cls._flags[meta["type"]][meta["name"]] = (fn, params, meta) - - @classmethod - def context(cls, **context: Any) -> dict[str, Any]: - return context - - @overload - @classmethod - def _get( - cls, type: Literal["availability"], name: str, context: Optional[dict[str, Any]] = None, default: bool = False - ) -> bool: ... - - @overload - @classmethod - def _get( - cls, type: Literal["variant"], name: str, context: Optional[dict[str, Any]] = None, default: str = "unknown" - ) -> str: ... - - @classmethod - def _get( - cls, - type: FeatureType, - name: str, - context: Optional[dict[str, Any]] = None, - default: Optional[str | bool] = None, - ) -> str | bool: - if context is None: - context = {} - - info = cls._flags[type].get(name) - if info: - extra = {} - fn, params, meta = info - for param in params: - if param not in context: - logger.debug(f"Missing required parameter '{param}', using None as default") - extra[param] = None - - try: - value = fn(**context, **extra) - if value is None: - v = False if type == "availability" else "unknown" - if default is not None: - v = default - - elif meta["default"] is not None: - v = meta["default"] - - return v - - return value - - except Exception: - logger.exception(f"Error executing flag '{name}', using default value") - return default - - logger.error(f"Flag '{name}' not found, using default value") - return default - - @classmethod - def namespace(cls, namespace: str) -> list[str]: - return [flag for flag in cls._flags.keys() if flag.startswith(namespace)] - - @classmethod - def list(cls) -> list[str]: - return list(cls._flags.keys()) - - -feature = Feature() diff --git a/capyc/core/shorteners.py b/capyc/core/shorteners.py deleted file mode 100644 index 7ad93db3b..000000000 --- a/capyc/core/shorteners.py +++ /dev/null @@ -1,16 +0,0 @@ -__all__ = ["C"] - - -class C: - """ - Shortener for a call. - - It'll be used to cover an api exception that returns multiple errors. - """ - - args: tuple - kwargs: dict - - def __init__(self, *args: tuple, **kwargs: dict): - self.args = args - self.kwargs = kwargs diff --git a/capyc/django/__init__.py b/capyc/django/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/django/serializer.py b/capyc/django/serializer.py deleted file mode 100644 index 3f029d3af..000000000 --- a/capyc/django/serializer.py +++ /dev/null @@ -1,17 +0,0 @@ -class InitializeMeta(type): - - def __init__(cls, name, bases, dct): - super().__init__(name, bases, dct) - cls.initialize() - - -class Serializer: ... - - -from breathecode.admissions.models import Cohort - - -class CohortSerializer(Serializer): - model = Cohort - fields = () - # exclude = () diff --git a/capyc/newrelic/__init__.py b/capyc/newrelic/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/pytest/circuitbreaker/__init__.py b/capyc/pytest/circuitbreaker/__init__.py deleted file mode 100644 index 19f73822e..000000000 --- a/capyc/pytest/circuitbreaker/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .fixtures import * # noqa: F401 diff --git a/capyc/pytest/circuitbreaker/fixtures/__init__.py b/capyc/pytest/circuitbreaker/fixtures/__init__.py deleted file mode 100644 index 2da2f61de..000000000 --- a/capyc/pytest/circuitbreaker/fixtures/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .dont_close_the_circuit import * # noqa: F401 diff --git a/capyc/pytest/circuitbreaker/fixtures/dont_close_the_circuit.py b/capyc/pytest/circuitbreaker/fixtures/dont_close_the_circuit.py deleted file mode 100644 index c0c030f49..000000000 --- a/capyc/pytest/circuitbreaker/fixtures/dont_close_the_circuit.py +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Generator -from unittest.mock import patch - -import pytest - -__all__ = ["dont_close_the_circuit"] - - -@pytest.fixture(autouse=True) -def dont_close_the_circuit() -> Generator[None, None, None]: - """Don't allow the circuit be closed.""" - - with patch("circuitbreaker.CircuitBreaker._failure_count", 0, create=True): - with patch("circuitbreaker.CircuitBreaker.FAILURE_THRESHOLD", 10000000, create=True): - yield diff --git a/capyc/pytest/core/__init__.py b/capyc/pytest/core/__init__.py deleted file mode 100644 index 19f73822e..000000000 --- a/capyc/pytest/core/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .fixtures import * # noqa: F401 diff --git a/capyc/pytest/core/fixtures/__init__.py b/capyc/pytest/core/fixtures/__init__.py deleted file mode 100644 index bc25698cd..000000000 --- a/capyc/pytest/core/fixtures/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .clean_environment import * # noqa: F401 -from .fake import * # noqa: F401 -from .format import * # noqa: F401 -from .image import * # noqa: F401 -from .no_http_requests import * # noqa: F401 -from .random import * # noqa: F401 -from .seed import * # noqa: F401 diff --git a/capyc/pytest/core/fixtures/clean_environment.py b/capyc/pytest/core/fixtures/clean_environment.py deleted file mode 100644 index e5213b8db..000000000 --- a/capyc/pytest/core/fixtures/clean_environment.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -from typing import Generator - -import pytest - -__all__ = ["clean_environment"] - -WHITELIST = [ - "RANDOM_SEED", - "SQLALCHEMY_SILENCE_UBER_WARNING", - "SHELL", - "HOME", - "VSCODE_GIT_ASKPASS_EXTRA_ARGS", - "HOSTTYPE", - "WSL_INTEROP", - "XDG_RUNTIME_DIR", - "COLORTERM", - "WSL_DISTRO_NAME", - "TERM", - "PATH", - "TERM_PROGRAM", - "VSCODE_GIT_ASKPASS_NODE", - "PULSE_SERVER", - "VSCODE_GIT_IPC_HANDLE", - "_OLD_FISH_PROMPT_OVERRIDE", - "_OLD_VIRTUAL_PATH", - "DISPLAY", - "LOGNAME", - "VIRTUAL_ENV", - "WSLENV", - "WAYLAND_DISPLAY", - "SHLVL", - "PWD", - "TERM_PROGRAM_VERSION", - "USER", - "GIT_ASKPASS", - "VSCODE_GIT_ASKPASS_MAIN", - "NAME", - "VSCODE_IPC_HOOK_CLI", - "LANG", -] - - -@pytest.fixture(autouse=True) -def clean_environment(monkeypatch: pytest.MonkeyPatch) -> Generator[None, None, None]: - keys = os.environ.keys() - - for key in keys: - if key not in WHITELIST: - monkeypatch.delenv(key) - - yield diff --git a/capyc/pytest/core/fixtures/fake.py b/capyc/pytest/core/fixtures/fake.py deleted file mode 100644 index 76a61400d..000000000 --- a/capyc/pytest/core/fixtures/fake.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import Generator, Optional - -import pytest -from faker import Faker as Fake - -__all__ = ["fake", "Fake"] - - -@pytest.fixture(autouse=True) -def fake(seed: Optional[int]) -> Generator[Fake, None, None]: - f = Fake() - f.seed_instance(seed) - - yield f diff --git a/capyc/pytest/core/fixtures/format.py b/capyc/pytest/core/fixtures/format.py deleted file mode 100644 index 9b5edb3fb..000000000 --- a/capyc/pytest/core/fixtures/format.py +++ /dev/null @@ -1,69 +0,0 @@ -from typing import Generator, final - -import pytest -from faker import Faker - -__all__ = ["Format", "format"] - - -def _remove_dinamics_fields(dict, fields=None): - """Remove dinamics fields from django models as dict""" - if fields is None: - fields = ["_state", "created_at", "updated_at", "_password"] - - if not dict: - return None - - result = dict.copy() - for field in fields: - if field in result: - del result[field] - - # remove any field starting with __ (double underscore) because it is considered private - without_private_keys = result.copy() - for key in result: - if "__" in key or key.startswith("_"): - del without_private_keys[key] - - return without_private_keys - - -@final -class Format: - """ - Random utils. - """ - - def __init__(self, fake: Faker) -> None: - self._fake = fake - - def _single_obj_repr(self, object: object) -> str: - try: - from django.db import models - - if isinstance(object, models.Model): - return _remove_dinamics_fields(object.__dict__) - - except ImportError: - pass - - raise NotImplementedError(f"Not implemented for {type(object)}") - - def to_obj_repr(self, object: object) -> str: - """ - Format an object as dict, and an array of dicts if the object is a list. - """ - - if isinstance(object, list): - return [self._single_obj_repr(o) for o in object] - - return self._single_obj_repr(object) - - -@pytest.fixture() -def format(fake) -> Generator[Format, None, None]: - """Image fixtures.""" - - x = Format(fake) - - yield x diff --git a/capyc/pytest/core/fixtures/image.py b/capyc/pytest/core/fixtures/image.py deleted file mode 100644 index 4aad46cd7..000000000 --- a/capyc/pytest/core/fixtures/image.py +++ /dev/null @@ -1,72 +0,0 @@ -import os -from typing import Generator, final - -import numpy as np -import pytest -from faker import Faker -from PIL import Image as PilImage - -__all__ = ["image", "Image"] - - -@final -class Image: - """ - Image utils. - """ - - def __init__(self, fake: Faker) -> None: - self._fake = fake - self._filenames = [] - - def random(self, x_size: int, y_size: int): - """ - Generate a random image. - - Parameters: - - x_size (int): A int representing the size in X axis. - - y_size (int): A int representing the size in Y axis. - - Returns: - - file (bytes): A binary file object containing the generated random image. - - Usage: - - ```python - file = image.random(100, 100) - ``` - - The function generates a random image of the specified size and returns a binary file object containing the image data. - """ - - size = (y_size, x_size) - - filename = self._fake.slug() + ".png" - while filename in self._filenames: - filename = self._fake.slug() + ".png" - - image = PilImage.new("RGB", size) - arr = np.random.randint(low=0, high=255, size=(size[1], size[0])) - - image = PilImage.fromarray(arr.astype("uint8")) - image.save(filename, "PNG") - - file = open(filename, "rb") - self._filenames.append(filename) - - return file - - def _teardown(self): - for filename in self._filenames: - os.remove(filename) - - -@pytest.fixture() -def image(fake) -> Generator[Image, None, None]: - """Image fixtures.""" - - x = Image(fake) - - yield x - - x._teardown() diff --git a/capyc/pytest/core/fixtures/no_http_requests.py b/capyc/pytest/core/fixtures/no_http_requests.py deleted file mode 100644 index 2be0eb3a0..000000000 --- a/capyc/pytest/core/fixtures/no_http_requests.py +++ /dev/null @@ -1,26 +0,0 @@ -import pytest - -__all__ = ["no_http_requests"] - - -@pytest.fixture(scope="module") -def no_http_requests(monkeypatch: pytest.MonkeyPatch) -> None: - from urllib3.connectionpool import HTTPConnectionPool - - urlopen = HTTPConnectionPool.urlopen - - def urlopen_mock(self, method, url, *args, **kwargs): - # this prevent a tester left pass a request to a third party service - allow = [ - ("0.0.0.0", 9050, None), - ] - - for host, port, path in allow: - if host == self.host and port == self.port and (path == url or path == None): - return urlopen(self, method, url, *args, **kwargs) - - raise Exception( - f"All HTTP request to third party services are forwidden, {method.upper()} {self.scheme}://{self.host}{url}" - ) - - monkeypatch.setattr("urllib3.connectionpool.HTTPConnectionPool.urlopen", urlopen_mock) diff --git a/capyc/pytest/core/fixtures/random.py b/capyc/pytest/core/fixtures/random.py deleted file mode 100644 index d828413f6..000000000 --- a/capyc/pytest/core/fixtures/random.py +++ /dev/null @@ -1,114 +0,0 @@ -import random as r -import string -from typing import Any, Dict, Generator, Optional, Tuple, final - -import pytest -from faker import Faker - -__all__ = ["random", "Random"] - - -@final -class Random: - """ - Random utils. - """ - - def __init__(self, fake: Faker, seed: Optional[int]) -> None: - self._fake = fake - r.seed(seed) - - def seed(self, a=None, version=2) -> None: - """Initialize internal state from a seed. - - The only supported seed types are None, int, float, - str, bytes, and bytearray. - - None or no argument seeds from current time or from an operating - system specific randomness source if available. - - If *a* is an int, all bits are used. - - For version 2 (the default), all of the bits are used if *a* is a str, - bytes, or bytearray. For version 1 (provided for reproducing random - sequences from older versions of Python), the algorithm for str and - bytes generates a narrower range of seeds. - """ - - r.seed(a=a, version=version) - - def tuple(self, *args: Any, **kwargs: Any) -> Tuple[Any, ...]: - """Generate a random tuple.""" - - return self._fake.pytuple(*args, **kwargs) - - def dict(self, *args: Any, **kwargs: Any) -> Dict[str, Any]: - """Generate a random dict.""" - - return self._fake.pydict(*args, **kwargs) - - def args(self, *args: Any, **kwargs: Any) -> Tuple[Any, ...]: - """Generate a random tuple.""" - - return self.tuple(*args, **kwargs) - - def kwargs(self, *args: Any, **kwargs: Any) -> Dict[str, Any]: - """Generate a random dict.""" - - return self.dict(*args, **kwargs) - - def int(self, min: int = 0, max: int = 1000) -> int: - """ - Generate a random integer within a specified range. - - Parameters: - - min (int): The minimum value of the range. Default is 0. - - max (int): The maximum value of the range. Default is 1000. - - Returns: - - int: A random integer within the specified range. - - This method uses the built-in `random.randint()` function to generate a random integer between the given `min` and `max` values. - """ - - return r.randint(min, max) - - def string(self, size=0, lower=False, upper=False, symbol=False, number=False) -> str: - """ - Generate a random string of specified size and optional character types. - - Parameters: - - size (int): The desired length of the generated string. Default is 0. - - lower (bool): If True, include lowercase letters in the generated string. Default is False. - - upper (bool): If True, include uppercase letters in the generated string. Default is False. - - symbol (bool): If True, include punctuation symbols in the generated string. Default is False. - - number (bool): If True, include digits in the generated string. Default is False. - - Returns: - - str: A random string of the specified size and character types. - """ - - chars = "" - - if lower: - chars += string.ascii_lowercase - - if upper: - chars += string.ascii_uppercase - - if symbol: - chars += string.punctuation - - if number: - chars += string.digits - - return "".join(r.choices(chars, k=size)) - - -@pytest.fixture(autouse=True) -def random(fake: Faker, seed: Optional[int]) -> Generator[Random, None, None]: - """Image fixtures.""" - - x = Random(fake, seed) - - yield x diff --git a/capyc/pytest/core/fixtures/seed.py b/capyc/pytest/core/fixtures/seed.py deleted file mode 100644 index 573626dbb..000000000 --- a/capyc/pytest/core/fixtures/seed.py +++ /dev/null @@ -1,43 +0,0 @@ -import random -from typing import Generator, Optional - -import pytest - -__all__ = ["seed", "Seed", "pytest_addoption", "pytest_terminal_summary"] - -type Seed = Optional[int] -SEED = random.randint(0, 2**32 - 1) -seed_used = None -SEED_KEY = "_+* SEED *+_" -END_KEY = "_+* END *+_" - - -def pytest_addoption(parser: pytest.Parser): - try: - parser.addoption("--seed", action="store", default=None, type=int, help="Set the random seed for tests") - except Exception: - ... - - -def pytest_terminal_summary(terminalreporter, config: pytest.Config) -> None: - ... - # if hasattr(config, END_KEY) is False: - # setattr(config, END_KEY, True) - # seed = getattr(config, SEED_KEY, None) - # terminalreporter.write_sep("=", "Capy Core Summary") - # terminalreporter.write_line(f"Seed: {seed}") - - -@pytest.fixture(autouse=True) -def seed(request: pytest.FixtureRequest) -> Generator[Optional[int], None, None]: - global SEED - - seed = request.config.getoption("--seed") - if seed is None: - seed = SEED - - # if hasattr(request.config, SEED_KEY) is False: - # setattr(request.config, SEED_KEY, seed) - - yield seed - print(f"Seed used: {seed}") diff --git a/capyc/pytest/django/__init__.py b/capyc/pytest/django/__init__.py deleted file mode 100644 index 712cc4401..000000000 --- a/capyc/pytest/django/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from capyc.pytest.core import * # noqa: F401 - -from .fixtures import * # noqa: F401 diff --git a/capyc/pytest/django/fixtures/__init__.py b/capyc/pytest/django/fixtures/__init__.py deleted file mode 100644 index 75f046b5a..000000000 --- a/capyc/pytest/django/fixtures/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .database import * # noqa: F401 -from .queryset import * # noqa: F401 -from .signals import * # noqa: F401 diff --git a/capyc/pytest/django/fixtures/database.py b/capyc/pytest/django/fixtures/database.py deleted file mode 100644 index ebe4b575e..000000000 --- a/capyc/pytest/django/fixtures/database.py +++ /dev/null @@ -1,562 +0,0 @@ -from __future__ import annotations - -import functools -import random -import re -from collections.abc import Iterable -from typing import Any, Generator, final - -import pytest -from asgiref.sync import sync_to_async -from django.apps import apps -from django.conf import settings -from django.db import models -from django.db.models import Model - -# from django.db.models.query_utils import DeferredAttribute -# ReverseOneToOneDescriptor -# ReverseManyToOneDescriptor -from django.db.models.fields.related_descriptors import ( - ForwardManyToOneDescriptor, - ForwardOneToOneDescriptor, - ManyToManyDescriptor, -) -from django.db.models.query_utils import DeferredAttribute -from faker import Faker - -from breathecode.tests.mixins.generate_models_mixin.utils import argument_parser -from breathecode.utils.attr_dict import AttrDict - -__all__ = ["database", "Database"] - -_fake = Faker() - - -def _remove_dinamics_fields(dict, fields=None): - """Remove dinamics fields from django models as dict""" - if fields is None: - fields = ["_state", "created_at", "updated_at", "_password"] - - if not dict: - return None - - result = dict.copy() - for field in fields: - if field in result: - del result[field] - - # remove any field starting with __ (double underscore) because it is considered private - without_private_keys = result.copy() - for key in result: - if "__" in key or key.startswith("_"): - del without_private_keys[key] - - return without_private_keys - - -@final -class Database: - _cache = {} - - @classmethod - def get_model(cls, path: str) -> Model: - """ - Return the model matching the given app_label and model_name. - - As a shortcut, app_label may be in the form .. - - model_name is case-insensitive. - - Raise LookupError if no application exists with this label, or no - model exists with this name in the application. Raise ValueError if - called with a single argument that doesn't contain exactly one dot. - - Usage: - - ```py - # class breathecode.admissions.models.Cohort - Cohort = self.bc.database.get_model('admissions.Cohort') - ``` - - Keywords arguments: - - path(`str`): path to a model, for example `admissions.CohortUser`. - """ - - if path in cls._cache: - return cls._cache[path] - - app_label, model_name = path.split(".") - cls._cache[path] = apps.get_model(app_label, model_name) - - return cls._cache[path] - - @classmethod - def list_of(cls, path: str, dict: bool = True) -> list[Model | dict[str, Any]]: - """ - This is a wrapper for `Model.objects.filter()`, get a list of values of models as `list[dict]` if - `dict=True` else get a list of `Model` instances. - - Usage: - - ```py - # get all the Cohort as list of dict - self.bc.database.get('admissions.Cohort') - - # get all the Cohort as list of instances of model - self.bc.database.get('admissions.Cohort', dict=False) - ``` - - Keywords arguments: - - path(`str`): path to a model, for example `admissions.CohortUser`. - - dict(`bool`): if true return dict of values of model else return model instance. - """ - - model = Database.get_model(path) - result = model.objects.filter() - - if dict: - result = [_remove_dinamics_fields(data.__dict__) for data in result] - - return result - - @classmethod - @sync_to_async - def alist_of(cls, path: str, dict: bool = True) -> list[Model | dict[str, Any]]: - """ - This is a wrapper for `Model.objects.filter()`, get a list of values of models as `list[dict]` if - `dict=True` else get a list of `Model` instances. - - Usage: - - ```py - # get all the Cohort as list of dict - self.bc.database.get('admissions.Cohort') - - # get all the Cohort as list of instances of model - self.bc.database.get('admissions.Cohort', dict=False) - ``` - - Keywords arguments: - - path(`str`): path to a model, for example `admissions.CohortUser`. - - dict(`bool`): if true return dict of values of model else return model instance. - """ - - return cls.list_of(path, dict) - - @classmethod - def _get_random_attrs(cls, model): - props = {} - - model_fields = [ - ( - x, - type(getattr(model, x).field), - { - "choices": getattr(getattr(model, x).field, "choices", None), - "default": getattr(getattr(model, x).field, "default", models.NOT_PROVIDED), - "null": getattr(getattr(model, x).field, "null", False), - "blank": getattr(getattr(model, x).field, "blank", False), - }, - ) - for x in vars(model) - if type(getattr(model, x)) is DeferredAttribute - ] - - for field_name, field_type, field_attrs in model_fields: - - if field_attrs["default"] is not models.NOT_PROVIDED: - if callable(field_attrs["default"]): - props[field_name] = field_attrs["default"]() - - else: - - props[field_name] = field_attrs["default"] - - elif field_attrs["blank"] is True and field_attrs["null"] is True: - props[field_name] = None - - elif field_attrs["choices"] is not None: - props[field_name] = random.choice(field_attrs["choices"])[0] - - elif field_type is models.EmailField: - props[field_name] = _fake.email() - - elif field_type is models.CharField: - props[field_name] = _fake.name() - - elif field_type is models.TextField: - props[field_name] = _fake.text() - - elif field_type is models.BooleanField: - props[field_name] = _fake.boolean() - - elif field_type is models.UUIDField: - props[field_name] = _fake.uuid4() - - elif field_type is models.SlugField: - props[field_name] = _fake.slug() - - elif field_type is models.URLField: - props[field_name] = _fake.url() - - elif field_type is models.DateField: - props[field_name] = _fake.date() - - elif field_type is models.TimeField: - props[field_name] = _fake.time() - - elif field_type is models.DurationField: - props[field_name] = _fake.date_time() - _fake.date_time() - - elif field_type is models.DecimalField: - props[field_name] = _fake.random_number() - - elif field_type in [models.PositiveSmallIntegerField, models.SmallIntegerField]: - props[field_name] = _fake.random_digit() - - if field_type is models.PositiveSmallIntegerField and props[field_name] < 0: - props[field_name] *= -1 - - elif field_type in [models.IntegerField, models.PositiveIntegerField]: - props[field_name] = _fake.random_int() - - if field_type is models.PositiveIntegerField and props[field_name] < 0: - props[field_name] *= -1 - - elif field_type in [models.BigIntegerField, models.PositiveBigIntegerField]: - props[field_name] = _fake.random_number() - - if field_type is models.PositiveBigIntegerField and props[field_name] < 0: - props[field_name] *= -1 - - elif field_type in [models.FloatField, models.DecimalField]: - props[field_name] = _fake.random_number() / 1000 - - elif field_type is models.DateTimeField: - from datetime import timezone - - props[field_name] = _fake.date_time().replace(tzinfo=timezone.utc) - - elif field_type is models.FileField: - props[field_name] = _fake.file_name() - - elif field_type is models.ImageField: - props[field_name] = _fake.image_url() - - elif field_type is models.JSONField: - import json - - props[field_name] = _fake.pydict() - is_dict = _fake.boolean() - while True: - try: - if is_dict: - props[field_name] = _fake.pydict() - - else: - props[field_name] = _fake.pylist() - - json.dumps(props[field_name]) - break - - except Exception: - continue - - elif field_type is models.BinaryField: - props[field_name] = _fake.binary(length=12) - - elif field_type in [models.IPAddressField, models.GenericIPAddressField]: - props[field_name] = _fake.ipv4() - - elif field_type is models.FilePathField: - props[field_name] = _fake.file_path() - - return props - - @classmethod - def _get_related_fields(cls, model): - - def get_attrs(field): - cls_type = type(field) - field = field.field - obj = { - "cls": cls_type, - "path": field.related_model._meta.app_label + "." + field.related_model.__name__, - "name": field.name, - "blank": field.blank, - "null": field.null, - "default": field.default, - "choices": field.choices, - "related_model": field.related_model, - } - - return obj - - for x in vars(model): - if type(getattr(model, x)) in [ - ForwardOneToOneDescriptor, - ForwardManyToOneDescriptor, - ManyToManyDescriptor, - ]: - yield ( - x, - type(getattr(model, x)), - get_attrs(getattr(model, x)), - ) - - @classmethod - def _build_descriptors(cls): - app_map = {} - model_map = {} - model_alias_map = {} - name_map = {} - ban_list = set() - - for app in settings.INSTALLED_APPS: - app_label = app.split(".")[-1] - all_models = apps.get_app_config(app_label).get_models() - app_cache = {} - - for model in all_models: - model_name = model.__name__ - model_descriptor = { - "cls": model, - "path": app_label + "." + model_name, - "related_fields": [*cls._get_related_fields(model)], - "get_values": functools.partial(cls._get_random_attrs, model), - } - app_cache[model_name] = model_descriptor - name_map[app_label + "__" + cls.to_snake_case(model_name)] = (app_label, model_name) - - if model_name in ban_list: - continue - - snake_model_name = cls.to_snake_case(model_name) - if model_name in model_map: - ban_list.add(model_name) - del model_map[model_name] - del name_map[snake_model_name] - del model_alias_map[snake_model_name] - continue - - model_map[model_name] = model_descriptor - name_map[snake_model_name] = model_name - model_alias_map[snake_model_name] = app_label + "." + model_name - - app_map[app_label] = app_cache - - return app_map, model_map, name_map, model_alias_map - - @classmethod - def to_snake_case(cls, class_name): - snake_case = re.sub("([a-z0-9])([A-Z])", r"\1_\2", class_name).lower() - return snake_case - - @classmethod - def create(cls, **models): - res = {} - app_map, model_map, name_map, model_alias_map = cls._build_descriptors() - - pending = {} - - keys = [*models.keys()] - - for key in keys: - if models[key] is None or models[key] == 0: - del models[key] - - # get descriptors - for model_alias, _value in models.items(): - try: - path = name_map[model_alias] - - except KeyError: - if "__" in model_alias: - app_label, model_name = model_alias.split("__") - raise ValueError(f"Model {model_name} not found in {app_label}") - - raise ValueError( - f"Model {model_alias} not found or two models have the same name, " - "use the app_label.model_name format" - ) - - if isinstance(path, tuple): - app_label, model_name = path - model_descriptor = app_map[app_label][model_name] - - else: - model_descriptor = model_map[path] - - pending[model_alias] = model_descriptor - - cache = {} - exec_order = [] - - # fill cache - for model_alias, model_descriptor in pending.items(): - x = model_descriptor["path"] - - cache[x] = (model_descriptor, models.get(model_alias)) - exec_order.append(x) - - # get dependencies - processed = set() - while True: - cache_to_add = {} - exec_order_to_add = [] - for key in exec_order: - item = cache.get(key, None) - if item is None: - app_label, model_name = key.split(".") - x = app_map[app_label][model_name] - item = (x, 1) - cache[key] = item - - model_descriptor, value = item - - if model_descriptor["path"] in cache_to_add: - continue - - if model_descriptor["path"] in processed: - continue - - processed.add(model_descriptor["path"]) - - for _related_field, _field_type, field_attrs in model_descriptor["related_fields"]: - - if field_attrs["path"] in processed: - continue - - if ( - field_attrs["path"] not in exec_order - and field_attrs["path"] not in cache_to_add - and (field_attrs["null"] is False or field_attrs["cls"] is ForwardOneToOneDescriptor) - ): - app_label, model_name = field_attrs["path"].split(".") - cache_to_add[field_attrs["path"]] = (app_map[app_label][model_name], 1) - - # disable m2m temporally - if field_attrs["cls"] is not ManyToManyDescriptor: - exec_order_to_add.append(field_attrs["path"]) - - exec_order += exec_order_to_add - cache.update(cache_to_add) - - if len(cache_to_add) == 0: - break - - # sort dependencies - for model_path, (model_descriptor, _value) in cache.items(): - - for _related_field, _field_type, field_attrs in model_descriptor["related_fields"]: - dep_path = field_attrs["path"] - to_reevaluate = [] - - # dep not found, maybe it's a m2m, that was temporally disabled - try: - dep_index = exec_order.index(dep_path) - except ValueError: - continue - - # check this - try: - model_index = exec_order.index(model_path) - except ValueError: - continue - - if dep_index > model_index: - exec_order.pop(dep_index) - exec_order.insert(model_index, dep_path) - to_reevaluate.append(dep_path) - - while len(to_reevaluate) > 0: - to_re_reevaluate = [] - - for x in to_reevaluate: - for _related_field, _field_type, field_attrs in cache[x][0]["related_fields"]: - - dep_path = field_attrs["path"] - - # dep not found, maybe it is a m2m, that was temporally disabled - try: - dep_index = exec_order.index(dep_path) - - except ValueError: - continue - - model_index = exec_order.index(x) - - if dep_index > model_index: - exec_order.pop(dep_index) - exec_order.insert(model_index, dep_path) - - # disable m2m temporally - if field_attrs["cls"] is not ManyToManyDescriptor: - to_re_reevaluate.append(dep_path) - - to_reevaluate = to_re_reevaluate - - generated = {} - - # build instances - for model_path in exec_order: - model_descriptor, value = cache[model_path] - - app_label, model_name = model_descriptor["path"].split(".") - model_alias = cls.to_snake_case(model_name) - - result = [] - all_m2m = [] - - for how_many, arguments in argument_parser(value): - m2m = {} - all_m2m.append(m2m) - for _related_field, field_type, field_attrs in model_descriptor["related_fields"]: - if field_attrs["path"] in generated: - - arguments[field_attrs["name"]] = generated[field_attrs["path"]] - - if field_type is ManyToManyDescriptor: - m2m[field_attrs["name"]] = arguments[field_attrs["name"]] - del arguments[field_attrs["name"]] - - if field_attrs["cls"] in [ForwardOneToOneDescriptor, ForwardManyToOneDescriptor] and isinstance( - arguments[field_attrs["name"]], list - ): - arguments[field_attrs["name"]] = arguments[field_attrs["name"]][0] - - for _ in range(how_many): - instance = model_descriptor["cls"].objects.create( - **{**model_descriptor["get_values"](), **arguments} - ) - - for m2m_key in m2m.keys(): - m2m_handler = getattr(instance, m2m_key) - m2m_value = m2m[m2m_key] - if isinstance(m2m_value, Iterable): - m2m_handler.set(m2m_value) - else: - m2m_handler.add(m2m_value) - - result.append(instance) - - if len(result) == 1: - result = result[0] - - if model_alias not in name_map: - model_alias = app_label + "__" + model_alias - - res[model_alias] = result - generated[model_descriptor["path"]] = result - - return AttrDict(**res) - - @classmethod - @sync_to_async - def acreate(cls, **models): - return cls.create(**models) - - -@pytest.fixture -def database(db, seed) -> Generator[Database, None, None]: - yield Database() diff --git a/capyc/pytest/django/fixtures/queryset.py b/capyc/pytest/django/fixtures/queryset.py deleted file mode 100644 index 39a3e6a91..000000000 --- a/capyc/pytest/django/fixtures/queryset.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -QuerySet fixtures. -""" - -from typing import Any, Generator, final - -import pytest -from django.db.models.query import QuerySet as DjangoQuerySet - -__all__ = ["QuerySet", "queryset"] - - -@final -class QuerySet: - """ - QuerySet utils. - """ - - def with_pks(self, query: DjangoQuerySet, pks: list[int]) -> None: - """ - Assert that the queryset has the following primary keys. - - Usage: - - ```py - from breathecode.admissions.models import Cohort - - database.create(cohort=1) - qs = Cohort.objects.filter() - - # pass because the QuerySet has the primary keys 1 - queryset.with_pks(qs, [1]) # 🟢 - - # fail because the QuerySet has the primary keys 1 but the second argument is empty - queryset.with_pks(qs, []) # 🔴 - ``` - """ - - assert isinstance(query, DjangoQuerySet), "The first argument is not a QuerySet" - - assert [x.pk for x in query] == pks - - def get_pks(self, queryset: DjangoQuerySet) -> list[Any]: - """ - Get the queryset pks. - - Usage: - - ```py - from breathecode.admissions.models import Cohort - - database.create(cohort=1) - qs = Cohort.objects.filter() - - assert queryset.get_pks(qs) == [1] - ``` - """ - - return [x.pk for x in queryset] - - -@pytest.fixture(scope="module") -def queryset() -> Generator[QuerySet, None, None]: - """ - QuerySet utils. - """ - - yield QuerySet() diff --git a/capyc/pytest/django/fixtures/signals.py b/capyc/pytest/django/fixtures/signals.py deleted file mode 100644 index 973099c3b..000000000 --- a/capyc/pytest/django/fixtures/signals.py +++ /dev/null @@ -1,219 +0,0 @@ -"""Signal fixtures.""" - -import importlib -import os -import site -from typing import Generator, final - -import pytest -from django.db.models.signals import ModelSignal -from django.dispatch import Signal - -__all__ = ["signals", "Signals", "signals_map"] - - -def get_signal_files(path: str) -> list[str]: - signal_files = [] - - # Walk through the current directory and its subdirectories - for folder, _, files in os.walk(path): - for file in files: - if file == "signals.py": - signal_files.append(os.path.join(folder, file)) - - return signal_files - - -def get_signals(path: str, includes_root_folder=True) -> list[Signal]: - - # Get the current working directory (root directory) - root_directory = path - - # Initialize a list to store the file paths - signal_files = get_signal_files(root_directory) - - if "/" in root_directory: - separator = "/" - else: - separator = "\\" - - res = {} - - if includes_root_folder: - prefix = root_directory - - if prefix.endswith(separator): - prefix = prefix[:-1] - - prefix = prefix.split(separator)[-1] + "." - - else: - prefix = "" - - signal_files = [ - prefix + ".".join(x.replace(root_directory + separator, "").replace(".py", "").split(separator)) - for x in signal_files - ] - - signal_files = [x for x in signal_files if "-" not in x] - - for module_path in signal_files: - module = importlib.import_module(module_path) - signals = [ - x - for x in dir(module) - if x[0] != "_" and (isinstance(getattr(module, x), Signal) or isinstance(getattr(module, x), ModelSignal)) - ] - - for signal_path in signals: - res[f"{module_path}.{signal_path}"] = getattr(module, signal_path) - - return res - - -def get_dependencies() -> list[str]: - site_packages_dirs = site.getsitepackages() - - # Collect all dependency folders - dependency_folders = [] - for dir in site_packages_dirs: - if os.path.exists(dir): - for folder in os.listdir(dir): - folder_path = os.path.join(dir, folder) - if os.path.isdir(folder_path) and folder_path.endswith(".dist-info") is False: - dependency_folders.append(folder_path) - - return dependency_folders - - -def check_path(dir: str, pattern: str): - linux_path = dir.replace("\\", "/") - windows_path = dir.replace("/", "\\") - return linux_path not in dir and windows_path not in dir - - -@pytest.fixture(scope="session") -def signals_map(): - # Get the current working directory (root directory) - root_directory = os.getcwd() - - signals = {} - - for dependency_folder in get_dependencies(): - signals.update(get_signals(dependency_folder)) - - signals.update(get_signals(root_directory, includes_root_folder=False)) - - yield signals - - -@final -class Signals: - """Signal utils.""" - - def __init__(self, monkeypatch: pytest.MonkeyPatch, signals_map: dict[str, Signal | ModelSignal]) -> None: - self._monkeypatch = monkeypatch - self._signals_map = signals_map - - self._original_signal_send = Signal.send - self._original_signal_send_robust = Signal.send_robust - - self._original_model_signal_send = ModelSignal.send - self._original_model_signal_send_robust = ModelSignal.send_robust - - def disable(self): - """Disables all signals. - - This function can be used to temporarily disable all signals during a test. - When signals are disabled, they will not be sent and any code that depends on them will not be executed. - """ - - self._disabled = True - - # Mock the functions to disable signals - - def mock(original): - - def wrapper(x, *args, **kwargs): - if self._disabled: - return - - return original(x, *args, **kwargs) - - return wrapper - - self._monkeypatch.setattr("django.dispatch.Signal.send", mock(self._original_signal_send)) - self._monkeypatch.setattr("django.dispatch.Signal.send_robust", mock(self._original_signal_send_robust)) - - self._monkeypatch.setattr("django.dispatch.dispatcher.Signal.send", mock(self._original_signal_send)) - self._monkeypatch.setattr( - "django.dispatch.dispatcher.Signal.send_robust", mock(self._original_signal_send_robust) - ) - - self._monkeypatch.setattr("django.db.models.signals.ModelSignal.send", mock(self._original_model_signal_send)) - self._monkeypatch.setattr( - "django.db.models.signals.ModelSignal.send_robust", mock(self._original_model_signal_send_robust) - ) - - def enable(self, *to_enable, debug=False): - """ - Enable the specified signals or all signals if no arguments are provided. Right now this method can only be used once per test. - - Parameters: - *to_enable (list, optional): A list of signals to enable. Defaults to None. - debug (bool, optional): A boolean flag to enable debugging. Defaults to False. - - Returns: - None - """ - - self._disabled = False - - self._monkeypatch.setattr("django.dispatch.Signal.send", self._original_signal_send) - self._monkeypatch.setattr("django.dispatch.Signal.send_robust", self._original_signal_send_robust) - - self._monkeypatch.setattr("django.dispatch.dispatcher.Signal.send", self._original_signal_send) - self._monkeypatch.setattr("django.dispatch.dispatcher.Signal.send_robust", self._original_signal_send_robust) - - self._monkeypatch.setattr("django.db.models.signals.ModelSignal.send", self._original_model_signal_send) - self._monkeypatch.setattr( - "django.db.models.signals.ModelSignal.send_robust", self._original_model_signal_send_robust - ) - - if to_enable or debug: - to_disable = [x for x in self._signals_map if x not in to_enable] - - for signal in to_disable: - - def apply_mock(module): - - def send_mock(*args, **kwargs): - if debug: - try: - print(" args\n ", args) - except Exception: - pass - - try: - print(" kwargs\n ", kwargs) - except Exception: - pass - - print("\n") - - self._monkeypatch.setattr(module, send_mock) - - apply_mock(f"{signal}.send") - apply_mock(f"{signal}.send_robust") - - -@pytest.fixture -def signals(monkeypatch, signals_map: dict[str, Signal | ModelSignal]) -> Generator[Signals, None, None]: - """Signals utils.""" - - s = Signals(monkeypatch, signals_map) - s.disable() - - yield s - - s.enable() diff --git a/capyc/pytest/newrelic/__init__.py b/capyc/pytest/newrelic/__init__.py deleted file mode 100644 index 19f73822e..000000000 --- a/capyc/pytest/newrelic/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .fixtures import * # noqa: F401 diff --git a/capyc/pytest/newrelic/fixtures/__init__.py b/capyc/pytest/newrelic/fixtures/__init__.py deleted file mode 100644 index 8c412584d..000000000 --- a/capyc/pytest/newrelic/fixtures/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .disable_new_relic import * # noqa: F401 -from .disable_newrelic_prints import * # noqa: F401 diff --git a/capyc/pytest/newrelic/fixtures/disable_new_relic.py b/capyc/pytest/newrelic/fixtures/disable_new_relic.py deleted file mode 100644 index 06f037839..000000000 --- a/capyc/pytest/newrelic/fixtures/disable_new_relic.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Generator - -import pytest - -__all__ = ["disable_new_relic"] - - -@pytest.fixture(autouse=True) -def disable_new_relic(monkeypatch: pytest.MonkeyPatch) -> Generator[None, None, None]: - monkeypatch.setattr("newrelic.core.agent.Agent._atexit_shutdown", lambda *args, **kwargs: None) diff --git a/capyc/pytest/newrelic/fixtures/disable_newrelic_prints.py b/capyc/pytest/newrelic/fixtures/disable_newrelic_prints.py deleted file mode 100644 index bf60f8b4c..000000000 --- a/capyc/pytest/newrelic/fixtures/disable_newrelic_prints.py +++ /dev/null @@ -1,14 +0,0 @@ -import pytest - -__all__ = ["disable_newrelic_prints"] - - -@pytest.fixture(autouse=True) -def disable_newrelic_prints(monkeypatch: pytest.MonkeyPatch): - """Disable NewRelic prints.""" - - monkeypatch.setattr("newrelic.core.agent._logger.info", lambda *args, **kwargs: None) - monkeypatch.setattr("newrelic.core.agent._logger.warn", lambda *args, **kwargs: None) - monkeypatch.setattr("newrelic.core.agent._logger.error", lambda *args, **kwargs: None) - - yield diff --git a/capyc/pytest/rest_framework/__init__.py b/capyc/pytest/rest_framework/__init__.py deleted file mode 100644 index 5b2cb982f..000000000 --- a/capyc/pytest/rest_framework/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from capyc.pytest.django import * # noqa: F401 - -from .fixtures import * # noqa: F401 diff --git a/capyc/pytest/rest_framework/fixtures/__init__.py b/capyc/pytest/rest_framework/fixtures/__init__.py deleted file mode 100644 index 64eb8367e..000000000 --- a/capyc/pytest/rest_framework/fixtures/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .client import * # noqa: F401 diff --git a/capyc/pytest/rest_framework/fixtures/client.py b/capyc/pytest/rest_framework/fixtures/client.py deleted file mode 100644 index 9f7a5ea90..000000000 --- a/capyc/pytest/rest_framework/fixtures/client.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -QuerySet fixtures. -""" - -import pytest -from adrf.test import AsyncAPIClient as AsyncClient -from rest_framework.test import APIClient as Client - -__all__ = ["client", "aclient", "Client", "AsyncClient"] - - -@pytest.fixture -def client(): - return Client() - - -@pytest.fixture -def aclient(): - return AsyncClient() diff --git a/capyc/rest_framework/__init__.py b/capyc/rest_framework/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/rest_framework/exception_handler.py b/capyc/rest_framework/exception_handler.py deleted file mode 100644 index 5bc6750cf..000000000 --- a/capyc/rest_framework/exception_handler.py +++ /dev/null @@ -1,102 +0,0 @@ -from django import forms -from django.core.exceptions import ValidationError -from rest_framework.views import exception_handler as drf_exception_handler - -from capyc.rest_framework.exceptions import PaymentException, ValidationException - -__all__ = ["exception_handler"] - - -def get_item_attrs(item): - data = { - "pk": item.pk, - } - - if hasattr(item, "slug"): - data["slug"] = item.slug - - if hasattr(item, "name"): - data["name"] = item.name - - return data - - -def exception_handler(exc, context): - """Exception handler for Django REST Framework.""" - - if isinstance(exc, (forms.ValidationError, ValidationError)): - - for k in exc.error_dict: - for x in exc.error_dict[k]: - err = "" - if k != "__all__": - err += f"{k}: " - - err += f"{x.message}, " - - if err.endswith(", "): - err = err[:-2] + ". " - - if err.endswith(". "): - err = err[:-1] - - exc = ValidationException(err) - - context["request"]._request.POST = context["request"].data - response = drf_exception_handler(exc, context) - - # Now add the HTTP status code to the response. - if response is not None: - is_our_exception = isinstance(exc, ValidationException) or isinstance(exc, PaymentException) - if is_our_exception and isinstance(exc.detail, list): - - items = [] - - for x in response.data: - data = { - "detail": str(x), - "status_code": x.status_code, - } - - if x.silent: - data["silent"] = True - data["silent_code"] = x.slug - - if x.data: - data["data"] = x.data - - if x.queryset: - data["items"] = [get_item_attrs(v) for v in x.queryset] - items.append(data) - - if len(items) == 1: - items = items[0] - - response.data = items - - elif is_our_exception: - response.data["status_code"] = response.status_code - - if exc.silent: - response.data["silent"] = True - response.data["silent_code"] = exc.slug - - if exc.data is not None: - response.data["data"] = exc.data - - if exc.queryset: - response.data["items"] = [get_item_attrs(v) for v in exc.queryset] - - elif isinstance(exc, ValidationError): - response.data["status_code"] = 400 - - elif isinstance(response.data, list): - if response.data[0].code != "invalid": - response.data = {"status_code": response.data[0].code, "details": str(response.data[0])} - else: - response.data = {"status_code": 500, "details": str(response.data[0])} - - else: - response.data["status_code"] = response.status_code - - return response diff --git a/capyc/rest_framework/exceptions.py b/capyc/rest_framework/exceptions.py deleted file mode 100644 index 6aa3bc8c5..000000000 --- a/capyc/rest_framework/exceptions.py +++ /dev/null @@ -1,106 +0,0 @@ -import os -from typing import Optional - -from django.db.models import QuerySet -from rest_framework.exceptions import APIException - -from capyc.core.shorteners import C - -__all__ = ["ValidationException", "PaymentException"] - - -def is_test_env(): - return "ENV" in os.environ and os.environ["ENV"] == "test" - - -class ValidationException(APIException): - """Django REST Framework and Django Forms Exception.""" - - status_code: int - detail: str | list[C] - queryset: Optional[QuerySet] - data: dict - silent: bool - - def __init__( - self, details: str, code: int = 400, slug: Optional[str] = None, data=None, queryset=None, silent=False - ): - self.status_code = code - self.detail = details - self.data = data - self.queryset = queryset - self.silent = silent - self.slug = slug or "undefined" - - if isinstance(details, list) and code == 207: - self.detail = self._get_207_details() - - elif isinstance(details, list): - self.detail = self._get_details() - - elif slug and is_test_env(): - self.detail = slug - - def _get_207_details(self): - return [ValidationException(x.args[0], **x.kwargs) for x in self.detail] - - def _get_details(self): - return [ValidationException(x.args[0], **{**x.kwargs, "code": self.status_code}) for x in self.detail] - - def get_message(self): - if isinstance(self.detail, str): - return self.detail - - message = ". ".join([x.detail for x in self.detail]) - - if message[-1] != ".": - message += "." if self.detail else "" - - return message - - def get_message_list(self): - if isinstance(self.detail, list): - message = ". ".join([x.detail for x in self.detail]) - - if message[-1] != ".": - message += "." if self.detail else "" - - return message - - return [self.detail] - - -class PaymentException(APIException): - status_code: int = 402 - detail: str | list[C] - queryset: Optional[QuerySet] - data: dict - silent: bool - - def __init__(self, details: str, slug: Optional[str] = None, data=None, queryset=None, silent=False): - self.detail = details - self.data = data - self.queryset = queryset - self.silent = silent - self.slug = slug or "undefined" - - if isinstance(details, list): - self.detail = self._get_details() - - elif slug and is_test_env(): - self.detail = slug - - def _get_details(self): - return [PaymentException(x.args[0], **x.kwargs) for x in self.detail] - - def get_message(self): - if isinstance(self.detail, str): - return self.detail - - return ". \n".join([x.kwargs["slug"] if "slug" in x.kwargs else x.args[0] for x in self.detail]) - - def get_message_list(self): - if isinstance(self.detail, list): - return [x.kwargs["slug"] if "slug" in x.kwargs else x.args[0] for x in self.detail] - - return [self.detail] diff --git a/capyc/rest_framework/pytest/__init__.py b/capyc/rest_framework/pytest/__init__.py deleted file mode 100644 index 5b2cb982f..000000000 --- a/capyc/rest_framework/pytest/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from capyc.pytest.django import * # noqa: F401 - -from .fixtures import * # noqa: F401 diff --git a/capyc/rest_framework/pytest/fixtures/__init__.py b/capyc/rest_framework/pytest/fixtures/__init__.py deleted file mode 100644 index 64eb8367e..000000000 --- a/capyc/rest_framework/pytest/fixtures/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Centralized Breathecode fixtures for all our libraries.""" - -from .client import * # noqa: F401 diff --git a/capyc/rest_framework/pytest/fixtures/client.py b/capyc/rest_framework/pytest/fixtures/client.py deleted file mode 100644 index 9f7a5ea90..000000000 --- a/capyc/rest_framework/pytest/fixtures/client.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -QuerySet fixtures. -""" - -import pytest -from adrf.test import AsyncAPIClient as AsyncClient -from rest_framework.test import APIClient as Client - -__all__ = ["client", "aclient", "Client", "AsyncClient"] - - -@pytest.fixture -def client(): - return Client() - - -@pytest.fixture -def aclient(): - return AsyncClient() diff --git a/capyc/tests/__init__.py b/capyc/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/tests/core/__init__.py b/capyc/tests/core/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/tests/core/tests_managers.py b/capyc/tests/core/tests_managers.py deleted file mode 100644 index b78dea48d..000000000 --- a/capyc/tests/core/tests_managers.py +++ /dev/null @@ -1,144 +0,0 @@ -import os -from typing import Callable, TypedDict, Unpack -from unittest.mock import PropertyMock - -import pytest - -from capyc.core.managers import feature -from capyc.rest_framework import pytest as capy - - -@pytest.fixture(autouse=True) -def setup(monkeypatch: pytest.MonkeyPatch): - monkeypatch.setattr( - "capyc.core.managers.feature._flags", - PropertyMock( - return_value={ - "availability": {}, - "variant": {}, - } - ), - ) - yield - - -class Meta(TypedDict): - frontend: bool - default: bool - - -type MetaBuilder = Callable[..., None] - - -@pytest.fixture -def availability(): - - def wrapper(**meta: Unpack[Meta]): - - @feature.availability("test.availability", **meta) - def enable_activity() -> bool: - env = os.getenv("MY_ENV") - if env in feature.TRUE: - return True - - if env in feature.FALSE: - return False - - feature.add(enable_activity) - - yield wrapper - - -@pytest.fixture -def variant(): - - def wrapper(**meta: Unpack[Meta]): - - @feature.variant("test.variant", **meta) - def get_color() -> bool: - env = os.getenv("MY_ENV") - if env == "1": - return "red" - - if env == "2": - return "blue" - - feature.add(get_color) - - yield wrapper - - -class TestAvailability: - def test_env_is_none(self, availability: MetaBuilder) -> None: - availability() - value = feature.is_enabled("test.availability") - assert value is False - - @pytest.mark.parametrize("default", [True, False]) - def test_env_is_none__default_in_decorator(self, availability: MetaBuilder, default: bool) -> None: - availability(default=default) - value = feature.is_enabled("test.availability") - assert value is default - - @pytest.mark.parametrize("default", [True, False]) - def test_env_is_none__default_in_fn(self, availability: MetaBuilder, default: bool) -> None: - availability() - value = feature.is_enabled("test.availability", default=default) - assert value is default - - @pytest.mark.parametrize("default", [True, False]) - def test_env_is_none__both_defaults(self, variant: MetaBuilder, default: bool) -> None: - variant(default=not default) - value = feature.is_enabled("test.availability", default=default) - assert value is default - - @pytest.mark.parametrize("env", feature.FALSE) - def test_env_is_false(self, monkeypatch: pytest.MonkeyPatch, availability: MetaBuilder, env: str) -> None: - availability() - monkeypatch.setenv("MY_ENV", env) - value = feature.is_enabled("test.availability") - assert value is False - - @pytest.mark.parametrize("env", feature.TRUE) - def test_env_is_true(self, monkeypatch: pytest.MonkeyPatch, availability: MetaBuilder, env: str) -> None: - availability() - monkeypatch.setenv("MY_ENV", env) - value = feature.is_enabled("test.availability") - assert value is True - - -class TestVariant: - def test_env_is_none(self, variant: MetaBuilder) -> None: - variant() - value = feature.get_variant("test.variant") - assert value == "unknown" - - @pytest.mark.parametrize("default", ["hello", "world"]) - def test_env_is_none__default_in_decorator(self, variant: MetaBuilder, default: bool) -> None: - variant(default=default) - value = feature.get_variant("test.variant") - assert value is default - - @pytest.mark.parametrize("default", ["hello", "world"]) - def test_env_is_none__default_in_fn(self, variant: MetaBuilder, default: bool) -> None: - variant() - value = feature.get_variant("test.variant", default=default) - assert value is default - - @pytest.mark.parametrize("default", ["hello", "world"]) - def test_env_is_none__both_defaults(self, variant: MetaBuilder, default: bool, fake: capy.Fake) -> None: - variant(default=fake.slug()) - value = feature.get_variant("test.variant", default=default) - assert value is default - - def test_env_eq_1(self, monkeypatch: pytest.MonkeyPatch, variant: MetaBuilder) -> None: - variant() - monkeypatch.setenv("MY_ENV", "1") - value = feature.get_variant("test.variant") - assert value == "red" - - def test_env_eq_2(self, monkeypatch: pytest.MonkeyPatch, variant: MetaBuilder) -> None: - variant() - monkeypatch.setenv("MY_ENV", "2") - value = feature.get_variant("test.variant") - assert value == "blue" diff --git a/capyc/tests/rest_framework/__init__.py b/capyc/tests/rest_framework/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/capyc/tests/rest_framework/tests_exception_handler.py b/capyc/tests/rest_framework/tests_exception_handler.py deleted file mode 100644 index a1bdadb13..000000000 --- a/capyc/tests/rest_framework/tests_exception_handler.py +++ /dev/null @@ -1,530 +0,0 @@ -import random -from http import HTTPStatus - -import pytest -from django.http.request import HttpRequest -from rest_framework import status -from rest_framework.request import Request -from rest_framework.response import Response - -from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode -from capyc.core.shorteners import C -from capyc.rest_framework.exception_handler import exception_handler -from capyc.rest_framework.exceptions import PaymentException, ValidationException - - -def get_status_code(): - # Get all valid HTTP status codes - valid_status_codes = [status.value for status in HTTPStatus if status.value >= 400 and status.value < 600] - - # Return a randomly chosen status code - return random.choice(valid_status_codes) - - -class FakeBucketObject: - - def __init__(self, url): - self.url = url - - def public_url(self): - return self.url - - -@pytest.fixture(autouse=True) -def setup(monkeypatch, fake): - - monkeypatch.setattr("breathecode.admissions.actions.get_bucket_object", lambda x: FakeBucketObject(fake.url())) - yield - - -@pytest.fixture -def context(): - - request = HttpRequest() - request.META["HTTP_ACCEPT"] = "application/json" - request = Request(request) - - context = { - "view": None, - "args": (), - "kwargs": {}, - "request": request, - } - - yield context - - -@pytest.fixture -def set_env(monkeypatch): - - def wrapper(env): - monkeypatch.setenv("ENV", env) - - yield wrapper - - -@pytest.fixture -def get_queryset(db, bc: Breathecode): - - def wrapper(n): - bc.database.create(academy=n) - academy_cls = bc.database.get_model("admissions.Academy") - return academy_cls.objects.all() - - yield wrapper - - -# When: no slug is provided -# Then: the message is returned -@pytest.mark.parametrize("extra", [{}, {"silent": False}, {"silent": None}]) -@pytest.mark.parametrize("env", ["test", "dev", "prod", "qa", "staging", "development", "production", ""]) -def test_payment_exception__no_slug(fake, context, set_env, env, extra): - set_env(env) - - message = fake.sentence() - extra = extra.copy() - - exc = PaymentException(message, **extra) - - res = exception_handler(exc, context) - - expected = { - "detail": message, - "status_code": 402, - } - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status.HTTP_402_PAYMENT_REQUIRED - - -# When: a slug is provided and the env is test -# Then: the slug is returned -@pytest.mark.parametrize("with_data", [True, False]) -@pytest.mark.parametrize("with_queryset", [True, False]) -@pytest.mark.parametrize("extra", [{}, {"silent": False}, {"silent": None}]) -def test_payment_exception__test_env__use_the_slug( - fake, context, set_env, extra, get_kwargs, with_data, get_queryset, with_queryset -): - set_env("test") - - slug = fake.slug() - message = fake.sentence() - extra = extra.copy() - - if with_data: - data = get_kwargs(5) - extra["data"] = data - - if with_queryset: - queryset = get_queryset(5) - extra["queryset"] = queryset - - exc = PaymentException(message, slug=slug, **extra) - res = exception_handler(exc, context) - - expected = { - "detail": slug, - "status_code": 402, - } - - if with_data: - expected["data"] = data - - if with_queryset: - expected["items"] = [ - { - "pk": x.id, - "slug": x.slug, - "name": x.name, - } - for x in queryset - ] - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status.HTTP_402_PAYMENT_REQUIRED - - -# When: a slug is provided and the env is not test -# Then: the message is returned -@pytest.mark.parametrize("extra", [{}, {"silent": False}, {"silent": None}]) -@pytest.mark.parametrize("env", ["dev", "prod", "qa", "staging", "development", "production", ""]) -def test_payment_exception__anything_but_test_env__does_not_use_the_slug(fake, context, set_env, env, extra): - set_env(env) - - slug = fake.slug() - message = fake.sentence() - - exc = PaymentException(message, slug=slug, **extra) - res = exception_handler(exc, context) - - expected = { - "detail": message, - "status_code": 402, - } - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status.HTTP_402_PAYMENT_REQUIRED - - -# When: a slug and silent=True is provided and the env is not test -# Then: the message is returned -@pytest.mark.parametrize("env", ["dev", "prod", "qa", "staging", "development", "production", ""]) -def test_payment_exception__anything_but_test_env__silent_code(fake, context, set_env, env): - set_env(env) - - slug = fake.slug() - message = fake.sentence() - - exc = PaymentException(message, slug=slug, silent=True) - res = exception_handler(exc, context) - - assert isinstance(res, Response) - assert res.data == { - "detail": message, - "silent": True, - "silent_code": slug, - "status_code": 402, - } - assert res.status_code == status.HTTP_402_PAYMENT_REQUIRED - - -# When: a slug and silent=True is provided and the env is test -# Then: the message is returned -def test_payment_exception__test_env__silent_code(fake, context, set_env): - set_env("test") - - slug = fake.slug() - message = fake.sentence() - - exc = PaymentException(message, slug=slug, silent=True) - res = exception_handler(exc, context) - - assert isinstance(res, Response) - assert res.data == { - "detail": slug, - "silent": True, - "silent_code": slug, - "status_code": 402, - } - assert res.status_code == status.HTTP_402_PAYMENT_REQUIRED - - -# When: a slug and silent=True is provided and the env is test with multiple errors -# Then: it returns each error -def test_payment_exception__test_env__multiple_errors(fake, context, set_env, get_kwargs, get_queryset): - set_env("test") - - slugs = [fake.slug() for _ in range(3)] - messages = [fake.sentence() for _ in range(5)] - data = get_kwargs(5) - queryset = get_queryset(5) - - errors = [ - C(messages[0]), - C(messages[1], silent=True), - C(messages[2], slug=slugs[0], silent=True), - C(messages[3], slug=slugs[1], data=data), - C(messages[4], slug=slugs[2], queryset=queryset), - ] - - exc = PaymentException(errors) - res = exception_handler(exc, context) - - expected = [ - {"detail": messages[0], "status_code": 402}, - {"detail": messages[1], "silent": True, "silent_code": "undefined", "status_code": 402}, - {"detail": slugs[0], "silent": True, "silent_code": slugs[0], "status_code": 402}, - {"data": data, "detail": slugs[1], "status_code": 402}, - { - "detail": slugs[2], - "items": [ - { - "pk": x.id, - "slug": x.slug, - "name": x.name, - } - for x in queryset - ], - "status_code": 402, - }, - ] - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status.HTTP_402_PAYMENT_REQUIRED - - -# When: no slug is provided -# Then: the message is returned -@pytest.mark.parametrize("extra", [{}, {"silent": False}, {"silent": None}]) -@pytest.mark.parametrize("env", ["test", "dev", "prod", "qa", "staging", "development", "production", ""]) -def test_validation_exception__no_slug(fake, context, set_env, env, extra): - set_env(env) - - message = fake.sentence() - extra = extra.copy() - status_code = get_status_code() - - exc = ValidationException(message, code=status_code, **extra) - - res = exception_handler(exc, context) - - expected = { - "detail": message, - "status_code": status_code, - } - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status_code - - -# When: a slug is provided and the env is test -# Then: the slug is returned -@pytest.mark.parametrize("with_data", [True, False]) -@pytest.mark.parametrize("with_queryset", [True, False]) -@pytest.mark.parametrize("extra", [{}, {"silent": False}, {"silent": None}]) -def test_validation_exception__test_env__use_the_slug( - fake, context, set_env, extra, get_kwargs, with_data, get_queryset, with_queryset -): - set_env("test") - - slug = fake.slug() - message = fake.sentence() - extra = extra.copy() - status_code = get_status_code() - - if with_data: - data = get_kwargs(5) - extra["data"] = data - - if with_queryset: - queryset = get_queryset(5) - extra["queryset"] = queryset - - exc = ValidationException(message, slug=slug, code=status_code, **extra) - res = exception_handler(exc, context) - - expected = { - "detail": slug, - "status_code": status_code, - } - - if with_data: - expected["data"] = data - - if with_queryset: - expected["items"] = [ - { - "pk": x.id, - "slug": x.slug, - "name": x.name, - } - for x in queryset - ] - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status_code - - -# When: a slug is provided and the env is not test -# Then: the message is returned -@pytest.mark.parametrize("extra", [{}, {"silent": False}, {"silent": None}]) -@pytest.mark.parametrize("env", ["dev", "prod", "qa", "staging", "development", "production", ""]) -def test_validation_exception__anything_but_test_env__does_not_use_the_slug(fake, context, set_env, env, extra): - set_env(env) - - slug = fake.slug() - message = fake.sentence() - status_code = get_status_code() - - exc = ValidationException(message, slug=slug, code=status_code, **extra) - res = exception_handler(exc, context) - - expected = { - "detail": message, - "status_code": status_code, - } - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status_code - - -# When: a slug and silent=True is provided and the env is not test -# Then: the message is returned -@pytest.mark.parametrize("env", ["dev", "prod", "qa", "staging", "development", "production", ""]) -def test_validation_exception__anything_but_test_env__silent_code(fake, context, set_env, env): - set_env(env) - - slug = fake.slug() - message = fake.sentence() - status_code = get_status_code() - - exc = ValidationException(message, slug=slug, code=status_code, silent=True) - res = exception_handler(exc, context) - - assert isinstance(res, Response) - assert res.data == { - "detail": message, - "silent": True, - "silent_code": slug, - "status_code": status_code, - } - assert res.status_code == status_code - - -# When: a slug and silent=True is provided and the env is test -# Then: the message is returned -def test_validation_exception__test_env__silent_code(fake, context, set_env): - set_env("test") - - slug = fake.slug() - message = fake.sentence() - status_code = get_status_code() - - exc = ValidationException(message, slug=slug, code=status_code, silent=True) - res = exception_handler(exc, context) - - assert isinstance(res, Response) - assert res.data == { - "detail": slug, - "silent": True, - "silent_code": slug, - "status_code": status_code, - } - assert res.status_code == status_code - - -# When: a slug and silent=True is provided and the env is test with multiple errors, any error -# Then: it returns each error -def test_validation_exception__test_env__any_status_code__multiple_errors( - fake, context, set_env, get_kwargs, get_queryset -): - set_env("test") - - slugs = [fake.slug() for _ in range(3)] - messages = [fake.sentence() for _ in range(5)] - status_codes = [get_status_code() for _ in range(4)] - data = get_kwargs(5) - queryset = get_queryset(5) - - status_code = get_status_code() - - errors = [ - C(messages[0]), - C(messages[1], code=status_codes[0], silent=True), - C(messages[2], slug=slugs[0], code=status_codes[1], silent=True), - C(messages[3], slug=slugs[1], code=status_codes[2], data=data), - C(messages[4], slug=slugs[2], code=status_codes[3], queryset=queryset), - ] - - exc = ValidationException(errors, code=status_code) - res = exception_handler(exc, context) - - expected = [ - { - "detail": messages[0], - "status_code": status_code, - }, - { - "detail": messages[1], - "silent": True, - "silent_code": "undefined", - "status_code": status_code, - }, - { - "detail": slugs[0], - "silent": True, - "silent_code": slugs[0], - "status_code": status_code, - }, - { - "data": data, - "detail": slugs[1], - "status_code": status_code, - }, - { - "detail": slugs[2], - "items": [ - { - "pk": x.id, - "slug": x.slug, - "name": x.name, - } - for x in queryset - ], - "status_code": status_code, - }, - ] - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == status_code - - -# When: a slug and silent=True is provided and the env is test with multiple errors, 207 -# Then: it returns each error -def test_validation_exception__test_env__207__multiple_errors(fake, context, set_env, get_kwargs, get_queryset): - set_env("test") - - slugs = [fake.slug() for _ in range(3)] - messages = [fake.sentence() for _ in range(5)] - status_codes = [get_status_code() for _ in range(4)] - data = get_kwargs(5) - queryset = get_queryset(5) - - errors = [ - C(messages[0]), - C(messages[1], code=status_codes[0], silent=True), - C(messages[2], slug=slugs[0], code=status_codes[1], silent=True), - C(messages[3], slug=slugs[1], code=status_codes[2], data=data), - C(messages[4], slug=slugs[2], code=status_codes[3], queryset=queryset), - ] - - exc = ValidationException(errors, code=207) - res = exception_handler(exc, context) - - expected = [ - { - "detail": messages[0], - "status_code": 400, - }, - { - "detail": messages[1], - "silent": True, - "silent_code": "undefined", - "status_code": status_codes[0], - }, - { - "detail": slugs[0], - "silent": True, - "silent_code": slugs[0], - "status_code": status_codes[1], - }, - { - "data": data, - "detail": slugs[1], - "status_code": status_codes[2], - }, - { - "detail": slugs[2], - "items": [ - { - "pk": x.id, - "slug": x.slug, - "name": x.name, - } - for x in queryset - ], - "status_code": status_codes[3], - }, - ] - - assert isinstance(res, Response) - assert res.data == expected - assert res.status_code == 207 From ab2350db29362076c259327ababfe33836948e1b Mon Sep 17 00:00:00 2001 From: gustavomm19 Date: Wed, 4 Sep 2024 17:32:29 +0000 Subject: [PATCH 10/25] add task and endpoint to sync all users in a cohort --- breathecode/assignments/tasks.py | 60 ++++++ .../tasks/tests_sync_cohort_user_tasks.py | 180 ++++++++++++++++++ .../tests/urls/tests_sync_cohort_tasks.py | 100 ++++++++++ breathecode/assignments/urls.py | 2 + breathecode/assignments/views.py | 35 ++++ 5 files changed, 377 insertions(+) create mode 100644 breathecode/assignments/tests/tasks/tests_sync_cohort_user_tasks.py create mode 100644 breathecode/assignments/tests/urls/tests_sync_cohort_tasks.py diff --git a/breathecode/assignments/tasks.py b/breathecode/assignments/tasks.py index 2f6c68e22..7cf9040cf 100644 --- a/breathecode/assignments/tasks.py +++ b/breathecode/assignments/tasks.py @@ -190,3 +190,63 @@ def serialize_task(task): logger.error(str(e)) logger.info("History log saved") + + +@shared_task(bind=False, priority=TaskPriority.ACADEMY.value) +def sync_cohort_user_tasks(cohort_user_id: int): + logger.info(f"Executing sync_cohort_user_tasks for cohort user {cohort_user_id}") + cohort_user = CohortUser.objects.filter(id=cohort_user_id).first() + + if not cohort_user: + logger.error("Cohort user not found") + return + + cohort = cohort_user.cohort + syllabus_json = cohort.syllabus_version.json + + all_cohort_tasks = [] + + def parse_task(type, assignment): + return { + "task_type": type, + "cohort": cohort.id, + "user": cohort_user.user.id, + "associated_slug": assignment["slug"], + "title": assignment["title"], + } + + for day in syllabus_json["days"]: + + readings = day["lessons"] if "lessons" in day else [] + replits = day["replits"] if "replits" in day else [] + assignments = day["assignments"] if "assignments" in day else [] + answers = day["quizzes"] if "quizzes" in day else [] + + for r in readings: + all_cohort_tasks.append(parse_task("LESSON", r)) + + for r in replits: + all_cohort_tasks.append(parse_task("EXERCISE", r)) + + for r in assignments: + all_cohort_tasks.append(parse_task("PROJECT", r)) + + for r in answers: + all_cohort_tasks.append(parse_task("QUIZ", r)) + + for task in all_cohort_tasks: + user_task = Task.objects.filter( + user=cohort_user.user, cohort=cohort, associated_slug=task["associated_slug"], task_type=task["task_type"] + ).first() + + if user_task is None: + user_task = Task( + user=cohort_user.user, + cohort=cohort, + associated_slug=task["associated_slug"], + title=task["title"], + task_type=task["task_type"], + ) + user_task.save() + + logger.info(f"Cohort User {cohort_user_id} synced successfully") diff --git a/breathecode/assignments/tests/tasks/tests_sync_cohort_user_tasks.py b/breathecode/assignments/tests/tasks/tests_sync_cohort_user_tasks.py new file mode 100644 index 000000000..81bb08132 --- /dev/null +++ b/breathecode/assignments/tests/tasks/tests_sync_cohort_user_tasks.py @@ -0,0 +1,180 @@ +""" +Test sync_cohort_user_tasks +""" + +from unittest.mock import MagicMock, call, patch + + +from ...tasks import sync_cohort_user_tasks +from ..mixins import AssignmentsTestCase + + +def serialize_task(data={}): + return { + "id": 1, + "associated_slug": "intro-to-prework", + "title": "Introduction to the pre-work", + "user_id": 1, + "cohort_id": 1, + "delivered_at": None, + "description": "", + "github_url": None, + "live_url": None, + "opened_at": None, + "revision_status": "PENDING", + "rigobot_repository_id": None, + "subtasks": None, + "task_status": "PENDING", + "task_type": "LESSON", + "telemetry_id": None, + **data, + } + + +class MediaTestSuite(AssignmentsTestCase): + """Test sync_cohort_user_tasks""" + + """ + 🔽🔽🔽 Without Cohort User + """ + + @patch("logging.Logger.info", MagicMock()) + @patch("logging.Logger.error", MagicMock()) + def test__sync_cohort_user_not_found(self): + from logging import Logger + + sync_cohort_user_tasks.delay(1) + + self.assertEqual(self.bc.database.list_of("assignments.Task"), []) + self.assertEqual(Logger.info.call_args_list, [call("Executing sync_cohort_user_tasks for cohort user 1")]) + self.assertEqual(Logger.error.call_args_list, [call("Cohort user not found")]) + + @patch("logging.Logger.info", MagicMock()) + def test__sync_cohort_user(self): + from logging import Logger + + syllabus_json = { + "days": [ + { + "lessons": [ + { + "slug": "megadeth", + "title": "Megadeth", + } + ], + "replits": [ + { + "slug": "metallica", + "title": "Metallica", + } + ], + "assignments": [ + { + "slug": "anthrax", + "title": "Anthrax", + } + ], + "quizzes": [ + { + "slug": "slayer", + "title": "Slayer", + } + ], + } + ], + } + model_syllabus = self.bc.database.create(syllabus_version={"json": syllabus_json}) + model = self.bc.database.create(cohort={"syllabus_version": model_syllabus["syllabus_version"]}, cohort_user=1) + + # Resetting to avoid logging from the models signals + Logger.info.call_args_list = [] + + sync_cohort_user_tasks.delay(1) + + self.assertEqual( + self.bc.database.list_of("assignments.Task"), + [ + serialize_task(data={"associated_slug": "megadeth", "title": "Megadeth"}), + serialize_task( + data={"associated_slug": "metallica", "title": "Metallica", "id": 2, "task_type": "EXERCISE"} + ), + serialize_task( + data={"associated_slug": "anthrax", "title": "Anthrax", "id": 3, "task_type": "PROJECT"} + ), + serialize_task(data={"associated_slug": "slayer", "title": "Slayer", "id": 4, "task_type": "QUIZ"}), + ], + ) + self.assertEqual( + Logger.info.call_args_list, + [ + call("Executing sync_cohort_user_tasks for cohort user 1"), + call("Cohort User 1 synced successfully"), + ], + ) + + @patch("logging.Logger.info", MagicMock()) + def test__sync_cohort_user_with_previous_tasks(self): + from logging import Logger + + syllabus_json = { + "days": [ + { + "lessons": [ + { + "slug": "megadeth", + "title": "Megadeth", + } + ], + "replits": [ + { + "slug": "metallica", + "title": "Metallica", + } + ], + "assignments": [ + { + "slug": "anthrax", + "title": "Anthrax", + } + ], + "quizzes": [ + { + "slug": "slayer", + "title": "Slayer", + } + ], + } + ], + } + model_syllabus = self.bc.database.create(syllabus_version={"json": syllabus_json}) + model = self.bc.database.create( + cohort={"syllabus_version": model_syllabus["syllabus_version"]}, + cohort_user=1, + task={"associated_slug": "megadeth", "task_type": "LESSON", "title": "Megadeth"}, + ) + + # Resetting to avoid logging from the models signals + Logger.info.call_args_list = [] + + sync_cohort_user_tasks.delay(1) + + self.assertEqual( + self.bc.database.list_of("assignments.Task"), + [ + self.bc.format.to_dict(model.task), + serialize_task( + data={"associated_slug": "metallica", "title": "Metallica", "id": 2, "task_type": "EXERCISE"} + ), + serialize_task( + data={"associated_slug": "anthrax", "title": "Anthrax", "id": 3, "task_type": "PROJECT"} + ), + serialize_task(data={"associated_slug": "slayer", "title": "Slayer", "id": 4, "task_type": "QUIZ"}), + ], + ) + self.assertEqual( + Logger.info.call_args_list, + [ + call("Executing sync_cohort_user_tasks for cohort user 1"), + call("Cohort User 1 synced successfully"), + ], + ) diff --git a/breathecode/assignments/tests/urls/tests_sync_cohort_tasks.py b/breathecode/assignments/tests/urls/tests_sync_cohort_tasks.py new file mode 100644 index 000000000..f4bd01ff0 --- /dev/null +++ b/breathecode/assignments/tests/urls/tests_sync_cohort_tasks.py @@ -0,0 +1,100 @@ +""" +Test /answer +""" + +from unittest.mock import MagicMock, call, patch + +import pytest +from django.urls.base import reverse_lazy +from rest_framework import status + +from breathecode.assignments import tasks + +from ..mixins import AssignmentsTestCase + + +@pytest.fixture(autouse=True) +def setup(db, monkeypatch): + monkeypatch.setattr(tasks.sync_cohort_user_tasks, "delay", MagicMock()) + yield + + +class MediaTestSuite(AssignmentsTestCase): + """Test /answer""" + + """ + 🔽🔽🔽 Auth + """ + + def test_sync_cohort_tasks__without_auth(self): + url = reverse_lazy("assignments:sync_cohort_tasks", kwargs={"cohort_id": 1}) + response = self.client.get(url) + + json = response.json() + expected = {"detail": "Authentication credentials were not provided.", "status_code": 401} + + self.assertEqual(json, expected) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + self.bc.check.calls(tasks.sync_cohort_user_tasks.delay.call_args_list, []) + + def test_sync_cohort_tasks__without_capability(self): + model = self.bc.database.create(user=1) + self.client.force_authenticate(model.user) + + url = reverse_lazy("assignments:sync_cohort_tasks", kwargs={"cohort_id": 1}) + response = self.client.get(url, headers={"academy": 1}) + + json = response.json() + expected = { + "detail": "You (user: 1) don't have this capability: crud_assignment for academy 1", + "status_code": 403, + } + + self.assertEqual(json, expected) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.bc.check.calls(tasks.sync_cohort_user_tasks.delay.call_args_list, []) + + def test_sync_cohort_tasks__with_no_cohort(self): + + model = self.bc.database.create(profile_academy=1, role=1, capability="crud_assignment") + self.client.force_authenticate(model.user) + + url = reverse_lazy("assignments:sync_cohort_tasks", kwargs={"cohort_id": 2}) + response = self.client.get(url, headers={"academy": 1}) + + json = response.json() + expected = {"detail": "cohort-not-found", "status_code": 404} + + self.assertEqual(json, expected) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(tasks.sync_cohort_user_tasks.delay.call_args_list, []) + + def test_sync_cohort_tasks__with_one_cohort_user(self): + + model = self.bc.database.create(profile_academy=1, role=1, capability="crud_assignment", cohort_user=1) + self.client.force_authenticate(model.user) + + url = reverse_lazy("assignments:sync_cohort_tasks", kwargs={"cohort_id": 1}) + response = self.client.get(url, headers={"academy": 1}) + + json = response.json() + expected = {"message": "tasks-syncing"} + + self.assertEqual(json, expected) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(tasks.sync_cohort_user_tasks.delay.call_args_list, [call(1)]) + + def test_sync_cohort_tasks__with_many_cohort_users(self): + + model = self.bc.database.create(profile_academy=1, role=1, capability="crud_assignment", cohort_user=3) + self.client.force_authenticate(model.user) + + url = reverse_lazy("assignments:sync_cohort_tasks", kwargs={"cohort_id": 1}) + response = self.client.get(url, headers={"academy": 1}) + + json = response.json() + expected = {"message": "tasks-syncing"} + + self.assertEqual(json, expected) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(tasks.sync_cohort_user_tasks.delay.call_args_list, [call(1), call(2), call(3)]) diff --git a/breathecode/assignments/urls.py b/breathecode/assignments/urls.py index 58f45bd11..8b4dc92c5 100644 --- a/breathecode/assignments/urls.py +++ b/breathecode/assignments/urls.py @@ -18,6 +18,7 @@ sync_cohort_tasks_view, AssignmentTelemetryView, FinalProjectCohortView, + SyncTasksView, ) app_name = "assignments" @@ -65,6 +66,7 @@ FinalProjectCohortView.as_view(), name="final_project_cohort_update", ), + path("academy/cohort//synctasks", SyncTasksView.as_view(), name="sync_cohort_tasks"), path("academy/user//task", TaskMeView.as_view(), name="academy_user_id_task"), path("task//deliver/", deliver_assignment_view, name="task_id_deliver_token"), path("task//deliver", TaskMeDeliverView.as_view(), name="task_id_deliver"), diff --git a/breathecode/assignments/views.py b/breathecode/assignments/views.py index 758a128dd..6c92e7c7c 100644 --- a/breathecode/assignments/views.py +++ b/breathecode/assignments/views.py @@ -436,6 +436,41 @@ def put(self, request, academy_id, cohort_id, final_project_id): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +class SyncTasksView(APIView, GenerateLookupsMixin): + + @capable_of("crud_assignment") + def get(self, request, cohort_id, academy_id): + + lang = get_user_language(request) + + cohort = Cohort.objects.filter(id=cohort_id).first() + + if cohort is None: + raise ValidationException( + translation( + lang, + en=f"Cohort {cohort_id} not found", + es=f"Cohorte {cohort_id} no encontrada", + slug="cohort-not-found", + ), + code=404, + ) + + students = CohortUser.objects.filter(cohort=cohort, role="STUDENT") + + for student in students: + tasks.sync_cohort_user_tasks.delay(student.id) + + message = translation( + lang, + en="Tasks syncronization initiated successfully. This should take a few minutes", + es="La sincronización de las actividades inició exitosamente. Esto debería demorar unos minutos", + slug="tasks-syncing", + ) + + return Response({"message": message}, status=status.HTTP_200_OK) + + class CohortTaskView(APIView, GenerateLookupsMixin): extensions = APIViewExtensions(cache=TaskCache, sort="-created_at", paginate=True) From 5fffa6a9787c08509d1e11b92611564494e82514 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Wed, 4 Sep 2024 19:55:17 -0500 Subject: [PATCH 11/25] add docs --- Pipfile | 1 + Pipfile.lock | 494 ++++++++---------- breathecode/authenticate/models.py | 17 +- .../services/google_meet/google_meet.py | 39 +- breathecode/settings.py | 4 +- .../django-rest-framework/serializers.md | 10 +- .../{parametrize-tests.md => parametrize.md} | 0 docs/testing/runing-tests.md | 33 -- docs/testing/running-tests.md | 38 ++ docs/workflows/file-uploading.md | 117 +++++ mkdocs.yml | 5 +- 11 files changed, 452 insertions(+), 306 deletions(-) rename docs/testing/{parametrize-tests.md => parametrize.md} (100%) delete mode 100644 docs/testing/runing-tests.md create mode 100644 docs/testing/running-tests.md create mode 100644 docs/workflows/file-uploading.md diff --git a/Pipfile b/Pipfile index cdecf1bed..48a28bda7 100644 --- a/Pipfile +++ b/Pipfile @@ -146,3 +146,4 @@ google-apps-meet = "*" google-auth-httplib2 = "*" google-auth-oauthlib = "*" capy-core = {extras = ["django"], version = "*"} +google-api-python-client = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 5f63fbcca..332d05f11 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "41578d92f01093c438b9e0dfe6c185b583d814b0998eb581b01c9d12b83e2263" + "sha256": "5ab16307b216465a63886089f3095dcb4fba23930609a2496bde8904e46838a0" }, "pipfile-spec": 6, "requires": {}, @@ -668,37 +668,37 @@ }, "cryptography": { "hashes": [ - "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", - "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069", - "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2", - "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", - "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", - "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", - "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", - "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", - "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", - "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", - "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", - "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", - "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947", - "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", - "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", - "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", - "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", - "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", - "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", - "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", - "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", - "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", - "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", - "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1", - "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", - "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", - "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0" + "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", + "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", + "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", + "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", + "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", + "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", + "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", + "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", + "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", + "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", + "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", + "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", + "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2", + "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", + "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", + "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365", + "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96", + "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", + "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", + "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d", + "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", + "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", + "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", + "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172", + "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034", + "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", + "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==43.0.0" + "version": "==43.0.1" }, "cssselect": { "hashes": [ @@ -768,12 +768,12 @@ }, "django": { "hashes": [ - "sha256:848a5980e8efb76eea70872fb0e4bc5e371619c70fffbe48e3e1b50b2c09455d", - "sha256:d3b811bf5371a26def053d7ee42a9df1267ef7622323fe70a601936725aa4557" + "sha256:021ffb7fdab3d2d388bc8c7c2434eb9c1f6f4d09e6119010bbb1694dda286bc2", + "sha256:71603f27dac22a6533fb38d83072eea9ddb4017fead6f67f2562a40402d61c3f" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==5.1" + "version": "==5.1.1" }, "django-appconf": { "hashes": [ @@ -1082,6 +1082,15 @@ "markers": "python_version >= '3.7'", "version": "==2.19.2" }, + "google-api-python-client": { + "hashes": [ + "sha256:6a75441f9078e6e2fcdf4946a153fda1e2cc81b5e9c8d6e8c0750c85c7f8a566", + "sha256:d5654134522b9b574b82234e96f7e0aeeabcbf33643fbabcd449ef0068e3a476" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.143.0" + }, "google-apps-meet": { "hashes": [ "sha256:36e600f61a8bf0cccee6a3c3c0e77736f46da39ccd7bcbf76162971961739d8d", @@ -1160,12 +1169,12 @@ }, "google-cloud-ndb": { "hashes": [ - "sha256:3d6c8866681dc280ad9f90a6f5b556d324e4b29173d0b63ddf6b8e19655fec1a", - "sha256:a6a2f6c58bd14febb92c0e569ca6a4e1d14c4a70935c28f3681e33c67402428f" + "sha256:a865583a0dc0325f429a18567f06876ad888110a67087b5e98839aa011ac4af0", + "sha256:aa00da7149ba181bc99c0f6e73745a17c2137ee367cb291448ea3988b1347832" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.3.1" + "version": "==2.3.2" }, "google-cloud-recaptcha-enterprise": { "hashes": [ @@ -1187,77 +1196,36 @@ }, "google-crc32c": { "hashes": [ - "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a", - "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876", - "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c", - "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289", - "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298", - "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02", - "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f", - "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2", - "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a", - "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb", - "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210", - "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5", - "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee", - "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c", - "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a", - "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314", - "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd", - "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65", - "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37", - "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4", - "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13", - "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894", - "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31", - "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e", - "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709", - "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740", - "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc", - "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d", - "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c", - "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c", - "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d", - "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906", - "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61", - "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57", - "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c", - "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a", - "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438", - "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946", - "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7", - "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96", - "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091", - "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae", - "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d", - "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88", - "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2", - "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd", - "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541", - "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728", - "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178", - "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968", - "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346", - "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8", - "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93", - "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7", - "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273", - "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462", - "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94", - "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd", - "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e", - "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57", - "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b", - "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9", - "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a", - "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100", - "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325", - "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183", - "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556", - "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4" + "sha256:05e2d8c9a2f853ff116db9706b4a27350587f341eda835f46db3c0a8c8ce2f24", + "sha256:18e311c64008f1f1379158158bb3f0c8d72635b9eb4f9545f8cf990c5668e59d", + "sha256:236c87a46cdf06384f614e9092b82c05f81bd34b80248021f729396a78e55d7e", + "sha256:35834855408429cecf495cac67ccbab802de269e948e27478b1e47dfb6465e57", + "sha256:386122eeaaa76951a8196310432c5b0ef3b53590ef4c317ec7588ec554fec5d2", + "sha256:40b05ab32a5067525670880eb5d169529089a26fe35dce8891127aeddc1950e8", + "sha256:48abd62ca76a2cbe034542ed1b6aee851b6f28aaca4e6551b5599b6f3ef175cc", + "sha256:50cf2a96da226dcbff8671233ecf37bf6e95de98b2a2ebadbfdf455e6d05df42", + "sha256:51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f", + "sha256:5bcc90b34df28a4b38653c36bb5ada35671ad105c99cfe915fb5bed7ad6924aa", + "sha256:62f6d4a29fea082ac4a3c9be5e415218255cf11684ac6ef5488eea0c9132689b", + "sha256:6eceb6ad197656a1ff49ebfbbfa870678c75be4344feb35ac1edf694309413dc", + "sha256:7aec8e88a3583515f9e0957fe4f5f6d8d4997e36d0f61624e70469771584c760", + "sha256:91ca8145b060679ec9176e6de4f89b07363d6805bd4760631ef254905503598d", + "sha256:a184243544811e4a50d345838a883733461e67578959ac59964e43cca2c791e7", + "sha256:a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d", + "sha256:bb0966e1c50d0ef5bc743312cc730b533491d60585a9a08f897274e57c3f70e0", + "sha256:bb8b3c75bd157010459b15222c3fd30577042a7060e29d42dabce449c087f2b3", + "sha256:bd5e7d2445d1a958c266bfa5d04c39932dc54093fa391736dbfdb0f1929c1fb3", + "sha256:c87d98c7c4a69066fd31701c4e10d178a648c2cac3452e62c6b24dc51f9fcc00", + "sha256:d2952396dc604544ea7476b33fe87faedc24d666fb0c2d5ac971a2b9576ab871", + "sha256:d8797406499f28b5ef791f339594b0b5fdedf54e203b5066675c406ba69d705c", + "sha256:d9e9913f7bd69e093b81da4535ce27af842e7bf371cde42d1ae9e9bd382dc0e9", + "sha256:e2806553238cd076f0a55bddab37a532b53580e699ed8e5606d0de1f856b5205", + "sha256:ebab974b1687509e5c973b5c4b8b146683e101e102e17a86bd196ecaa4d099fc", + "sha256:ed767bf4ba90104c1216b68111613f0d5926fb3780660ea1198fc469af410e9d", + "sha256:f7a1fc29803712f80879b0806cb83ab24ce62fc8daf0569f2204a0cfd7f68ed4" ], - "markers": "python_version >= '3.7'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, "google-resumable-media": { "hashes": [ @@ -1375,7 +1343,7 @@ "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], - "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "markers": "python_version >= '3.11' and platform_python_implementation == 'CPython'", "version": "==3.0.3" }, "grpcio": { @@ -2300,62 +2268,63 @@ }, "numpy": { "hashes": [ - "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", - "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", - "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", - "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", - "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", - "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", - "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", - "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", - "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", - "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", - "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", - "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", - "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", - "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", - "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", - "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", - "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", - "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", - "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", - "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", - "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", - "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", - "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", - "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", - "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", - "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", - "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", - "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", - "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", - "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", - "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", - "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", - "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", - "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", - "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", - "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", - "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", - "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", - "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", - "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", - "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", - "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", - "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", - "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", - "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", - "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", - "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", - "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", - "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", - "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", - "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", - "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.0" + "version": "==2.1.1" }, "oauthlib": { "hashes": [ @@ -3422,11 +3391,11 @@ }, "setuptools": { "hashes": [ - "sha256:bea195a800f510ba3a2bc65645c88b7e016fe36709fefc58a880c4ae8a0138d7", - "sha256:cee604bd76cc092355a4e43ec17aee5369095974f41f088676724dc6bc2c9ef8" + "sha256:2353af060c06388be1cecbf5953dcdb1f38362f87a2356c480b6b4d5fcfc8847", + "sha256:fc91b5f89e392ef5b77fe143b17e32f65d3024744fba66dc3afe07201684d766" ], "markers": "python_version >= '3.8'", - "version": "==74.1.0" + "version": "==74.1.1" }, "six": { "hashes": [ @@ -3871,7 +3840,15 @@ "markers": "python_version >= '3.8'", "version": "==1.9.7" }, - "zope-interface": { + "zope.event": { + "hashes": [ + "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", + "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd" + ], + "markers": "python_version >= '3.7'", + "version": "==5.0" + }, + "zope.interface": { "hashes": [ "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1", @@ -3911,14 +3888,6 @@ "markers": "python_version >= '3.8'", "version": "==7.0.3" }, - "zope.event": { - "hashes": [ - "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", - "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd" - ], - "markers": "python_version >= '3.7'", - "version": "==5.0" - }, "zstandard": { "hashes": [ "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", @@ -4535,7 +4504,7 @@ "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], - "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "markers": "python_version >= '3.11' and platform_python_implementation == 'CPython'", "version": "==3.0.3" }, "griffe": { @@ -4789,12 +4758,12 @@ }, "mkdocstrings-python": { "hashes": [ - "sha256:cbe98710a6757dfd4dff79bf36cb9731908fb4c69dd2736b15270ae7a488243d", - "sha256:f344aaa47e727d8a2dc911e063025e58e2b7fb31a41110ccc3902aa6be7ca196" + "sha256:8824b115c5359304ab0b5378a91f6202324a849e1da907a3485b59208b797322", + "sha256:a21a1c05acef129a618517bb5aae3e33114f569b11588b1e7af3e9d4061a71af" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.10.9" + "version": "==1.11.1" }, "mypy-extensions": { "hashes": [ @@ -4814,62 +4783,63 @@ }, "numpy": { "hashes": [ - "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", - "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", - "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", - "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", - "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", - "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", - "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", - "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", - "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", - "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", - "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", - "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", - "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", - "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", - "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", - "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", - "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", - "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", - "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", - "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", - "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", - "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", - "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", - "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", - "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", - "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", - "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", - "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", - "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", - "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", - "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", - "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", - "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", - "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", - "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", - "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", - "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", - "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", - "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", - "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", - "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", - "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", - "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", - "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", - "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", - "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", - "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", - "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", - "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", - "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", - "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", - "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.0" + "version": "==2.1.1" }, "oauthlib": { "hashes": [ @@ -5352,11 +5322,11 @@ }, "setuptools": { "hashes": [ - "sha256:bea195a800f510ba3a2bc65645c88b7e016fe36709fefc58a880c4ae8a0138d7", - "sha256:cee604bd76cc092355a4e43ec17aee5369095974f41f088676724dc6bc2c9ef8" + "sha256:2353af060c06388be1cecbf5953dcdb1f38362f87a2356c480b6b4d5fcfc8847", + "sha256:fc91b5f89e392ef5b77fe143b17e32f65d3024744fba66dc3afe07201684d766" ], "markers": "python_version >= '3.8'", - "version": "==74.1.0" + "version": "==74.1.1" }, "six": { "hashes": [ @@ -5391,39 +5361,39 @@ }, "watchdog": { "hashes": [ - "sha256:1e8ca9b7f5f03d2f0556a43db1e9adf1e5af6adf52e0890f781324514b67a612", - "sha256:20a28c8b0b3edf4ea2b27fb3527fc0a348e983f22a4317d316bb561524391932", - "sha256:2b8cd627b76194e725ed6f48d9524b1ad93a51a0dc3bd0225c56023716245091", - "sha256:39e828c4270452b966bc9d814911a3c7e24c62d726d2a3245f5841664ff56b5e", - "sha256:39f0de161a822402f0f00c68b82349a4d71c9814e749148ca2b083a25606dbf9", - "sha256:4eaebff2f938f5325788cef26521891b2d8ecc8e7852aa123a9b458815f93875", - "sha256:5541a8765c4090decb4dba55d3dceb57724748a717ceaba8dc4f213edb0026e0", - "sha256:59ec6111f3750772badae3403ef17263489ed6f27ac01ec50c0244b2afa258fb", - "sha256:664917cd513538728875a42d5654584b533da88cf06680452c98e73b45466968", - "sha256:6bb68d9adb9c45f0dc1c2b12f4fb6eab0463a8f9741e371e4ede6769064e0785", - "sha256:6fbb4dd5ace074a2969825fde10034b35b31efcb6973defb22eb945b1d3acc37", - "sha256:70e30116849f4ec52240eb1fad83d27e525eae179bfe1c09b3bf120163d731b6", - "sha256:72dbdffe4aa0c36c59f4a5190bceeb7fdfdf849ab98a562b3a783a64cc6dacdd", - "sha256:753c6a4c1eea9d3b96cd58159b49103e66cb288216a414ab9ad234ccc7642ec2", - "sha256:763c6f82bb65504b47d4aea268462b2fb662676676356e04787f332a11f03eb0", - "sha256:8ba1472b5fa7c644e49641f70d7ccc567f70b54d776defa5d6f755dc2edc3fbb", - "sha256:9b1b32f89f95162f09aea6e15d9384f6e0490152f10d7ed241f8a85cddc50658", - "sha256:a03a6ccb846ead406a25a0b702d0a6b88fdfa77becaf907cfcfce7737ebbda1f", - "sha256:a1cd7c919940b15f253db8279a579fb81e4e4e434b39b11a1cb7f54fe3fa46a6", - "sha256:a6b8c6c82ada78479a0df568d27d69aa07105aba9301ac66d1ae162645f4ba34", - "sha256:a791dfc050ed24b82f7f100ae794192594fe863a7e9bdafcdfa5c6e405a981e5", - "sha256:b21e6601efe8453514c2fc21aca57fb5413c3d8b157bfe520b05b57b1788a167", - "sha256:b2d56425dfa0c1e6f8a510f21d3d54ef7fe50bbc29638943c2cb1394b7b49156", - "sha256:c4ae0b3e95455fa9d959aa3b253c87845ad454ef188a4bf5a69cab287c131216", - "sha256:c92812a358eabebe92b12b9290d16dc95c8003654658f6b2676c9a2103a73ceb", - "sha256:c93aa24899cb4e8a51492c7ccc420bea45ced502fe9ef2e83f9ab1107e5a13b5", - "sha256:e321f1561adea30e447130882efe451af519646178d04189d6ba91a8cd7d88a5", - "sha256:f0180e84e6493ef7c82e051334e8c9b00ffd89fa9de5e0613d3c267f6ccf2d38", - "sha256:f3006361dba2005552cc8aa49c44d16a10e0a1939bb3286e888a14f722122808", - "sha256:f66df2c152edf5a2fe472bb2f8a5d562165bcf6cf9686cee5d75e524c21ca895" + "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b", + "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc", + "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769", + "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7", + "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d", + "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8", + "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8", + "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0", + "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941", + "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5", + "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b", + "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f", + "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab", + "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee", + "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e", + "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee", + "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde", + "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f", + "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889", + "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb", + "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e", + "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73", + "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b", + "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619", + "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877", + "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d", + "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76", + "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7", + "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1", + "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b" ], "markers": "python_version >= '3.9'", - "version": "==5.0.1" + "version": "==5.0.2" }, "zope.event": { "hashes": [ diff --git a/breathecode/authenticate/models.py b/breathecode/authenticate/models.py index 4deb0ce89..14f8cc928 100644 --- a/breathecode/authenticate/models.py +++ b/breathecode/authenticate/models.py @@ -330,7 +330,22 @@ def save(self, *args, **kwargs): class AcademyAuthSettings(models.Model): academy = models.OneToOneField(Academy, on_delete=models.CASCADE) github_username = models.SlugField(max_length=40, blank=True) - github_owner = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, default=None, null=True) + github_owner = models.ForeignKey( + User, + on_delete=models.SET_NULL, + blank=True, + default=None, + null=True, + help_text="Github auth token for this user will be used for any admin call to the google cloud api, for example: inviting users to the academy", + ) + google_cloud_owner = models.ForeignKey( + User, + on_delete=models.SET_NULL, + blank=True, + default=None, + null=True, + help_text="Google auth token for this user will be used for any admin call to the google cloud api, for example: creating classroom video calls", + ) github_default_team_ids = models.CharField( max_length=40, blank=True, diff --git a/breathecode/services/google_meet/google_meet.py b/breathecode/services/google_meet/google_meet.py index d5dc1835f..5e9ca0b67 100644 --- a/breathecode/services/google_meet/google_meet.py +++ b/breathecode/services/google_meet/google_meet.py @@ -1,10 +1,14 @@ +import os.path +import pickle from typing import Optional, TypedDict, Unpack import google.apps.meet_v2.services.conference_records_service.pagers as pagers from asgiref.sync import async_to_sync from google.apps import meet_v2 from google.apps.meet_v2.types import Space +from google.auth.transport.requests import Request from google.protobuf.field_mask_pb2 import FieldMask +from google_auth_oauthlib.flow import InstalledAppFlow __all__ = ["GoogleMeet"] @@ -78,6 +82,33 @@ class ListParticipantsRequest(TypedDict): filter: str # in EBNF format, start_time and end_time +# Scopes for Google Calendar API (used for creating Google Meet links) +SCOPES = ["https://www.googleapis.com/auth/calendar"] +CREDENTIAL_FILE_NAME = "google_cloud_oauth_token.pickle" + + +def get_credentials(): + creds = None + # Check if google_meet_oauth_token.pickle exists (to reuse the token) + if os.path.exists(CREDENTIAL_FILE_NAME): + with open(CREDENTIAL_FILE_NAME, "rb") as token: + creds = pickle.load(token) + + # If there are no valid credentials available, prompt the user to log in + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + flow = InstalledAppFlow.from_client_secrets_file("client_secret.json", SCOPES) + creds = flow.run_local_server(port=0) + + # Save the credentials for the next run + with open(CREDENTIAL_FILE_NAME, "wb") as token: + pickle.dump(creds, token) + + return creds + + class GoogleMeet: _spaces_service_client: Optional[meet_v2.SpacesServiceAsyncClient] _conference_records_service_client: Optional[meet_v2.ConferenceRecordsServiceAsyncClient] @@ -92,13 +123,17 @@ def __init__(self): async def spaces_service_client(self): if self._spaces_service_client is None: - self._spaces_service_client = meet_v2.SpacesServiceAsyncClient() + credentials = get_credentials() + self._spaces_service_client = meet_v2.SpacesServiceAsyncClient(credentials=credentials) return self._spaces_service_client async def conference_records_service_client(self): if self._conference_records_service_client is None: - self._conference_records_service_client = meet_v2.ConferenceRecordsServiceAsyncClient() + credentials = get_credentials() + self._conference_records_service_client = meet_v2.ConferenceRecordsServiceAsyncClient( + credentials=credentials + ) return self._conference_records_service_client diff --git a/breathecode/settings.py b/breathecode/settings.py index 7cd3b906f..6e02a9999 100644 --- a/breathecode/settings.py +++ b/breathecode/settings.py @@ -85,6 +85,7 @@ ] GRAPHENE = {"SCHEMA": "breathecode.schema.schema"} +IS_TEST_ENV = os.getenv("ENV") == "test" if os.getenv("ALLOW_UNSAFE_CYPRESS_APP") or ENVIRONMENT == "test": INSTALLED_APPS.append("breathecode.cypress") @@ -170,7 +171,7 @@ } # STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' -else: +elif IS_TEST_ENV is False: INSTALLED_APPS += [ "whitenoise.runserver_nostatic", ] @@ -233,7 +234,6 @@ # Disable Django's logging setup LOGGING_CONFIG = None -IS_TEST_ENV = os.getenv("ENV") == "test" LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper() # this prevent the duplications of logs because heroku redirect the output to Coralogix diff --git a/docs/essential/django-rest-framework/serializers.md b/docs/essential/django-rest-framework/serializers.md index 80759b9ba..95522a89b 100644 --- a/docs/essential/django-rest-framework/serializers.md +++ b/docs/essential/django-rest-framework/serializers.md @@ -1,16 +1,16 @@ # Serializers -A serializer is an element (a [class]() this case) that translates and [object]() ([Object-oriented programming](https://en.wikipedia.org/wiki/Object-oriented_programming)) and generate an output that should be useful by something, in Django a serializer is used to format the object before be sent. We just using the [Django Rest Framework](https://www.django-rest-framework.org) Serializers for POST and PUT methods, for the GET method we are using [Serpy](../serpy/introduction) because it is faster than DRF Serializers. +A serializer is an element (a [class](https://en.wikipedia.org/wiki/Class_(computer_programming)) in this case) that translates an [object](https://en.wikipedia.org/wiki/Object_(computer_science)) ([Object-oriented programming](https://en.wikipedia.org/wiki/Object-oriented_programming)) and generates an output that should be useful for something. In Django, a serializer is used to format the object before it is sent. We are using the [Django Rest Framework](https://www.django-rest-framework.org) Serializers for POST and PUT methods, and for the GET method we are using [Serpy](../../serpy/) because it is faster than DRF Serializers. Related articles: -- [HTTP](https://en.wikipedia.org/wiki/HTTP). -- [REST](https://en.wikipedia.org/wiki/REST). +- [HTTP](https://en.wikipedia.org/wiki/HTTP) +- [REST](https://en.wikipedia.org/wiki/REST) ## Writing Serializers Read [this](https://www.django-rest-framework.org/tutorial/1-serialization/). -## Where is the admin? +## Where are the serializers? -It where in `breathecode/APP_NAME/serializers.py`. +They are located in `breathecode/APP_NAME/serializers.py`. diff --git a/docs/testing/parametrize-tests.md b/docs/testing/parametrize.md similarity index 100% rename from docs/testing/parametrize-tests.md rename to docs/testing/parametrize.md diff --git a/docs/testing/runing-tests.md b/docs/testing/runing-tests.md deleted file mode 100644 index f87948099..000000000 --- a/docs/testing/runing-tests.md +++ /dev/null @@ -1,33 +0,0 @@ -# Runing tests - -## Run tests - -```bash -pipenv run test ./breathecode/ -``` - -## Run tests in parallel - -```bash -pipenv run ptest ./breathecode/ -``` - -## Run coverage - -```bash -pipenv run cov breathecode -``` - -## Run coverage in parallel - -```bash -pipenv run pcov breathecode -``` - -## Testing inside Docker (fallback option) - -1. Check which dependencies you need install in you operating system `pipenv run doctor` or `python -m scripts.doctor`. -2. Install [docker desktop](https://www.docker.com/products/docker-desktop) in your Windows, else find a guide to install Docker and Docker Compose in your linux distribution `uname -a`. -3. Generate the 4Geeks Shell image with `pipenv run docker_build_shell`. -4. Run 4Geeks Shell with `docker-compose run bc-shell` -5. Run `pipenv run test`, `pipenv run ptest`, `pipenv run cov` or `pipenv run pcov`. diff --git a/docs/testing/running-tests.md b/docs/testing/running-tests.md new file mode 100644 index 000000000..e88a8be81 --- /dev/null +++ b/docs/testing/running-tests.md @@ -0,0 +1,38 @@ +# Running tests + +## Run a test file + +```bash +pipenv run test breathecode/payments/tests/urls/tests_me_service_slug_consumptionsession_hash.py +``` + +### Pytest options + +- `-v`: verbose +- `-vv`: more verbose +- `-s`: don't capture the stdout, useful when the test execution won't end. +- `-k`: only run test methods and classes that match the pattern or substring. + +## Run tests in parallel + +```bash +pipenv run ptest +``` + +## Run tests in parallel in a module + +```bash +pipenv run ptest ./breathecode/ +``` + +## Run coverage in parallel + +```bash +pipenv run pcov +``` + +## Run coverage in parallel in a module + +```bash +pipenv run pcov breathecode.admissions +``` diff --git a/docs/workflows/file-uploading.md b/docs/workflows/file-uploading.md new file mode 100644 index 000000000..2c8529e4d --- /dev/null +++ b/docs/workflows/file-uploading.md @@ -0,0 +1,117 @@ +# File uploading + +## Steps + +- Get operation type meta. +- Split file into chunks. +- Check if chunk lenght is less than `max_chunks` or `null`. +- Upload each chunk. +- Process the file and send the metadata if required. +- If the file is not processed automatically you should pass the file id to another endpoint. + +### Notes + +- For user uploading, use `/v2/media/me/chunk` and `/v2/media/me/chunk/upload`. +- For academy uploading, use `/v2/media/academy/chunk` and `/v2/media/academy/chunk/upload` with the `Academy` header. +- Status `TRANSFERRING` means that the file is being processed. +- Status `CREATED` means that the `file.id` must be provided to another endpoint for processing. + +## Get available operation types + +### Request + +```http +GET /v2/media/operationtype HTTP/1.1 +Host: breathecode.herokuapp.com +``` + +### Response + +```json +[ +    "media", +    "proof-of-payment" +] +``` + +## Get operation type meta + +### Request + +```http +GET /v2/media/operationtype/media HTTP/1.1 +Host: breathecode.herokuapp.com +``` + + +### Response + +```json +{ +    "chunk_size": 10485760, +    "max_chunks": null +} +``` + +## Upload chunk + +### Request + +```http +POST /v2/media/me/chunk HTTP/1.1 +Host: breathecode.herokuapp.com +Content-Type: multipart/form-data; boundary=... + +{ + "operation_type": "media", + "total_chunks": 3, + "chunk": chunk, + "chunk_index": 0 +} +``` + +### Response + +```json +{ +    "academy": null, +    "chunk_index": 0, +    "mime": "image/png", +    "name": "chunk.png", +    "operation_type": "media", +    "total_chunks": 3, +    "user": 1 +} +``` + +## End file uploading and ask for processing + +### Request + +```http +POST /v2/media/me/chunk/upload HTTP/1.1 +Host: breathecode.herokuapp.com +Content-Type: application/json + +{ + "operation_type": "media", + "total_chunks": 3, + "filename": "chunk.png", + "mime": "image/png", + "meta": "{\"slug\":\"my-media\",\"name\":\"my-name\",\"categories\":[\"my-category\"],\"academy\":1}" +} +``` + +### Response + +```json +{ +    "id": 1, +    "academy": null, +    "mime": "image/png", +    "name": "a291e39ac495b2effd38d508417cd731", +    "operation_type": "media", +    "user": 1, +    "status": "TRANSFERRING" +} +``` diff --git a/mkdocs.yml b/mkdocs.yml index b0a1efa1a..9c815f349 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -73,7 +73,8 @@ nav: - "advanced/celery/routing.md" - "advanced/celery/settings.md" - Testing: - - "testing/runing-tests.md" + - "testing/running-tests.md" + - "testing/parametrize.md" - Mixins: - "bc": "testing/mixins/bc.md" - "bc.fake": "testing/mixins/bc-fake.md" @@ -87,6 +88,8 @@ nav: - Mocks: - "testing/mocks/using-mocks.md" - "testing/mocks/mock-requests.md" + - Workflows: + - "workflows/file-uploading.md" - Infrastructure: - "infrastructure/journal.md" - "infrastructure/web.md" From 63aa3e0992429ba590674667a2a8a6384996547f Mon Sep 17 00:00:00 2001 From: jefer94 Date: Wed, 4 Sep 2024 20:15:55 -0500 Subject: [PATCH 12/25] update deps --- Pipfile.lock | 404 ++++++++++++++--------------- breathecode/authenticate/models.py | 17 +- 2 files changed, 211 insertions(+), 210 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 332d05f11..7fd43d681 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -416,76 +416,76 @@ }, "cffi": { "hashes": [ - "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f", - "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab", - "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499", - "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058", - "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693", - "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb", - "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377", - "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885", - "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2", - "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401", - "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4", - "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b", - "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59", - "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f", - "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c", - "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555", - "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa", - "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424", - "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb", - "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2", - "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8", - "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e", - "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9", - "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82", - "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828", - "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759", - "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc", - "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118", - "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf", - "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932", - "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a", - "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29", - "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206", - "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2", - "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c", - "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c", - "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0", - "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a", - "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195", - "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6", - "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9", - "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc", - "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb", - "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0", - "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7", - "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb", - "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a", - "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492", - "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720", - "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42", - "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7", - "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d", - "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d", - "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb", - "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4", - "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2", - "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b", - "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8", - "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e", - "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204", - "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3", - "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150", - "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4", - "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76", - "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e", - "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb", - "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91" + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.17.0" + "version": "==1.17.1" }, "channels": { "hashes": [ @@ -1136,10 +1136,10 @@ }, "google-cloud-bigquery-storage": { "hashes": [ - "sha256:01109a66d1d23745d8d9c30852a0a137e8238faac1b3b02dec0d8e319ca231cb", - "sha256:195ffd2b180e9eaa22beab3e40a0b61ecd146ecb32667cf42269a8d7111b4d48" + "sha256:375927703afb0a057d3abcbe1a1d644a2a6852c43b864c0b5c93c18e4d3cd999", + "sha256:840275bd0a4b207c0ac821bcc6741406ffb3b5ef940fa05089a90eb4403453fa" ], - "version": "==2.25.0" + "version": "==2.26.0" }, "google-cloud-core": { "hashes": [ @@ -1178,12 +1178,12 @@ }, "google-cloud-recaptcha-enterprise": { "hashes": [ - "sha256:982597a34306de4b5ae7b592aafc9322087ee4abec4940ad0611d32ebc19ed11", - "sha256:dd1173b8f22282a22df68a9796d9cdd0b113f34b60b006a8bdf4bcb2f7cdefff" + "sha256:69b0347b3f834812633e1902dddf62b10a3b3aca1e31b52a8861d3302304ace2", + "sha256:af9f7dbd56ee9d79e850307515118da42f465837a95b7af860ee315dab164042" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==1.22.0" + "version": "==1.22.1" }, "google-cloud-storage": { "hashes": [ @@ -1268,11 +1268,11 @@ }, "graphql-core": { "hashes": [ - "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676", - "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3" + "sha256:1604f2042edc5f3114f49cac9d77e25863be51b23a54a61a23245cf32f6476f0", + "sha256:acbe2e800980d0e39b4685dd058c2f4042660b89ebca38af83020fd872ff1264" ], "markers": "python_version >= '3.6' and python_version < '4'", - "version": "==3.2.3" + "version": "==3.2.4" }, "graphql-relay": { "hashes": [ @@ -1343,7 +1343,7 @@ "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], - "markers": "python_version >= '3.11' and platform_python_implementation == 'CPython'", + "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==3.0.3" }, "grpcio": { @@ -1399,10 +1399,10 @@ }, "grpcio-status": { "hashes": [ - "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485", - "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8" + "sha256:b3f7d34ccc46d83fea5261eea3786174459f763c31f6e34f1d24eba6d515d024", + "sha256:cf9ed0b4a83adbe9297211c95cb5488b0cd065707e812145b842c85c4782ff02" ], - "version": "==1.62.3" + "version": "==1.66.1" }, "gunicorn": { "hashes": [ @@ -2553,20 +2553,20 @@ }, "protobuf": { "hashes": [ - "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1", - "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d", - "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040", - "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835", - "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1", - "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca", - "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f", - "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d", - "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978", - "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4", - "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b" + "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd", + "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0", + "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681", + "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd", + "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0", + "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6", + "sha256:853db610214e77ee817ecf0514e0d1d052dff7f63a0c157aa6eabae98db8a8de", + "sha256:d001a73c8bc2bf5b5c1360d59dd7573744e163b3607fa92788b7f3d5fefbd9a5", + "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add", + "sha256:dde9fcaa24e7a9654f4baf2a55250b13a5ea701493d904c54069776b99a8216b", + "sha256:eef7a8a2f4318e2cb2dee8666d26e58eaf437c14788f3a2911d0c3da40405ae8" ], "markers": "python_version >= '3.8'", - "version": "==4.25.4" + "version": "==5.28.0" }, "psycopg": { "extras": [ @@ -3744,101 +3744,101 @@ }, "yarl": { "hashes": [ - "sha256:03e917cc44a01e1be60a83ee1a17550b929490aaa5df2a109adc02137bddf06b", - "sha256:050f3e4d886be55728fef268587d061c5ce6f79a82baba71840801b63441c301", - "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f", - "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b", - "sha256:0fdb156a06208fc9645ae7cc0fca45c40dd40d7a8c4db626e542525489ca81a9", - "sha256:10452727843bc847596b75e30a7fe92d91829f60747301d1bd60363366776b0b", - "sha256:1787dcfdbe730207acb454548a6e19f80ae75e6d2d1f531c5a777bc1ab6f7952", - "sha256:1cd450e10cb53d63962757c3f6f7870be49a3e448c46621d6bd46f8088d532de", - "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2", - "sha256:1fc728857df4087da6544fc68f62d7017fa68d74201d5b878e18ed4822c31fb3", - "sha256:23404842228e6fa8ace235024519df37f3f8e173620407644d40ddca571ff0f4", - "sha256:25508739e9b44d251172145f54c084b71747b09e4d237dc2abb045f46c36a66e", - "sha256:29c80890e0a64fb0e5f71350d48da330995073881f8b8e623154aef631febfb0", - "sha256:2d71a5d818d82586ac46265ae01466e0bda0638760f18b21f1174e0dd58a9d2f", - "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8", - "sha256:316c82b499b6df41444db5dea26ee23ece9356e38cea43a8b2af9e6d8a3558e4", - "sha256:34736fcc9d6d7080ebbeb0998ecb91e4f14ad8f18648cf0b3099e2420a225d86", - "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c", - "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47", - "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08", - "sha256:3dba2ebac677184d56374fa3e452b461f5d6a03aa132745e648ae8859361eb6b", - "sha256:3f53df493ec80b76969d6e1ae6e4411a55ab1360e02b80c84bd4b33d61a567ba", - "sha256:4052dbd0c900bece330e3071c636f99dff06e4628461a29b38c6e222a427cf98", - "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755", - "sha256:48f7a158f3ca67509d21cb02a96964e4798b6f133691cc0c86cf36e26e26ec8f", - "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75", - "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee", - "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00", - "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf", - "sha256:522fa3d300d898402ae4e0fa7c2c21311248ca43827dc362a667de87fdb4f1be", - "sha256:58e3f01673873b8573da3abe138debc63e4e68541b2104a55df4c10c129513a4", - "sha256:596069ddeaf72b5eb36cd714dcd2b5751d0090d05a8d65113b582ed9e1c801fb", - "sha256:5d585c7d834c13f24c7e3e0efaf1a4b7678866940802e11bd6c4d1f99c935e6b", - "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b", - "sha256:60c04415b31a1611ef5989a6084dd6f6b95652c6a18378b58985667b65b2ecb6", - "sha256:60f3b5aec3146b6992640592856414870f5b20eb688c1f1d5f7ac010a7f86561", - "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb", - "sha256:628619008680a11d07243391271b46f07f13b75deb9fe92ef342305058c70722", - "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f", - "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf", - "sha256:65e3098969baf221bb45e3b2f60735fc2b154fc95902131ebc604bae4c629ea6", - "sha256:6639444d161c693cdabb073baaed1945c717d3982ecedf23a219bc55a242e728", - "sha256:71bb1435a84688ed831220c5305d96161beb65cac4a966374475348aa3de4575", - "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8", - "sha256:74d3ef5e81f81507cea04bf5ae22f18ef538607a7c754aac2b6e3029956a2842", - "sha256:78250f635f221dde97d02c57aade3313310469bc291888dfe32acd1012594441", - "sha256:78805148e780a9ca66f3123e04741e344b66cf06b4fb13223e3a209f39a6da55", - "sha256:7ab906a956d2109c6ea11e24c66592b06336e2743509290117f0f7f47d2c1dd3", - "sha256:7fc441408ed0d9c6d2d627a02e281c21f5de43eb5209c16636a17fc704f7d0f8", - "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781", - "sha256:8525f955a2dcc281573b6aadeb8ab9c37e2d3428b64ca6a2feec2a794a69c1da", - "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48", - "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003", - "sha256:8af0bbd4d84f8abdd9b11be9488e32c76b1501889b73c9e2292a15fb925b378b", - "sha256:8e8916b1ff7680b1f2b1608c82dc15c569b9f2cb2da100c747c291f1acf18a14", - "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c", - "sha256:9163d21aa40ff8528db2aee2b0b6752efe098055b41ab8e5422b2098457199fe", - "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56", - "sha256:9d319ac113ca47352319cbea92d1925a37cb7bd61a8c2f3e3cd2e96eb33cccae", - "sha256:a48d2b9f0ae29a456fb766ae461691378ecc6cf159dd9f938507d925607591c3", - "sha256:a564155cc2194ecd9c0d8f8dc57059b822a507de5f08120063675eb9540576aa", - "sha256:a95167ae34667c5cc7d9206c024f793e8ffbadfb307d5c059de470345de58a21", - "sha256:a9552367dc440870556da47bb289a806f08ad06fbc4054072d193d9e5dd619ba", - "sha256:a99cecfb51c84d00132db909e83ae388793ca86e48df7ae57f1be0beab0dcce5", - "sha256:b1557456afce5db3d655b5f8a31cdcaae1f47e57958760525c44b76e812b4987", - "sha256:bc23d870864971c8455cfba17498ccefa53a5719ea9f5fce5e7e9c1606b5755f", - "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842", - "sha256:c81c28221a85add23a0922a6aeb2cdda7f9723e03e2dfae06fee5c57fe684262", - "sha256:ca5e86be84492fa403c4dcd4dcaf8e1b1c4ffc747b5176f7c3d09878c45719b0", - "sha256:cb870907e8b86b2f32541403da9455afc1e535ce483e579bea0e6e79a0cc751c", - "sha256:cddebd096effe4be90fd378e4224cd575ac99e1c521598a6900e94959006e02e", - "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb", - "sha256:cf85599c9336b89b92c313519bcaa223d92fa5d98feb4935a47cce2e8722b4b8", - "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb", - "sha256:d0aabe557446aa615693a82b4d3803c102fd0e7a6a503bf93d744d182a510184", - "sha256:d35f9cdab0ec5e20cf6d2bd46456cf599052cf49a1698ef06b9592238d1cf1b1", - "sha256:d8ad761493d5aaa7ab2a09736e62b8a220cb0b10ff8ccf6968c861cd8718b915", - "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b", - "sha256:dd08da4f2d171e19bd02083c921f1bef89f8f5f87000d0ffc49aa257bc5a9802", - "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8", - "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7", - "sha256:e7f9cabfb8b980791b97a3ae3eab2e38b2ba5eab1af9b7495bdc44e1ce7c89e3", - "sha256:e8362c941e07fbcde851597672a5e41b21dc292b7d5a1dc439b7a93c9a1af5d9", - "sha256:eefda67ba0ba44ab781e34843c266a76f718772b348f7c5d798d8ea55b95517f", - "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7", - "sha256:f3aaf9fa960d55bd7876d55d7ea3cc046f3660df1ff73fc1b8c520a741ed1f21", - "sha256:f5ddad20363f9f1bbedc95789c897da62f939e6bc855793c3060ef8b9f9407bf", - "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05", - "sha256:f87d8645a7a806ec8f66aac5e3b1dcb5014849ff53ffe2a1f0b86ca813f534c7", - "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45", - "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2", - "sha256:ff03f1c1ac474c66d474929ae7e4dd195592c1c7cc8c36418528ed81b1ca0a79" + "sha256:05c0720f01f94c8d792ed8653a8bde7de143e5d6917ea86dcf51de9d3ba0e3ed", + "sha256:07354c6cf182fe130ae0392f54d76f864a105134bef88f71f98365d323be7115", + "sha256:075261df1a9b28753d8af133b4fef97931a6f85515615241e76d73a655a0fdae", + "sha256:0aa36416f7d2b984adff86f3e087ee402053c2a050ae232ff103177dff0f517e", + "sha256:0efb49c6637197749fa5f7cfb21d8922b82c61d063a7f88227fb5c81c5ea35e7", + "sha256:0fbafb51e453c325660e7f4eb9e827b268bace2d5a924bcff0247c7d10ddd8d3", + "sha256:1045aca1d48c9f614cdcebce5345cd4e8be0b856b608aaa2fcb67ea3c816ff9a", + "sha256:116c1fa600f0afabdb312bf1b95767098c03d5550bae5c648b63aa2a95a84f6c", + "sha256:160d0a21abcd776d8589eb291bfe4c66f5aa754bda43f9346c561519aedb7f90", + "sha256:17745e92cc05aa28284e62a1938fd8e83ece4cddd0be44bf8b69bd0445b1d6ac", + "sha256:197b01e0dab3beb349a7f7be2cfb0f69979fab128f4fbef0fb655b898c22bc71", + "sha256:1ba0926703e64a8125054bbbba5d9dd8399465f298cd48338497506684221569", + "sha256:1f2b93e00243d8d0cedf82c0eaaa5cde27e0e4040013387085a0362ea8068f8d", + "sha256:251d8e6ede8e1f1b6bad8da23d685ab8f79ee8647aabf7b0dc4619c6eb6d433b", + "sha256:2920c39ddf5f710b6f70d9b6fe178dcd4c3bd0aeb7265d3fcdd97d55b944d664", + "sha256:2a24180a47b0aacdd51403a22b2149627edc5f01cc851fe0dac7a279b6ce123d", + "sha256:2aecbd90de8abfee55d67f7ae665452696f290ef74008dd505abeb40ba2be03d", + "sha256:2bb09fbd303586c96110cac521d6236e12b97d555f0cf5b086d59eaf643c7d75", + "sha256:30c9956ea776067dff46aa988899f1218b217469ec6a447d9d0021bd4653ce28", + "sha256:30f7b462b498fc1b109d319b77abb63cf74f71546e54785c92a62cfa296148de", + "sha256:31cc725911654fe77b4a21b79c4ba08d71bd9074a4cf1f8fcc1aca6b9ece5b29", + "sha256:338931f1358501d70d99ed1185b126f627cdce29862a868690ebaa0a1056f6c9", + "sha256:400bb873f7e1697830ef276a21d53cd63761b36a726fb9753cd00e7e00547449", + "sha256:410657b3267d5b95a84b1bbdfae03a58fb18b144f3f8e17505bf5df3b7440953", + "sha256:411df3ba2b58097e472468dd8a8a45696bb2fb4d8d98249d7ace6571c05a91c3", + "sha256:437e969848de7bbb2e34abc93db6ccf307ba4acec708e40b710b17f15e691d30", + "sha256:453784dbe38495749ea3ac00eb96c358d52a360fd54a8e8a901f38b22227c302", + "sha256:47ab8355ab667b908cf2a2bdd4edc8b27770fe327f915eafc440c5ea68a3df9c", + "sha256:49cf15f65b86b48fd1403d14452d2f213475e763e5b4a67ece1e114f8b5c89ad", + "sha256:4a638b73d4037b4f9e52514fec402ca97c98ef7af16909dd5c06254f23d2018e", + "sha256:4a80685a0355d12f2cc73fa07f070496802518f0a3d935754d2fecf4ecce9c3b", + "sha256:4f0da5a07def830dacd610675f1821702f252f6b3f8d5a1d5a282bc874497f4c", + "sha256:4f749ae3f9c3d4fbe42fe24bcd7ce81e785683fd144415540598a6f3769c8f52", + "sha256:562ea9c21d2563af2cf062ceaf4530f6e8ce58e89a243df2eeae933781ea6864", + "sha256:57021bc580ef6c8ef4eb9a7d4a26687da1a74cdce858696fb54bacadf4bc6ca8", + "sha256:592cb002e7b4a52313d6bcd8196b1f8b9e0b86e3bcac374e3c95375a59cf9456", + "sha256:5bb04a89b7efdb9fb215e007b3dca30819a23757633f0ef24da19729a278d168", + "sha256:5be05d6c8980e6ef818a7a789b49a4fd2253068cfd6dff8291030ea1b6002922", + "sha256:604f8d0e045f7788011b0b44e19f04ce62a3329e6af08a3382b8ec8070798aef", + "sha256:6367b8f2e885e0357dd8449a94f6d67480d1b2b7265eb0e54f2b226258f13b4c", + "sha256:642c387a51b99a18c99a7b781cd8c0ceaca0c6f956e2a01ccc1d624386021d86", + "sha256:6812f3b67111561226016af7edc5cbd340d455176edbc30e7c9d2c6b70eaae24", + "sha256:6ceba7b6ee24db0db6db329d5fe1ed1b8e95225e0343bf2390e66042c661a3c6", + "sha256:742651d2e53e535ef93cfd338a9d3faaeb5cecb4e216904d4b08ef2b7971f9ac", + "sha256:77832ed01e7587ebd56fc160a88ba677b9d706d368f78c73404aa04b9f69cbbb", + "sha256:78f1cc410fe6862726bef485a34f16aec24c6a4e1e1342ed2e3718cd3fe7c9ea", + "sha256:7b33cdb0b98daf968b02f9ed0d729af480d2117c4f8ad307893dc4777ffd8ff8", + "sha256:7d5ffbb8e6ba4cd7c5f9237f3543e2a3878eb2b45cb51579a0f83b3affcdd52d", + "sha256:7e7190a70a7067da2af6dc325032f07544bfc9fbca4ae471e76e8ace18cf408c", + "sha256:7f6871d7f3ed5410274cad801f1669ee4e66cd647bd53dbde7151deabe19f4ed", + "sha256:8318c8ec736dde091e02079ac82a4e3a9d67f6dfd23074dcc1f09b0517ed7660", + "sha256:83bb7b9d1d02442b0d6218f6cf4fc748aca6f1a077f1ffef1f73d8adf44f359a", + "sha256:892b37b4abaed283c01240a732a384fc239e875b39f3e9c774482e50451142eb", + "sha256:8a490845e0ded093ec503a90e236ea2cbd4e5873ec345a616f30f357a87e266d", + "sha256:8a5bd28e12bb85f2d8480097c4670bc5cf5f72c23613b0edbea8534d3b007c00", + "sha256:8aafa5ee1970027c11aee1c99999142e76de769bcca8f5364e06eee739d05e5b", + "sha256:8b6f7a9e88643d1ccfe7c51eb904c5cf357b85dbe5de6c562724533e4794c45f", + "sha256:8dd3be4068df64d952dc4488511fcda0809af99596639b5e4cd8f5b797d7f8ce", + "sha256:99cbaf5b5072293de38432260eaddc46c84a1008eb48e05366c703680d67c32b", + "sha256:9ebf1191e47e31405e210e0926d44b110237104f8deca54735b40cb5a2b5f348", + "sha256:a0f8e00f618d9e217c080ec87220da519c817a03a3138fe4cead992ec9b5d98b", + "sha256:a8ab1274030afb9f802fad41ce143a0971788509e47d187fad4560873938d308", + "sha256:a9d3826d3294cffb30598ecbf7660a45b42add21588a3cbb297f26141cd3ba41", + "sha256:b37f1400f0e6d86cadcfc701c149c6cd8aa8c851cab38813d3d0cb9e1f8e5014", + "sha256:b43880f6d6fad721786c62d74da7738d4c373d1dd321d9c2984a351b070a1d70", + "sha256:b7979df841db760b2ea957a7a05cbcbb29132adafdba4c4e713f7bac9f6c6e1c", + "sha256:b7a83d465037cae9a578dbc73b271aaa772e5b18412b1034a4187e3cd3246930", + "sha256:b9384298eba7f7c411c8289311f80075f6a2221690cbd57347239d45bb54f149", + "sha256:baa990d9bcdaf96160347852833bbf5b738ae1d21ce4d676af540984ebdc2b9a", + "sha256:bc1ef802088a9a5351e3f00bdd2c504dda5c65d515b8ad72497d6802d6273b71", + "sha256:bed9ff4834fed52ad8d4716ab1846b2445ed3341f5d376905ea02bb5d3d861df", + "sha256:bf4104176a918df0abab01044cb243096b68c707c8da83c57d137530c4289b7e", + "sha256:c1142ad33527aac79209dd9ebf53f2536e01efc728b883605e66bf7688a6b74a", + "sha256:c34c0b6f43f5b3107bd2e881e622585101c53c2c53e694ab9948e5252369628c", + "sha256:c47923aada4a2cd85daa810c241f1ba05454f386054946244131ab801920f468", + "sha256:c48beaecf7edd647e6688ad08bf0b89c88cfe18ea3d9077399e8fc08c9796276", + "sha256:c494cd77b080312ad881bf42ef90d27130a1cfc4d37dadbc2a8aaf03dd026443", + "sha256:ca7c4ef061b3e47514476ea40970df13a3db8c94db876adc95e3609767ed53b5", + "sha256:cb52a9d5286c300c34630f58d4403412bda1cebc4a7881b462a23f8cc5d2476e", + "sha256:cba3210cb4116b184d717db123484181bdfa07bccfc2dfd24718bfcafaee3509", + "sha256:d56c0498efc6bd13e9f25a0e67fee5544ae70f776983ac7c01a39694695eb0e2", + "sha256:d6366324f622c81b7c806f0a93372fe68e85828fe70e5728be2fe2e1f618d498", + "sha256:dccfee37fb7cda974627de852e88770a5618b4975a269a2ca076b860990b4a8c", + "sha256:df831cca0bb7af9494f7e9008a8099c7dda35bb1e540a00fd695889458cde945", + "sha256:ec055bf02fe03b6bb06966b80b79ddfc26501a8bcf7213d2c8a4c1a09d6ad6a3", + "sha256:ec2c1eafd7b5f869fd40831509edebc85489678d8949c61e967f4688630098e1", + "sha256:ecb9486e7d1c3a27318ac43aa0b364c5066c08858622fb054dde74e357f279a4", + "sha256:ee2758c6db892ea27675e6b394a215d7bc88346e4a0952e6f2f789c71ab2d467", + "sha256:f3a76bd93dfb1fffc48123ed266fa085fdfce5766ff61231da3f07c0e3367056", + "sha256:f40c88d185300b6d177e08f4b8359354e1ba10b564b2bcd9a14ac3fdb679e2f9", + "sha256:f56bd2bdeeb2416cc45236ce10898dc19932d4cc21fd37aa2da0e281112cde16", + "sha256:fe487b0399a850c8adf4158972331345541961b8aa17a35f050d6c3707c95965" ], "markers": "python_version >= '3.8'", - "version": "==1.9.7" + "version": "==1.9.10" }, "zope.event": { "hashes": [ @@ -4504,7 +4504,7 @@ "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], - "markers": "python_version >= '3.11' and platform_python_implementation == 'CPython'", + "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==3.0.3" }, "griffe": { @@ -4568,10 +4568,10 @@ }, "grpcio-status": { "hashes": [ - "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485", - "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8" + "sha256:b3f7d34ccc46d83fea5261eea3786174459f763c31f6e34f1d24eba6d515d024", + "sha256:cf9ed0b4a83adbe9297211c95cb5488b0cd065707e812145b842c85c4782ff02" ], - "version": "==1.62.3" + "version": "==1.66.1" }, "httplib2": { "hashes": [ @@ -5003,20 +5003,20 @@ }, "protobuf": { "hashes": [ - "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1", - "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d", - "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040", - "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835", - "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1", - "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca", - "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f", - "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d", - "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978", - "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4", - "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b" + "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd", + "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0", + "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681", + "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd", + "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0", + "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6", + "sha256:853db610214e77ee817ecf0514e0d1d052dff7f63a0c157aa6eabae98db8a8de", + "sha256:d001a73c8bc2bf5b5c1360d59dd7573744e163b3607fa92788b7f3d5fefbd9a5", + "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add", + "sha256:dde9fcaa24e7a9654f4baf2a55250b13a5ea701493d904c54069776b99a8216b", + "sha256:eef7a8a2f4318e2cb2dee8666d26e58eaf437c14788f3a2911d0c3da40405ae8" ], "markers": "python_version >= '3.8'", - "version": "==4.25.4" + "version": "==5.28.0" }, "pyasn1": { "hashes": [ diff --git a/breathecode/authenticate/models.py b/breathecode/authenticate/models.py index 14f8cc928..880b9e8dd 100644 --- a/breathecode/authenticate/models.py +++ b/breathecode/authenticate/models.py @@ -338,14 +338,15 @@ class AcademyAuthSettings(models.Model): null=True, help_text="Github auth token for this user will be used for any admin call to the google cloud api, for example: inviting users to the academy", ) - google_cloud_owner = models.ForeignKey( - User, - on_delete=models.SET_NULL, - blank=True, - default=None, - null=True, - help_text="Google auth token for this user will be used for any admin call to the google cloud api, for example: creating classroom video calls", - ) + # TODO: uncomment this + # google_cloud_owner = models.ForeignKey( + # User, + # on_delete=models.SET_NULL, + # blank=True, + # default=None, + # null=True, + # help_text="Google auth token for this user will be used for any admin call to the google cloud api, for example: creating classroom video calls", + # ) github_default_team_ids = models.CharField( max_length=40, blank=True, From 10c7d7a444b4a989111c3e5bd7fc3082d0684d53 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Wed, 4 Sep 2024 20:22:26 -0500 Subject: [PATCH 13/25] comment a line --- breathecode/authenticate/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/breathecode/authenticate/models.py b/breathecode/authenticate/models.py index 880b9e8dd..df8f21657 100644 --- a/breathecode/authenticate/models.py +++ b/breathecode/authenticate/models.py @@ -336,7 +336,8 @@ class AcademyAuthSettings(models.Model): blank=True, default=None, null=True, - help_text="Github auth token for this user will be used for any admin call to the google cloud api, for example: inviting users to the academy", + # TODO: uncomment this + # help_text="Github auth token for this user will be used for any admin call to the google cloud api, for example: inviting users to the academy", ) # TODO: uncomment this # google_cloud_owner = models.ForeignKey( From e080757a04b89f86d3126d2805d65d13c7cb2997 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Wed, 4 Sep 2024 20:44:39 -0500 Subject: [PATCH 14/25] change pytest.ini --- pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/pytest.ini b/pytest.ini index b6956b2c4..51bc007c0 100644 --- a/pytest.ini +++ b/pytest.ini @@ -4,6 +4,7 @@ addopts = -p no:legacypath --tb=short DJANGO_SETTINGS_MODULE = test_settings python_files = breathecode/**/tests.py breathecode/**/tests_*.py +asyncio_default_fixture_loop_scope = function env = ENV=test From 1cd639addb4c104c8f0469a4b345c2d80370f2c1 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 13:10:21 -0500 Subject: [PATCH 15/25] fix dockerfile --- .gitpod.Dockerfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index ded926c5b..be6c1a780 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -2,9 +2,12 @@ FROM gitpod/workspace-postgres:latest SHELL ["/bin/bash", "-c"] +# Add LLVM repository and key +RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - \ + && echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list + RUN sudo apt-get update \ - && sudo apt-get update \ - && sudo apt-get install -y redis-server \ + && sudo apt-get install -y redis-server postgresql \ && sudo apt-get clean \ && sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* @@ -17,8 +20,8 @@ RUN sudo apt-get update \ # RUN curl https://pyenv.run | bash -# RUN pyenv update && pyenv install 3.12.2 && pyenv global 3.12.2 -RUN pyenv install 3.12.2 && pyenv global 3.12.2 +# RUN pyenv update && pyenv install 3.12.5 && pyenv global 3.12.5 +RUN pyenv install 3.12.5 && pyenv global 3.12.5 RUN pip install pipenv yapf # remove PIP_USER environment From b7de8de6c0d46ce974fc355f9ab8d056f2c9a44a Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 13:26:12 -0500 Subject: [PATCH 16/25] downgrade python in gitpod --- .gitpod.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index be6c1a780..bb31409b7 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -20,8 +20,8 @@ RUN sudo apt-get update \ # RUN curl https://pyenv.run | bash -# RUN pyenv update && pyenv install 3.12.5 && pyenv global 3.12.5 -RUN pyenv install 3.12.5 && pyenv global 3.12.5 +# RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 +RUN pyenv install 3.12.3 && pyenv global 3.12.3 RUN pip install pipenv yapf # remove PIP_USER environment From bee489f16599c2ff24ae7ec6ee6f121ae2307f56 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 13:42:13 -0500 Subject: [PATCH 17/25] fix version in gitpod --- .gitpod.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index a90620342..40f3a62da 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -10,13 +10,13 @@ ports: tasks: - command: redis-server - init: | - pyenv global 3.12.2 && + pyenv global 3.12.3 && python -m scripts.install && gp sync-done deps - command: pyenv global 3.12.2 && pipenv run celery + command: pyenv global 3.12.3 && pipenv run celery - init: gp sync-await deps command: > - pyenv global 3.12.2 && + pyenv global 3.12.3 && (psql -U gitpod -c 'CREATE DATABASE breathecode;' || true) && (psql -U gitpod -c 'CREATE EXTENSION unaccent;' -d breathecode || true) && pipenv run migrate && From df9a2d8376a66d5445fca7d67910496f100d3971 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 17:43:32 -0500 Subject: [PATCH 18/25] update dockerfile --- .gitpod.Dockerfile | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index bb31409b7..e9324c1cd 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -2,6 +2,9 @@ FROM gitpod/workspace-postgres:latest SHELL ["/bin/bash", "-c"] +RUN sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' \ + && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - + # Add LLVM repository and key RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - \ && echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list @@ -11,21 +14,29 @@ RUN sudo apt-get update \ && sudo apt-get clean \ && sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* - - -# That Gitpod install pyenv for me? no, thanks -# WORKDIR /home/gitpod/ -# RUN rm .pyenv -Rf -# RUN rm .gp_pyenv.d -Rf -# RUN curl https://pyenv.run | bash - +# RUN sudo update-alternatives --set postgresql /usr/lib/postgresql/16/bin/postgres # RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 RUN pyenv install 3.12.3 && pyenv global 3.12.3 -RUN pip install pipenv yapf +RUN pip install pipenv + +# Set up PostgreSQL 16 +USER postgres +RUN /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/data +RUN echo "host all all all md5" >> /var/lib/postgresql/16/data/pg_hba.conf +RUN echo "listen_addresses='*'" >> /var/lib/postgresql/16/data/postgresql.conf +RUN /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data start && \ + /usr/lib/postgresql/16/bin/psql -c "CREATE USER gitpod WITH PASSWORD 'gitpod';" && \ + /usr/lib/postgresql/16/bin/psql -c "ALTER USER gitpod WITH SUPERUSER;" && \ + /usr/lib/postgresql/16/bin/psql -c "CREATE DATABASE gitpod OWNER gitpod;" && \ + /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data stop # remove PIP_USER environment USER gitpod + +# Ensure PostgreSQL 16 is used +RUN echo "export PATH=/usr/lib/postgresql/16/bin:$PATH" >> /home/gitpod/.bashrc + RUN if ! grep -q "export PIP_USER=no" "$HOME/.bashrc"; then printf '%s\n' "export PIP_USER=no" >> "$HOME/.bashrc"; fi RUN echo "" >> $HOME/.bashrc RUN echo "unset DATABASE_URL" >> $HOME/.bashrc From 5def21938a9b3052021f2af7f1a1a87403aef078 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 18:44:51 -0500 Subject: [PATCH 19/25] modify dockerfile --- .gitpod.Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index e9324c1cd..fa6a7025a 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -31,6 +31,9 @@ RUN /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data start && \ /usr/lib/postgresql/16/bin/psql -c "CREATE DATABASE gitpod OWNER gitpod;" && \ /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data stop +USER root +RUn rm /usr/lib/postgresql/12 -rf + # remove PIP_USER environment USER gitpod From 412f0261c7f6dbac13154bf8c5e0007a1433d1da Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 20:01:15 -0500 Subject: [PATCH 20/25] update dockerfile --- .gitpod.Dockerfile | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index fa6a7025a..ac7523e75 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -32,7 +32,28 @@ RUN /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data start && \ /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data stop USER root -RUn rm /usr/lib/postgresql/12 -rf + +# remove postgresql 12 +RUN rm /usr/lib/postgresql/12 -rf + +# backup postgresql 16 settings +# RUN mkdir /tmp/databk +# RUN cp /workspace/.pgsql/data/postgresql.conf /tmp/databk/postgresql.conf +# RUN cp /workspace/.pgsql/data/pg_hba.conf /tmp/databk/pg_hba.conf + +# create new data folder +RUN rm /workspace/.pgsql/data -rf +USER gitpod +RUN /usr/lib/postgresql/16/bin/initdb -D /workspace/.pgsql/data + +USER root + +# restore postgresql 16 settings +# RUN cp /tmp/databk/postgresql.conf /workspace/.pgsql/data/postgresql.conf +# RUN cp /tmp/databk/databk/pg_hba.conf /workspace/.pgsql/data/pg_hba.conf + +# remove postgresql 16 backup folder +# RUn rm /workspace/.pgsql/datapk -rf # remove PIP_USER environment USER gitpod From 851ca5cbb9f3de63739490d4708f1d536f6dce4c Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 21:38:17 -0500 Subject: [PATCH 21/25] update dockerfile --- .gitpod.Dockerfile | 150 ++++++++++++++++++++++++++++--------------- postgresql-hook.bash | 27 ++++++++ 2 files changed, 127 insertions(+), 50 deletions(-) create mode 100644 postgresql-hook.bash diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index ac7523e75..3590d7565 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,67 +1,117 @@ -FROM gitpod/workspace-postgres:latest +# https://github.com/gitpod-io/workspace-images/blob/main/chunks/tool-postgresql/Dockerfile +# FROM gitpod/workspace-base:latest +from gitpod/workspace-python:latest + +# Dazzle does not rebuild a layer until one of its lines are changed. Increase this counter to rebuild this layer. +ENV TRIGGER_REBUILD=4 +ENV PGWORKSPACE="/workspace/.pgsql" +ENV PGDATA="$PGWORKSPACE/data" + +# Install PostgreSQL +RUN sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \ + wget --quiet -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - && \ + echo "deb https://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list && \ + wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - && \ + sudo install-packages postgresql-16 postgresql-contrib-16 redis-server + +# Setup PostgreSQL server for user gitpod +ENV PATH="/usr/lib/postgresql/16/bin:$PATH" + +SHELL ["/usr/bin/bash", "-c"] +RUN PGDATA="${PGDATA//\/workspace/$HOME}" \ + && mkdir -p ~/.pg_ctl/bin ~/.pg_ctl/sockets $PGDATA \ + && initdb -D $PGDATA \ + && printf '#!/bin/bash\npg_ctl -D $PGDATA -l ~/.pg_ctl/log -o "-k ~/.pg_ctl/sockets" start\n' > ~/.pg_ctl/bin/pg_start \ + && printf '#!/bin/bash\npg_ctl -D $PGDATA -l ~/.pg_ctl/log -o "-k ~/.pg_ctl/sockets" stop\n' > ~/.pg_ctl/bin/pg_stop \ + && chmod +x ~/.pg_ctl/bin/* +ENV PATH="$HOME/.pg_ctl/bin:$PATH" +ENV DATABASE_URL="postgresql://gitpod@localhost" +ENV PGHOSTADDR="127.0.0.1" +ENV PGDATABASE="postgres" +COPY --chown=gitpod:gitpod postgresql-hook.bash $HOME/.bashrc.d/200-postgresql-launch + +# # RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 +# RUN pyenv install 3.12.3 && pyenv global 3.12.3 +# RUN pip install pipenv -SHELL ["/bin/bash", "-c"] +USER gitpod -RUN sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' \ - && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - +RUN if ! grep -q "export PIP_USER=no" "$HOME/.bashrc"; then printf '%s\n' "export PIP_USER=no" >> "$HOME/.bashrc"; fi +RUN echo "" >> $HOME/.bashrc +RUN echo "unset DATABASE_URL" >> $HOME/.bashrc +RUN echo "export DATABASE_URL" >> $HOME/.bashrc -# Add LLVM repository and key -RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - \ - && echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list -RUN sudo apt-get update \ - && sudo apt-get install -y redis-server postgresql \ - && sudo apt-get clean \ - && sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* +#### -# RUN sudo update-alternatives --set postgresql /usr/lib/postgresql/16/bin/postgres -# RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 -RUN pyenv install 3.12.3 && pyenv global 3.12.3 -RUN pip install pipenv +# FROM gitpod/workspace-postgres:latest -# Set up PostgreSQL 16 -USER postgres -RUN /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/data -RUN echo "host all all all md5" >> /var/lib/postgresql/16/data/pg_hba.conf -RUN echo "listen_addresses='*'" >> /var/lib/postgresql/16/data/postgresql.conf -RUN /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data start && \ - /usr/lib/postgresql/16/bin/psql -c "CREATE USER gitpod WITH PASSWORD 'gitpod';" && \ - /usr/lib/postgresql/16/bin/psql -c "ALTER USER gitpod WITH SUPERUSER;" && \ - /usr/lib/postgresql/16/bin/psql -c "CREATE DATABASE gitpod OWNER gitpod;" && \ - /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data stop +# SHELL ["/bin/bash", "-c"] -USER root +# RUN sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' \ +# && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - -# remove postgresql 12 -RUN rm /usr/lib/postgresql/12 -rf +# # Add LLVM repository and key +# RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - \ +# && echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list -# backup postgresql 16 settings -# RUN mkdir /tmp/databk -# RUN cp /workspace/.pgsql/data/postgresql.conf /tmp/databk/postgresql.conf -# RUN cp /workspace/.pgsql/data/pg_hba.conf /tmp/databk/pg_hba.conf +# # RUN sudo apt-get update \ +# # && sudo apt-get install -y redis-server postgresql \ +# # && sudo apt-get clean \ +# # && sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* -# create new data folder -RUN rm /workspace/.pgsql/data -rf -USER gitpod -RUN /usr/lib/postgresql/16/bin/initdb -D /workspace/.pgsql/data +# RUN sudo apt-get remove -y postgresql-12 && sudo apt-get autoremove -y +# RUN sudo install-packages redis-server postgresql postgresql-contrib -USER root +# # RUN sudo update-alternatives --set postgresql /usr/lib/postgresql/16/bin/postgres -# restore postgresql 16 settings -# RUN cp /tmp/databk/postgresql.conf /workspace/.pgsql/data/postgresql.conf -# RUN cp /tmp/databk/databk/pg_hba.conf /workspace/.pgsql/data/pg_hba.conf +# # RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 +# RUN pyenv install 3.12.3 && pyenv global 3.12.3 +# RUN pip install pipenv -# remove postgresql 16 backup folder -# RUn rm /workspace/.pgsql/datapk -rf +# # Set up PostgreSQL 16 +# USER postgres +# RUN /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/data +# RUN echo "host all all all md5" >> /var/lib/postgresql/16/data/pg_hba.conf +# RUN echo "listen_addresses='*'" >> /var/lib/postgresql/16/data/postgresql.conf +# RUN /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data start && \ +# /usr/lib/postgresql/16/bin/psql -c "CREATE USER gitpod WITH PASSWORD 'gitpod';" && \ +# /usr/lib/postgresql/16/bin/psql -c "ALTER USER gitpod WITH SUPERUSER;" && \ +# /usr/lib/postgresql/16/bin/psql -c "CREATE DATABASE gitpod OWNER gitpod;" && \ +# /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data stop -# remove PIP_USER environment -USER gitpod +# USER root -# Ensure PostgreSQL 16 is used -RUN echo "export PATH=/usr/lib/postgresql/16/bin:$PATH" >> /home/gitpod/.bashrc +# # remove postgresql 12 +# RUN rm /usr/lib/postgresql/12 -rf -RUN if ! grep -q "export PIP_USER=no" "$HOME/.bashrc"; then printf '%s\n' "export PIP_USER=no" >> "$HOME/.bashrc"; fi -RUN echo "" >> $HOME/.bashrc -RUN echo "unset DATABASE_URL" >> $HOME/.bashrc -RUN echo "export DATABASE_URL" >> $HOME/.bashrc +# # backup postgresql 16 settings +# # RUN mkdir /tmp/databk +# # RUN cp /workspace/.pgsql/data/postgresql.conf /tmp/databk/postgresql.conf +# # RUN cp /workspace/.pgsql/data/pg_hba.conf /tmp/databk/pg_hba.conf + +# # create new data folder +# RUN rm /workspace/.pgsql/data -rf +# USER gitpod +# RUN /usr/lib/postgresql/16/bin/initdb -D /workspace/.pgsql/data + +# USER root + +# # restore postgresql 16 settings +# # RUN cp /tmp/databk/postgresql.conf /workspace/.pgsql/data/postgresql.conf +# # RUN cp /tmp/databk/databk/pg_hba.conf /workspace/.pgsql/data/pg_hba.conf + +# # remove postgresql 16 backup folder +# # RUn rm /workspace/.pgsql/datapk -rf + +# # remove PIP_USER environment +# USER gitpod + +# # Ensure PostgreSQL 16 is used +# RUN echo "export PATH=/usr/lib/postgresql/16/bin:$PATH" >> /home/gitpod/.bashrc + +# RUN if ! grep -q "export PIP_USER=no" "$HOME/.bashrc"; then printf '%s\n' "export PIP_USER=no" >> "$HOME/.bashrc"; fi +# RUN echo "" >> $HOME/.bashrc +# RUN echo "unset DATABASE_URL" >> $HOME/.bashrc +# RUN echo "export DATABASE_URL" >> $HOME/.bashrc diff --git a/postgresql-hook.bash b/postgresql-hook.bash new file mode 100644 index 000000000..1e96ef217 --- /dev/null +++ b/postgresql-hook.bash @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Auto-start PostgreSQL server +( + if mkdir /tmp/.pgsql_lock 2>/dev/null; then { + target="${PGWORKSPACE}" + source="${target//\/workspace/$HOME}" + + if test -e "$source"; then { + + if test ! -e "$target"; then { + mv "$source" "$target" + }; fi + + if ! [[ "$(pg_ctl status)" =~ PID ]]; then { + printf 'INFO: %s\n' "Executing command: pg_start" + pg_start + trap "pg_stop" TERM EXIT + exec {sfd}<> <(:) + printf 'INFO: %s\n' \ + "Please create another terminal" \ + "this one is monitoring postgres server for gracefully shutting down when needed" + until read -r -t 3600 -u $sfd; do continue; done + }; fi + + }; fi + }; fi & +) From 0f20ff1518f1b562e32c9e473d4b44bcbdf73b48 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 21:48:09 -0500 Subject: [PATCH 22/25] change base image again --- .gitpod.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 3590d7565..5fa28e942 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,6 +1,6 @@ # https://github.com/gitpod-io/workspace-images/blob/main/chunks/tool-postgresql/Dockerfile # FROM gitpod/workspace-base:latest -from gitpod/workspace-python:latest +from gitpod/workspace-python-3.12 # Dazzle does not rebuild a layer until one of its lines are changed. Increase this counter to rebuild this layer. ENV TRIGGER_REBUILD=4 From 648cee5c1b439a268653098b6d3835602c338132 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 21:53:46 -0500 Subject: [PATCH 23/25] changes in yml --- .gitpod.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 40f3a62da..1231adc48 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -10,13 +10,13 @@ ports: tasks: - command: redis-server - init: | - pyenv global 3.12.3 && + # pyenv global 3.12.3 && python -m scripts.install && gp sync-done deps command: pyenv global 3.12.3 && pipenv run celery - init: gp sync-await deps command: > - pyenv global 3.12.3 && + # pyenv global 3.12.3 && (psql -U gitpod -c 'CREATE DATABASE breathecode;' || true) && (psql -U gitpod -c 'CREATE EXTENSION unaccent;' -d breathecode || true) && pipenv run migrate && From 4de33819ddc4a15c9233b9ddb19597488f29cff3 Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 22:01:49 -0500 Subject: [PATCH 24/25] changes in yml --- .gitpod.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 1231adc48..a819539e7 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -10,19 +10,17 @@ ports: tasks: - command: redis-server - init: | - # pyenv global 3.12.3 && python -m scripts.install && gp sync-done deps - command: pyenv global 3.12.3 && pipenv run celery + command: pipenv run celery - init: gp sync-await deps command: > - # pyenv global 3.12.3 && (psql -U gitpod -c 'CREATE DATABASE breathecode;' || true) && (psql -U gitpod -c 'CREATE EXTENSION unaccent;' -d breathecode || true) && - pipenv run migrate && - pipenv run python manage.py loaddata breathecode/*/fixtures/dev_*.json && - pipenv run python manage.py create_academy_roles && - pipenv run start; + CACHE=0 pipenv run migrate && + CACHE=0 pipenv run python manage.py loaddata breathecode/*/fixtures/dev_*.json && + CACHE=0 pipenv run python manage.py create_academy_roles && + CACHE=1 pipenv run start; - init: gp sync-await deps vscode: From 0afe689289f7fb337914a720b751938a14f643cd Mon Sep 17 00:00:00 2001 From: jefer94 Date: Thu, 5 Sep 2024 22:21:25 -0500 Subject: [PATCH 25/25] remove comments --- .gitpod.Dockerfile | 79 +--------------------------------------------- 1 file changed, 1 insertion(+), 78 deletions(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 5fa28e942..1b8598e06 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,6 +1,5 @@ # https://github.com/gitpod-io/workspace-images/blob/main/chunks/tool-postgresql/Dockerfile -# FROM gitpod/workspace-base:latest -from gitpod/workspace-python-3.12 +FROM gitpod/workspace-python-3.12 # Dazzle does not rebuild a layer until one of its lines are changed. Increase this counter to rebuild this layer. ENV TRIGGER_REBUILD=4 @@ -30,7 +29,6 @@ ENV PGHOSTADDR="127.0.0.1" ENV PGDATABASE="postgres" COPY --chown=gitpod:gitpod postgresql-hook.bash $HOME/.bashrc.d/200-postgresql-launch -# # RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 # RUN pyenv install 3.12.3 && pyenv global 3.12.3 # RUN pip install pipenv @@ -40,78 +38,3 @@ RUN if ! grep -q "export PIP_USER=no" "$HOME/.bashrc"; then printf '%s\n' "expor RUN echo "" >> $HOME/.bashrc RUN echo "unset DATABASE_URL" >> $HOME/.bashrc RUN echo "export DATABASE_URL" >> $HOME/.bashrc - - -#### - - -# FROM gitpod/workspace-postgres:latest - -# SHELL ["/bin/bash", "-c"] - -# RUN sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' \ -# && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - - -# # Add LLVM repository and key -# RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - \ -# && echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list - -# # RUN sudo apt-get update \ -# # && sudo apt-get install -y redis-server postgresql \ -# # && sudo apt-get clean \ -# # && sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* - -# RUN sudo apt-get remove -y postgresql-12 && sudo apt-get autoremove -y -# RUN sudo install-packages redis-server postgresql postgresql-contrib - -# # RUN sudo update-alternatives --set postgresql /usr/lib/postgresql/16/bin/postgres - -# # RUN pyenv update && pyenv install 3.12.3 && pyenv global 3.12.3 -# RUN pyenv install 3.12.3 && pyenv global 3.12.3 -# RUN pip install pipenv - -# # Set up PostgreSQL 16 -# USER postgres -# RUN /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/data -# RUN echo "host all all all md5" >> /var/lib/postgresql/16/data/pg_hba.conf -# RUN echo "listen_addresses='*'" >> /var/lib/postgresql/16/data/postgresql.conf -# RUN /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data start && \ -# /usr/lib/postgresql/16/bin/psql -c "CREATE USER gitpod WITH PASSWORD 'gitpod';" && \ -# /usr/lib/postgresql/16/bin/psql -c "ALTER USER gitpod WITH SUPERUSER;" && \ -# /usr/lib/postgresql/16/bin/psql -c "CREATE DATABASE gitpod OWNER gitpod;" && \ -# /usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/16/data stop - -# USER root - -# # remove postgresql 12 -# RUN rm /usr/lib/postgresql/12 -rf - -# # backup postgresql 16 settings -# # RUN mkdir /tmp/databk -# # RUN cp /workspace/.pgsql/data/postgresql.conf /tmp/databk/postgresql.conf -# # RUN cp /workspace/.pgsql/data/pg_hba.conf /tmp/databk/pg_hba.conf - -# # create new data folder -# RUN rm /workspace/.pgsql/data -rf -# USER gitpod -# RUN /usr/lib/postgresql/16/bin/initdb -D /workspace/.pgsql/data - -# USER root - -# # restore postgresql 16 settings -# # RUN cp /tmp/databk/postgresql.conf /workspace/.pgsql/data/postgresql.conf -# # RUN cp /tmp/databk/databk/pg_hba.conf /workspace/.pgsql/data/pg_hba.conf - -# # remove postgresql 16 backup folder -# # RUn rm /workspace/.pgsql/datapk -rf - -# # remove PIP_USER environment -# USER gitpod - -# # Ensure PostgreSQL 16 is used -# RUN echo "export PATH=/usr/lib/postgresql/16/bin:$PATH" >> /home/gitpod/.bashrc - -# RUN if ! grep -q "export PIP_USER=no" "$HOME/.bashrc"; then printf '%s\n' "export PIP_USER=no" >> "$HOME/.bashrc"; fi -# RUN echo "" >> $HOME/.bashrc -# RUN echo "unset DATABASE_URL" >> $HOME/.bashrc -# RUN echo "export DATABASE_URL" >> $HOME/.bashrc