From 512f9f08e0adb8a21f185a43a4b9447d265ebd0e Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 14 May 2024 18:13:08 -0400 Subject: [PATCH 001/155] do initial work --- cogs/__init__.py | 3 ++ db/core/models/__init__.py | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/cogs/__init__.py b/cogs/__init__.py index ec16bd90..b2ba7de7 100644 --- a/cogs/__init__.py +++ b/cogs/__init__.py @@ -8,6 +8,7 @@ from collections.abc import Sequence __all__: Sequence[str] = ( + "ActionsTrackingCog", "ArchiveCommandCog", "CommandErrorCog", "DeleteAllCommandsCog", @@ -37,6 +38,7 @@ from typing import TYPE_CHECKING +from cogs.actions_tracking import ActionsTrackingCog from cogs.archive import ArchiveCommandCog from cogs.command_error import CommandErrorCog from cogs.delete_all import DeleteAllCommandsCog @@ -70,6 +72,7 @@ def setup(bot: TeXBot) -> None: """Add all the cogs to the bot, at bot startup.""" cogs: Iterable[type[TeXBotBaseCog]] = ( + ActionsTrackingCog, ArchiveCommandCog, CommandErrorCog, DeleteAllCommandsCog, diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index dc8456e7..b9864555 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -25,6 +25,73 @@ from .utils import AsyncBaseModel, HashedDiscordMember +class Action(HashedDiscordMember): + """Model to represent an action item that has been assigned to a Discord Member.""" + + INSTANCES_NAME_PLURAL: str = "Actions" + + hashed_member_id = models.CharField( + "Hashed Discord Member ID", + null=False, + blank=False, + max_length=64, + validators=[ + RegexValidator( + r"\A[A-Fa-f0-9]{64}\Z", + "hashed_member_id must be a valid sha256 hex-digest.", + ), + ], + ) + description = models.TextField( + "Description of the action", + max_length=1500, + null=False, + blank=True, + ) + class Meta: + verbose_name = "An Action for a Discord Member" + verbose_name_plural = "Actions for Discord Members" + constraints = [ # noqa: RUF012 + models.UniqueConstraint( + fields=["hashed_member_id", "description"], + name="unique_user_action", + ), + ] + + def __repr__(self) -> str: + """Generate a developer-focused representation of this DiscordReminder's attributes.""" + return ( + f"<{self._meta.verbose_name}: {self.hashed_member_id!r}, {str(self.description)!r}" + ) + + def __str__(self) -> str: + """Generate the string representation of this DiscordReminder.""" + construct_str: str = f"{self.hashed_member_id}" + + if self.description: + construct_str += f": {self.description[:50]}" + + return construct_str + + def get_formatted_message(self, user_mention: str | None) -> str: + """ + Return the formatted description stored by this action. + + Adds a mention to the Discord member that was assigned the action, + if passed in from the calling context. + """ + constructed_message: str = "This is your reminder" + + if user_mention: + constructed_message += f", {user_mention}" + + constructed_message += "!" + + if self.description: + constructed_message = f"**{constructed_message}**\n{self.description}" + + return constructed_message + class IntroductionReminderOptOutMember(HashedDiscordMember): """ Model to represent a Discord member that has opted out of introduction reminders. From 91831ddc47432b8c6b6343d6686d2317bc47824c Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 14 May 2024 18:25:27 -0400 Subject: [PATCH 002/155] add cog --- cogs/actions_tracking.py | 116 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 cogs/actions_tracking.py diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py new file mode 100644 index 00000000..19b23da4 --- /dev/null +++ b/cogs/actions_tracking.py @@ -0,0 +1,116 @@ +"""Contains cog classes for tracking committee actions.""" + +from collections.abc import Sequence + +__all__: Sequence[str] = ("ActionsTrackingCog",) + +import logging +from logging import Logger + +import discord +from django.core.exceptions import ValidationError + +from config import settings +from db.core.models import Action +from exceptions import CommitteeRoleDoesNotExistError, GuildDoesNotExistError +from utils import ( + CommandChecks, + TeXBotApplicationContext, + TeXBotAutocompleteContext, + TeXBotBaseCog, +) + +logger: Logger = logging.getLogger("TeX-Bot") + + +class ActionsTrackingCog(TeXBotBaseCog): + """Cog class that defines the action tracking functionality.""" + + @staticmethod + async def action_autocomplete_get_committee(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + """ + Autocomplete callable that generates a set of selectable committee members. + + This list is used to give a list of actionable committee members. + """ + try: + main_guild: discord.Guild = ctx.bot.main_guild + committee_role: discord.Role = await ctx.bot.committee_role + except (GuildDoesNotExistError, CommitteeRoleDoesNotExistError): + logger.warning("Guild not found or committee role not found") + return set() + + committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 + + return { + discord.OptionChoice(name=committee_member.name, value=str(committee_member.id)) + for committee_member + in committee_members + } + + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="action", + description="Adds a new action with the specified description", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="description", + description="The description of the action to assign.", + input_type=str, + required=True, + parameter_name="str_action_description", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="user", + description="The user to action, if no user is specified, default to self", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_committee), # type: ignore[arg-type] + required=True, + parameter_name="str_action_member_id", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, str_action_description: str) -> None: # noqa: E501 + """ + Definition and callback response of the "action" command. + + The action command adds an action to the specified user. If no user is specified + we assume the action is aimed at the command issuer. + """ + try: + action: Action = await Action.objects.acreate( + member_id=int(str_action_member_id), + description=str_action_description, + ) + except ValidationError as create_action_error: + error_is_already_exits: bool = ( + "__all__" in create_action_error.message_dict + and any ( + "already exists" in error + for error + in create_action_error.message_dict["__all__"] + ) + ) + if not error_is_already_exits: + await self.command_send_error(ctx, message="An unrecoverable error occured.") + logger.critical( + "Error upon creating Action object: %s", + create_action_error, + ) + await self.bot.close() + return + + await self.command_send_error( + ctx, + message="You already have an action with that description!", + ) + return + + await ctx.respond(f"Action: {str_action_description} created for user: <@{str_action_member_id}>") # noqa: E501 + + + + + + + + From 01ad5812b5ca70b41f9fd6b7abf3dcaef6044845 Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 15 May 2024 15:53:58 -0400 Subject: [PATCH 003/155] do db changes --- .../0007_action_action_unique_user_action.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 db/core/migrations/0007_action_action_unique_user_action.py diff --git a/db/core/migrations/0007_action_action_unique_user_action.py b/db/core/migrations/0007_action_action_unique_user_action.py new file mode 100644 index 00000000..90109b42 --- /dev/null +++ b/db/core/migrations/0007_action_action_unique_user_action.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0.6 on 2024-05-15 19:53 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0006_rename_hashed_uob_id_groupmademember_hashed_group_member_id'), + ] + + operations = [ + migrations.CreateModel( + name='Action', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('hashed_member_id', models.CharField(max_length=64, validators=[django.core.validators.RegexValidator('\\A[A-Fa-f0-9]{64}\\Z', 'hashed_member_id must be a valid sha256 hex-digest.')], verbose_name='Hashed Discord Member ID')), + ('description', models.TextField(blank=True, max_length=1500, verbose_name='Description of the action')), + ], + options={ + 'verbose_name': 'An Action for a Discord Member', + 'verbose_name_plural': 'Actions for Discord Members', + }, + ), + migrations.AddConstraint( + model_name='action', + constraint=models.UniqueConstraint(fields=('hashed_member_id', 'description'), name='unique_user_action'), + ), + ] From 9e852522bd754264042414ee396e02ee7bdc6f3d Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 15 May 2024 17:25:53 -0400 Subject: [PATCH 004/155] add create and list actions --- cogs/actions_tracking.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py index 19b23da4..90195e9c 100644 --- a/cogs/actions_tracking.py +++ b/cogs/actions_tracking.py @@ -10,7 +10,6 @@ import discord from django.core.exceptions import ValidationError -from config import settings from db.core.models import Action from exceptions import CommitteeRoleDoesNotExistError, GuildDoesNotExistError from utils import ( @@ -105,9 +104,37 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, ) return - await ctx.respond(f"Action: {str_action_description} created for user: <@{str_action_member_id}>") # noqa: E501 + await ctx.respond(f"Action: {action.description} created for user: <@{str_action_member_id}>") # noqa: E501 + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="list-user-actions", + description="Lists all actions for a specified user", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="user", + description="The user to list actions for.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_committee), # type: ignore[arg-type] + required=True, + parameter_name="str_action_member_id", + ) + async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_member_id: str) -> None: # noqa: E501 + """ + Definition and callback of the list user actions command. + + Takes in a user and lists out their current actions. + """ + actions = [action async for action in Action.objects.all() if Action.hash_member_id(str_action_member_id) == action.hashed_member_id] # noqa: E501 + action_member: discord.User | None = self.bot.get_user(int(str_action_member_id)) + + if not action_member: + await ctx.respond("The user you supplied was dog shit. Fuck off cunt.") + return + if not actions: + await ctx.respond(f"User: {action_member.mention} has no actions.") + else: + await ctx.respond(f"Found {len(actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in actions)}") # noqa: E501 From 198fc0723535ec6db0ab959115e1a57c347ec26e Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 15 May 2024 18:57:05 -0400 Subject: [PATCH 005/155] add delete functions --- cogs/actions_tracking.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py index 90195e9c..e0e4e923 100644 --- a/cogs/actions_tracking.py +++ b/cogs/actions_tracking.py @@ -47,6 +47,26 @@ async def action_autocomplete_get_committee(ctx: TeXBotAutocompleteContext) -> s in committee_members } + async def action_autocomplete_get_all_actions(self) -> set[discord.OptionChoice]: + """ + Autocomplete callable that generates a set of actions. + + This list is used to give a list of actions to take anaction on. + """ + actions = [action async for action in Action.objects.all()] + + if not actions: + return set() + + return { + discord.OptionChoice(name=str(action.description), value=str(action)) + for action + in actions + } + + + + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action", description="Adds a new action with the specified description", @@ -118,6 +138,8 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, required=True, parameter_name="str_action_member_id", ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_member_id: str) -> None: # noqa: E501 """ Definition and callback of the list user actions command. @@ -137,7 +159,41 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe await ctx.respond(f"Found {len(actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in actions)}") # noqa: E501 + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="complete-action", + description="Deletes the specified action as being completed.", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="action", + description="The action to mark as completed.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_all_actions), # type: ignore[arg-type] + required=True, + parameter_name="str_action_object", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: str) -> None: # noqa: E501 + """ + Definition and callback of the complete action command. + + Marks the specified action as complete by deleting it. + """ + actions = [action async for action in Action.objects.all()] + + components = str_action_object.split(":") + hashed_id = components[0].strip() + description = components[1].strip() + + action: Action + for action in actions: + if action.hashed_member_id == hashed_id and action.description == description: + await ctx.respond(f"Found it chief! Action object: {action}") + await action.adelete() + return + await ctx.respond("Hmm, I couldn't find that action. Please check the logs.") + logger.error("Action: %s couldn't be deleted because it couldn't be found!") From b499c09eb289ee124c0e171c80ed0da1e3ba48f2 Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 15 May 2024 19:22:43 -0400 Subject: [PATCH 006/155] add list all actions --- cogs/actions_tracking.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py index e0e4e923..0d01af38 100644 --- a/cogs/actions_tracking.py +++ b/cogs/actions_tracking.py @@ -196,4 +196,22 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: logger.error("Action: %s couldn't be deleted because it couldn't be found!") + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="list-all-actions", + description="List all current actions.", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: + """List all actions.""" + main_guild: discord.Guild = self.bot.main_guild + committee_role: discord.Role = await self.bot.committee_role + + actions = [action async for action in Action.objects.all()] + committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 + + cmt_actions = {cmt: [action for action in actions if action.hashed_member_id == Action.hash_member_id(cmt.id)] for cmt in committee_members} # noqa: E501 + + all_actions_message = "\n".join([f"Listing all actions by committee member:\n{cmt.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for cmt, actions in cmt_actions.items()]) # noqa: E501 + await ctx.respond(all_actions_message) From e7fc36869fd0c6ae56e1b58e0858e196ecdec6cf Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 15 May 2024 19:42:54 -0400 Subject: [PATCH 007/155] add reassignment --- cogs/actions_tracking.py | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py index 0d01af38..e97ebeb9 100644 --- a/cogs/actions_tracking.py +++ b/cogs/actions_tracking.py @@ -195,6 +195,59 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: await ctx.respond("Hmm, I couldn't find that action. Please check the logs.") logger.error("Action: %s couldn't be deleted because it couldn't be found!") + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="reassign-action", + description="Reassign the specified action to another user.", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="action", + description="The action to reassign.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_all_actions), # type: ignore[arg-type] + required=True, + parameter_name="str_action_object", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="user", + description="The user to list actions for.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_committee), # type: ignore[arg-type] + required=True, + parameter_name="str_action_member_id", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: str, str_action_member_id: str) -> None: # noqa: E501 + """Reassign the specified action to the specified user.""" + components = str_action_object.split(":") + hashed_id = components[0].strip() + description = components[1].strip() + + actions = [action async for action in Action.objects.all()] + + action_to_reassign: Action + + for action in actions: + if action.hashed_member_id == hashed_id and action.description == description: + action_to_reassign = action + + if not action_to_reassign: + await ctx.respond("Something went wrong! Couldn't find that action...") + logger.error( + "Action: %s couldn't be reassigned because it couldn't be found!", + str_action_object, + ) + return + + if hashed_id == Action.hash_member_id(str_action_member_id): + await ctx.respond(f"HEY! Action: {description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 + return + + action_to_reassign.hashed_member_id = Action.hash_member_id(str_action_member_id) + + await ctx.respond("Action successfully reassigned!") + + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", From 837e0f59a858da2a717e43e84837b8256270ef32 Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 17 May 2024 12:41:50 -0400 Subject: [PATCH 008/155] minor fixes --- cogs/actions_tracking.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py index e97ebeb9..484291b3 100644 --- a/cogs/actions_tracking.py +++ b/cogs/actions_tracking.py @@ -51,7 +51,7 @@ async def action_autocomplete_get_all_actions(self) -> set[discord.OptionChoice] """ Autocomplete callable that generates a set of actions. - This list is used to give a list of actions to take anaction on. + Returns a list of actions that exist. """ actions = [action async for action in Action.objects.all()] @@ -150,7 +150,7 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe action_member: discord.User | None = self.bot.get_user(int(str_action_member_id)) if not action_member: - await ctx.respond("The user you supplied was dog shit. Fuck off cunt.") + await ctx.respond("The user you supplied doesn't exist or isn't in the server.") return if not actions: @@ -261,10 +261,11 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: committee_role: discord.Role = await self.bot.committee_role actions = [action async for action in Action.objects.all()] + committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - cmt_actions = {cmt: [action for action in actions if action.hashed_member_id == Action.hash_member_id(cmt.id)] for cmt in committee_members} # noqa: E501 + committee_actions = {committee: [action for action in actions if action.hashed_member_id == Action.hash_member_id(committee.id)] for committee in committee_members} # noqa: E501 - all_actions_message = "\n".join([f"Listing all actions by committee member:\n{cmt.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for cmt, actions in cmt_actions.items()]) # noqa: E501 + all_actions_message = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 await ctx.respond(all_actions_message) From a17498dfe42a9d52a381cea2eeb9431dae072c2b Mon Sep 17 00:00:00 2001 From: MattyThehacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 17 May 2024 13:40:48 -0400 Subject: [PATCH 009/155] update to use django built in functions --- cogs/actions_tracking.py | 68 +++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/cogs/actions_tracking.py b/cogs/actions_tracking.py index 484291b3..363d70f7 100644 --- a/cogs/actions_tracking.py +++ b/cogs/actions_tracking.py @@ -8,7 +8,7 @@ from logging import Logger import discord -from django.core.exceptions import ValidationError +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from db.core.models import Action from exceptions import CommitteeRoleDoesNotExistError, GuildDoesNotExistError @@ -65,8 +65,6 @@ async def action_autocomplete_get_all_actions(self) -> set[discord.OptionChoice] } - - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action", description="Adds a new action with the specified description", @@ -146,17 +144,21 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe Takes in a user and lists out their current actions. """ - actions = [action async for action in Action.objects.all() if Action.hash_member_id(str_action_member_id) == action.hashed_member_id] # noqa: E501 - action_member: discord.User | None = self.bot.get_user(int(str_action_member_id)) + action_member: discord.Member = await self.bot.get_member_from_str_id(str_action_member_id) # noqa: E501 if not action_member: await ctx.respond("The user you supplied doesn't exist or isn't in the server.") return - if not actions: + user_actions = [action async for action in Action.objects.filter( + hashed_member_id=Action.hash_member_id(str_action_member_id), + )] + + if not user_actions: await ctx.respond(f"User: {action_member.mention} has no actions.") + logger.debug(user_actions) else: - await ctx.respond(f"Found {len(actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in actions)}") # noqa: E501 + await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -179,21 +181,19 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: Marks the specified action as complete by deleting it. """ - actions = [action async for action in Action.objects.all()] - components = str_action_object.split(":") - hashed_id = components[0].strip() - description = components[1].strip() - - action: Action - for action in actions: - if action.hashed_member_id == hashed_id and action.description == description: - await ctx.respond(f"Found it chief! Action object: {action}") - await action.adelete() - return + input_hashed_id = components[0].strip() + input_description = components[1].strip() + + try: + action = await Action.objects.aget(hashed_member_id=input_hashed_id, description=input_description) # noqa: E501 + except (MultipleObjectsReturned, ObjectDoesNotExist): + await ctx.respond("Provided action was either not unique or did not exist.") + logger.warning("Action object: %s could not be matched to a unique action.", str_action_object) # noqa: E501 + + await ctx.respond(f"Action: {action} found! Deleting.") + await action.adelete() - await ctx.respond("Hmm, I couldn't find that action. Please check the logs.") - logger.error("Action: %s couldn't be deleted because it couldn't be found!") @discord.slash_command( # type: ignore[no-untyped-call, misc] name="reassign-action", @@ -220,27 +220,17 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: str, str_action_member_id: str) -> None: # noqa: E501 """Reassign the specified action to the specified user.""" components = str_action_object.split(":") - hashed_id = components[0].strip() - description = components[1].strip() - - actions = [action async for action in Action.objects.all()] - - action_to_reassign: Action + input_hashed_id = components[0].strip() + input_description = components[1].strip() - for action in actions: - if action.hashed_member_id == hashed_id and action.description == description: - action_to_reassign = action - - if not action_to_reassign: - await ctx.respond("Something went wrong! Couldn't find that action...") - logger.error( - "Action: %s couldn't be reassigned because it couldn't be found!", - str_action_object, - ) - return + try: + action_to_reassign = await Action.objects.aget(hashed_member_id=input_hashed_id, description=input_description) # noqa: E501 + except (MultipleObjectsReturned, ObjectDoesNotExist): + await ctx.respond("Provided action was either not unique or did not exist.") + logger.warning("Action object: %s could not be matched to a unique action.", str_action_object) # noqa: E501 - if hashed_id == Action.hash_member_id(str_action_member_id): - await ctx.respond(f"HEY! Action: {description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 + if input_hashed_id == Action.hash_member_id(str_action_member_id): + await ctx.respond(f"HEY! Action: {input_description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 return action_to_reassign.hashed_member_id = Action.hash_member_id(str_action_member_id) From 0085a8dc9ae4c4eef3d49261e822075283b8f369 Mon Sep 17 00:00:00 2001 From: Matt Norton Date: Fri, 17 May 2024 22:12:55 +0100 Subject: [PATCH 010/155] Improve error instance names --- cogs/induct.py | 5 +++-- cogs/kill.py | 13 ++++++++----- cogs/strike.py | 5 +++-- config.py | 8 ++++---- db/__init__.py | 6 +++--- utils/tex_bot.py | 6 ++++-- 6 files changed, 25 insertions(+), 18 deletions(-) diff --git a/cogs/induct.py b/cogs/induct.py index 53718eaf..01dd5697 100644 --- a/cogs/induct.py +++ b/cogs/induct.py @@ -328,12 +328,13 @@ async def induct(self, ctx: TeXBotApplicationContext, str_induct_member_id: str, The "induct" command inducts a given member into your group's Discord guild by giving them the "Guest" role. """ + member_id_not_integer_error: ValueError try: induct_member: discord.Member = await self.bot.get_member_from_str_id( str_induct_member_id, ) - except ValueError as e: - await self.command_send_error(ctx, message=e.args[0]) + except ValueError as member_id_not_integer_error: + await self.command_send_error(ctx, message=member_id_not_integer_error.args[0]) return # noinspection PyUnboundLocalVariable diff --git a/cogs/kill.py b/cogs/kill.py index 7e818751..605147fe 100644 --- a/cogs/kill.py +++ b/cogs/kill.py @@ -24,16 +24,19 @@ class ConfirmKillView(View): @classmethod async def _delete_message(cls, response: discord.InteractionResponse) -> None: - e: discord.NotFound + message_not_found_error: discord.NotFound try: await response.edit_message(delete_after=0) - except discord.NotFound as e: + except discord.NotFound as message_not_found_error: MESSAGE_WAS_ALREADY_DELETED: Final[bool] = ( - e.code == 10008 - or ("unknown" in e.text.lower() and "message" in e.text.lower()) + message_not_found_error.code == 10008 + or ( + "unknown" in message_not_found_error.text.lower() + and "message" in message_not_found_error.text.lower() + ) ) if not MESSAGE_WAS_ALREADY_DELETED: - raise e from e + raise message_not_found_error from message_not_found_error @discord.ui.button( # type: ignore[misc] label="SHUTDOWN", diff --git a/cogs/strike.py b/cogs/strike.py index cfbaec86..ef1075b5 100644 --- a/cogs/strike.py +++ b/cogs/strike.py @@ -768,12 +768,13 @@ async def strike(self, ctx: TeXBotApplicationContext, str_strike_member_id: str) The "strike" command adds an additional strike to the given member, then performs the appropriate moderation action to the member, according to the new number of strikes. """ + member_id_not_integer_error: ValueError try: strike_member: discord.Member = await self.bot.get_member_from_str_id( str_strike_member_id, ) - except ValueError as e: - await self.command_send_error(ctx, message=e.args[0]) + except ValueError as member_id_not_integer_error: + await self.command_send_error(ctx, message=member_id_not_integer_error.args[0]) return await self._command_perform_strike(ctx, strike_member) diff --git a/config.py b/config.py index 2ea81848..f1238577 100644 --- a/config.py +++ b/config.py @@ -120,14 +120,14 @@ def __getattr__(self, item: str) -> Any: # type: ignore[misc] # noqa: ANN401 def __getitem__(self, item: str) -> Any: # type: ignore[misc] # noqa: ANN401 """Retrieve settings value by key lookup.""" - e: AttributeError + attribute_not_exist_error: AttributeError try: return getattr(self, item) - except AttributeError as e: + except AttributeError as attribute_not_exist_error: key_error_message: str = item - if self.get_invalid_settings_key_message(item) in str(e): - key_error_message = str(e) + if self.get_invalid_settings_key_message(item) in str(attribute_not_exist_error): + key_error_message = str(attribute_not_exist_error) raise KeyError(key_error_message) from None diff --git a/db/__init__.py b/db/__init__.py index 4a39a3df..581581d4 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -12,9 +12,9 @@ os.environ["DJANGO_SETTINGS_MODULE"] = "db._settings" -e: RuntimeError +django_setup_error: RuntimeError try: django.setup() -except RuntimeError as e: - if "populate() isn't reentrant" not in str(e): +except RuntimeError as django_setup_error: + if "populate() isn't reentrant" not in str(django_setup_error): raise diff --git a/utils/tex_bot.py b/utils/tex_bot.py index 258da749..cf196583 100644 --- a/utils/tex_bot.py +++ b/utils/tex_bot.py @@ -435,9 +435,11 @@ async def get_member_from_str_id(self, str_member_id: str) -> discord.Member: raise ValueError( DiscordMemberNotInMainGuildError(user_id=int(str_member_id)).message, ) + + user_not_in_main_guild_error: DiscordMemberNotInMainGuildError try: member: discord.Member = await self.get_main_guild_member(user) - except DiscordMemberNotInMainGuildError as e: - raise ValueError from e + except DiscordMemberNotInMainGuildError as user_not_in_main_guild_error: + raise ValueError from user_not_in_main_guild_error return member From f9d04f8c2579f658a54f890bf7f6ce2e993a7020 Mon Sep 17 00:00:00 2001 From: Matt Norton Date: Fri, 17 May 2024 23:48:45 +0100 Subject: [PATCH 011/155] Refactor improvements to actions tracking --- cogs/__init__.py | 6 +- ...cking.py => committee_actions_tracking.py} | 60 +++++++++---------- 2 files changed, 31 insertions(+), 35 deletions(-) rename cogs/{actions_tracking.py => committee_actions_tracking.py} (85%) diff --git a/cogs/__init__.py b/cogs/__init__.py index f80595cf..75726cf1 100644 --- a/cogs/__init__.py +++ b/cogs/__init__.py @@ -8,9 +8,9 @@ from collections.abc import Sequence __all__: Sequence[str] = ( - "ActionsTrackingCog", "ArchiveCommandCog", "CommandErrorCog", + "CommitteeActionsTrackingCog", "DeleteAllCommandsCog", "EditMessageCommandCog", "EnsureMembersInductedCommandCog", @@ -37,7 +37,7 @@ from typing import TYPE_CHECKING -from cogs.actions_tracking import ActionsTrackingCog +from cogs.committee_actions_tracking import CommitteeActionsTrackingCog from cogs.archive import ArchiveCommandCog from cogs.command_error import CommandErrorCog from cogs.delete_all import DeleteAllCommandsCog @@ -70,9 +70,9 @@ def setup(bot: TeXBot) -> None: """Add all the cogs to the bot, at bot startup.""" cogs: Iterable[type[TeXBotBaseCog]] = ( - ActionsTrackingCog, ArchiveCommandCog, CommandErrorCog, + CommitteeActionsTrackingCog, DeleteAllCommandsCog, EditMessageCommandCog, EnsureMembersInductedCommandCog, diff --git a/cogs/actions_tracking.py b/cogs/committee_actions_tracking.py similarity index 85% rename from cogs/actions_tracking.py rename to cogs/committee_actions_tracking.py index 363d70f7..ee0cc7e6 100644 --- a/cogs/actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -1,8 +1,8 @@ -"""Contains cog classes for tracking committee actions.""" +"""Contains cog classes for tracking committee-actions.""" from collections.abc import Sequence -__all__: Sequence[str] = ("ActionsTrackingCog",) +__all__: Sequence[str] = ("CommitteeActionsTrackingCog",) import logging from logging import Logger @@ -11,7 +11,7 @@ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from db.core.models import Action -from exceptions import CommitteeRoleDoesNotExistError, GuildDoesNotExistError +from exceptions import BaseDoesNotExistError from utils import ( CommandChecks, TeXBotApplicationContext, @@ -22,61 +22,57 @@ logger: Logger = logging.getLogger("TeX-Bot") -class ActionsTrackingCog(TeXBotBaseCog): - """Cog class that defines the action tracking functionality.""" +class CommitteeActionsTrackingCog(TeXBotBaseCog): + """Cog class that defines the committee-actions tracking functionality.""" - @staticmethod - async def action_autocomplete_get_committee(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 - """ - Autocomplete callable that generates a set of selectable committee members. + committee_actions: discord.SlashCommandGroup = discord.SlashCommandGroup( + "committeeactions", + "Add, list & remove tracked committee-actions." + ) - This list is used to give a list of actionable committee members. - """ + @staticmethod + async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + """Autocomplete callable that generates a set of selectable committee members.""" + shortcut_accessors_failed_error: BaseDoesNotExistError try: main_guild: discord.Guild = ctx.bot.main_guild committee_role: discord.Role = await ctx.bot.committee_role - except (GuildDoesNotExistError, CommitteeRoleDoesNotExistError): - logger.warning("Guild not found or committee role not found") + except BaseDoesNotExistError as shortcut_accessors_failed_error: + logger.warning(shortcut_accessors_failed_error.message) return set() - committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - return { - discord.OptionChoice(name=committee_member.name, value=str(committee_member.id)) - for committee_member - in committee_members + discord.OptionChoice(name=member.name, value=str(member.id)) + for member + in main_guild.members + if not member.bot and committee_role in member.roles } - async def action_autocomplete_get_all_actions(self) -> set[discord.OptionChoice]: + @classmethod + async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: """ - Autocomplete callable that generates a set of actions. + Autocomplete callable that provides a set of selectable committee tracked-actions. - Returns a list of actions that exist. + Each action is identified by its description. """ - actions = [action async for action in Action.objects.all()] - - if not actions: - return set() - return { discord.OptionChoice(name=str(action.description), value=str(action)) - for action - in actions + async for action + in Action.objects.all() } - - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action", description="Adds a new action with the specified description", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="description", description="The description of the action to assign.", input_type=str, required=True, parameter_name="str_action_description", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="user", description="The user to action, if no user is specified, default to self", input_type=str, From 087d4d98a458a37fc93eeddd8e89be74c552f967 Mon Sep 17 00:00:00 2001 From: Matt Norton Date: Fri, 17 May 2024 23:51:58 +0100 Subject: [PATCH 012/155] Revert "Improve error instance names" This reverts commit 0085a8dc9ae4c4eef3d49261e822075283b8f369. --- cogs/induct.py | 5 ++--- cogs/kill.py | 13 +++++-------- cogs/strike.py | 5 ++--- config.py | 8 ++++---- db/__init__.py | 6 +++--- utils/tex_bot.py | 6 ++---- 6 files changed, 18 insertions(+), 25 deletions(-) diff --git a/cogs/induct.py b/cogs/induct.py index 01dd5697..53718eaf 100644 --- a/cogs/induct.py +++ b/cogs/induct.py @@ -328,13 +328,12 @@ async def induct(self, ctx: TeXBotApplicationContext, str_induct_member_id: str, The "induct" command inducts a given member into your group's Discord guild by giving them the "Guest" role. """ - member_id_not_integer_error: ValueError try: induct_member: discord.Member = await self.bot.get_member_from_str_id( str_induct_member_id, ) - except ValueError as member_id_not_integer_error: - await self.command_send_error(ctx, message=member_id_not_integer_error.args[0]) + except ValueError as e: + await self.command_send_error(ctx, message=e.args[0]) return # noinspection PyUnboundLocalVariable diff --git a/cogs/kill.py b/cogs/kill.py index 605147fe..7e818751 100644 --- a/cogs/kill.py +++ b/cogs/kill.py @@ -24,19 +24,16 @@ class ConfirmKillView(View): @classmethod async def _delete_message(cls, response: discord.InteractionResponse) -> None: - message_not_found_error: discord.NotFound + e: discord.NotFound try: await response.edit_message(delete_after=0) - except discord.NotFound as message_not_found_error: + except discord.NotFound as e: MESSAGE_WAS_ALREADY_DELETED: Final[bool] = ( - message_not_found_error.code == 10008 - or ( - "unknown" in message_not_found_error.text.lower() - and "message" in message_not_found_error.text.lower() - ) + e.code == 10008 + or ("unknown" in e.text.lower() and "message" in e.text.lower()) ) if not MESSAGE_WAS_ALREADY_DELETED: - raise message_not_found_error from message_not_found_error + raise e from e @discord.ui.button( # type: ignore[misc] label="SHUTDOWN", diff --git a/cogs/strike.py b/cogs/strike.py index ef1075b5..cfbaec86 100644 --- a/cogs/strike.py +++ b/cogs/strike.py @@ -768,13 +768,12 @@ async def strike(self, ctx: TeXBotApplicationContext, str_strike_member_id: str) The "strike" command adds an additional strike to the given member, then performs the appropriate moderation action to the member, according to the new number of strikes. """ - member_id_not_integer_error: ValueError try: strike_member: discord.Member = await self.bot.get_member_from_str_id( str_strike_member_id, ) - except ValueError as member_id_not_integer_error: - await self.command_send_error(ctx, message=member_id_not_integer_error.args[0]) + except ValueError as e: + await self.command_send_error(ctx, message=e.args[0]) return await self._command_perform_strike(ctx, strike_member) diff --git a/config.py b/config.py index f1238577..2ea81848 100644 --- a/config.py +++ b/config.py @@ -120,14 +120,14 @@ def __getattr__(self, item: str) -> Any: # type: ignore[misc] # noqa: ANN401 def __getitem__(self, item: str) -> Any: # type: ignore[misc] # noqa: ANN401 """Retrieve settings value by key lookup.""" - attribute_not_exist_error: AttributeError + e: AttributeError try: return getattr(self, item) - except AttributeError as attribute_not_exist_error: + except AttributeError as e: key_error_message: str = item - if self.get_invalid_settings_key_message(item) in str(attribute_not_exist_error): - key_error_message = str(attribute_not_exist_error) + if self.get_invalid_settings_key_message(item) in str(e): + key_error_message = str(e) raise KeyError(key_error_message) from None diff --git a/db/__init__.py b/db/__init__.py index 581581d4..4a39a3df 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -12,9 +12,9 @@ os.environ["DJANGO_SETTINGS_MODULE"] = "db._settings" -django_setup_error: RuntimeError +e: RuntimeError try: django.setup() -except RuntimeError as django_setup_error: - if "populate() isn't reentrant" not in str(django_setup_error): +except RuntimeError as e: + if "populate() isn't reentrant" not in str(e): raise diff --git a/utils/tex_bot.py b/utils/tex_bot.py index cf196583..258da749 100644 --- a/utils/tex_bot.py +++ b/utils/tex_bot.py @@ -435,11 +435,9 @@ async def get_member_from_str_id(self, str_member_id: str) -> discord.Member: raise ValueError( DiscordMemberNotInMainGuildError(user_id=int(str_member_id)).message, ) - - user_not_in_main_guild_error: DiscordMemberNotInMainGuildError try: member: discord.Member = await self.get_main_guild_member(user) - except DiscordMemberNotInMainGuildError as user_not_in_main_guild_error: - raise ValueError from user_not_in_main_guild_error + except DiscordMemberNotInMainGuildError as e: + raise ValueError from e return member From bd49a880781b6260485d29afc84ee559f93c8e7d Mon Sep 17 00:00:00 2001 From: Matt Norton Date: Tue, 21 May 2024 19:01:45 +0100 Subject: [PATCH 013/155] Remove out of date migration file --- .../0007_action_action_unique_user_action.py | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 db/core/migrations/0007_action_action_unique_user_action.py diff --git a/db/core/migrations/0007_action_action_unique_user_action.py b/db/core/migrations/0007_action_action_unique_user_action.py deleted file mode 100644 index 90109b42..00000000 --- a/db/core/migrations/0007_action_action_unique_user_action.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.0.6 on 2024-05-15 19:53 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0006_rename_hashed_uob_id_groupmademember_hashed_group_member_id'), - ] - - operations = [ - migrations.CreateModel( - name='Action', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('hashed_member_id', models.CharField(max_length=64, validators=[django.core.validators.RegexValidator('\\A[A-Fa-f0-9]{64}\\Z', 'hashed_member_id must be a valid sha256 hex-digest.')], verbose_name='Hashed Discord Member ID')), - ('description', models.TextField(blank=True, max_length=1500, verbose_name='Description of the action')), - ], - options={ - 'verbose_name': 'An Action for a Discord Member', - 'verbose_name_plural': 'Actions for Discord Members', - }, - ), - migrations.AddConstraint( - model_name='action', - constraint=models.UniqueConstraint(fields=('hashed_member_id', 'description'), name='unique_user_action'), - ), - ] From 0c1d5c0738e2195f6b53e214c2478548911fbb59 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 2 Jun 2024 18:30:38 +0100 Subject: [PATCH 014/155] minor fixes --- cogs/committee_actions_tracking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ee0cc7e6..f3ba285a 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -76,7 +76,7 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: name="user", description="The user to action, if no user is specified, default to self", input_type=str, - autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_committee), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=True, parameter_name="str_action_member_id", ) @@ -128,7 +128,7 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, name="user", description="The user to list actions for.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_committee), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=True, parameter_name="str_action_member_id", ) @@ -207,7 +207,7 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: name="user", description="The user to list actions for.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_committee), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=True, parameter_name="str_action_member_id", ) From e31b0e48663eba0e95f0c11c3e60a2df633f0d8a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 2 Jun 2024 18:31:53 +0100 Subject: [PATCH 015/155] organise imports --- cogs/__init__.py | 2 +- cogs/committee_actions_tracking.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/__init__.py b/cogs/__init__.py index 75726cf1..d6c22e49 100644 --- a/cogs/__init__.py +++ b/cogs/__init__.py @@ -37,9 +37,9 @@ from typing import TYPE_CHECKING -from cogs.committee_actions_tracking import CommitteeActionsTrackingCog from cogs.archive import ArchiveCommandCog from cogs.command_error import CommandErrorCog +from cogs.committee_actions_tracking import CommitteeActionsTrackingCog from cogs.delete_all import DeleteAllCommandsCog from cogs.edit_message import EditMessageCommandCog from cogs.induct import ( diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f3ba285a..3babb2d0 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -27,7 +27,7 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): committee_actions: discord.SlashCommandGroup = discord.SlashCommandGroup( "committeeactions", - "Add, list & remove tracked committee-actions." + "Add, list & remove tracked committee-actions.", ) @staticmethod From 8f198bef1aafa23ea88da2963712ff32758d2e29 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:17:23 +0100 Subject: [PATCH 016/155] new exception handling --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 3babb2d0..f3609577 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -11,7 +11,7 @@ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from db.core.models import Action -from exceptions import BaseDoesNotExistError +from exceptions.base import BaseDoesNotExistError from utils import ( CommandChecks, TeXBotApplicationContext, From b68777fbb99bd859fdb1acf5f44629ebe8949656 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 19 Jun 2024 22:52:25 +0100 Subject: [PATCH 017/155] db changes --- .../0010_action_action_unique_user_action.py | 34 +++++++++++++++++++ db/core/models/__init__.py | 32 +++++++---------- 2 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 db/core/migrations/0010_action_action_unique_user_action.py diff --git a/db/core/migrations/0010_action_action_unique_user_action.py b/db/core/migrations/0010_action_action_unique_user_action.py new file mode 100644 index 00000000..d3ab16ff --- /dev/null +++ b/db/core/migrations/0010_action_action_unique_user_action.py @@ -0,0 +1,34 @@ +# Generated by Django 5.0.6 on 2024-06-19 21:50 + +import db.core.models.managers +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_auto_20240519_0020'), + ] + + operations = [ + migrations.CreateModel( + name='Action', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(blank=True, max_length=1500, verbose_name='Description of the action')), + ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action', to='core.discordmember', verbose_name='Discord Member')), + ], + options={ + 'verbose_name': 'An Action for a Discord Member', + 'verbose_name_plural': 'Actions for Discord Members', + }, + managers=[ + ('objects', db.core.models.managers.RelatedDiscordMemberManager()), + ], + ), + migrations.AddConstraint( + model_name='action', + constraint=models.UniqueConstraint(fields=('discord_member', 'description'), name='unique_user_action'), + ), + ] diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 2a4fc06f..5c6a3217 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -26,22 +26,19 @@ from .utils import AsyncBaseModel, BaseDiscordMemberWrapper, DiscordMember -class Action(AsyncBaseModel): +class Action(BaseDiscordMemberWrapper): """Model to represent an action item that has been assigned to a Discord Member.""" INSTANCES_NAME_PLURAL: str = "Actions" - hashed_member_id = models.CharField( - "Hashed Discord Member ID", - null=False, + discord_member = models.ForeignKey( # type: ignore[assignment] + DiscordMember, + on_delete=models.CASCADE, + related_name="action", + verbose_name="Discord Member", blank=False, - max_length=64, - validators=[ - RegexValidator( - r"\A[A-Fa-f0-9]{64}\Z", - "hashed_member_id must be a valid sha256 hex-digest.", - ), - ], + null=False, + unique=False, ) description = models.TextField( "Description of the action", @@ -54,7 +51,7 @@ class Meta: verbose_name_plural = "Actions for Discord Members" constraints = [ # noqa: RUF012 models.UniqueConstraint( - fields=["hashed_member_id", "description"], + fields=["discord_member", "description"], name="unique_user_action", ), ] @@ -62,29 +59,26 @@ class Meta: def __repr__(self) -> str: """Generate a developer-focused representation of this DiscordReminder's attributes.""" return ( - f"<{self._meta.verbose_name}: {self.hashed_member_id!r}, {str(self.description)!r}" + f"<{self._meta.verbose_name}: {self.discord_member!r}, {str(self.description)!r}" # type: ignore[has-type] ) def __str__(self) -> str: """Generate the string representation of this DiscordReminder.""" - construct_str: str = f"{self.hashed_member_id}" + construct_str: str = f"{self.discord_member}" # type: ignore[has-type] if self.description: construct_str += f": {self.description[:50]}" return construct_str - def get_formatted_message(self, user_mention: str | None) -> str: + def get_action_description(self) -> str: """ Return the formatted description stored by this action. Adds a mention to the Discord member that was assigned the action, if passed in from the calling context. """ - constructed_message: str = "This is your reminder" - - if user_mention: - constructed_message += f", {user_mention}" + constructed_message: str = "This is your action" constructed_message += "!" From def7c902d7d62929bf74738b86d55b7c26c5781a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 19 Jun 2024 23:42:10 +0100 Subject: [PATCH 018/155] async fuckery --- cogs/committee_actions_tracking.py | 32 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f3609577..6c0c0b78 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -10,7 +10,7 @@ import discord from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError -from db.core.models import Action +from db.core.models import Action, DiscordMember from exceptions.base import BaseDoesNotExistError from utils import ( CommandChecks, @@ -56,7 +56,7 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: Each action is identified by its description. """ return { - discord.OptionChoice(name=str(action.description), value=str(action)) + discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] async for action in Action.objects.all() } @@ -90,8 +90,8 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, we assume the action is aimed at the command issuer. """ try: - action: Action = await Action.objects.acreate( - member_id=int(str_action_member_id), + action: Action = await Action.objects.acreate( # type: ignore[assignment] + discord_id=int(str_action_member_id), description=str_action_description, ) except ValidationError as create_action_error: @@ -146,15 +146,15 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe await ctx.respond("The user you supplied doesn't exist or isn't in the server.") return - user_actions = [action async for action in Action.objects.filter( - hashed_member_id=Action.hash_member_id(str_action_member_id), + user_actions = [action async for action in await Action.objects.afilter( + discord_id=int(str_action_member_id), )] if not user_actions: await ctx.respond(f"User: {action_member.mention} has no actions.") logger.debug(user_actions) else: - await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 + await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # type: ignore[attr-defined] # noqa: E501 @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -182,10 +182,16 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: input_description = components[1].strip() try: - action = await Action.objects.aget(hashed_member_id=input_hashed_id, description=input_description) # noqa: E501 + action = await Action.objects.aget( + hashed_member_id=input_hashed_id, + description=input_description, + ) except (MultipleObjectsReturned, ObjectDoesNotExist): await ctx.respond("Provided action was either not unique or did not exist.") - logger.warning("Action object: %s could not be matched to a unique action.", str_action_object) # noqa: E501 + logger.warning( + "Action object: %s could not be matched to a unique action.", + str_action_object, + ) await ctx.respond(f"Action: {action} found! Deleting.") await action.adelete() @@ -225,11 +231,11 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: await ctx.respond("Provided action was either not unique or did not exist.") logger.warning("Action object: %s could not be matched to a unique action.", str_action_object) # noqa: E501 - if input_hashed_id == Action.hash_member_id(str_action_member_id): + if input_hashed_id == DiscordMember.hash_discord_id(str_action_member_id): await ctx.respond(f"HEY! Action: {input_description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 return - action_to_reassign.hashed_member_id = Action.hash_member_id(str_action_member_id) + action_to_reassign.discord_member.hashed_discord_id = DiscordMember.hash_discord_id(str(str_action_member_id)) # noqa: E501 await ctx.respond("Action successfully reassigned!") @@ -250,8 +256,8 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - committee_actions = {committee: [action for action in actions if action.hashed_member_id == Action.hash_member_id(committee.id)] for committee in committee_members} # noqa: E501 + committee_actions = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 - all_actions_message = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 + all_actions_message = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # type: ignore[attr-defined] # noqa: E501 await ctx.respond(all_actions_message) From db0fab263d39aad9ec90c56e0cf26f17eb46f00e Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:19:12 +0100 Subject: [PATCH 019/155] django is possibly the worst fucking software I've had the displeasure of trying to use --- cogs/committee_actions_tracking.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 6c0c0b78..2beb406c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -57,8 +57,8 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: """ return { discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] - async for action - in Action.objects.all() + for action + in list(repr(await Action.objects.aget())) } @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -240,7 +240,6 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: await ctx.respond("Action successfully reassigned!") - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", description="List all current actions.", From be0ee86d97a8c61248e37e482cd726fe4610037a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:20:01 +0100 Subject: [PATCH 020/155] cunt --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 2beb406c..13f1c13f 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -57,8 +57,8 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: """ return { discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] - for action - in list(repr(await Action.objects.aget())) + async for action + in await Action.objects.all() } @discord.slash_command( # type: ignore[no-untyped-call, misc] From effea18382984e3346d9cb5e205feb3c1286e2a8 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:08:32 +0100 Subject: [PATCH 021/155] suck my cock you cunting twat fucking cunt --- cogs/committee_actions_tracking.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 13f1c13f..f343f7bf 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -8,6 +8,7 @@ from logging import Logger import discord +from asgiref.sync import sync_to_async from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from db.core.models import Action, DiscordMember @@ -55,10 +56,12 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: Each action is identified by its description. """ + actions = await sync_to_async(Action.objects.all)() + logger.debug(actions) return { discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] - async for action - in await Action.objects.all() + for action + in actions } @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -251,12 +254,10 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: main_guild: discord.Guild = self.bot.main_guild committee_role: discord.Role = await self.bot.committee_role - actions = [action async for action in Action.objects.all()] - committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - committee_actions = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 + committee_actions: dict[discord.Member, list[Action]] = {committee: [action async for action in Action.objects.all() if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 - all_actions_message = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # type: ignore[attr-defined] # noqa: E501 + all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # type: ignore[attr-defined] # noqa: E501 await ctx.respond(all_actions_message) From 05461bbc5e8cc5d42dec8e1059a89a638b902988 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 21 Jun 2024 00:11:30 +0100 Subject: [PATCH 022/155] maybe fix? no --- cogs/committee_actions_tracking.py | 6 +++--- db/core/models/managers.py | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f343f7bf..773e2104 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -57,7 +57,6 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: Each action is identified by its description. """ actions = await sync_to_async(Action.objects.all)() - logger.debug(actions) return { discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] for action @@ -242,7 +241,6 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: await ctx.respond("Action successfully reassigned!") - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", description="List all current actions.", @@ -254,9 +252,11 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: main_guild: discord.Guild = self.bot.main_guild committee_role: discord.Role = await self.bot.committee_role + actions: list[Action] = await sync_to_async(Action.objects.all)() + committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - committee_actions: dict[discord.Member, list[Action]] = {committee: [action async for action in Action.objects.all() if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 + committee_actions: dict[discord.Member, list[Action]] = {committee: [action async for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # type: ignore[attr-defined] # noqa: E501 diff --git a/db/core/models/managers.py b/db/core/models/managers.py index dc95cfaa..e6b824d9 100644 --- a/db/core/models/managers.py +++ b/db/core/models/managers.py @@ -15,13 +15,18 @@ import utils +from .utils import BaseDiscordMemberWrapper + if TYPE_CHECKING: from django.core.exceptions import ObjectDoesNotExist - from .utils import AsyncBaseModel, BaseDiscordMemberWrapper, DiscordMember # noqa: F401 + from .utils import AsyncBaseModel, DiscordMember # noqa: F401 T_model = TypeVar("T_model", bound=AsyncBaseModel) + +T_BaseDiscordMemberWrapper = TypeVar("T_BaseDiscordMemberWrapper", bound=BaseDiscordMemberWrapper) # noqa: E501 + Defaults: TypeAlias = ( MutableMapping[str, object | Callable[[], object]] | None @@ -197,7 +202,7 @@ async def _aremove_unhashed_id_from_kwargs(self, kwargs: dict[str, object]) -> d return kwargs -class RelatedDiscordMemberManager(BaseHashedIDManager["BaseDiscordMemberWrapper"]): +class RelatedDiscordMemberManager(BaseHashedIDManager["T_BaseDiscordMemberWrapper"]): """ Manager class to create & retrieve instances of any concrete `BaseDiscordMemberWrapper`. From 1a998a012d142f020d6b54a629f917ae363d554d Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 21 Jun 2024 18:50:29 +0100 Subject: [PATCH 023/155] more fixes --- db/core/models/managers.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/db/core/models/managers.py b/db/core/models/managers.py index e6b824d9..e4b6cf22 100644 --- a/db/core/models/managers.py +++ b/db/core/models/managers.py @@ -15,17 +15,14 @@ import utils -from .utils import BaseDiscordMemberWrapper - if TYPE_CHECKING: from django.core.exceptions import ObjectDoesNotExist - from .utils import AsyncBaseModel, DiscordMember # noqa: F401 + from .utils import AsyncBaseModel, BaseDiscordMemberWrapper, DiscordMember # noqa: F401 T_model = TypeVar("T_model", bound=AsyncBaseModel) - -T_BaseDiscordMemberWrapper = TypeVar("T_BaseDiscordMemberWrapper", bound=BaseDiscordMemberWrapper) # noqa: E501 + T_BaseDiscordMemberWrapper = TypeVar("T_BaseDiscordMemberWrapper", bound=BaseDiscordMemberWrapper) # noqa: E501 Defaults: TypeAlias = ( MutableMapping[str, object | Callable[[], object]] From 1becdc8f834cc64117e04eafa93b095ffd2808bb Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 21 Jun 2024 18:56:15 +0100 Subject: [PATCH 024/155] FUCK OFF --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 773e2104..a84887d4 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -252,11 +252,11 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: main_guild: discord.Guild = self.bot.main_guild committee_role: discord.Role = await self.bot.committee_role - actions: list[Action] = await sync_to_async(Action.objects.all)() + actions: list[Action] = list(await sync_to_async(Action.objects.all)()) committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - committee_actions: dict[discord.Member, list[Action]] = {committee: [action async for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 + committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # type: ignore[attr-defined] # noqa: E501 From ffd9bab286d5a96212ddfecdb89328fe86788cd0 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 23 Jun 2024 00:36:57 +0100 Subject: [PATCH 025/155] fix this bs --- cogs/committee_actions_tracking.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index a84887d4..d76f30b6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -237,7 +237,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: await ctx.respond(f"HEY! Action: {input_description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 return - action_to_reassign.discord_member.hashed_discord_id = DiscordMember.hash_discord_id(str(str_action_member_id)) # noqa: E501 + action_to_reassign.discord_member.hashed_discord_id = DiscordMember.hash_discord_id(str(str_action_member_id)) # type: ignore[has-type] # noqa: E501 await ctx.respond("Action successfully reassigned!") @@ -252,12 +252,14 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: main_guild: discord.Guild = self.bot.main_guild committee_role: discord.Role = await self.bot.committee_role - actions: list[Action] = list(await sync_to_async(Action.objects.all)()) + actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 + + logger.debug(repr(actions)) committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 - committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # noqa: E501 + committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # type: ignore [has-type] # noqa: E501 - all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # type: ignore[attr-defined] # noqa: E501 + all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 await ctx.respond(all_actions_message) From 059dd59e8dcc68dd33fe30dcc4097579cdf0bf48 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 23 Jun 2024 00:41:26 +0100 Subject: [PATCH 026/155] finishing touches --- cogs/committee_actions_tracking.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index d76f30b6..65948472 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -8,7 +8,6 @@ from logging import Logger import discord -from asgiref.sync import sync_to_async from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from db.core.models import Action, DiscordMember @@ -56,11 +55,10 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: Each action is identified by its description. """ - actions = await sync_to_async(Action.objects.all)() return { discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] - for action - in actions + async for action + in Action.objects.select_related().all() } @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -254,8 +252,6 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 - logger.debug(repr(actions)) - committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # type: ignore [has-type] # noqa: E501 From b40acffe7e65f2778ee4b3ab7bd9af18977ebb6f Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 23 Jun 2024 01:09:49 +0100 Subject: [PATCH 027/155] hmmm --- cogs/committee_actions_tracking.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 65948472..8355c8ec 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -55,10 +55,18 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: Each action is identified by its description. """ + all_actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 + + logger.debug(repr(all_actions)) + + if not all_actions: + logger.debug("User tried to autocomplete for Actions but no actions were found!") + return set() + return { - discord.OptionChoice(name=str(action.description), value=str(action)) # type: ignore[attr-defined] - async for action - in Action.objects.select_related().all() + discord.OptionChoice(name=str(action.discord_member + ":" + action.description), value=str(action)) # type: ignore[attr-defined, has-type] # noqa: E501 + for action + in all_actions } @discord.slash_command( # type: ignore[no-untyped-call, misc] From fde76b59a7aa992fc6a4bcd3179159b47cb83344 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:22:11 +0100 Subject: [PATCH 028/155] IT'S ALIVE --- cogs/committee_actions_tracking.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8355c8ec..8df1bf82 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -48,8 +48,8 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> if not member.bot and committee_role in member.roles } - @classmethod - async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: + @staticmethod + async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """ Autocomplete callable that provides a set of selectable committee tracked-actions. @@ -57,14 +57,12 @@ async def action_autocomplete_get_all_actions(cls) -> set[discord.OptionChoice]: """ all_actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 - logger.debug(repr(all_actions)) - if not all_actions: logger.debug("User tried to autocomplete for Actions but no actions were found!") return set() return { - discord.OptionChoice(name=str(action.discord_member + ":" + action.description), value=str(action)) # type: ignore[attr-defined, has-type] # noqa: E501 + discord.OptionChoice(name=str(action.description), value=str(action)) for action in all_actions } @@ -186,23 +184,30 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: Marks the specified action as complete by deleting it. """ components = str_action_object.split(":") - input_hashed_id = components[0].strip() input_description = components[1].strip() try: - action = await Action.objects.aget( - hashed_member_id=input_hashed_id, + # NOTE: we only compare the description here because it is not possible, due to the hashing, to also check the discord user. + action: Action = await Action.objects.select_related().aget( description=input_description, ) except (MultipleObjectsReturned, ObjectDoesNotExist): - await ctx.respond("Provided action was either not unique or did not exist.") + await ctx.respond( + ":warning: Provided action was either not unique or did not exist.", + ) logger.warning( "Action object: %s could not be matched to a unique action.", str_action_object, ) - await ctx.respond(f"Action: {action} found! Deleting.") + if not action: + logger.debug("Something went wrong and the action could not be retrieved.") + ctx.respond("Something went wrong and the action could not be retrieved.") + return + await action.adelete() + await ctx.respond(f"Action: {action.description} deleted!") + logger.debug("Action: %s has been deleted.", action.description) @discord.slash_command( # type: ignore[no-untyped-call, misc] From b83fa314842cbb5f7e938beb1fe0bc7206f0a163 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:31:47 +0100 Subject: [PATCH 029/155] fix mypy errors --- cogs/committee_actions_tracking.py | 4 ++-- cogs/remind_me.py | 4 ++-- cogs/send_introduction_reminders.py | 2 +- cogs/strike.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8df1bf82..e2fd0309 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -96,7 +96,7 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, we assume the action is aimed at the command issuer. """ try: - action: Action = await Action.objects.acreate( # type: ignore[assignment] + action: Action = await Action.objects.acreate( discord_id=int(str_action_member_id), description=str_action_description, ) @@ -160,7 +160,7 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe await ctx.respond(f"User: {action_member.mention} has no actions.") logger.debug(user_actions) else: - await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # type: ignore[attr-defined] # noqa: E501 + await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 @discord.slash_command( # type: ignore[no-untyped-call, misc] diff --git a/cogs/remind_me.py b/cogs/remind_me.py index 3505cef1..5a4ed40c 100644 --- a/cogs/remind_me.py +++ b/cogs/remind_me.py @@ -214,7 +214,7 @@ async def remind_me(self, ctx: TeXBotApplicationContext, delay: str, message: st message = re.sub(r"<@[&#]?\d+>", "@...", message.strip()) try: - reminder: DiscordReminder = await DiscordReminder.objects.acreate( # type: ignore[assignment] + reminder: DiscordReminder = await DiscordReminder.objects.acreate( discord_id=ctx.user.id, message=message or "", channel_id=ctx.channel_id, @@ -288,7 +288,7 @@ async def clear_reminders_backlog(self) -> None: ) reminder: DiscordReminder - async for reminder in DiscordReminder.objects.select_related("discord_member").all(): # type: ignore[assignment] + async for reminder in DiscordReminder.objects.select_related("discord_member").all(): time_since_reminder_needed_to_be_sent: datetime.timedelta = ( discord.utils.utcnow() - reminder.send_datetime ) diff --git a/cogs/send_introduction_reminders.py b/cogs/send_introduction_reminders.py index 80394599..39a8e8ca 100644 --- a/cogs/send_introduction_reminders.py +++ b/cogs/send_introduction_reminders.py @@ -294,7 +294,7 @@ async def opt_out_introduction_reminders_button_callback(self, button: discord.B else: try: introduction_reminder_opt_out_member: IntroductionReminderOptOutMember = ( - await IntroductionReminderOptOutMember.objects.aget( # type: ignore[assignment] + await IntroductionReminderOptOutMember.objects.aget( discord_id=interaction_member.id, ) ) diff --git a/cogs/strike.py b/cogs/strike.py index defe108b..5349e5a8 100644 --- a/cogs/strike.py +++ b/cogs/strike.py @@ -386,7 +386,7 @@ async def _command_perform_strike(self, ctx: TeXBotApplicationContext, strike_me ) return - member_strikes: DiscordMemberStrikes = ( # type: ignore[assignment] + member_strikes: DiscordMemberStrikes = ( await DiscordMemberStrikes.objects.aget_or_create( discord_id=strike_member.id, ) @@ -505,7 +505,7 @@ async def _confirm_manual_add_strike(self, strike_user: discord.User | discord.M discord.AuditLogAction.ban: "banned", } - member_strikes: DiscordMemberStrikes = ( # type: ignore[assignment] + member_strikes: DiscordMemberStrikes = ( await DiscordMemberStrikes.objects.aget_or_create( discord_id=strike_user.id, ) From 2583c1eb126265230f16bfb4827ae477553fb0b8 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:22:33 +0100 Subject: [PATCH 030/155] add command to allow a user to check their own actions --- cogs/committee_actions_tracking.py | 32 ++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index e2fd0309..b8b4ac2a 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -159,8 +159,36 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe if not user_actions: await ctx.respond(f"User: {action_member.mention} has no actions.") logger.debug(user_actions) - else: - await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 + return + + await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 + + + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="list-my-actions", + description="Lists all actions for the user that ran the command", + ) + @CommandChecks.check_interaction_user_in_main_guild + async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: + """ + Definition and callback of the list my actions command. + + Takes no arguments and simply returns the actions for the user that ran the command. + """ + command_user: discord.Member = await ctx.user + + user_actions = [action async for action in await Action.objects.afilter( + discord_id=int(command_user.id), + )] + + if not user_actions: + await ctx.respond(content=":warning: You do not have any actions!") + logger.debug( + "User: %s ran the list-my-actions slash-command but no actions were found!", + ) + return + + await ctx.respond(content=f"You have {len(user_actions)} actions: \n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 @discord.slash_command( # type: ignore[no-untyped-call, misc] From 4cd3c2e1a9c1caa9b390448d7f49d2d9bf31a305 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 3 Jul 2024 00:33:24 +0100 Subject: [PATCH 031/155] minor fixes --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index b8b4ac2a..307da3ec 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -175,9 +175,9 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: Takes no arguments and simply returns the actions for the user that ran the command. """ - command_user: discord.Member = await ctx.user + command_user: discord.Member = ctx.user - user_actions = [action async for action in await Action.objects.afilter( + user_actions: list[Action] = [action async for action in await Action.objects.afilter( discord_id=int(command_user.id), )] From 9698dd2621a083c538b4737eb426c4e37d79c212 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:26:39 +0100 Subject: [PATCH 032/155] add message context command --- cogs/committee_actions_tracking.py | 52 ++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 307da3ec..e188d5cf 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -92,8 +92,7 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, """ Definition and callback response of the "action" command. - The action command adds an action to the specified user. If no user is specified - we assume the action is aimed at the command issuer. + The action command adds an action to the specified user. """ try: action: Action = await Action.objects.acreate( @@ -300,3 +299,52 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 await ctx.respond(all_actions_message) + + @discord.message_command( # type: ignore[no-untyped-call, misc] + name="action-message-author", + description="Creates a new action for the message author using the message content.", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def action_message_author(self, ctx: TeXBotApplicationContext) -> None: + """ + Definition and callback response of the "action-message-author" message command. + + Creates a new action assigned to the message author + using the message content as the description of the action. + """ + actioned_message_text: str = ctx.message.content + actioned_message_user: discord.Member = ctx.message.author + + try: + action: Action = await Action.objects.acreate( + discord_id=int(actioned_message_user.id), + description=actioned_message_text, + ) + except ValidationError as create_action_error: + error_is_already_exits: bool = ( + "__all__" in create_action_error.message_dict + and any ( + "already exists" in error + for error + in create_action_error.message_dict["__all__"] + ) + ) + if not error_is_already_exits: + await self.command_send_error(ctx, message="An unrecoverable error occured.") + logger.critical( + "Error upon creating Action object: %s", + create_action_error, + ) + await self.bot.close() + return + + await self.command_send_error( + ctx, + message="You already have an action with that description!", + ) + return + + await ctx.respond( + content=f"Successfully actioned {actioned_message_user} to: {action.description}", + ) From 7cb9760376af5a266df901299c39bc5aa3a88270 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 6 Jul 2024 00:50:31 +0100 Subject: [PATCH 033/155] add bot check --- cogs/committee_actions_tracking.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index e188d5cf..738736dc 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -313,6 +313,11 @@ async def action_message_author(self, ctx: TeXBotApplicationContext) -> None: Creates a new action assigned to the message author using the message content as the description of the action. """ + if ctx.message.author.bot: + await ctx.respond(content="Actions cannot be assigned to bots you melon!") + logger.debug("User: %s, attempted to action a bot. silly billy.", ctx.user) + return + actioned_message_text: str = ctx.message.content actioned_message_user: discord.Member = ctx.message.author From e1a57a6b1b17e74deda49e599974b3c35fbecfd5 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:26:35 +0100 Subject: [PATCH 034/155] progress --- cogs/committee_actions_tracking.py | 182 +++++++++++++++++++---------- 1 file changed, 123 insertions(+), 59 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 738736dc..063c3806 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -5,6 +5,7 @@ __all__: Sequence[str] = ("CommitteeActionsTrackingCog",) import logging +import random from logging import Logger import discord @@ -67,6 +68,42 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> in all_actions } + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> None: # noqa: E501 + """Create the action object with the given description for the given user.""" + try: + action: Action = await Action.objects.acreate( + discord_id=int(action_user.id), + description=description, + ) + except ValidationError as create_action_error: + error_is_already_exits: bool = ( + "__all__" in create_action_error.message_dict + and any ( + "already exists" in error + for error + in create_action_error.message_dict["__all__"] + ) + ) + if not error_is_already_exits: + await self.command_send_error(ctx, message="An unrecoverable error occured.") + logger.critical( + "Error upon creating Action object: %s", + create_action_error, + ) + await self.bot.close() + return + + await self.command_send_error( + ctx, + message="You already have an action with that description!", + ) + return + + await ctx.respond(content=( + f"Action: {action.description} created for user: {action_user.mention}" + )) + + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action", description="Adds a new action with the specified description", @@ -94,36 +131,90 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, The action command adds an action to the specified user. """ - try: - action: Action = await Action.objects.acreate( - discord_id=int(str_action_member_id), - description=str_action_description, - ) - except ValidationError as create_action_error: - error_is_already_exits: bool = ( - "__all__" in create_action_error.message_dict - and any ( - "already exists" in error - for error - in create_action_error.message_dict["__all__"] - ) + action_user: discord.Member = await self.bot.get_member_from_str_id(str_action_member_id) # noqa: E501 + + if not action_user: + await ctx.respond(content=( + f"The user you supplied, <@{str_action_member_id}> doesn't " + "exist or is not in the sever." + ), ) - if not error_is_already_exits: - await self.command_send_error(ctx, message="An unrecoverable error occured.") - logger.critical( - "Error upon creating Action object: %s", - create_action_error, - ) - await self.bot.close() - return + return - await self.command_send_error( - ctx, - message="You already have an action with that description!", + await self._create_action(ctx, action_user, str_action_description) + + + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="action-random-user", + description="Creates an action object with the specified description and random user.", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="description", + description="The description to be used for the action", + input_type=str, + required=True, + parameter_name="str_action_description", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_description: str) -> None: # noqa: E501 + """ + Definition and callback response of the "action-random-user" command. + + Creates an action object with the specified description + but randomises the committee member. + """ + committee_role: discord.Role = await self.bot.committee_role + committee_members: list[discord.Member] = committee_role.members + + if not committee_members: + await ctx.respond(content=( + "No committee members were found to randomly select from! Command aborted." + )) + return + + action_user: discord.Member = committee_members[random.randint(0, len(committee_members))] # noqa: E501 + + if not action_user: + await ctx.respond( + "Something went wrong and TeX-Bot was unable to randomly select someone.", ) return - await ctx.respond(f"Action: {action.description} created for user: <@{str_action_member_id}>") # noqa: E501 + await self._create_action(ctx, action_user, str_action_description) + + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="action-all-committee", + description="Creates an action with the description for every committee member", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="description", + description="The description to be used for the actions", + input_type=str, + required=True, + parameter_name="str_action_description", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_description: str) -> None: # noqa: E501 + """ + Definition and callback response of the "action-all-committee" command. + + Creates an action object with the specified description for all committee members. + """ + committee_role: discord.Role = await self.bot.committee_role + committee_members: list[discord.Member] = committee_role.members + + if not committee_members: + await ctx.respond(content="No committee members were found! Command aborted.") + return + + committee_member: discord.Member + for committee_member in committee_members: + await self._create_action(ctx, committee_member, str_action_description) + + await ctx.respond(content="Done!") + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-user-actions", @@ -306,50 +397,23 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def action_message_author(self, ctx: TeXBotApplicationContext) -> None: + async def action_message_author(self, ctx: TeXBotApplicationContext, message: discord.Message) -> None: # noqa: E501 """ Definition and callback response of the "action-message-author" message command. Creates a new action assigned to the message author using the message content as the description of the action. """ - if ctx.message.author.bot: + if message.author.bot: await ctx.respond(content="Actions cannot be assigned to bots you melon!") logger.debug("User: %s, attempted to action a bot. silly billy.", ctx.user) return - actioned_message_text: str = ctx.message.content - actioned_message_user: discord.Member = ctx.message.author + actioned_message_text: str = message.content + actioned_message_user: discord.Member | discord.User = message.author - try: - action: Action = await Action.objects.acreate( - discord_id=int(actioned_message_user.id), - description=actioned_message_text, - ) - except ValidationError as create_action_error: - error_is_already_exits: bool = ( - "__all__" in create_action_error.message_dict - and any ( - "already exists" in error - for error - in create_action_error.message_dict["__all__"] - ) - ) - if not error_is_already_exits: - await self.command_send_error(ctx, message="An unrecoverable error occured.") - logger.critical( - "Error upon creating Action object: %s", - create_action_error, - ) - await self.bot.close() - return - - await self.command_send_error( - ctx, - message="You already have an action with that description!", - ) + if isinstance(actioned_message_user, discord.User): + await ctx.respond("Message author is not in the server!") return - await ctx.respond( - content=f"Successfully actioned {actioned_message_user} to: {action.description}", - ) + await self._create_action(ctx, actioned_message_user, actioned_message_text) From 07e1d3821aab656d0b68818f67488bda38157fdd Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:28:31 +0100 Subject: [PATCH 035/155] progress --- cogs/committee_actions_tracking.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 063c3806..b736f759 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -68,7 +68,7 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> in all_actions } - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> None: # noqa: E501 + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> bool: # noqa: E501 """Create the action object with the given description for the given user.""" try: action: Action = await Action.objects.acreate( @@ -91,17 +91,18 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco create_action_error, ) await self.bot.close() - return + return False await self.command_send_error( ctx, message="You already have an action with that description!", ) - return + return False await ctx.respond(content=( f"Action: {action.description} created for user: {action_user.mention}" )) + return True @discord.slash_command( # type: ignore[no-untyped-call, misc] From a86c833f4d984a17b70059fc76412e645e6aacc6 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:32:01 +0100 Subject: [PATCH 036/155] fix message formatting --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index b736f759..9b6e7154 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -388,7 +388,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # type: ignore [has-type] # noqa: E501 - all_actions_message: str = "\n".join([f"Listing all actions by committee member:\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 + all_actions_message: str = "\n".join([f"\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 await ctx.respond(all_actions_message) From ecf7ae6d1d13087ed15f8f97452afb778e19c71b Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:10:39 +0100 Subject: [PATCH 037/155] bs --- cogs/committee_actions_tracking.py | 50 +++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 9b6e7154..21e02db6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -68,7 +68,7 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> in all_actions } - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> bool: # noqa: E501 + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> Action | None: # noqa: E501 """Create the action object with the given description for the given user.""" try: action: Action = await Action.objects.acreate( @@ -91,18 +91,23 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco create_action_error, ) await self.bot.close() - return False + return None await self.command_send_error( ctx, - message="You already have an action with that description!", + message=( + f"User: {action_user} already has an action " + f"with description: {description}!" + ), ) - return False - - await ctx.respond(content=( - f"Action: {action.description} created for user: {action_user.mention}" - )) - return True + logger.debug( + "Action creation for user: %s, failed because an action " + "with description: %s, already exists.", + action_user, + description, + ) + return None + return action @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -357,17 +362,27 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: input_hashed_id = components[0].strip() input_description = components[1].strip() + logger.debug("Hashed input ID: %s", input_hashed_id) + logger.debug("Input description: %s", input_description) + try: - action_to_reassign = await Action.objects.aget(hashed_member_id=input_hashed_id, description=input_description) # noqa: E501 + action_to_reassign = await Action.objects.aget( + discord_member_id=input_hashed_id, # NOTE: this shit broke fr fr + description=input_description, + ) except (MultipleObjectsReturned, ObjectDoesNotExist): await ctx.respond("Provided action was either not unique or did not exist.") logger.warning("Action object: %s could not be matched to a unique action.", str_action_object) # noqa: E501 + logger.debug("Found the action! %s", action_to_reassign) + if input_hashed_id == DiscordMember.hash_discord_id(str_action_member_id): await ctx.respond(f"HEY! Action: {input_description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 return - action_to_reassign.discord_member.hashed_discord_id = DiscordMember.hash_discord_id(str(str_action_member_id)) # type: ignore[has-type] # noqa: E501 + logger.debug("Action specified does not already belong to the user... proceeding.") + + action_to_reassign.discord_member = DiscordMember.hash_discord_id(str(str_action_member_id)) # type: ignore[has-type] # noqa: E501 await ctx.respond("Action successfully reassigned!") @@ -379,12 +394,11 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: @CommandChecks.check_interaction_user_in_main_guild async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: """List all actions.""" - main_guild: discord.Guild = self.bot.main_guild committee_role: discord.Role = await self.bot.committee_role actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 - committee_members: set[discord.Member] = {member for member in main_guild.members if not member.bot and committee_role in member.roles} # noqa: E501 + committee_members: list[discord.Member] = committee_role.members committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # type: ignore [has-type] # noqa: E501 @@ -392,8 +406,9 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: await ctx.respond(all_actions_message) + @discord.message_command( # type: ignore[no-untyped-call, misc] - name="action-message-author", + name="Action Message Author", description="Creates a new action for the message author using the message content.", ) @CommandChecks.check_interaction_user_has_committee_role @@ -417,4 +432,9 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di await ctx.respond("Message author is not in the server!") return - await self._create_action(ctx, actioned_message_user, actioned_message_text) + if (await self._create_action(ctx, actioned_message_user, actioned_message_text)): + await ctx.respond(content=( + f"Action: {actioned_message_text} created " + f"for user: {actioned_message_user.mention}" + )) + return From 960684f76f22b4c191707b04f42965c0125318d0 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:38:00 +0100 Subject: [PATCH 038/155] add success message back --- cogs/committee_actions_tracking.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 21e02db6..f6275967 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -107,6 +107,10 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco description, ) return None + await ctx.respond(content=( + f"Action: {action.description} created " + f"for user: {action_user.mention}" + )) return action @@ -432,9 +436,4 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di await ctx.respond("Message author is not in the server!") return - if (await self._create_action(ctx, actioned_message_user, actioned_message_text)): - await ctx.respond(content=( - f"Action: {actioned_message_text} created " - f"for user: {actioned_message_user.mention}" - )) - return + await self._create_action(ctx, actioned_message_user, actioned_message_text) From 614f516f8a8d72bde26a050994e500c6daedf733 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:39:31 +0100 Subject: [PATCH 039/155] add TODO --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f6275967..ab334a37 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -66,7 +66,7 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> discord.OptionChoice(name=str(action.description), value=str(action)) for action in all_actions - } + } # TODO: try and add username to string in autocomplete so it's easy to see who the action belongs to async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> Action | None: # noqa: E501 """Create the action object with the given description for the given user.""" From a5174b0aedd95d99878ffd9ad177c6409b13c861 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:42:27 +0100 Subject: [PATCH 040/155] implement delete all command --- cogs/delete_all.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cogs/delete_all.py b/cogs/delete_all.py index aafb9ecc..4bc6e351 100644 --- a/cogs/delete_all.py +++ b/cogs/delete_all.py @@ -7,7 +7,7 @@ import discord -from db.core.models import DiscordReminder, GroupMadeMember +from db.core.models import Action, DiscordReminder, GroupMadeMember from db.core.models.utils import AsyncBaseModel from utils import CommandChecks, TeXBotApplicationContext, TeXBotBaseCog @@ -66,3 +66,18 @@ async def delete_all_group_made_members(self, ctx: TeXBotApplicationContext) -> to delete all `GroupMadeMember` instance objects stored in the database. """ await self._delete_all(ctx, delete_model=GroupMadeMember) + + @delete_all.command( + name="actions", + description="Deletes all the Actions from the backend database.", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def delete_all_actions(self, ctx: TeXBotApplicationContext) -> None: + """ + Definition & callback respoonse of the "delete-all-actions" command. + + The "delete-all-actions" command uses the _delete_all() function + to delete all `Action` instance objects stored in the database. + """ + await self._delete_all(ctx, delete_model=Action) From 2a3bb5b3b53587cdb9e909078585504406343f8c Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 10 Jul 2024 01:00:57 +0100 Subject: [PATCH 041/155] how does this keep getting worse and worse --- cogs/committee_actions_tracking.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ab334a37..791a8920 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -293,7 +293,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: @discord.slash_command( # type: ignore[no-untyped-call, misc] name="complete-action", - description="Deletes the specified action as being completed.", + description="Marks the specified action as being completed.", ) @discord.option( # type: ignore[no-untyped-call, misc] name="action", @@ -305,21 +305,30 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: str) -> None: # noqa: E501 + async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object: str) -> None: # noqa: E501 """ Definition and callback of the complete action command. Marks the specified action as complete by deleting it. """ + action_user: discord.Member = ctx.user + + if ":" not in str_action_object: + await ctx.respond( + content="Action provided was not valid, please use the auto complete!", + ) + logger.debug("%s tried to mark an invalid Action as completed.", action_user) + return + components = str_action_object.split(":") input_description = components[1].strip() try: - # NOTE: we only compare the description here because it is not possible, due to the hashing, to also check the discord user. action: Action = await Action.objects.select_related().aget( - description=input_description, + discord_member_id=action_user.id, + description=input_description, # TODO: implement user check as well cos this is fucked ) - except (MultipleObjectsReturned, ObjectDoesNotExist): + except (MultipleObjectsReturned, ObjectDoesNotExist) as get_action_failure: await ctx.respond( ":warning: Provided action was either not unique or did not exist.", ) @@ -327,10 +336,7 @@ async def complete_action(self, ctx:TeXBotApplicationContext, str_action_object: "Action object: %s could not be matched to a unique action.", str_action_object, ) - - if not action: - logger.debug("Something went wrong and the action could not be retrieved.") - ctx.respond("Something went wrong and the action could not be retrieved.") + logger.debug(get_action_failure) return await action.adelete() From 52f8f3085bf7caf098c5829409b47b479dd89fba Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:37:38 +0100 Subject: [PATCH 042/155] kinda works lmao --- cogs/committee_actions_tracking.py | 94 ++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 23 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 791a8920..c77d9fdc 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -7,6 +7,7 @@ import logging import random from logging import Logger +from typing import Final import discord from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError @@ -68,6 +69,53 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> in all_actions } # TODO: try and add username to string in autocomplete so it's easy to see who the action belongs to + @staticmethod + async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + """ + Autocomplete callable that provides a set of actions that belong to the user. + + Returns the set of actions that belong to the user using the command, + giving the user a list of action descriptions to choose from. + """ + # NOTE: this entire method is fucking insane because django is shit and makes me want to kill myself + if not ctx.interaction.user: + logger.debug("User actions autocomplete did not have an interaction user!!") + return set() + + interaction_user: discord.Member = await ctx.bot.get_member_from_str_id( + str(ctx.interaction.user.id), + ) + + all_actions = [action async for action in Action.objects.select_related().all()] + + hashed_interaction_user_id: str = DiscordMember.hash_discord_id(interaction_user.id) + interaction_user_internal_id: str + + action: Action + for action in all_actions: + action_discord_member: DiscordMember = action.discord_member # type: ignore[has-type] + if str(action_discord_member) == hashed_interaction_user_id: + interaction_user_internal_id = str(action_discord_member.id) + break + + if not interaction_user_internal_id: + logger.debug("fuckin cry or something idk bro") + return set() + + user_actions: list[Action] = [action async for action in Action.objects.select_related().filter( # noqa: E501 + discord_member_id=interaction_user_internal_id, + )] + + if not user_actions: + logger.debug("No actions were found!!") + return set() + + return { + discord.OptionChoice(name=action.description, value=(str(action))) + for action + in user_actions + } + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> Action | None: # noqa: E501 """Create the action object with the given description for the given user.""" try: @@ -185,12 +233,6 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_des action_user: discord.Member = committee_members[random.randint(0, len(committee_members))] # noqa: E501 - if not action_user: - await ctx.respond( - "Something went wrong and TeX-Bot was unable to randomly select someone.", - ) - return - await self._create_action(ctx, action_user, str_action_description) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -248,10 +290,6 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe """ action_member: discord.Member = await self.bot.get_member_from_str_id(str_action_member_id) # noqa: E501 - if not action_member: - await ctx.respond("The user you supplied doesn't exist or isn't in the server.") - return - user_actions = [action async for action in await Action.objects.afilter( discord_id=int(str_action_member_id), )] @@ -299,7 +337,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: name="action", description="The action to mark as completed.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_all_actions), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_user_actions), # type: ignore[arg-type] required=True, parameter_name="str_action_object", ) @@ -323,22 +361,32 @@ async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object components = str_action_object.split(":") input_description = components[1].strip() - try: - action: Action = await Action.objects.select_related().aget( - discord_member_id=action_user.id, - description=input_description, # TODO: implement user check as well cos this is fucked - ) - except (MultipleObjectsReturned, ObjectDoesNotExist) as get_action_failure: - await ctx.respond( - ":warning: Provided action was either not unique or did not exist.", + actions: list[Action] = [action async for action in await Action.objects.afilter( + discord_id=int(action_user.id), + description=input_description, + )] + + if not actions: + NO_ACTIONS_FOUND_MESSAGE: Final[str] = ( + f"No actions found for user: {action_user}, " + f"with description: {input_description}" ) - logger.warning( - "Action object: %s could not be matched to a unique action.", - str_action_object, + await ctx.respond(NO_ACTIONS_FOUND_MESSAGE) + logger.debug(NO_ACTIONS_FOUND_MESSAGE) + return + + if len(actions) > 1: + MULTIPLE_ACTIONS_FOUND: Final[str] = ( + f"Found {len(actions)} for user: {action_user} " + f"with description: {input_description}, this shouldn't be possible!!" ) - logger.debug(get_action_failure) + await ctx.respond(MULTIPLE_ACTIONS_FOUND) + logger.error(MULTIPLE_ACTIONS_FOUND) + logger.debug(actions) return + action: Action = actions[0] + await action.adelete() await ctx.respond(f"Action: {action.description} deleted!") logger.debug("Action: %s has been deleted.", action.description) From 5f99db4a0f1a10cbcd21f0ec47da71709fc5b86e Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:54:40 +0100 Subject: [PATCH 043/155] minor improvement --- cogs/committee_actions_tracking.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index c77d9fdc..eda63751 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -86,16 +86,14 @@ async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) - str(ctx.interaction.user.id), ) - all_actions = [action async for action in Action.objects.select_related().all()] + all_discord_members = [discord_member async for discord_member in DiscordMember.objects.all()] hashed_interaction_user_id: str = DiscordMember.hash_discord_id(interaction_user.id) interaction_user_internal_id: str - action: Action - for action in all_actions: - action_discord_member: DiscordMember = action.discord_member # type: ignore[has-type] - if str(action_discord_member) == hashed_interaction_user_id: - interaction_user_internal_id = str(action_discord_member.id) + for discord_member in all_discord_members: + if str(discord_member) == hashed_interaction_user_id: + interaction_user_internal_id = str(discord_member.id) break if not interaction_user_internal_id: From 15064012ce6a7949f6d29664183cb4ec41648695 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:55:22 +0100 Subject: [PATCH 044/155] line length --- cogs/committee_actions_tracking.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index eda63751..6e77f32d 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -86,7 +86,9 @@ async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) - str(ctx.interaction.user.id), ) - all_discord_members = [discord_member async for discord_member in DiscordMember.objects.all()] + all_discord_members = [ + discord_member async for discord_member in DiscordMember.objects.all() + ] hashed_interaction_user_id: str = DiscordMember.hash_discord_id(interaction_user.id) interaction_user_internal_id: str From c1197f23f7bf897b4decd76da21db0536a7d5af3 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:55:54 +0100 Subject: [PATCH 045/155] more line length --- cogs/committee_actions_tracking.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 6e77f32d..8a7b2890 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -102,9 +102,11 @@ async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) - logger.debug("fuckin cry or something idk bro") return set() - user_actions: list[Action] = [action async for action in Action.objects.select_related().filter( # noqa: E501 - discord_member_id=interaction_user_internal_id, - )] + user_actions: list[Action] = [ + action async for action in Action.objects.select_related().filter( + discord_member_id=interaction_user_internal_id, + ) + ] if not user_actions: logger.debug("No actions were found!!") From 92110dec83828f5ab486ec109b62e418c6df3fdf Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 02:38:17 +0100 Subject: [PATCH 046/155] fix list all actions --- cogs/committee_actions_tracking.py | 63 +++++++++++++++++++----------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8a7b2890..0f8e79c2 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -191,15 +191,9 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, The action command adds an action to the specified user. """ - action_user: discord.Member = await self.bot.get_member_from_str_id(str_action_member_id) # noqa: E501 - - if not action_user: - await ctx.respond(content=( - f"The user you supplied, <@{str_action_member_id}> doesn't " - "exist or is not in the sever." - ), - ) - return + action_user: discord.Member = await self.bot.get_member_from_str_id( + str_action_member_id, + ) await self._create_action(ctx, action_user, str_action_description) @@ -421,28 +415,37 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: components = str_action_object.split(":") input_hashed_id = components[0].strip() input_description = components[1].strip() + new_user_hash: str = DiscordMember.hash_discord_id(str_action_member_id) + + all_discord_members: list[DiscordMember] = [ + discord_member async for discord_member in DiscordMember.objects.all() + ] + + input_user_internal_id: str - logger.debug("Hashed input ID: %s", input_hashed_id) - logger.debug("Input description: %s", input_description) + discord_member: DiscordMember + for discord_member in all_discord_members: + if str(discord_member) == input_hashed_id: + input_user_internal_id = str(discord_member.id) + break try: - action_to_reassign = await Action.objects.aget( - discord_member_id=input_hashed_id, # NOTE: this shit broke fr fr + action_to_reassign = await Action.objects.select_related().aget( + discord_member_id=input_user_internal_id, description=input_description, ) except (MultipleObjectsReturned, ObjectDoesNotExist): await ctx.respond("Provided action was either not unique or did not exist.") - logger.warning("Action object: %s could not be matched to a unique action.", str_action_object) # noqa: E501 - - logger.debug("Found the action! %s", action_to_reassign) + logger.warning( + "Action object: %s could not be matched to a unique action.", + str_action_object, + ) - if input_hashed_id == DiscordMember.hash_discord_id(str_action_member_id): + if str(action_to_reassign.discord_member) == new_user_hash: # type: ignore[has-type] await ctx.respond(f"HEY! Action: {input_description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 return - logger.debug("Action specified does not already belong to the user... proceeding.") - - action_to_reassign.discord_member = DiscordMember.hash_discord_id(str(str_action_member_id)) # type: ignore[has-type] # noqa: E501 + action_to_reassign.discord_member = DiscordMember(str_action_member_id) # type: ignore[has-type] await ctx.respond("Action successfully reassigned!") @@ -460,9 +463,25 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: committee_members: list[discord.Member] = committee_role.members - committee_actions: dict[discord.Member, list[Action]] = {committee: [action for action in actions if action.discord_member.hashed_discord_id == DiscordMember.hash_discord_id(committee.id)] for committee in committee_members} # type: ignore [has-type] # noqa: E501 + committee_actions: dict[discord.Member, list[Action]] = { + committee: [ + action for action in actions + if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] + ] for committee in committee_members + } + + filtered_committee_actions = {committee: actions for committee, actions in committee_actions.items() if actions} - all_actions_message: str = "\n".join([f"\n{committee.mention}, Actions:\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in committee_actions.items()]) # noqa: E501 + if not filtered_committee_actions: + await ctx.respond("No one has any actions!") + return + + all_actions_message: str = "\n".join([ + f"\n{committee.mention}, Actions:" + f"\n{', \n'.join(str(action.description) for action in actions)}" + for committee, actions in filtered_committee_actions.items() + ], + ) await ctx.respond(all_actions_message) From 3b2bc01f2f737c4b0de4d589aa51146d891a42d6 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 02:40:38 +0100 Subject: [PATCH 047/155] update --- cogs/committee_actions_tracking.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 0f8e79c2..5fe4f6fb 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -456,7 +456,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: - """List all actions.""" + """List all actions.""" # NOTE: this doesn't actually list *all* actions as it is possible for non-committee to be actioned. committee_role: discord.Role = await self.bot.committee_role actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 @@ -470,7 +470,9 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: ] for committee in committee_members } - filtered_committee_actions = {committee: actions for committee, actions in committee_actions.items() if actions} + filtered_committee_actions = { + committee: actions for committee, actions in committee_actions.items() if actions + } if not filtered_committee_actions: await ctx.respond("No one has any actions!") From 9bca8d1ec6a7728fb813719591c90ea2f5d249ea Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 02:43:36 +0100 Subject: [PATCH 048/155] add check to reassignment method --- cogs/committee_actions_tracking.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 5fe4f6fb..f2785f35 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -412,6 +412,13 @@ async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object @CommandChecks.check_interaction_user_in_main_guild async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: str, str_action_member_id: str) -> None: # noqa: E501 """Reassign the specified action to the specified user.""" + if ":" not in str_action_object: + await ctx.respond( + content="Action provided was not valid, please use the auto complete!", + ) + logger.debug("%s tried to reassign an Action that didn't exist.", ctx.user) + return + components = str_action_object.split(":") input_hashed_id = components[0].strip() input_description = components[1].strip() From f3ff74038614fe7d7373db388b178f3b1e5b4802 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 02:45:05 +0100 Subject: [PATCH 049/155] add check to reassignment method --- cogs/committee_actions_tracking.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f2785f35..24c803d7 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -284,7 +284,9 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe Takes in a user and lists out their current actions. """ - action_member: discord.Member = await self.bot.get_member_from_str_id(str_action_member_id) # noqa: E501 + action_member: discord.Member = await self.bot.get_member_from_str_id( + str_action_member_id, + ) user_actions = [action async for action in await Action.objects.afilter( discord_id=int(str_action_member_id), From 439609d0059c95852a898f78438ec97bf8d2f2dc Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 03:00:13 +0100 Subject: [PATCH 050/155] fix reassign to just create a new action instead --- cogs/committee_actions_tracking.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 24c803d7..8dd4bff6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -424,7 +424,10 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: components = str_action_object.split(":") input_hashed_id = components[0].strip() input_description = components[1].strip() - new_user_hash: str = DiscordMember.hash_discord_id(str_action_member_id) + new_user_to_action: discord.Member = await self.bot.get_member_from_str_id( + str_action_member_id, + ) + new_user_to_action_hash: str = DiscordMember.hash_discord_id(new_user_to_action.id) all_discord_members: list[DiscordMember] = [ discord_member async for discord_member in DiscordMember.objects.all() @@ -450,13 +453,30 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: str_action_object, ) - if str(action_to_reassign.discord_member) == new_user_hash: # type: ignore[has-type] - await ctx.respond(f"HEY! Action: {input_description} is already assigned to user: <@{str_action_member_id}>\nNo action has been taken.") # noqa: E501 + if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] + await ctx.respond( + f"HEY! Action: {action_to_reassign.description} is already assigned " + f"to user: {new_user_to_action.mention}\nNo action has been taken.", + ) + return + + reassigned_action: Action | None = await self._create_action( + ctx, + new_user_to_action, + action_to_reassign.description, + ) + + if not reassigned_action: + await ctx.respond("Something went wrong and the action couldn't be reassigned!") + logger.debug( + "The action: %s could not be re-assigned to user: %s", + action_to_reassign, + new_user_to_action, + ) return - action_to_reassign.discord_member = DiscordMember(str_action_member_id) # type: ignore[has-type] + await action_to_reassign.adelete() - await ctx.respond("Action successfully reassigned!") @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", From 9c611d6f60350bcb88bf32ff650cdc6893266034 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 03:01:58 +0100 Subject: [PATCH 051/155] fix --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8dd4bff6..9841b97b 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -67,7 +67,7 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> discord.OptionChoice(name=str(action.description), value=str(action)) for action in all_actions - } # TODO: try and add username to string in autocomplete so it's easy to see who the action belongs to + } @staticmethod async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 From 66f164adda0e1c701f6283d5978d0b2bf699876d Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:01:42 +0100 Subject: [PATCH 052/155] implement optional ping --- cogs/committee_actions_tracking.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 9841b97b..bd4dbbbb 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -276,9 +276,16 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_d required=True, parameter_name="str_action_member_id", ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="ping", + description="Triggers whether the message pings users or not.", + input_type=bool, + default=False, + required=False, + ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_member_id: str) -> None: # noqa: E501 + async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_member_id: str, *, ping: bool) -> None: # noqa: E501 """ Definition and callback of the list user actions command. @@ -293,11 +300,17 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe )] if not user_actions: - await ctx.respond(f"User: {action_member.mention} has no actions.") + await ctx.respond( + f"User: {action_member.mention if ping else action_member} has no actions.", + ) logger.debug(user_actions) return - await ctx.respond(f"Found {len(user_actions)} actions for user {action_member.mention}:\n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 + await ctx.respond( + f"Found {len(user_actions)} actions for user " + f"{action_member.mention if ping else action_member}:" + f"\n{"\n".join(str(action.description) for action in user_actions)}", + ) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -482,9 +495,16 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: name="list-all-actions", description="List all current actions.", ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="ping", + description="Triggers whether the message pings users or not.", + input_type=bool, + default=False, + required=False, + ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: + async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> None: """List all actions.""" # NOTE: this doesn't actually list *all* actions as it is possible for non-committee to be actioned. committee_role: discord.Role = await self.bot.committee_role @@ -508,7 +528,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext) -> None: return all_actions_message: str = "\n".join([ - f"\n{committee.mention}, Actions:" + f"\n{committee.mention if ping else committee}, Actions:" f"\n{', \n'.join(str(action.description) for action in actions)}" for committee, actions in filtered_committee_actions.items() ], From 3644b2b70d74b2d8b072c638707a03cacd246cd5 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:08:16 +0100 Subject: [PATCH 053/155] line lengthsS --- cogs/committee_actions_tracking.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index bd4dbbbb..d7e7c591 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -57,7 +57,9 @@ async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> Each action is identified by its description. """ - all_actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 + all_actions: list[Action] = [ + action async for action in Action.objects.select_related().all() + ] if not all_actions: logger.debug("User tried to autocomplete for Actions but no actions were found!") @@ -227,7 +229,9 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_des )) return - action_user: discord.Member = committee_members[random.randint(0, len(committee_members))] # noqa: E501 + action_user: discord.Member = committee_members[ + random.randint(0, len(committee_members)) + ] await self._create_action(ctx, action_user, str_action_description) @@ -337,7 +341,10 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: ) return - await ctx.respond(content=f"You have {len(user_actions)} actions: \n{"\n".join(str(action.description) for action in user_actions)}") # noqa: E501 + await ctx.respond(content=( + f"You have {len(user_actions)} actions: " + f"\n{"\n".join(str(action.description) for action in user_actions)}"), + ) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -508,7 +515,9 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> """List all actions.""" # NOTE: this doesn't actually list *all* actions as it is possible for non-committee to be actioned. committee_role: discord.Role = await self.bot.committee_role - actions: list[Action] = [action async for action in Action.objects.select_related().all()] # noqa: E501 + actions: list[Action] = [ + action async for action in Action.objects.select_related().all() + ] committee_members: list[discord.Member] = committee_role.members From 02c8f0bed169420e21e07d1da9fad1bd9ca975a2 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 16:07:45 +0100 Subject: [PATCH 054/155] test --- cogs/committee_actions_tracking.py | 102 ++++++++++++++++++----------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index d7e7c591..07097dba 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -120,7 +120,7 @@ async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) - in user_actions } - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> Action | None: # noqa: E501 + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> Action | str: # noqa: E501 """Create the action object with the given description for the given user.""" try: action: Action = await Action.objects.acreate( @@ -143,26 +143,29 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco create_action_error, ) await self.bot.close() - return None + return "" # NOTE: this should never be called due to the close() call above, but is here just to be absolutely certain nothing else will be executed. - await self.command_send_error( - ctx, - message=( + if not silent: + DUPLICATE_ACTION_MESSAGE: Final[str] = ( f"User: {action_user} already has an action " f"with description: {description}!" - ), - ) + ) + await self.command_send_error( + ctx, + message=(DUPLICATE_ACTION_MESSAGE), + ) logger.debug( "Action creation for user: %s, failed because an action " "with description: %s, already exists.", action_user, description, ) - return None - await ctx.respond(content=( - f"Action: {action.description} created " - f"for user: {action_user.mention}" - )) + return DUPLICATE_ACTION_MESSAGE + if not silent: + await ctx.respond(content=( + f"Action: {action.description} created " + f"for user: {action_user.mention}" + )) return action @@ -197,7 +200,7 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, str_action_member_id, ) - await self._create_action(ctx, action_user, str_action_description) + await self._create_action(ctx, action_user, str_action_description, silent=False) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -233,7 +236,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_des random.randint(0, len(committee_members)) ] - await self._create_action(ctx, action_user, str_action_description) + await self._create_action(ctx, action_user, str_action_description, silent=False) @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", @@ -261,11 +264,33 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_d await ctx.respond(content="No committee members were found! Command aborted.") return + success_members: list[discord.Member] = [] + failed_members: str = "" + committee_member: discord.Member for committee_member in committee_members: - await self._create_action(ctx, committee_member, str_action_description) + action_or_error_message: Action | str = await self._create_action( + ctx, + committee_member, + str_action_description, + silent=True, + ) + if isinstance(action_or_error_message, Action): + success_members.append(committee_member) + else: + failed_members += action_or_error_message + "\n" + + response_message: str = ( + f"Successfully created action: {str_action_description} for users: \n" + f"".join(f"{success_member.mention}" for success_member in success_members) + ) + - await ctx.respond(content="Done!") + + if len(failed_members) > 1: + response_message += "The following errors were also raised: \n" + failed_members + + await ctx.respond(content=response_message) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -304,17 +329,17 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe )] if not user_actions: - await ctx.respond( + await ctx.respond(content=( f"User: {action_member.mention if ping else action_member} has no actions.", - ) + )) logger.debug(user_actions) return - await ctx.respond( + await ctx.respond(content=( f"Found {len(user_actions)} actions for user " f"{action_member.mention if ping else action_member}:" f"\n{"\n".join(str(action.description) for action in user_actions)}", - ) + )) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -389,7 +414,7 @@ async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object f"No actions found for user: {action_user}, " f"with description: {input_description}" ) - await ctx.respond(NO_ACTIONS_FOUND_MESSAGE) + await ctx.respond(content=NO_ACTIONS_FOUND_MESSAGE) logger.debug(NO_ACTIONS_FOUND_MESSAGE) return @@ -398,7 +423,7 @@ async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object f"Found {len(actions)} for user: {action_user} " f"with description: {input_description}, this shouldn't be possible!!" ) - await ctx.respond(MULTIPLE_ACTIONS_FOUND) + await ctx.respond(content=MULTIPLE_ACTIONS_FOUND) logger.error(MULTIPLE_ACTIONS_FOUND) logger.debug(actions) return @@ -406,7 +431,7 @@ async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object action: Action = actions[0] await action.adelete() - await ctx.respond(f"Action: {action.description} deleted!") + await ctx.respond(content=f"Action: {action.description} deleted!") logger.debug("Action: %s has been deleted.", action.description) @@ -467,34 +492,26 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: description=input_description, ) except (MultipleObjectsReturned, ObjectDoesNotExist): - await ctx.respond("Provided action was either not unique or did not exist.") + await ctx.respond(content="Provided action was either not unique or did not exist.") logger.warning( "Action object: %s could not be matched to a unique action.", str_action_object, ) if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] - await ctx.respond( + await ctx.respond(content=( f"HEY! Action: {action_to_reassign.description} is already assigned " f"to user: {new_user_to_action.mention}\nNo action has been taken.", - ) + )) return - reassigned_action: Action | None = await self._create_action( + await self._create_action( ctx, new_user_to_action, action_to_reassign.description, + silent=False, ) - if not reassigned_action: - await ctx.respond("Something went wrong and the action couldn't be reassigned!") - logger.debug( - "The action: %s could not be re-assigned to user: %s", - action_to_reassign, - new_user_to_action, - ) - return - await action_to_reassign.adelete() @@ -533,7 +550,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> } if not filtered_committee_actions: - await ctx.respond("No one has any actions!") + await ctx.respond(content="No one has any actions!") return all_actions_message: str = "\n".join([ @@ -543,7 +560,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> ], ) - await ctx.respond(all_actions_message) + await ctx.respond(content=all_actions_message) @discord.message_command( # type: ignore[no-untyped-call, misc] @@ -568,7 +585,12 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di actioned_message_user: discord.Member | discord.User = message.author if isinstance(actioned_message_user, discord.User): - await ctx.respond("Message author is not in the server!") + await ctx.respond(content="Message author is not in the server!") return - await self._create_action(ctx, actioned_message_user, actioned_message_text) + await self._create_action( + ctx, + actioned_message_user, + actioned_message_text, + silent=False, + ) From 27405d21007ab9ec6c931cf585e61e6be4fdcf95 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 11 Jul 2024 16:26:27 +0100 Subject: [PATCH 055/155] fix it all --- cogs/committee_actions_tracking.py | 37 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 07097dba..379672c8 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -145,11 +145,11 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco await self.bot.close() return "" # NOTE: this should never be called due to the close() call above, but is here just to be absolutely certain nothing else will be executed. + DUPLICATE_ACTION_MESSAGE: Final[str] = ( + f"User: {action_user} already has an action " + f"with description: {description}!" + ) if not silent: - DUPLICATE_ACTION_MESSAGE: Final[str] = ( - f"User: {action_user} already has an action " - f"with description: {description}!" - ) await self.command_send_error( ctx, message=(DUPLICATE_ACTION_MESSAGE), @@ -280,15 +280,28 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_d else: failed_members += action_or_error_message + "\n" - response_message: str = ( - f"Successfully created action: {str_action_description} for users: \n" - f"".join(f"{success_member.mention}" for success_member in success_members) - ) + response_message: str = "" + if success_members: + response_message += ( + f"Successfully created action: {str_action_description} for users: \n" + ) + response_message += ( + "\n".join(f"{success_member.mention}" for success_member in success_members) + ) + + if len(failed_members) > 1: + response_message += ( + "\n\nThe following errors were also raised: \n" + failed_members + ) + else: + response_message += ( + "Could not create any actions! See errors below: \n" + ) + + response_message += failed_members - if len(failed_members) > 1: - response_message += "The following errors were also raised: \n" + failed_members await ctx.respond(content=response_message) @@ -492,7 +505,9 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: description=input_description, ) except (MultipleObjectsReturned, ObjectDoesNotExist): - await ctx.respond(content="Provided action was either not unique or did not exist.") + await ctx.respond( + content="Provided action was either not unique or did not exist.", + ) logger.warning( "Action object: %s could not be matched to a unique action.", str_action_object, From fc069a3eaf1957b464a7554cc2c21150a0a72670 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 13 Jul 2024 13:15:00 +0100 Subject: [PATCH 056/155] make list-my-actions ephemeral --- cogs/committee_actions_tracking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 379672c8..eed5ae86 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -373,7 +373,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: )] if not user_actions: - await ctx.respond(content=":warning: You do not have any actions!") + await ctx.respond(content=":warning: You do not have any actions!", ephemeral=True) logger.debug( "User: %s ran the list-my-actions slash-command but no actions were found!", ) @@ -382,6 +382,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: await ctx.respond(content=( f"You have {len(user_actions)} actions: " f"\n{"\n".join(str(action.description) for action in user_actions)}"), + ephemeral=True, ) From ef8ecfafa7ee1393f9775cd9b7798c3d4c8f88b5 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 13:43:15 +0100 Subject: [PATCH 057/155] final logger --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index eed5ae86..a9768f53 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -21,7 +21,7 @@ TeXBotBaseCog, ) -logger: Logger = logging.getLogger("TeX-Bot") +logger: Final[Logger] = logging.getLogger("TeX-Bot") class CommitteeActionsTrackingCog(TeXBotBaseCog): From 561598249e3fae041e8812c5856427da2a5d98c4 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 13:43:49 +0100 Subject: [PATCH 058/155] double new line --- cogs/committee_actions_tracking.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index a9768f53..e7c7b20b 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -4,6 +4,7 @@ __all__: Sequence[str] = ("CommitteeActionsTrackingCog",) + import logging import random from logging import Logger From 849b401bfe78bdf462a11e8003c96dab3c6ce72a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 13:49:11 +0100 Subject: [PATCH 059/155] refactor command argument order --- cogs/committee_actions_tracking.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index e7c7b20b..a7fa51bc 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -29,8 +29,8 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): """Cog class that defines the committee-actions tracking functionality.""" committee_actions: discord.SlashCommandGroup = discord.SlashCommandGroup( - "committeeactions", - "Add, list & remove tracked committee-actions.", + name="committee-actions", + description="Add, list, remove and reassign tracked committee-actions.", ) @staticmethod @@ -174,13 +174,6 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco name="action", description="Adds a new action with the specified description", ) - @discord.option( # type: ignore[no-untyped-call, misc] - name="description", - description="The description of the action to assign.", - input_type=str, - required=True, - parameter_name="str_action_description", - ) @discord.option( # type: ignore[no-untyped-call, misc] name="user", description="The user to action, if no user is specified, default to self", @@ -189,6 +182,13 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco required=True, parameter_name="str_action_member_id", ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="description", + description="The description of the action to assign.", + input_type=str, + required=True, + parameter_name="str_action_description", + ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, str_action_description: str) -> None: # noqa: E501 From aad3a1fb23d21d50042ce6e5371b22955cf47e34 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 13:55:06 +0100 Subject: [PATCH 060/155] docs --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index a7fa51bc..132c8fd4 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -176,7 +176,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ) @discord.option( # type: ignore[no-untyped-call, misc] name="user", - description="The user to action, if no user is specified, default to self", + description="The user to assign the action to", input_type=str, autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=True, From cd42626cc85caa7c7a91bc05c47a4eddd83dd595 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 13:58:32 +0100 Subject: [PATCH 061/155] Update db to make action description required --- db/core/migrations/0010_action_action_unique_user_action.py | 4 ++-- db/core/models/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/db/core/migrations/0010_action_action_unique_user_action.py b/db/core/migrations/0010_action_action_unique_user_action.py index d3ab16ff..a5478b73 100644 --- a/db/core/migrations/0010_action_action_unique_user_action.py +++ b/db/core/migrations/0010_action_action_unique_user_action.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.6 on 2024-06-19 21:50 +# Generated by Django 5.0.7 on 2024-07-20 12:57 import db.core.models.managers import django.db.models.deletion @@ -16,7 +16,7 @@ class Migration(migrations.Migration): name='Action', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(blank=True, max_length=1500, verbose_name='Description of the action')), + ('description', models.TextField(max_length=1500, verbose_name='Description of the action')), ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action', to='core.discordmember', verbose_name='Discord Member')), ], options={ diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 5c6a3217..96ebf87e 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -44,7 +44,7 @@ class Action(BaseDiscordMemberWrapper): "Description of the action", max_length=1500, null=False, - blank=True, + blank=False, ) class Meta: verbose_name = "An Action for a Discord Member" From c32590efd6920891a92123ae747eb06bd19401af Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 14:06:06 +0100 Subject: [PATCH 062/155] refactor method argument names --- cogs/committee_actions_tracking.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 132c8fd4..ff1f2d02 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -187,11 +187,11 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco description="The description of the action to assign.", input_type=str, required=True, - parameter_name="str_action_description", + parameter_name="action_description", ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, str_action_description: str) -> None: # noqa: E501 + async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, action_description: str) -> None: # noqa: E501 """ Definition and callback response of the "action" command. @@ -201,7 +201,7 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, str_action_member_id, ) - await self._create_action(ctx, action_user, str_action_description, silent=False) + await self._create_action(ctx, action_user, action_description, silent=False) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -213,11 +213,11 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, description="The description to be used for the action", input_type=str, required=True, - parameter_name="str_action_description", + parameter_name="action_description", ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_description: str) -> None: # noqa: E501 + async def action_random_user(self, ctx: TeXBotApplicationContext, action_description: str) -> None: # noqa: E501 """ Definition and callback response of the "action-random-user" command. @@ -237,7 +237,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_des random.randint(0, len(committee_members)) ] - await self._create_action(ctx, action_user, str_action_description, silent=False) + await self._create_action(ctx, action_user, action_description, silent=False) @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", @@ -248,11 +248,11 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, str_action_des description="The description to be used for the actions", input_type=str, required=True, - parameter_name="str_action_description", + parameter_name="action_description", ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_description: str) -> None: # noqa: E501 + async def action_all_committee(self, ctx: TeXBotApplicationContext, action_description: str) -> None: # noqa: E501 """ Definition and callback response of the "action-all-committee" command. @@ -273,7 +273,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_d action_or_error_message: Action | str = await self._create_action( ctx, committee_member, - str_action_description, + action_description, silent=True, ) if isinstance(action_or_error_message, Action): @@ -285,7 +285,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, str_action_d if success_members: response_message += ( - f"Successfully created action: {str_action_description} for users: \n" + f"Successfully created action: {action_description} for users: \n" ) response_message += ( From ed2bd7ee2db6d489acf4ab9fd04d75b1e32ccadd Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 14:12:55 +0100 Subject: [PATCH 063/155] remove unneeded method --- db/core/models/__init__.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 96ebf87e..63c82026 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -71,22 +71,6 @@ def __str__(self) -> str: return construct_str - def get_action_description(self) -> str: - """ - Return the formatted description stored by this action. - - Adds a mention to the Discord member that was assigned the action, - if passed in from the calling context. - """ - constructed_message: str = "This is your action" - - constructed_message += "!" - - if self.description: - constructed_message = f"**{constructed_message}**\n{self.description}" - - return constructed_message - class IntroductionReminderOptOutMember(BaseDiscordMemberWrapper): """ From 829418d98da248bb8c7d41e214c7008bb64a6a68 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 14:25:02 +0100 Subject: [PATCH 064/155] fixes --- cogs/committee_actions_tracking.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ff1f2d02..737954da 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -52,7 +52,7 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> } @staticmethod - async def action_autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 + async def autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """ Autocomplete callable that provides a set of selectable committee tracked-actions. @@ -458,7 +458,7 @@ async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object name="action", description="The action to reassign.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_all_actions), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_all_actions), # type: ignore[arg-type] required=True, parameter_name="str_action_object", ) @@ -507,13 +507,11 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: description=input_description, ) except (MultipleObjectsReturned, ObjectDoesNotExist): - await ctx.respond( - content="Provided action was either not unique or did not exist.", - ) - logger.warning( - "Action object: %s could not be matched to a unique action.", - str_action_object, + await self.command_send_error( + ctx, + message="Action provided was either not unique or could not be found.", ) + return if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] await ctx.respond(content=( From 87c824d8748483301eae0d4205986709bcd94201 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 14:28:28 +0100 Subject: [PATCH 065/155] db updates --- db/core/migrations/0010_action_action_unique_user_action.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/core/migrations/0010_action_action_unique_user_action.py b/db/core/migrations/0010_action_action_unique_user_action.py index a5478b73..ab4a48aa 100644 --- a/db/core/migrations/0010_action_action_unique_user_action.py +++ b/db/core/migrations/0010_action_action_unique_user_action.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-07-20 12:57 +# Generated by Django 5.0.7 on 2024-07-20 13:25 import db.core.models.managers import django.db.models.deletion From 65fad099c37ce89a97060dba3cc0c88a39d8c047 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 23:19:20 +0100 Subject: [PATCH 066/155] implement action status --- cogs/committee_actions_tracking.py | 100 +++++++++++++++++- .../0010_action_action_unique_user_action.py | 3 +- db/core/models/__init__.py | 13 +++ 3 files changed, 112 insertions(+), 4 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 737954da..b864ec32 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -12,6 +12,7 @@ import discord from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError +from django.db.models.query import QuerySet # noqa: TCH002 from db.core.models import Action, DiscordMember from exceptions.base import BaseDoesNotExistError @@ -73,7 +74,7 @@ async def autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[di } @staticmethod - async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + async def autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """ Autocomplete callable that provides a set of actions that belong to the user. @@ -121,8 +122,57 @@ async def action_autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) - in user_actions } + @staticmethod + async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + """Autocomplete callable that provides a set of actions that belong to the user.""" + if not ctx.interaction.user: + logger.debug("User actions autocomplete did not have an interaction user!!") + return set() + + interaction_user: discord.Member = await ctx.bot.get_member_from_str_id( + str(ctx.interaction.user.id), + ) + + filtered_user_actions: list[Action] = [ + action async for action in await Action.objects.afilter( + discord_id=int(interaction_user.id), + ) + ] + + for action in filtered_user_actions: + logger.debug(action.id) + + return { + discord.OptionChoice(name=action.description, value=str(action.id)) + for action + in filtered_user_actions + } + + + @staticmethod + async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 + """Autocomplete callable that provides the set of possible Status'of actions.""" + status_options: list[tuple[str, str]] = ( + Action._meta.get_field("status").__dict__["_choices"] + ) + + if not status_options: + return set() + + return { + discord.OptionChoice(name=value, value=code) + for code, value + in status_options + } + + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> Action | str: # noqa: E501 - """Create the action object with the given description for the given user.""" + """ + Create the action object with the given description for the given user. + + If action creation is successful, the Action object will be returned. + If unsuccessful, a string explaining the error will be returned. + """ try: action: Action = await Action.objects.acreate( discord_id=int(action_user.id), @@ -203,6 +253,50 @@ async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, await self._create_action(ctx, action_user, action_description, silent=False) + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="update-status", + description="Update the status of the provided action.", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="action", + description="The action to mark as completed.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] + required=True, + parameter_name="action_id", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="status", + description="The desired status of the action.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] + required=True, + parameter_name="status", + ) + @CommandChecks.check_interaction_user_has_committee_role + @CommandChecks.check_interaction_user_in_main_guild + async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, status: str) -> None: # noqa: E501 + """ + Update the status of the given action to the given status. + + Takes in an action object and a Status string, + sets the status of the provided action to be the provided status. + """ + try: + action: Action = await Action.objects.select_related().aget(id=action_id) + except (MultipleObjectsReturned, ObjectDoesNotExist): + await self.command_send_error( + ctx, + message="Action provided was either not unique or could not be found.", + ) + return + + action.status = status + + await ctx.respond( + content=f"Updated action: {action.description} status to be: {action.status}", + ) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-random-user", @@ -395,7 +489,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: name="action", description="The action to mark as completed.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(action_autocomplete_get_user_actions), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_actions), # type: ignore[arg-type] required=True, parameter_name="str_action_object", ) diff --git a/db/core/migrations/0010_action_action_unique_user_action.py b/db/core/migrations/0010_action_action_unique_user_action.py index ab4a48aa..8dee3037 100644 --- a/db/core/migrations/0010_action_action_unique_user_action.py +++ b/db/core/migrations/0010_action_action_unique_user_action.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-07-20 13:25 +# Generated by Django 5.0.6 on 2024-07-20 19:35 import db.core.models.managers import django.db.models.deletion @@ -17,6 +17,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', models.TextField(max_length=1500, verbose_name='Description of the action')), + ('status', models.CharField(choices=[('X', 'Cancelled'), ('B', 'Blocked'), ('C', 'Complete'), ('IP', 'In Progress'), ('NS', 'Not Started')], default='NS', max_length=2)), ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action', to='core.discordmember', verbose_name='Discord Member')), ], options={ diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 63c82026..c8a52b5b 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -22,6 +22,7 @@ from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator, RegexValidator from django.db import models +from django.utils.translation import gettext_lazy as _ from .utils import AsyncBaseModel, BaseDiscordMemberWrapper, DiscordMember @@ -29,6 +30,13 @@ class Action(BaseDiscordMemberWrapper): """Model to represent an action item that has been assigned to a Discord Member.""" + class Status(models.TextChoices): + CANCELLED = "X", _("Cancelled") + BLOCKED = "B", _("Blocked") + COMPLETE = "C", _("Complete") + IN_PROGRESS = "IP", _("In Progress") + NOT_STARTED = "NS", _("Not Started") + INSTANCES_NAME_PLURAL: str = "Actions" discord_member = models.ForeignKey( # type: ignore[assignment] @@ -46,6 +54,11 @@ class Action(BaseDiscordMemberWrapper): null=False, blank=False, ) + status = models.CharField( + max_length=2, + choices=Status, + default=Status.NOT_STARTED, + ) class Meta: verbose_name = "An Action for a Discord Member" verbose_name_plural = "Actions for Discord Members" From 8d614922094cb7f44f8ad7ab1cd20d55304e8416 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 23:29:45 +0100 Subject: [PATCH 067/155] remove old debug log --- cogs/committee_actions_tracking.py | 50 ++++++------------------------ 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index b864ec32..1387d172 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -139,9 +139,6 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se ) ] - for action in filtered_user_actions: - logger.debug(action.id) - return { discord.OptionChoice(name=action.description, value=str(action.id)) for action @@ -489,56 +486,27 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: name="action", description="The action to mark as completed.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_actions), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] required=True, - parameter_name="str_action_object", + parameter_name="action_id", ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def complete_action(self, ctx: TeXBotApplicationContext, str_action_object: str) -> None: # noqa: E501 + async def complete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> None: """ Definition and callback of the complete action command. Marks the specified action as complete by deleting it. """ - action_user: discord.Member = ctx.user - - if ":" not in str_action_object: - await ctx.respond( - content="Action provided was not valid, please use the auto complete!", - ) - logger.debug("%s tried to mark an invalid Action as completed.", action_user) - return - - components = str_action_object.split(":") - input_description = components[1].strip() - - actions: list[Action] = [action async for action in await Action.objects.afilter( - discord_id=int(action_user.id), - description=input_description, - )] - - if not actions: - NO_ACTIONS_FOUND_MESSAGE: Final[str] = ( - f"No actions found for user: {action_user}, " - f"with description: {input_description}" - ) - await ctx.respond(content=NO_ACTIONS_FOUND_MESSAGE) - logger.debug(NO_ACTIONS_FOUND_MESSAGE) - return - - if len(actions) > 1: - MULTIPLE_ACTIONS_FOUND: Final[str] = ( - f"Found {len(actions)} for user: {action_user} " - f"with description: {input_description}, this shouldn't be possible!!" + try: + action: Action = await Action.objects.select_related().aget(id=action_id) + except (MultipleObjectsReturned, ObjectDoesNotExist): + await self.command_send_error( + ctx, + message="Action provided was either not unique or could not be found.", ) - await ctx.respond(content=MULTIPLE_ACTIONS_FOUND) - logger.error(MULTIPLE_ACTIONS_FOUND) - logger.debug(actions) return - action: Action = actions[0] - await action.adelete() await ctx.respond(content=f"Action: {action.description} deleted!") logger.debug("Action: %s has been deleted.", action.description) From 8f0a6886786005706fed5ddec770d913ecd1f3a4 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 23:33:33 +0100 Subject: [PATCH 068/155] remove erronious import --- cogs/committee_actions_tracking.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 1387d172..f88b6371 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -12,7 +12,6 @@ import discord from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError -from django.db.models.query import QuerySet # noqa: TCH002 from db.core.models import Action, DiscordMember from exceptions.base import BaseDoesNotExistError From 6e80e5b98c21192533f7b7e4861b811d132ea018 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 23:34:38 +0100 Subject: [PATCH 069/155] remove unneeded method --- cogs/committee_actions_tracking.py | 48 ------------------------------ 1 file changed, 48 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f88b6371..3bc7de5c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -72,54 +72,6 @@ async def autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[di in all_actions } - @staticmethod - async def autocomplete_get_user_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 - """ - Autocomplete callable that provides a set of actions that belong to the user. - - Returns the set of actions that belong to the user using the command, - giving the user a list of action descriptions to choose from. - """ - # NOTE: this entire method is fucking insane because django is shit and makes me want to kill myself - if not ctx.interaction.user: - logger.debug("User actions autocomplete did not have an interaction user!!") - return set() - - interaction_user: discord.Member = await ctx.bot.get_member_from_str_id( - str(ctx.interaction.user.id), - ) - - all_discord_members = [ - discord_member async for discord_member in DiscordMember.objects.all() - ] - - hashed_interaction_user_id: str = DiscordMember.hash_discord_id(interaction_user.id) - interaction_user_internal_id: str - - for discord_member in all_discord_members: - if str(discord_member) == hashed_interaction_user_id: - interaction_user_internal_id = str(discord_member.id) - break - - if not interaction_user_internal_id: - logger.debug("fuckin cry or something idk bro") - return set() - - user_actions: list[Action] = [ - action async for action in Action.objects.select_related().filter( - discord_member_id=interaction_user_internal_id, - ) - ] - - if not user_actions: - logger.debug("No actions were found!!") - return set() - - return { - discord.OptionChoice(name=action.description, value=(str(action))) - for action - in user_actions - } @staticmethod async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 From 8b8bc466a6aff1e3b86197a45645e3af290af399 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sat, 20 Jul 2024 23:46:05 +0100 Subject: [PATCH 070/155] remove complete action command --- cogs/committee_actions_tracking.py | 34 ------------------------------ 1 file changed, 34 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 3bc7de5c..cf711ccd 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -429,40 +429,6 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: ) - @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="complete-action", - description="Marks the specified action as being completed.", - ) - @discord.option( # type: ignore[no-untyped-call, misc] - name="action", - description="The action to mark as completed.", - input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] - required=True, - parameter_name="action_id", - ) - @CommandChecks.check_interaction_user_has_committee_role - @CommandChecks.check_interaction_user_in_main_guild - async def complete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> None: - """ - Definition and callback of the complete action command. - - Marks the specified action as complete by deleting it. - """ - try: - action: Action = await Action.objects.select_related().aget(id=action_id) - except (MultipleObjectsReturned, ObjectDoesNotExist): - await self.command_send_error( - ctx, - message="Action provided was either not unique or could not be found.", - ) - return - - await action.adelete() - await ctx.respond(content=f"Action: {action.description} deleted!") - logger.debug("Action: %s has been deleted.", action.description) - - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="reassign-action", description="Reassign the specified action to another user.", From 40190c6c67834c27a67e96a2996b1280db4f6595 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 00:04:29 +0100 Subject: [PATCH 071/155] refactor reassign --- cogs/committee_actions_tracking.py | 48 ++++++++---------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index cf711ccd..234d96d9 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -67,7 +67,7 @@ async def autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[di return set() return { - discord.OptionChoice(name=str(action.description), value=str(action)) + discord.OptionChoice(name=action.description, value=str(action.id)) for action in all_actions } @@ -439,7 +439,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: input_type=str, autocomplete=discord.utils.basic_autocomplete(autocomplete_get_all_actions), # type: ignore[arg-type] required=True, - parameter_name="str_action_object", + parameter_name="action_id", ) @discord.option( # type: ignore[no-untyped-call, misc] name="user", @@ -451,40 +451,15 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: str, str_action_member_id: str) -> None: # noqa: E501 + async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, str_action_member_id: str) -> None: # noqa: E501 """Reassign the specified action to the specified user.""" - if ":" not in str_action_object: - await ctx.respond( - content="Action provided was not valid, please use the auto complete!", - ) - logger.debug("%s tried to reassign an Action that didn't exist.", ctx.user) - return - - components = str_action_object.split(":") - input_hashed_id = components[0].strip() - input_description = components[1].strip() new_user_to_action: discord.Member = await self.bot.get_member_from_str_id( str_action_member_id, ) new_user_to_action_hash: str = DiscordMember.hash_discord_id(new_user_to_action.id) - all_discord_members: list[DiscordMember] = [ - discord_member async for discord_member in DiscordMember.objects.all() - ] - - input_user_internal_id: str - - discord_member: DiscordMember - for discord_member in all_discord_members: - if str(discord_member) == input_hashed_id: - input_user_internal_id = str(discord_member.id) - break - try: - action_to_reassign = await Action.objects.select_related().aget( - discord_member_id=input_user_internal_id, - description=input_description, - ) + action_to_reassign: Action = await Action.objects.select_related().aget(id=action_id) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( ctx, @@ -493,20 +468,23 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, str_action_object: return if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] - await ctx.respond(content=( - f"HEY! Action: {action_to_reassign.description} is already assigned " - f"to user: {new_user_to_action.mention}\nNo action has been taken.", - )) + await ctx.respond( + content=( + f"HEY! Action: {action_to_reassign.description} is already assigned " + f"to user: {new_user_to_action.mention}\nNo action has been taken." + ), + ) return - await self._create_action( + new_action: Action | str = await self._create_action( ctx, new_user_to_action, action_to_reassign.description, silent=False, ) - await action_to_reassign.adelete() + if isinstance(new_action, Action): + await action_to_reassign.adelete() @discord.slash_command( # type: ignore[no-untyped-call, misc] From 79710db2f72254a87bc4bc4aa844799e0a759bc0 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 00:05:03 +0100 Subject: [PATCH 072/155] fix line length --- cogs/committee_actions_tracking.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 234d96d9..cc652f9a 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -459,7 +459,9 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st new_user_to_action_hash: str = DiscordMember.hash_discord_id(new_user_to_action.id) try: - action_to_reassign: Action = await Action.objects.select_related().aget(id=action_id) + action_to_reassign: Action = ( + await Action.objects.select_related().aget(id=action_id) + ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( ctx, From 5e422c14296f00635595a93a0e5d4408b677e794 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 00:40:42 +0100 Subject: [PATCH 073/155] rename action command to create --- cogs/committee_actions_tracking.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index cc652f9a..39a50fd9 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -169,7 +169,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="action", + name="create", description="Adds a new action with the specified description", ) @discord.option( # type: ignore[no-untyped-call, misc] @@ -189,11 +189,11 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def action(self, ctx: TeXBotApplicationContext, str_action_member_id: str, action_description: str) -> None: # noqa: E501 + async def create(self, ctx: TeXBotApplicationContext, str_action_member_id: str, action_description: str) -> None: # noqa: E501 """ - Definition and callback response of the "action" command. + Definition and callback response of the "create" command. - The action command adds an action to the specified user. + The "create" command creates an action assigned the specified user. """ action_user: discord.Member = await self.bot.get_member_from_str_id( str_action_member_id, @@ -516,6 +516,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> committee: [ action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] + and action.status != "X" or action.status != "C" ] for committee in committee_members } @@ -529,7 +530,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> all_actions_message: str = "\n".join([ f"\n{committee.mention if ping else committee}, Actions:" - f"\n{', \n'.join(str(action.description) for action in actions)}" + f"\n{', \n'.join(str(action.description) + f"({action.status})" for action in actions)}" for committee, actions in filtered_committee_actions.items() ], ) From 56da2f64df5e7f20f7ed4fc018b72791cc45cbef Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 00:47:38 +0100 Subject: [PATCH 074/155] fix --- cogs/committee_actions_tracking.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 39a50fd9..88cfa167 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -161,10 +161,12 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ) return DUPLICATE_ACTION_MESSAGE if not silent: - await ctx.respond(content=( + await ctx.respond( + content=( f"Action: {action.description} created " f"for user: {action_user.mention}" - )) + ), + ) return action @@ -530,7 +532,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> all_actions_message: str = "\n".join([ f"\n{committee.mention if ping else committee}, Actions:" - f"\n{', \n'.join(str(action.description) + f"({action.status})" for action in actions)}" + f"\n{', \n'.join(str(action.description) + f"({action.status})" for action in actions)}" # noqa: E501 for committee, actions in filtered_committee_actions.items() ], ) From 5036524d672f343afec2e96c7256c15008a5bdec Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 01:55:45 +0100 Subject: [PATCH 075/155] improve status display --- cogs/committee_actions_tracking.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 88cfa167..fb3e3f8a 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -241,7 +241,15 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ) return - action.status = status + try: + new_status: Action.Status = Action.Status(status) + except KeyError as key_error: + await self.command_send_error(ctx, message=f"Invalid Action Status: {key_error}") + return + + action.status = new_status + + await action.asave() await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", @@ -424,9 +432,12 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: ) return - await ctx.respond(content=( - f"You have {len(user_actions)} actions: " - f"\n{"\n".join(str(action.description) for action in user_actions)}"), + await ctx.respond( + content=( + f"You have {len(user_actions)} actions: " + f"\n{"\n".join(str(action.description) + f" ({Action.Status(action.status).label})" + for action in user_actions)}" # noqa: E501 + ), ephemeral=True, ) @@ -518,7 +529,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> committee: [ action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] - and action.status != "X" or action.status != "C" + and action.status != "X" and action.status != "C" ] for committee in committee_members } @@ -532,7 +543,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> all_actions_message: str = "\n".join([ f"\n{committee.mention if ping else committee}, Actions:" - f"\n{', \n'.join(str(action.description) + f"({action.status})" for action in actions)}" # noqa: E501 + f"\n{', \n'.join(str(action.description) + f"({Action.Status(action.status).label})" for action in actions)}" # noqa: E501 for committee, actions in filtered_committee_actions.items() ], ) From f24a489bba45f78850cf92273704143b3a128dc0 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 02:12:18 +0100 Subject: [PATCH 076/155] improve action filtering --- cogs/committee_actions_tracking.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index fb3e3f8a..5c541fda 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -12,6 +12,7 @@ import discord from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError +from django.db.models import Q from db.core.models import Action, DiscordMember from exceptions.base import BaseDoesNotExistError @@ -86,6 +87,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se filtered_user_actions: list[Action] = [ action async for action in await Action.objects.afilter( + Q(status="IP") | Q(status="B") | Q(status="NS"), discord_id=int(interaction_user.id), ) ] @@ -391,6 +393,7 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe ) user_actions = [action async for action in await Action.objects.afilter( + Q(status="IP") | Q(status="B") | Q(status="NS"), discord_id=int(str_action_member_id), )] @@ -401,11 +404,13 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe logger.debug(user_actions) return - await ctx.respond(content=( - f"Found {len(user_actions)} actions for user " - f"{action_member.mention if ping else action_member}:" - f"\n{"\n".join(str(action.description) for action in user_actions)}", - )) + await ctx.respond( + content=( + f"Found {len(user_actions)} actions for user " + f"{action_member.mention if ping else action_member}:" + f"\n{"\n".join(str(action.description) for action in user_actions)}", + ), + ) @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -422,6 +427,7 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: command_user: discord.Member = ctx.user user_actions: list[Action] = [action async for action in await Action.objects.afilter( + Q(status="IP") | Q(status="B") | Q(status="NS"), discord_id=int(command_user.id), )] From 234998bfe8d7b5229374de6f79b71a49ca94c6b6 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 02:15:28 +0100 Subject: [PATCH 077/155] fix dumb code --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 5c541fda..1eec0255 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -535,7 +535,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> committee: [ action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] - and action.status != "X" and action.status != "C" + and action.status not in ("X", "C") ] for committee in committee_members } @@ -549,7 +549,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> all_actions_message: str = "\n".join([ f"\n{committee.mention if ping else committee}, Actions:" - f"\n{', \n'.join(str(action.description) + f"({Action.Status(action.status).label})" for action in actions)}" # noqa: E501 + f"\n{', \n'.join(str(action.description) + f" ({Action.Status(action.status).label})" for action in actions)}" # noqa: E501 for committee, actions in filtered_committee_actions.items() ], ) From 2dc2d83b7de21d7b71b774606d3f028c67762908 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 14:39:56 +0100 Subject: [PATCH 078/155] improvements --- cogs/committee_actions_tracking.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 1eec0255..66785fb5 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -255,6 +255,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", + ephemeral=True, ) @@ -404,14 +405,15 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe logger.debug(user_actions) return - await ctx.respond( - content=( - f"Found {len(user_actions)} actions for user " - f"{action_member.mention if ping else action_member}:" - f"\n{"\n".join(str(action.description) for action in user_actions)}", - ), + actions_message: str = ( + f"Found {len(user_actions)} actions for user " + f"{action_member.mention if ping else action_member}:" + f"\n{"\n".join(str(action.description) + f" ({Action.Status(action.status).label})" + for action in user_actions)}" ) + await ctx.respond(content=actions_message) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-my-actions", From 648eb1925d78e5a2f85da2e13f33666de843677a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 14:51:41 +0100 Subject: [PATCH 079/155] add bot check --- cogs/committee_actions_tracking.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 66785fb5..8589cc85 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -123,6 +123,15 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco If action creation is successful, the Action object will be returned. If unsuccessful, a string explaining the error will be returned. """ + if action_user.bot: + if not silent: + await self.command_send_error( + ctx, + message=( + "Action creation aborted because actions cannot be assigned to bots!" + ), + ) + return f"Actions cannot be assigned to bots! ({action_user})" try: action: Action = await Action.objects.acreate( discord_id=int(action_user.id), From 8a24bb29ff8951b1cc6742a418ff6b2209df84d9 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:16:30 +0100 Subject: [PATCH 080/155] improve info message --- cogs/committee_actions_tracking.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8589cc85..357efd7e 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -443,9 +443,13 @@ async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: )] if not user_actions: - await ctx.respond(content=":warning: You do not have any actions!", ephemeral=True) + await ctx.respond( + content=":information: You do not have any actions!", + ephemeral=True, + ) logger.debug( "User: %s ran the list-my-actions slash-command but no actions were found!", + command_user, ) return From 60b688e7e9bef27c673c002ab8b8c6836d9258ae Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:58:59 +0100 Subject: [PATCH 081/155] add filtering options --- cogs/committee_actions_tracking.py | 59 ++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 357efd7e..04f9a219 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -390,9 +390,18 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr default=False, required=False, ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="status", + description="The desired status of the action.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] + required=False, + default=None, + parameter_name="status", + ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_member_id: str, *, ping: bool) -> None: # noqa: E501 + async def list_user_actions(self, ctx: TeXBotApplicationContext, str_action_member_id: str, *, ping: bool, status: str) -> None: # noqa: E501 """ Definition and callback of the list user actions command. @@ -402,16 +411,28 @@ async def list_user_actions(self, ctx:TeXBotApplicationContext, str_action_membe str_action_member_id, ) - user_actions = [action async for action in await Action.objects.afilter( - Q(status="IP") | Q(status="B") | Q(status="NS"), - discord_id=int(str_action_member_id), - )] + user_actions: list[Action] + + if not status: + user_actions = [action async for action in await Action.objects.afilter( + Q(status="IP") | Q(status="B") | Q(status="NS"), + discord_id=int(action_member.id), + )] + else: + user_actions=[ + action async for action in await Action.objects.afilter( + Q(status=status), + discord_id=int(action_member.id), + ) + ] if not user_actions: - await ctx.respond(content=( - f"User: {action_member.mention if ping else action_member} has no actions.", - )) - logger.debug(user_actions) + await ctx.respond( + content=( + f"User: {action_member.mention if ping else action_member} has no " + "in progress actions." if not status else " actions matching given filter." + ), + ) return actions_message: str = ( @@ -534,9 +555,18 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st default=False, required=False, ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="status", + description="The desired status of the action.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] + required=False, + default=None, + parameter_name="status", + ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> None: + async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, status: str) -> None: # noqa: E501 """List all actions.""" # NOTE: this doesn't actually list *all* actions as it is possible for non-committee to be actioned. committee_role: discord.Role = await self.bot.committee_role @@ -544,13 +574,20 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool) -> action async for action in Action.objects.select_related().all() ] + desired_status: list[str] = [] + + if status: + desired_status += status + else: + desired_status += "NS", "IP", "B" + committee_members: list[discord.Member] = committee_role.members committee_actions: dict[discord.Member, list[Action]] = { committee: [ action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] - and action.status not in ("X", "C") + and action.status in desired_status ] for committee in committee_members } From 9147e2d5f30de1c2f3bf75c22a9a2192df758c1a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:10:20 +0100 Subject: [PATCH 082/155] make user selection optional --- cogs/committee_actions_tracking.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 04f9a219..ef221ae9 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -183,15 +183,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco @discord.slash_command( # type: ignore[no-untyped-call, misc] name="create", - description="Adds a new action with the specified description", - ) - @discord.option( # type: ignore[no-untyped-call, misc] - name="user", - description="The user to assign the action to", - input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] - required=True, - parameter_name="str_action_member_id", + description="Adds a new action with the specified description.", ) @discord.option( # type: ignore[no-untyped-call, misc] name="description", @@ -200,16 +192,30 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco required=True, parameter_name="action_description", ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="user", + description="The user to assign the action to.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] + required=False, + default=None, + parameter_name="action_member_id", + ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def create(self, ctx: TeXBotApplicationContext, str_action_member_id: str, action_description: str) -> None: # noqa: E501 + async def create(self, ctx: TeXBotApplicationContext, action_description: str, *, action_member_id: str) -> None: # noqa: E501 """ Definition and callback response of the "create" command. - The "create" command creates an action assigned the specified user. + The "create" command creates an action with the specified description. + If no user is specified, the user issuing the command will be actioned. """ + member_id: str = "" + + member_id = action_member_id if action_member_id else str(ctx.user.id) + action_user: discord.Member = await self.bot.get_member_from_str_id( - str_action_member_id, + member_id, ) await self._create_action(ctx, action_user, action_description, silent=False) From ece53603244208f0dc4cca406fd26a5f4a455a15 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:15:49 +0100 Subject: [PATCH 083/155] refinement --- cogs/committee_actions_tracking.py | 57 +++++++----------------------- 1 file changed, 12 insertions(+), 45 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ef221ae9..0687857f 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -386,8 +386,9 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr description="The user to list actions for.", input_type=str, autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] - required=True, - parameter_name="str_action_member_id", + required=False, + default=None, + parameter_name="action_member_id", ) @discord.option( # type: ignore[no-untyped-call, misc] name="ping", @@ -407,15 +408,20 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def list_user_actions(self, ctx: TeXBotApplicationContext, str_action_member_id: str, *, ping: bool, status: str) -> None: # noqa: E501 + async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_member_id: str, ping: bool, status: str) -> None: # noqa: E501 """ Definition and callback of the list user actions command. Takes in a user and lists out their current actions. """ - action_member: discord.Member = await self.bot.get_member_from_str_id( - str_action_member_id, - ) + action_member: discord.Member | discord.User + + if action_member_id: + action_member = await self.bot.get_member_from_str_id( + action_member_id, + ) + else: + action_member = ctx.user user_actions: list[Action] @@ -451,45 +457,6 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, str_action_memb await ctx.respond(content=actions_message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="list-my-actions", - description="Lists all actions for the user that ran the command", - ) - @CommandChecks.check_interaction_user_in_main_guild - async def list_my_actions(self, ctx: TeXBotApplicationContext) -> None: - """ - Definition and callback of the list my actions command. - - Takes no arguments and simply returns the actions for the user that ran the command. - """ - command_user: discord.Member = ctx.user - - user_actions: list[Action] = [action async for action in await Action.objects.afilter( - Q(status="IP") | Q(status="B") | Q(status="NS"), - discord_id=int(command_user.id), - )] - - if not user_actions: - await ctx.respond( - content=":information: You do not have any actions!", - ephemeral=True, - ) - logger.debug( - "User: %s ran the list-my-actions slash-command but no actions were found!", - command_user, - ) - return - - await ctx.respond( - content=( - f"You have {len(user_actions)} actions: " - f"\n{"\n".join(str(action.description) + f" ({Action.Status(action.status).label})" - for action in user_actions)}" # noqa: E501 - ), - ephemeral=True, - ) - - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="reassign-action", description="Reassign the specified action to another user.", From 8ed3906d231f6f92ace6b41f9a5912c2b41e51e3 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:23:54 +0100 Subject: [PATCH 084/155] refactor Action name --- cogs/committee_actions_tracking.py | 60 ++++++++++++++++-------------- cogs/delete_all.py | 4 +- db/core/models/__init__.py | 2 +- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 0687857f..41ebedf6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -14,7 +14,7 @@ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from django.db.models import Q -from db.core.models import Action, DiscordMember +from db.core.models import AssinedCommitteeAction, DiscordMember from exceptions.base import BaseDoesNotExistError from utils import ( CommandChecks, @@ -59,8 +59,8 @@ async def autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[di Each action is identified by its description. """ - all_actions: list[Action] = [ - action async for action in Action.objects.select_related().all() + all_actions: list[AssinedCommitteeAction] = [ + action async for action in AssinedCommitteeAction.objects.select_related().all() ] if not all_actions: @@ -85,8 +85,8 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se str(ctx.interaction.user.id), ) - filtered_user_actions: list[Action] = [ - action async for action in await Action.objects.afilter( + filtered_user_actions: list[AssinedCommitteeAction] = [ + action async for action in await AssinedCommitteeAction.objects.afilter( Q(status="IP") | Q(status="B") | Q(status="NS"), discord_id=int(interaction_user.id), ) @@ -103,7 +103,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """Autocomplete callable that provides the set of possible Status'of actions.""" status_options: list[tuple[str, str]] = ( - Action._meta.get_field("status").__dict__["_choices"] + AssinedCommitteeAction._meta.get_field("status").__dict__["_choices"] ) if not status_options: @@ -116,7 +116,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[ } - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> Action | str: # noqa: E501 + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssinedCommitteeAction | str: # noqa: E501 """ Create the action object with the given description for the given user. @@ -133,7 +133,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ) return f"Actions cannot be assigned to bots! ({action_user})" try: - action: Action = await Action.objects.acreate( + action: AssinedCommitteeAction = await AssinedCommitteeAction.objects.acreate( discord_id=int(action_user.id), description=description, ) @@ -250,7 +250,9 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta sets the status of the provided action to be the provided status. """ try: - action: Action = await Action.objects.select_related().aget(id=action_id) + action: AssinedCommitteeAction = ( + await AssinedCommitteeAction.objects.select_related().aget(id=action_id) + ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( ctx, @@ -259,7 +261,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta return try: - new_status: Action.Status = Action.Status(status) + new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) except KeyError as key_error: await self.command_send_error(ctx, message=f"Invalid Action Status: {key_error}") return @@ -340,13 +342,13 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr committee_member: discord.Member for committee_member in committee_members: - action_or_error_message: Action | str = await self._create_action( + action_or_error_message: AssinedCommitteeAction | str = await self._create_action( ctx, committee_member, action_description, silent=True, ) - if isinstance(action_or_error_message, Action): + if isinstance(action_or_error_message, AssinedCommitteeAction): success_members.append(committee_member) else: failed_members += action_or_error_message + "\n" @@ -423,16 +425,18 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe else: action_member = ctx.user - user_actions: list[Action] + user_actions: list[AssinedCommitteeAction] if not status: - user_actions = [action async for action in await Action.objects.afilter( - Q(status="IP") | Q(status="B") | Q(status="NS"), - discord_id=int(action_member.id), - )] + user_actions = [ + action async for action in await AssinedCommitteeAction.objects.afilter( + Q(status="IP") | Q(status="B") | Q(status="NS"), + discord_id=int(action_member.id), + ) + ] else: user_actions=[ - action async for action in await Action.objects.afilter( + action async for action in await AssinedCommitteeAction.objects.afilter( Q(status=status), discord_id=int(action_member.id), ) @@ -450,8 +454,8 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe actions_message: str = ( f"Found {len(user_actions)} actions for user " f"{action_member.mention if ping else action_member}:" - f"\n{"\n".join(str(action.description) + f" ({Action.Status(action.status).label})" - for action in user_actions)}" + f"\n{"\n".join(str(action.description) + f" ({AssinedCommitteeAction.Status(action.status).label})" + for action in user_actions)}" # noqa: E501 ) await ctx.respond(content=actions_message) @@ -487,8 +491,8 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st new_user_to_action_hash: str = DiscordMember.hash_discord_id(new_user_to_action.id) try: - action_to_reassign: Action = ( - await Action.objects.select_related().aget(id=action_id) + action_to_reassign: AssinedCommitteeAction = ( + await AssinedCommitteeAction.objects.select_related().aget(id=action_id) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -506,14 +510,14 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st ) return - new_action: Action | str = await self._create_action( + new_action: AssinedCommitteeAction | str = await self._create_action( ctx, new_user_to_action, action_to_reassign.description, silent=False, ) - if isinstance(new_action, Action): + if isinstance(new_action, AssinedCommitteeAction): await action_to_reassign.adelete() @@ -543,8 +547,8 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st """List all actions.""" # NOTE: this doesn't actually list *all* actions as it is possible for non-committee to be actioned. committee_role: discord.Role = await self.bot.committee_role - actions: list[Action] = [ - action async for action in Action.objects.select_related().all() + actions: list[AssinedCommitteeAction] = [ + action async for action in AssinedCommitteeAction.objects.select_related().all() ] desired_status: list[str] = [] @@ -556,7 +560,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st committee_members: list[discord.Member] = committee_role.members - committee_actions: dict[discord.Member, list[Action]] = { + committee_actions: dict[discord.Member, list[AssinedCommitteeAction]] = { committee: [ action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] @@ -574,7 +578,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st all_actions_message: str = "\n".join([ f"\n{committee.mention if ping else committee}, Actions:" - f"\n{', \n'.join(str(action.description) + f" ({Action.Status(action.status).label})" for action in actions)}" # noqa: E501 + f"\n{', \n'.join(str(action.description) + f" ({AssinedCommitteeAction.Status(action.status).label})" for action in actions)}" # noqa: E501 for committee, actions in filtered_committee_actions.items() ], ) diff --git a/cogs/delete_all.py b/cogs/delete_all.py index 4bc6e351..de1483b9 100644 --- a/cogs/delete_all.py +++ b/cogs/delete_all.py @@ -7,7 +7,7 @@ import discord -from db.core.models import Action, DiscordReminder, GroupMadeMember +from db.core.models import AssinedCommitteeAction, DiscordReminder, GroupMadeMember from db.core.models.utils import AsyncBaseModel from utils import CommandChecks, TeXBotApplicationContext, TeXBotBaseCog @@ -80,4 +80,4 @@ async def delete_all_actions(self, ctx: TeXBotApplicationContext) -> None: The "delete-all-actions" command uses the _delete_all() function to delete all `Action` instance objects stored in the database. """ - await self._delete_all(ctx, delete_model=Action) + await self._delete_all(ctx, delete_model=AssinedCommitteeAction) diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index c8a52b5b..5021b900 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -27,7 +27,7 @@ from .utils import AsyncBaseModel, BaseDiscordMemberWrapper, DiscordMember -class Action(BaseDiscordMemberWrapper): +class AssinedCommitteeAction(BaseDiscordMemberWrapper): """Model to represent an action item that has been assigned to a Discord Member.""" class Status(models.TextChoices): From 49c4d680905649627c61f3695481f758b44836ec Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:37:32 +0100 Subject: [PATCH 085/155] refactor action name and docs --- .../0010_action_action_unique_user_action.py | 35 ------------------- db/core/models/__init__.py | 24 +++++-------- 2 files changed, 9 insertions(+), 50 deletions(-) delete mode 100644 db/core/migrations/0010_action_action_unique_user_action.py diff --git a/db/core/migrations/0010_action_action_unique_user_action.py b/db/core/migrations/0010_action_action_unique_user_action.py deleted file mode 100644 index 8dee3037..00000000 --- a/db/core/migrations/0010_action_action_unique_user_action.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.0.6 on 2024-07-20 19:35 - -import db.core.models.managers -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0009_auto_20240519_0020'), - ] - - operations = [ - migrations.CreateModel( - name='Action', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(max_length=1500, verbose_name='Description of the action')), - ('status', models.CharField(choices=[('X', 'Cancelled'), ('B', 'Blocked'), ('C', 'Complete'), ('IP', 'In Progress'), ('NS', 'Not Started')], default='NS', max_length=2)), - ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action', to='core.discordmember', verbose_name='Discord Member')), - ], - options={ - 'verbose_name': 'An Action for a Discord Member', - 'verbose_name_plural': 'Actions for Discord Members', - }, - managers=[ - ('objects', db.core.models.managers.RelatedDiscordMemberManager()), - ], - ), - migrations.AddConstraint( - model_name='action', - constraint=models.UniqueConstraint(fields=('discord_member', 'description'), name='unique_user_action'), - ), - ] diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 5021b900..ce63baef 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -28,7 +28,7 @@ class AssinedCommitteeAction(BaseDiscordMemberWrapper): - """Model to represent an action item that has been assigned to a Discord Member.""" + """Model to represent an action that has been assigned to a Discord committee-member.""" class Status(models.TextChoices): CANCELLED = "X", _("Cancelled") @@ -37,19 +37,19 @@ class Status(models.TextChoices): IN_PROGRESS = "IP", _("In Progress") NOT_STARTED = "NS", _("Not Started") - INSTANCES_NAME_PLURAL: str = "Actions" + INSTANCES_NAME_PLURAL: str = "Assigned Committee Actions" discord_member = models.ForeignKey( # type: ignore[assignment] DiscordMember, on_delete=models.CASCADE, - related_name="action", + related_name="assigned_committee_actions", verbose_name="Discord Member", blank=False, null=False, unique=False, ) description = models.TextField( - "Description of the action", + "Description", max_length=1500, null=False, blank=False, @@ -60,8 +60,7 @@ class Status(models.TextChoices): default=Status.NOT_STARTED, ) class Meta: - verbose_name = "An Action for a Discord Member" - verbose_name_plural = "Actions for Discord Members" + verbose_name = "Assigned Committee Action" constraints = [ # noqa: RUF012 models.UniqueConstraint( fields=["discord_member", "description"], @@ -70,19 +69,14 @@ class Meta: ] def __repr__(self) -> str: - """Generate a developer-focused representation of this DiscordReminder's attributes.""" + """Generate a developer-focused representation of this Assigned Committee Action's attributes.""" # noqa: E501, W505 return ( - f"<{self._meta.verbose_name}: {self.discord_member!r}, {str(self.description)!r}" # type: ignore[has-type] + f"<{self._meta.verbose_name}: {self.discord_member}, {self.description}" # type: ignore[has-type] ) def __str__(self) -> str: - """Generate the string representation of this DiscordReminder.""" - construct_str: str = f"{self.discord_member}" # type: ignore[has-type] - - if self.description: - construct_str += f": {self.description[:50]}" - - return construct_str + """Generate the string representation of this Assigned Committee Action.""" + return f"{self.discord_member}: {self.description}" # type: ignore[has-type] class IntroductionReminderOptOutMember(BaseDiscordMemberWrapper): From e639b7691062712d7de76f8b48ec3e27116e35ae Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:38:45 +0100 Subject: [PATCH 086/155] db migration --- .../0010_assinedcommitteeaction_and_more.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 db/core/migrations/0010_assinedcommitteeaction_and_more.py diff --git a/db/core/migrations/0010_assinedcommitteeaction_and_more.py b/db/core/migrations/0010_assinedcommitteeaction_and_more.py new file mode 100644 index 00000000..96abf379 --- /dev/null +++ b/db/core/migrations/0010_assinedcommitteeaction_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 5.0.6 on 2024-07-22 16:37 + +import db.core.models.managers +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_auto_20240519_0020'), + ] + + operations = [ + migrations.CreateModel( + name='AssinedCommitteeAction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(max_length=1500, verbose_name='Description')), + ('status', models.CharField(choices=[('X', 'Cancelled'), ('B', 'Blocked'), ('C', 'Complete'), ('IP', 'In Progress'), ('NS', 'Not Started')], default='NS', max_length=2)), + ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assigned_committee_actions', to='core.discordmember', verbose_name='Discord Member')), + ], + options={ + 'verbose_name': 'Assigned Committee Action', + }, + managers=[ + ('objects', db.core.models.managers.RelatedDiscordMemberManager()), + ], + ), + migrations.AddConstraint( + model_name='assinedcommitteeaction', + constraint=models.UniqueConstraint(fields=('discord_member', 'description'), name='unique_user_action'), + ), + ] From 9c153f0f6c12174c527fba767adb94dfc847c170 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 23 Jul 2024 22:40:48 +0100 Subject: [PATCH 087/155] add update-description command --- cogs/committee_actions_tracking.py | 65 +++++++++++++++++++++++++++++- db/core/models/__init__.py | 2 +- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 41ebedf6..9b8936ef 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -123,6 +123,17 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco If action creation is successful, the Action object will be returned. If unsuccessful, a string explaining the error will be returned. """ + if len(description) >= 200: + if not silent: + await self.command_send_error( + ctx, + message=( + "Action description was too long! " + "Max description length is 200 characters." + ), + ) + return "Action description exceeded the maximum character limit!" + if action_user.bot: if not silent: await self.command_send_error( @@ -132,6 +143,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ), ) return f"Actions cannot be assigned to bots! ({action_user})" + try: action: AssinedCommitteeAction = await AssinedCommitteeAction.objects.acreate( discord_id=int(action_user.id), @@ -224,7 +236,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * name="update-status", description="Update the status of the provided action.", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="action", description="The action to mark as completed.", input_type=str, @@ -232,7 +244,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * required=True, parameter_name="action_id", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="status", description="The desired status of the action.", input_type=str, @@ -275,6 +287,55 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="update-description", + description="Update the description of the provided action.", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="action", + description="The action to mark as completed.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] + required=True, + parameter_name="action_id", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="description", + description="The description to be used for the action", + input_type=str, + required=True, + parameter_name="action_description", + ) + async def update_description(self, ctx: TeXBotApplicationContext, action_id: str, description: str) -> None: # noqa: E501 + """ + Definition and callback response of the "update-description" command. + + Takes in an action id and description, retrieves the action from the ID + and updates the action to with the new description. + """ + if len(description) >= 200: + await ctx.respond( + content=":warning: The provided description was too long! No action taken.", + ) + return + + try: + action: AssinedCommitteeAction = ( + await AssinedCommitteeAction.objects.select_related().aget(id=action_id) + ) + except (MultipleObjectsReturned, ObjectDoesNotExist): + await self.command_send_error( + ctx, + message="Action provided was either not unique or could not be found.", + ) + return + + action.description = description + + await action.asave() + + await ctx.respond(content="Action description updated!") + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-random-user", diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index ce63baef..5af63537 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -50,7 +50,7 @@ class Status(models.TextChoices): ) description = models.TextField( "Description", - max_length=1500, + max_length=200, null=False, blank=False, ) From a74bec0da00f9835dfe22261964ecba0b481197a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 23 Jul 2024 23:42:05 +0100 Subject: [PATCH 088/155] update description length and checking --- cogs/committee_actions_tracking.py | 47 +++++-------------- .../0010_assinedcommitteeaction_and_more.py | 4 +- 2 files changed, 13 insertions(+), 38 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 9b8936ef..c206b87d 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -15,7 +15,6 @@ from django.db.models import Q from db.core.models import AssinedCommitteeAction, DiscordMember -from exceptions.base import BaseDoesNotExistError from utils import ( CommandChecks, TeXBotApplicationContext, @@ -34,43 +33,17 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): description="Add, list, remove and reassign tracked committee-actions.", ) + @staticmethod async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that generates a set of selectable committee members.""" - shortcut_accessors_failed_error: BaseDoesNotExistError - try: - main_guild: discord.Guild = ctx.bot.main_guild - committee_role: discord.Role = await ctx.bot.committee_role - except BaseDoesNotExistError as shortcut_accessors_failed_error: - logger.warning(shortcut_accessors_failed_error.message) - return set() + committee_role: discord.Role = await ctx.bot.committee_role return { discord.OptionChoice(name=member.name, value=str(member.id)) for member - in main_guild.members - if not member.bot and committee_role in member.roles - } - - @staticmethod - async def autocomplete_get_all_actions(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 - """ - Autocomplete callable that provides a set of selectable committee tracked-actions. - - Each action is identified by its description. - """ - all_actions: list[AssinedCommitteeAction] = [ - action async for action in AssinedCommitteeAction.objects.select_related().all() - ] - - if not all_actions: - logger.debug("User tried to autocomplete for Actions but no actions were found!") - return set() - - return { - discord.OptionChoice(name=action.description, value=str(action.id)) - for action - in all_actions + in committee_role.members + if not member.bot } @@ -107,6 +80,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[ ) if not status_options: + logger.error("The autocomplete could not find any action Status'!") return set() return { @@ -221,10 +195,10 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * The "create" command creates an action with the specified description. If no user is specified, the user issuing the command will be actioned. + In normal use the autocomplete should be used, but a discord ID can be + used directly if the user wishes to action a user not included in the autocomplete. """ - member_id: str = "" - - member_id = action_member_id if action_member_id else str(ctx.user.id) + member_id: str = action_member_id if action_member_id else str(ctx.user.id) action_user: discord.Member = await self.bot.get_member_from_str_id( member_id, @@ -256,7 +230,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * @CommandChecks.check_interaction_user_in_main_guild async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, status: str) -> None: # noqa: E501 """ - Update the status of the given action to the given status. + Definition and callback of the "update-status" command. Takes in an action object and a Status string, sets the status of the provided action to be the provided status. @@ -287,6 +261,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-description", description="Update the description of the provided action.", @@ -530,7 +505,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe name="action", description="The action to reassign.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_all_actions), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] required=True, parameter_name="action_id", ) diff --git a/db/core/migrations/0010_assinedcommitteeaction_and_more.py b/db/core/migrations/0010_assinedcommitteeaction_and_more.py index 96abf379..70e5baf5 100644 --- a/db/core/migrations/0010_assinedcommitteeaction_and_more.py +++ b/db/core/migrations/0010_assinedcommitteeaction_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.6 on 2024-07-22 16:37 +# Generated by Django 5.0.7 on 2024-07-23 22:41 import db.core.models.managers import django.db.models.deletion @@ -16,7 +16,7 @@ class Migration(migrations.Migration): name='AssinedCommitteeAction', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(max_length=1500, verbose_name='Description')), + ('description', models.TextField(max_length=200, verbose_name='Description')), ('status', models.CharField(choices=[('X', 'Cancelled'), ('B', 'Blocked'), ('C', 'Complete'), ('IP', 'In Progress'), ('NS', 'Not Started')], default='NS', max_length=2)), ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assigned_committee_actions', to='core.discordmember', verbose_name='Discord Member')), ], From 2748adabb44e43861decb910d2e55a7f6eb4c25c Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 23 Jul 2024 23:51:56 +0100 Subject: [PATCH 089/155] ruff reformat --- cogs/committee_actions_tracking.py | 108 ++++++++++++----------------- 1 file changed, 46 insertions(+), 62 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index c206b87d..47019819 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -33,7 +33,6 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): description="Add, list, remove and reassign tracked committee-actions.", ) - @staticmethod async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that generates a set of selectable committee members.""" @@ -41,12 +40,9 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> return { discord.OptionChoice(name=member.name, value=str(member.id)) - for member - in committee_role.members - if not member.bot + for member in committee_role.members if not member.bot } - @staticmethod async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that provides a set of actions that belong to the user.""" @@ -67,11 +63,9 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se return { discord.OptionChoice(name=action.description, value=str(action.id)) - for action - in filtered_user_actions + for action in filtered_user_actions } - @staticmethod async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """Autocomplete callable that provides the set of possible Status'of actions.""" @@ -83,11 +77,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[ logger.error("The autocomplete could not find any action Status'!") return set() - return { - discord.OptionChoice(name=value, value=code) - for code, value - in status_options - } + return {discord.OptionChoice(name=value, value=code) for code, value in status_options} async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssinedCommitteeAction | str: # noqa: E501 @@ -126,10 +116,9 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco except ValidationError as create_action_error: error_is_already_exits: bool = ( "__all__" in create_action_error.message_dict - and any ( + and any( "already exists" in error - for error - in create_action_error.message_dict["__all__"] + for error in create_action_error.message_dict["__all__"] ) ) if not error_is_already_exits: @@ -160,13 +149,11 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco if not silent: await ctx.respond( content=( - f"Action: {action.description} created " - f"for user: {action_user.mention}" + f"Action: {action.description} created for user: {action_user.mention}" ), ) return action - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="create", description="Adds a new action with the specified description.", @@ -182,7 +169,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco name="user", description="The user to assign the action to.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=False, default=None, parameter_name="action_member_id", @@ -206,7 +193,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * await self._create_action(ctx, action_user, action_description, silent=False) - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-status", description="Update the status of the provided action.", ) @@ -214,7 +201,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * name="action", description="The action to mark as completed.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] required=True, parameter_name="action_id", ) @@ -222,7 +209,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * name="status", description="The desired status of the action.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] required=True, parameter_name="status", ) @@ -261,16 +248,15 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) - @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="update-description", - description="Update the description of the provided action.", + name="update-description", + description="Update the description of the provided action.", ) @discord.option( # type: ignore[no-untyped-call, misc] name="action", description="The action to mark as completed.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] required=True, parameter_name="action_id", ) @@ -311,7 +297,6 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await ctx.respond(content="Action description updated!") - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-random-user", description="Creates an action object with the specified description and random user.", @@ -336,9 +321,11 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip committee_members: list[discord.Member] = committee_role.members if not committee_members: - await ctx.respond(content=( - "No committee members were found to randomly select from! Command aborted." - )) + await ctx.respond( + content=( + "No committee members were found to randomly select from! Command aborted." + ), + ) return action_user: discord.Member = committee_members[ @@ -396,8 +383,8 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr f"Successfully created action: {action_description} for users: \n" ) - response_message += ( - "\n".join(f"{success_member.mention}" for success_member in success_members) + response_message += "\n".join( + f"{success_member.mention}" for success_member in success_members ) if len(failed_members) > 1: @@ -405,25 +392,21 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr "\n\nThe following errors were also raised: \n" + failed_members ) else: - response_message += ( - "Could not create any actions! See errors below: \n" - ) + response_message += "Could not create any actions! See errors below: \n" response_message += failed_members - await ctx.respond(content=response_message) - - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-user-actions", description="Lists all actions for a specified user", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="user", description="The user to list actions for.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=False, default=None, parameter_name="action_member_id", @@ -435,11 +418,11 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr default=False, required=False, ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="status", description="The desired status of the action.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] required=False, default=None, parameter_name="status", @@ -471,7 +454,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe ) ] else: - user_actions=[ + user_actions = [ action async for action in await AssinedCommitteeAction.objects.afilter( Q(status=status), discord_id=int(action_member.id), @@ -482,7 +465,9 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond( content=( f"User: {action_member.mention if ping else action_member} has no " - "in progress actions." if not status else " actions matching given filter." + "in progress actions." + if not status + else " actions matching given filter." ), ) return @@ -496,24 +481,23 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) - - @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="reassign-action", - description="Reassign the specified action to another user.", + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="reassign-action", + description="Reassign the specified action to another user.", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="action", description="The action to reassign.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] required=True, parameter_name="action_id", ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="user", description="The user to list actions for.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=True, parameter_name="str_action_member_id", ) @@ -537,7 +521,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st ) return - if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] + if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] await ctx.respond( content=( f"HEY! Action: {action_to_reassign.description} is already assigned " @@ -556,8 +540,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st if isinstance(new_action, AssinedCommitteeAction): await action_to_reassign.adelete() - - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", description="List all current actions.", ) @@ -568,11 +551,11 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st default=False, required=False, ) - @discord.option( # type: ignore[no-untyped-call, misc] + @discord.option( # type: ignore[no-untyped-call, misc] name="status", description="The desired status of the action.", input_type=str, - autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] required=False, default=None, parameter_name="status", @@ -601,7 +584,8 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] and action.status in desired_status - ] for committee in committee_members + ] + for committee in committee_members } filtered_committee_actions = { @@ -612,7 +596,8 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content="No one has any actions!") return - all_actions_message: str = "\n".join([ + all_actions_message: str = "\n".join( + [ f"\n{committee.mention if ping else committee}, Actions:" f"\n{', \n'.join(str(action.description) + f" ({AssinedCommitteeAction.Status(action.status).label})" for action in actions)}" # noqa: E501 for committee, actions in filtered_committee_actions.items() @@ -621,8 +606,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content=all_actions_message) - - @discord.message_command( # type: ignore[no-untyped-call, misc] + @discord.message_command( # type: ignore[no-untyped-call, misc] name="Action Message Author", description="Creates a new action for the message author using the message content.", ) From ad48e6744a63f685f304bdab08bdc2da0774a008 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 24 Jul 2024 14:19:16 +0100 Subject: [PATCH 090/155] line breaks --- cogs/committee_actions_tracking.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 47019819..66dd232c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -33,6 +33,7 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): description="Add, list, remove and reassign tracked committee-actions.", ) + @staticmethod async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that generates a set of selectable committee members.""" @@ -43,6 +44,7 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> for member in committee_role.members if not member.bot } + @staticmethod async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that provides a set of actions that belong to the user.""" @@ -66,6 +68,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se for action in filtered_user_actions } + @staticmethod async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """Autocomplete callable that provides the set of possible Status'of actions.""" @@ -154,6 +157,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ) return action + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="create", description="Adds a new action with the specified description.", @@ -193,6 +197,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * await self._create_action(ctx, action_user, action_description, silent=False) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-status", description="Update the status of the provided action.", @@ -248,6 +253,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-description", description="Update the description of the provided action.", @@ -297,6 +303,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await ctx.respond(content="Action description updated!") + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-random-user", description="Creates an action object with the specified description and random user.", @@ -334,6 +341,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await self._create_action(ctx, action_user, action_description, silent=False) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", description="Creates an action with the description for every committee member", @@ -398,6 +406,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr await ctx.respond(content=response_message) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-user-actions", description="Lists all actions for a specified user", @@ -481,6 +490,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="reassign-action", description="Reassign the specified action to another user.", @@ -540,6 +550,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st if isinstance(new_action, AssinedCommitteeAction): await action_to_reassign.adelete() + @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", description="List all current actions.", @@ -606,6 +617,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content=all_actions_message) + @discord.message_command( # type: ignore[no-untyped-call, misc] name="Action Message Author", description="Creates a new action for the message author using the message content.", From 44d7bcec369786fdd5d94bf079afabfbe1b45cae Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 24 Jul 2024 14:20:38 +0100 Subject: [PATCH 091/155] missing space --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 66dd232c..3373c9e4 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -71,7 +71,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se @staticmethod async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 - """Autocomplete callable that provides the set of possible Status'of actions.""" + """Autocomplete callable that provides the set of possible Status' of actions.""" status_options: list[tuple[str, str]] = ( AssinedCommitteeAction._meta.get_field("status").__dict__["_choices"] ) From 9e269e97433a589cdd96f5181cd3fce77fc66fa0 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 25 Jul 2024 20:18:22 +0100 Subject: [PATCH 092/155] remove bad code --- cogs/committee_actions_tracking.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 3373c9e4..20108df4 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -131,7 +131,6 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco create_action_error, ) await self.bot.close() - return "" # NOTE: this should never be called due to the close() call above, but is here just to be absolutely certain nothing else will be executed. DUPLICATE_ACTION_MESSAGE: Final[str] = ( f"User: {action_user} already has an action " From 3af7cf88c6eefd0db16e1f28e62c6edf0b6854f7 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 00:41:06 +0100 Subject: [PATCH 093/155] adjust autocomplete --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 20108df4..41ed0262 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -40,7 +40,7 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> committee_role: discord.Role = await ctx.bot.committee_role return { - discord.OptionChoice(name=member.name, value=str(member.id)) + discord.OptionChoice(name=str(member), value=str(member.id)) for member in committee_role.members if not member.bot } From a8d8296787ae6ed83b444abe255b20b35dad7ef9 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 09:54:52 +0100 Subject: [PATCH 094/155] formatting --- cogs/committee_actions_tracking.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 41ed0262..aeb5f7e8 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -33,7 +33,6 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): description="Add, list, remove and reassign tracked committee-actions.", ) - @staticmethod async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that generates a set of selectable committee members.""" @@ -592,7 +591,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st committee_actions: dict[discord.Member, list[AssinedCommitteeAction]] = { committee: [ action for action in actions - if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] + if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] and action.status in desired_status ] for committee in committee_members From 218c3a8b2f53106a1c8c856de8713c2b50c93583 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:13:09 +0100 Subject: [PATCH 095/155] add user ID check --- cogs/committee_actions_tracking.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index aeb5f7e8..ad09736f 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -189,9 +189,17 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * """ member_id: str = action_member_id if action_member_id else str(ctx.user.id) - action_user: discord.Member = await self.bot.get_member_from_str_id( - member_id, - ) + try: + action_user: discord.Member = await self.bot.get_member_from_str_id( + member_id, + ) + except ValueError: + await ctx.respond(f":warning: The user ID provided: {member_id}, was not valid.") + logger.debug( + "User: %s, tried to create an action with an invalid user ID: %s", + ctx.user, + member_id, + ) await self._create_action(ctx, action_user, action_description, silent=False) From 33deaed73786beecc3d38f848ea618148fb183e7 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:16:44 +0100 Subject: [PATCH 096/155] add return and debug --- cogs/committee_actions_tracking.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ad09736f..ab58d820 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -200,6 +200,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * ctx.user, member_id, ) + return await self._create_action(ctx, action_user, action_description, silent=False) @@ -246,6 +247,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta try: new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + logger.debug("Successfully created Status: %s", new_status) except KeyError as key_error: await self.command_send_error(ctx, message=f"Invalid Action Status: {key_error}") return From 03476515d580b5b48f08bbc6db8e8468a5a24151 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:49:18 +0100 Subject: [PATCH 097/155] fix validation --- cogs/committee_actions_tracking.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ab58d820..8a700bff 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -194,7 +194,10 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * member_id, ) except ValueError: - await ctx.respond(f":warning: The user ID provided: {member_id}, was not valid.") + await ctx.respond( + content=f":warning: The user ID provided: {member_id}, was not valid.", + ephemeral=True, + ) logger.debug( "User: %s, tried to create an action with an invalid user ID: %s", ctx.user, @@ -245,15 +248,16 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ) return + new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + try: - new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) - logger.debug("Successfully created Status: %s", new_status) - except KeyError as key_error: - await self.command_send_error(ctx, message=f"Invalid Action Status: {key_error}") + action.status = new_status + except ValidationError as invalid_status: + await ctx.respond(content=f"{new_status} is not a valid status!") + logger.debug(invalid_status) + logger.debug(new_status) return - action.status = new_status - await action.asave() await ctx.respond( From 5895c57514bf66bdf73dc0dd32b78172f68af0ab Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:52:43 +0100 Subject: [PATCH 098/155] and again --- cogs/committee_actions_tracking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8a700bff..43a55246 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -250,16 +250,16 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + action.status = new_status + try: - action.status = new_status + await action.asave() except ValidationError as invalid_status: await ctx.respond(content=f"{new_status} is not a valid status!") logger.debug(invalid_status) logger.debug(new_status) return - await action.asave() - await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", ephemeral=True, From 177edbcbf90f65466176d5f0f97b578472190c2d Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:14:11 +0100 Subject: [PATCH 099/155] how about this --- cogs/committee_actions_tracking.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 43a55246..20aa9cb7 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -248,13 +248,11 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ) return - new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) - - action.status = new_status - try: + new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + action.status = new_status await action.asave() - except ValidationError as invalid_status: + except (ValidationError, KeyError) as invalid_status: await ctx.respond(content=f"{new_status} is not a valid status!") logger.debug(invalid_status) logger.debug(new_status) From 0ccfe7aa21393cb060b661f5f2a55ee1f37ea9ef Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:17:11 +0100 Subject: [PATCH 100/155] add validation --- cogs/committee_actions_tracking.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 20aa9cb7..b72d6dd8 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -252,6 +252,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) action.status = new_status await action.asave() + await action.full_clean() except (ValidationError, KeyError) as invalid_status: await ctx.respond(content=f"{new_status} is not a valid status!") logger.debug(invalid_status) From 756635a227dc48a6f3fd954d4fcc6c08aa9a64a5 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:10 +0100 Subject: [PATCH 101/155] remove await --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index b72d6dd8..8a2ec6f1 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -252,7 +252,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) action.status = new_status await action.asave() - await action.full_clean() + action.full_clean() except (ValidationError, KeyError) as invalid_status: await ctx.respond(content=f"{new_status} is not a valid status!") logger.debug(invalid_status) From 22de344269bfd50c8c2d0d3a33dff0a98c7a643d Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:46:50 +0100 Subject: [PATCH 102/155] add more debug logs --- cogs/committee_actions_tracking.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 8a2ec6f1..cafbb18d 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -250,15 +250,21 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta try: new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + logger.debug("Has the error triggered yet?") action.status = new_status + logger.debug("How about now?") await action.asave() + logger.debug("Now?") action.full_clean() + logger.debug("NOW??!") except (ValidationError, KeyError) as invalid_status: await ctx.respond(content=f"{new_status} is not a valid status!") logger.debug(invalid_status) logger.debug(new_status) return + logger.debug("WHAT THE FUCK!?") + await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", ephemeral=True, From 610357bf9f1fd815e5f2a1bbdd4eea34cd28faeb Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:52:19 +0100 Subject: [PATCH 103/155] what the fuck --- cogs/committee_actions_tracking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index cafbb18d..5f728556 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -249,6 +249,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta return try: + logger.debug("WHAT?!?!?!") new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) logger.debug("Has the error triggered yet?") action.status = new_status @@ -257,7 +258,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta logger.debug("Now?") action.full_clean() logger.debug("NOW??!") - except (ValidationError, KeyError) as invalid_status: + except Exception as invalid_status: await ctx.respond(content=f"{new_status} is not a valid status!") logger.debug(invalid_status) logger.debug(new_status) From 746af635b46bad0e47d2cbeef8eb1e33a709027e Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 20:58:52 +0100 Subject: [PATCH 104/155] what is going on --- cogs/committee_actions_tracking.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 5f728556..1323bf86 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -251,6 +251,8 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta try: logger.debug("WHAT?!?!?!") new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + await ctx.respond(new_status) + await self.bot.close() logger.debug("Has the error triggered yet?") action.status = new_status logger.debug("How about now?") From 82d20d6bdef0280ec68c037b8b456a24db3e3458 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:07:01 +0100 Subject: [PATCH 105/155] try something else --- cogs/committee_actions_tracking.py | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 1323bf86..a1180df9 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -249,24 +249,27 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta return try: - logger.debug("WHAT?!?!?!") new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) - await ctx.respond(new_status) - await self.bot.close() - logger.debug("Has the error triggered yet?") - action.status = new_status - logger.debug("How about now?") - await action.asave() - logger.debug("Now?") - action.full_clean() - logger.debug("NOW??!") - except Exception as invalid_status: - await ctx.respond(content=f"{new_status} is not a valid status!") + except (ValueError, KeyError) as invalid_status: + await self.command_send_error( + ctx, + message=f"Status ({status}) provided was not valid or could not be found.", + ) logger.debug(invalid_status) - logger.debug(new_status) return - logger.debug("WHAT THE FUCK!?") + if not new_status: + await self.command_send_error( + ctx, + message=f"Status ({status}) provided was not valid or could not be found.", + ) + return + + action.status = new_status + + await action.asave() + + action.full_clean() await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", From 9e1518bc57e977ed7f3d2f47ed247b48030f6a3d Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:13:18 +0100 Subject: [PATCH 106/155] fix --- cogs/committee_actions_tracking.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index a1180df9..06a090b2 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -269,8 +269,6 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta await action.asave() - action.full_clean() - await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", ephemeral=True, From a3b64ab40bcf1624a9b5b15a24050c879c2f72ad Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 00:17:56 +0100 Subject: [PATCH 107/155] remove extra newlines --- cogs/committee_actions_tracking.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 06a090b2..1bfde8e5 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -43,7 +43,6 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> for member in committee_role.members if not member.bot } - @staticmethod async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 """Autocomplete callable that provides a set of actions that belong to the user.""" @@ -67,7 +66,6 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se for action in filtered_user_actions } - @staticmethod async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """Autocomplete callable that provides the set of possible Status' of actions.""" @@ -81,7 +79,6 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[ return {discord.OptionChoice(name=value, value=code) for code, value in status_options} - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssinedCommitteeAction | str: # noqa: E501 """ Create the action object with the given description for the given user. @@ -155,7 +152,6 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco ) return action - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="create", description="Adds a new action with the specified description.", @@ -207,7 +203,6 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * await self._create_action(ctx, action_user, action_description, silent=False) - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-status", description="Update the status of the provided action.", @@ -274,7 +269,6 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-description", description="Update the description of the provided action.", @@ -324,7 +318,6 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await ctx.respond(content="Action description updated!") - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-random-user", description="Creates an action object with the specified description and random user.", @@ -362,7 +355,6 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await self._create_action(ctx, action_user, action_description, silent=False) - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", description="Creates an action with the description for every committee member", @@ -427,7 +419,6 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr await ctx.respond(content=response_message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-user-actions", description="Lists all actions for a specified user", @@ -511,7 +502,6 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="reassign-action", description="Reassign the specified action to another user.", @@ -571,7 +561,6 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, st if isinstance(new_action, AssinedCommitteeAction): await action_to_reassign.adelete() - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all-actions", description="List all current actions.", @@ -638,7 +627,6 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content=all_actions_message) - @discord.message_command( # type: ignore[no-untyped-call, misc] name="Action Message Author", description="Creates a new action for the message author using the message content.", From dd9635b864c7cfda19c1f53fb506ad7fe61b5f8b Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 00:20:45 +0100 Subject: [PATCH 108/155] refactor --- cogs/committee_actions_tracking.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 1bfde8e5..22697ffe 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -593,10 +593,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st desired_status: list[str] = [] - if status: - desired_status += status - else: - desired_status += "NS", "IP", "B" + desired_status += status if status else ("NS", "IP", "B") committee_members: list[discord.Member] = committee_role.members From f804f6cac7c0708a78ff6e3945e2874f0321c032 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 00:23:14 +0100 Subject: [PATCH 109/155] cleanup status --- cogs/committee_actions_tracking.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 22697ffe..90aac127 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -591,9 +591,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st action async for action in AssinedCommitteeAction.objects.select_related().all() ] - desired_status: list[str] = [] - - desired_status += status if status else ("NS", "IP", "B") + desired_status: list[str] = [status if status else "NS", "IP", "B"] committee_members: list[discord.Member] = committee_role.members From fc3f5586eb5d6fee8db3dcec3575d7cff564dc0a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 00:28:34 +0100 Subject: [PATCH 110/155] fixes --- cogs/committee_actions_tracking.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 90aac127..008e73f3 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -258,6 +258,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ctx, message=f"Status ({status}) provided was not valid or could not be found.", ) + logger.debug("An invalid status was provided but did not raise an exception.") return action.status = new_status @@ -488,7 +489,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe f"User: {action_member.mention if ping else action_member} has no " "in progress actions." if not status - else " actions matching given filter." + else "actions matching given filter." ), ) return @@ -520,14 +521,14 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe input_type=str, autocomplete=discord.utils.basic_autocomplete(autocomplete_get_committee_members), # type: ignore[arg-type] required=True, - parameter_name="str_action_member_id", + parameter_name="member_id", ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, str_action_member_id: str) -> None: # noqa: E501 + async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, member_id: str) -> None: # noqa: E501 """Reassign the specified action to the specified user.""" new_user_to_action: discord.Member = await self.bot.get_member_from_str_id( - str_action_member_id, + member_id, ) new_user_to_action_hash: str = DiscordMember.hash_discord_id(new_user_to_action.id) From fbfaac43cedf92432dd024af47fa60735fad81a4 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 13:04:18 +0100 Subject: [PATCH 111/155] fix list --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 008e73f3..d49d560b 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -592,7 +592,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st action async for action in AssinedCommitteeAction.objects.select_related().all() ] - desired_status: list[str] = [status if status else "NS", "IP", "B"] + desired_status: list[str] = [status] if status else ["NS", "IP", "B"] committee_members: list[discord.Member] = committee_role.members From e2d5c8c45aef844d949fa9e8526138b8fc6a4319 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 13:30:08 +0100 Subject: [PATCH 112/155] add delete command and fix typo --- cogs/committee_actions_tracking.py | 85 +++++++++++++++++++++--------- cogs/delete_all.py | 4 +- db/core/models/__init__.py | 2 +- 3 files changed, 63 insertions(+), 28 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index d49d560b..786044a3 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -14,7 +14,7 @@ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from django.db.models import Q -from db.core.models import AssinedCommitteeAction, DiscordMember +from db.core.models import AssignedCommitteeAction, DiscordMember from utils import ( CommandChecks, TeXBotApplicationContext, @@ -54,8 +54,8 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se str(ctx.interaction.user.id), ) - filtered_user_actions: list[AssinedCommitteeAction] = [ - action async for action in await AssinedCommitteeAction.objects.afilter( + filtered_user_actions: list[AssignedCommitteeAction] = [ + action async for action in await AssignedCommitteeAction.objects.afilter( Q(status="IP") | Q(status="B") | Q(status="NS"), discord_id=int(interaction_user.id), ) @@ -70,7 +70,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 """Autocomplete callable that provides the set of possible Status' of actions.""" status_options: list[tuple[str, str]] = ( - AssinedCommitteeAction._meta.get_field("status").__dict__["_choices"] + AssignedCommitteeAction._meta.get_field("status").__dict__["_choices"] ) if not status_options: @@ -79,7 +79,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[ return {discord.OptionChoice(name=value, value=code) for code, value in status_options} - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssinedCommitteeAction | str: # noqa: E501 + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssignedCommitteeAction | str: # noqa: E501 """ Create the action object with the given description for the given user. @@ -108,7 +108,7 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco return f"Actions cannot be assigned to bots! ({action_user})" try: - action: AssinedCommitteeAction = await AssinedCommitteeAction.objects.acreate( + action: AssignedCommitteeAction = await AssignedCommitteeAction.objects.acreate( discord_id=int(action_user.id), description=description, ) @@ -233,8 +233,8 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta sets the status of the provided action to be the provided status. """ try: - action: AssinedCommitteeAction = ( - await AssinedCommitteeAction.objects.select_related().aget(id=action_id) + action: AssignedCommitteeAction = ( + await AssignedCommitteeAction.objects.select_related().aget(id=action_id) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -244,7 +244,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta return try: - new_status: AssinedCommitteeAction.Status = AssinedCommitteeAction.Status(status) + new_status: AssignedCommitteeAction.Status = AssignedCommitteeAction.Status(status) except (ValueError, KeyError) as invalid_status: await self.command_send_error( ctx, @@ -303,8 +303,8 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str return try: - action: AssinedCommitteeAction = ( - await AssinedCommitteeAction.objects.select_related().aget(id=action_id) + action: AssignedCommitteeAction = ( + await AssignedCommitteeAction.objects.select_related().aget(id=action_id) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -387,13 +387,13 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr committee_member: discord.Member for committee_member in committee_members: - action_or_error_message: AssinedCommitteeAction | str = await self._create_action( + action_or_error_message: AssignedCommitteeAction | str = await self._create_action( ctx, committee_member, action_description, silent=True, ) - if isinstance(action_or_error_message, AssinedCommitteeAction): + if isinstance(action_or_error_message, AssignedCommitteeAction): success_members.append(committee_member) else: failed_members += action_or_error_message + "\n" @@ -466,18 +466,18 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe else: action_member = ctx.user - user_actions: list[AssinedCommitteeAction] + user_actions: list[AssignedCommitteeAction] if not status: user_actions = [ - action async for action in await AssinedCommitteeAction.objects.afilter( + action async for action in await AssignedCommitteeAction.objects.afilter( Q(status="IP") | Q(status="B") | Q(status="NS"), discord_id=int(action_member.id), ) ] else: user_actions = [ - action async for action in await AssinedCommitteeAction.objects.afilter( + action async for action in await AssignedCommitteeAction.objects.afilter( Q(status=status), discord_id=int(action_member.id), ) @@ -497,7 +497,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe actions_message: str = ( f"Found {len(user_actions)} actions for user " f"{action_member.mention if ping else action_member}:" - f"\n{"\n".join(str(action.description) + f" ({AssinedCommitteeAction.Status(action.status).label})" + f"\n{"\n".join(str(action.description) + f" ({AssignedCommitteeAction.Status(action.status).label})" for action in user_actions)}" # noqa: E501 ) @@ -533,8 +533,8 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me new_user_to_action_hash: str = DiscordMember.hash_discord_id(new_user_to_action.id) try: - action_to_reassign: AssinedCommitteeAction = ( - await AssinedCommitteeAction.objects.select_related().aget(id=action_id) + action_to_reassign: AssignedCommitteeAction = ( + await AssignedCommitteeAction.objects.select_related().aget(id=action_id) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -552,14 +552,14 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me ) return - new_action: AssinedCommitteeAction | str = await self._create_action( + new_action: AssignedCommitteeAction | str = await self._create_action( ctx, new_user_to_action, action_to_reassign.description, silent=False, ) - if isinstance(new_action, AssinedCommitteeAction): + if isinstance(new_action, AssignedCommitteeAction): await action_to_reassign.adelete() @discord.slash_command( # type: ignore[no-untyped-call, misc] @@ -588,15 +588,15 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st """List all actions.""" # NOTE: this doesn't actually list *all* actions as it is possible for non-committee to be actioned. committee_role: discord.Role = await self.bot.committee_role - actions: list[AssinedCommitteeAction] = [ - action async for action in AssinedCommitteeAction.objects.select_related().all() + actions: list[AssignedCommitteeAction] = [ + action async for action in AssignedCommitteeAction.objects.select_related().all() ] desired_status: list[str] = [status] if status else ["NS", "IP", "B"] committee_members: list[discord.Member] = committee_role.members - committee_actions: dict[discord.Member, list[AssinedCommitteeAction]] = { + committee_actions: dict[discord.Member, list[AssignedCommitteeAction]] = { committee: [ action for action in actions if str(action.discord_member) == DiscordMember.hash_discord_id(committee.id) # type: ignore[has-type] @@ -616,13 +616,48 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st all_actions_message: str = "\n".join( [ f"\n{committee.mention if ping else committee}, Actions:" - f"\n{', \n'.join(str(action.description) + f" ({AssinedCommitteeAction.Status(action.status).label})" for action in actions)}" # noqa: E501 + f"\n{', \n'.join(str(action.description) + f" ({AssignedCommitteeAction.Status(action.status).label})" for action in actions)}" # noqa: E501 for committee, actions in filtered_committee_actions.items() ], ) await ctx.respond(content=all_actions_message) + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="delete", + description="Deletes the specified action from the database completely.", + ) + @discord.option( # type: ignore[no-untyped-call, misc] + name="action", + description="The action to delete.", + input_type=str, + autocomplete=discord.utils.basic_autocomplete(autocomplete_get_user_action_ids), # type: ignore[arg-type] + required=True, + parameter_name="action_id", + ) + async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> None: + """ + Definition & callback response of the "delete" command. + + Takes in an action as an argument and deletes it from the database. + """ + try: + action: AssignedCommitteeAction = ( + await AssignedCommitteeAction.objects.select_related().aget(id=action_id) + ) + except (ObjectDoesNotExist, MultipleObjectsReturned): + await self.command_send_error( + ctx, + message="Action provided was either not unique or could not be found.", + ) + return + + await action.adelete() + + await ctx.respond(content="Action successfully deleted.") + + + @discord.message_command( # type: ignore[no-untyped-call, misc] name="Action Message Author", description="Creates a new action for the message author using the message content.", diff --git a/cogs/delete_all.py b/cogs/delete_all.py index de1483b9..6cac191d 100644 --- a/cogs/delete_all.py +++ b/cogs/delete_all.py @@ -7,7 +7,7 @@ import discord -from db.core.models import AssinedCommitteeAction, DiscordReminder, GroupMadeMember +from db.core.models import AssignedCommitteeAction, DiscordReminder, GroupMadeMember from db.core.models.utils import AsyncBaseModel from utils import CommandChecks, TeXBotApplicationContext, TeXBotBaseCog @@ -80,4 +80,4 @@ async def delete_all_actions(self, ctx: TeXBotApplicationContext) -> None: The "delete-all-actions" command uses the _delete_all() function to delete all `Action` instance objects stored in the database. """ - await self._delete_all(ctx, delete_model=AssinedCommitteeAction) + await self._delete_all(ctx, delete_model=AssignedCommitteeAction) diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 5af63537..ace81d39 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -27,7 +27,7 @@ from .utils import AsyncBaseModel, BaseDiscordMemberWrapper, DiscordMember -class AssinedCommitteeAction(BaseDiscordMemberWrapper): +class AssignedCommitteeAction(BaseDiscordMemberWrapper): """Model to represent an action that has been assigned to a Discord committee-member.""" class Status(models.TextChoices): From 553b370723132f8c5bc11645548161657ea1351b Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 13:30:17 +0100 Subject: [PATCH 113/155] fix spacing --- cogs/committee_actions_tracking.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 786044a3..3498dcc5 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -656,8 +656,6 @@ async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> await ctx.respond(content="Action successfully deleted.") - - @discord.message_command( # type: ignore[no-untyped-call, misc] name="Action Message Author", description="Creates a new action for the message author using the message content.", From 38971480cff1ec3e631cb93da4af15d027c829fb Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 13:33:54 +0100 Subject: [PATCH 114/155] db --- ...and_more.py => 0010_assignedcommitteeaction_and_more.py} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename db/core/migrations/{0010_assinedcommitteeaction_and_more.py => 0010_assignedcommitteeaction_and_more.py} (90%) diff --git a/db/core/migrations/0010_assinedcommitteeaction_and_more.py b/db/core/migrations/0010_assignedcommitteeaction_and_more.py similarity index 90% rename from db/core/migrations/0010_assinedcommitteeaction_and_more.py rename to db/core/migrations/0010_assignedcommitteeaction_and_more.py index 70e5baf5..16907d02 100644 --- a/db/core/migrations/0010_assinedcommitteeaction_and_more.py +++ b/db/core/migrations/0010_assignedcommitteeaction_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-07-23 22:41 +# Generated by Django 5.0.7 on 2024-07-28 12:33 import db.core.models.managers import django.db.models.deletion @@ -13,7 +13,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='AssinedCommitteeAction', + name='AssignedCommitteeAction', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', models.TextField(max_length=200, verbose_name='Description')), @@ -28,7 +28,7 @@ class Migration(migrations.Migration): ], ), migrations.AddConstraint( - model_name='assinedcommitteeaction', + model_name='assignedcommitteeaction', constraint=models.UniqueConstraint(fields=('discord_member', 'description'), name='unique_user_action'), ), ] From ccdec44a9322843a9a632402db21c182d254c2a2 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 13:42:49 +0100 Subject: [PATCH 115/155] add action_id checking --- cogs/committee_actions_tracking.py | 44 +++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 3498dcc5..3f70a288 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -232,9 +232,18 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta Takes in an action object and a Status string, sets the status of the provided action to be the provided status. """ + try: + action_id_int: int = int(action_id) + except ValueError: + await self.command_send_error( + ctx, + message="Action ID entered was not valid! Please use the autocomplete.", + logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", + ) + try: action: AssignedCommitteeAction = ( - await AssignedCommitteeAction.objects.select_related().aget(id=action_id) + await AssignedCommitteeAction.objects.select_related().aget(id=action_id_int) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -302,9 +311,18 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str ) return + try: + action_id_int: int = int(action_id) + except ValueError: + await self.command_send_error( + ctx, + message="Action ID entered was not valid! Please use the autocomplete.", + logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", + ) + try: action: AssignedCommitteeAction = ( - await AssignedCommitteeAction.objects.select_related().aget(id=action_id) + await AssignedCommitteeAction.objects.select_related().aget(id=action_id_int) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -527,6 +545,15 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe @CommandChecks.check_interaction_user_in_main_guild async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, member_id: str) -> None: # noqa: E501 """Reassign the specified action to the specified user.""" + try: + action_id_int: int = int(action_id) + except ValueError: + await self.command_send_error( + ctx, + message="Action ID entered was not valid! Please use the autocomplete.", + logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", + ) + new_user_to_action: discord.Member = await self.bot.get_member_from_str_id( member_id, ) @@ -534,7 +561,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me try: action_to_reassign: AssignedCommitteeAction = ( - await AssignedCommitteeAction.objects.select_related().aget(id=action_id) + await AssignedCommitteeAction.objects.select_related().aget(id=action_id_int) ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( @@ -641,9 +668,18 @@ async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> Takes in an action as an argument and deletes it from the database. """ + try: + action_id_int: int = int(action_id) + except ValueError: + await self.command_send_error( + ctx, + message="Action ID entered was not valid! Please use the autocomplete.", + logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", + ) + try: action: AssignedCommitteeAction = ( - await AssignedCommitteeAction.objects.select_related().aget(id=action_id) + await AssignedCommitteeAction.objects.select_related().aget(id=action_id_int) ) except (ObjectDoesNotExist, MultipleObjectsReturned): await self.command_send_error( From 504ff9059fa5df9651c5ace89882a3183b311470 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 13:54:41 +0100 Subject: [PATCH 116/155] implement admin check --- cogs/committee_actions_tracking.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 3f70a288..d86b1f76 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -54,6 +54,25 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se str(ctx.interaction.user.id), ) + admin_role: discord.Role | None = discord.utils.get( + ctx.bot.main_guild.roles, + name="Admin", + ) + + if admin_role and admin_role in interaction_user.roles: + all_actions: list[AssignedCommitteeAction] = [ + action + async for action in AssignedCommitteeAction.objects.select_related().all() + ] + + return { + discord.OptionChoice( + name=f"{action.description} ({action.status})", + value=str(action.id), + ) + for action in all_actions + } + filtered_user_actions: list[AssignedCommitteeAction] = [ action async for action in await AssignedCommitteeAction.objects.afilter( Q(status="IP") | Q(status="B") | Q(status="NS"), From 9d017d87e63c45d1a7799ddf76ba3e6416cfd9c8 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 14:06:49 +0100 Subject: [PATCH 117/155] improve error handling --- cogs/committee_actions_tracking.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index d86b1f76..248cba21 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -387,9 +387,14 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip ) return - action_user: discord.Member = committee_members[ - random.randint(0, len(committee_members)) - ] + try: + index: int = random.randint(0, len(committee_members)) + action_user: discord.Member = committee_members[index] + except IndexError: + logger.debug("Index: %s was out of range! Printing list...", index) + logger.debug(committee_members) + await self.command_send_error(ctx, message="Index out of range... check the logs!") + return await self._create_action(ctx, action_user, action_description, silent=False) From ee83b147c9f2ed847d8e3bf2cc08e22ca938e067 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 28 Jul 2024 14:15:47 +0100 Subject: [PATCH 118/155] TEMPORARY REVERT LATERgit pushgit push --- cogs/committee_actions_tracking.py | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 248cba21..90068d8c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -747,3 +747,38 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di actioned_message_text, silent=False, ) + + + @discord.slash_command( # type: ignore[no-untyped-call, misc] + name="admin-toggle", + description="Toggles if the user has the admin role or not.", + ) + async def admin_toggle(self, ctx: TeXBotApplicationContext) -> None: + """Toggle the user admin status.""" + admin_role: discord.Role | None = discord.utils.get( + self.bot.main_guild.roles, + name="Admin", + ) + + if not admin_role: + await ctx.respond(content="Couldn't find the admin role!!") + return + + interaction_user: discord.Member = ctx.user + + if admin_role in interaction_user.roles: + await interaction_user.remove_roles( + admin_role, + reason=f"{interaction_user} executed TeX-Bot slash-command \"admin-toggle\"", + ) + await ctx.respond(content="Removed your admin role!") + return + + await interaction_user.add_roles( + admin_role, + reason=f"{interaction_user} executed TeX-Bot slash-command \"admin-toggle\"", + ) + + await ctx.respond(content="Given you the admin role!!") + + From 7c97efec5b5e67b87aa8d7cb0bd1b7a5ef081a6e Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 29 Jul 2024 22:26:01 +0100 Subject: [PATCH 119/155] fix mypy errors --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 90068d8c..048313f5 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -68,7 +68,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se return { discord.OptionChoice( name=f"{action.description} ({action.status})", - value=str(action.id), + value=str(action.id), # type: ignore[attr-defined] ) for action in all_actions } @@ -81,7 +81,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se ] return { - discord.OptionChoice(name=action.description, value=str(action.id)) + discord.OptionChoice(name=action.description, value=str(action.id)) # type: ignore[attr-defined] for action in filtered_user_actions } From a41759c59fdc2a7f216140928035f0b699c9800a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Mon, 29 Jul 2024 22:32:18 +0100 Subject: [PATCH 120/155] more mypy fixes --- cogs/committee_actions_tracking.py | 4 ++-- cogs/strike.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 048313f5..90068d8c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -68,7 +68,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se return { discord.OptionChoice( name=f"{action.description} ({action.status})", - value=str(action.id), # type: ignore[attr-defined] + value=str(action.id), ) for action in all_actions } @@ -81,7 +81,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se ] return { - discord.OptionChoice(name=action.description, value=str(action.id)) # type: ignore[attr-defined] + discord.OptionChoice(name=action.description, value=str(action.id)) for action in filtered_user_actions } diff --git a/cogs/strike.py b/cogs/strike.py index 6e59e2f5..3f891925 100644 --- a/cogs/strike.py +++ b/cogs/strike.py @@ -505,7 +505,7 @@ async def _confirm_manual_add_strike(self, strike_user: discord.User | discord.M str(fetch_log_channel_error), ) from fetch_log_channel_error - member_strikes: DiscordMemberStrikes = ( # type: ignore[assignment] + member_strikes: DiscordMemberStrikes = ( await DiscordMemberStrikes.objects.aget_or_create( discord_id=strike_user.id, ) From 2f2e27fba4e06f6a881e6684a555beb38318e427 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:44:23 +0100 Subject: [PATCH 121/155] add db requirements --- db/core/migrations/0010_assignedcommitteeaction_and_more.py | 2 +- db/core/models/__init__.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/db/core/migrations/0010_assignedcommitteeaction_and_more.py b/db/core/migrations/0010_assignedcommitteeaction_and_more.py index 16907d02..5dedb669 100644 --- a/db/core/migrations/0010_assignedcommitteeaction_and_more.py +++ b/db/core/migrations/0010_assignedcommitteeaction_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-07-28 12:33 +# Generated by Django 5.0.7 on 2024-07-31 23:44 import db.core.models.managers import django.db.models.deletion diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 72b2560e..bf706363 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -58,6 +58,8 @@ class Status(models.TextChoices): max_length=2, choices=Status, default=Status.NOT_STARTED, + null=False, + blank=False, ) class Meta: verbose_name = "Assigned Committee Action" From 7c0a8b73aebfcf84e7febfd4db2cc456864891a1 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:40:56 +0100 Subject: [PATCH 122/155] fix some stuff --- cogs/committee_actions_tracking.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 90068d8c..7a17441a 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -7,6 +7,7 @@ import logging import random +from collections.abc import Set from logging import Logger from typing import Final @@ -15,6 +16,7 @@ from django.db.models import Q from db.core.models import AssignedCommitteeAction, DiscordMember +from exceptions import CommitteeRoleDoesNotExistError from utils import ( CommandChecks, TeXBotApplicationContext, @@ -34,9 +36,12 @@ class CommitteeActionsTrackingCog(TeXBotBaseCog): ) @staticmethod - async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> Set[discord.OptionChoice] | Set[str]: # noqa: E501 """Autocomplete callable that generates a set of selectable committee members.""" - committee_role: discord.Role = await ctx.bot.committee_role + try: + committee_role: discord.Role = await ctx.bot.committee_role + except CommitteeRoleDoesNotExistError: + return set() return { discord.OptionChoice(name=str(member), value=str(member.id)) @@ -44,15 +49,20 @@ async def autocomplete_get_committee_members(ctx: TeXBotAutocompleteContext) -> } @staticmethod - async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501 + async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Set[discord.OptionChoice] | Set[str]: # noqa: E501 """Autocomplete callable that provides a set of actions that belong to the user.""" if not ctx.interaction.user: logger.debug("User actions autocomplete did not have an interaction user!!") return set() - interaction_user: discord.Member = await ctx.bot.get_member_from_str_id( - str(ctx.interaction.user.id), - ) + try: + interaction_user: discord.Member = await ctx.bot.get_member_from_str_id( + str(ctx.interaction.user.id), + ) + except ValueError: + logger.debug("User action ID autocomplete could not acquire an interaction user!") + return set() + admin_role: discord.Role | None = discord.utils.get( ctx.bot.main_guild.roles, @@ -86,10 +96,10 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> se } @staticmethod - async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> set[discord.OptionChoice]: # noqa: E501, ARG004 + async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> Set[discord.OptionChoice] | Set[str]: # noqa: E501, ARG004 """Autocomplete callable that provides the set of possible Status' of actions.""" - status_options: list[tuple[str, str]] = ( - AssignedCommitteeAction._meta.get_field("status").__dict__["_choices"] + status_options: Sequence[tuple[str, str]] = ( + AssignedCommitteeAction._meta.get_field("status").choices # type: ignore[assignment] ) if not status_options: From 3a81f1b48062ce6cda8e1ee854d52dab4b24de07 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:54:33 +0100 Subject: [PATCH 123/155] more fixes --- cogs/committee_actions_tracking.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 7a17441a..ca7be123 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -473,7 +473,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr await ctx.respond(content=response_message) @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="list-user-actions", + name="list", description="Lists all actions for a specified user", ) @discord.option( # type: ignore[no-untyped-call, misc] @@ -505,7 +505,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr @CommandChecks.check_interaction_user_in_main_guild async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_member_id: str, ping: bool, status: str) -> None: # noqa: E501 """ - Definition and callback of the list user actions command. + Definition and callback of the "/list" command. Takes in a user and lists out their current actions. """ @@ -556,7 +556,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="reassign-action", + name="reassign", description="Reassign the specified action to another user.", ) @discord.option( # type: ignore[no-untyped-call, misc] @@ -624,7 +624,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me await action_to_reassign.adelete() @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="list-all-actions", + name="list-all", description="List all current actions.", ) @discord.option( # type: ignore[no-untyped-call, misc] @@ -635,8 +635,8 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me required=False, ) @discord.option( # type: ignore[no-untyped-call, misc] - name="status", - description="The desired status of the action.", + name="status-filter", + description="The filter to apply to the status of actions.", input_type=str, autocomplete=discord.utils.basic_autocomplete(autocomplete_get_action_status), # type: ignore[arg-type] required=False, @@ -701,6 +701,8 @@ async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> Definition & callback response of the "delete" command. Takes in an action as an argument and deletes it from the database. + This command should be used for administrative purposes only, in most circumstances + the update-status command should be used. """ try: action_id_int: int = int(action_id) @@ -758,7 +760,7 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di silent=False, ) - +# NOTE: EVERYTHING BELOW THIS LINE MUST BE DELETED BEFORE MERGE @discord.slash_command( # type: ignore[no-untyped-call, misc] name="admin-toggle", description="Toggles if the user has the admin role or not.", From 69f447e9ab694c942e254ab399a6d80e01c73cab Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:56:02 +0100 Subject: [PATCH 124/155] refactor cog name --- cogs/__init__.py | 6 +++--- cogs/committee_actions_tracking.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cogs/__init__.py b/cogs/__init__.py index 6cc63853..5569bcaf 100644 --- a/cogs/__init__.py +++ b/cogs/__init__.py @@ -11,7 +11,7 @@ "ArchiveCommandCog", "GetTokenAuthorisationCommandCog", "CommandErrorCog", - "CommitteeActionsTrackingCog", + "CommitteeActionsTrackingCommandsCog", "DeleteAllCommandsCog", "EditMessageCommandCog", "EnsureMembersInductedCommandCog", @@ -52,7 +52,7 @@ ) from .archive import ArchiveCommandCog from .command_error import CommandErrorCog -from .committee_actions_tracking import CommitteeActionsTrackingCog +from .committee_actions_tracking import CommitteeActionsTrackingCommandsCog from .delete_all import DeleteAllCommandsCog from .edit_message import EditMessageCommandCog from .get_token_authorisation import GetTokenAuthorisationCommandCog @@ -87,7 +87,7 @@ def setup(bot: TeXBot) -> None: ArchiveCommandCog, GetTokenAuthorisationCommandCog, CommandErrorCog, - CommitteeActionsTrackingCog, + CommitteeActionsTrackingCommandsCog, DeleteAllCommandsCog, EditMessageCommandCog, EnsureMembersInductedCommandCog, diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index ca7be123..e07263e9 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -2,7 +2,7 @@ from collections.abc import Sequence -__all__: Sequence[str] = ("CommitteeActionsTrackingCog",) +__all__: Sequence[str] = ("CommitteeActionsTrackingCommandsCog",) import logging @@ -27,7 +27,7 @@ logger: Final[Logger] = logging.getLogger("TeX-Bot") -class CommitteeActionsTrackingCog(TeXBotBaseCog): +class CommitteeActionsTrackingCommandsCog(TeXBotBaseCog): """Cog class that defines the committee-actions tracking functionality.""" committee_actions: discord.SlashCommandGroup = discord.SlashCommandGroup( From 38cef6fb1d411763b9a0f43947e4439153b718fc Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 1 Aug 2024 02:12:13 +0100 Subject: [PATCH 125/155] refactor cogs more --- cogs/__init__.py | 11 +- cogs/committee_actions_tracking.py | 164 ++++++++++++++++------------- 2 files changed, 96 insertions(+), 79 deletions(-) diff --git a/cogs/__init__.py b/cogs/__init__.py index 5569bcaf..3119b4dc 100644 --- a/cogs/__init__.py +++ b/cogs/__init__.py @@ -11,7 +11,8 @@ "ArchiveCommandCog", "GetTokenAuthorisationCommandCog", "CommandErrorCog", - "CommitteeActionsTrackingCommandsCog", + "CommitteeActionsTrackingSlashCommandsCog", + "CommitteeActionsTrackingContextCommandsCog", "DeleteAllCommandsCog", "EditMessageCommandCog", "EnsureMembersInductedCommandCog", @@ -52,7 +53,10 @@ ) from .archive import ArchiveCommandCog from .command_error import CommandErrorCog -from .committee_actions_tracking import CommitteeActionsTrackingCommandsCog +from .committee_actions_tracking import ( + CommitteeActionsTrackingContextCommandsCog, + CommitteeActionsTrackingSlashCommandsCog, +) from .delete_all import DeleteAllCommandsCog from .edit_message import EditMessageCommandCog from .get_token_authorisation import GetTokenAuthorisationCommandCog @@ -87,7 +91,8 @@ def setup(bot: TeXBot) -> None: ArchiveCommandCog, GetTokenAuthorisationCommandCog, CommandErrorCog, - CommitteeActionsTrackingCommandsCog, + CommitteeActionsTrackingSlashCommandsCog, + CommitteeActionsTrackingContextCommandsCog, DeleteAllCommandsCog, EditMessageCommandCog, EnsureMembersInductedCommandCog, diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index e07263e9..1879b03d 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -2,7 +2,11 @@ from collections.abc import Sequence -__all__: Sequence[str] = ("CommitteeActionsTrackingCommandsCog",) +__all__: Sequence[str] = ( + "CommitteeActionsTrackingBaseCog", + "CommitteeActionsTrackingSlashCommandsCog", + "CommitteeActionsTrackingContextCommandsCog", +) import logging @@ -27,8 +31,85 @@ logger: Final[Logger] = logging.getLogger("TeX-Bot") -class CommitteeActionsTrackingCommandsCog(TeXBotBaseCog): - """Cog class that defines the committee-actions tracking functionality.""" +class CommitteeActionsTrackingBaseCog(TeXBotBaseCog): + """Base cog class that defines methods for committee actions tracking.""" + + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssignedCommitteeAction | str: # noqa: E501 + """ + Create the action object with the given description for the given user. + + If action creation is successful, the Action object will be returned. + If unsuccessful, a string explaining the error will be returned. + """ + if len(description) >= 200: + if not silent: + await self.command_send_error( + ctx, + message=( + "Action description was too long! " + "Max description length is 200 characters." + ), + ) + return "Action description exceeded the maximum character limit!" + + if action_user.bot: + if not silent: + await self.command_send_error( + ctx, + message=( + "Action creation aborted because actions cannot be assigned to bots!" + ), + ) + return f"Actions cannot be assigned to bots! ({action_user})" + + try: + action: AssignedCommitteeAction = await AssignedCommitteeAction.objects.acreate( + discord_id=int(action_user.id), + description=description, + ) + except ValidationError as create_action_error: + error_is_already_exits: bool = ( + "__all__" in create_action_error.message_dict + and any( + "already exists" in error + for error in create_action_error.message_dict["__all__"] + ) + ) + if not error_is_already_exits: + await self.command_send_error(ctx, message="An unrecoverable error occured.") + logger.critical( + "Error upon creating Action object: %s", + create_action_error, + ) + await self.bot.close() + + DUPLICATE_ACTION_MESSAGE: Final[str] = ( + f"User: {action_user} already has an action " + f"with description: {description}!" + ) + if not silent: + await self.command_send_error( + ctx, + message=(DUPLICATE_ACTION_MESSAGE), + ) + logger.debug( + "Action creation for user: %s, failed because an action " + "with description: %s, already exists.", + action_user, + description, + ) + return DUPLICATE_ACTION_MESSAGE + if not silent: + await ctx.respond( + content=( + f"Action: {action.description} created for user: {action_user.mention}" + ), + ) + return action + + +class CommitteeActionsTrackingSlashCommandsCog(CommitteeActionsTrackingBaseCog): + """Cog class that defines the committee-actions tracking slash commands functionality.""" committee_actions: discord.SlashCommandGroup = discord.SlashCommandGroup( name="committee-actions", @@ -108,79 +189,6 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> Set[ return {discord.OptionChoice(name=value, value=code) for code, value in status_options} - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssignedCommitteeAction | str: # noqa: E501 - """ - Create the action object with the given description for the given user. - - If action creation is successful, the Action object will be returned. - If unsuccessful, a string explaining the error will be returned. - """ - if len(description) >= 200: - if not silent: - await self.command_send_error( - ctx, - message=( - "Action description was too long! " - "Max description length is 200 characters." - ), - ) - return "Action description exceeded the maximum character limit!" - - if action_user.bot: - if not silent: - await self.command_send_error( - ctx, - message=( - "Action creation aborted because actions cannot be assigned to bots!" - ), - ) - return f"Actions cannot be assigned to bots! ({action_user})" - - try: - action: AssignedCommitteeAction = await AssignedCommitteeAction.objects.acreate( - discord_id=int(action_user.id), - description=description, - ) - except ValidationError as create_action_error: - error_is_already_exits: bool = ( - "__all__" in create_action_error.message_dict - and any( - "already exists" in error - for error in create_action_error.message_dict["__all__"] - ) - ) - if not error_is_already_exits: - await self.command_send_error(ctx, message="An unrecoverable error occured.") - logger.critical( - "Error upon creating Action object: %s", - create_action_error, - ) - await self.bot.close() - - DUPLICATE_ACTION_MESSAGE: Final[str] = ( - f"User: {action_user} already has an action " - f"with description: {description}!" - ) - if not silent: - await self.command_send_error( - ctx, - message=(DUPLICATE_ACTION_MESSAGE), - ) - logger.debug( - "Action creation for user: %s, failed because an action " - "with description: %s, already exists.", - action_user, - description, - ) - return DUPLICATE_ACTION_MESSAGE - if not silent: - await ctx.respond( - content=( - f"Action: {action.description} created for user: {action_user.mention}" - ), - ) - return action - @discord.slash_command( # type: ignore[no-untyped-call, misc] name="create", description="Adds a new action with the specified description.", @@ -728,6 +736,10 @@ async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> await ctx.respond(content="Action successfully deleted.") + +class CommitteeActionsTrackingContextCommandsCog(CommitteeActionsTrackingBaseCog): + """Cog class to define the actions tracking message context commands.""" + @discord.message_command( # type: ignore[no-untyped-call, misc] name="Action Message Author", description="Creates a new action for the message author using the message content.", From 9f474bfd7a8a7841a0390b96cc576fdffdd433c9 Mon Sep 17 00:00:00 2001 From: Matty Widdop <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 1 Aug 2024 09:47:49 +0000 Subject: [PATCH 126/155] db changes --- .../0010_assignedcommitteeaction_and_more.py | 56 +++++++++++++++---- db/core/models/__init__.py | 12 ++-- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/db/core/migrations/0010_assignedcommitteeaction_and_more.py b/db/core/migrations/0010_assignedcommitteeaction_and_more.py index 5dedb669..1b5222a6 100644 --- a/db/core/migrations/0010_assignedcommitteeaction_and_more.py +++ b/db/core/migrations/0010_assignedcommitteeaction_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-07-31 23:44 +# Generated by Django 5.0.7 on 2024-08-01 09:43 import db.core.models.managers import django.db.models.deletion @@ -8,27 +8,61 @@ class Migration(migrations.Migration): dependencies = [ - ('core', '0009_auto_20240519_0020'), + ("core", "0009_auto_20240519_0020"), ] operations = [ migrations.CreateModel( - name='AssignedCommitteeAction', + name="AssignedCommitteeAction", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(max_length=200, verbose_name='Description')), - ('status', models.CharField(choices=[('X', 'Cancelled'), ('B', 'Blocked'), ('C', 'Complete'), ('IP', 'In Progress'), ('NS', 'Not Started')], default='NS', max_length=2)), - ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assigned_committee_actions', to='core.discordmember', verbose_name='Discord Member')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "description", + models.TextField(max_length=200, verbose_name="Description"), + ), + ( + "status", + models.CharField( + choices=[ + ("CND", "Cancelled"), + ("BLK", "Blocked"), + ("CMP", "Complete"), + ("INP", "In Progress"), + ("NST", "Not Started"), + ], + default="NST", + max_length=3, + ), + ), + ( + "discord_member", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="assigned_committee_actions", + to="core.discordmember", + verbose_name="Discord Member", + ), + ), ], options={ - 'verbose_name': 'Assigned Committee Action', + "verbose_name": "Assigned Committee Action", }, managers=[ - ('objects', db.core.models.managers.RelatedDiscordMemberManager()), + ("objects", db.core.models.managers.RelatedDiscordMemberManager()), ], ), migrations.AddConstraint( - model_name='assignedcommitteeaction', - constraint=models.UniqueConstraint(fields=('discord_member', 'description'), name='unique_user_action'), + model_name="assignedcommitteeaction", + constraint=models.UniqueConstraint( + fields=("discord_member", "description"), name="unique_user_action" + ), ), ] diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index bf706363..5a768290 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -31,11 +31,11 @@ class AssignedCommitteeAction(BaseDiscordMemberWrapper): """Model to represent an action that has been assigned to a Discord committee-member.""" class Status(models.TextChoices): - CANCELLED = "X", _("Cancelled") - BLOCKED = "B", _("Blocked") - COMPLETE = "C", _("Complete") - IN_PROGRESS = "IP", _("In Progress") - NOT_STARTED = "NS", _("Not Started") + CANCELLED = "CND", _("Cancelled") + BLOCKED = "BLK", _("Blocked") + COMPLETE = "CMP", _("Complete") + IN_PROGRESS = "INP", _("In Progress") + NOT_STARTED = "NST", _("Not Started") INSTANCES_NAME_PLURAL: str = "Assigned Committee Actions" @@ -55,7 +55,7 @@ class Status(models.TextChoices): blank=False, ) status = models.CharField( - max_length=2, + max_length=3, choices=Status, default=Status.NOT_STARTED, null=False, From d082408d83d6d9c748ee4f7325e6fd8fa707427a Mon Sep 17 00:00:00 2001 From: Matty Widdop <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 6 Aug 2024 21:18:07 +0000 Subject: [PATCH 127/155] fix old literals --- cogs/committee_actions_tracking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 1879b03d..b3687ce6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -166,7 +166,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Se filtered_user_actions: list[AssignedCommitteeAction] = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status="IP") | Q(status="B") | Q(status="NS"), + Q(status="INP") | Q(status="BLK") | Q(status="NST"), discord_id=int(interaction_user.id), ) ] @@ -531,7 +531,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe if not status: user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status="IP") | Q(status="B") | Q(status="NS"), + Q(status="INP") | Q(status="BLK") | Q(status="NST"), discord_id=int(action_member.id), ) ] @@ -661,7 +661,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st action async for action in AssignedCommitteeAction.objects.select_related().all() ] - desired_status: list[str] = [status] if status else ["NS", "IP", "B"] + desired_status: list[str] = [status] if status else ["NST", "INP", "BLK"] committee_members: list[discord.Member] = committee_role.members From 5359914c39f68e6f7b63ede0e216387a863515de Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 25 Sep 2024 02:02:18 +0100 Subject: [PATCH 128/155] update deps --- poetry.lock | 1048 ++++++++++++++++++++++++++------------------------- 1 file changed, 535 insertions(+), 513 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9fd2b859..d8f33769 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,102 +13,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.6" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:682836fc672972cc3101cc9e30d49c5f7e8f1d010478d46119fe725a4545acfd"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:289fa8a20018d0d5aa9e4b35d899bd51bcb80f0d5f365d9a23e30dac3b79159b"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8617c96a20dd57e7e9d398ff9d04f3d11c4d28b1767273a5b1a018ada5a654d3"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbeff1b062751c2a2a55b171f7050fb7073633c699299d042e962aacdbe1a07"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea35d849cdd4a9268f910bff4497baebbc1aa3f2f625fd8ccd9ac99c860c621"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473961b3252f3b949bb84873d6e268fb6d8aa0ccc6eb7404fa58c76a326bb8e1"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d2665c5df629eb2f981dab244c01bfa6cdc185f4ffa026639286c4d56fafb54"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d92f794f1332f656e3765841fc2b7ad5c26c3f3d01e8949eeb3495691cf9f4"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9bd6b2033993d5ae80883bb29b83fb2b432270bbe067c2f53cc73bb57c46065f"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d7f408c43f5e75ea1edc152fb375e8f46ef916f545fb66d4aebcbcfad05e2796"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cf8b8560aa965f87bf9c13bf9fed7025993a155ca0ce8422da74bf46d18c2f5f"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14477c4e52e2f17437b99893fd220ffe7d7ee41df5ebf931a92b8ca82e6fd094"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb138fbf9f53928e779650f5ed26d0ea1ed8b2cab67f0ea5d63afa09fdc07593"}, + {file = "aiohttp-3.10.6-cp310-cp310-win32.whl", hash = "sha256:9843d683b8756971797be171ead21511d2215a2d6e3c899c6e3107fbbe826791"}, + {file = "aiohttp-3.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:f8b8e49fe02f744d38352daca1dbef462c3874900bd8166516f6ea8e82b5aacf"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52e54fd776ad0da1006708762213b079b154644db54bcfc62f06eaa5b896402"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ab1a238fd0d19dc65f2d222e5eb064e409665c6426a3e51d5101c1979ee84"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0749c4d5a08a802dd66ecdf59b2df4d76b900004017468a7bb736c3b5a3dd902"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e05b39158f2af0e2438cc2075cfc271f4ace0c3cc4a81ec95b27a0432e161951"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f196c970db2dcde4f24317e06615363349dc357cf4d7a3b0716c20ac6d7bcd"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47647c8af04a70e07a2462931b0eba63146a13affa697afb4ecbab9d03a480ce"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c0efe7e99f6d94d63274c06344bd0e9c8daf184ce5602a29bc39e00a18720"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9721cdd83a994225352ca84cd537760d41a9da3c0eacb3ff534747ab8fba6d0"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b82c8ebed66ce182893e7c0b6b60ba2ace45b1df104feb52380edae266a4850"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b169f8e755e541b72e714b89a831b315bbe70db44e33fead28516c9e13d5f931"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0be3115753baf8b4153e64f9aa7bf6c0c64af57979aa900c31f496301b374570"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e1f80cd17d81a404b6e70ef22bfe1870bafc511728397634ad5f5efc8698df56"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6419728b08fb6380c66a470d2319cafcec554c81780e2114b7e150329b9a9a7f"}, + {file = "aiohttp-3.10.6-cp311-cp311-win32.whl", hash = "sha256:bd294dcdc1afdc510bb51d35444003f14e327572877d016d576ac3b9a5888a27"}, + {file = "aiohttp-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:bf861da9a43d282d6dd9dcd64c23a0fccf2c5aa5cd7c32024513c8c79fb69de3"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2708baccdc62f4b1251e59c2aac725936a900081f079b88843dabcab0feeeb27"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7475da7a5e2ccf1a1c86c8fee241e277f4874c96564d06f726d8df8e77683ef7"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02108326574ff60267b7b35b17ac5c0bbd0008ccb942ce4c48b657bb90f0b8aa"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:029a019627b37fa9eac5c75cc54a6bb722c4ebbf5a54d8c8c0fb4dd8facf2702"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a637d387db6fdad95e293fab5433b775fd104ae6348d2388beaaa60d08b38c4"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1a16f3fc1944c61290d33c88dc3f09ba62d159b284c38c5331868425aca426"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b292f37969f9cc54f4643f0be7dacabf3612b3b4a65413661cf6c350226787"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0754690a3a26e819173a34093798c155bafb21c3c640bff13be1afa1e9d421f9"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:164ecd32e65467d86843dbb121a6666c3deb23b460e3f8aefdcaacae79eb718a"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438c5863feb761f7ca3270d48c292c334814459f61cc12bab5ba5b702d7c9e56"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ba18573bb1de1063d222f41de64a0d3741223982dcea863b3f74646faf618ec7"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c82a94ddec996413a905f622f3da02c4359952aab8d817c01cf9915419525e95"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92351aa5363fc3c1f872ca763f86730ced32b01607f0c9662b1fa711087968d0"}, + {file = "aiohttp-3.10.6-cp312-cp312-win32.whl", hash = "sha256:3e15e33bfc73fa97c228f72e05e8795e163a693fd5323549f49367c76a6e5883"}, + {file = "aiohttp-3.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:fe517113fe4d35d9072b826c3e147d63c5f808ca8167d450b4f96c520c8a1d8d"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:482f74057ea13d387a7549d7a7ecb60e45146d15f3e58a2d93a0ad2d5a8457cd"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:03fa40d1450ee5196e843315ddf74a51afc7e83d489dbfc380eecefea74158b1"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e52e59ed5f4cc3a3acfe2a610f8891f216f486de54d95d6600a2c9ba1581f4d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b3935a22c9e41a8000d90588bed96cf395ef572dbb409be44c6219c61d900d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bef1480ee50f75abcfcb4b11c12de1005968ca9d0172aec4a5057ba9f2b644f"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:671745ea7db19693ce867359d503772177f0b20fa8f6ee1e74e00449f4c4151d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50b367308ca8c12e0b50cba5773bc9abe64c428d3fd2bbf5cd25aab37c77bf"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a504d7cdb431a777d05a124fd0b21efb94498efa743103ea01b1e3136d2e4fb"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66bc81361131763660b969132a22edce2c4d184978ba39614e8f8f95db5c95f8"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:27cf19a38506e2e9f12fc17e55f118f04897b0a78537055d93a9de4bf3022e3d"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3468b39f977a11271517c6925b226720e148311039a380cc9117b1e2258a721f"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9d26da22a793dfd424be1050712a70c0afd96345245c29aced1e35dbace03413"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:844d48ff9173d0b941abed8b2ea6a412f82b56d9ab1edb918c74000c15839362"}, + {file = "aiohttp-3.10.6-cp313-cp313-win32.whl", hash = "sha256:2dd56e3c43660ed3bea67fd4c5025f1ac1f9ecf6f0b991a6e5efe2e678c490c5"}, + {file = "aiohttp-3.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:c91781d969fbced1993537f45efe1213bd6fccb4b37bfae2a026e20d6fbed206"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4407a80bca3e694f2d2a523058e20e1f9f98a416619e04f6dc09dc910352ac8b"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cb045ec5961f51af3e2c08cd6fe523f07cc6e345033adee711c49b7b91bb954"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fabdcdc781a36b8fd7b2ca9dea8172f29a99e11d00ca0f83ffeb50958da84a1"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a9f42efcc2681790595ab3d03c0e52d01edc23a0973ea09f0dc8d295e12b8e"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cca776a440795db437d82c07455761c85bbcf3956221c3c23b8c93176c278ce7"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5582de171f0898139cf51dd9fcdc79b848e28d9abd68e837f0803fc9f30807b1"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:370e2d47575c53c817ee42a18acc34aad8da4dbdaac0a6c836d58878955f1477"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:444d1704e2af6b30766debed9be8a795958029e552fe77551355badb1944012c"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40271a2a375812967401c9ca8077de9368e09a43a964f4dce0ff603301ec9358"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f3af26f86863fad12e25395805bb0babbd49d512806af91ec9708a272b696248"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4752df44df48fd42b80f51d6a97553b482cda1274d9dc5df214a3a1aa5d8f018"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2cd5290ab66cfca2f90045db2cc6434c1f4f9fbf97c9f1c316e785033782e7d2"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3427031064b0d5c95647e6369c4aa3c556402f324a3e18107cb09517abe5f962"}, + {file = "aiohttp-3.10.6-cp38-cp38-win32.whl", hash = "sha256:614fc21e86adc28e4165a6391f851a6da6e9cbd7bb232d0df7718b453a89ee98"}, + {file = "aiohttp-3.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:58c5d7318a136a3874c78717dd6de57519bc64f6363c5827c2b1cb775bea71dd"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5db26bbca8e7968c4c977a0c640e0b9ce7224e1f4dcafa57870dc6ee28e27de6"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fb4216e3ec0dbc01db5ba802f02ed78ad8f07121be54eb9e918448cc3f61b7c"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a976ef488f26e224079deb3d424f29144c6d5ba4ded313198169a8af8f47fb82"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a86610174de8a85a920e956e2d4f9945e7da89f29a00e95ac62a4a414c4ef4e"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:217791c6a399cc4f2e6577bb44344cba1f5714a2aebf6a0bea04cfa956658284"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba3662d41abe2eab0eeec7ee56f33ef4e0b34858f38abf24377687f9e1fb00a5"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4dfa5ad4bce9ca30a76117fbaa1c1decf41ebb6c18a4e098df44298941566f9"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0009258e97502936d3bd5bf2ced15769629097d0abb81e6495fba1047824fe0"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a75d5c9fb4f06c41d029ae70ad943c3a844c40c0a769d12be4b99b04f473d3d"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8198b7c002aae2b40b2d16bfe724b9a90bcbc9b78b2566fc96131ef4e382574d"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4611db8c907f90fe86be112efdc2398cd7b4c8eeded5a4f0314b70fdea8feab0"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ff99ae06eef85c7a565854826114ced72765832ee16c7e3e766c5e4c5b98d20e"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7641920bdcc7cd2d3ddfb8bb9133a6c9536b09dbd49490b79e125180b2d25b93"}, + {file = "aiohttp-3.10.6-cp39-cp39-win32.whl", hash = "sha256:e2e7d5591ea868d5ec82b90bbeb366a198715672841d46281b623e23079593db"}, + {file = "aiohttp-3.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:b504c08c45623bf5c7ca41be380156d925f00199b3970efd758aef4a77645feb"}, + {file = "aiohttp-3.10.6.tar.gz", hash = "sha256:d2578ef941be0c2ba58f6f421a703527d08427237ed45ecb091fed6f83305336"}, ] [package.dependencies] @@ -117,7 +117,7 @@ aiosignal = ">=1.1.2" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -602,69 +602,75 @@ dev = ["coverage", "pytest (>=7.4.4)"] [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "fonttools" -version = "4.53.1" +version = "4.54.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, ] [package.extras] @@ -801,13 +807,13 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "identify" -version = "2.6.0" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, - {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -815,15 +821,18 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -837,115 +846,125 @@ files = [ [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] @@ -1027,101 +1046,103 @@ matplotlib = "*" [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {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-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, ] [[package]] @@ -1194,63 +1215,64 @@ files = [ [[package]] name = "numpy" -version = "2.1.0" +version = "2.1.1" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b"}, - {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b"}, - {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f"}, - {file = "numpy-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84"}, - {file = "numpy-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33"}, - {file = "numpy-2.1.0-cp310-cp310-win32.whl", hash = "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211"}, - {file = "numpy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e"}, - {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb"}, - {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3"}, - {file = "numpy-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36"}, - {file = "numpy-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd"}, - {file = "numpy-2.1.0-cp311-cp311-win32.whl", hash = "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"}, - {file = "numpy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8"}, - {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745"}, - {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111"}, - {file = "numpy-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0"}, - {file = "numpy-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574"}, - {file = "numpy-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02"}, - {file = "numpy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b"}, - {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195"}, - {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977"}, - {file = "numpy-2.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1"}, - {file = "numpy-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62"}, - {file = "numpy-2.1.0-cp313-cp313-win32.whl", hash = "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324"}, - {file = "numpy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d"}, - {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd"}, - {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6"}, - {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a"}, - {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2"}, - {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647"}, + {file = "numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728"}, + {file = "numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, + {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, + {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, + {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, + {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556"}, + {file = "numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b"}, + {file = "numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39"}, + {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, ] [[package]] @@ -1374,19 +1396,19 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -1423,13 +1445,13 @@ virtualenv = ">=20.10.0" [[package]] name = "py-cord" -version = "2.6.0" +version = "2.6.1" description = "A Python wrapper for the Discord API" optional = false python-versions = ">=3.8" files = [ - {file = "py_cord-2.6.0-py3-none-any.whl", hash = "sha256:906cc077904a4d478af0264ae4374b0412ed9f9ab950d0162c4f31239a906d26"}, - {file = "py_cord-2.6.0.tar.gz", hash = "sha256:bbc0349542965d05e4b18cc4424136206430a8cc911fda12a0a57df6fdf9cd9c"}, + {file = "py_cord-2.6.1-py3-none-any.whl", hash = "sha256:e3d3b528c5e37b0e0825f5b884cbb9267860976c1e4878e28b55da8fd3af834b"}, + {file = "py_cord-2.6.1.tar.gz", hash = "sha256:36064f225f2c7bbddfe542d5ed581f2a5744f618e039093cf7cd2659a58bc79b"}, ] [package.dependencies] @@ -1757,13 +1779,13 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.20240808" +version = "6.0.12.20240917" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.20240808.tar.gz", hash = "sha256:b8f76ddbd7f65440a8bda5526a9607e4c7a322dc2f8e1a8c405644f9a6f4b9af"}, - {file = "types_PyYAML-6.0.12.20240808-py3-none-any.whl", hash = "sha256:deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35"}, + {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"}, + {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"}, ] [[package]] @@ -1779,24 +1801,24 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1821,13 +1843,13 @@ crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"] [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.26.5" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, - {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, + {file = "virtualenv-20.26.5-py3-none-any.whl", hash = "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6"}, + {file = "virtualenv-20.26.5.tar.gz", hash = "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4"}, ] [package.dependencies] @@ -1852,103 +1874,103 @@ files = [ [[package]] name = "yarl" -version = "1.9.7" +version = "1.12.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.9.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:60c04415b31a1611ef5989a6084dd6f6b95652c6a18378b58985667b65b2ecb6"}, - {file = "yarl-1.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1787dcfdbe730207acb454548a6e19f80ae75e6d2d1f531c5a777bc1ab6f7952"}, - {file = "yarl-1.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5ddad20363f9f1bbedc95789c897da62f939e6bc855793c3060ef8b9f9407bf"}, - {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdb156a06208fc9645ae7cc0fca45c40dd40d7a8c4db626e542525489ca81a9"}, - {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:522fa3d300d898402ae4e0fa7c2c21311248ca43827dc362a667de87fdb4f1be"}, - {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7f9cabfb8b980791b97a3ae3eab2e38b2ba5eab1af9b7495bdc44e1ce7c89e3"}, - {file = "yarl-1.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc728857df4087da6544fc68f62d7017fa68d74201d5b878e18ed4822c31fb3"}, - {file = "yarl-1.9.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dba2ebac677184d56374fa3e452b461f5d6a03aa132745e648ae8859361eb6b"}, - {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a95167ae34667c5cc7d9206c024f793e8ffbadfb307d5c059de470345de58a21"}, - {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9d319ac113ca47352319cbea92d1925a37cb7bd61a8c2f3e3cd2e96eb33cccae"}, - {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2d71a5d818d82586ac46265ae01466e0bda0638760f18b21f1174e0dd58a9d2f"}, - {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ff03f1c1ac474c66d474929ae7e4dd195592c1c7cc8c36418528ed81b1ca0a79"}, - {file = "yarl-1.9.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78250f635f221dde97d02c57aade3313310469bc291888dfe32acd1012594441"}, - {file = "yarl-1.9.7-cp310-cp310-win32.whl", hash = "sha256:f3aaf9fa960d55bd7876d55d7ea3cc046f3660df1ff73fc1b8c520a741ed1f21"}, - {file = "yarl-1.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:e8362c941e07fbcde851597672a5e41b21dc292b7d5a1dc439b7a93c9a1af5d9"}, - {file = "yarl-1.9.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:596069ddeaf72b5eb36cd714dcd2b5751d0090d05a8d65113b582ed9e1c801fb"}, - {file = "yarl-1.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cb870907e8b86b2f32541403da9455afc1e535ce483e579bea0e6e79a0cc751c"}, - {file = "yarl-1.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ca5e86be84492fa403c4dcd4dcaf8e1b1c4ffc747b5176f7c3d09878c45719b0"}, - {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99cecfb51c84d00132db909e83ae388793ca86e48df7ae57f1be0beab0dcce5"}, - {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25508739e9b44d251172145f54c084b71747b09e4d237dc2abb045f46c36a66e"}, - {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:60f3b5aec3146b6992640592856414870f5b20eb688c1f1d5f7ac010a7f86561"}, - {file = "yarl-1.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1557456afce5db3d655b5f8a31cdcaae1f47e57958760525c44b76e812b4987"}, - {file = "yarl-1.9.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71bb1435a84688ed831220c5305d96161beb65cac4a966374475348aa3de4575"}, - {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f87d8645a7a806ec8f66aac5e3b1dcb5014849ff53ffe2a1f0b86ca813f534c7"}, - {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:58e3f01673873b8573da3abe138debc63e4e68541b2104a55df4c10c129513a4"}, - {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8af0bbd4d84f8abdd9b11be9488e32c76b1501889b73c9e2292a15fb925b378b"}, - {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7fc441408ed0d9c6d2d627a02e281c21f5de43eb5209c16636a17fc704f7d0f8"}, - {file = "yarl-1.9.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a9552367dc440870556da47bb289a806f08ad06fbc4054072d193d9e5dd619ba"}, - {file = "yarl-1.9.7-cp311-cp311-win32.whl", hash = "sha256:628619008680a11d07243391271b46f07f13b75deb9fe92ef342305058c70722"}, - {file = "yarl-1.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:bc23d870864971c8455cfba17498ccefa53a5719ea9f5fce5e7e9c1606b5755f"}, - {file = "yarl-1.9.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b"}, - {file = "yarl-1.9.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08"}, - {file = "yarl-1.9.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00"}, - {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb"}, - {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003"}, - {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48"}, - {file = "yarl-1.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755"}, - {file = "yarl-1.9.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2"}, - {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb"}, - {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c"}, - {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2"}, - {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56"}, - {file = "yarl-1.9.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b"}, - {file = "yarl-1.9.7-cp312-cp312-win32.whl", hash = "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c"}, - {file = "yarl-1.9.7-cp312-cp312-win_amd64.whl", hash = "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8"}, - {file = "yarl-1.9.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781"}, - {file = "yarl-1.9.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47"}, - {file = "yarl-1.9.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75"}, - {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05"}, - {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8"}, - {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb"}, - {file = "yarl-1.9.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf"}, - {file = "yarl-1.9.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf"}, - {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8"}, - {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b"}, - {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7"}, - {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f"}, - {file = "yarl-1.9.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45"}, - {file = "yarl-1.9.7-cp313-cp313-win32.whl", hash = "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842"}, - {file = "yarl-1.9.7-cp313-cp313-win_amd64.whl", hash = "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f"}, - {file = "yarl-1.9.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a564155cc2194ecd9c0d8f8dc57059b822a507de5f08120063675eb9540576aa"}, - {file = "yarl-1.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03e917cc44a01e1be60a83ee1a17550b929490aaa5df2a109adc02137bddf06b"}, - {file = "yarl-1.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eefda67ba0ba44ab781e34843c266a76f718772b348f7c5d798d8ea55b95517f"}, - {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:316c82b499b6df41444db5dea26ee23ece9356e38cea43a8b2af9e6d8a3558e4"}, - {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10452727843bc847596b75e30a7fe92d91829f60747301d1bd60363366776b0b"}, - {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:050f3e4d886be55728fef268587d061c5ce6f79a82baba71840801b63441c301"}, - {file = "yarl-1.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0aabe557446aa615693a82b4d3803c102fd0e7a6a503bf93d744d182a510184"}, - {file = "yarl-1.9.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23404842228e6fa8ace235024519df37f3f8e173620407644d40ddca571ff0f4"}, - {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:34736fcc9d6d7080ebbeb0998ecb91e4f14ad8f18648cf0b3099e2420a225d86"}, - {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:48f7a158f3ca67509d21cb02a96964e4798b6f133691cc0c86cf36e26e26ec8f"}, - {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6639444d161c693cdabb073baaed1945c717d3982ecedf23a219bc55a242e728"}, - {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:1cd450e10cb53d63962757c3f6f7870be49a3e448c46621d6bd46f8088d532de"}, - {file = "yarl-1.9.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74d3ef5e81f81507cea04bf5ae22f18ef538607a7c754aac2b6e3029956a2842"}, - {file = "yarl-1.9.7-cp38-cp38-win32.whl", hash = "sha256:4052dbd0c900bece330e3071c636f99dff06e4628461a29b38c6e222a427cf98"}, - {file = "yarl-1.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:dd08da4f2d171e19bd02083c921f1bef89f8f5f87000d0ffc49aa257bc5a9802"}, - {file = "yarl-1.9.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ab906a956d2109c6ea11e24c66592b06336e2743509290117f0f7f47d2c1dd3"}, - {file = "yarl-1.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d8ad761493d5aaa7ab2a09736e62b8a220cb0b10ff8ccf6968c861cd8718b915"}, - {file = "yarl-1.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d35f9cdab0ec5e20cf6d2bd46456cf599052cf49a1698ef06b9592238d1cf1b1"}, - {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a48d2b9f0ae29a456fb766ae461691378ecc6cf159dd9f938507d925607591c3"}, - {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf85599c9336b89b92c313519bcaa223d92fa5d98feb4935a47cce2e8722b4b8"}, - {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e8916b1ff7680b1f2b1608c82dc15c569b9f2cb2da100c747c291f1acf18a14"}, - {file = "yarl-1.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29c80890e0a64fb0e5f71350d48da330995073881f8b8e623154aef631febfb0"}, - {file = "yarl-1.9.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9163d21aa40ff8528db2aee2b0b6752efe098055b41ab8e5422b2098457199fe"}, - {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:65e3098969baf221bb45e3b2f60735fc2b154fc95902131ebc604bae4c629ea6"}, - {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cddebd096effe4be90fd378e4224cd575ac99e1c521598a6900e94959006e02e"}, - {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8525f955a2dcc281573b6aadeb8ab9c37e2d3428b64ca6a2feec2a794a69c1da"}, - {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5d585c7d834c13f24c7e3e0efaf1a4b7678866940802e11bd6c4d1f99c935e6b"}, - {file = "yarl-1.9.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78805148e780a9ca66f3123e04741e344b66cf06b4fb13223e3a209f39a6da55"}, - {file = "yarl-1.9.7-cp39-cp39-win32.whl", hash = "sha256:3f53df493ec80b76969d6e1ae6e4411a55ab1360e02b80c84bd4b33d61a567ba"}, - {file = "yarl-1.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:c81c28221a85add23a0922a6aeb2cdda7f9723e03e2dfae06fee5c57fe684262"}, - {file = "yarl-1.9.7-py3-none-any.whl", hash = "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee"}, - {file = "yarl-1.9.7.tar.gz", hash = "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7"}, + {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64c5b0f2b937fe40d0967516eee5504b23cb247b8b7ffeba7213a467d9646fdc"}, + {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e430ac432f969ef21770645743611c1618362309e3ad7cab45acd1ad1a540ff"}, + {file = "yarl-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e26e64f42bce5ddf9002092b2c37b13071c2e6413d5c05f9fa9de58ed2f7749"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0103c52f8dfe5d573c856322149ddcd6d28f51b4d4a3ee5c4b3c1b0a05c3d034"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b63465b53baeaf2122a337d4ab57d6bbdd09fcadceb17a974cfa8a0300ad9c67"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17d4dc4ff47893a06737b8788ed2ba2f5ac4e8bb40281c8603920f7d011d5bdd"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b54949267bd5704324397efe9fbb6aa306466dee067550964e994d309db5f1"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10b690cd78cbaca2f96a7462f303fdd2b596d3978b49892e4b05a7567c591572"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c85ab016e96a975afbdb9d49ca90f3bca9920ef27c64300843fe91c3d59d8d20"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c1caa5763d1770216596e0a71b5567f27aac28c95992110212c108ec74589a48"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:595bbcdbfc4a9c6989d7489dca8510cba053ff46b16c84ffd95ac8e90711d419"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e64f0421892a207d3780903085c1b04efeb53b16803b23d947de5a7261b71355"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:319c206e83e46ec2421b25b300c8482b6fe8a018baca246be308c736d9dab267"}, + {file = "yarl-1.12.1-cp310-cp310-win32.whl", hash = "sha256:da045bd1147d12bd43fb032296640a7cc17a7f2eaba67495988362e99db24fd2"}, + {file = "yarl-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:aebbd47df77190ada603157f0b3670d578c110c31746ecc5875c394fdcc59a99"}, + {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:28389a68981676bf74e2e199fe42f35d1aa27a9c98e3a03e6f58d2d3d054afe1"}, + {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f736f54565f8dd7e3ab664fef2bc461d7593a389a7f28d4904af8d55a91bd55f"}, + {file = "yarl-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dee0496d5f1a8f57f0f28a16f81a2033fc057a2cf9cd710742d11828f8c80e2"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8981a94a27ac520a398302afb74ae2c0be1c3d2d215c75c582186a006c9e7b0"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff54340fc1129e8e181827e2234af3ff659b4f17d9bbe77f43bc19e6577fadec"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54c8cee662b5f8c30ad7eedfc26123f845f007798e4ff1001d9528fe959fd23c"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e97a29b37830ba1262d8dfd48ddb5b28ad4d3ebecc5d93a9c7591d98641ec737"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c89894cc6f6ddd993813e79244b36b215c14f65f9e4f1660b1f2ba9e5594b95"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:712ba8722c0699daf186de089ddc4677651eb9875ed7447b2ad50697522cbdd9"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6e9a9f50892153bad5046c2a6df153224aa6f0573a5a8ab44fc54a1e886f6e21"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1d4017e78fb22bc797c089b746230ad78ecd3cdb215bc0bd61cb72b5867da57e"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f494c01b28645c431239863cb17af8b8d15b93b0d697a0320d5dd34cd9d7c2fa"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de4544b1fb29cf14870c4e2b8a897c0242449f5dcebd3e0366aa0aa3cf58a23a"}, + {file = "yarl-1.12.1-cp311-cp311-win32.whl", hash = "sha256:7564525a4673fde53dee7d4c307a961c0951918f0b8c7f09b2c9e02067cf6504"}, + {file = "yarl-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:f23bb1a7a6e8e8b612a164fdd08e683bcc16c76f928d6dbb7bdbee2374fbfee6"}, + {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3e2aff8b822ab0e0bdbed9f50494b3a35629c4b9488ae391659973a37a9f53f"}, + {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22dda2799c8d39041d731e02bf7690f0ef34f1691d9ac9dfcb98dd1e94c8b058"}, + {file = "yarl-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18c2a7757561f05439c243f517dbbb174cadfae3a72dee4ae7c693f5b336570f"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:835010cc17d0020e7931d39e487d72c8e01c98e669b6896a8b8c9aa8ca69a949"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2254fe137c4a360b0a13173a56444f756252c9283ba4d267ca8e9081cd140ea"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a071d2c3d39b4104f94fc08ab349e9b19b951ad4b8e3b6d7ea92d6ef7ccaf8"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73a183042ae0918c82ce2df38c3db2409b0eeae88e3afdfc80fb67471a95b33b"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326b8a079a9afcac0575971e56dabdf7abb2ea89a893e6949b77adfeb058b50e"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:126309c0f52a2219b3d1048aca00766429a1346596b186d51d9fa5d2070b7b13"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ba1c779b45a399cc25f511c681016626f69e51e45b9d350d7581998722825af9"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:af1107299cef049ad00a93df4809517be432283a0847bcae48343ebe5ea340dc"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:20d817c0893191b2ab0ba30b45b77761e8dfec30a029b7c7063055ca71157f84"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d4f818f6371970d6a5d1e42878389bbfb69dcde631e4bbac5ec1cb11158565ca"}, + {file = "yarl-1.12.1-cp312-cp312-win32.whl", hash = "sha256:0ac33d22b2604b020569a82d5f8a03ba637ba42cc1adf31f616af70baf81710b"}, + {file = "yarl-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd24996e12e1ba7c397c44be75ca299da14cde34d74bc5508cce233676cc68d0"}, + {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dea360778e0668a7ad25d7727d03364de8a45bfd5d808f81253516b9f2217765"}, + {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1f50a37aeeb5179d293465e522fd686080928c4d89e0ff215e1f963405ec4def"}, + {file = "yarl-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0274b1b7a9c9c32b7bf250583e673ff99fb9fccb389215841e2652d9982de740"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4f3ab9eb8ab2d585ece959c48d234f7b39ac0ca1954a34d8b8e58a52064bdb3"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d31dd0245d88cf7239e96e8f2a99f815b06e458a5854150f8e6f0e61618d41b"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a96198d5d26f40557d986c1253bfe0e02d18c9d9b93cf389daf1a3c9f7c755fa"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddae504cfb556fe220efae65e35be63cd11e3c314b202723fc2119ce19f0ca2e"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bce00f3b1f7f644faae89677ca68645ed5365f1c7f874fdd5ebf730a69640d38"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eee5ff934b0c9f4537ff9596169d56cab1890918004791a7a06b879b3ba2a7ef"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4ea99e64b2ad2635e0f0597b63f5ea6c374791ff2fa81cdd4bad8ed9f047f56f"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c667b383529520b8dd6bd496fc318678320cb2a6062fdfe6d3618da6b8790f6"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d920401941cb898ef089422e889759dd403309eb370d0e54f1bdf6ca07fef603"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:501a1576716032cc6d48c7c47bcdc42d682273415a8f2908e7e72cb4625801f3"}, + {file = "yarl-1.12.1-cp313-cp313-win32.whl", hash = "sha256:24416bb5e221e29ddf8aac5b97e94e635ca2c5be44a1617ad6fe32556df44294"}, + {file = "yarl-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:71af3766bb46738d12cc288d9b8de7ef6f79c31fd62757e2b8a505fe3680b27f"}, + {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c924deab8105f86980983eced740433fb7554a7f66db73991affa4eda99d5402"}, + {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5fb475a4cdde582c9528bb412b98f899680492daaba318231e96f1a0a1bb0d53"}, + {file = "yarl-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:36ee0115b9edca904153a66bb74a9ff1ce38caff015de94eadfb9ba8e6ecd317"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2631c9d7386bd2d4ce24ecc6ebf9ae90b3efd713d588d90504eaa77fec4dba01"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2376d8cf506dffd0e5f2391025ae8675b09711016656590cb03b55894161fcfa"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24197ba3114cc85ddd4091e19b2ddc62650f2e4a899e51b074dfd52d56cf8c72"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfdf419bf5d3644f94cd7052954fc233522f5a1b371fc0b00219ebd9c14d5798"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8112f640a4f7e7bf59f7cabf0d47a29b8977528c521d73a64d5cc9e99e48a174"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:607d12f0901f6419a8adceb139847c42c83864b85371f58270e42753f9780fa6"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:664380c7ed524a280b6a2d5d9126389c3e96cd6e88986cdb42ca72baa27421d6"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d0a5e87bc48d76dfcfc16295201e9812d5f33d55b4a0b7cad1025b92bf8b91b"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:eff6bac402719c14e17efe845d6b98593c56c843aca6def72080fbede755fd1f"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:22839d1d1eab9e4b427828a88a22beb86f67c14d8ff81175505f1cc8493f3500"}, + {file = "yarl-1.12.1-cp38-cp38-win32.whl", hash = "sha256:717f185086bb9d817d4537dd18d5df5d657598cd00e6fc22e4d54d84de266c1d"}, + {file = "yarl-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:71978ba778948760cff528235c951ea0ef7a4f9c84ac5a49975f8540f76c3f73"}, + {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ffc046ebddccb3c4cac72c1a3e1bc343492336f3ca86d24672e90ccc5e788a"}, + {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10954b233d4df5cc3137ffa5ced97f8894152df817e5d149bf05a0ef2ab8134"}, + {file = "yarl-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2e912b282466444023610e4498e3795c10e7cfd641744524876239fcf01d538d"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af871f70cfd5b528bd322c65793b5fd5659858cdfaa35fbe563fb99b667ed1f"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3e4e1f7b08d1ec6b685ccd3e2d762219c550164fbf524498532e39f9413436e"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a7ee79183f0b17dcede8b6723e7da2ded529cf159a878214be9a5d3098f5b1e"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96c8ff1e1dd680e38af0887927cab407a4e51d84a5f02ae3d6eb87233036c763"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e9905fc2dc1319e4c39837b906a024cf71b1261cc66b0cd89678f779c0c61f5"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:01549468858b87d36f967c97d02e6e54106f444aeb947ed76f8f71f85ed07cec"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96b34830bd6825ca0220bf005ea99ac83eb9ce51301ddb882dcf613ae6cd95fb"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2aee7594d2c2221c717a8e394bbed4740029df4c0211ceb0f04815686e99c795"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:15871130439ad10abb25a4631120d60391aa762b85fcab971411e556247210a0"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:838dde2cb570cfbb4cab8a876a0974e8b90973ea40b3ac27a79b8a74c8a2db15"}, + {file = "yarl-1.12.1-cp39-cp39-win32.whl", hash = "sha256:eacbcf30efaca7dc5cb264228ffecdb95fdb1e715b1ec937c0ce6b734161e0c8"}, + {file = "yarl-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:76a59d1b63de859398bc7764c860a769499511463c1232155061fe0147f13e01"}, + {file = "yarl-1.12.1-py3-none-any.whl", hash = "sha256:dc3192a81ecd5ff954cecd690327badd5a84d00b877e1573f7c9097ce13e5bfb"}, + {file = "yarl-1.12.1.tar.gz", hash = "sha256:5b860055199aec8d6fe4dcee3c5196ce506ca198a50aab0059ffd26e8e815828"}, ] [package.dependencies] From df62b4a2ba86400118b9c29412617055b67d482c Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:34:51 +0100 Subject: [PATCH 129/155] update deps --- poetry.lock | 190 ++++++++++++++++++++++++---------------------------- 1 file changed, 87 insertions(+), 103 deletions(-) diff --git a/poetry.lock b/poetry.lock index 752924da..79213d50 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1562,13 +1562,13 @@ files = [ [[package]] name = "py-cord" -version = "2.6.1" +version = "2.6.0" description = "A Python wrapper for the Discord API" optional = false python-versions = ">=3.8" files = [ - {file = "py_cord-2.6.1-py3-none-any.whl", hash = "sha256:e3d3b528c5e37b0e0825f5b884cbb9267860976c1e4878e28b55da8fd3af834b"}, - {file = "py_cord-2.6.1.tar.gz", hash = "sha256:36064f225f2c7bbddfe542d5ed581f2a5744f618e039093cf7cd2659a58bc79b"}, + {file = "py_cord-2.6.0-py3-none-any.whl", hash = "sha256:906cc077904a4d478af0264ae4374b0412ed9f9ab950d0162c4f31239a906d26"}, + {file = "py_cord-2.6.0.tar.gz", hash = "sha256:bbc0349542965d05e4b18cc4424136206430a8cc911fda12a0a57df6fdf9cd9c"}, ] [package.dependencies] @@ -1991,109 +1991,93 @@ files = [ [[package]] name = "yarl" -version = "1.15.2" +version = "1.15.3" description = "Yet another URL library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, - {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, - {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, - {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, - {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, - {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, - {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, - {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, - {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, - {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, - {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, - {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, - {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, - {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, - {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, - {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, - {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, - {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, - {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, - {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, - {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, - {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, - {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, - {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, - {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, - {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, - {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, - {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, - {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, - {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, - {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, - {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, + {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:14d6f07b7b4b3b8fba521904db58442281730b44318d6abb9908de79e2a4e4f4"}, + {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eacd9de9b5b8262818a2e1f88efbd8d523abc8453de238c5d2f6a91fa85032dd"}, + {file = "yarl-1.15.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a63ed17af784da3de39b82adfd4f8404ad5ee2ec8f616b063f37da3e64e0521"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55cc82ba92c07af6ba619dcf70cc89f7b9626adefb87d251f80f2e77419f1da"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63ba82841ce315e4b5dc8b9345062638c74b1864d38172d0a0403e5a083b0950"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59dce412b2515de05ab2eb6aef19ad7f70857ad436cd65fc4276df007106fb42"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e337737b8c9d837e5b4d9e906cc57ed7a639e16e515c8094509b17f556fdb642"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2128315cdc517a45ceb72ec17b256a7940eeb4843c66834c203e7d6580c83405"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69c2d111e67a818e702ba957da8c8e62de916f5c1b3da043f744084c63f12d46"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d2a70e8bec768be7423d8d465858a3646b34257a20cc02fd92612f1b14931f50"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:efe758958a7bffce68d91ade238df72667e1f18966ed7b1d3d390eead51a8903"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b765f19e23c29b68e4f8bbadd36f1da2333ba983d8da2d6518e5f0a7eb2579c2"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df494e5a79f2ef8f81f966f787e515760e639c6319a321c16198b379c256a157"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:68b27a7d9fb0f145de608da2e45e37fd2397b00266f10487e557f769afa2842d"}, + {file = "yarl-1.15.3-cp310-cp310-win32.whl", hash = "sha256:6d1aba1f644d6e5e16edada31938c11b6c9c97e3bf065742a2c7740d38af0c19"}, + {file = "yarl-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:925e72fc7a4222a5bf6d288876d5afacc8f833b49c4cca85f65089131ba25afa"}, + {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dbd4808a209b175b5ebbac24c4798dd7511c5ee522a16f2f0eac78c717dfcdfc"}, + {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20f8bdaf667386cea1a8f49cb69a85f90346656d750d3c1278be1dbc76601065"}, + {file = "yarl-1.15.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:adeac55335669a189189373c93d131ebfc2de3ec04f0d3aa7dff6661f83b89b6"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:690d8f702945506b58c9c5834d586e8fd819b845fe6239ab16ebc64a92a6fd3d"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df7784a29b9689341c17d06d826e3b52ee59d6b6916177e4db0477be7aad5f72"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12c80ec2af97ff3e433699bcabc787ef34e7c08ec038a6e6a25fb81d7bb83607"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39533b927c665bcff7da80bf299218e4af12f3e2be27e9c456e29547bcefd631"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db32a5c2912db45e73f80107d178e30f5c48cf596762b3c60ddfebdd655385f0"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bde319602111e9acca3c4f87f4205b38ba6166004bf108de47553633f9a580fc"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:493760c4ced954582db83c4760166992c016e1777ebc0f3ef1bb5eb60b2b5924"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d9cd73f7bff5079d87c2622aa418a75d5d3cdc944d3edb905c5dfc3235466eb0"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e924040582499f7514ec64691031504e6224b5ae7224216208fc2c94f8b13c89"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1c3e9ae98719fe180751b093d02dbcc33b78a37e861d0f2c9571720bd31555db"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f2911cae6dd012adaaf51494dad4cafb4284ad1f3b588df6ea3e3017e053750"}, + {file = "yarl-1.15.3-cp311-cp311-win32.whl", hash = "sha256:acdfe626607a245aedca35b211f9305a9e7a33349da525bf4ef3caaec8ef51cd"}, + {file = "yarl-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:0ace3927502a9f90a868d62c66623703cf5096dcb586187266e9b964d8dd6c81"}, + {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:decf9d76191bfe34835f1abd3fa8ebe8a9cd7e16300a5c7e82b18c0812bb22a2"}, + {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ce65ed7ad7b6cbca06b0c011b170bd2b0bc56b0a740540e2713e5ac12d7b9b2e"}, + {file = "yarl-1.15.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cf2b50352df8775591869aaa22c52b64d60376ba99c0802b42778fedc90b775"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32e8ebf0080ddd38ec05f8be940a3719e5fe1ab8bb6d2b3f6f8b89c9e34149aa"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05183fd49244517cb11c208d0ae128f2e8a85ddb7caf22ad8b0ffcdf5481fcb6"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46653b5fd29e63ffe63335da343829a2b00bb43b0bd9bb21240d3b42629629e2"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6316af233610b9868eda92cf68c016750cbf50085ac6c51faa17905ddd25605"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5685ebc333c95b75be3a0a83a81b82b6411beee9585eaeb9e2e588ae8df23848"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6da6f6c6ee5595658f21bb9d1ecd702f7a7f22f224ac063dfb595624aec4a2e0"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45c05b87a8494d9820ea1ac82118fd2f1d795d868e94766fe8ff670377bf6280"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04f930fcc940f96b8b29110c56882bcff8703f87a7b9354d3acf60ffded5a23d"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8df77742b403e71c5d62d22d150e6e35efd6096a15f2c7419815911c62225100"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f785d83ece0998e4ce4fadda22fa6c1ecc40e10f41617013a8726d2e9af0d98f"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7794aade99be0d48b69bd5942acddfeff0de3d09c724d9abe4f19736708ef18f"}, + {file = "yarl-1.15.3-cp312-cp312-win32.whl", hash = "sha256:a3a98d70c667c957c7cd0b153d4cb5e45d43f5e2e23de73be6f7b5c883c01f72"}, + {file = "yarl-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:90257bc627897a2c1d562efcd6a6b18887e9dacae795cad2367e8e16df47d966"}, + {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f94d8adfdec402ff97cecc243b310c01d571362ca87bcf8def8e15cb3aaac3ee"}, + {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0328f798052a33803a77d0868c7f802e952127092c1738fc9e7bfcaac7207c5"}, + {file = "yarl-1.15.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f5f0a0691e39c2e7b5c0f23e6765fa6cb162dce99d9ab1897fdd0f7a4a38b6fb"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370f646d3654e196ddbf772a2d737fe4e1dd738267015b73ff6267ca592fd9d6"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3487c57bc8f17f2586ae7fd0e77f65cd298d45b64d15f604bbb29f4cce0e7961"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef67989d480358482830dc3bc232709804f46a61e7e9841d3f0b1c13a4735b3b"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5ab6c64921802176f56c36aa67c5e6a8baf9557ec1662cb41ecdb5580b67eb9"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb474a06023d01ead9c072b2580c22b2691aa1cabdcc19c3171ab1fa6d8496e3"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92f9a45230d3aa8568c1d692ab27bf505a32dfe3b404721458fc374f411e8bd2"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:24cad94cf2f46cc8e4b9cd44e4e8a84483536a6c54554960b02b10b5724ab122"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:380f30073cbd9b740891bb56f44ee31f870e8721269b618ccc9913400936d9f6"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:353306ba6f0218af1aefe4b9c8b3a0b81b209bc75d79357dac6aca70a7b09d6a"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe03cea925d884b8f1157a7037df2f5b6a6478a64b78ee600832d8a9f044c83e"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4cc1a438ac52562427330e33891f50a78ffd38d335abc64f93f201c83bdc82"}, + {file = "yarl-1.15.3-cp313-cp313-win32.whl", hash = "sha256:956975a3a1ce1f4537be22278d6a283b8bc74d77671f7f6469ab1e800f4e9b02"}, + {file = "yarl-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:2e61b72cf15922a7a665299a6b6825bd9901d67ec3b9d3cf9b256dc1667c9bb1"}, + {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:270fef2b335e60c91ee835c524445e2248af841c8b72f48769ed6c02fbff5873"}, + {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:59b77f0682e1917be197fc8229530f0c6fb3ef8e242d8256ba091a3a1c0ef7e6"}, + {file = "yarl-1.15.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc4b999718287073dccd3acb0ef1593961bd7923af08991cb3c94080db503935"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9b251d3f90e125ff0d1f76257329a9190fa1bfd2157344c875580bff6dedc62"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ccb4667e0c0a25815efbfe251d24b56624449a319d4bb497074dd49444fb306"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac26e43b56dbafb30256906bc763cc1f22e05825ae1ced4c6afbd0e6584f18de"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2207491555af5dbbee4c3179a76766f7bc1ecff858f420ea96f2e105ca42c4dd"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14effa29db6113be065a594e13a0f45afb9c1e374fd22b4bc3a4eff0725184b2"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:19077525cd36c797cae19262e15f2881da33c602fb35d075ff0e4263b51b8b88"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d80c019083506886df098b7bb0d844e19db7e226736829ef49f892ed0a070fa5"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c24debeec87908a864a2b4cb700f863db9441cabacdb22dc448c5d38b55c6f62"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1c49fe426c45520b4b8a48544d3a9a58194f39c1b57d92451883f847c299a137"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:66ddcd7ee3264bc937860f4780290d60f6472ca0484c214fe805116a831121e8"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a5cbbb06559757f091f9e71d3f76c27d4dfe0652cc3f17ccce398b8377bfda4"}, + {file = "yarl-1.15.3-cp39-cp39-win32.whl", hash = "sha256:d798de0b50efb66583fc096bcdaa852ed6ea3485a4eb610d6a634f8010d932f4"}, + {file = "yarl-1.15.3-cp39-cp39-win_amd64.whl", hash = "sha256:8f0b33fd088e93ba5f7f6dd55226630e7b78212752479c8fcc6abbd143b9c1ce"}, + {file = "yarl-1.15.3-py3-none-any.whl", hash = "sha256:a1d49ed6f4b812dde88e937d4c2bd3f13d72c23ef7de1e17a63b7cacef4b5691"}, + {file = "yarl-1.15.3.tar.gz", hash = "sha256:fbcff47f8ba82467f203037f7a30decf5c724211b224682f7236edb0dcbb5b95"}, ] [package.dependencies] From 39cdae48bad913c993690fa446041080c4520c4f Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:47:26 +0000 Subject: [PATCH 130/155] update deps --- poetry.lock | 351 +++++++++++++++++++++++++++------------------------- 1 file changed, 183 insertions(+), 168 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9cf6c8a6..066eb6f2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -704,88 +704,103 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" -version = "1.4.1" +version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, - {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, - {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, - {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-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, - {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, - {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, - {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, - {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, - {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, - {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, - {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, - {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] [[package]] @@ -1891,13 +1906,13 @@ types-html5lib = "*" [[package]] name = "types-html5lib" -version = "1.1.11.20240806" +version = "1.1.11.20241018" description = "Typing stubs for html5lib" optional = false python-versions = ">=3.8" files = [ - {file = "types-html5lib-1.1.11.20240806.tar.gz", hash = "sha256:8060dc98baf63d6796a765bbbc809fff9f7a383f6e3a9add526f814c086545ef"}, - {file = "types_html5lib-1.1.11.20240806-py3-none-any.whl", hash = "sha256:575c4fd84ba8eeeaa8520c7e4c7042b7791f5ec3e9c0a5d5c418124c42d9e7e4"}, + {file = "types-html5lib-1.1.11.20241018.tar.gz", hash = "sha256:98042555ff78d9e3a51c77c918b1041acbb7eb6c405408d8a9e150ff5beccafa"}, + {file = "types_html5lib-1.1.11.20241018-py3-none-any.whl", hash = "sha256:3f1e064d9ed2c289001ae6392c84c93833abb0816165c6ff0abfc304a779f403"}, ] [[package]] @@ -1966,13 +1981,13 @@ crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"] [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.27.1" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, - {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, + {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, + {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, ] [package.dependencies] @@ -1997,93 +2012,93 @@ files = [ [[package]] name = "yarl" -version = "1.15.3" +version = "1.17.0" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:14d6f07b7b4b3b8fba521904db58442281730b44318d6abb9908de79e2a4e4f4"}, - {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eacd9de9b5b8262818a2e1f88efbd8d523abc8453de238c5d2f6a91fa85032dd"}, - {file = "yarl-1.15.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a63ed17af784da3de39b82adfd4f8404ad5ee2ec8f616b063f37da3e64e0521"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55cc82ba92c07af6ba619dcf70cc89f7b9626adefb87d251f80f2e77419f1da"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63ba82841ce315e4b5dc8b9345062638c74b1864d38172d0a0403e5a083b0950"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59dce412b2515de05ab2eb6aef19ad7f70857ad436cd65fc4276df007106fb42"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e337737b8c9d837e5b4d9e906cc57ed7a639e16e515c8094509b17f556fdb642"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2128315cdc517a45ceb72ec17b256a7940eeb4843c66834c203e7d6580c83405"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69c2d111e67a818e702ba957da8c8e62de916f5c1b3da043f744084c63f12d46"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d2a70e8bec768be7423d8d465858a3646b34257a20cc02fd92612f1b14931f50"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:efe758958a7bffce68d91ade238df72667e1f18966ed7b1d3d390eead51a8903"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b765f19e23c29b68e4f8bbadd36f1da2333ba983d8da2d6518e5f0a7eb2579c2"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df494e5a79f2ef8f81f966f787e515760e639c6319a321c16198b379c256a157"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:68b27a7d9fb0f145de608da2e45e37fd2397b00266f10487e557f769afa2842d"}, - {file = "yarl-1.15.3-cp310-cp310-win32.whl", hash = "sha256:6d1aba1f644d6e5e16edada31938c11b6c9c97e3bf065742a2c7740d38af0c19"}, - {file = "yarl-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:925e72fc7a4222a5bf6d288876d5afacc8f833b49c4cca85f65089131ba25afa"}, - {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dbd4808a209b175b5ebbac24c4798dd7511c5ee522a16f2f0eac78c717dfcdfc"}, - {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20f8bdaf667386cea1a8f49cb69a85f90346656d750d3c1278be1dbc76601065"}, - {file = "yarl-1.15.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:adeac55335669a189189373c93d131ebfc2de3ec04f0d3aa7dff6661f83b89b6"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:690d8f702945506b58c9c5834d586e8fd819b845fe6239ab16ebc64a92a6fd3d"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df7784a29b9689341c17d06d826e3b52ee59d6b6916177e4db0477be7aad5f72"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12c80ec2af97ff3e433699bcabc787ef34e7c08ec038a6e6a25fb81d7bb83607"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39533b927c665bcff7da80bf299218e4af12f3e2be27e9c456e29547bcefd631"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db32a5c2912db45e73f80107d178e30f5c48cf596762b3c60ddfebdd655385f0"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bde319602111e9acca3c4f87f4205b38ba6166004bf108de47553633f9a580fc"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:493760c4ced954582db83c4760166992c016e1777ebc0f3ef1bb5eb60b2b5924"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d9cd73f7bff5079d87c2622aa418a75d5d3cdc944d3edb905c5dfc3235466eb0"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e924040582499f7514ec64691031504e6224b5ae7224216208fc2c94f8b13c89"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1c3e9ae98719fe180751b093d02dbcc33b78a37e861d0f2c9571720bd31555db"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f2911cae6dd012adaaf51494dad4cafb4284ad1f3b588df6ea3e3017e053750"}, - {file = "yarl-1.15.3-cp311-cp311-win32.whl", hash = "sha256:acdfe626607a245aedca35b211f9305a9e7a33349da525bf4ef3caaec8ef51cd"}, - {file = "yarl-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:0ace3927502a9f90a868d62c66623703cf5096dcb586187266e9b964d8dd6c81"}, - {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:decf9d76191bfe34835f1abd3fa8ebe8a9cd7e16300a5c7e82b18c0812bb22a2"}, - {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ce65ed7ad7b6cbca06b0c011b170bd2b0bc56b0a740540e2713e5ac12d7b9b2e"}, - {file = "yarl-1.15.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cf2b50352df8775591869aaa22c52b64d60376ba99c0802b42778fedc90b775"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32e8ebf0080ddd38ec05f8be940a3719e5fe1ab8bb6d2b3f6f8b89c9e34149aa"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05183fd49244517cb11c208d0ae128f2e8a85ddb7caf22ad8b0ffcdf5481fcb6"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46653b5fd29e63ffe63335da343829a2b00bb43b0bd9bb21240d3b42629629e2"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6316af233610b9868eda92cf68c016750cbf50085ac6c51faa17905ddd25605"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5685ebc333c95b75be3a0a83a81b82b6411beee9585eaeb9e2e588ae8df23848"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6da6f6c6ee5595658f21bb9d1ecd702f7a7f22f224ac063dfb595624aec4a2e0"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45c05b87a8494d9820ea1ac82118fd2f1d795d868e94766fe8ff670377bf6280"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04f930fcc940f96b8b29110c56882bcff8703f87a7b9354d3acf60ffded5a23d"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8df77742b403e71c5d62d22d150e6e35efd6096a15f2c7419815911c62225100"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f785d83ece0998e4ce4fadda22fa6c1ecc40e10f41617013a8726d2e9af0d98f"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7794aade99be0d48b69bd5942acddfeff0de3d09c724d9abe4f19736708ef18f"}, - {file = "yarl-1.15.3-cp312-cp312-win32.whl", hash = "sha256:a3a98d70c667c957c7cd0b153d4cb5e45d43f5e2e23de73be6f7b5c883c01f72"}, - {file = "yarl-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:90257bc627897a2c1d562efcd6a6b18887e9dacae795cad2367e8e16df47d966"}, - {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f94d8adfdec402ff97cecc243b310c01d571362ca87bcf8def8e15cb3aaac3ee"}, - {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0328f798052a33803a77d0868c7f802e952127092c1738fc9e7bfcaac7207c5"}, - {file = "yarl-1.15.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f5f0a0691e39c2e7b5c0f23e6765fa6cb162dce99d9ab1897fdd0f7a4a38b6fb"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370f646d3654e196ddbf772a2d737fe4e1dd738267015b73ff6267ca592fd9d6"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3487c57bc8f17f2586ae7fd0e77f65cd298d45b64d15f604bbb29f4cce0e7961"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef67989d480358482830dc3bc232709804f46a61e7e9841d3f0b1c13a4735b3b"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5ab6c64921802176f56c36aa67c5e6a8baf9557ec1662cb41ecdb5580b67eb9"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb474a06023d01ead9c072b2580c22b2691aa1cabdcc19c3171ab1fa6d8496e3"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92f9a45230d3aa8568c1d692ab27bf505a32dfe3b404721458fc374f411e8bd2"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:24cad94cf2f46cc8e4b9cd44e4e8a84483536a6c54554960b02b10b5724ab122"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:380f30073cbd9b740891bb56f44ee31f870e8721269b618ccc9913400936d9f6"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:353306ba6f0218af1aefe4b9c8b3a0b81b209bc75d79357dac6aca70a7b09d6a"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe03cea925d884b8f1157a7037df2f5b6a6478a64b78ee600832d8a9f044c83e"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4cc1a438ac52562427330e33891f50a78ffd38d335abc64f93f201c83bdc82"}, - {file = "yarl-1.15.3-cp313-cp313-win32.whl", hash = "sha256:956975a3a1ce1f4537be22278d6a283b8bc74d77671f7f6469ab1e800f4e9b02"}, - {file = "yarl-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:2e61b72cf15922a7a665299a6b6825bd9901d67ec3b9d3cf9b256dc1667c9bb1"}, - {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:270fef2b335e60c91ee835c524445e2248af841c8b72f48769ed6c02fbff5873"}, - {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:59b77f0682e1917be197fc8229530f0c6fb3ef8e242d8256ba091a3a1c0ef7e6"}, - {file = "yarl-1.15.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc4b999718287073dccd3acb0ef1593961bd7923af08991cb3c94080db503935"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9b251d3f90e125ff0d1f76257329a9190fa1bfd2157344c875580bff6dedc62"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ccb4667e0c0a25815efbfe251d24b56624449a319d4bb497074dd49444fb306"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac26e43b56dbafb30256906bc763cc1f22e05825ae1ced4c6afbd0e6584f18de"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2207491555af5dbbee4c3179a76766f7bc1ecff858f420ea96f2e105ca42c4dd"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14effa29db6113be065a594e13a0f45afb9c1e374fd22b4bc3a4eff0725184b2"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:19077525cd36c797cae19262e15f2881da33c602fb35d075ff0e4263b51b8b88"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d80c019083506886df098b7bb0d844e19db7e226736829ef49f892ed0a070fa5"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c24debeec87908a864a2b4cb700f863db9441cabacdb22dc448c5d38b55c6f62"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1c49fe426c45520b4b8a48544d3a9a58194f39c1b57d92451883f847c299a137"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:66ddcd7ee3264bc937860f4780290d60f6472ca0484c214fe805116a831121e8"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a5cbbb06559757f091f9e71d3f76c27d4dfe0652cc3f17ccce398b8377bfda4"}, - {file = "yarl-1.15.3-cp39-cp39-win32.whl", hash = "sha256:d798de0b50efb66583fc096bcdaa852ed6ea3485a4eb610d6a634f8010d932f4"}, - {file = "yarl-1.15.3-cp39-cp39-win_amd64.whl", hash = "sha256:8f0b33fd088e93ba5f7f6dd55226630e7b78212752479c8fcc6abbd143b9c1ce"}, - {file = "yarl-1.15.3-py3-none-any.whl", hash = "sha256:a1d49ed6f4b812dde88e937d4c2bd3f13d72c23ef7de1e17a63b7cacef4b5691"}, - {file = "yarl-1.15.3.tar.gz", hash = "sha256:fbcff47f8ba82467f203037f7a30decf5c724211b224682f7236edb0dcbb5b95"}, + {file = "yarl-1.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d8715edfe12eee6f27f32a3655f38d6c7410deb482158c0b7d4b7fad5d07628"}, + {file = "yarl-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1803bf2a7a782e02db746d8bd18f2384801bc1d108723840b25e065b116ad726"}, + {file = "yarl-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e66589110e20c2951221a938fa200c7aa134a8bdf4e4dc97e6b21539ff026d4"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7069d411cfccf868e812497e0ec4acb7c7bf8d684e93caa6c872f1e6f5d1664d"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbf70ba16118db3e4b0da69dcde9d4d4095d383c32a15530564c283fa38a7c52"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0bc53cc349675b32ead83339a8de79eaf13b88f2669c09d4962322bb0f064cbc"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6aa18a402d1c80193ce97c8729871f17fd3e822037fbd7d9b719864018df746"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d89c5bc701861cfab357aa0cd039bc905fe919997b8c312b4b0c358619c38d4d"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b728bdf38ca58f2da1d583e4af4ba7d4cd1a58b31a363a3137a8159395e7ecc7"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:5542e57dc15d5473da5a39fbde14684b0cc4301412ee53cbab677925e8497c11"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e564b57e5009fb150cb513804d7e9e9912fee2e48835638f4f47977f88b4a39c"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:eb3c4cff524b4c1c1dba3a6da905edb1dfd2baf6f55f18a58914bbb2d26b59e1"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:05e13f389038842da930d439fbed63bdce3f7644902714cb68cf527c971af804"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:153c38ee2b4abba136385af4467459c62d50f2a3f4bde38c7b99d43a20c143ef"}, + {file = "yarl-1.17.0-cp310-cp310-win32.whl", hash = "sha256:4065b4259d1ae6f70fd9708ffd61e1c9c27516f5b4fae273c41028afcbe3a094"}, + {file = "yarl-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:abf366391a02a8335c5c26163b5fe6f514cc1d79e74d8bf3ffab13572282368e"}, + {file = "yarl-1.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19a4fe0279626c6295c5b0c8c2bb7228319d2e985883621a6e87b344062d8135"}, + {file = "yarl-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cadd0113f4db3c6b56868d6a19ca6286f5ccfa7bc08c27982cf92e5ed31b489a"}, + {file = "yarl-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:60d6693eef43215b1ccfb1df3f6eae8db30a9ff1e7989fb6b2a6f0b468930ee8"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb8bf3843e1fa8cf3fe77813c512818e57368afab7ebe9ef02446fe1a10b492"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2a5b35fd1d8d90443e061d0c8669ac7600eec5c14c4a51f619e9e105b136715"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5bf17b32f392df20ab5c3a69d37b26d10efaa018b4f4e5643c7520d8eee7ac7"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f51b529b958cd06e78158ff297a8bf57b4021243c179ee03695b5dbf9cb6e1"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fcaa06bf788e19f913d315d9c99a69e196a40277dc2c23741a1d08c93f4d430"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32f3ee19ff0f18a7a522d44e869e1ebc8218ad3ae4ebb7020445f59b4bbe5897"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a4fb69a81ae2ec2b609574ae35420cf5647d227e4d0475c16aa861dd24e840b0"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7bacc8b77670322132a1b2522c50a1f62991e2f95591977455fd9a398b4e678d"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:437bf6eb47a2d20baaf7f6739895cb049e56896a5ffdea61a4b25da781966e8b"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30534a03c87484092080e3b6e789140bd277e40f453358900ad1f0f2e61fc8ec"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b30df4ff98703649915144be6f0df3b16fd4870ac38a09c56d5d9e54ff2d5f96"}, + {file = "yarl-1.17.0-cp311-cp311-win32.whl", hash = "sha256:263b487246858e874ab53e148e2a9a0de8465341b607678106829a81d81418c6"}, + {file = "yarl-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:07055a9e8b647a362e7d4810fe99d8f98421575e7d2eede32e008c89a65a17bd"}, + {file = "yarl-1.17.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84095ab25ba69a8fa3fb4936e14df631b8a71193fe18bd38be7ecbe34d0f5512"}, + {file = "yarl-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02608fb3f6df87039212fc746017455ccc2a5fc96555ee247c45d1e9f21f1d7b"}, + {file = "yarl-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13468d291fe8c12162b7cf2cdb406fe85881c53c9e03053ecb8c5d3523822cd9"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8da3f8f368fb7e2f052fded06d5672260c50b5472c956a5f1bd7bf474ae504ab"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec0507ab6523980bed050137007c76883d941b519aca0e26d4c1ec1f297dd646"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08fc76df7fd8360e9ff30e6ccc3ee85b8dbd6ed5d3a295e6ec62bcae7601b932"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d522f390686acb6bab2b917dd9ca06740c5080cd2eaa5aef8827b97e967319d"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:147c527a80bb45b3dcd6e63401af8ac574125d8d120e6afe9901049286ff64ef"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:24cf43bcd17a0a1f72284e47774f9c60e0bf0d2484d5851f4ddf24ded49f33c6"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c28a44b9e0fba49c3857360e7ad1473fc18bc7f6659ca08ed4f4f2b9a52c75fa"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:350cacb2d589bc07d230eb995d88fcc646caad50a71ed2d86df533a465a4e6e1"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fd1ab1373274dea1c6448aee420d7b38af163b5c4732057cd7ee9f5454efc8b1"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4934e0f96dadc567edc76d9c08181633c89c908ab5a3b8f698560124167d9488"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8d0a278170d75c88e435a1ce76557af6758bfebc338435b2eba959df2552163e"}, + {file = "yarl-1.17.0-cp312-cp312-win32.whl", hash = "sha256:61584f33196575a08785bb56db6b453682c88f009cd9c6f338a10f6737ce419f"}, + {file = "yarl-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9987a439ad33a7712bd5bbd073f09ad10d38640425fa498ecc99d8aa064f8fc4"}, + {file = "yarl-1.17.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8deda7b8eb15a52db94c2014acdc7bdd14cb59ec4b82ac65d2ad16dc234a109e"}, + {file = "yarl-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56294218b348dcbd3d7fce0ffd79dd0b6c356cb2a813a1181af730b7c40de9e7"}, + {file = "yarl-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1fab91292f51c884b290ebec0b309a64a5318860ccda0c4940e740425a67b6b7"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf93fa61ff4d9c7d40482ce1a2c9916ca435e34a1b8451e17f295781ccc034f"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:261be774a0d71908c8830c33bacc89eef15c198433a8cc73767c10eeeb35a7d0"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deec9693b67f6af856a733b8a3e465553ef09e5e8ead792f52c25b699b8f9e6e"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c804b07622ba50a765ca7fb8145512836ab65956de01307541def869e4a456c9"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d013a7c9574e98c14831a8f22d27277688ec3b2741d0188ac01a910b009987a"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e2cfcba719bd494c7413dcf0caafb51772dec168c7c946e094f710d6aa70494e"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c068aba9fc5b94dfae8ea1cedcbf3041cd4c64644021362ffb750f79837e881f"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3616df510ffac0df3c9fa851a40b76087c6c89cbcea2de33a835fc80f9faac24"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:755d6176b442fba9928a4df787591a6a3d62d4969f05c406cad83d296c5d4e05"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c18f6e708d1cf9ff5b1af026e697ac73bea9cb70ee26a2b045b112548579bed2"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5b937c216b6dee8b858c6afea958de03c5ff28406257d22b55c24962a2baf6fd"}, + {file = "yarl-1.17.0-cp313-cp313-win32.whl", hash = "sha256:d0131b14cb545c1a7bd98f4565a3e9bdf25a1bd65c83fc156ee5d8a8499ec4a3"}, + {file = "yarl-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:01c96efa4313c01329e88b7e9e9e1b2fc671580270ddefdd41129fa8d0db7696"}, + {file = "yarl-1.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d44f67e193f0a7acdf552ecb4d1956a3a276c68e7952471add9f93093d1c30d"}, + {file = "yarl-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16ea0aa5f890cdcb7ae700dffa0397ed6c280840f637cd07bffcbe4b8d68b985"}, + {file = "yarl-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf5469dc7dcfa65edf5cc3a6add9f84c5529c6b556729b098e81a09a92e60e51"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e662bf2f6e90b73cf2095f844e2bc1fda39826472a2aa1959258c3f2a8500a2f"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8260e88f1446904ba20b558fa8ce5d0ab9102747238e82343e46d056d7304d7e"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dc16477a4a2c71e64c5d3d15d7ae3d3a6bb1e8b955288a9f73c60d2a391282f"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46027e326cecd55e5950184ec9d86c803f4f6fe4ba6af9944a0e537d643cdbe0"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc95e46c92a2b6f22e70afe07e34dbc03a4acd07d820204a6938798b16f4014f"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:16ca76c7ac9515320cd09d6cc083d8d13d1803f6ebe212b06ea2505fd66ecff8"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:eb1a5b97388f2613f9305d78a3473cdf8d80c7034e554d8199d96dcf80c62ac4"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:41fd5498975418cdc34944060b8fbeec0d48b2741068077222564bea68daf5a6"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:146ca582ed04a5664ad04b0e0603934281eaab5c0115a5a46cce0b3c061a56a1"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6abb8c06107dbec97481b2392dafc41aac091a5d162edf6ed7d624fe7da0587a"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d14be4613dd4f96c25feb4bd8c0d8ce0f529ab0ae555a17df5789e69d8ec0c5"}, + {file = "yarl-1.17.0-cp39-cp39-win32.whl", hash = "sha256:174d6a6cad1068f7850702aad0c7b1bca03bcac199ca6026f84531335dfc2646"}, + {file = "yarl-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:6af417ca2c7349b101d3fd557ad96b4cd439fdb6ab0d288e3f64a068eea394d0"}, + {file = "yarl-1.17.0-py3-none-any.whl", hash = "sha256:62dd42bb0e49423f4dd58836a04fcf09c80237836796025211bbe913f1524993"}, + {file = "yarl-1.17.0.tar.gz", hash = "sha256:d3f13583f378930377e02002b4085a3d025b00402d5a80911726d43a67911cd9"}, ] [package.dependencies] From 09ba2daf6fd315ed2b7ab2a1dee4a39372e54168 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:15:58 +0000 Subject: [PATCH 131/155] fixes --- cogs/committee_actions_tracking.py | 47 +++++------------------------- 1 file changed, 7 insertions(+), 40 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index b3687ce6..7a43fe4e 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -50,17 +50,17 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco "Max description length is 200 characters." ), ) - return "Action description exceeded the maximum character limit!" + return "Action description exceeded the maximum character limit (200)." if action_user.bot: if not silent: await self.command_send_error( - ctx, + ctx=ctx, message=( "Action creation aborted because actions cannot be assigned to bots!" ), ) - return f"Actions cannot be assigned to bots! ({action_user})" + return f"Actions cannot be assigned to bots. ({action_user})" try: action: AssignedCommitteeAction = await AssignedCommitteeAction.objects.acreate( @@ -211,7 +211,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> Set[ ) @CommandChecks.check_interaction_user_has_committee_role @CommandChecks.check_interaction_user_in_main_guild - async def create(self, ctx: TeXBotApplicationContext, action_description: str, *, action_member_id: str) -> None: # noqa: E501 + async def create(self, ctx: TeXBotApplicationContext, action_description: str, *, action_member_id: str | None) -> None: # noqa: E501 """ Definition and callback response of the "create" command. @@ -405,8 +405,9 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip ) return + index: int = random.randint(0, len(committee_members)) + try: - index: int = random.randint(0, len(committee_members)) action_user: discord.Member = committee_members[index] except IndexError: logger.debug("Index: %s was out of range! Printing list...", index) @@ -595,6 +596,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me message="Action ID entered was not valid! Please use the autocomplete.", logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", ) + return new_user_to_action: discord.Member = await self.bot.get_member_from_str_id( member_id, @@ -771,38 +773,3 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di actioned_message_text, silent=False, ) - -# NOTE: EVERYTHING BELOW THIS LINE MUST BE DELETED BEFORE MERGE - @discord.slash_command( # type: ignore[no-untyped-call, misc] - name="admin-toggle", - description="Toggles if the user has the admin role or not.", - ) - async def admin_toggle(self, ctx: TeXBotApplicationContext) -> None: - """Toggle the user admin status.""" - admin_role: discord.Role | None = discord.utils.get( - self.bot.main_guild.roles, - name="Admin", - ) - - if not admin_role: - await ctx.respond(content="Couldn't find the admin role!!") - return - - interaction_user: discord.Member = ctx.user - - if admin_role in interaction_user.roles: - await interaction_user.remove_roles( - admin_role, - reason=f"{interaction_user} executed TeX-Bot slash-command \"admin-toggle\"", - ) - await ctx.respond(content="Removed your admin role!") - return - - await interaction_user.add_roles( - admin_role, - reason=f"{interaction_user} executed TeX-Bot slash-command \"admin-toggle\"", - ) - - await ctx.respond(content="Given you the admin role!!") - - From 154ceb0d4172cf529ae912b096af8a603570bf73 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:18:30 +0000 Subject: [PATCH 132/155] fix django calls --- cogs/committee_actions_tracking.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 7a43fe4e..c21c711c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -307,9 +307,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta logger.debug("An invalid status was provided but did not raise an exception.") return - action.status = new_status - - await action.asave() + action.update(status=new_status) await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", @@ -368,9 +366,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str ) return - action.description = description - - await action.asave() + action.update(description=description) await ctx.respond(content="Action description updated!") From 847fdf9a4e3e9123258b1c545e7e0a6707168f07 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:41:13 +0000 Subject: [PATCH 133/155] add enums --- cogs/committee_actions_tracking.py | 15 +++++++++++++-- db/core/models/__init__.py | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index c21c711c..5b617d92 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -12,6 +12,7 @@ import logging import random from collections.abc import Set +from enum import Enum from logging import Logger from typing import Final @@ -31,6 +32,16 @@ logger: Final[Logger] = logging.getLogger("TeX-Bot") +class Status(Enum): + """Enum class to define the possible statuses of an action.""" + + BLOCKED: Final[str] = "BLK" + CANCELLED: Final[str] = "CND" + COMPLETED: Final[str] = "CMP" + IN_PROGRESS: Final[str] = "INP" + NOT_STARTED: Final[str] = "NST" + + class CommitteeActionsTrackingBaseCog(TeXBotBaseCog): """Base cog class that defines methods for committee actions tracking.""" @@ -528,14 +539,14 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe if not status: user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status="INP") | Q(status="BLK") | Q(status="NST"), + Q(status=Status.IN_PROGRESS) | Q(status=Status.BLOCKED) | Q(status=Status.NOT_STARTED), discord_id=int(action_member.id), ) ] else: user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status=status), + status=status, discord_id=int(action_member.id), ) ] diff --git a/db/core/models/__init__.py b/db/core/models/__init__.py index 5a768290..0e3e86e8 100644 --- a/db/core/models/__init__.py +++ b/db/core/models/__init__.py @@ -31,8 +31,8 @@ class AssignedCommitteeAction(BaseDiscordMemberWrapper): """Model to represent an action that has been assigned to a Discord committee-member.""" class Status(models.TextChoices): - CANCELLED = "CND", _("Cancelled") BLOCKED = "BLK", _("Blocked") + CANCELLED = "CND", _("Cancelled") COMPLETE = "CMP", _("Complete") IN_PROGRESS = "INP", _("In Progress") NOT_STARTED = "NST", _("Not Started") From ad12cc07defbed15a7267ab650ef2cacc0263620 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:47:41 +0000 Subject: [PATCH 134/155] put enum back --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 5b617d92..992f3cbf 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -539,7 +539,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe if not status: user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status=Status.IN_PROGRESS) | Q(status=Status.BLOCKED) | Q(status=Status.NOT_STARTED), + Q(status="INP") | Q(status="BLK") | Q(status="NST"), discord_id=int(action_member.id), ) ] From b0100105b86a9a40e7a7ee23c1aabea5b6b34a80 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:48:28 +0000 Subject: [PATCH 135/155] fix deps --- poetry.lock | 276 ++++++++++++++++++++++++++-------------------------- 1 file changed, 139 insertions(+), 137 deletions(-) diff --git a/poetry.lock b/poetry.lock index add48ac5..5bb6fad1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1251,64 +1251,66 @@ files = [ [[package]] name = "numpy" -version = "2.1.2" +version = "2.1.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30d53720b726ec36a7f88dc873f0eec8447fbc93d93a8f079dfac2629598d6ee"}, - {file = "numpy-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d3ca0a72dd8846eb6f7dfe8f19088060fcb76931ed592d29128e0219652884"}, - {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:fc44e3c68ff00fd991b59092a54350e6e4911152682b4782f68070985aa9e648"}, - {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7c1c60328bd964b53f8b835df69ae8198659e2b9302ff9ebb7de4e5a5994db3d"}, - {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cdb606a7478f9ad91c6283e238544451e3a95f30fb5467fbf715964341a8a86"}, - {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d666cb72687559689e9906197e3bec7b736764df6a2e58ee265e360663e9baf7"}, - {file = "numpy-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6eef7a2dbd0abfb0d9eaf78b73017dbfd0b54051102ff4e6a7b2980d5ac1a03"}, - {file = "numpy-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12edb90831ff481f7ef5f6bc6431a9d74dc0e5ff401559a71e5e4611d4f2d466"}, - {file = "numpy-2.1.2-cp310-cp310-win32.whl", hash = "sha256:a65acfdb9c6ebb8368490dbafe83c03c7e277b37e6857f0caeadbbc56e12f4fb"}, - {file = "numpy-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:860ec6e63e2c5c2ee5e9121808145c7bf86c96cca9ad396c0bd3e0f2798ccbe2"}, - {file = "numpy-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b42a1a511c81cc78cbc4539675713bbcf9d9c3913386243ceff0e9429ca892fe"}, - {file = "numpy-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:faa88bc527d0f097abdc2c663cddf37c05a1c2f113716601555249805cf573f1"}, - {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c82af4b2ddd2ee72d1fc0c6695048d457e00b3582ccde72d8a1c991b808bb20f"}, - {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:13602b3174432a35b16c4cfb5de9a12d229727c3dd47a6ce35111f2ebdf66ff4"}, - {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebec5fd716c5a5b3d8dfcc439be82a8407b7b24b230d0ad28a81b61c2f4659a"}, - {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2b49c3c0804e8ecb05d59af8386ec2f74877f7ca8fd9c1e00be2672e4d399b1"}, - {file = "numpy-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cbba4b30bf31ddbe97f1c7205ef976909a93a66bb1583e983adbd155ba72ac2"}, - {file = "numpy-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8e00ea6fc82e8a804433d3e9cedaa1051a1422cb6e443011590c14d2dea59146"}, - {file = "numpy-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5006b13a06e0b38d561fab5ccc37581f23c9511879be7693bd33c7cd15ca227c"}, - {file = "numpy-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:f1eb068ead09f4994dec71c24b2844f1e4e4e013b9629f812f292f04bd1510d9"}, - {file = "numpy-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7bf0a4f9f15b32b5ba53147369e94296f5fffb783db5aacc1be15b4bf72f43b"}, - {file = "numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b1d0fcae4f0949f215d4632be684a539859b295e2d0cb14f78ec231915d644db"}, - {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f751ed0a2f250541e19dfca9f1eafa31a392c71c832b6bb9e113b10d050cb0f1"}, - {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:bd33f82e95ba7ad632bc57837ee99dba3d7e006536200c4e9124089e1bf42426"}, - {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8cde4f11f0a975d1fd59373b32e2f5a562ade7cde4f85b7137f3de8fbb29a0"}, - {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d95f286b8244b3649b477ac066c6906fbb2905f8ac19b170e2175d3d799f4df"}, - {file = "numpy-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ab4754d432e3ac42d33a269c8567413bdb541689b02d93788af4131018cbf366"}, - {file = "numpy-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e585c8ae871fd38ac50598f4763d73ec5497b0de9a0ab4ef5b69f01c6a046142"}, - {file = "numpy-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9c6c754df29ce6a89ed23afb25550d1c2d5fdb9901d9c67a16e0b16eaf7e2550"}, - {file = "numpy-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:456e3b11cb79ac9946c822a56346ec80275eaf2950314b249b512896c0d2505e"}, - {file = "numpy-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a84498e0d0a1174f2b3ed769b67b656aa5460c92c9554039e11f20a05650f00d"}, - {file = "numpy-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4d6ec0d4222e8ffdab1744da2560f07856421b367928026fb540e1945f2eeeaf"}, - {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:259ec80d54999cc34cd1eb8ded513cb053c3bf4829152a2e00de2371bd406f5e"}, - {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:675c741d4739af2dc20cd6c6a5c4b7355c728167845e3c6b0e824e4e5d36a6c3"}, - {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b2d4e667895cc55e3ff2b56077e4c8a5604361fc21a042845ea3ad67465aa8"}, - {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43cca367bf94a14aca50b89e9bc2061683116cfe864e56740e083392f533ce7a"}, - {file = "numpy-2.1.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:76322dcdb16fccf2ac56f99048af32259dcc488d9b7e25b51e5eca5147a3fb98"}, - {file = "numpy-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32e16a03138cabe0cb28e1007ee82264296ac0983714094380b408097a418cfe"}, - {file = "numpy-2.1.2-cp313-cp313-win32.whl", hash = "sha256:242b39d00e4944431a3cd2db2f5377e15b5785920421993770cddb89992c3f3a"}, - {file = "numpy-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:f2ded8d9b6f68cc26f8425eda5d3877b47343e68ca23d0d0846f4d312ecaa445"}, - {file = "numpy-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ffef621c14ebb0188a8633348504a35c13680d6da93ab5cb86f4e54b7e922b5"}, - {file = "numpy-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad369ed238b1959dfbade9018a740fb9392c5ac4f9b5173f420bd4f37ba1f7a0"}, - {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d82075752f40c0ddf57e6e02673a17f6cb0f8eb3f587f63ca1eaab5594da5b17"}, - {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1600068c262af1ca9580a527d43dc9d959b0b1d8e56f8a05d830eea39b7c8af6"}, - {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a26ae94658d3ba3781d5e103ac07a876b3e9b29db53f68ed7df432fd033358a8"}, - {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13311c2db4c5f7609b462bc0f43d3c465424d25c626d95040f073e30f7570e35"}, - {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:2abbf905a0b568706391ec6fa15161fad0fb5d8b68d73c461b3c1bab6064dd62"}, - {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ef444c57d664d35cac4e18c298c47d7b504c66b17c2ea91312e979fcfbdfb08a"}, - {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bdd407c40483463898b84490770199d5714dcc9dd9b792f6c6caccc523c00952"}, - {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:da65fb46d4cbb75cb417cddf6ba5e7582eb7bb0b47db4b99c9fe5787ce5d91f5"}, - {file = "numpy-2.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c193d0b0238638e6fc5f10f1b074a6993cb13b0b431f64079a509d63d3aa8b7"}, - {file = "numpy-2.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a7d80b2e904faa63068ead63107189164ca443b42dd1930299e0d1cb041cec2e"}, - {file = "numpy-2.1.2.tar.gz", hash = "sha256:13532a088217fa624c99b843eeb54640de23b3414b14aa66d023805eb731066c"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd"}, + {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3"}, + {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098"}, + {file = "numpy-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c"}, + {file = "numpy-2.1.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"}, + {file = "numpy-2.1.3-cp310-cp310-win32.whl", hash = "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23"}, + {file = "numpy-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0"}, + {file = "numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9"}, + {file = "numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564"}, + {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512"}, + {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b"}, + {file = "numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc"}, + {file = "numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0"}, + {file = "numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9"}, + {file = "numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe"}, + {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43"}, + {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56"}, + {file = "numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a"}, + {file = "numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef"}, + {file = "numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f"}, + {file = "numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0"}, + {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408"}, + {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6"}, + {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f"}, + {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17"}, + {file = "numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48"}, + {file = "numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb"}, + {file = "numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761"}, ] [[package]] @@ -2012,93 +2014,93 @@ files = [ [[package]] name = "yarl" -version = "1.17.0" +version = "1.17.1" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d8715edfe12eee6f27f32a3655f38d6c7410deb482158c0b7d4b7fad5d07628"}, - {file = "yarl-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1803bf2a7a782e02db746d8bd18f2384801bc1d108723840b25e065b116ad726"}, - {file = "yarl-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e66589110e20c2951221a938fa200c7aa134a8bdf4e4dc97e6b21539ff026d4"}, - {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7069d411cfccf868e812497e0ec4acb7c7bf8d684e93caa6c872f1e6f5d1664d"}, - {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbf70ba16118db3e4b0da69dcde9d4d4095d383c32a15530564c283fa38a7c52"}, - {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0bc53cc349675b32ead83339a8de79eaf13b88f2669c09d4962322bb0f064cbc"}, - {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6aa18a402d1c80193ce97c8729871f17fd3e822037fbd7d9b719864018df746"}, - {file = "yarl-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d89c5bc701861cfab357aa0cd039bc905fe919997b8c312b4b0c358619c38d4d"}, - {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b728bdf38ca58f2da1d583e4af4ba7d4cd1a58b31a363a3137a8159395e7ecc7"}, - {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:5542e57dc15d5473da5a39fbde14684b0cc4301412ee53cbab677925e8497c11"}, - {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e564b57e5009fb150cb513804d7e9e9912fee2e48835638f4f47977f88b4a39c"}, - {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:eb3c4cff524b4c1c1dba3a6da905edb1dfd2baf6f55f18a58914bbb2d26b59e1"}, - {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:05e13f389038842da930d439fbed63bdce3f7644902714cb68cf527c971af804"}, - {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:153c38ee2b4abba136385af4467459c62d50f2a3f4bde38c7b99d43a20c143ef"}, - {file = "yarl-1.17.0-cp310-cp310-win32.whl", hash = "sha256:4065b4259d1ae6f70fd9708ffd61e1c9c27516f5b4fae273c41028afcbe3a094"}, - {file = "yarl-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:abf366391a02a8335c5c26163b5fe6f514cc1d79e74d8bf3ffab13572282368e"}, - {file = "yarl-1.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19a4fe0279626c6295c5b0c8c2bb7228319d2e985883621a6e87b344062d8135"}, - {file = "yarl-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cadd0113f4db3c6b56868d6a19ca6286f5ccfa7bc08c27982cf92e5ed31b489a"}, - {file = "yarl-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:60d6693eef43215b1ccfb1df3f6eae8db30a9ff1e7989fb6b2a6f0b468930ee8"}, - {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb8bf3843e1fa8cf3fe77813c512818e57368afab7ebe9ef02446fe1a10b492"}, - {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2a5b35fd1d8d90443e061d0c8669ac7600eec5c14c4a51f619e9e105b136715"}, - {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5bf17b32f392df20ab5c3a69d37b26d10efaa018b4f4e5643c7520d8eee7ac7"}, - {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f51b529b958cd06e78158ff297a8bf57b4021243c179ee03695b5dbf9cb6e1"}, - {file = "yarl-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fcaa06bf788e19f913d315d9c99a69e196a40277dc2c23741a1d08c93f4d430"}, - {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32f3ee19ff0f18a7a522d44e869e1ebc8218ad3ae4ebb7020445f59b4bbe5897"}, - {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a4fb69a81ae2ec2b609574ae35420cf5647d227e4d0475c16aa861dd24e840b0"}, - {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7bacc8b77670322132a1b2522c50a1f62991e2f95591977455fd9a398b4e678d"}, - {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:437bf6eb47a2d20baaf7f6739895cb049e56896a5ffdea61a4b25da781966e8b"}, - {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30534a03c87484092080e3b6e789140bd277e40f453358900ad1f0f2e61fc8ec"}, - {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b30df4ff98703649915144be6f0df3b16fd4870ac38a09c56d5d9e54ff2d5f96"}, - {file = "yarl-1.17.0-cp311-cp311-win32.whl", hash = "sha256:263b487246858e874ab53e148e2a9a0de8465341b607678106829a81d81418c6"}, - {file = "yarl-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:07055a9e8b647a362e7d4810fe99d8f98421575e7d2eede32e008c89a65a17bd"}, - {file = "yarl-1.17.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84095ab25ba69a8fa3fb4936e14df631b8a71193fe18bd38be7ecbe34d0f5512"}, - {file = "yarl-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02608fb3f6df87039212fc746017455ccc2a5fc96555ee247c45d1e9f21f1d7b"}, - {file = "yarl-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13468d291fe8c12162b7cf2cdb406fe85881c53c9e03053ecb8c5d3523822cd9"}, - {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8da3f8f368fb7e2f052fded06d5672260c50b5472c956a5f1bd7bf474ae504ab"}, - {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec0507ab6523980bed050137007c76883d941b519aca0e26d4c1ec1f297dd646"}, - {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08fc76df7fd8360e9ff30e6ccc3ee85b8dbd6ed5d3a295e6ec62bcae7601b932"}, - {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d522f390686acb6bab2b917dd9ca06740c5080cd2eaa5aef8827b97e967319d"}, - {file = "yarl-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:147c527a80bb45b3dcd6e63401af8ac574125d8d120e6afe9901049286ff64ef"}, - {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:24cf43bcd17a0a1f72284e47774f9c60e0bf0d2484d5851f4ddf24ded49f33c6"}, - {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c28a44b9e0fba49c3857360e7ad1473fc18bc7f6659ca08ed4f4f2b9a52c75fa"}, - {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:350cacb2d589bc07d230eb995d88fcc646caad50a71ed2d86df533a465a4e6e1"}, - {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fd1ab1373274dea1c6448aee420d7b38af163b5c4732057cd7ee9f5454efc8b1"}, - {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4934e0f96dadc567edc76d9c08181633c89c908ab5a3b8f698560124167d9488"}, - {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8d0a278170d75c88e435a1ce76557af6758bfebc338435b2eba959df2552163e"}, - {file = "yarl-1.17.0-cp312-cp312-win32.whl", hash = "sha256:61584f33196575a08785bb56db6b453682c88f009cd9c6f338a10f6737ce419f"}, - {file = "yarl-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9987a439ad33a7712bd5bbd073f09ad10d38640425fa498ecc99d8aa064f8fc4"}, - {file = "yarl-1.17.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8deda7b8eb15a52db94c2014acdc7bdd14cb59ec4b82ac65d2ad16dc234a109e"}, - {file = "yarl-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56294218b348dcbd3d7fce0ffd79dd0b6c356cb2a813a1181af730b7c40de9e7"}, - {file = "yarl-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1fab91292f51c884b290ebec0b309a64a5318860ccda0c4940e740425a67b6b7"}, - {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf93fa61ff4d9c7d40482ce1a2c9916ca435e34a1b8451e17f295781ccc034f"}, - {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:261be774a0d71908c8830c33bacc89eef15c198433a8cc73767c10eeeb35a7d0"}, - {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deec9693b67f6af856a733b8a3e465553ef09e5e8ead792f52c25b699b8f9e6e"}, - {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c804b07622ba50a765ca7fb8145512836ab65956de01307541def869e4a456c9"}, - {file = "yarl-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d013a7c9574e98c14831a8f22d27277688ec3b2741d0188ac01a910b009987a"}, - {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e2cfcba719bd494c7413dcf0caafb51772dec168c7c946e094f710d6aa70494e"}, - {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c068aba9fc5b94dfae8ea1cedcbf3041cd4c64644021362ffb750f79837e881f"}, - {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3616df510ffac0df3c9fa851a40b76087c6c89cbcea2de33a835fc80f9faac24"}, - {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:755d6176b442fba9928a4df787591a6a3d62d4969f05c406cad83d296c5d4e05"}, - {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c18f6e708d1cf9ff5b1af026e697ac73bea9cb70ee26a2b045b112548579bed2"}, - {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5b937c216b6dee8b858c6afea958de03c5ff28406257d22b55c24962a2baf6fd"}, - {file = "yarl-1.17.0-cp313-cp313-win32.whl", hash = "sha256:d0131b14cb545c1a7bd98f4565a3e9bdf25a1bd65c83fc156ee5d8a8499ec4a3"}, - {file = "yarl-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:01c96efa4313c01329e88b7e9e9e1b2fc671580270ddefdd41129fa8d0db7696"}, - {file = "yarl-1.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d44f67e193f0a7acdf552ecb4d1956a3a276c68e7952471add9f93093d1c30d"}, - {file = "yarl-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16ea0aa5f890cdcb7ae700dffa0397ed6c280840f637cd07bffcbe4b8d68b985"}, - {file = "yarl-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf5469dc7dcfa65edf5cc3a6add9f84c5529c6b556729b098e81a09a92e60e51"}, - {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e662bf2f6e90b73cf2095f844e2bc1fda39826472a2aa1959258c3f2a8500a2f"}, - {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8260e88f1446904ba20b558fa8ce5d0ab9102747238e82343e46d056d7304d7e"}, - {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dc16477a4a2c71e64c5d3d15d7ae3d3a6bb1e8b955288a9f73c60d2a391282f"}, - {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46027e326cecd55e5950184ec9d86c803f4f6fe4ba6af9944a0e537d643cdbe0"}, - {file = "yarl-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc95e46c92a2b6f22e70afe07e34dbc03a4acd07d820204a6938798b16f4014f"}, - {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:16ca76c7ac9515320cd09d6cc083d8d13d1803f6ebe212b06ea2505fd66ecff8"}, - {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:eb1a5b97388f2613f9305d78a3473cdf8d80c7034e554d8199d96dcf80c62ac4"}, - {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:41fd5498975418cdc34944060b8fbeec0d48b2741068077222564bea68daf5a6"}, - {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:146ca582ed04a5664ad04b0e0603934281eaab5c0115a5a46cce0b3c061a56a1"}, - {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6abb8c06107dbec97481b2392dafc41aac091a5d162edf6ed7d624fe7da0587a"}, - {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d14be4613dd4f96c25feb4bd8c0d8ce0f529ab0ae555a17df5789e69d8ec0c5"}, - {file = "yarl-1.17.0-cp39-cp39-win32.whl", hash = "sha256:174d6a6cad1068f7850702aad0c7b1bca03bcac199ca6026f84531335dfc2646"}, - {file = "yarl-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:6af417ca2c7349b101d3fd557ad96b4cd439fdb6ab0d288e3f64a068eea394d0"}, - {file = "yarl-1.17.0-py3-none-any.whl", hash = "sha256:62dd42bb0e49423f4dd58836a04fcf09c80237836796025211bbe913f1524993"}, - {file = "yarl-1.17.0.tar.gz", hash = "sha256:d3f13583f378930377e02002b4085a3d025b00402d5a80911726d43a67911cd9"}, + {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91"}, + {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da"}, + {file = "yarl-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931"}, + {file = "yarl-1.17.1-cp310-cp310-win32.whl", hash = "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b"}, + {file = "yarl-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243"}, + {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217"}, + {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988"}, + {file = "yarl-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4"}, + {file = "yarl-1.17.1-cp311-cp311-win32.whl", hash = "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7"}, + {file = "yarl-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3"}, + {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61"}, + {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d"}, + {file = "yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199"}, + {file = "yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96"}, + {file = "yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df"}, + {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488"}, + {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374"}, + {file = "yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258"}, + {file = "yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2"}, + {file = "yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda"}, + {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6"}, + {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159"}, + {file = "yarl-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f"}, + {file = "yarl-1.17.1-cp39-cp39-win32.whl", hash = "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473"}, + {file = "yarl-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138"}, + {file = "yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06"}, + {file = "yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47"}, ] [package.dependencies] From 816318499897151b7df9dc07d9984df64da75382 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:59:55 +0000 Subject: [PATCH 136/155] use async call --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 992f3cbf..f1a017c0 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -318,7 +318,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta logger.debug("An invalid status was provided but did not raise an exception.") return - action.update(status=new_status) + await action.aupdate(status=new_status) await ctx.respond( content=f"Updated action: {action.description} status to be: {action.status}", @@ -377,7 +377,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str ) return - action.update(description=description) + await action.aupdate(description=description) await ctx.respond(content="Action description updated!") From 3b052a67e87e2703e69d109ee3bd1ad4c638b435 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 16:03:18 +0000 Subject: [PATCH 137/155] use enum status checks --- cogs/committee_actions_tracking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index f1a017c0..86f283f2 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -177,7 +177,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Se filtered_user_actions: list[AssignedCommitteeAction] = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status="INP") | Q(status="BLK") | Q(status="NST"), + Q(status=Status.IN_PROGRESS) | Q(status=Status.BLOCKED) | Q(status=Status.NOT_STARTED), discord_id=int(interaction_user.id), ) ] @@ -539,7 +539,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe if not status: user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status="INP") | Q(status="BLK") | Q(status="NST"), + Q(status=Status.IN_PROGRESS) | Q(status=Status.BLOCKED) | Q(status=Status.NOT_STARTED), discord_id=int(action_member.id), ) ] From 632147c6f59501309f6e4cd173abb850e4977b6b Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 16:16:20 +0000 Subject: [PATCH 138/155] fix line lengths --- cogs/committee_actions_tracking.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 86f283f2..18650a0d 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -35,11 +35,11 @@ class Status(Enum): """Enum class to define the possible statuses of an action.""" - BLOCKED: Final[str] = "BLK" - CANCELLED: Final[str] = "CND" - COMPLETED: Final[str] = "CMP" - IN_PROGRESS: Final[str] = "INP" - NOT_STARTED: Final[str] = "NST" + BLOCKED = "BLK" + CANCELLED = "CND" + COMPLETED = "CMP" + IN_PROGRESS = "INP" + NOT_STARTED = "NST" class CommitteeActionsTrackingBaseCog(TeXBotBaseCog): @@ -177,7 +177,11 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Se filtered_user_actions: list[AssignedCommitteeAction] = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status=Status.IN_PROGRESS) | Q(status=Status.BLOCKED) | Q(status=Status.NOT_STARTED), + ( + Q(status=Status.IN_PROGRESS) + | Q(status=Status.BLOCKED) + | Q(status=Status.NOT_STARTED) + ), discord_id=int(interaction_user.id), ) ] @@ -539,7 +543,11 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe if not status: user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( - Q(status=Status.IN_PROGRESS) | Q(status=Status.BLOCKED) | Q(status=Status.NOT_STARTED), + ( + Q(status=Status.IN_PROGRESS) + | Q(status=Status.BLOCKED) + | Q(status=Status.NOT_STARTED) + ), discord_id=int(action_member.id), ) ] From adf57b3a69c5658b14db847f112252d04e5527c8 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 16:28:07 +0000 Subject: [PATCH 139/155] Fix line lengths --- cogs/committee_actions_tracking.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 18650a0d..013683b6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -178,9 +178,9 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Se filtered_user_actions: list[AssignedCommitteeAction] = [ action async for action in await AssignedCommitteeAction.objects.afilter( ( - Q(status=Status.IN_PROGRESS) - | Q(status=Status.BLOCKED) - | Q(status=Status.NOT_STARTED) + Q(status=Status.IN_PROGRESS) | + Q(status=Status.BLOCKED) | + Q(status=Status.NOT_STARTED) ), discord_id=int(interaction_user.id), ) @@ -544,9 +544,9 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( ( - Q(status=Status.IN_PROGRESS) - | Q(status=Status.BLOCKED) - | Q(status=Status.NOT_STARTED) + Q(status=Status.IN_PROGRESS) | + Q(status=Status.BLOCKED) | + Q(status=Status.NOT_STARTED) ), discord_id=int(action_member.id), ) From 79818faf9a571443d8d04e74fdac21a2ed9cda6a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 16:31:58 +0000 Subject: [PATCH 140/155] use enum for list-all-actions --- cogs/committee_actions_tracking.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 013683b6..bce28b7c 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -678,7 +678,11 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st action async for action in AssignedCommitteeAction.objects.select_related().all() ] - desired_status: list[str] = [status] if status else ["NST", "INP", "BLK"] + desired_status: list[str] = [status] if status else [ + Status.NOT_STARTED.value, + Status.IN_PROGRESS.value, + Status.BLOCKED.value, + ] committee_members: list[discord.Member] = committee_role.members From cc517a1cb060c00988bce986f1891d6482a1a10b Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 16:56:21 +0000 Subject: [PATCH 141/155] fixes to async --- cogs/committee_actions_tracking.py | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index bce28b7c..eafd7667 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -155,40 +155,30 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Se logger.debug("User action ID autocomplete could not acquire an interaction user!") return set() - admin_role: discord.Role | None = discord.utils.get( ctx.bot.main_guild.roles, name="Admin", ) if admin_role and admin_role in interaction_user.roles: - all_actions: list[AssignedCommitteeAction] = [ - action - async for action in AssignedCommitteeAction.objects.select_related().all() - ] - return { discord.OptionChoice( name=f"{action.description} ({action.status})", value=str(action.id), ) - for action in all_actions + for action in AssignedCommitteeAction.objects.select_related().all() } - filtered_user_actions: list[AssignedCommitteeAction] = [ - action async for action in await AssignedCommitteeAction.objects.afilter( + return { + discord.OptionChoice(name=action.description, value=str(action.id)) + async for action in await AssignedCommitteeAction.objects.afilter( ( - Q(status=Status.IN_PROGRESS) | - Q(status=Status.BLOCKED) | - Q(status=Status.NOT_STARTED) + Q(status=Status.IN_PROGRESS.value) | + Q(status=Status.BLOCKED.value) | + Q(status=Status.NOT_STARTED.value) ), discord_id=int(interaction_user.id), ) - ] - - return { - discord.OptionChoice(name=action.description, value=str(action.id)) - for action in filtered_user_actions } @staticmethod @@ -544,9 +534,9 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe user_actions = [ action async for action in await AssignedCommitteeAction.objects.afilter( ( - Q(status=Status.IN_PROGRESS) | - Q(status=Status.BLOCKED) | - Q(status=Status.NOT_STARTED) + Q(status=Status.IN_PROGRESS.value) | + Q(status=Status.BLOCKED.value) | + Q(status=Status.NOT_STARTED.value) ), discord_id=int(action_member.id), ) From c2d436e97b43db74d70e1da683b386bc34028fc6 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:13:27 +0000 Subject: [PATCH 142/155] prep for error handling refactor --- cogs/committee_actions_tracking.py | 43 +++++------------------------- 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index eafd7667..c4154e46 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -45,7 +45,7 @@ class Status(Enum): class CommitteeActionsTrackingBaseCog(TeXBotBaseCog): """Base cog class that defines methods for committee actions tracking.""" - async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str, *, silent: bool) -> AssignedCommitteeAction | str: # noqa: E501 + async def _create_action(self, ctx: TeXBotApplicationContext, action_user: discord.Member, description: str) -> AssignedCommitteeAction | None: # noqa: E501 """ Create the action object with the given description for the given user. @@ -53,24 +53,9 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco If unsuccessful, a string explaining the error will be returned. """ if len(description) >= 200: - if not silent: - await self.command_send_error( - ctx, - message=( - "Action description was too long! " - "Max description length is 200 characters." - ), - ) return "Action description exceeded the maximum character limit (200)." if action_user.bot: - if not silent: - await self.command_send_error( - ctx=ctx, - message=( - "Action creation aborted because actions cannot be assigned to bots!" - ), - ) return f"Actions cannot be assigned to bots. ({action_user})" try: @@ -98,11 +83,6 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco f"User: {action_user} already has an action " f"with description: {description}!" ) - if not silent: - await self.command_send_error( - ctx, - message=(DUPLICATE_ACTION_MESSAGE), - ) logger.debug( "Action creation for user: %s, failed because an action " "with description: %s, already exists.", @@ -110,12 +90,6 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco description, ) return DUPLICATE_ACTION_MESSAGE - if not silent: - await ctx.respond( - content=( - f"Action: {action.description} created for user: {action_user.mention}" - ), - ) return action @@ -243,7 +217,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * ) return - await self._create_action(ctx, action_user, action_description, silent=False) + await self._create_action(ctx, action_user, action_description) @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-status", @@ -416,7 +390,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await self.command_send_error(ctx, message="Index out of range... check the logs!") return - await self._create_action(ctx, action_user, action_description, silent=False) + await self._create_action(ctx, action_user, action_description) @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", @@ -449,11 +423,10 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr committee_member: discord.Member for committee_member in committee_members: - action_or_error_message: AssignedCommitteeAction | str = await self._create_action( - ctx, - committee_member, - action_description, - silent=True, + action_or_error_message: AssignedCommitteeAction | None = await self._create_action( + ctx=ctx, + action_user=committee_member, + description=action_description, ) if isinstance(action_or_error_message, AssignedCommitteeAction): success_members.append(committee_member) @@ -632,7 +605,6 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me ctx, new_user_to_action, action_to_reassign.description, - silent=False, ) if isinstance(new_action, AssignedCommitteeAction): @@ -780,5 +752,4 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di ctx, actioned_message_user, actioned_message_text, - silent=False, ) From 76479d231eead31c909a76a52d1100763536ebe6 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:48:00 +0000 Subject: [PATCH 143/155] Fix exception handling --- cogs/committee_actions_tracking.py | 100 +++++++++++++++++++++-------- exceptions/__init__.py | 3 + exceptions/committee_actions.py | 38 +++++++++++ 3 files changed, 114 insertions(+), 27 deletions(-) create mode 100644 exceptions/committee_actions.py diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index c4154e46..fb6aa945 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -21,7 +21,11 @@ from django.db.models import Q from db.core.models import AssignedCommitteeAction, DiscordMember -from exceptions import CommitteeRoleDoesNotExistError +from exceptions import ( + CommitteeRoleDoesNotExistError, + InvalidActionDescriptionError, + InvalidActionTargetError, +) from utils import ( CommandChecks, TeXBotApplicationContext, @@ -53,10 +57,17 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco If unsuccessful, a string explaining the error will be returned. """ if len(description) >= 200: - return "Action description exceeded the maximum character limit (200)." + INVALID_DESCRIPTION_ERROR_MESSAGE: Final[str] = ( + f"Action description length was {len(description)} characters which is " + "greater than the maximum of 200." + ) + raise InvalidActionTargetError(message=INVALID_DESCRIPTION_ERROR_MESSAGE) if action_user.bot: - return f"Actions cannot be assigned to bots. ({action_user})" + INVALID_ACTION_TARGET_MESSAGE: Final[str] = ( + f"Actions cannot be assigned to bots. ({action_user})" + ) + raise InvalidActionTargetError(message=INVALID_ACTION_TARGET_MESSAGE) try: action: AssignedCommitteeAction = await AssignedCommitteeAction.objects.acreate( @@ -89,7 +100,9 @@ async def _create_action(self, ctx: TeXBotApplicationContext, action_user: disco action_user, description, ) - return DUPLICATE_ACTION_MESSAGE + raise InvalidActionDescriptionError( + message=DUPLICATE_ACTION_MESSAGE, + ) from create_action_error return action @@ -217,7 +230,15 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * ) return - await self._create_action(ctx, action_user, action_description) + try: + await self._create_action(ctx, action_user, action_description) + await ctx.respond( + content=f"Action `{action_description}` created for: {action_user.mention}", + ) + except ( + InvalidActionDescriptionError, InvalidActionTargetError, + ) as creation_failed_error: + await ctx.respond(content=creation_failed_error.message) @discord.slash_command( # type: ignore[no-untyped-call, misc] name="update-status", @@ -390,7 +411,16 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await self.command_send_error(ctx, message="Index out of range... check the logs!") return - await self._create_action(ctx, action_user, action_description) + try: + await self._create_action(ctx, action_user, action_description) + await ctx.respond( + content=f"Action `{action_description}` created for: {action_user.mention}", + ) + except ( + InvalidActionTargetError, InvalidActionDescriptionError, + ) as creation_failed_error: + await ctx.respond(content=creation_failed_error.message) + return @discord.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", @@ -423,15 +453,17 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr committee_member: discord.Member for committee_member in committee_members: - action_or_error_message: AssignedCommitteeAction | None = await self._create_action( - ctx=ctx, - action_user=committee_member, - description=action_description, - ) - if isinstance(action_or_error_message, AssignedCommitteeAction): + try: + _: AssignedCommitteeAction | None = await self._create_action( + ctx=ctx, + action_user=committee_member, + description=action_description, + ) success_members.append(committee_member) - else: - failed_members += action_or_error_message + "\n" + except ( + InvalidActionDescriptionError, InvalidActionTargetError, + ) as creation_failed_error: + failed_members += creation_failed_error.message + "\n" response_message: str = "" @@ -601,14 +633,19 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me ) return - new_action: AssignedCommitteeAction | str = await self._create_action( - ctx, - new_user_to_action, - action_to_reassign.description, - ) - - if isinstance(new_action, AssignedCommitteeAction): - await action_to_reassign.adelete() + try: + new_action: AssignedCommitteeAction | None = await self._create_action( + ctx=ctx, + action_user=new_user_to_action, + description=action_to_reassign.description, + ) + if new_action: + await action_to_reassign.adelete() + except ( + InvalidActionDescriptionError, InvalidActionTargetError, + ) as invalid_description_error: + await ctx.respond(content=invalid_description_error.message) + return @discord.slash_command( # type: ignore[no-untyped-call, misc] name="list-all", @@ -748,8 +785,17 @@ async def action_message_author(self, ctx: TeXBotApplicationContext, message: di await ctx.respond(content="Message author is not in the server!") return - await self._create_action( - ctx, - actioned_message_user, - actioned_message_text, - ) + try: + await self._create_action( + ctx=ctx, + action_user=actioned_message_user, + description=actioned_message_text, + ) + await ctx.respond( + content=f"Action `{actioned_message_text}` created " + f"for: {actioned_message_user.mention}", + ) + except ( + InvalidActionTargetError, InvalidActionDescriptionError, + ) as creation_failure_error: + await ctx.respond(content=creation_failure_error.message) diff --git a/exceptions/__init__.py b/exceptions/__init__.py index 2994f757..a072074c 100644 --- a/exceptions/__init__.py +++ b/exceptions/__init__.py @@ -14,6 +14,8 @@ "GuestRoleDoesNotExistError", "GuildDoesNotExistError", "ImproperlyConfiguredError", + "InvalidActionDescriptionError", + "InvalidActionTargetError", "InvalidMessagesJSONFileError", "MemberRoleDoesNotExistError", "MessagesJSONFileMissingKeyError", @@ -27,6 +29,7 @@ ) +from .committee_actions import InvalidActionDescriptionError, InvalidActionTargetError from .config_changes import ( ImproperlyConfiguredError, RestartRequiredDueToConfigChange, diff --git a/exceptions/committee_actions.py b/exceptions/committee_actions.py new file mode 100644 index 00000000..d6db4644 --- /dev/null +++ b/exceptions/committee_actions.py @@ -0,0 +1,38 @@ +"""Custom exception classes for committee-action tracking.""" + +from collections.abc import Sequence + +__all__: Sequence[str] = () + + +from typing import override + +from classproperties import classproperty + +from .base import BaseTeXBotError + + +class InvalidActionTargetError(BaseTeXBotError, RuntimeError): + """ + Exception class to raise when the desired target of a committee action is invalid. + + This could be that the target user is not in the server. + """ + + @classproperty + @override + def DEFAULT_MESSAGE(cls) -> str: # noqa: N805 + return "The target of the action is invalid." + + +class InvalidActionDescriptionError(BaseTeXBotError, RuntimeError): + """ + Exception class to raise when the description of a committee action is invalid. + + This could be due to it being too long, or some other validation issue. + """ + + @classproperty + @override + def DEFAULT_MESSAGE(cls) -> str: # noqa: N805 + return "The description of the action is invalid." From 8730b9f033f1764cf64019f6ca5a8def2cea7a0f Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:33:07 +0000 Subject: [PATCH 144/155] convert to command group --- cogs/committee_actions_tracking.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index fb6aa945..5d76f0ec 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -181,7 +181,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> Set[ return {discord.OptionChoice(name=value, value=code) for code, value in status_options} - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="create", description="Adds a new action with the specified description.", ) @@ -240,7 +240,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * ) as creation_failed_error: await ctx.respond(content=creation_failed_error.message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="update-status", description="Update the status of the provided action.", ) @@ -314,7 +314,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="update-description", description="Update the description of the provided action.", ) @@ -370,7 +370,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await ctx.respond(content="Action description updated!") - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="action-random-user", description="Creates an action object with the specified description and random user.", ) @@ -422,7 +422,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await ctx.respond(content=creation_failed_error.message) return - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="action-all-committee", description="Creates an action with the description for every committee member", ) @@ -487,7 +487,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr await ctx.respond(content=response_message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="list", description="Lists all actions for a specified user", ) @@ -574,7 +574,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="reassign", description="Reassign the specified action to another user.", ) @@ -647,7 +647,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me await ctx.respond(content=invalid_description_error.message) return - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="list-all", description="List all current actions.", ) @@ -712,7 +712,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content=all_actions_message) - @discord.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] name="delete", description="Deletes the specified action from the database completely.", ) From 680e96b72d62b1b9a25bc4649890db1557a1f2bd Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:35:29 +0000 Subject: [PATCH 145/155] fix error --- cogs/committee_actions_tracking.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 5d76f0ec..6fec0bc9 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -181,7 +181,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> Set[ return {discord.OptionChoice(name=value, value=code) for code, value in status_options} - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="create", description="Adds a new action with the specified description.", ) @@ -240,7 +240,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * ) as creation_failed_error: await ctx.respond(content=creation_failed_error.message) - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="update-status", description="Update the status of the provided action.", ) @@ -314,7 +314,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="update-description", description="Update the description of the provided action.", ) @@ -370,7 +370,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await ctx.respond(content="Action description updated!") - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="action-random-user", description="Creates an action object with the specified description and random user.", ) @@ -422,7 +422,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await ctx.respond(content=creation_failed_error.message) return - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="action-all-committee", description="Creates an action with the description for every committee member", ) @@ -487,7 +487,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr await ctx.respond(content=response_message) - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="list", description="Lists all actions for a specified user", ) @@ -574,7 +574,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="reassign", description="Reassign the specified action to another user.", ) @@ -647,7 +647,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me await ctx.respond(content=invalid_description_error.message) return - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="list-all", description="List all current actions.", ) @@ -712,7 +712,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content=all_actions_message) - @committee_actions.slash_command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( # type: ignore[no-untyped-call, misc] name="delete", description="Deletes the specified action from the database completely.", ) From 4c99ea24a6cfc393c520cbe4070f642174f9ff1a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:41:02 +0000 Subject: [PATCH 146/155] remove redundant ignore comments --- cogs/committee_actions_tracking.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 6fec0bc9..36e9dec4 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -181,7 +181,7 @@ async def autocomplete_get_action_status(ctx: TeXBotAutocompleteContext) -> Set[ return {discord.OptionChoice(name=value, value=code) for code, value in status_options} - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="create", description="Adds a new action with the specified description.", ) @@ -240,7 +240,7 @@ async def create(self, ctx: TeXBotApplicationContext, action_description: str, * ) as creation_failed_error: await ctx.respond(content=creation_failed_error.message) - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="update-status", description="Update the status of the provided action.", ) @@ -314,7 +314,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta ephemeral=True, ) - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="update-description", description="Update the description of the provided action.", ) @@ -370,7 +370,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await ctx.respond(content="Action description updated!") - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="action-random-user", description="Creates an action object with the specified description and random user.", ) @@ -422,7 +422,7 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip await ctx.respond(content=creation_failed_error.message) return - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="action-all-committee", description="Creates an action with the description for every committee member", ) @@ -487,7 +487,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr await ctx.respond(content=response_message) - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="list", description="Lists all actions for a specified user", ) @@ -574,7 +574,7 @@ async def list_user_actions(self, ctx: TeXBotApplicationContext, *, action_membe await ctx.respond(content=actions_message) - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="reassign", description="Reassign the specified action to another user.", ) @@ -647,7 +647,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me await ctx.respond(content=invalid_description_error.message) return - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="list-all", description="List all current actions.", ) @@ -712,7 +712,7 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st await ctx.respond(content=all_actions_message) - @committee_actions.command( # type: ignore[no-untyped-call, misc] + @committee_actions.command( name="delete", description="Deletes the specified action from the database completely.", ) From f8a1b8d20ae9613f170eb4196910844c6a1746a9 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:43:38 +0000 Subject: [PATCH 147/155] update db migrations --- .../0010_assignedcommitteeaction_and_more.py | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 db/core/migrations/0010_assignedcommitteeaction_and_more.py diff --git a/db/core/migrations/0010_assignedcommitteeaction_and_more.py b/db/core/migrations/0010_assignedcommitteeaction_and_more.py deleted file mode 100644 index 1b5222a6..00000000 --- a/db/core/migrations/0010_assignedcommitteeaction_and_more.py +++ /dev/null @@ -1,68 +0,0 @@ -# Generated by Django 5.0.7 on 2024-08-01 09:43 - -import db.core.models.managers -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("core", "0009_auto_20240519_0020"), - ] - - operations = [ - migrations.CreateModel( - name="AssignedCommitteeAction", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "description", - models.TextField(max_length=200, verbose_name="Description"), - ), - ( - "status", - models.CharField( - choices=[ - ("CND", "Cancelled"), - ("BLK", "Blocked"), - ("CMP", "Complete"), - ("INP", "In Progress"), - ("NST", "Not Started"), - ], - default="NST", - max_length=3, - ), - ), - ( - "discord_member", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="assigned_committee_actions", - to="core.discordmember", - verbose_name="Discord Member", - ), - ), - ], - options={ - "verbose_name": "Assigned Committee Action", - }, - managers=[ - ("objects", db.core.models.managers.RelatedDiscordMemberManager()), - ], - ), - migrations.AddConstraint( - model_name="assignedcommitteeaction", - constraint=models.UniqueConstraint( - fields=("discord_member", "description"), name="unique_user_action" - ), - ), - ] From 3fd5b4d1484eb31e505663c4ddd18e5644727f75 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:45:39 +0000 Subject: [PATCH 148/155] Actually add the migration this time --- .../0010_assignedcommitteeaction.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 db/core/migrations/0010_assignedcommitteeaction.py diff --git a/db/core/migrations/0010_assignedcommitteeaction.py b/db/core/migrations/0010_assignedcommitteeaction.py new file mode 100644 index 00000000..bbbbc824 --- /dev/null +++ b/db/core/migrations/0010_assignedcommitteeaction.py @@ -0,0 +1,31 @@ +# Generated by Django 5.1.3 on 2024-11-07 23:43 + +import db.core.models.managers +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_auto_20240519_0020'), + ] + + operations = [ + migrations.CreateModel( + name='AssignedCommitteeAction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(max_length=200, verbose_name='Description')), + ('status', models.CharField(choices=[('BLK', 'Blocked'), ('CND', 'Cancelled'), ('CMP', 'Complete'), ('INP', 'In Progress'), ('NST', 'Not Started')], default='NST', max_length=3)), + ('discord_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assigned_committee_actions', to='core.discordmember', verbose_name='Discord Member')), + ], + options={ + 'verbose_name': 'Assigned Committee Action', + 'constraints': [models.UniqueConstraint(fields=('discord_member', 'description'), name='unique_user_action')], + }, + managers=[ + ('objects', db.core.models.managers.RelatedDiscordMemberManager()), + ], + ), + ] From f98b15782220d8693a569a2dc01e8fd6d77a1a09 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:50:45 +0000 Subject: [PATCH 149/155] improve log deletion response message --- cogs/committee_actions_tracking.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 36e9dec4..81dab802 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -747,14 +747,16 @@ async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> ) except (ObjectDoesNotExist, MultipleObjectsReturned): await self.command_send_error( - ctx, + ctx=ctx, message="Action provided was either not unique or could not be found.", ) return + action_description: str = action.description + await action.adelete() - await ctx.respond(content="Action successfully deleted.") + await ctx.respond(content=f"Action `{action_description}` successfully deleted.") class CommitteeActionsTrackingContextCommandsCog(CommitteeActionsTrackingBaseCog): From b748091bc74d85c8335830045fb8ab826921fc8e Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 8 Nov 2024 07:39:31 +0000 Subject: [PATCH 150/155] fix missing success reassign message --- cogs/committee_actions_tracking.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 81dab802..5b2dd3ed 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -641,6 +641,12 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me ) if new_action: await action_to_reassign.adelete() + await ctx.respond( + content=( + f"Action `{new_action.description}` successfully " + f"reassigned to {new_user_to_action}!" + ), + ) except ( InvalidActionDescriptionError, InvalidActionTargetError, ) as invalid_description_error: From 27a94b7428ecc679daa9d0f0aea84ba791a01054 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 8 Nov 2024 07:52:05 +0000 Subject: [PATCH 151/155] Improve response messages --- cogs/committee_actions_tracking.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 5b2dd3ed..1bf409b0 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -301,7 +301,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta if not new_status: await self.command_send_error( - ctx, + ctx=ctx, message=f"Status ({status}) provided was not valid or could not be found.", ) logger.debug("An invalid status was provided but did not raise an exception.") @@ -310,7 +310,7 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta await action.aupdate(status=new_status) await ctx.respond( - content=f"Updated action: {action.description} status to be: {action.status}", + content=f"Status for action`{action.description}` updated to `{action.status}`", ephemeral=True, ) @@ -361,7 +361,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str ) except (MultipleObjectsReturned, ObjectDoesNotExist): await self.command_send_error( - ctx, + ctx=ctx, message="Action provided was either not unique or could not be found.", ) return @@ -412,7 +412,11 @@ async def action_random_user(self, ctx: TeXBotApplicationContext, action_descrip return try: - await self._create_action(ctx, action_user, action_description) + await self._create_action( + ctx=ctx, + action_user=action_user, + description=action_description, + ) await ctx.respond( content=f"Action `{action_description}` created for: {action_user.mention}", ) @@ -469,7 +473,7 @@ async def action_all_committee(self, ctx: TeXBotApplicationContext, action_descr if success_members: response_message += ( - f"Successfully created action: {action_description} for users: \n" + f"Successfully created action `{action_description}` for users: \n" ) response_message += "\n".join( @@ -602,7 +606,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me action_id_int: int = int(action_id) except ValueError: await self.command_send_error( - ctx, + ctx=ctx, message="Action ID entered was not valid! Please use the autocomplete.", logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", ) @@ -627,7 +631,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me if str(action_to_reassign.discord_member) == new_user_to_action_hash: # type: ignore[has-type] await ctx.respond( content=( - f"HEY! Action: {action_to_reassign.description} is already assigned " + f"HEY! Action `{action_to_reassign.description}` is already assigned " f"to user: {new_user_to_action.mention}\nNo action has been taken." ), ) @@ -644,7 +648,7 @@ async def reassign_action(self, ctx:TeXBotApplicationContext, action_id: str, me await ctx.respond( content=( f"Action `{new_action.description}` successfully " - f"reassigned to {new_user_to_action}!" + f"reassigned to {new_user_to_action.mention}!" ), ) except ( @@ -742,7 +746,7 @@ async def delete_action(self, ctx: TeXBotApplicationContext, action_id: str) -> action_id_int: int = int(action_id) except ValueError: await self.command_send_error( - ctx, + ctx=ctx, message="Action ID entered was not valid! Please use the autocomplete.", logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", ) From ea41234c2091bc461e2291db03ffb241d7ad900d Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 8 Nov 2024 07:55:01 +0000 Subject: [PATCH 152/155] Fix async call --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 1bf409b0..c126f813 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -153,7 +153,7 @@ async def autocomplete_get_user_action_ids(ctx: TeXBotAutocompleteContext) -> Se name=f"{action.description} ({action.status})", value=str(action.id), ) - for action in AssignedCommitteeAction.objects.select_related().all() + async for action in AssignedCommitteeAction.objects.select_related().all() } return { From 3c89ed80e409f3b44b95fcbb2d1fec41c88aba76 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 8 Nov 2024 08:00:44 +0000 Subject: [PATCH 153/155] update response messages for description update --- cogs/committee_actions_tracking.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index c126f813..e7459ee6 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -333,14 +333,14 @@ async def update_status(self, ctx: TeXBotApplicationContext, action_id: str, sta required=True, parameter_name="action_description", ) - async def update_description(self, ctx: TeXBotApplicationContext, action_id: str, description: str) -> None: # noqa: E501 + async def update_description(self, ctx: TeXBotApplicationContext, action_id: str, new_description: str) -> None: # noqa: E501 """ Definition and callback response of the "update-description" command. Takes in an action id and description, retrieves the action from the ID and updates the action to with the new description. """ - if len(description) >= 200: + if len(new_description) >= 200: await ctx.respond( content=":warning: The provided description was too long! No action taken.", ) @@ -350,7 +350,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str action_id_int: int = int(action_id) except ValueError: await self.command_send_error( - ctx, + ctx=ctx, message="Action ID entered was not valid! Please use the autocomplete.", logging_message=f"{ctx.user} entered action ID: {action_id} which was invalid", ) @@ -366,9 +366,13 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str ) return - await action.aupdate(description=description) + old_description: str = action.description - await ctx.respond(content="Action description updated!") + await action.aupdate(description=new_description) + + await ctx.respond( + content=f"Action `{old_description}` updated to {action.description}!", + ) @committee_actions.command( name="action-random-user", From fc37dee27a68ca8817ce8e15f0a13ce8c0e2f22a Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 8 Nov 2024 08:04:14 +0000 Subject: [PATCH 154/155] minor fix --- cogs/committee_actions_tracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index e7459ee6..3e752710 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -371,7 +371,7 @@ async def update_description(self, ctx: TeXBotApplicationContext, action_id: str await action.aupdate(description=new_description) await ctx.respond( - content=f"Action `{old_description}` updated to {action.description}!", + content=f"Action `{old_description}` updated to `{action.description}`!", ) @committee_actions.command( From 48dd7ba7f374712a666a63153dfcde64135d29c1 Mon Sep 17 00:00:00 2001 From: MattyTheHacker <18513864+MattyTheHacker@users.noreply.github.com> Date: Fri, 8 Nov 2024 08:09:35 +0000 Subject: [PATCH 155/155] update log messages --- cogs/committee_actions_tracking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cogs/committee_actions_tracking.py b/cogs/committee_actions_tracking.py index 3e752710..dbf25e06 100644 --- a/cogs/committee_actions_tracking.py +++ b/cogs/committee_actions_tracking.py @@ -713,7 +713,8 @@ async def list_all_actions(self, ctx:TeXBotApplicationContext, *, ping: bool, st } if not filtered_committee_actions: - await ctx.respond(content="No one has any actions!") + await ctx.respond(content="No one has any actions that match the request!") + logger.debug("No actions found with the status filter: %s", status) return all_actions_message: str = "\n".join(