From dd0c33f792957b1cd4cc080c0d0346b641f5aee9 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Fri, 3 May 2024 21:04:14 +0500 Subject: [PATCH 01/23] Use custom user model from users app --- app/src/bittensor_panel/settings.py | 3 ++ app/src/bittensor_panel/users/__init__.py | 0 app/src/bittensor_panel/users/admin.py | 5 +++ app/src/bittensor_panel/users/apps.py | 6 +++ .../users/migrations/0001_initial.py | 44 +++++++++++++++++++ .../users/migrations/__init__.py | 0 app/src/bittensor_panel/users/models.py | 5 +++ app/src/bittensor_panel/users/tests.py | 3 ++ app/src/bittensor_panel/users/views.py | 3 ++ 9 files changed, 69 insertions(+) create mode 100644 app/src/bittensor_panel/users/__init__.py create mode 100644 app/src/bittensor_panel/users/admin.py create mode 100644 app/src/bittensor_panel/users/apps.py create mode 100644 app/src/bittensor_panel/users/migrations/0001_initial.py create mode 100644 app/src/bittensor_panel/users/migrations/__init__.py create mode 100644 app/src/bittensor_panel/users/models.py create mode 100644 app/src/bittensor_panel/users/tests.py create mode 100644 app/src/bittensor_panel/users/views.py diff --git a/app/src/bittensor_panel/settings.py b/app/src/bittensor_panel/settings.py index 61dc605..410f579 100644 --- a/app/src/bittensor_panel/settings.py +++ b/app/src/bittensor_panel/settings.py @@ -66,6 +66,7 @@ def wrapped(*args, **kwargs): "django_probes", "django_structlog", "constance", + "bittensor_panel.users", "bittensor_panel.core", ] @@ -155,6 +156,8 @@ def wrapped(*args, **kwargs): DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +AUTH_USER_MODEL = "users.User" + AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", diff --git a/app/src/bittensor_panel/users/__init__.py b/app/src/bittensor_panel/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/src/bittensor_panel/users/admin.py b/app/src/bittensor_panel/users/admin.py new file mode 100644 index 0000000..c444238 --- /dev/null +++ b/app/src/bittensor_panel/users/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + +from .models import User + +admin.site.register(User) diff --git a/app/src/bittensor_panel/users/apps.py b/app/src/bittensor_panel/users/apps.py new file mode 100644 index 0000000..3014754 --- /dev/null +++ b/app/src/bittensor_panel/users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'bittensor_panel.users' diff --git a/app/src/bittensor_panel/users/migrations/0001_initial.py b/app/src/bittensor_panel/users/migrations/0001_initial.py new file mode 100644 index 0000000..8e12873 --- /dev/null +++ b/app/src/bittensor_panel/users/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2.11 on 2024-05-03 16:03 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/app/src/bittensor_panel/users/migrations/__init__.py b/app/src/bittensor_panel/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/src/bittensor_panel/users/models.py b/app/src/bittensor_panel/users/models.py new file mode 100644 index 0000000..3d30525 --- /dev/null +++ b/app/src/bittensor_panel/users/models.py @@ -0,0 +1,5 @@ +from django.contrib.auth.models import AbstractUser + + +class User(AbstractUser): + pass diff --git a/app/src/bittensor_panel/users/tests.py b/app/src/bittensor_panel/users/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/app/src/bittensor_panel/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/app/src/bittensor_panel/users/views.py b/app/src/bittensor_panel/users/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/app/src/bittensor_panel/users/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From 2776c35892b5f2c918c5cc2350e23dae95d4249a Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Fri, 3 May 2024 21:13:24 +0500 Subject: [PATCH 02/23] Clean & lint --- app/envs/prod/gunicorn.conf.py | 3 - app/src/bittensor_panel/asgi.py | 3 - app/src/bittensor_panel/celery.py | 5 +- .../bittensor_panel/core/tests/settings.py | 1 - app/src/bittensor_panel/settings.py | 2 +- app/src/bittensor_panel/urls.py | 1 - app/src/bittensor_panel/users/apps.py | 4 +- .../users/migrations/0001_initial.py | 92 ++++++++++++++----- app/src/bittensor_panel/users/tests.py | 3 - app/src/bittensor_panel/users/views.py | 3 - bin/emailhelper.py | 7 +- 11 files changed, 80 insertions(+), 44 deletions(-) delete mode 100644 app/src/bittensor_panel/users/tests.py delete mode 100644 app/src/bittensor_panel/users/views.py diff --git a/app/envs/prod/gunicorn.conf.py b/app/envs/prod/gunicorn.conf.py index 4eed1cb..fdc70d5 100644 --- a/app/envs/prod/gunicorn.conf.py +++ b/app/envs/prod/gunicorn.conf.py @@ -4,6 +4,3 @@ bind = "0.0.0.0:8000" wsgi_app = "bittensor_panel.wsgi:application" access_logfile = "-" - - - diff --git a/app/src/bittensor_panel/asgi.py b/app/src/bittensor_panel/asgi.py index e869d08..96cbdd8 100644 --- a/app/src/bittensor_panel/asgi.py +++ b/app/src/bittensor_panel/asgi.py @@ -1,9 +1,6 @@ import os - from django.core.asgi import get_asgi_application - - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bittensor_panel.settings") application = get_asgi_application() diff --git a/app/src/bittensor_panel/celery.py b/app/src/bittensor_panel/celery.py index 204ec00..ff42512 100644 --- a/app/src/bittensor_panel/celery.py +++ b/app/src/bittensor_panel/celery.py @@ -1,8 +1,11 @@ import logging import os -from celery import Celeryfrom django.conf import settings +from celery import Celery +from celery.signals import setup_logging +from django.conf import settings from django_structlog.celery.steps import DjangoStructLogInitStep + from .settings import configure_structlog os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bittensor_panel.settings") diff --git a/app/src/bittensor_panel/core/tests/settings.py b/app/src/bittensor_panel/core/tests/settings.py index a105923..275c43a 100644 --- a/app/src/bittensor_panel/core/tests/settings.py +++ b/app/src/bittensor_panel/core/tests/settings.py @@ -3,4 +3,3 @@ os.environ["DEBUG_TOOLBAR"] = "False" from bittensor_panel.settings import * # noqa: E402,F403 - diff --git a/app/src/bittensor_panel/settings.py b/app/src/bittensor_panel/settings.py index 410f579..ec012aa 100644 --- a/app/src/bittensor_panel/settings.py +++ b/app/src/bittensor_panel/settings.py @@ -197,7 +197,7 @@ def wrapped(*args, **kwargs): SECURE_SSL_REDIRECT = False CONSTANCE_BACKEND = "constance.backends.database.DatabaseBackend" -CONSTANCE_CONFIG = { +CONSTANCE_CONFIG: dict[str, tuple[str, str, str]] = { # "PARAMETER": (default-value, "Help text", type), } diff --git a/app/src/bittensor_panel/urls.py b/app/src/bittensor_panel/urls.py index 8fce2ae..6113a46 100644 --- a/app/src/bittensor_panel/urls.py +++ b/app/src/bittensor_panel/urls.py @@ -2,7 +2,6 @@ from django.contrib.admin.sites import site from django.urls import include, path - urlpatterns = [ path("admin/", site.urls), path("", include("django.contrib.auth.urls")), diff --git a/app/src/bittensor_panel/users/apps.py b/app/src/bittensor_panel/users/apps.py index 3014754..d3f38b4 100644 --- a/app/src/bittensor_panel/users/apps.py +++ b/app/src/bittensor_panel/users/apps.py @@ -2,5 +2,5 @@ class UsersConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'bittensor_panel.users' + default_auto_field = "django.db.models.BigAutoField" + name = "bittensor_panel.users" diff --git a/app/src/bittensor_panel/users/migrations/0001_initial.py b/app/src/bittensor_panel/users/migrations/0001_initial.py index 8e12873..40cf41b 100644 --- a/app/src/bittensor_panel/users/migrations/0001_initial.py +++ b/app/src/bittensor_panel/users/migrations/0001_initial.py @@ -2,43 +2,93 @@ import django.contrib.auth.models import django.contrib.auth.validators -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): - initial = True dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), + ("auth", "0012_alter_user_first_name_max_length"), ] operations = [ migrations.CreateModel( - name='User', + name="User", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("password", models.CharField(max_length=128, verbose_name="password")), + ("last_login", models.DateTimeField(blank=True, null=True, verbose_name="last login")), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + error_messages={"unique": "A user with that username already exists."}, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], + verbose_name="username", + ), + ), + ("first_name", models.CharField(blank=True, max_length=150, verbose_name="first name")), + ("last_name", models.CharField(blank=True, max_length=150, verbose_name="last name")), + ("email", models.EmailField(blank=True, max_length=254, verbose_name="email address")), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ("date_joined", models.DateTimeField(default=django.utils.timezone.now, verbose_name="date joined")), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.group", + verbose_name="groups", + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.permission", + verbose_name="user permissions", + ), + ), ], options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, }, managers=[ - ('objects', django.contrib.auth.models.UserManager()), + ("objects", django.contrib.auth.models.UserManager()), ], ), ] diff --git a/app/src/bittensor_panel/users/tests.py b/app/src/bittensor_panel/users/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/app/src/bittensor_panel/users/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/app/src/bittensor_panel/users/views.py b/app/src/bittensor_panel/users/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/app/src/bittensor_panel/users/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/bin/emailhelper.py b/bin/emailhelper.py index 9bc8d43..4b85da2 100755 --- a/bin/emailhelper.py +++ b/bin/emailhelper.py @@ -30,10 +30,7 @@ def send(self, addr_from, addr_to, subject, message, files=tuple()): with open(file, "rb") as stream: part.set_payload(stream.read()) encoders.encode_base64(part) - part.add_header( - "Content-Disposition", - 'attachment; filename="%s"' % os.path.basename(file), - ) + part.add_header("Content-Disposition", f'attachment; filename="{os.path.basename(file)}"') msg.attach(part) s = smtplib.SMTP(self.server, self.port) @@ -86,7 +83,7 @@ def parse_arguments(): sys.exit(2) try: - email_creds = urlsplit("//%s" % email_creds) + email_creds = urlsplit(f"//{email_creds}") if not all([email_creds.username, email_creds.hostname, email_creds.port]): raise ValueError except ValueError: From 0abfedd0e9cb12a397b41a62864c21c42bd45980 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sat, 4 May 2024 01:48:36 +0500 Subject: [PATCH 03/23] Add HyperParameter model, admin --- app/src/bittensor_panel/core/admin.py | 13 ++++++++++ .../core/migrations/0001_initial.py | 24 +++++++++++++++++++ .../core/migrations/__init__.py | 0 app/src/bittensor_panel/core/models.py | 7 ++++++ 4 files changed, 44 insertions(+) create mode 100644 app/src/bittensor_panel/core/migrations/0001_initial.py create mode 100644 app/src/bittensor_panel/core/migrations/__init__.py diff --git a/app/src/bittensor_panel/core/admin.py b/app/src/bittensor_panel/core/admin.py index e5bc44e..9ed3483 100644 --- a/app/src/bittensor_panel/core/admin.py +++ b/app/src/bittensor_panel/core/admin.py @@ -1,6 +1,19 @@ from django.contrib import admin # noqa from django.contrib.admin import register # noqa +from .models import HyperParameter + + +@register(HyperParameter) +class HyperParameterAdmin(admin.ModelAdmin): + list_display = ["name", "value", "created_at", "updated_at"] + + def has_add_permission(self, request): + return False + + def has_delete_permission(self, request, obj=None): + return False + admin.site.site_header = "Bittensor Administration Panel" admin.site.site_title = "Bittensor Administration Panel" diff --git a/app/src/bittensor_panel/core/migrations/0001_initial.py b/app/src/bittensor_panel/core/migrations/0001_initial.py new file mode 100644 index 0000000..00c04ac --- /dev/null +++ b/app/src/bittensor_panel/core/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.11 on 2024-05-03 20:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='HyperParameter', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=255, unique=True)), + ('value', models.IntegerField()), + ], + ), + ] diff --git a/app/src/bittensor_panel/core/migrations/__init__.py b/app/src/bittensor_panel/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/src/bittensor_panel/core/models.py b/app/src/bittensor_panel/core/models.py index 2f0a416..9fd6a64 100644 --- a/app/src/bittensor_panel/core/models.py +++ b/app/src/bittensor_panel/core/models.py @@ -1 +1,8 @@ from django.db import models # noqa + + +class HyperParameter(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + name = models.CharField(max_length=255, unique=True) + value = models.IntegerField() From 8ddbc05cac474b784867064d1f2d98d67fee3ac8 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sat, 4 May 2024 01:53:13 +0500 Subject: [PATCH 04/23] Add bittensor dependency --- pdm.lock | 1200 +++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 3 +- 2 files changed, 1188 insertions(+), 15 deletions(-) diff --git a/pdm.lock b/pdm.lock index 6c96e19..ee1d795 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,53 @@ groups = ["default", "lint", "security_check", "test", "type_check"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:79691e9955cbcb2d7a461380daebf16c6f4167a02d6817f15ad85d855cd6101c" +content_hash = "sha256:671249e99841dd1d51d9e98aa4861963c1c5bbb8fe0d37540193fd280209e8c8" + +[[package]] +name = "aiohttp" +version = "3.9.0b0" +requires_python = ">=3.8" +summary = "Async http client/server framework (asyncio)" +groups = ["default"] +dependencies = [ + "aiosignal>=1.1.2", + "attrs>=17.3.0", + "frozenlist>=1.1.1", + "multidict<7.0,>=4.5", + "yarl<2.0,>=1.0", +] +files = [ + {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:94197a77859ab1039b9ca6c3c393b8e7b5fc34a9abfbcb58daac38ab89684a99"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c78d2cfe1515cfb31ba67edf0518c6677a963ec2039b652b03a886733e72e65"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28b38a14f564c833e59c99f748b48803e4babeabc6a0307952b01e6c8d642cab"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e596cfc52380f71e197e7cf0e2d3c4714b4bf66d2d562cdbd5442284bac18909"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6190951b7933c834d9346e21c5a81642caa210d291cda4036daf85fc53162d35"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb0cb2cbf95cf4cc40307d0d0187f59c4b86b1d7d1a624922a7d0b046deffba7"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e27c283e21e94fa1582d31b57c514b87ab609882ade413ce43f585d73c8a33fc"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6826c59b4e99673728bcdaecacbd699b7521f17ca165c63a5e26e23d42aeea5"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aa4738f3b1b916b1cc69ed3d1dead9714919dc4d30ae0d5f6d55eadb2c511133"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b2abd7936f687de3a3ab199b145a9de01ed046eb5640cd66f47da07a9050a78"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:652cc00a97bc206c470db06276ce57ff2a53a625795bbce8435ef8b6a4cb0113"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d54529c1d95d5d200ecb7133a343785e5661a804f3dcee090a7bca3b48189d69"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:324fe990c97721ea8eb4d439f12b59d1a93cd7e0dd188c7b145bffdfbd327dc3"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-win32.whl", hash = "sha256:3a2ef8318435f40f5906af36fda20b5432e07e6a7e05de3a4d2934c25320b8ff"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-win_amd64.whl", hash = "sha256:887d8757aafc7f6fbda76faaff21fc2aa31b9dca0911ecd6b60b0fe922a2abfc"}, + {file = "aiohttp-3.9.0b0.tar.gz", hash = "sha256:cecc64fd7bae6debdf43437e3c83183c40d4f4d86486946f412c113960598eee"}, +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +requires_python = ">=3.7" +summary = "aiosignal: a list of registered asynchronous callbacks" +groups = ["default"] +dependencies = [ + "frozenlist>=1.1.0", +] +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] [[package]] name = "amqp" @@ -21,6 +67,66 @@ files = [ {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, ] +[[package]] +name = "ansible" +version = "6.7.0" +requires_python = ">=3.8" +summary = "Radically simple IT automation" +groups = ["default"] +dependencies = [ + "ansible-core~=2.13.7", +] +files = [ + {file = "ansible-6.7.0-py3-none-any.whl", hash = "sha256:3cda6e67b1d42516f64ce376bb94c5186ff33d215d155432be5b3c2ec60bf112"}, + {file = "ansible-6.7.0.tar.gz", hash = "sha256:c188f3ac8a8583794aadcff0bea87895ead58c19d6f244cd0c342562706e176c"}, +] + +[[package]] +name = "ansible-core" +version = "2.13.13" +requires_python = ">=3.8" +summary = "Radically simple IT automation" +groups = ["default"] +dependencies = [ + "PyYAML>=5.1", + "cryptography", + "jinja2>=3.0.0", + "packaging", + "resolvelib<0.9.0,>=0.5.3", +] +files = [ + {file = "ansible-core-2.13.13.tar.gz", hash = "sha256:7ad2d8c0a5fa4a59de1809a5f96d2dbf511189c834116f5c72aec9730b51074b"}, + {file = "ansible_core-2.13.13-py3-none-any.whl", hash = "sha256:f50220254b8e13a79b68e68e759f5bf89f3f3584c907737985a017c699b1c3b6"}, +] + +[[package]] +name = "ansible-vault" +version = "2.1.0" +summary = "R/W an ansible-vault yaml file" +groups = ["default"] +dependencies = [ + "ansible", + "setuptools", +] +files = [ + {file = "ansible-vault-2.1.0.tar.gz", hash = "sha256:5ce8fdb5470f1449b76bf07ae2abc56480dad48356ae405c85b686efb64dbd5e"}, +] + +[[package]] +name = "anyio" +version = "4.3.0" +requires_python = ">=3.8" +summary = "High level compatibility layer for multiple asynchronous event loop implementations" +groups = ["default"] +dependencies = [ + "idna>=2.8", + "sniffio>=1.1", +] +files = [ + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, +] + [[package]] name = "appnope" version = "0.1.4" @@ -80,6 +186,17 @@ files = [ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] +[[package]] +name = "attrs" +version = "23.2.0" +requires_python = ">=3.7" +summary = "Classes Without Boilerplate" +groups = ["default"] +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + [[package]] name = "backcall" version = "0.2.0" @@ -90,6 +207,17 @@ files = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] +[[package]] +name = "backoff" +version = "2.2.1" +requires_python = ">=3.7,<4.0" +summary = "Function decoration for backoff and retry" +groups = ["default"] +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + [[package]] name = "bandit" version = "1.7.8" @@ -107,6 +235,17 @@ files = [ {file = "bandit-1.7.8.tar.gz", hash = "sha256:36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"}, ] +[[package]] +name = "base58" +version = "2.1.1" +requires_python = ">=3.5" +summary = "Base58 and Base58Check implementation." +groups = ["default"] +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + [[package]] name = "billiard" version = "4.2.0" @@ -118,6 +257,75 @@ files = [ {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, ] +[[package]] +name = "bittensor" +version = "7.0.0" +requires_python = ">=3.8" +git = "https://github.com/opentensor/bittensor.git" +ref = "merge_cuda" +revision = "d9d1a49ff953a1a676d13e11411825979da75852" +summary = "bittensor" +groups = ["default"] +dependencies = [ + "PyNaCl<=1.5.0,>=1.3.0", + "aiohttp==3.9.0b0", + "ansible-vault==2.1.0", + "ansible==6.7.0", + "backoff", + "black==23.7.0", + "colorama==0.4.6", + "cryptography==42.0.0", + "ddt==1.6.0", + "fastapi==0.110.1", + "fuzzywuzzy>=0.18.0", + "msgpack-numpy-opentensor==0.5.0", + "munch==2.5.0", + "nest-asyncio", + "netaddr", + "numpy", + "password-strength", + "pycryptodome<4.0.0,>=3.18.0", + "pydantic!=1.8,!=1.8.1,<2.0.0,>=1.7.4", + "pytest", + "pytest-asyncio", + "python-Levenshtein", + "python-statemachine==2.1.2", + "pyyaml", + "requests", + "retry", + "rich", + "scalecodec==1.2.7", + "shtab==1.6.5", + "substrate-interface==1.7.5", + "termcolor", + "tqdm", + "uvicorn==0.22.0", + "wheel", +] + +[[package]] +name = "black" +version = "23.7.0" +requires_python = ">=3.8" +summary = "The uncompromising code formatter." +groups = ["default"] +dependencies = [ + "click>=8.0.0", + "mypy-extensions>=0.4.3", + "packaging>=22.0", + "pathspec>=0.9.0", + "platformdirs>=2", +] +files = [ + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, +] + [[package]] name = "celery" version = "5.3.6" @@ -151,12 +359,36 @@ files = [ {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] +[[package]] +name = "cffi" +version = "1.16.0" +requires_python = ">=3.8" +summary = "Foreign Function Interface for Python calling C code." +groups = ["default"] +dependencies = [ + "pycparser", +] +files = [ + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + [[package]] name = "charset-normalizer" version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["type_check"] +groups = ["default", "type_check"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, @@ -265,7 +497,6 @@ version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." groups = ["default", "security_check", "test"] -marker = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -285,6 +516,108 @@ files = [ {file = "colorlog-6.8.2.tar.gz", hash = "sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44"}, ] +[[package]] +name = "cryptography" +version = "42.0.0" +requires_python = ">=3.7" +summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +groups = ["default"] +dependencies = [ + "cffi>=1.12; platform_python_implementation != \"PyPy\"", +] +files = [ + {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434"}, + {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc"}, + {file = "cryptography-42.0.0-cp37-abi3-win32.whl", hash = "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4"}, + {file = "cryptography-42.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0"}, + {file = "cryptography-42.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221"}, + {file = "cryptography-42.0.0-cp39-abi3-win32.whl", hash = "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b"}, + {file = "cryptography-42.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce"}, + {file = "cryptography-42.0.0.tar.gz", hash = "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4"}, +] + +[[package]] +name = "cytoolz" +version = "0.12.3" +requires_python = ">=3.7" +summary = "Cython implementation of Toolz: High performance functional utilities" +groups = ["default"] +marker = "implementation_name == \"cpython\"" +dependencies = [ + "toolz>=0.8.0", +] +files = [ + {file = "cytoolz-0.12.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ac4f2fb38bbc67ff1875b7d2f0f162a247f43bd28eb7c9d15e6175a982e558d"}, + {file = "cytoolz-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cf1e1e96dd86829a0539baf514a9c8473a58fbb415f92401a68e8e52a34ecd5"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a438701c6141dd34eaf92e9e9a1f66e23a22f7840ef8a371eba274477de85d"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b6f11b0d7ed91be53166aeef2a23a799e636625675bb30818f47f41ad31821"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fde09384d23048a7b4ac889063761e44b89a0b64015393e2d1d21d5c1f534a"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d3bfe45173cc8e6c76206be3a916d8bfd2214fb2965563e288088012f1dabfc"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27513a5d5b6624372d63313574381d3217a66e7a2626b056c695179623a5cb1a"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d294e5e81ff094fe920fd545052ff30838ea49f9e91227a55ecd9f3ca19774a0"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:727b01a2004ddb513496507a695e19b5c0cfebcdfcc68349d3efd92a1c297bf4"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:fe1e1779a39dbe83f13886d2b4b02f8c4b10755e3c8d9a89b630395f49f4f406"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:de74ef266e2679c3bf8b5fc20cee4fc0271ba13ae0d9097b1491c7a9bcadb389"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e04d22049233394e0b08193aca9737200b4a2afa28659d957327aa780ddddf2"}, + {file = "cytoolz-0.12.3-cp311-cp311-win32.whl", hash = "sha256:20d36430d8ac809186736fda735ee7d595b6242bdb35f69b598ef809ebfa5605"}, + {file = "cytoolz-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:780c06110f383344d537f48d9010d79fa4f75070d214fc47f389357dd4f010b6"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:55f9bd1ae6c2a27eda5abe2a0b65a83029d2385c5a1da7b8ef47af5905d7e905"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2d271393c378282727f1231d40391ae93b93ddc0997448acc21dd0cb6a1e56d"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee98968d6a66ee83a8ceabf31182189ab5d8598998c8ce69b6d5843daeb2db60"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01cfb8518828c1189200c02a5010ea404407fb18fd5589e29c126e84bbeadd36"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:456395d7aec01db32bf9e6db191d667347c78d8d48e77234521fa1078f60dabb"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cd88028bb897fba99ddd84f253ca6bef73ecb7bdf3f3cf25bc493f8f97d3c7c5"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b19223e7f7bd7a73ec3aa6fdfb73b579ff09c2bc0b7d26857eec2d01a58c76"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a79d72b08048a0980a59457c239555f111ac0c8bdc140c91a025f124104dbb4"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd70141b32b717696a72b8876e86bc9c6f8eff995c1808e299db3541213ff82"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a1445c91009eb775d479e88954c51d0b4cf9a1e8ce3c503c2672d17252882647"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ca6a9a9300d5bda417d9090107c6d2b007683efc59d63cc09aca0e7930a08a85"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be6feb903d2a08a4ba2e70e950e862fd3be9be9a588b7c38cee4728150a52918"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b6f43f086e5a965d33d62a145ae121b4ccb6e0789ac0acc895ce084fec8c65"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:534fa66db8564d9b13872d81d54b6b09ae592c585eb826aac235bd6f1830f8ad"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:fea649f979def23150680de1bd1d09682da3b54932800a0f90f29fc2a6c98ba8"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a447247ed312dd64e3a8d9483841ecc5338ee26d6e6fbd29cd373ed030db0240"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba3f843aa89f35467b38c398ae5b980a824fdbdb94065adc6ec7c47a0a22f4c7"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:582c22f97a380211fb36a7b65b1beeb84ea11d82015fa84b054be78580390082"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47feb089506fc66e1593cd9ade3945693a9d089a445fbe9a11385cab200b9f22"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ba9002d2f043943744a9dc8e50a47362bcb6e6f360dc0a1abcb19642584d87bb"}, + {file = "cytoolz-0.12.3.tar.gz", hash = "sha256:4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282"}, +] + +[[package]] +name = "ddt" +version = "1.6.0" +summary = "Data-Driven/Decorated Tests" +groups = ["default"] +files = [ + {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, + {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, +] + [[package]] name = "decorator" version = "5.1.1" @@ -560,6 +893,74 @@ files = [ {file = "djangorestframework_stubs-3.15.0.tar.gz", hash = "sha256:f60ee1c80abb01a77acc0169969e07c45c2739ae64667b9a0dd4a2e32697dcab"}, ] +[[package]] +name = "ecdsa" +version = "0.19.0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" +summary = "ECDSA cryptographic signature library (pure python)" +groups = ["default"] +dependencies = [ + "six>=1.9.0", +] +files = [ + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, +] + +[[package]] +name = "eth-hash" +version = "0.7.0" +requires_python = ">=3.8, <4" +summary = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +groups = ["default"] +files = [ + {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, + {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, +] + +[[package]] +name = "eth-keys" +version = "0.5.1" +requires_python = "<4,>=3.8" +summary = "eth-keys: Common API for Ethereum key operations" +groups = ["default"] +dependencies = [ + "eth-typing>=3", + "eth-utils>=2", +] +files = [ + {file = "eth_keys-0.5.1-py3-none-any.whl", hash = "sha256:ad13d920a2217a49bed3a1a7f54fb0980f53caf86d3bbab2139fd3330a17b97e"}, + {file = "eth_keys-0.5.1.tar.gz", hash = "sha256:2b587e4bbb9ac2195215a7ab0c0fb16042b17d4ec50240ed670bbb8f53da7a48"}, +] + +[[package]] +name = "eth-typing" +version = "4.2.2" +requires_python = "<4,>=3.8" +summary = "eth-typing: Common type annotations for ethereum python packages" +groups = ["default"] +files = [ + {file = "eth_typing-4.2.2-py3-none-any.whl", hash = "sha256:2d23c44b78b1740ee881aa5c440a05a5e311ca44d1defa18a334e733df46ff3f"}, + {file = "eth_typing-4.2.2.tar.gz", hash = "sha256:051ab9783e350668487ffc635b19666e7ca4d6c7e572800ed3961cbe0a937772"}, +] + +[[package]] +name = "eth-utils" +version = "2.3.1" +requires_python = ">=3.7,<4" +summary = "eth-utils: Common utility functions for python code that interacts with Ethereum" +groups = ["default"] +dependencies = [ + "cytoolz>=0.10.1; implementation_name == \"cpython\"", + "eth-hash>=0.3.1", + "eth-typing>=3.0.0", + "toolz>0.8.2; implementation_name == \"pypy\"", +] +files = [ + {file = "eth-utils-2.3.1.tar.gz", hash = "sha256:56a969b0536d4969dcb27e580521de35abf2dbed8b1bf072b5c80770c4324e27"}, + {file = "eth_utils-2.3.1-py3-none-any.whl", hash = "sha256:614eedc5ffcaf4e6708ca39e23b12bd69526a312068c1170c773bd1307d13972"}, +] + [[package]] name = "execnet" version = "2.1.1" @@ -582,6 +983,22 @@ files = [ {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] +[[package]] +name = "fastapi" +version = "0.110.1" +requires_python = ">=3.8" +summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +groups = ["default"] +dependencies = [ + "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", + "starlette<0.38.0,>=0.37.2", + "typing-extensions>=4.8.0", +] +files = [ + {file = "fastapi-0.110.1-py3-none-any.whl", hash = "sha256:5df913203c482f820d31f48e635e022f8cbfe7350e4830ef05a3163925b1addc"}, + {file = "fastapi-0.110.1.tar.gz", hash = "sha256:6feac43ec359dfe4f45b2c18ec8c94edb8dc2dfc461d417d9e626590c071baad"}, +] + [[package]] name = "filelock" version = "3.14.0" @@ -607,6 +1024,42 @@ files = [ {file = "freezegun-1.5.0.tar.gz", hash = "sha256:200a64359b363aa3653d8aac289584078386c7c3da77339d257e46a01fb5c77c"}, ] +[[package]] +name = "frozenlist" +version = "1.4.1" +requires_python = ">=3.8" +summary = "A list-like structure which implements collections.abc.MutableSequence" +groups = ["default"] +files = [ + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fuzzywuzzy" +version = "0.18.0" +summary = "Fuzzy string matching in python" +groups = ["default"] +files = [ + {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, + {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, +] + [[package]] name = "gunicorn" version = "20.1.0" @@ -621,12 +1074,23 @@ files = [ {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, ] +[[package]] +name = "h11" +version = "0.14.0" +requires_python = ">=3.7" +summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +groups = ["default"] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "idna" version = "3.7" requires_python = ">=3.5" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["type_check"] +groups = ["default", "type_check"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -637,7 +1101,7 @@ name = "iniconfig" version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" -groups = ["test"] +groups = ["default", "test"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -697,6 +1161,20 @@ files = [ {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] +[[package]] +name = "jinja2" +version = "3.1.3" +requires_python = ">=3.7" +summary = "A very fast and expressive template engine." +groups = ["default"] +dependencies = [ + "MarkupSafe>=2.0", +] +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + [[package]] name = "kombu" version = "5.3.7" @@ -712,12 +1190,51 @@ files = [ {file = "kombu-5.3.7.tar.gz", hash = "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf"}, ] +[[package]] +name = "levenshtein" +version = "0.25.1" +requires_python = ">=3.8" +summary = "Python extension for computing string edit distances and similarities." +groups = ["default"] +dependencies = [ + "rapidfuzz<4.0.0,>=3.8.0", +] +files = [ + {file = "Levenshtein-0.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f57d9cf06dac55c2d2f01f0d06e32acc074ab9a902921dc8fddccfb385053ad5"}, + {file = "Levenshtein-0.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:22b60c6d791f4ca67a3686b557ddb2a48de203dae5214f220f9dddaab17f44bb"}, + {file = "Levenshtein-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d0444ee62eccf1e6cedc7c5bc01a9face6ff70cc8afa3f3ca9340e4e16f601a4"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e8758be8221a274c83924bae8dd8f42041792565a3c3bdd3c10e3f9b4a5f94e"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:147221cfb1d03ed81d22fdd2a4c7fc2112062941b689e027a30d2b75bbced4a3"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a454d5bc4f4a289f5471418788517cc122fcc00d5a8aba78c54d7984840655a2"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c25f3778bbac78286bef2df0ca80f50517b42b951af0a5ddaec514412f79fac"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:181486cf465aff934694cc9a19f3898a1d28025a9a5f80fc1608217e7cd1c799"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8db9f672a5d150706648b37b044dba61f36ab7216c6a121cebbb2899d7dfaa3"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f2a69fe5ddea586d439f9a50d0c51952982f6c0db0e3573b167aa17e6d1dfc48"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3b684675a3bd35efa6997856e73f36c8a41ef62519e0267dcbeefd15e26cae71"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:cc707ef7edb71f6bf8339198b929ead87c022c78040e41668a4db68360129cef"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:41512c436b8c691326e2d07786d906cba0e92b5e3f455bf338befb302a0ca76d"}, + {file = "Levenshtein-0.25.1-cp311-cp311-win32.whl", hash = "sha256:2a3830175c01ade832ba0736091283f14a6506a06ffe8c846f66d9fbca91562f"}, + {file = "Levenshtein-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:9e0af4e6e023e0c8f79af1d1ca5f289094eb91201f08ad90f426d71e4ae84052"}, + {file = "Levenshtein-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:38e5d9a1d737d7b49fa17d6a4c03a0359288154bf46dc93b29403a9dd0cd1a7d"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e9e060ef3925a68aeb12276f0e524fb1264592803d562ec0306c7c3f5c68eae0"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f84b84049318d44722db307c448f9dcb8d27c73525a378e901189a94889ba61"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e23fdf330cb185a0c7913ca5bd73a189dfd1742eae3a82e31ed8688b191800"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06958e4a81ea0f0b2b7768a2ad05bcd50a9ad04c4d521dd37d5730ff12decdc"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2ea7c34ec22b2fce21299b0caa6dde6bdebafcc2970e265853c9cfea8d1186da"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fddc0ccbdd94f57aa32e2eb3ac8310d08df2e175943dc20b3e1fc7a115850af4"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d52249cb3448bfe661d3d7db3a6673e835c7f37b30b0aeac499a1601bae873d"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8dd4c201b15f8c1e612f9074335392c8208ac147acbce09aff04e3974bf9b16"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23a4d95ce9d44161c7aa87ab76ad6056bc1093c461c60c097054a46dc957991f"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:65eea8a9c33037b23069dca4b3bc310e3c28ca53f60ec0c958d15c0952ba39fa"}, + {file = "Levenshtein-0.25.1.tar.gz", hash = "sha256:2df14471c778c75ffbd59cb64bbecfd4b0ef320ef9f80e4804764be7d5678980"}, +] + [[package]] name = "markdown-it-py" version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" -groups = ["security_check"] +groups = ["default", "security_check"] dependencies = [ "mdurl~=0.1", ] @@ -726,6 +1243,26 @@ files = [ {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] +[[package]] +name = "markupsafe" +version = "2.1.5" +requires_python = ">=3.7" +summary = "Safely add untrusted strings to HTML/XML markup." +groups = ["default"] +files = [ + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "matplotlib-inline" version = "0.1.7" @@ -745,12 +1282,97 @@ name = "mdurl" version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" -groups = ["security_check"] +groups = ["default", "security_check"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "more-itertools" +version = "10.2.0" +requires_python = ">=3.8" +summary = "More routines for operating on iterables, beyond itertools" +groups = ["default"] +files = [ + {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, + {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, +] + +[[package]] +name = "msgpack" +version = "1.0.8" +requires_python = ">=3.8" +summary = "MessagePack serializer" +groups = ["default"] +files = [ + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, + {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, + {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, + {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, +] + +[[package]] +name = "msgpack-numpy-opentensor" +version = "0.5.0" +summary = "Numpy data serialization using msgpack" +groups = ["default"] +dependencies = [ + "msgpack>=0.5.2", + "numpy>=1.9.0", +] +files = [ + {file = "msgpack-numpy-opentensor-0.5.0.tar.gz", hash = "sha256:213232c20e2efd528ec8a9882b605e8ad87cfc35b57dfcfefe05d33aaaabe574"}, + {file = "msgpack_numpy_opentensor-0.5.0-py2.py3-none-any.whl", hash = "sha256:8a61c597a976425a87094d8e89846aa9528eb1f037e97ff1428fe3cd61a238e7"}, +] + +[[package]] +name = "multidict" +version = "6.0.5" +requires_python = ">=3.7" +summary = "multidict implementation" +groups = ["default"] +files = [ + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "munch" +version = "2.5.0" +summary = "A dot-accessible dictionary (a la JavaScript objects)" +groups = ["default"] +dependencies = [ + "six", +] +files = [ + {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, + {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, +] + [[package]] name = "mypy" version = "1.10.0" @@ -776,12 +1398,34 @@ name = "mypy-extensions" version = "1.0.0" requires_python = ">=3.5" summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["type_check"] +groups = ["default", "type_check"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "nest-asyncio" +version = "1.6.0" +requires_python = ">=3.5" +summary = "Patch asyncio to allow nested event loops" +groups = ["default"] +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "netaddr" +version = "1.2.1" +requires_python = ">=3.7" +summary = "A network address manipulation library for Python" +groups = ["default"] +files = [ + {file = "netaddr-1.2.1-py3-none-any.whl", hash = "sha256:bd9e9534b0d46af328cf64f0e5a23a5a43fca292df221c85580b27394793496e"}, + {file = "netaddr-1.2.1.tar.gz", hash = "sha256:6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987"}, +] + [[package]] name = "nox" version = "2023.4.22" @@ -799,6 +1443,27 @@ files = [ {file = "nox-2023.4.22.tar.gz", hash = "sha256:46c0560b0dc609d7d967dc99e22cb463d3c4caf54a5fda735d6c11b5177e3a9f"}, ] +[[package]] +name = "numpy" +version = "1.26.4" +requires_python = ">=3.9" +summary = "Fundamental package for array computing in Python" +groups = ["default"] +files = [ + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + [[package]] name = "packaging" version = "24.0" @@ -821,6 +1486,30 @@ files = [ {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] +[[package]] +name = "password-strength" +version = "0.0.3.post2" +summary = "Password strength and validation " +groups = ["default"] +dependencies = [ + "six", +] +files = [ + {file = "password_strength-0.0.3.post2-py2.py3-none-any.whl", hash = "sha256:6739357c2863d707b7c7f247ff7c6882a70904a18d12c9aaf98f8b95da176fb9"}, + {file = "password_strength-0.0.3.post2.tar.gz", hash = "sha256:bf4df10a58fcd3abfa182367307b4fd7b1cec518121dd83bf80c1c42ba796762"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Utility library for gitignore style pattern matching of file paths." +groups = ["default"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + [[package]] name = "pbr" version = "6.0.0" @@ -872,7 +1561,7 @@ name = "pluggy" version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" -groups = ["test"] +groups = ["default", "test"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -935,6 +1624,139 @@ files = [ {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, ] +[[package]] +name = "py" +version = "1.11.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "library with cross-python path, ini-parsing, io, code, log facilities" +groups = ["default"] +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "py-bip39-bindings" +version = "0.1.11" +summary = "Python bindings for tiny-bip39 RUST crate" +groups = ["default"] +files = [ + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4"}, + {file = "py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1"}, +] + +[[package]] +name = "py-ed25519-zebra-bindings" +version = "1.0.1" +summary = "Python bindings for the ed25519-zebra RUST crate" +groups = ["default"] +files = [ + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e249b0d57187077859652a1119b315dec49e4d458c9795a7aeb2381799ce34e6"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:50d383684b650d92f93e1482891ce0c1c2011d2ca3b0821b5b049d6bb35dca3e"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d32d2c4d50789e6d3e081ab9a6d4e6f82bcf414e6b1c41a8f64a04065f6db340"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363599e810ccc1f09092803a14a386ee8bce44d7057a3e36a14b1bf31de7e0b5"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa59836fac97352def00c2c7c6fed33ba351258b24d3f7cbced646271aa94de6"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d16da4fd6da771fd2323a90d779076066a02bb2a2c62b15ecf51ca2706f451b"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2e715341b4927f6735ed7113644c0a5362310df4ddad1f938b5040c85884db15"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-none-win32.whl", hash = "sha256:21498379d5e85d97a9633b7cf6362b4d187c7575ab8633c3ba6c99b1dcb83358"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-none-win_amd64.whl", hash = "sha256:58e7d56a6f565fc044d313ec429b782150366a39ada973051dde60f1363abd9b"}, + {file = "py_ed25519_zebra_bindings-1.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670f01572012aabd02436de78bd880a63691031f7758289a05529368e8af5ac6"}, + {file = "py_ed25519_zebra_bindings-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae847c456757dc8e5022c0f5af64db07baaf8e0d60e0931912e92c1e9ea532d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98450820e82e4fd446e2b9fd7b449e8b4cb645fa4c053d4e0a598a9c43ed8209"}, + {file = "py_ed25519_zebra_bindings-1.0.1.tar.gz", hash = "sha256:0062f189e1c8672ba94676cedb346fae4c33a0cabaf12e75a1aedcf9db47403b"}, +] + +[[package]] +name = "py-sr25519-bindings" +version = "0.2.0" +summary = "Python bindings for sr25519 library" +groups = ["default"] +files = [ + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:54e8c41081a4c23eca4b19f52de2514c48ddec6f49844dff7ad4cfac0bc11712"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c73bd1a87849db9cd0e664b2d2e14208183dd8d11ac083d70e688fc28283a71"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d21382ea24f7f25e72cdddaca2f013ce46cc7983bcfebc611c795cea177eff"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1448cf55bbf6f52d2e24766a8a84ba6d77100a991897e8519711ccd7409830"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:392b8b9875c89c9302930ad3d59567b62176f33adeee96a55ff61ba17fb7aac2"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7b56b5cbbfb36b41ddfa462989a03386590ac036f3a755ef64fffeb2fed88654"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f06ea3237e06666e3a4ff4719b4fba415472943831b229428753c37d5ecd1b4"}, + {file = "py_sr25519_bindings-0.2.0-cp311-none-win_amd64.whl", hash = "sha256:d62af30b2022f5fa787e46c06823c35a21abe791bf55012f498f9ba8e4baabc8"}, + {file = "py_sr25519_bindings-0.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38db0ee90bd676b9df7ddd03fcb2113b5a5e9d9c984d82426728acc0e9d54277"}, + {file = "py_sr25519_bindings-0.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dfe767069d5c5e8a313e77b6bd681ea4f6b5988b09b6b4c9399e255fe4a7c53"}, + {file = "py_sr25519_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8951d1a6e310a682a6253d547e44a9e7a606476dbc18dea3f121d98bdb81042"}, + {file = "py_sr25519_bindings-0.2.0.tar.gz", hash = "sha256:0c2fe92b7cdcebf6c5611a90054f8ba6ea90b68b8832896d2dc565537bc40b0c"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +requires_python = ">=3.8" +summary = "C parser in Python" +groups = ["default"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pycryptodome" +version = "3.20.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Cryptographic library for Python" +groups = ["default"] +files = [ + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + +[[package]] +name = "pydantic" +version = "1.10.15" +requires_python = ">=3.7" +summary = "Data validation and settings management using python type hints" +groups = ["default"] +dependencies = [ + "typing-extensions>=4.2.0", +] +files = [ + {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, + {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, + {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, + {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, +] + [[package]] name = "pygments" version = "2.17.2" @@ -946,12 +1768,34 @@ files = [ {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] +[[package]] +name = "pynacl" +version = "1.5.0" +requires_python = ">=3.6" +summary = "Python binding to the Networking and Cryptography (NaCl) library" +groups = ["default"] +dependencies = [ + "cffi>=1.4.1", +] +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + [[package]] name = "pytest" version = "8.2.0" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" -groups = ["test"] +groups = ["default", "test"] dependencies = [ "colorama; sys_platform == \"win32\"", "iniconfig", @@ -963,6 +1807,20 @@ files = [ {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, ] +[[package]] +name = "pytest-asyncio" +version = "0.23.6" +requires_python = ">=3.8" +summary = "Pytest support for asyncio" +groups = ["default"] +dependencies = [ + "pytest<9,>=7.0.0", +] +files = [ + {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, + {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, +] + [[package]] name = "pytest-django" version = "4.8.0" @@ -1017,12 +1875,37 @@ files = [ {file = "python_ipware-3.0.0.tar.gz", hash = "sha256:9117b1c4dddcb5d5ca49e6a9617de2fc66aec2ef35394563ac4eecabdf58c062"}, ] +[[package]] +name = "python-levenshtein" +version = "0.25.1" +requires_python = ">=3.8" +summary = "Python extension for computing string edit distances and similarities." +groups = ["default"] +dependencies = [ + "Levenshtein==0.25.1", +] +files = [ + {file = "python-Levenshtein-0.25.1.tar.gz", hash = "sha256:b21e7efe83c8e8dc8260f2143b2393c6c77cb2956f0c53de6c4731c4d8006acc"}, + {file = "python_Levenshtein-0.25.1-py3-none-any.whl", hash = "sha256:654446d1ea4acbcc573d44c43775854834a7547e4cb2f79f638f738134d72037"}, +] + +[[package]] +name = "python-statemachine" +version = "2.1.2" +requires_python = ">=3.7,<3.13" +summary = "Python Finite State Machines made easy." +groups = ["default"] +files = [ + {file = "python_statemachine-2.1.2-py3-none-any.whl", hash = "sha256:d7e369d5da5b9007cc7cf5eb7a1b169081e2f4b7d30b6415fc122858fb7696ec"}, + {file = "python_statemachine-2.1.2.tar.gz", hash = "sha256:0b0dd8b28738b53f14391b06d5072cd5e72259da5ae23574d3d4f5e6dd366663"}, +] + [[package]] name = "pyyaml" version = "6.0.1" requires_python = ">=3.6" summary = "YAML parser and emitter for Python" -groups = ["security_check"] +groups = ["default", "security_check"] files = [ {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, @@ -1035,6 +1918,42 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "rapidfuzz" +version = "3.9.0" +requires_python = ">=3.8" +summary = "rapid fuzzy string matching" +groups = ["default"] +files = [ + {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e2218d62ab63f3c5ad48eced898854d0c2c327a48f0fb02e2288d7e5332a22c8"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36bf35df2d6c7d5820da20a6720aee34f67c15cd2daf8cf92e8141995c640c25"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:905b01a9b633394ff6bb5ebb1c5fd660e0e180c03fcf9d90199cc6ed74b87cf7"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33cfabcb7fd994938a6a08e641613ce5fe46757832edc789c6a5602e7933d6fa"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1179dcd3d150a67b8a678cd9c84f3baff7413ff13c9e8fe85e52a16c97e24c9b"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47d97e28c42f1efb7781993b67c749223f198f6653ef177a0c8f2b1c516efcaf"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28da953eb2ef9ad527e536022da7afff6ace7126cdd6f3e21ac20f8762e76d2c"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:182b4e11de928fb4834e8f8b5ecd971b5b10a86fabe8636ab65d3a9b7e0e9ca7"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c74f2da334ce597f31670db574766ddeaee5d9430c2c00e28d0fbb7f76172036"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:014ac55b03f4074f903248ded181f3000f4cdbd134e6155cbf643f0eceb4f70f"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c4ef34b2ddbf448f1d644b4ec6475df8bbe5b9d0fee173ff2e87322a151663bd"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fc02157f521af15143fae88f92ef3ddcc4e0cff05c40153a9549dc0fbdb9adb3"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ff08081c49b18ba253a99e6a47f492e6ee8019e19bbb6ddc3ed360cd3ecb2f62"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-win32.whl", hash = "sha256:b9bf90b3d96925cbf8ef44e5ee3cf39ef0c422f12d40f7a497e91febec546650"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5d5684f54d82d9b0cf0b2701e55a630527a9c3dd5ddcf7a2e726a475ac238f2"}, + {file = "rapidfuzz-3.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:a2de844e0e971d7bd8aa41284627dbeacc90e750b90acfb016836553c7a63192"}, + {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e33362e98c7899b5f60dcb06ada00acd8673ce0d59aefe9a542701251fd00423"}, + {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb67cf43ad83cb886cbbbff4df7dcaad7aedf94d64fca31aea0da7d26684283c"}, + {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2e106cc66453bb80d2ad9c0044f8287415676df5c8036d737d05d4b9cdbf8e"}, + {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1256915f7e7a5cf2c151c9ac44834b37f9bd1c97e8dec6f936884f01b9dfc7d"}, + {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ae643220584518cbff8bf2974a0494d3e250763af816b73326a512c86ae782ce"}, + {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:491274080742110427f38a6085bb12dffcaff1eef12dccf9e8758398c7e3957e"}, + {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bc5559b9b94326922c096b30ae2d8e5b40b2e9c2c100c2cc396ad91bcb84d30"}, + {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:849160dc0f128acb343af514ca827278005c1d00148d025e4035e034fc2d8c7f"}, + {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:623883fb78e692d54ed7c43b09beec52c6685f10a45a7518128e25746667403b"}, + {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d20ab9abc7e19767f1951772a6ab14cb4eddd886493c2da5ee12014596ad253f"}, + {file = "rapidfuzz-3.9.0.tar.gz", hash = "sha256:b182f0fb61f6ac435e416eb7ab330d62efdbf9b63cf0c7fa12d1f57c2eaaf6f3"}, +] + [[package]] name = "redis" version = "4.6.0" @@ -1054,7 +1973,7 @@ name = "requests" version = "2.31.0" requires_python = ">=3.7" summary = "Python HTTP for Humans." -groups = ["type_check"] +groups = ["default", "type_check"] dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -1066,12 +1985,36 @@ files = [ {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] +[[package]] +name = "resolvelib" +version = "0.8.1" +summary = "Resolve abstract dependencies into concrete ones" +groups = ["default"] +files = [ + {file = "resolvelib-0.8.1-py2.py3-none-any.whl", hash = "sha256:d9b7907f055c3b3a2cfc56c914ffd940122915826ff5fb5b1de0c99778f4de98"}, + {file = "resolvelib-0.8.1.tar.gz", hash = "sha256:c6ea56732e9fb6fca1b2acc2ccc68a0b6b8c566d8f3e78e0443310ede61dbd37"}, +] + +[[package]] +name = "retry" +version = "0.9.2" +summary = "Easy to use retry decorator." +groups = ["default"] +dependencies = [ + "decorator>=3.4.2", + "py<2.0.0,>=1.4.26", +] +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] + [[package]] name = "rich" version = "13.7.1" requires_python = ">=3.7.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -groups = ["security_check"] +groups = ["default", "security_check"] dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", @@ -1107,6 +2050,22 @@ files = [ {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, ] +[[package]] +name = "scalecodec" +version = "1.2.7" +requires_python = ">=3.6, <4" +summary = "Python SCALE Codec Library" +groups = ["default"] +dependencies = [ + "base58>=2.0.1", + "more-itertools", + "requests>=2.24.0", +] +files = [ + {file = "scalecodec-1.2.7-py3-none-any.whl", hash = "sha256:2d951041b10429e7bcee9a08b693d151add002875cc961ab90cd7a844d01bdfd"}, + {file = "scalecodec-1.2.7.tar.gz", hash = "sha256:5215354a5e8f12f8f647cb0cced572873c8a91943ad7d3e2c1e3d7a28be65ade"}, +] + [[package]] name = "sentry-sdk" version = "1.3.0" @@ -1132,6 +2091,17 @@ files = [ {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] +[[package]] +name = "shtab" +version = "1.6.5" +requires_python = ">=3.7" +summary = "Automagic shell tab completion for Python CLI applications" +groups = ["default"] +files = [ + {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, + {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, +] + [[package]] name = "six" version = "1.16.0" @@ -1143,6 +2113,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +requires_python = ">=3.7" +summary = "Sniff out which async library your code is running under" +groups = ["default"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "sqlparse" version = "0.5.0" @@ -1169,6 +2150,20 @@ files = [ {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] +[[package]] +name = "starlette" +version = "0.37.2" +requires_python = ">=3.8" +summary = "The little ASGI library that shines." +groups = ["default"] +dependencies = [ + "anyio<5,>=3.4.0", +] +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + [[package]] name = "stevedore" version = "5.2.0" @@ -1194,6 +2189,71 @@ files = [ {file = "structlog-24.1.0.tar.gz", hash = "sha256:41a09886e4d55df25bdcb9b5c9674bccfab723ff43e0a86a1b7b236be8e57b16"}, ] +[[package]] +name = "substrate-interface" +version = "1.7.5" +requires_python = ">=3.7, <4" +summary = "Library for interfacing with a Substrate node" +groups = ["default"] +dependencies = [ + "PyNaCl<2,>=1.0.1", + "base58<3,>=1.0.3", + "certifi>=2019.3.9", + "ecdsa<1,>=0.17.0", + "eth-keys<1,>=0.2.1", + "eth-utils<3,>=1.3.0", + "idna<4,>=2.1.0", + "py-bip39-bindings<1,>=0.1.9", + "py-ed25519-zebra-bindings<2,>=1.0", + "py-sr25519-bindings<1,>=0.2.0", + "pycryptodome<4,>=3.11.0", + "requests<3,>=2.21.0", + "scalecodec<1.3,>=1.2.6", + "websocket-client<2,>=0.57.0", + "xxhash<4,>=1.3.0", +] +files = [ + {file = "substrate-interface-1.7.5.tar.gz", hash = "sha256:8d4f961cd566d748f4a3ae0747983be5fe57e349071c0650114afc8c5ab06b93"}, + {file = "substrate_interface-1.7.5-py3-none-any.whl", hash = "sha256:8e8381b6ce6f370b90a6ae537964f118421f199663c9efd5b2a1b04982082005"}, +] + +[[package]] +name = "termcolor" +version = "2.4.0" +requires_python = ">=3.8" +summary = "ANSI color formatting for output in terminal" +groups = ["default"] +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[[package]] +name = "toolz" +version = "0.12.1" +requires_python = ">=3.7" +summary = "List processing tools and functional utilities" +groups = ["default"] +marker = "implementation_name == \"pypy\" or implementation_name == \"cpython\"" +files = [ + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, +] + +[[package]] +name = "tqdm" +version = "4.66.4" +requires_python = ">=3.7" +summary = "Fast, Extensible Progress Meter" +groups = ["default"] +dependencies = [ + "colorama; platform_system == \"Windows\"", +] +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + [[package]] name = "traitlets" version = "5.14.3" @@ -1256,7 +2316,7 @@ name = "typing-extensions" version = "4.11.0" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" -groups = ["type_check"] +groups = ["default", "type_check"] files = [ {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, @@ -1284,6 +2344,21 @@ files = [ {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] +[[package]] +name = "uvicorn" +version = "0.22.0" +requires_python = ">=3.7" +summary = "The lightning-fast ASGI server." +groups = ["default"] +dependencies = [ + "click>=7.0", + "h11>=0.8", +] +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + [[package]] name = "vine" version = "5.1.0" @@ -1320,3 +2395,100 @@ files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] + +[[package]] +name = "websocket-client" +version = "1.8.0" +requires_python = ">=3.8" +summary = "WebSocket client for Python with low level API options" +groups = ["default"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[[package]] +name = "wheel" +version = "0.43.0" +requires_python = ">=3.8" +summary = "A built-package format for Python" +groups = ["default"] +files = [ + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, +] + +[[package]] +name = "xxhash" +version = "3.4.1" +requires_python = ">=3.7" +summary = "Python binding for xxHash" +groups = ["default"] +files = [ + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +requires_python = ">=3.7" +summary = "Yet another URL library" +groups = ["default"] +dependencies = [ + "idna>=2.0", + "multidict>=4.0", +] +files = [ + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] diff --git a/pyproject.toml b/pyproject.toml index 734638c..e060d51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,8 @@ dependencies = [ "sentry-sdk==1.3.0", "ipython~=8.14.0", "nox==2023.4.22", - ] + "bittensor @ git+https://github.com/opentensor/bittensor.git@merge_cuda", +] [build-system] requires = ["pdm-backend"] From 2a0fda8310723656b8a1745de98ae9860e6b0362 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sat, 4 May 2024 01:59:26 +0500 Subject: [PATCH 05/23] Add pytest-mock, faker --- pdm.lock | 74 ++++++++++++++++++++++++++++++++++---------------- pyproject.toml | 4 ++- 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/pdm.lock b/pdm.lock index ee1d795..4049f16 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "lint", "security_check", "test", "type_check"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:671249e99841dd1d51d9e98aa4861963c1c5bbb8fe0d37540193fd280209e8c8" +content_hash = "sha256:77451dad8f2c6ad4a76038e17d0a627a66fa164fd5954ae228e2cd92f109029d" [[package]] name = "aiohttp" @@ -983,6 +983,20 @@ files = [ {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] +[[package]] +name = "faker" +version = "25.0.1" +requires_python = ">=3.8" +summary = "Faker is a Python package that generates fake data for you." +groups = ["test"] +dependencies = [ + "python-dateutil>=2.4", +] +files = [ + {file = "Faker-25.0.1-py3-none-any.whl", hash = "sha256:6737cc6d591cd83421fdc5e494f6e2c1a6e32266214f158b745aa9fa15687c98"}, + {file = "Faker-25.0.1.tar.gz", hash = "sha256:c153505618801f1704807b258a6010ea8cabf91f66f4788939bfdba83b887e76"}, +] + [[package]] name = "fastapi" version = "0.110.1" @@ -1759,13 +1773,13 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" -requires_python = ">=3.7" +version = "2.18.0" +requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." groups = ["default", "security_check", "test"] files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [[package]] @@ -1835,6 +1849,20 @@ files = [ {file = "pytest_django-4.8.0-py3-none-any.whl", hash = "sha256:ca1ddd1e0e4c227cf9e3e40a6afc6d106b3e70868fd2ac5798a22501271cd0c7"}, ] +[[package]] +name = "pytest-mock" +version = "3.14.0" +requires_python = ">=3.8" +summary = "Thin-wrapper around the mock package for easier use with pytest" +groups = ["test"] +dependencies = [ + "pytest>=6.2.5", +] +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + [[package]] name = "pytest-xdist" version = "3.6.1" @@ -2026,28 +2054,28 @@ files = [ [[package]] name = "ruff" -version = "0.4.2" +version = "0.4.3" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["lint"] files = [ - {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, - {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, - {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, - {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, - {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, - {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, - {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, - {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, + {file = "ruff-0.4.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b70800c290f14ae6fcbb41bbe201cf62dfca024d124a1f373e76371a007454ce"}, + {file = "ruff-0.4.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08a0d6a22918ab2552ace96adeaca308833873a4d7d1d587bb1d37bae8728eb3"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba1f14df3c758dd7de5b55fbae7e1c8af238597961e5fb628f3de446c3c40c5"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:819fb06d535cc76dfddbfe8d3068ff602ddeb40e3eacbc90e0d1272bb8d97113"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bfc9e955e6dc6359eb6f82ea150c4f4e82b660e5b58d9a20a0e42ec3bb6342b"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:510a67d232d2ebe983fddea324dbf9d69b71c4d2dfeb8a862f4a127536dd4cfb"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9ff11cd9a092ee7680a56d21f302bdda14327772cd870d806610a3503d001f"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29efff25bf9ee685c2c8390563a5b5c006a3fee5230d28ea39f4f75f9d0b6f2f"}, + {file = "ruff-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b00e0bcccf0fc8d7186ed21e311dffd19761cb632241a6e4fe4477cc80ef6e"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262f5635e2c74d80b7507fbc2fac28fe0d4fef26373bbc62039526f7722bca1b"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7363691198719c26459e08cc17c6a3dac6f592e9ea3d2fa772f4e561b5fe82a3"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eeb039f8428fcb6725bb63cbae92ad67b0559e68b5d80f840f11914afd8ddf7f"}, + {file = "ruff-0.4.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:927b11c1e4d0727ce1a729eace61cee88a334623ec424c0b1c8fe3e5f9d3c865"}, + {file = "ruff-0.4.3-py3-none-win32.whl", hash = "sha256:25cacda2155778beb0d064e0ec5a3944dcca9c12715f7c4634fd9d93ac33fd30"}, + {file = "ruff-0.4.3-py3-none-win_amd64.whl", hash = "sha256:7a1c3a450bc6539ef00da6c819fb1b76b6b065dec585f91456e7c0d6a0bbc725"}, + {file = "ruff-0.4.3-py3-none-win_arm64.whl", hash = "sha256:71ca5f8ccf1121b95a59649482470c5601c60a416bf189d553955b0338e34614"}, + {file = "ruff-0.4.3.tar.gz", hash = "sha256:ff0a3ef2e3c4b6d133fbedcf9586abfbe38d076041f2dc18ffb2c7e0485d5a07"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index e060d51..1684734 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,8 +33,10 @@ test = [ 'pytest', 'pytest-django', 'pytest-xdist', + 'pytest-mock', 'ipdb', 'freezegun', + 'faker', ] lint = [ "ruff", @@ -75,4 +77,4 @@ ignore = [ [tool.codespell] skip = '*.min.js,pdm.lock,*/monitoring_certs/*' -ignore-words-list = 'datas' \ No newline at end of file +ignore-words-list = 'datas' From d1540eb9e0de285b6798396d8c84065054addc98 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 01:20:20 +0500 Subject: [PATCH 06/23] Add subtensor variables to settings and .env --- .../bittensor_panel/core/tests/settings.py | 5 +++++ app/src/bittensor_panel/settings.py | 19 ++++++++++++++++--- envs/dev/.env.template | 6 ++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/bittensor_panel/core/tests/settings.py b/app/src/bittensor_panel/core/tests/settings.py index 275c43a..a229745 100644 --- a/app/src/bittensor_panel/core/tests/settings.py +++ b/app/src/bittensor_panel/core/tests/settings.py @@ -1,5 +1,10 @@ import os os.environ["DEBUG_TOOLBAR"] = "False" +os.environ["SUBTENSOR_ADDRESS"] = "local" +os.environ["SUBNET_UID"] = "1" +os.environ["WALLET_NAME"] = "default" +os.environ["WALLET_HOTKEY"] = "default" +os.environ["WALLET_PATH"] = "" from bittensor_panel.settings import * # noqa: E402,F403 diff --git a/app/src/bittensor_panel/settings.py b/app/src/bittensor_panel/settings.py index ec012aa..b676fd9 100644 --- a/app/src/bittensor_panel/settings.py +++ b/app/src/bittensor_panel/settings.py @@ -146,7 +146,9 @@ def wrapped(*args, **kwargs): WSGI_APPLICATION = "bittensor_panel.wsgi.application" DATABASES = {} -if env("DATABASE_POOL_URL"): # DB transaction-based connection pool, such as one provided PgBouncer +if env( + "DATABASE_POOL_URL" +): # DB transaction-based connection pool, such as one provided PgBouncer DATABASES["default"] = { **env.db_url("DATABASE_POOL_URL"), "DISABLE_SERVER_SIDE_CURSORS": True, # prevents random cursor errors with transaction-based connection pool @@ -204,7 +206,9 @@ def wrapped(*args, **kwargs): CELERY_BROKER_URL = env("CELERY_BROKER_URL", default="") CELERY_RESULT_BACKEND = env("CELERY_BROKER_URL", default="") # store results in Redis -CELERY_RESULT_EXPIRES = int(timedelta(days=1).total_seconds()) # time until task result deletion +CELERY_RESULT_EXPIRES = int( + timedelta(days=1).total_seconds() +) # time until task result deletion CELERY_COMPRESSION = "gzip" # task compression CELERY_MESSAGE_COMPRESSION = "gzip" # result compression CELERY_SEND_EVENTS = True # needed for worker monitoring @@ -223,7 +227,9 @@ def wrapped(*args, **kwargs): CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" -CELERY_WORKER_PREFETCH_MULTIPLIER = env.int("CELERY_WORKER_PREFETCH_MULTIPLIER", default=10) +CELERY_WORKER_PREFETCH_MULTIPLIER = env.int( + "CELERY_WORKER_PREFETCH_MULTIPLIER", default=10 +) CELERY_BROKER_POOL_LIMIT = env.int("CELERY_BROKER_POOL_LIMIT", default=50) EMAIL_BACKEND = env("EMAIL_BACKEND") @@ -308,3 +314,10 @@ def configure_structlog(): ], ) ignore_logger("django.security.DisallowedHost") + + +SUBTENSOR_ADDRESS = env.str("SUBTENSOR_ADDRESS", default="local") +SUBNET_UID = env.int("SUBNET_UID") +WALLET_NAME = env.str("WALLET_NAME") +WALLET_HOTKEY = env.str("WALLET_HOTKEY") +WALLET_PATH = env.path("WALLET_PATH") diff --git a/envs/dev/.env.template b/envs/dev/.env.template index b5a9fbb..22132b4 100644 --- a/envs/dev/.env.template +++ b/envs/dev/.env.template @@ -65,3 +65,9 @@ BACKUP_B2_BUCKET= BACKUP_B2_KEY_ID= BACKUP_B2_KEY_SECRET= BACKUP_LOCAL_ROTATE_KEEP_LAST= + +SUBTENSOR_ADDRESS=local +SUBNET_UID=1 +WALLET_NAME="default" +WALLET_HOTKEY="default" +WALLET_PATH="" From 659713389da4bcb89a7d326b23057b17e49f6ec6 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 01:39:01 +0500 Subject: [PATCH 07/23] Implement bittensor interaction layer --- app/src/bittensor_panel/core/bt.py | 42 +++++++ app/src/bittensor_panel/core/tests/test_bt.py | 113 ++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 app/src/bittensor_panel/core/bt.py create mode 100644 app/src/bittensor_panel/core/tests/test_bt.py diff --git a/app/src/bittensor_panel/core/bt.py b/app/src/bittensor_panel/core/bt.py new file mode 100644 index 0000000..4c9394e --- /dev/null +++ b/app/src/bittensor_panel/core/bt.py @@ -0,0 +1,42 @@ +from dataclasses import asdict + +import bittensor +from django.conf import settings + + +def get_subtensor() -> bittensor.subtensor: + return bittensor.subtensor(settings.SUBTENSOR_ADDRESS) + + +def get_wallet() -> bittensor.wallet: + return bittensor.wallet( + name=settings.WALLET_NAME, + hotkey=settings.WALLET_HOTKEY, + path=settings.WALLET_PATH, + ) + + +def load_hyperparams() -> dict[str, int] | None: + st = get_subtensor() + + hyperparams = st.get_subnet_hyperparameters(settings.SUBNET_UID) + + if not hyperparams: + return None + + return asdict(hyperparams) + + +def update_remote_hyperparam(name: str, value: int) -> bool: + st = get_subtensor() + wallet = get_wallet() + + return st.set_hyperparameter( + wallet=wallet, + netuid=settings.SUBNET_UID, + parameter=name, + value=value, + wait_for_inclusion=False, + wait_for_finalization=True, + prompt=False, + ) diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py new file mode 100644 index 0000000..2985c6c --- /dev/null +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -0,0 +1,113 @@ +from unittest.mock import MagicMock + +import pytest +from bittensor import SubnetHyperparameters +from faker import Faker +from pytest_mock import MockerFixture + +from bittensor_panel.core import bt + + +def test_get_subtensor(mocker: MockerFixture, settings): + mock = mocker.patch("bittensor_panel.core.bt.bittensor.subtensor", autospec=True) + + st = bt.get_subtensor() + + assert st == mock.return_value + + mock.assert_called_once_with(settings.SUBTENSOR_ADDRESS) + + +def test_get_wallet(mocker: MockerFixture, settings): + mock = mocker.patch("bittensor_panel.core.bt.bittensor.wallet", autospec=True) + + st = bt.get_wallet() + + assert st == mock.return_value + + mock.assert_called_once_with( + name=settings.WALLET_NAME, + hotkey=settings.WALLET_HOTKEY, + path=settings.WALLET_PATH, + ) + + +@pytest.fixture +def mock_subtensor(mocker: MockerFixture): + return mocker.patch("bittensor_panel.core.bt.get_subtensor", autospec=True) + + +@pytest.fixture +def hyperparam_values(faker: Faker): + return { + "rho": faker.pyint(), + "kappa": faker.pyint(), + "immunity_period": faker.pyint(), + "min_allowed_weights": faker.pyint(), + "max_weight_limit": faker.pyint(), + "tempo": faker.pyint(), + "min_difficulty": faker.pyint(), + "max_difficulty": faker.pyint(), + "weights_version": faker.pyint(), + "weights_rate_limit": faker.pyint(), + "adjustment_interval": faker.pyint(), + "activity_cutoff": faker.pyint(), + "registration_allowed": faker.pyint(), + "target_regs_per_interval": faker.pyint(), + "min_burn": faker.pyint(), + "max_burn": faker.pyint(), + "bonds_moving_avg": faker.pyint(), + "max_regs_per_block": faker.pyint(), + "serving_rate_limit": faker.pyint(), + "max_validators": faker.pyint(), + "adjustment_alpha": faker.pyint(), + "difficulty": faker.pyint(), + } + + +@pytest.fixture +def hyperparams(hyperparam_values: dict[str, int]): + return SubnetHyperparameters(**hyperparam_values) + + +def test_load_hyperparams( + mock_subtensor: MagicMock, + hyperparams: SubnetHyperparameters, + hyperparam_values: dict[str, int], +): + mock_subtensor.return_value.get_subnet_hyperparameters.return_value = hyperparams + + assert bt.load_hyperparams() == hyperparam_values + + +def test_load_hyperparams_empty_list(mock_subtensor: MagicMock): + mock_subtensor.return_value.get_subnet_hyperparameters.return_value = [] + + assert bt.load_hyperparams() is None + + +@pytest.fixture +def mock_wallet(mocker: MockerFixture): + return mocker.patch("bittensor_panel.core.bt.get_wallet", autospec=True) + + +@pytest.mark.parametrize("result", [True, False]) +def test_update_remote_hyperparam( + mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings +): + mock_subtensor.return_value.set_hyperparameter.return_value = result + + name = "difficulty" + value = 10 + + assert bt.update_remote_hyperparam(name, value) == result + + mock_subtensor.return_value.set_hyperparameter.assert_called_once_with( + wallet=mock_wallet.return_value, + netuid=settings.SUBNET_UID, + parameter=name, + value=value, + wait_for_inclusion=False, + wait_for_finalization=True, + prompt=False, + ) From 3d5f4c307fecb75ca8ea3b27e0399ef4f98a2189 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 01:58:45 +0500 Subject: [PATCH 08/23] Implement update_hyperparam service --- app/src/bittensor_panel/core/services.py | 21 ++++++ .../core/tests/test_services.py | 70 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 app/src/bittensor_panel/core/services.py create mode 100644 app/src/bittensor_panel/core/tests/test_services.py diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py new file mode 100644 index 0000000..1038a20 --- /dev/null +++ b/app/src/bittensor_panel/core/services.py @@ -0,0 +1,21 @@ +from bittensor_panel.core.bt import update_remote_hyperparam +from bittensor_panel.core.models import HyperParameter + + +class HyperParameterUpdateFailed(Exception): + pass + + +def update_hyperparam(instance: HyperParameter): + try: + result = update_remote_hyperparam(instance.name, instance.value) + except Exception as e: + raise HyperParameterUpdateFailed( + "Failed to update remote hyperparameter" + ) from e + if not result: + raise HyperParameterUpdateFailed( + "Failed to update remote hyperparameter. Subtensor returned False." + ) + + instance.save(update_fields=["value"]) diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py new file mode 100644 index 0000000..81147ce --- /dev/null +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -0,0 +1,70 @@ +from unittest.mock import MagicMock + +import pytest +from pytest_mock import MockerFixture + +from bittensor_panel.core.models import HyperParameter +from bittensor_panel.core.services import HyperParameterUpdateFailed, update_hyperparam + +pytestmark = [pytest.mark.django_db] + + +@pytest.fixture +def hyperparam(): + return HyperParameter.objects.create( + name="test", + value=123, + ) + + +@pytest.fixture +def mock_update_remote_hyperparam(mocker: MockerFixture): + return mocker.patch("bittensor_panel.core.services.update_remote_hyperparam") + + +def test_update_hyperparam( + hyperparam: HyperParameter, + mock_update_remote_hyperparam: MagicMock, + django_assert_num_queries, +): + mock_update_remote_hyperparam.return_value = True + + new_value = 999 + + hyperparam.value = new_value + + with django_assert_num_queries(1): + update_hyperparam(hyperparam) + + mock_update_remote_hyperparam.assert_called_once_with(hyperparam.name, new_value) + + hyperparam.refresh_from_db() + assert hyperparam.value == new_value + + +def test_update_hyperparam_remote_returns_false( + hyperparam: HyperParameter, + mock_update_remote_hyperparam: MagicMock, + django_assert_num_queries, +): + mock_update_remote_hyperparam.return_value = False + + hyperparam.value = 999 + + with django_assert_num_queries(0): + with pytest.raises(HyperParameterUpdateFailed): + update_hyperparam(hyperparam) + + +def test_update_hyperparam_remote_exception( + hyperparam: HyperParameter, + mock_update_remote_hyperparam: MagicMock, + django_assert_num_queries, +): + mock_update_remote_hyperparam.side_effect = RuntimeError + + hyperparam.value = 999 + + with django_assert_num_queries(0): + with pytest.raises(HyperParameterUpdateFailed): + update_hyperparam(hyperparam) From e318dbea3fe8d813d203d39060cf5396e739ce20 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 02:16:38 +0500 Subject: [PATCH 09/23] Implement service for syncing hyperparams --- app/src/bittensor_panel/core/services.py | 27 +++++++- .../core/tests/test_services.py | 66 ++++++++++++++++++- 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index 1038a20..c69f688 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -1,4 +1,4 @@ -from bittensor_panel.core.bt import update_remote_hyperparam +from bittensor_panel.core.bt import load_hyperparams, update_remote_hyperparam from bittensor_panel.core.models import HyperParameter @@ -6,7 +6,11 @@ class HyperParameterUpdateFailed(Exception): pass -def update_hyperparam(instance: HyperParameter): +class HyperParameterSyncFailed(Exception): + pass + + +def update_hyperparam(instance: HyperParameter) -> None: try: result = update_remote_hyperparam(instance.name, instance.value) except Exception as e: @@ -19,3 +23,22 @@ def update_hyperparam(instance: HyperParameter): ) instance.save(update_fields=["value"]) + + +def sync_hyperparams() -> None: + try: + hyperparam_dict = load_hyperparams() + except Exception as e: + raise HyperParameterSyncFailed("Failed to sync hyperparameters") from e + + if not hyperparam_dict: + return + + objs: list[HyperParameter] = [] + + for name, value in hyperparam_dict.items(): + objs.append(HyperParameter(name=name, value=value)) + + HyperParameter.objects.bulk_create( + objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"] + ) diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index 81147ce..c1d64b7 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -1,10 +1,16 @@ from unittest.mock import MagicMock import pytest +from faker import Faker from pytest_mock import MockerFixture from bittensor_panel.core.models import HyperParameter -from bittensor_panel.core.services import HyperParameterUpdateFailed, update_hyperparam +from bittensor_panel.core.services import ( + HyperParameterSyncFailed, + HyperParameterUpdateFailed, + sync_hyperparams, + update_hyperparam, +) pytestmark = [pytest.mark.django_db] @@ -68,3 +74,61 @@ def test_update_hyperparam_remote_exception( with django_assert_num_queries(0): with pytest.raises(HyperParameterUpdateFailed): update_hyperparam(hyperparam) + + +@pytest.fixture +def hyperparam_dict(faker: Faker): + return {faker.word(): faker.pyint() for _ in range(10)} + + +@pytest.fixture +def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int]): + return mocker.patch( + "bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict + ) + + +def test_sync_hyperparams( + hyperparam_dict: dict[str, int], + mock_load_hyperparams: MagicMock, + django_assert_num_queries, +): + assert not HyperParameter.objects.exists() + + with django_assert_num_queries(1): + sync_hyperparams() + + assert HyperParameter.objects.count() == len(hyperparam_dict) + + for name, value in HyperParameter.objects.values_list("name", "value"): + assert hyperparam_dict[name] == value + + +def test_sync_hyperparams_existing_records( + hyperparam_dict: dict[str, int], + mock_load_hyperparams: MagicMock, + django_assert_num_queries, +): + for name in hyperparam_dict: + HyperParameter.objects.create(name=name, value=0) + + with django_assert_num_queries(1): + sync_hyperparams() + + assert HyperParameter.objects.count() == len(hyperparam_dict) + + for name, value in HyperParameter.objects.values_list("name", "value"): + assert hyperparam_dict[name] == value + + +def test_sync_hyperparams_exception( + mock_load_hyperparams: MagicMock, + django_assert_num_queries, +): + mock_load_hyperparams.side_effect = RuntimeError + + with django_assert_num_queries(0): + with pytest.raises(HyperParameterSyncFailed): + sync_hyperparams() + + assert not HyperParameter.objects.exists() From 296a9cf6905ed0db84880422d4f4fbdf62a5f802 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 02:45:23 +0500 Subject: [PATCH 10/23] Catch SystemExit raised by bittensor in services --- app/src/bittensor_panel/core/services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index c69f688..a487560 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -13,7 +13,7 @@ class HyperParameterSyncFailed(Exception): def update_hyperparam(instance: HyperParameter) -> None: try: result = update_remote_hyperparam(instance.name, instance.value) - except Exception as e: + except (SystemExit, Exception) as e: raise HyperParameterUpdateFailed( "Failed to update remote hyperparameter" ) from e @@ -28,7 +28,7 @@ def update_hyperparam(instance: HyperParameter) -> None: def sync_hyperparams() -> None: try: hyperparam_dict = load_hyperparams() - except Exception as e: + except (SystemExit, Exception) as e: raise HyperParameterSyncFailed("Failed to sync hyperparameters") from e if not hyperparam_dict: From 990b01dc826345407800d3d26bb6067a65966f72 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 02:45:53 +0500 Subject: [PATCH 11/23] Use update_hyperparam service in admin --- app/src/bittensor_panel/core/admin.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/bittensor_panel/core/admin.py b/app/src/bittensor_panel/core/admin.py index 9ed3483..9ea2d7f 100644 --- a/app/src/bittensor_panel/core/admin.py +++ b/app/src/bittensor_panel/core/admin.py @@ -1,19 +1,26 @@ -from django.contrib import admin # noqa -from django.contrib.admin import register # noqa +from django.contrib import admin, messages +from django.contrib.admin import register from .models import HyperParameter +from .services import HyperParameterUpdateFailed, update_hyperparam @register(HyperParameter) class HyperParameterAdmin(admin.ModelAdmin): list_display = ["name", "value", "created_at", "updated_at"] - + def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False + def save_model(self, request, obj, form, change): + try: + update_hyperparam(obj) + except HyperParameterUpdateFailed as e: + messages.error(request, str(e)) + admin.site.site_header = "Bittensor Administration Panel" admin.site.site_title = "Bittensor Administration Panel" From fa367309f92cc8a426ac6905177e0a215896ebb6 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 02:48:53 +0500 Subject: [PATCH 12/23] Rename sync_hyperparams to refresh_hyperparams --- app/src/bittensor_panel/core/services.py | 2 +- .../bittensor_panel/core/tests/test_services.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index a487560..c41dc2b 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -25,7 +25,7 @@ def update_hyperparam(instance: HyperParameter) -> None: instance.save(update_fields=["value"]) -def sync_hyperparams() -> None: +def refresh_hyperparams() -> None: try: hyperparam_dict = load_hyperparams() except (SystemExit, Exception) as e: diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index c1d64b7..0646cad 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -8,7 +8,7 @@ from bittensor_panel.core.services import ( HyperParameterSyncFailed, HyperParameterUpdateFailed, - sync_hyperparams, + refresh_hyperparams, update_hyperparam, ) @@ -88,7 +88,7 @@ def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int] ) -def test_sync_hyperparams( +def test_refresh_hyperparams( hyperparam_dict: dict[str, int], mock_load_hyperparams: MagicMock, django_assert_num_queries, @@ -96,7 +96,7 @@ def test_sync_hyperparams( assert not HyperParameter.objects.exists() with django_assert_num_queries(1): - sync_hyperparams() + refresh_hyperparams() assert HyperParameter.objects.count() == len(hyperparam_dict) @@ -104,7 +104,7 @@ def test_sync_hyperparams( assert hyperparam_dict[name] == value -def test_sync_hyperparams_existing_records( +def test_refresh_hyperparams_existing_records( hyperparam_dict: dict[str, int], mock_load_hyperparams: MagicMock, django_assert_num_queries, @@ -113,7 +113,7 @@ def test_sync_hyperparams_existing_records( HyperParameter.objects.create(name=name, value=0) with django_assert_num_queries(1): - sync_hyperparams() + refresh_hyperparams() assert HyperParameter.objects.count() == len(hyperparam_dict) @@ -121,7 +121,7 @@ def test_sync_hyperparams_existing_records( assert hyperparam_dict[name] == value -def test_sync_hyperparams_exception( +def test_refresh_hyperparams_exception( mock_load_hyperparams: MagicMock, django_assert_num_queries, ): @@ -129,6 +129,6 @@ def test_sync_hyperparams_exception( with django_assert_num_queries(0): with pytest.raises(HyperParameterSyncFailed): - sync_hyperparams() + refresh_hyperparams() assert not HyperParameter.objects.exists() From dad9bd2637619abebcd0f377288326086a80cb22 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 02:50:55 +0500 Subject: [PATCH 13/23] Add docstrings to services --- app/src/bittensor_panel/core/services.py | 13 +++++++++++-- app/src/bittensor_panel/core/tests/test_services.py | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index c41dc2b..c45079b 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -6,11 +6,16 @@ class HyperParameterUpdateFailed(Exception): pass -class HyperParameterSyncFailed(Exception): +class HyperParameterRefreshFailed(Exception): pass def update_hyperparam(instance: HyperParameter) -> None: + """ + Update hyperparameter in the subtensor with the new value and save changes to the database. + Raises HyperParameterUpdateFailed if the remote update fails. + """ + try: result = update_remote_hyperparam(instance.name, instance.value) except (SystemExit, Exception) as e: @@ -26,10 +31,14 @@ def update_hyperparam(instance: HyperParameter) -> None: def refresh_hyperparams() -> None: + """ + Load hyperparameters from the subtensor and overwrite corresponding records in the database. + """ + try: hyperparam_dict = load_hyperparams() except (SystemExit, Exception) as e: - raise HyperParameterSyncFailed("Failed to sync hyperparameters") from e + raise HyperParameterRefreshFailed("Failed to sync hyperparameters") from e if not hyperparam_dict: return diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index 0646cad..4d935d7 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -6,7 +6,7 @@ from bittensor_panel.core.models import HyperParameter from bittensor_panel.core.services import ( - HyperParameterSyncFailed, + HyperParameterRefreshFailed, HyperParameterUpdateFailed, refresh_hyperparams, update_hyperparam, @@ -128,7 +128,7 @@ def test_refresh_hyperparams_exception( mock_load_hyperparams.side_effect = RuntimeError with django_assert_num_queries(0): - with pytest.raises(HyperParameterSyncFailed): + with pytest.raises(HyperParameterRefreshFailed): refresh_hyperparams() assert not HyperParameter.objects.exists() From c3db9db4f8a23aa719dbd9437a744c5c1e7daaba Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 03:19:40 +0500 Subject: [PATCH 14/23] Implement admin button for refreshing hyperparams --- app/src/bittensor_panel/core/admin.py | 31 ++++++++++++++- .../bittensor_panel/core/tests/test_admin.py | 38 +++++++++++++++++++ .../core/hyperparameter/change_list.html | 10 +++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 app/src/bittensor_panel/core/tests/test_admin.py create mode 100644 app/src/bittensor_panel/templates/admin/core/hyperparameter/change_list.html diff --git a/app/src/bittensor_panel/core/admin.py b/app/src/bittensor_panel/core/admin.py index 9ea2d7f..b2bf429 100644 --- a/app/src/bittensor_panel/core/admin.py +++ b/app/src/bittensor_panel/core/admin.py @@ -1,8 +1,17 @@ from django.contrib import admin, messages from django.contrib.admin import register +from django.http.response import ( + HttpResponseRedirect, +) +from django.urls import path, reverse from .models import HyperParameter -from .services import HyperParameterUpdateFailed, update_hyperparam +from .services import ( + HyperParameterRefreshFailed, + HyperParameterUpdateFailed, + refresh_hyperparams, + update_hyperparam, +) @register(HyperParameter) @@ -21,6 +30,26 @@ def save_model(self, request, obj, form, change): except HyperParameterUpdateFailed as e: messages.error(request, str(e)) + def get_urls(self): + urls = [ + path( + "refresh-hyperparams/", + self.admin_site.admin_view(self.refresh_hyperparams_view), + name="refresh_hyperparams", + ), + ] + urls += super().get_urls() + return urls + + def refresh_hyperparams_view(self, request): + if request.method == "POST": + try: + refresh_hyperparams() + except HyperParameterRefreshFailed as e: + messages.error(request, str(e)) + + return HttpResponseRedirect(reverse("admin:core_hyperparameter_changelist")) + admin.site.site_header = "Bittensor Administration Panel" admin.site.site_title = "Bittensor Administration Panel" diff --git a/app/src/bittensor_panel/core/tests/test_admin.py b/app/src/bittensor_panel/core/tests/test_admin.py new file mode 100644 index 0000000..9f355b0 --- /dev/null +++ b/app/src/bittensor_panel/core/tests/test_admin.py @@ -0,0 +1,38 @@ +from unittest.mock import MagicMock + +import pytest +from django.contrib.messages import get_messages +from django.test import Client +from pytest_mock import MockerFixture + +from bittensor_panel.core.services import HyperParameterRefreshFailed + + +@pytest.fixture +def mock_refresh_hyperparams(mocker: MockerFixture): + return mocker.patch("bittensor_panel.core.admin.refresh_hyperparams") + + +def test_refresh_hyperparams_view( + admin_client: Client, mock_refresh_hyperparams: MagicMock +): + response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") + + mock_refresh_hyperparams.assert_called_once() + + assert response.status_code == 302 + assert response.url == "/admin/core/hyperparameter/" + + +def test_refresh_hyperparams_view_exception( + admin_client: Client, mock_refresh_hyperparams: MagicMock +): + mock_refresh_hyperparams.side_effect = HyperParameterRefreshFailed("error") + + response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") + + assert response.status_code == 302 + assert response.url == "/admin/core/hyperparameter/" + + messages = list(get_messages(response.wsgi_request)) + assert len(messages) == 1 diff --git a/app/src/bittensor_panel/templates/admin/core/hyperparameter/change_list.html b/app/src/bittensor_panel/templates/admin/core/hyperparameter/change_list.html new file mode 100644 index 0000000..cf7c3ab --- /dev/null +++ b/app/src/bittensor_panel/templates/admin/core/hyperparameter/change_list.html @@ -0,0 +1,10 @@ +{% extends "admin/change_list.html" %} {% load i18n %} +{% block object-tools-items %} + {{ block.super }} +
+
+ {% csrf_token %} + +
+
+{% endblock %} From cf9b3bb69a277883fb599af7a089d7af5b522339 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 03:34:11 +0500 Subject: [PATCH 15/23] Use BigIntegerField for HyperParameter values --- .../0002_alter_hyperparameter_value.py | 17 +++++++++++++++++ app/src/bittensor_panel/core/models.py | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py diff --git a/app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py b/app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py new file mode 100644 index 0000000..3f30077 --- /dev/null +++ b/app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.11 on 2024-05-04 22:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="hyperparameter", + name="value", + field=models.BigIntegerField(), + ), + ] diff --git a/app/src/bittensor_panel/core/models.py b/app/src/bittensor_panel/core/models.py index 9fd6a64..ffdd409 100644 --- a/app/src/bittensor_panel/core/models.py +++ b/app/src/bittensor_panel/core/models.py @@ -5,4 +5,4 @@ class HyperParameter(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) name = models.CharField(max_length=255, unique=True) - value = models.IntegerField() + value = models.BigIntegerField() From d5ee696e6a7bf4ddcdc751e7afbb25adb824cb59 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 03:37:05 +0500 Subject: [PATCH 16/23] Format with ruff --- .../core/migrations/0001_initial.py | 16 +++++++--------- app/src/bittensor_panel/core/services.py | 12 +++--------- app/src/bittensor_panel/core/tests/test_admin.py | 8 ++------ app/src/bittensor_panel/core/tests/test_bt.py | 4 +--- .../bittensor_panel/core/tests/test_services.py | 4 +--- app/src/bittensor_panel/settings.py | 12 +++--------- 6 files changed, 17 insertions(+), 39 deletions(-) diff --git a/app/src/bittensor_panel/core/migrations/0001_initial.py b/app/src/bittensor_panel/core/migrations/0001_initial.py index 00c04ac..fe0ea6b 100644 --- a/app/src/bittensor_panel/core/migrations/0001_initial.py +++ b/app/src/bittensor_panel/core/migrations/0001_initial.py @@ -4,21 +4,19 @@ class Migration(migrations.Migration): - initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='HyperParameter', + name="HyperParameter", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('name', models.CharField(max_length=255, unique=True)), - ('value', models.IntegerField()), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("name", models.CharField(max_length=255, unique=True)), + ("value", models.IntegerField()), ], ), ] diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index c45079b..b3d0f17 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -19,13 +19,9 @@ def update_hyperparam(instance: HyperParameter) -> None: try: result = update_remote_hyperparam(instance.name, instance.value) except (SystemExit, Exception) as e: - raise HyperParameterUpdateFailed( - "Failed to update remote hyperparameter" - ) from e + raise HyperParameterUpdateFailed("Failed to update remote hyperparameter") from e if not result: - raise HyperParameterUpdateFailed( - "Failed to update remote hyperparameter. Subtensor returned False." - ) + raise HyperParameterUpdateFailed("Failed to update remote hyperparameter. Subtensor returned False.") instance.save(update_fields=["value"]) @@ -48,6 +44,4 @@ def refresh_hyperparams() -> None: for name, value in hyperparam_dict.items(): objs.append(HyperParameter(name=name, value=value)) - HyperParameter.objects.bulk_create( - objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"] - ) + HyperParameter.objects.bulk_create(objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"]) diff --git a/app/src/bittensor_panel/core/tests/test_admin.py b/app/src/bittensor_panel/core/tests/test_admin.py index 9f355b0..965579f 100644 --- a/app/src/bittensor_panel/core/tests/test_admin.py +++ b/app/src/bittensor_panel/core/tests/test_admin.py @@ -13,9 +13,7 @@ def mock_refresh_hyperparams(mocker: MockerFixture): return mocker.patch("bittensor_panel.core.admin.refresh_hyperparams") -def test_refresh_hyperparams_view( - admin_client: Client, mock_refresh_hyperparams: MagicMock -): +def test_refresh_hyperparams_view(admin_client: Client, mock_refresh_hyperparams: MagicMock): response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") mock_refresh_hyperparams.assert_called_once() @@ -24,9 +22,7 @@ def test_refresh_hyperparams_view( assert response.url == "/admin/core/hyperparameter/" -def test_refresh_hyperparams_view_exception( - admin_client: Client, mock_refresh_hyperparams: MagicMock -): +def test_refresh_hyperparams_view_exception(admin_client: Client, mock_refresh_hyperparams: MagicMock): mock_refresh_hyperparams.side_effect = HyperParameterRefreshFailed("error") response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index 2985c6c..22595e5 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -92,9 +92,7 @@ def mock_wallet(mocker: MockerFixture): @pytest.mark.parametrize("result", [True, False]) -def test_update_remote_hyperparam( - mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings -): +def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings): mock_subtensor.return_value.set_hyperparameter.return_value = result name = "difficulty" diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index 4d935d7..46ff0c3 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -83,9 +83,7 @@ def hyperparam_dict(faker: Faker): @pytest.fixture def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int]): - return mocker.patch( - "bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict - ) + return mocker.patch("bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict) def test_refresh_hyperparams( diff --git a/app/src/bittensor_panel/settings.py b/app/src/bittensor_panel/settings.py index b676fd9..dde631d 100644 --- a/app/src/bittensor_panel/settings.py +++ b/app/src/bittensor_panel/settings.py @@ -146,9 +146,7 @@ def wrapped(*args, **kwargs): WSGI_APPLICATION = "bittensor_panel.wsgi.application" DATABASES = {} -if env( - "DATABASE_POOL_URL" -): # DB transaction-based connection pool, such as one provided PgBouncer +if env("DATABASE_POOL_URL"): # DB transaction-based connection pool, such as one provided PgBouncer DATABASES["default"] = { **env.db_url("DATABASE_POOL_URL"), "DISABLE_SERVER_SIDE_CURSORS": True, # prevents random cursor errors with transaction-based connection pool @@ -206,9 +204,7 @@ def wrapped(*args, **kwargs): CELERY_BROKER_URL = env("CELERY_BROKER_URL", default="") CELERY_RESULT_BACKEND = env("CELERY_BROKER_URL", default="") # store results in Redis -CELERY_RESULT_EXPIRES = int( - timedelta(days=1).total_seconds() -) # time until task result deletion +CELERY_RESULT_EXPIRES = int(timedelta(days=1).total_seconds()) # time until task result deletion CELERY_COMPRESSION = "gzip" # task compression CELERY_MESSAGE_COMPRESSION = "gzip" # result compression CELERY_SEND_EVENTS = True # needed for worker monitoring @@ -227,9 +223,7 @@ def wrapped(*args, **kwargs): CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" -CELERY_WORKER_PREFETCH_MULTIPLIER = env.int( - "CELERY_WORKER_PREFETCH_MULTIPLIER", default=10 -) +CELERY_WORKER_PREFETCH_MULTIPLIER = env.int("CELERY_WORKER_PREFETCH_MULTIPLIER", default=10) CELERY_BROKER_POOL_LIMIT = env.int("CELERY_BROKER_POOL_LIMIT", default=50) EMAIL_BACKEND = env("EMAIL_BACKEND") From e79abc9f4462e639e8875d2714f90b31308e8621 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 15:39:17 +0500 Subject: [PATCH 17/23] Redesign error handling moving api errors to bt --- app/src/bittensor_panel/core/admin.py | 7 ++-- app/src/bittensor_panel/core/bt.py | 42 ++++++++++++++----- app/src/bittensor_panel/core/exceptions.py | 14 +++++++ app/src/bittensor_panel/core/services.py | 29 +++++-------- .../bittensor_panel/core/tests/test_admin.py | 16 +++---- app/src/bittensor_panel/core/tests/test_bt.py | 36 +++++++++++++++- .../core/tests/test_services.py | 11 ++--- 7 files changed, 107 insertions(+), 48 deletions(-) create mode 100644 app/src/bittensor_panel/core/exceptions.py diff --git a/app/src/bittensor_panel/core/admin.py b/app/src/bittensor_panel/core/admin.py index b2bf429..8a6af45 100644 --- a/app/src/bittensor_panel/core/admin.py +++ b/app/src/bittensor_panel/core/admin.py @@ -5,10 +5,9 @@ ) from django.urls import path, reverse +from .exceptions import BittensorAPIError, HyperParameterUpdateFailed from .models import HyperParameter from .services import ( - HyperParameterRefreshFailed, - HyperParameterUpdateFailed, refresh_hyperparams, update_hyperparam, ) @@ -27,7 +26,7 @@ def has_delete_permission(self, request, obj=None): def save_model(self, request, obj, form, change): try: update_hyperparam(obj) - except HyperParameterUpdateFailed as e: + except (BittensorAPIError, HyperParameterUpdateFailed) as e: messages.error(request, str(e)) def get_urls(self): @@ -45,7 +44,7 @@ def refresh_hyperparams_view(self, request): if request.method == "POST": try: refresh_hyperparams() - except HyperParameterRefreshFailed as e: + except BittensorAPIError as e: messages.error(request, str(e)) return HttpResponseRedirect(reverse("admin:core_hyperparameter_changelist")) diff --git a/app/src/bittensor_panel/core/bt.py b/app/src/bittensor_panel/core/bt.py index 4c9394e..4214180 100644 --- a/app/src/bittensor_panel/core/bt.py +++ b/app/src/bittensor_panel/core/bt.py @@ -3,9 +3,19 @@ import bittensor from django.conf import settings +from .exceptions import ( + SubtensorConnectionError, + SubtensorServerError, +) + def get_subtensor() -> bittensor.subtensor: - return bittensor.subtensor(settings.SUBTENSOR_ADDRESS) + try: + return bittensor.subtensor(settings.SUBTENSOR_ADDRESS) + except (SystemExit, Exception) as e: + raise SubtensorConnectionError( + f"Failed to connect to subtensor at: {settings.SUBTENSOR_ADDRESS}" + ) from e def get_wallet() -> bittensor.wallet: @@ -19,7 +29,12 @@ def get_wallet() -> bittensor.wallet: def load_hyperparams() -> dict[str, int] | None: st = get_subtensor() - hyperparams = st.get_subnet_hyperparameters(settings.SUBNET_UID) + try: + hyperparams = st.get_subnet_hyperparameters(settings.SUBNET_UID) + except Exception as e: + raise SubtensorServerError( + f"Failed to load hyperparameters from subtensor\n{e}" + ) from e if not hyperparams: return None @@ -31,12 +46,17 @@ def update_remote_hyperparam(name: str, value: int) -> bool: st = get_subtensor() wallet = get_wallet() - return st.set_hyperparameter( - wallet=wallet, - netuid=settings.SUBNET_UID, - parameter=name, - value=value, - wait_for_inclusion=False, - wait_for_finalization=True, - prompt=False, - ) + try: + return st.set_hyperparameter( + wallet=wallet, + netuid=settings.SUBNET_UID, + parameter=name, + value=value, + wait_for_inclusion=False, + wait_for_finalization=True, + prompt=False, + ) + except Exception as exc: + raise SubtensorServerError( + f"Failed to update hyperparameter in subtensor\n{exc}" + ) from exc diff --git a/app/src/bittensor_panel/core/exceptions.py b/app/src/bittensor_panel/core/exceptions.py new file mode 100644 index 0000000..c630857 --- /dev/null +++ b/app/src/bittensor_panel/core/exceptions.py @@ -0,0 +1,14 @@ +class BittensorAPIError(Exception): + """Base class for all Bittensor API errors.""" + + +class SubtensorConnectionError(BittensorAPIError): + """Failed to connect to subtensor instance.""" + + +class SubtensorServerError(BittensorAPIError): + """Subtensor network returned an error.""" + + +class HyperParameterUpdateFailed(Exception): + """Failed to update hyperparameter in subtensor.""" diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index b3d0f17..9d14d06 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -1,27 +1,19 @@ from bittensor_panel.core.bt import load_hyperparams, update_remote_hyperparam +from bittensor_panel.core.exceptions import HyperParameterUpdateFailed from bittensor_panel.core.models import HyperParameter -class HyperParameterUpdateFailed(Exception): - pass - - -class HyperParameterRefreshFailed(Exception): - pass - - def update_hyperparam(instance: HyperParameter) -> None: """ Update hyperparameter in the subtensor with the new value and save changes to the database. - Raises HyperParameterUpdateFailed if the remote update fails. """ - try: - result = update_remote_hyperparam(instance.name, instance.value) - except (SystemExit, Exception) as e: - raise HyperParameterUpdateFailed("Failed to update remote hyperparameter") from e + result = update_remote_hyperparam(instance.name, instance.value) + if not result: - raise HyperParameterUpdateFailed("Failed to update remote hyperparameter. Subtensor returned False.") + raise HyperParameterUpdateFailed( + "Failed to update remote hyperparameter. Subtensor returned False." + ) instance.save(update_fields=["value"]) @@ -31,10 +23,7 @@ def refresh_hyperparams() -> None: Load hyperparameters from the subtensor and overwrite corresponding records in the database. """ - try: - hyperparam_dict = load_hyperparams() - except (SystemExit, Exception) as e: - raise HyperParameterRefreshFailed("Failed to sync hyperparameters") from e + hyperparam_dict = load_hyperparams() if not hyperparam_dict: return @@ -44,4 +33,6 @@ def refresh_hyperparams() -> None: for name, value in hyperparam_dict.items(): objs.append(HyperParameter(name=name, value=value)) - HyperParameter.objects.bulk_create(objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"]) + HyperParameter.objects.bulk_create( + objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"] + ) diff --git a/app/src/bittensor_panel/core/tests/test_admin.py b/app/src/bittensor_panel/core/tests/test_admin.py index 965579f..632c8c7 100644 --- a/app/src/bittensor_panel/core/tests/test_admin.py +++ b/app/src/bittensor_panel/core/tests/test_admin.py @@ -1,11 +1,10 @@ from unittest.mock import MagicMock import pytest -from django.contrib.messages import get_messages from django.test import Client from pytest_mock import MockerFixture -from bittensor_panel.core.services import HyperParameterRefreshFailed +from bittensor_panel.core.exceptions import SubtensorConnectionError @pytest.fixture @@ -13,7 +12,9 @@ def mock_refresh_hyperparams(mocker: MockerFixture): return mocker.patch("bittensor_panel.core.admin.refresh_hyperparams") -def test_refresh_hyperparams_view(admin_client: Client, mock_refresh_hyperparams: MagicMock): +def test_refresh_hyperparams_view( + admin_client: Client, mock_refresh_hyperparams: MagicMock +): response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") mock_refresh_hyperparams.assert_called_once() @@ -22,13 +23,12 @@ def test_refresh_hyperparams_view(admin_client: Client, mock_refresh_hyperparams assert response.url == "/admin/core/hyperparameter/" -def test_refresh_hyperparams_view_exception(admin_client: Client, mock_refresh_hyperparams: MagicMock): - mock_refresh_hyperparams.side_effect = HyperParameterRefreshFailed("error") +def test_refresh_hyperparams_view_exception( + admin_client: Client, mock_refresh_hyperparams: MagicMock +): + mock_refresh_hyperparams.side_effect = SubtensorConnectionError response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") assert response.status_code == 302 assert response.url == "/admin/core/hyperparameter/" - - messages = list(get_messages(response.wsgi_request)) - assert len(messages) == 1 diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index 22595e5..4353c7b 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -6,6 +6,10 @@ from pytest_mock import MockerFixture from bittensor_panel.core import bt +from bittensor_panel.core.exceptions import ( + SubtensorConnectionError, + SubtensorServerError, +) def test_get_subtensor(mocker: MockerFixture, settings): @@ -18,6 +22,18 @@ def test_get_subtensor(mocker: MockerFixture, settings): mock.assert_called_once_with(settings.SUBTENSOR_ADDRESS) +@pytest.mark.parametrize("exc_type", [SystemExit, RuntimeError]) +def test_get_subtensor_exception(mocker: MockerFixture, exc_type): + mocker.patch( + "bittensor_panel.core.bt.bittensor.subtensor", + autospec=True, + side_effect=exc_type, + ) + + with pytest.raises(SubtensorConnectionError): + bt.get_subtensor() + + def test_get_wallet(mocker: MockerFixture, settings): mock = mocker.patch("bittensor_panel.core.bt.bittensor.wallet", autospec=True) @@ -86,13 +102,22 @@ def test_load_hyperparams_empty_list(mock_subtensor: MagicMock): assert bt.load_hyperparams() is None +def test_load_hyperparams_exception(mock_subtensor: MagicMock): + mock_subtensor.return_value.get_subnet_hyperparameters.side_effect = RuntimeError + + with pytest.raises(SubtensorServerError): + bt.load_hyperparams() + + @pytest.fixture def mock_wallet(mocker: MockerFixture): return mocker.patch("bittensor_panel.core.bt.get_wallet", autospec=True) @pytest.mark.parametrize("result", [True, False]) -def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings): +def test_update_remote_hyperparam( + mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings +): mock_subtensor.return_value.set_hyperparameter.return_value = result name = "difficulty" @@ -109,3 +134,12 @@ def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicM wait_for_finalization=True, prompt=False, ) + + +def test_update_remote_hyperparam_exception( + mock_subtensor: MagicMock, mock_wallet: MagicMock +): + mock_subtensor.return_value.set_hyperparameter.side_effect = RuntimeError + + with pytest.raises(SubtensorServerError): + bt.update_remote_hyperparam("difficulty", 10) diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index 46ff0c3..3a33f0a 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -4,10 +4,9 @@ from faker import Faker from pytest_mock import MockerFixture +from bittensor_panel.core.exceptions import HyperParameterUpdateFailed from bittensor_panel.core.models import HyperParameter from bittensor_panel.core.services import ( - HyperParameterRefreshFailed, - HyperParameterUpdateFailed, refresh_hyperparams, update_hyperparam, ) @@ -72,7 +71,7 @@ def test_update_hyperparam_remote_exception( hyperparam.value = 999 with django_assert_num_queries(0): - with pytest.raises(HyperParameterUpdateFailed): + with pytest.raises(RuntimeError): update_hyperparam(hyperparam) @@ -83,7 +82,9 @@ def hyperparam_dict(faker: Faker): @pytest.fixture def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int]): - return mocker.patch("bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict) + return mocker.patch( + "bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict + ) def test_refresh_hyperparams( @@ -126,7 +127,7 @@ def test_refresh_hyperparams_exception( mock_load_hyperparams.side_effect = RuntimeError with django_assert_num_queries(0): - with pytest.raises(HyperParameterRefreshFailed): + with pytest.raises(RuntimeError): refresh_hyperparams() assert not HyperParameter.objects.exists() From 09dbcd950143b5e7e699c0d3eaf8759c524ebf2f Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Sun, 5 May 2024 15:47:04 +0500 Subject: [PATCH 18/23] Format with ruff --- app/src/bittensor_panel/core/bt.py | 12 +++--------- app/src/bittensor_panel/core/services.py | 8 ++------ app/src/bittensor_panel/core/tests/test_admin.py | 8 ++------ app/src/bittensor_panel/core/tests/test_bt.py | 8 ++------ app/src/bittensor_panel/core/tests/test_services.py | 4 +--- 5 files changed, 10 insertions(+), 30 deletions(-) diff --git a/app/src/bittensor_panel/core/bt.py b/app/src/bittensor_panel/core/bt.py index 4214180..31d28d8 100644 --- a/app/src/bittensor_panel/core/bt.py +++ b/app/src/bittensor_panel/core/bt.py @@ -13,9 +13,7 @@ def get_subtensor() -> bittensor.subtensor: try: return bittensor.subtensor(settings.SUBTENSOR_ADDRESS) except (SystemExit, Exception) as e: - raise SubtensorConnectionError( - f"Failed to connect to subtensor at: {settings.SUBTENSOR_ADDRESS}" - ) from e + raise SubtensorConnectionError(f"Failed to connect to subtensor at: {settings.SUBTENSOR_ADDRESS}") from e def get_wallet() -> bittensor.wallet: @@ -32,9 +30,7 @@ def load_hyperparams() -> dict[str, int] | None: try: hyperparams = st.get_subnet_hyperparameters(settings.SUBNET_UID) except Exception as e: - raise SubtensorServerError( - f"Failed to load hyperparameters from subtensor\n{e}" - ) from e + raise SubtensorServerError(f"Failed to load hyperparameters from subtensor\n{e}") from e if not hyperparams: return None @@ -57,6 +53,4 @@ def update_remote_hyperparam(name: str, value: int) -> bool: prompt=False, ) except Exception as exc: - raise SubtensorServerError( - f"Failed to update hyperparameter in subtensor\n{exc}" - ) from exc + raise SubtensorServerError(f"Failed to update hyperparameter in subtensor\n{exc}") from exc diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index 9d14d06..fd00544 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -11,9 +11,7 @@ def update_hyperparam(instance: HyperParameter) -> None: result = update_remote_hyperparam(instance.name, instance.value) if not result: - raise HyperParameterUpdateFailed( - "Failed to update remote hyperparameter. Subtensor returned False." - ) + raise HyperParameterUpdateFailed("Failed to update remote hyperparameter. Subtensor returned False.") instance.save(update_fields=["value"]) @@ -33,6 +31,4 @@ def refresh_hyperparams() -> None: for name, value in hyperparam_dict.items(): objs.append(HyperParameter(name=name, value=value)) - HyperParameter.objects.bulk_create( - objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"] - ) + HyperParameter.objects.bulk_create(objs, update_conflicts=True, update_fields=["value"], unique_fields=["name"]) diff --git a/app/src/bittensor_panel/core/tests/test_admin.py b/app/src/bittensor_panel/core/tests/test_admin.py index 632c8c7..3b12cbb 100644 --- a/app/src/bittensor_panel/core/tests/test_admin.py +++ b/app/src/bittensor_panel/core/tests/test_admin.py @@ -12,9 +12,7 @@ def mock_refresh_hyperparams(mocker: MockerFixture): return mocker.patch("bittensor_panel.core.admin.refresh_hyperparams") -def test_refresh_hyperparams_view( - admin_client: Client, mock_refresh_hyperparams: MagicMock -): +def test_refresh_hyperparams_view(admin_client: Client, mock_refresh_hyperparams: MagicMock): response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") mock_refresh_hyperparams.assert_called_once() @@ -23,9 +21,7 @@ def test_refresh_hyperparams_view( assert response.url == "/admin/core/hyperparameter/" -def test_refresh_hyperparams_view_exception( - admin_client: Client, mock_refresh_hyperparams: MagicMock -): +def test_refresh_hyperparams_view_exception(admin_client: Client, mock_refresh_hyperparams: MagicMock): mock_refresh_hyperparams.side_effect = SubtensorConnectionError response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index 4353c7b..b0bf634 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -115,9 +115,7 @@ def mock_wallet(mocker: MockerFixture): @pytest.mark.parametrize("result", [True, False]) -def test_update_remote_hyperparam( - mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings -): +def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings): mock_subtensor.return_value.set_hyperparameter.return_value = result name = "difficulty" @@ -136,9 +134,7 @@ def test_update_remote_hyperparam( ) -def test_update_remote_hyperparam_exception( - mock_subtensor: MagicMock, mock_wallet: MagicMock -): +def test_update_remote_hyperparam_exception(mock_subtensor: MagicMock, mock_wallet: MagicMock): mock_subtensor.return_value.set_hyperparameter.side_effect = RuntimeError with pytest.raises(SubtensorServerError): diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index 3a33f0a..d945315 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -82,9 +82,7 @@ def hyperparam_dict(faker: Faker): @pytest.fixture def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int]): - return mocker.patch( - "bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict - ) + return mocker.patch("bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict) def test_refresh_hyperparams( From 7ed0f448ba84107ddd6abd162f9fd4851139f8b7 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Mon, 6 May 2024 21:08:07 +0500 Subject: [PATCH 19/23] Use DecimalField for hyperparameter values --- .../core/migrations/0001_initial.py | 14 +++++++++++--- .../0002_alter_hyperparameter_value.py | 17 ----------------- app/src/bittensor_panel/core/models.py | 2 +- app/src/bittensor_panel/core/services.py | 2 +- 4 files changed, 13 insertions(+), 22 deletions(-) delete mode 100644 app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py diff --git a/app/src/bittensor_panel/core/migrations/0001_initial.py b/app/src/bittensor_panel/core/migrations/0001_initial.py index fe0ea6b..f7e0b57 100644 --- a/app/src/bittensor_panel/core/migrations/0001_initial.py +++ b/app/src/bittensor_panel/core/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.11 on 2024-05-03 20:44 +# Generated by Django 4.2.11 on 2024-05-06 16:07 from django.db import migrations, models @@ -12,11 +12,19 @@ class Migration(migrations.Migration): migrations.CreateModel( name="HyperParameter", fields=[ - ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("name", models.CharField(max_length=255, unique=True)), - ("value", models.IntegerField()), + ("value", models.DecimalField(decimal_places=0, max_digits=32)), ], ), ] diff --git a/app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py b/app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py deleted file mode 100644 index 3f30077..0000000 --- a/app/src/bittensor_panel/core/migrations/0002_alter_hyperparameter_value.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.11 on 2024-05-04 22:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("core", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="hyperparameter", - name="value", - field=models.BigIntegerField(), - ), - ] diff --git a/app/src/bittensor_panel/core/models.py b/app/src/bittensor_panel/core/models.py index ffdd409..0e5f2f4 100644 --- a/app/src/bittensor_panel/core/models.py +++ b/app/src/bittensor_panel/core/models.py @@ -5,4 +5,4 @@ class HyperParameter(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) name = models.CharField(max_length=255, unique=True) - value = models.BigIntegerField() + value = models.DecimalField(max_digits=32, decimal_places=0) diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index fd00544..c713f2b 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -8,7 +8,7 @@ def update_hyperparam(instance: HyperParameter) -> None: Update hyperparameter in the subtensor with the new value and save changes to the database. """ - result = update_remote_hyperparam(instance.name, instance.value) + result = update_remote_hyperparam(instance.name, int(instance.value)) if not result: raise HyperParameterUpdateFailed("Failed to update remote hyperparameter. Subtensor returned False.") From 4d42faf9bf6b092402733a4251db408ba9b59a73 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Mon, 6 May 2024 23:06:59 +0500 Subject: [PATCH 20/23] Use Charfield for hyperparameter values --- .../core/migrations/0001_initial.py | 4 ++-- app/src/bittensor_panel/core/models.py | 2 +- app/src/bittensor_panel/core/services.py | 2 +- app/src/bittensor_panel/core/tests/test_bt.py | 8 ++++++-- .../bittensor_panel/core/tests/test_services.py | 14 ++++++++------ 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/bittensor_panel/core/migrations/0001_initial.py b/app/src/bittensor_panel/core/migrations/0001_initial.py index f7e0b57..59f26ad 100644 --- a/app/src/bittensor_panel/core/migrations/0001_initial.py +++ b/app/src/bittensor_panel/core/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.11 on 2024-05-06 16:07 +# Generated by Django 4.2.11 on 2024-05-06 18:02 from django.db import migrations, models @@ -24,7 +24,7 @@ class Migration(migrations.Migration): ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("name", models.CharField(max_length=255, unique=True)), - ("value", models.DecimalField(decimal_places=0, max_digits=32)), + ("value", models.CharField(max_length=255)), ], ), ] diff --git a/app/src/bittensor_panel/core/models.py b/app/src/bittensor_panel/core/models.py index 0e5f2f4..7acf9ab 100644 --- a/app/src/bittensor_panel/core/models.py +++ b/app/src/bittensor_panel/core/models.py @@ -5,4 +5,4 @@ class HyperParameter(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) name = models.CharField(max_length=255, unique=True) - value = models.DecimalField(max_digits=32, decimal_places=0) + value = models.CharField(max_length=255) diff --git a/app/src/bittensor_panel/core/services.py b/app/src/bittensor_panel/core/services.py index c713f2b..fd00544 100644 --- a/app/src/bittensor_panel/core/services.py +++ b/app/src/bittensor_panel/core/services.py @@ -8,7 +8,7 @@ def update_hyperparam(instance: HyperParameter) -> None: Update hyperparameter in the subtensor with the new value and save changes to the database. """ - result = update_remote_hyperparam(instance.name, int(instance.value)) + result = update_remote_hyperparam(instance.name, instance.value) if not result: raise HyperParameterUpdateFailed("Failed to update remote hyperparameter. Subtensor returned False.") diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index b0bf634..4353c7b 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -115,7 +115,9 @@ def mock_wallet(mocker: MockerFixture): @pytest.mark.parametrize("result", [True, False]) -def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings): +def test_update_remote_hyperparam( + mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings +): mock_subtensor.return_value.set_hyperparameter.return_value = result name = "difficulty" @@ -134,7 +136,9 @@ def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicM ) -def test_update_remote_hyperparam_exception(mock_subtensor: MagicMock, mock_wallet: MagicMock): +def test_update_remote_hyperparam_exception( + mock_subtensor: MagicMock, mock_wallet: MagicMock +): mock_subtensor.return_value.set_hyperparameter.side_effect = RuntimeError with pytest.raises(SubtensorServerError): diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index d945315..cefcfd8 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -18,7 +18,7 @@ def hyperparam(): return HyperParameter.objects.create( name="test", - value=123, + value="123", ) @@ -34,7 +34,7 @@ def test_update_hyperparam( ): mock_update_remote_hyperparam.return_value = True - new_value = 999 + new_value = "999" hyperparam.value = new_value @@ -54,7 +54,7 @@ def test_update_hyperparam_remote_returns_false( ): mock_update_remote_hyperparam.return_value = False - hyperparam.value = 999 + hyperparam.value = "999" with django_assert_num_queries(0): with pytest.raises(HyperParameterUpdateFailed): @@ -68,7 +68,7 @@ def test_update_hyperparam_remote_exception( ): mock_update_remote_hyperparam.side_effect = RuntimeError - hyperparam.value = 999 + hyperparam.value = "999" with django_assert_num_queries(0): with pytest.raises(RuntimeError): @@ -77,12 +77,14 @@ def test_update_hyperparam_remote_exception( @pytest.fixture def hyperparam_dict(faker: Faker): - return {faker.word(): faker.pyint() for _ in range(10)} + return {faker.word(): str(faker.pyint()) for _ in range(10)} @pytest.fixture def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int]): - return mocker.patch("bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict) + return mocker.patch( + "bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict + ) def test_refresh_hyperparams( From 63bf0768d35c86722535c8789f07e82b3cf5dee6 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Mon, 6 May 2024 23:18:28 +0500 Subject: [PATCH 21/23] Remove unused hotkey setting and env var --- app/src/bittensor_panel/core/bt.py | 1 - app/src/bittensor_panel/core/tests/test_bt.py | 9 ++------- app/src/bittensor_panel/core/tests/test_services.py | 4 +--- app/src/bittensor_panel/settings.py | 1 - envs/dev/.env.template | 1 - 5 files changed, 3 insertions(+), 13 deletions(-) diff --git a/app/src/bittensor_panel/core/bt.py b/app/src/bittensor_panel/core/bt.py index 31d28d8..ea8b028 100644 --- a/app/src/bittensor_panel/core/bt.py +++ b/app/src/bittensor_panel/core/bt.py @@ -19,7 +19,6 @@ def get_subtensor() -> bittensor.subtensor: def get_wallet() -> bittensor.wallet: return bittensor.wallet( name=settings.WALLET_NAME, - hotkey=settings.WALLET_HOTKEY, path=settings.WALLET_PATH, ) diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index 4353c7b..e35b75d 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -43,7 +43,6 @@ def test_get_wallet(mocker: MockerFixture, settings): mock.assert_called_once_with( name=settings.WALLET_NAME, - hotkey=settings.WALLET_HOTKEY, path=settings.WALLET_PATH, ) @@ -115,9 +114,7 @@ def mock_wallet(mocker: MockerFixture): @pytest.mark.parametrize("result", [True, False]) -def test_update_remote_hyperparam( - mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings -): +def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicMock, result: bool, settings): mock_subtensor.return_value.set_hyperparameter.return_value = result name = "difficulty" @@ -136,9 +133,7 @@ def test_update_remote_hyperparam( ) -def test_update_remote_hyperparam_exception( - mock_subtensor: MagicMock, mock_wallet: MagicMock -): +def test_update_remote_hyperparam_exception(mock_subtensor: MagicMock, mock_wallet: MagicMock): mock_subtensor.return_value.set_hyperparameter.side_effect = RuntimeError with pytest.raises(SubtensorServerError): diff --git a/app/src/bittensor_panel/core/tests/test_services.py b/app/src/bittensor_panel/core/tests/test_services.py index cefcfd8..fb4513c 100644 --- a/app/src/bittensor_panel/core/tests/test_services.py +++ b/app/src/bittensor_panel/core/tests/test_services.py @@ -82,9 +82,7 @@ def hyperparam_dict(faker: Faker): @pytest.fixture def mock_load_hyperparams(mocker: MockerFixture, hyperparam_dict: dict[str, int]): - return mocker.patch( - "bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict - ) + return mocker.patch("bittensor_panel.core.services.load_hyperparams", return_value=hyperparam_dict) def test_refresh_hyperparams( diff --git a/app/src/bittensor_panel/settings.py b/app/src/bittensor_panel/settings.py index dde631d..9542bb4 100644 --- a/app/src/bittensor_panel/settings.py +++ b/app/src/bittensor_panel/settings.py @@ -313,5 +313,4 @@ def configure_structlog(): SUBTENSOR_ADDRESS = env.str("SUBTENSOR_ADDRESS", default="local") SUBNET_UID = env.int("SUBNET_UID") WALLET_NAME = env.str("WALLET_NAME") -WALLET_HOTKEY = env.str("WALLET_HOTKEY") WALLET_PATH = env.path("WALLET_PATH") diff --git a/envs/dev/.env.template b/envs/dev/.env.template index 22132b4..8b5aa71 100644 --- a/envs/dev/.env.template +++ b/envs/dev/.env.template @@ -69,5 +69,4 @@ BACKUP_LOCAL_ROTATE_KEEP_LAST= SUBTENSOR_ADDRESS=local SUBNET_UID=1 WALLET_NAME="default" -WALLET_HOTKEY="default" WALLET_PATH="" From b0d35f286b89eb7aef2ea9a0b62eea60b3bcda28 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Mon, 6 May 2024 23:21:13 +0500 Subject: [PATCH 22/23] Fix typing --- app/src/bittensor_panel/core/bt.py | 2 +- app/src/bittensor_panel/core/tests/test_admin.py | 4 ++-- app/src/bittensor_panel/core/tests/test_bt.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/bittensor_panel/core/bt.py b/app/src/bittensor_panel/core/bt.py index ea8b028..b328b6b 100644 --- a/app/src/bittensor_panel/core/bt.py +++ b/app/src/bittensor_panel/core/bt.py @@ -37,7 +37,7 @@ def load_hyperparams() -> dict[str, int] | None: return asdict(hyperparams) -def update_remote_hyperparam(name: str, value: int) -> bool: +def update_remote_hyperparam(name: str, value: str) -> bool: st = get_subtensor() wallet = get_wallet() diff --git a/app/src/bittensor_panel/core/tests/test_admin.py b/app/src/bittensor_panel/core/tests/test_admin.py index 3b12cbb..2da4cbb 100644 --- a/app/src/bittensor_panel/core/tests/test_admin.py +++ b/app/src/bittensor_panel/core/tests/test_admin.py @@ -18,7 +18,7 @@ def test_refresh_hyperparams_view(admin_client: Client, mock_refresh_hyperparams mock_refresh_hyperparams.assert_called_once() assert response.status_code == 302 - assert response.url == "/admin/core/hyperparameter/" + assert response.url == "/admin/core/hyperparameter/" # type: ignore def test_refresh_hyperparams_view_exception(admin_client: Client, mock_refresh_hyperparams: MagicMock): @@ -27,4 +27,4 @@ def test_refresh_hyperparams_view_exception(admin_client: Client, mock_refresh_h response = admin_client.post("/admin/core/hyperparameter/refresh-hyperparams/") assert response.status_code == 302 - assert response.url == "/admin/core/hyperparameter/" + assert response.url == "/admin/core/hyperparameter/" # type: ignore diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index e35b75d..c16a928 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -118,7 +118,7 @@ def test_update_remote_hyperparam(mock_subtensor: MagicMock, mock_wallet: MagicM mock_subtensor.return_value.set_hyperparameter.return_value = result name = "difficulty" - value = 10 + value = "10" assert bt.update_remote_hyperparam(name, value) == result @@ -137,4 +137,4 @@ def test_update_remote_hyperparam_exception(mock_subtensor: MagicMock, mock_wall mock_subtensor.return_value.set_hyperparameter.side_effect = RuntimeError with pytest.raises(SubtensorServerError): - bt.update_remote_hyperparam("difficulty", 10) + bt.update_remote_hyperparam("difficulty", "10") From 5bb5fecd4a127d35515ca1dc0e057e731713c018 Mon Sep 17 00:00:00 2001 From: Olzhas Arystanov Date: Tue, 9 Jul 2024 03:03:47 +0500 Subject: [PATCH 23/23] Bump bittensor to 7.2.0 --- app/src/bittensor_panel/core/tests/test_bt.py | 2 + pdm.lock | 616 +++++++++--------- pyproject.toml | 2 +- 3 files changed, 318 insertions(+), 302 deletions(-) diff --git a/app/src/bittensor_panel/core/tests/test_bt.py b/app/src/bittensor_panel/core/tests/test_bt.py index c16a928..2fc1c74 100644 --- a/app/src/bittensor_panel/core/tests/test_bt.py +++ b/app/src/bittensor_panel/core/tests/test_bt.py @@ -77,6 +77,8 @@ def hyperparam_values(faker: Faker): "max_validators": faker.pyint(), "adjustment_alpha": faker.pyint(), "difficulty": faker.pyint(), + "commit_reveal_weights_interval": faker.pyint(), + "commit_reveal_weights_enabled": faker.pyint(), } diff --git a/pdm.lock b/pdm.lock index 4049f16..ccb7245 100644 --- a/pdm.lock +++ b/pdm.lock @@ -4,12 +4,12 @@ [metadata] groups = ["default", "lint", "security_check", "test", "type_check"] strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.1" -content_hash = "sha256:77451dad8f2c6ad4a76038e17d0a627a66fa164fd5954ae228e2cd92f109029d" +lock_version = "4.4.2" +content_hash = "sha256:cfdd60fc64d07f520513c72ffa83bd29027a6a9e8d82799fc87b49ff5a87348c" [[package]] name = "aiohttp" -version = "3.9.0b0" +version = "3.9.5" requires_python = ">=3.8" summary = "Async http client/server framework (asyncio)" groups = ["default"] @@ -21,22 +21,22 @@ dependencies = [ "yarl<2.0,>=1.0", ] files = [ - {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:94197a77859ab1039b9ca6c3c393b8e7b5fc34a9abfbcb58daac38ab89684a99"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c78d2cfe1515cfb31ba67edf0518c6677a963ec2039b652b03a886733e72e65"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28b38a14f564c833e59c99f748b48803e4babeabc6a0307952b01e6c8d642cab"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e596cfc52380f71e197e7cf0e2d3c4714b4bf66d2d562cdbd5442284bac18909"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6190951b7933c834d9346e21c5a81642caa210d291cda4036daf85fc53162d35"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb0cb2cbf95cf4cc40307d0d0187f59c4b86b1d7d1a624922a7d0b046deffba7"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e27c283e21e94fa1582d31b57c514b87ab609882ade413ce43f585d73c8a33fc"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6826c59b4e99673728bcdaecacbd699b7521f17ca165c63a5e26e23d42aeea5"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aa4738f3b1b916b1cc69ed3d1dead9714919dc4d30ae0d5f6d55eadb2c511133"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b2abd7936f687de3a3ab199b145a9de01ed046eb5640cd66f47da07a9050a78"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:652cc00a97bc206c470db06276ce57ff2a53a625795bbce8435ef8b6a4cb0113"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d54529c1d95d5d200ecb7133a343785e5661a804f3dcee090a7bca3b48189d69"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:324fe990c97721ea8eb4d439f12b59d1a93cd7e0dd188c7b145bffdfbd327dc3"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-win32.whl", hash = "sha256:3a2ef8318435f40f5906af36fda20b5432e07e6a7e05de3a4d2934c25320b8ff"}, - {file = "aiohttp-3.9.0b0-cp311-cp311-win_amd64.whl", hash = "sha256:887d8757aafc7f6fbda76faaff21fc2aa31b9dca0911ecd6b60b0fe922a2abfc"}, - {file = "aiohttp-3.9.0b0.tar.gz", hash = "sha256:cecc64fd7bae6debdf43437e3c83183c40d4f4d86486946f412c113960598eee"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [[package]] @@ -67,6 +67,17 @@ files = [ {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +requires_python = ">=3.8" +summary = "Reusable constraint types to use with typing.Annotated" +groups = ["default"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + [[package]] name = "ansible" version = "6.7.0" @@ -114,7 +125,7 @@ files = [ [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["default"] @@ -123,8 +134,8 @@ dependencies = [ "sniffio>=1.1", ] files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [[package]] @@ -141,13 +152,13 @@ files = [ [[package]] name = "argcomplete" -version = "3.3.0" +version = "3.4.0" requires_python = ">=3.8" summary = "Bash tab completion for argparse" groups = ["default"] files = [ - {file = "argcomplete-3.3.0-py3-none-any.whl", hash = "sha256:c168c3723482c031df3c207d4ba8fa702717ccb9fc0bfe4117166c1f537b4a54"}, - {file = "argcomplete-3.3.0.tar.gz", hash = "sha256:fd03ff4a5b9e6580569d34b273f741e85cd9e072f3feeeee3eba4891c70eda62"}, + {file = "argcomplete-3.4.0-py3-none-any.whl", hash = "sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5"}, + {file = "argcomplete-3.4.0.tar.gz", hash = "sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f"}, ] [[package]] @@ -220,7 +231,7 @@ files = [ [[package]] name = "bandit" -version = "1.7.8" +version = "1.7.9" requires_python = ">=3.8" summary = "Security oriented static analyser for python code." groups = ["security_check"] @@ -231,8 +242,8 @@ dependencies = [ "stevedore>=1.20.0", ] files = [ - {file = "bandit-1.7.8-py3-none-any.whl", hash = "sha256:509f7af645bc0cd8fd4587abc1a038fc795636671ee8204d502b933aee44f381"}, - {file = "bandit-1.7.8.tar.gz", hash = "sha256:36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"}, + {file = "bandit-1.7.9-py3-none-any.whl", hash = "sha256:52077cb339000f337fb25f7e045995c4ad01511e716e5daac37014b9752de8ec"}, + {file = "bandit-1.7.9.tar.gz", hash = "sha256:7c395a436743018f7be0a4cbb0a4ea9b902b6d87264ddecf8cfdc73b4f78ff61"}, ] [[package]] @@ -259,71 +270,49 @@ files = [ [[package]] name = "bittensor" -version = "7.0.0" -requires_python = ">=3.8" -git = "https://github.com/opentensor/bittensor.git" -ref = "merge_cuda" -revision = "d9d1a49ff953a1a676d13e11411825979da75852" +version = "7.2.0" +requires_python = ">=3.9" summary = "bittensor" groups = ["default"] dependencies = [ "PyNaCl<=1.5.0,>=1.3.0", - "aiohttp==3.9.0b0", - "ansible-vault==2.1.0", - "ansible==6.7.0", + "aiohttp~=3.9", + "ansible-vault~=2.1", + "ansible~=6.7", "backoff", - "black==23.7.0", - "colorama==0.4.6", - "cryptography==42.0.0", - "ddt==1.6.0", - "fastapi==0.110.1", + "certifi~=2024.2.2", + "colorama~=0.4.6", + "cryptography~=42.0.5", + "ddt~=1.6.0", + "eth-utils<2.3.0", + "fastapi~=0.110.1", "fuzzywuzzy>=0.18.0", - "msgpack-numpy-opentensor==0.5.0", - "munch==2.5.0", + "msgpack-numpy-opentensor~=0.5.0", + "munch~=2.5.0", "nest-asyncio", "netaddr", "numpy", + "packaging", "password-strength", "pycryptodome<4.0.0,>=3.18.0", - "pydantic!=1.8,!=1.8.1,<2.0.0,>=1.7.4", - "pytest", - "pytest-asyncio", + "pydantic<3,>=2.3", "python-Levenshtein", - "python-statemachine==2.1.2", + "python-statemachine~=2.1.2", "pyyaml", "requests", "retry", "rich", "scalecodec==1.2.7", - "shtab==1.6.5", - "substrate-interface==1.7.5", + "shtab~=1.6.5", + "substrate-interface~=1.7.5", "termcolor", "tqdm", - "uvicorn==0.22.0", + "uvicorn<=0.30", "wheel", ] - -[[package]] -name = "black" -version = "23.7.0" -requires_python = ">=3.8" -summary = "The uncompromising code formatter." -groups = ["default"] -dependencies = [ - "click>=8.0.0", - "mypy-extensions>=0.4.3", - "packaging>=22.0", - "pathspec>=0.9.0", - "platformdirs>=2", -] files = [ - {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, - {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, - {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, - {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, - {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, + {file = "bittensor-7.2.0-py3-none-any.whl", hash = "sha256:44b57c05d4de8c1d3b04b90d51d5bac81f37ce143e409f111c3788fd9cb4ff5a"}, + {file = "bittensor-7.2.0.tar.gz", hash = "sha256:91a6b03e8b4cc052419256df58d9fb91c66fe15c972c09cd0587bfe53f21f9d8"}, ] [[package]] @@ -467,28 +456,28 @@ files = [ [[package]] name = "codespell" -version = "2.2.6" +version = "2.3.0" requires_python = ">=3.8" summary = "Codespell" groups = ["lint"] files = [ - {file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"}, - {file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"}, + {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, + {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, ] [[package]] name = "codespell" -version = "2.2.6" +version = "2.3.0" extras = ["toml"] requires_python = ">=3.8" summary = "Codespell" groups = ["lint"] dependencies = [ - "codespell==2.2.6", + "codespell==2.3.0", ] files = [ - {file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"}, - {file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"}, + {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, + {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, ] [[package]] @@ -518,7 +507,7 @@ files = [ [[package]] name = "cryptography" -version = "42.0.0" +version = "42.0.8" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["default"] @@ -526,38 +515,38 @@ dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ - {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434"}, - {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc"}, - {file = "cryptography-42.0.0-cp37-abi3-win32.whl", hash = "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4"}, - {file = "cryptography-42.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0"}, - {file = "cryptography-42.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221"}, - {file = "cryptography-42.0.0-cp39-abi3-win32.whl", hash = "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b"}, - {file = "cryptography-42.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce"}, - {file = "cryptography-42.0.0.tar.gz", hash = "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [[package]] @@ -641,7 +630,7 @@ files = [ [[package]] name = "django" -version = "4.2.11" +version = "4.2.13" requires_python = ">=3.8" summary = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." groups = ["default", "type_check"] @@ -651,8 +640,8 @@ dependencies = [ "tzdata; sys_platform == \"win32\"", ] files = [ - {file = "Django-4.2.11-py3-none-any.whl", hash = "sha256:ddc24a0a8280a0430baa37aff11f28574720af05888c62b7cfe71d219f4599d3"}, - {file = "Django-4.2.11.tar.gz", hash = "sha256:6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4"}, + {file = "Django-4.2.13-py3-none-any.whl", hash = "sha256:a17fcba2aad3fc7d46fdb23215095dbbd64e6174bf4589171e732b18b07e426a"}, + {file = "Django-4.2.13.tar.gz", hash = "sha256:837e3cf1f6c31347a1396a3f6b65688f2b4bb4a11c580dcb628b5afe527b68a5"}, ] [[package]] @@ -811,25 +800,25 @@ files = [ [[package]] name = "django-stubs" -version = "5.0.0" +version = "5.0.2" requires_python = ">=3.8" summary = "Mypy stubs for Django" groups = ["type_check"] dependencies = [ "asgiref", "django", - "django-stubs-ext>=5.0.0", + "django-stubs-ext>=5.0.2", "types-PyYAML", - "typing-extensions", + "typing-extensions>=4.11.0", ] files = [ - {file = "django_stubs-5.0.0-py3-none-any.whl", hash = "sha256:084484cbe16a6d388e80ec687e46f529d67a232f3befaf55c936b3b476be289d"}, - {file = "django_stubs-5.0.0.tar.gz", hash = "sha256:b8a792bee526d6cab31e197cb414ee7fa218abd931a50948c66a80b3a2548621"}, + {file = "django_stubs-5.0.2-py3-none-any.whl", hash = "sha256:cb0c506cb5c54c64612e4a2ee8d6b913c6178560ec168009fe847c09747c304b"}, + {file = "django_stubs-5.0.2.tar.gz", hash = "sha256:236bc5606e5607cb968f92b648471f9edaa461a774bc013bf9e6bff8730f6bdf"}, ] [[package]] name = "django-stubs-ext" -version = "5.0.0" +version = "5.0.2" requires_python = ">=3.8" summary = "Monkey-patching and extensions for django-stubs" groups = ["type_check"] @@ -838,24 +827,24 @@ dependencies = [ "typing-extensions", ] files = [ - {file = "django_stubs_ext-5.0.0-py3-none-any.whl", hash = "sha256:8e1334fdf0c8bff87e25d593b33d4247487338aaed943037826244ff788b56a8"}, - {file = "django_stubs_ext-5.0.0.tar.gz", hash = "sha256:5bacfbb498a206d5938454222b843d81da79ea8b6fcd1a59003f529e775bc115"}, + {file = "django_stubs_ext-5.0.2-py3-none-any.whl", hash = "sha256:8d8efec5a86241266bec94a528fe21258ad90d78c67307f3ae5f36e81de97f12"}, + {file = "django_stubs_ext-5.0.2.tar.gz", hash = "sha256:409c62585d7f996cef5c760e6e27ea3ff29f961c943747e67519c837422cad32"}, ] [[package]] name = "django-stubs" -version = "5.0.0" +version = "5.0.2" extras = ["compatible-mypy"] requires_python = ">=3.8" summary = "Mypy stubs for Django" groups = ["type_check"] dependencies = [ - "django-stubs==5.0.0", + "django-stubs==5.0.2", "mypy~=1.10.0", ] files = [ - {file = "django_stubs-5.0.0-py3-none-any.whl", hash = "sha256:084484cbe16a6d388e80ec687e46f529d67a232f3befaf55c936b3b476be289d"}, - {file = "django_stubs-5.0.0.tar.gz", hash = "sha256:b8a792bee526d6cab31e197cb414ee7fa218abd931a50948c66a80b3a2548621"}, + {file = "django_stubs-5.0.2-py3-none-any.whl", hash = "sha256:cb0c506cb5c54c64612e4a2ee8d6b913c6178560ec168009fe847c09747c304b"}, + {file = "django_stubs-5.0.2.tar.gz", hash = "sha256:236bc5606e5607cb968f92b648471f9edaa461a774bc013bf9e6bff8730f6bdf"}, ] [[package]] @@ -935,18 +924,21 @@ files = [ [[package]] name = "eth-typing" -version = "4.2.2" +version = "4.3.1" requires_python = "<4,>=3.8" summary = "eth-typing: Common type annotations for ethereum python packages" groups = ["default"] +dependencies = [ + "typing-extensions>=4.5.0", +] files = [ - {file = "eth_typing-4.2.2-py3-none-any.whl", hash = "sha256:2d23c44b78b1740ee881aa5c440a05a5e311ca44d1defa18a334e733df46ff3f"}, - {file = "eth_typing-4.2.2.tar.gz", hash = "sha256:051ab9783e350668487ffc635b19666e7ca4d6c7e572800ed3961cbe0a937772"}, + {file = "eth_typing-4.3.1-py3-none-any.whl", hash = "sha256:b4d7cee912c7779da75da4b42fa61475c1089d35a4df5081a786eaa29d5f6865"}, + {file = "eth_typing-4.3.1.tar.gz", hash = "sha256:4504559c87a9f71f4b99aa5a1e0549adaa7f192cbf8e37a295acfcddb1b5412d"}, ] [[package]] name = "eth-utils" -version = "2.3.1" +version = "2.2.2" requires_python = ">=3.7,<4" summary = "eth-utils: Common utility functions for python code that interacts with Ethereum" groups = ["default"] @@ -957,8 +949,8 @@ dependencies = [ "toolz>0.8.2; implementation_name == \"pypy\"", ] files = [ - {file = "eth-utils-2.3.1.tar.gz", hash = "sha256:56a969b0536d4969dcb27e580521de35abf2dbed8b1bf072b5c80770c4324e27"}, - {file = "eth_utils-2.3.1-py3-none-any.whl", hash = "sha256:614eedc5ffcaf4e6708ca39e23b12bd69526a312068c1170c773bd1307d13972"}, + {file = "eth-utils-2.2.2.tar.gz", hash = "sha256:5ca6265177ce544d9d43cdf2272ae2227e5d6d9529c270bbb707d17339087101"}, + {file = "eth_utils-2.2.2-py3-none-any.whl", hash = "sha256:2580a8065273f62ca1ec4c175228c52e626a5f1007e965d2117e5eca1a93cae8"}, ] [[package]] @@ -985,7 +977,7 @@ files = [ [[package]] name = "faker" -version = "25.0.1" +version = "26.0.0" requires_python = ">=3.8" summary = "Faker is a Python package that generates fake data for you." groups = ["test"] @@ -993,13 +985,13 @@ dependencies = [ "python-dateutil>=2.4", ] files = [ - {file = "Faker-25.0.1-py3-none-any.whl", hash = "sha256:6737cc6d591cd83421fdc5e494f6e2c1a6e32266214f158b745aa9fa15687c98"}, - {file = "Faker-25.0.1.tar.gz", hash = "sha256:c153505618801f1704807b258a6010ea8cabf91f66f4788939bfdba83b887e76"}, + {file = "Faker-26.0.0-py3-none-any.whl", hash = "sha256:886ee28219be96949cd21ecc96c4c742ee1680e77f687b095202c8def1a08f06"}, + {file = "Faker-26.0.0.tar.gz", hash = "sha256:0f60978314973de02c00474c2ae899785a42b2cf4f41b7987e93c132a2b8a4a9"}, ] [[package]] name = "fastapi" -version = "0.110.1" +version = "0.110.3" requires_python = ">=3.8" summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" groups = ["default"] @@ -1009,24 +1001,24 @@ dependencies = [ "typing-extensions>=4.8.0", ] files = [ - {file = "fastapi-0.110.1-py3-none-any.whl", hash = "sha256:5df913203c482f820d31f48e635e022f8cbfe7350e4830ef05a3163925b1addc"}, - {file = "fastapi-0.110.1.tar.gz", hash = "sha256:6feac43ec359dfe4f45b2c18ec8c94edb8dc2dfc461d417d9e626590c071baad"}, + {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"}, + {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, ] [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["default"] files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [[package]] name = "freezegun" -version = "1.5.0" +version = "1.5.1" requires_python = ">=3.7" summary = "Let your Python tests travel through time" groups = ["test"] @@ -1034,8 +1026,8 @@ dependencies = [ "python-dateutil>=2.7", ] files = [ - {file = "freezegun-1.5.0-py3-none-any.whl", hash = "sha256:ec3f4ba030e34eb6cf7e1e257308aee2c60c3d038ff35996d7475760c9ff3719"}, - {file = "freezegun-1.5.0.tar.gz", hash = "sha256:200a64359b363aa3653d8aac289584078386c7c3da77339d257e46a01fb5c77c"}, + {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, + {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, ] [[package]] @@ -1115,7 +1107,7 @@ name = "iniconfig" version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" -groups = ["default", "test"] +groups = ["test"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1177,7 +1169,7 @@ files = [ [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." groups = ["default"] @@ -1185,8 +1177,8 @@ dependencies = [ "MarkupSafe>=2.0", ] files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [[package]] @@ -1304,13 +1296,13 @@ files = [ [[package]] name = "more-itertools" -version = "10.2.0" +version = "10.3.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" groups = ["default"] files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, + {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, + {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, ] [[package]] @@ -1389,7 +1381,7 @@ files = [ [[package]] name = "mypy" -version = "1.10.0" +version = "1.10.1" requires_python = ">=3.8" summary = "Optional static typing for Python" groups = ["type_check"] @@ -1398,13 +1390,13 @@ dependencies = [ "typing-extensions>=4.1.0", ] files = [ - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, ] [[package]] @@ -1412,7 +1404,7 @@ name = "mypy-extensions" version = "1.0.0" requires_python = ">=3.5" summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["default", "type_check"] +groups = ["type_check"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -1431,13 +1423,13 @@ files = [ [[package]] name = "netaddr" -version = "1.2.1" +version = "1.3.0" requires_python = ">=3.7" summary = "A network address manipulation library for Python" groups = ["default"] files = [ - {file = "netaddr-1.2.1-py3-none-any.whl", hash = "sha256:bd9e9534b0d46af328cf64f0e5a23a5a43fca292df221c85580b27394793496e"}, - {file = "netaddr-1.2.1.tar.gz", hash = "sha256:6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987"}, + {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, + {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, ] [[package]] @@ -1459,34 +1451,37 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.0" requires_python = ">=3.9" summary = "Fundamental package for array computing in Python" groups = ["default"] files = [ - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f"}, + {file = "numpy-2.0.0-cp311-cp311-win32.whl", hash = "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f"}, + {file = "numpy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9"}, + {file = "numpy-2.0.0.tar.gz", hash = "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864"}, ] [[package]] name = "packaging" -version = "24.0" -requires_python = ">=3.7" +version = "24.1" +requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default", "test"] files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1513,17 +1508,6 @@ files = [ {file = "password_strength-0.0.3.post2.tar.gz", hash = "sha256:bf4df10a58fcd3abfa182367307b4fd7b1cec518121dd83bf80c1c42ba796762"}, ] -[[package]] -name = "pathspec" -version = "0.12.1" -requires_python = ">=3.8" -summary = "Utility library for gitignore style pattern matching of file paths." -groups = ["default"] -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - [[package]] name = "pbr" version = "6.0.0" @@ -1561,13 +1545,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.1" +version = "4.2.2" requires_python = ">=3.8" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." groups = ["default"] files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [[package]] @@ -1575,7 +1559,7 @@ name = "pluggy" version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" -groups = ["default", "test"] +groups = ["test"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1583,7 +1567,7 @@ files = [ [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" groups = ["default", "test"] @@ -1591,8 +1575,8 @@ dependencies = [ "wcwidth", ] files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [[package]] @@ -1752,23 +1736,59 @@ files = [ [[package]] name = "pydantic" -version = "1.10.15" -requires_python = ">=3.7" -summary = "Data validation and settings management using python type hints" +version = "2.8.2" +requires_python = ">=3.8" +summary = "Data validation using Python type hints" groups = ["default"] dependencies = [ - "typing-extensions>=4.2.0", + "annotated-types>=0.4.0", + "pydantic-core==2.20.1", + "typing-extensions>=4.6.1; python_version < \"3.13\"", ] files = [ - {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, - {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, - {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, - {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, - {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, - {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, - {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, - {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, - {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +requires_python = ">=3.8" +summary = "Core functionality for Pydantic validation and serialization" +groups = ["default"] +dependencies = [ + "typing-extensions!=4.7.0,>=4.6.0", +] +files = [ + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [[package]] @@ -1806,10 +1826,10 @@ files = [ [[package]] name = "pytest" -version = "8.2.0" +version = "8.2.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" -groups = ["default", "test"] +groups = ["test"] dependencies = [ "colorama; sys_platform == \"win32\"", "iniconfig", @@ -1817,22 +1837,8 @@ dependencies = [ "pluggy<2.0,>=1.5", ] files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, -] - -[[package]] -name = "pytest-asyncio" -version = "0.23.6" -requires_python = ">=3.8" -summary = "Pytest support for asyncio" -groups = ["default"] -dependencies = [ - "pytest<9,>=7.0.0", -] -files = [ - {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, - {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [[package]] @@ -1948,38 +1954,45 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.9.0" +version = "3.9.4" requires_python = ">=3.8" summary = "rapid fuzzy string matching" groups = ["default"] files = [ - {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e2218d62ab63f3c5ad48eced898854d0c2c327a48f0fb02e2288d7e5332a22c8"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36bf35df2d6c7d5820da20a6720aee34f67c15cd2daf8cf92e8141995c640c25"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:905b01a9b633394ff6bb5ebb1c5fd660e0e180c03fcf9d90199cc6ed74b87cf7"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33cfabcb7fd994938a6a08e641613ce5fe46757832edc789c6a5602e7933d6fa"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1179dcd3d150a67b8a678cd9c84f3baff7413ff13c9e8fe85e52a16c97e24c9b"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47d97e28c42f1efb7781993b67c749223f198f6653ef177a0c8f2b1c516efcaf"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28da953eb2ef9ad527e536022da7afff6ace7126cdd6f3e21ac20f8762e76d2c"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:182b4e11de928fb4834e8f8b5ecd971b5b10a86fabe8636ab65d3a9b7e0e9ca7"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c74f2da334ce597f31670db574766ddeaee5d9430c2c00e28d0fbb7f76172036"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:014ac55b03f4074f903248ded181f3000f4cdbd134e6155cbf643f0eceb4f70f"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c4ef34b2ddbf448f1d644b4ec6475df8bbe5b9d0fee173ff2e87322a151663bd"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fc02157f521af15143fae88f92ef3ddcc4e0cff05c40153a9549dc0fbdb9adb3"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ff08081c49b18ba253a99e6a47f492e6ee8019e19bbb6ddc3ed360cd3ecb2f62"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-win32.whl", hash = "sha256:b9bf90b3d96925cbf8ef44e5ee3cf39ef0c422f12d40f7a497e91febec546650"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5d5684f54d82d9b0cf0b2701e55a630527a9c3dd5ddcf7a2e726a475ac238f2"}, - {file = "rapidfuzz-3.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:a2de844e0e971d7bd8aa41284627dbeacc90e750b90acfb016836553c7a63192"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e33362e98c7899b5f60dcb06ada00acd8673ce0d59aefe9a542701251fd00423"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb67cf43ad83cb886cbbbff4df7dcaad7aedf94d64fca31aea0da7d26684283c"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2e106cc66453bb80d2ad9c0044f8287415676df5c8036d737d05d4b9cdbf8e"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1256915f7e7a5cf2c151c9ac44834b37f9bd1c97e8dec6f936884f01b9dfc7d"}, - {file = "rapidfuzz-3.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ae643220584518cbff8bf2974a0494d3e250763af816b73326a512c86ae782ce"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:491274080742110427f38a6085bb12dffcaff1eef12dccf9e8758398c7e3957e"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bc5559b9b94326922c096b30ae2d8e5b40b2e9c2c100c2cc396ad91bcb84d30"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:849160dc0f128acb343af514ca827278005c1d00148d025e4035e034fc2d8c7f"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:623883fb78e692d54ed7c43b09beec52c6685f10a45a7518128e25746667403b"}, - {file = "rapidfuzz-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d20ab9abc7e19767f1951772a6ab14cb4eddd886493c2da5ee12014596ad253f"}, - {file = "rapidfuzz-3.9.0.tar.gz", hash = "sha256:b182f0fb61f6ac435e416eb7ab330d62efdbf9b63cf0c7fa12d1f57c2eaaf6f3"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:07141aa6099e39d48637ce72a25b893fc1e433c50b3e837c75d8edf99e0c63e1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db1664eaff5d7d0f2542dd9c25d272478deaf2c8412e4ad93770e2e2d828e175"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc01a223f6605737bec3202e94dcb1a449b6c76d46082cfc4aa980f2a60fd40e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1869c42e73e2a8910b479be204fa736418741b63ea2325f9cc583c30f2ded41a"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62ea7007941fb2795fff305ac858f3521ec694c829d5126e8f52a3e92ae75526"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:698e992436bf7f0afc750690c301215a36ff952a6dcd62882ec13b9a1ebf7a39"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b76f611935f15a209d3730c360c56b6df8911a9e81e6a38022efbfb96e433bab"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129627d730db2e11f76169344a032f4e3883d34f20829419916df31d6d1338b1"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90a82143c14e9a14b723a118c9ef8d1bbc0c5a16b1ac622a1e6c916caff44dd8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ded58612fe3b0e0d06e935eaeaf5a9fd27da8ba9ed3e2596307f40351923bf72"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f16f5d1c4f02fab18366f2d703391fcdbd87c944ea10736ca1dc3d70d8bd2d8b"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26aa7eece23e0df55fb75fbc2a8fb678322e07c77d1fd0e9540496e6e2b5f03e"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win32.whl", hash = "sha256:f187a9c3b940ce1ee324710626daf72c05599946bd6748abe9e289f1daa9a077"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8e9130fe5d7c9182990b366ad78fd632f744097e753e08ace573877d67c32f8"}, + {file = "rapidfuzz-3.9.4-cp311-cp311-win_arm64.whl", hash = "sha256:40419e98b10cd6a00ce26e4837a67362f658fc3cd7a71bd8bd25c99f7ee8fea5"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:20488ade4e1ddba3cfad04f400da7a9c1b91eff5b7bd3d1c50b385d78b587f4f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e61b03509b1a6eb31bc5582694f6df837d340535da7eba7bedb8ae42a2fcd0b9"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098d231d4e51644d421a641f4a5f2f151f856f53c252b03516e01389b2bfef99"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17ab8b7d10fde8dd763ad428aa961c0f30a1b44426e675186af8903b5d134fb0"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e272df61bee0a056a3daf99f9b1bd82cf73ace7d668894788139c868fdf37d6f"}, + {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6481e099ff8c4edda85b8b9b5174c200540fd23c8f38120016c765a86fa01f5"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ad61676e9bdae677d577fe80ec1c2cea1d150c86be647e652551dcfe505b1113"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:af65020c0dd48d0d8ae405e7e69b9d8ae306eb9b6249ca8bf511a13f465fad85"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d38b4e026fcd580e0bda6c0ae941e0e9a52c6bc66cdce0b8b0da61e1959f5f8"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f74ed072c2b9dc6743fb19994319d443a4330b0e64aeba0aa9105406c7c5b9c2"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee5f6b8321f90615c184bd8a4c676e9becda69b8e4e451a90923db719d6857c"}, + {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a555e3c841d6efa350f862204bb0a3fea0c006b8acc9b152b374fa36518a1c6"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0772150d37bf018110351c01d032bf9ab25127b966a29830faa8ad69b7e2f651"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:addcdd3c3deef1bd54075bd7aba0a6ea9f1d01764a08620074b7a7b1e5447cb9"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe86b82b776554add8f900b6af202b74eb5efe8f25acdb8680a5c977608727f"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0fc91ac59f4414d8542454dfd6287a154b8e6f1256718c898f695bdbb993467"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a944e546a296a5fdcaabb537b01459f1b14d66f74e584cb2a91448bffadc3c1"}, + {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fb96ba96d58c668a17a06b5b5e8340fedc26188e87b0d229d38104556f30cd8"}, + {file = "rapidfuzz-3.9.4.tar.gz", hash = "sha256:366bf8947b84e37f2f4cf31aaf5f37c39f620d8c0eddb8b633e6ba0129ca4a0a"}, ] [[package]] @@ -1998,8 +2011,8 @@ files = [ [[package]] name = "requests" -version = "2.31.0" -requires_python = ">=3.7" +version = "2.32.3" +requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["default", "type_check"] dependencies = [ @@ -2009,8 +2022,8 @@ dependencies = [ "urllib3<3,>=1.21.1", ] files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [[package]] @@ -2054,28 +2067,29 @@ files = [ [[package]] name = "ruff" -version = "0.4.3" +version = "0.5.1" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["lint"] files = [ - {file = "ruff-0.4.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b70800c290f14ae6fcbb41bbe201cf62dfca024d124a1f373e76371a007454ce"}, - {file = "ruff-0.4.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08a0d6a22918ab2552ace96adeaca308833873a4d7d1d587bb1d37bae8728eb3"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba1f14df3c758dd7de5b55fbae7e1c8af238597961e5fb628f3de446c3c40c5"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:819fb06d535cc76dfddbfe8d3068ff602ddeb40e3eacbc90e0d1272bb8d97113"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bfc9e955e6dc6359eb6f82ea150c4f4e82b660e5b58d9a20a0e42ec3bb6342b"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:510a67d232d2ebe983fddea324dbf9d69b71c4d2dfeb8a862f4a127536dd4cfb"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9ff11cd9a092ee7680a56d21f302bdda14327772cd870d806610a3503d001f"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29efff25bf9ee685c2c8390563a5b5c006a3fee5230d28ea39f4f75f9d0b6f2f"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b00e0bcccf0fc8d7186ed21e311dffd19761cb632241a6e4fe4477cc80ef6e"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262f5635e2c74d80b7507fbc2fac28fe0d4fef26373bbc62039526f7722bca1b"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7363691198719c26459e08cc17c6a3dac6f592e9ea3d2fa772f4e561b5fe82a3"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eeb039f8428fcb6725bb63cbae92ad67b0559e68b5d80f840f11914afd8ddf7f"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:927b11c1e4d0727ce1a729eace61cee88a334623ec424c0b1c8fe3e5f9d3c865"}, - {file = "ruff-0.4.3-py3-none-win32.whl", hash = "sha256:25cacda2155778beb0d064e0ec5a3944dcca9c12715f7c4634fd9d93ac33fd30"}, - {file = "ruff-0.4.3-py3-none-win_amd64.whl", hash = "sha256:7a1c3a450bc6539ef00da6c819fb1b76b6b065dec585f91456e7c0d6a0bbc725"}, - {file = "ruff-0.4.3-py3-none-win_arm64.whl", hash = "sha256:71ca5f8ccf1121b95a59649482470c5601c60a416bf189d553955b0338e34614"}, - {file = "ruff-0.4.3.tar.gz", hash = "sha256:ff0a3ef2e3c4b6d133fbedcf9586abfbe38d076041f2dc18ffb2c7e0485d5a07"}, + {file = "ruff-0.5.1-py3-none-linux_armv6l.whl", hash = "sha256:6ecf968fcf94d942d42b700af18ede94b07521bd188aaf2cd7bc898dd8cb63b6"}, + {file = "ruff-0.5.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:204fb0a472f00f2e6280a7c8c7c066e11e20e23a37557d63045bf27a616ba61c"}, + {file = "ruff-0.5.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d235968460e8758d1e1297e1de59a38d94102f60cafb4d5382033c324404ee9d"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38beace10b8d5f9b6bdc91619310af6d63dd2019f3fb2d17a2da26360d7962fa"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e478d2f09cf06add143cf8c4540ef77b6599191e0c50ed976582f06e588c994"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0368d765eec8247b8550251c49ebb20554cc4e812f383ff9f5bf0d5d94190b0"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3a9a9a1b582e37669b0138b7c1d9d60b9edac880b80eb2baba6d0e566bdeca4d"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdd9f723e16003623423affabcc0a807a66552ee6a29f90eddad87a40c750b78"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be9fd62c1e99539da05fcdc1e90d20f74aec1b7a1613463ed77870057cd6bd96"}, + {file = "ruff-0.5.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e216fc75a80ea1fbd96af94a6233d90190d5b65cc3d5dfacf2bd48c3e067d3e1"}, + {file = "ruff-0.5.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c4c2112e9883a40967827d5c24803525145e7dab315497fae149764979ac7929"}, + {file = "ruff-0.5.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dfaf11c8a116394da3b65cd4b36de30d8552fa45b8119b9ef5ca6638ab964fa3"}, + {file = "ruff-0.5.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d7ceb9b2fe700ee09a0c6b192c5ef03c56eb82a0514218d8ff700f6ade004108"}, + {file = "ruff-0.5.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bac6288e82f6296f82ed5285f597713acb2a6ae26618ffc6b429c597b392535c"}, + {file = "ruff-0.5.1-py3-none-win32.whl", hash = "sha256:5c441d9c24ec09e1cb190a04535c5379b36b73c4bc20aa180c54812c27d1cca4"}, + {file = "ruff-0.5.1-py3-none-win_amd64.whl", hash = "sha256:b1789bf2cd3d1b5a7d38397cac1398ddf3ad7f73f4de01b1e913e2abc7dfc51d"}, + {file = "ruff-0.5.1-py3-none-win_arm64.whl", hash = "sha256:2875b7596a740cbbd492f32d24be73e545a4ce0a3daf51e4f4e609962bfd3cd2"}, + {file = "ruff-0.5.1.tar.gz", hash = "sha256:3164488aebd89b1745b47fd00604fb4358d774465f20d1fcd907f9c0fc1b0655"}, ] [[package]] @@ -2110,13 +2124,13 @@ files = [ [[package]] name = "setuptools" -version = "69.5.1" +version = "70.2.0" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default"] files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, + {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, ] [[package]] @@ -2208,13 +2222,13 @@ files = [ [[package]] name = "structlog" -version = "24.1.0" +version = "24.2.0" requires_python = ">=3.8" summary = "Structured Logging for Python" groups = ["default"] files = [ - {file = "structlog-24.1.0-py3-none-any.whl", hash = "sha256:3f6efe7d25fab6e86f277713c218044669906537bb717c1807a09d46bca0714d"}, - {file = "structlog-24.1.0.tar.gz", hash = "sha256:41a09886e4d55df25bdcb9b5c9674bccfab723ff43e0a86a1b7b236be8e57b16"}, + {file = "structlog-24.2.0-py3-none-any.whl", hash = "sha256:983bd49f70725c5e1e3867096c0c09665918936b3db27341b41d294283d7a48a"}, + {file = "structlog-24.2.0.tar.gz", hash = "sha256:0e3fe74924a6d8857d3f612739efb94c72a7417d7c7c008d12276bca3b5bf13b"}, ] [[package]] @@ -2327,7 +2341,7 @@ files = [ [[package]] name = "types-requests" -version = "2.31.0.20240406" +version = "2.32.0.20240622" requires_python = ">=3.8" summary = "Typing stubs for requests" groups = ["type_check"] @@ -2335,19 +2349,19 @@ dependencies = [ "urllib3>=2", ] files = [ - {file = "types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1"}, - {file = "types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5"}, + {file = "types-requests-2.32.0.20240622.tar.gz", hash = "sha256:ed5e8a412fcc39159d6319385c009d642845f250c63902718f605cd90faade31"}, + {file = "types_requests-2.32.0.20240622-py3-none-any.whl", hash = "sha256:97bac6b54b5bd4cf91d407e62f0932a74821bc2211f22116d9ee1dd643826caf"}, ] [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["default", "type_check"] files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -2363,19 +2377,19 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["default", "type_check"] files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [[package]] name = "uvicorn" -version = "0.22.0" -requires_python = ">=3.7" +version = "0.30.0" +requires_python = ">=3.8" summary = "The lightning-fast ASGI server." groups = ["default"] dependencies = [ @@ -2383,8 +2397,8 @@ dependencies = [ "h11>=0.8", ] files = [ - {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, - {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, + {file = "uvicorn-0.30.0-py3-none-any.whl", hash = "sha256:78fa0b5f56abb8562024a59041caeb555c86e48d0efdd23c3fe7de7a4075bdab"}, + {file = "uvicorn-0.30.0.tar.gz", hash = "sha256:f678dec4fa3a39706bbf49b9ec5fc40049d42418716cea52b53f07828a60aa37"}, ] [[package]] @@ -2400,7 +2414,7 @@ files = [ [[package]] name = "virtualenv" -version = "20.26.1" +version = "20.26.3" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["default"] @@ -2410,8 +2424,8 @@ dependencies = [ "platformdirs<5,>=3.9.1", ] files = [ - {file = "virtualenv-20.26.1-py3-none-any.whl", hash = "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75"}, - {file = "virtualenv-20.26.1.tar.gz", hash = "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 1684734..cbfc053 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "sentry-sdk==1.3.0", "ipython~=8.14.0", "nox==2023.4.22", - "bittensor @ git+https://github.com/opentensor/bittensor.git@merge_cuda", + "bittensor~=7.2.0", ] [build-system]