diff --git a/jarvis_tasks/__init__.py b/jarvis_tasks/__init__.py index d8d7106..bcdf456 100644 --- a/jarvis_tasks/__init__.py +++ b/jarvis_tasks/__init__.py @@ -2,13 +2,12 @@ import asyncio from typing import Optional -#import rook from jarvis_core.db import connect from jarvis_core.log import get_logger -from naff import Client, Intents +from interactions import Client, Intents from jarvis_tasks import const -from jarvis_tasks.config import TaskConfig +from jarvis_tasks.config import load_config from jarvis_tasks.prometheus.serve import StatTracker from jarvis_tasks.tasks import ( autokick, @@ -26,7 +25,7 @@ __version__ = const.__version__ logger = None -async def _start(config: Optional[str] = "config.yaml") -> None: +async def _start() -> None: """ Main start function. @@ -34,15 +33,11 @@ async def _start(config: Optional[str] = "config.yaml") -> None: config: Config path """ # Load config - config = TaskConfig.from_yaml(config) - -# if config.rook_token: -# rook.start(token=config.rook_token, labels={"env": "dev"}) + config = load_config() # Connect to database - testing = config.mongo["database"] != "jarvis" - logger.debug(f"Connecting to database, testing={testing}") - connect(**config.mongo["connect"], testing=testing) + logger.debug(f"Connecting to database, environ={config.environment.value}") + await connect(**config.mongo.dict(), testing=config.environment.value == "develop") # Get event loop loop = asyncio.get_event_loop() @@ -66,10 +61,12 @@ async def _start(config: Optional[str] = "config.yaml") -> None: reddit.reddit, reminder.remind, temprole.remove, - twitter.twitter, + # twitter.twitter, warning.unwarn, ] - tasks = [loop.create_task(f(bot)) for f in functions] + [loop.create_task(tracker.start())] + tasks = [loop.create_task(f(bot)) for f in functions] + [ + # loop.create_task(tracker.start()) + ] for task in tasks: await task except KeyboardInterrupt: @@ -77,7 +74,7 @@ async def _start(config: Optional[str] = "config.yaml") -> None: task.cancel() -def start(config: Optional[str] = "config.yaml") -> None: +def start() -> None: """ Start the background tasks. @@ -86,10 +83,10 @@ def start(config: Optional[str] = "config.yaml") -> None: """ global logger, debug # Set log level - _config = TaskConfig.from_yaml(config) + _config = load_config() logger = get_logger(__name__) logger.setLevel(_config.log_level) # Run the main tasks logger.debug("Starting asyncio") - asyncio.run(_start(config)) + asyncio.run(_start()) diff --git a/jarvis_tasks/config.py b/jarvis_tasks/config.py index 5d3a0b5..0b5f9e2 100644 --- a/jarvis_tasks/config.py +++ b/jarvis_tasks/config.py @@ -1,7 +1,149 @@ """Task config.""" -from jarvis_core.config import Config +from enum import Enum +from os import environ +from pathlib import Path +from typing import Optional + +import yaml +import orjson as json +from dotenv import load_dotenv +from jarvis_core.util import find_all +from pydantic import BaseModel + +try: + from yaml import CLoader as Loader +except ImportError: + from yaml import Loader -class TaskConfig(Config): - REQUIRED = ["token", "mongo"] - OPTIONAL = {"log_level": "WARNING", "twitter": None, "reddit": None, "rook_token": None} +class Environment(Enum): + """JARVIS running environment.""" + + production = "production" + develop = "develop" + + +class Mongo(BaseModel): + """MongoDB config.""" + + host: list[str] | str = "localhost" + username: Optional[str] = None + password: Optional[str] = None + port: int = 27017 + + +class Reddit(BaseModel): + """Reddit config.""" + + user_agent: Optional[str] = None + client_secret: str + client_id: str + + +class Twitter(BaseModel): + """Twitter config.""" + + consumer_key: str + consumer_secret: str + access_token: str + access_secret: str + bearer_token: str + + +class Config(BaseModel): + """Tasks config model.""" + + token: str + mongo: Mongo + reddit: Optional[Reddit] = None + twitter: Optional[Twitter] = None + log_level: str = "INFO" + environment: Environment = Environment.develop + + +_config: Config = None + + +def _load_json() -> Config | None: + path = Path("config.json") + config = None + if path.exists(): + with path.open() as f: + j = json.loads(f.read()) + config = Config(**j) + + return config + + +def _load_yaml() -> Config | None: + path = Path("config.yaml") + config = None + if path.exists(): + with path.open() as f: + y = yaml.load(f.read(), Loader=Loader) + config = Config(**y) + + return config + + +def _load_env() -> Config | None: + load_dotenv() + data = {} + mongo = {} + twitter = {} + reddit = {} + mongo_keys = find_all(lambda x: x.upper().startswith("MONGO"), environ.keys()) + reddit_keys = find_all(lambda x: x.upper().startswith("REDDIT"), environ.keys()) + twitter_keys = find_all(lambda x: x.upper().startswith("TWITTER"), environ.keys()) + + config_keys = ( + mongo_keys + reddit_keys + twitter_keys + ["TOKEN", "LOG_LEVEL", "ENVIRONMENT"] + ) + + for item, value in environ.items(): + if item not in config_keys: + continue + + if item in mongo_keys: + key = "_".join(item.split("_")[1:]).lower() + mongo[key] = value + elif item in twitter_keys: + key = "_".join(item.split("_")[1:]).lower() + twitter[key] = value + elif item in reddit_keys: + key = "_".join(item.split("_")[1:]).lower() + reddit[key] = value + else: + data[item.lower()] = value + + data["mongo"] = mongo + if all(x is not None for x in reddit.values()): + data["reddit"] = reddit + if all(x is not None for x in twitter.values()): + data["twitter"] = twitter + + return Config(**data) + + +def load_config(method: Optional[str] = None) -> Config: + """ + Load the config using the specified method first + + Args: + method: Method to use first + """ + global _config + if _config is not None: + return _config + + methods = {"yaml": _load_yaml, "json": _load_json, "env": _load_env} + method_names = list(methods.keys()) + if method and method in method_names: + method_names.remove(method) + method_names.insert(0, method) + + for method in method_names: + if _config := methods[method](): + return _config + + raise FileNotFoundError("Missing one of: config.yaml, config.json, .env") diff --git a/jarvis_tasks/tasks/autokick.py b/jarvis_tasks/tasks/autokick.py index e469fb2..282d62e 100644 --- a/jarvis_tasks/tasks/autokick.py +++ b/jarvis_tasks/tasks/autokick.py @@ -3,9 +3,9 @@ import asyncio import logging from datetime import datetime, timedelta, timezone -from jarvis_core.db import q +from beanie.operators import Exists from jarvis_core.db.models import Setting -from naff import Client +from interactions import Client logger = logging.getLogger(__name__) @@ -22,17 +22,21 @@ async def autokick(bot: Client) -> None: logger.debug("Starting Task-autokick") while True: - autokicks = Setting.find(q(setting="autokick", value__exists=True)) + autokicks = Setting.find(Setting.setting == "autokick", Exists(Setting.value)) async for auto in autokicks: if auto.value <= 0: logger.warn("Autokick setting <= 0, deleting") await auto.delete() continue verified = await Setting.find_one( - q(setting="verified", value__exists=True, guild=auto.guild) + Setting.setting == "verified", + Exists(Setting.value), + Setting.guild == auto.guild, ) unverified = await Setting.find_one( - q(setting="unverified", value__exists=True, guild=auto.guild) + Setting.setting == "unverified", + Exists(Setting.value), + Setting.guild == auto.guild, ) if not verified or not unverified: logger.debug( @@ -47,7 +51,9 @@ async def autokick(bot: Client) -> None: await unverified.delete() continue - if guild.id not in resync or resync[guild.id] >= datetime.now(tz=timezone.utc): + if guild.id not in resync or resync[guild.id] >= datetime.now( + tz=timezone.utc + ): logger.info(f"Guild {guild.id} out of date, resyncing") limit = 1000 guild_id = guild.id @@ -60,7 +66,9 @@ async def autokick(bot: Client) -> None: role = await guild.fetch_role(unverified.value) for member in role.members: - if member.joined_at + timedelta(days=auto.value) >= datetime.now(tz=timezone.utc): + if member.joined_at + timedelta(days=auto.value) >= datetime.now( + tz=timezone.utc + ): await member.kick(reason="Failed to verify in {auto.value} days") await asyncio.sleep(14400) diff --git a/jarvis_tasks/tasks/ban.py b/jarvis_tasks/tasks/ban.py index 778c759..58a5632 100644 --- a/jarvis_tasks/tasks/ban.py +++ b/jarvis_tasks/tasks/ban.py @@ -3,12 +3,12 @@ import asyncio import logging from datetime import datetime, timedelta, timezone -from jarvis_core.db import q +from beanie.operators import LTE from jarvis_core.db.models import Ban, Unban -from naff import Client -from naff.client.errors import NotFound -from naff.models.discord.guild import Guild -from naff.models.discord.user import User +from interactions import Client +from interactions.client.errors import NotFound +from interactions.models.discord.guild import Guild +from interactions.models.discord.user import User from jarvis_tasks.util import runat @@ -24,7 +24,7 @@ async def _unban(bot: int, guild: Guild, user: User, ban: Ban) -> None: except NotFound: logger.debug(f"User {user.id} not banned from guild {guild.id}") ban.active = False - await ban.commit() + await ban.save() await Unban( user=user.id, guild=guild.id, @@ -32,7 +32,7 @@ async def _unban(bot: int, guild: Guild, user: User, ban: Ban) -> None: discrim=user.discriminator, admin=bot, reason="Ban expired", - ).commit() + ).save() queue.remove(ban.id) @@ -46,7 +46,9 @@ async def unban(bot: Client) -> None: logger.debug("Starting Task-ban") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=9) - bans = Ban.find(q(type="temp", active=True, duration__lte=max_ts)) + bans = Ban.find( + Ban.type == "temp", Ban.active == True, LTE(Ban.duration, max_ts) + ) async for ban in bans: if ban.id in queue: continue diff --git a/jarvis_tasks/tasks/lock.py b/jarvis_tasks/tasks/lock.py index 8d0152f..db8480a 100644 --- a/jarvis_tasks/tasks/lock.py +++ b/jarvis_tasks/tasks/lock.py @@ -3,11 +3,11 @@ import asyncio import logging from datetime import datetime, timedelta, timezone -from jarvis_core.db import q +from beanie.operators import LTE from jarvis_core.db.models import Lock -from naff import Client -from naff.client.utils.misc_utils import get -from naff.models.discord.channel import GuildChannel +from interactions import Client +from interactions.client.utils.misc_utils import get +from interactions.models.discord.channel import GuildChannel from jarvis_tasks.util import runat @@ -33,7 +33,7 @@ async def _unlock(channel: GuildChannel, lock: Lock) -> None: except Exception: logger.debug("Locked channel deleted, ignoring error") lock.active = False - await lock.commit() + await lock.save() queue.remove(lock.id) @@ -47,7 +47,7 @@ async def unlock(bot: Client) -> None: logger.debug("Starting Task-lock") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55) - locks = Lock.find(q(active=True, created_at__lte=max_ts)) + locks = Lock.find(Lock.active == True, LTE(Lock.created_at, max_ts)) async for lock in locks: if lock.id in queue: continue diff --git a/jarvis_tasks/tasks/lockdown.py b/jarvis_tasks/tasks/lockdown.py index 05fa6a3..9e07ee8 100644 --- a/jarvis_tasks/tasks/lockdown.py +++ b/jarvis_tasks/tasks/lockdown.py @@ -3,11 +3,11 @@ import asyncio import logging from datetime import datetime, timedelta, timezone -from jarvis_core.db import q +from beanie.operators import LTE from jarvis_core.db.models import Lockdown -from naff import Client -from naff.models.discord.enums import Permissions -from naff.models.discord.role import Role +from interactions import Client +from interactions.models.discord.enums import Permissions +from interactions.models.discord.role import Role from jarvis_tasks.util import runat @@ -20,7 +20,7 @@ async def _lift(role: Role, lock: Lockdown) -> None: original_perms = Permissions(lock.original_perms) await role.edit(permissions=original_perms) lock.active = False - await lock.commit() + await lock.save() queue.remove(lock.id) @@ -34,7 +34,7 @@ async def lift(bot: Client) -> None: logger.debug("Starting Task-lift") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55) - locks = Lockdown.find(q(active=True, created_at__lte=max_ts)) + locks = Lockdown.find(Lockdown.active == True, LTE(Lockdown.created_at, max_ts)) async for lock in locks: if lock.id in queue: continue diff --git a/jarvis_tasks/tasks/reddit.py b/jarvis_tasks/tasks/reddit.py index cdee044..4899709 100644 --- a/jarvis_tasks/tasks/reddit.py +++ b/jarvis_tasks/tasks/reddit.py @@ -10,27 +10,31 @@ from asyncpraw.models.reddit.redditor import Redditor as Ruser from asyncpraw.models.reddit.submission import Submission from asyncpraw.models.reddit.submission import Subreddit as Sub from asyncprawcore.exceptions import Forbidden, NotFound -from jarvis_core.db import q -from jarvis_core.db.models import Redditor, RedditorFollow, Subreddit, SubredditFollow -from naff import Client -from naff.client.errors import NotFound as DNotFound -from naff.models.discord.embed import Embed, EmbedField +from beanie.operators import NotIn +from jarvis_core.db.models import Subreddit, SubredditFollow + +# from jarvis_core.db.models import Redditor, RedditorFollow, Subreddit, SubredditFollow +from interactions import Client +from interactions.client.errors import NotFound as DNotFound +from interactions.models.discord.embed import Embed, EmbedField from jarvis_tasks import const -from jarvis_tasks.config import TaskConfig +from jarvis_tasks.config import load_config from jarvis_tasks.prometheus.stats import reddit_count, reddit_gauge from jarvis_tasks.util import build_embed DEFAULT_USER_AGENT = f"python:JARVIS-Tasks:{const.__version__} (by u/zevaryx)" -config = TaskConfig.from_yaml() -config.reddit["user_agent"] = config.reddit.get("user_agent", DEFAULT_USER_AGENT) +config = load_config() +config.reddit.user_agent = config.reddit.dict().get("user_agent", DEFAULT_USER_AGENT) running = [] logger = logging.getLogger(__name__) image_link = re.compile(r"https?://(?:www)?\.?preview\.redd\.it\/(.*\..*)\?.*") -async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[List[Embed]]: +async def post_embeds( + sub: Sub, post: Submission, reddit: Reddit +) -> Optional[List[Embed]]: """ Build a post embeds. @@ -52,14 +56,20 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li og_post = post # noqa: F841 post = await reddit.submission(post.crosspost_parent_list[0]["id"]) await post.load() - fields.append(EmbedField(name="Crossposted From", value=post.subreddit_name_prefixed)) + fields.append( + EmbedField(name="Crossposted From", value=post.subreddit_name_prefixed) + ) content = f"> **{post.title}**" if "url" in vars(post): if any(post.url.endswith(x) for x in ["jpeg", "jpg", "png", "gif"]): images = [post.url] if "media_metadata" in vars(post): for k, v in post.media_metadata.items(): - if v["status"] != "valid" or v["m"] not in ["image/jpg", "image/png", "image/gif"]: + if v["status"] != "valid" or v["m"] not in [ + "image/jpg", + "image/png", + "image/gif", + ]: continue ext = v["m"].split("/")[-1] i_url = f"https://i.redd.it/{k}.{ext}" @@ -77,7 +87,9 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li if post.spoiler: content += "||" content += f"\n\n[View this post]({url})" - content = "\n".join(image_link.sub(r"https://i.redd.it/\1", x) for x in content.split("\n")) + content = "\n".join( + image_link.sub(r"https://i.redd.it/\1", x) for x in content.split("\n") + ) if not images and not content: logger.debug(f"Post {post.id} had neither content nor images?") @@ -94,9 +106,12 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li url=url, color=color, ) - base_embed.set_author(name="u/" + post.author.name, url=author_url, icon_url=author_icon) + base_embed.set_author( + name="u/" + post.author.name, url=author_url, icon_url=author_icon + ) base_embed.set_footer( - text="Reddit", icon_url="https://www.redditinc.com/assets/images/site/reddit-logo.png" + text="Reddit", + icon_url="https://www.redditinc.com/assets/images/site/reddit-logo.png", ) embeds = [base_embed] @@ -111,84 +126,92 @@ async def post_embeds(sub: Sub, post: Submission, reddit: Reddit) -> Optional[Li return embeds -async def _stream_user(sub: Ruser, bot: Client, reddit: Reddit) -> None: - """ - Stream a redditor +# async def _stream_user(sub: Ruser, bot: Client, reddit: Reddit) -> None: +# """ +# Stream a redditor - Args: - sub: Redditor to stream - bot: Client instance - """ - now = datetime.now(tz=timezone.utc) - await sub.load() - running.append(sub.name) - logger.debug(f"Streaming user {sub.name}") - try: - async for post in sub.stream.submissions(): - if not post: - logger.debug(f"Got None for post from {sub.name}") - continue - await post.subreddit.load() - if post.created_utc < now.timestamp(): - continue - logger.debug(f"Got new post from {sub.name} in r/{post.subreddit.display_name}") - follows = RedditorFollow.find(q(name=sub.name)) - num_follows = 0 +# Args: +# sub: Redditor to stream +# bot: Client instance +# """ +# now = datetime.now(tz=timezone.utc) +# await sub.load() +# running.append(sub.name) +# logger.debug(f"Streaming user {sub.name}") +# try: +# async for post in sub.stream.submissions(): +# if not post: +# logger.debug(f"Got None for post from {sub.name}") +# continue +# await post.subreddit.load() +# if post.created_utc < now.timestamp(): +# continue +# logger.debug( +# f"Got new post from {sub.name} in r/{post.subreddit.display_name}" +# ) +# follows = RedditorFollow.find(RedditorFollow.name == sub.name) +# num_follows = 0 - async for follow in follows: - num_follows += 1 +# async for follow in follows: +# num_follows += 1 - guild = await bot.fetch_guild(follow.guild) - if not guild: - logger.warning(f"Follow {follow.id}'s guild no longer exists, deleting") - await follow.delete() - num_follows -= 1 - continue +# guild = await bot.fetch_guild(follow.guild) +# if not guild: +# logger.warning( +# f"Follow {follow.id}'s guild no longer exists, deleting" +# ) +# await follow.delete() +# num_follows -= 1 +# continue - channel = await bot.fetch_channel(follow.channel) - if not channel: - logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") - await follow.delete() - num_follows -= 1 - continue +# channel = await bot.fetch_channel(follow.channel) +# if not channel: +# logger.warning( +# f"Follow {follow.id}'s channel no longer exists, deleting" +# ) +# await follow.delete() +# num_follows -= 1 +# continue - embeds = await post_embeds(post.subreddit, post, reddit) - timestamp = int(post.created_utc) +# embeds = await post_embeds(post.subreddit, post, reddit) +# timestamp = int(post.created_utc) - try: - await channel.send( - f"`u/{sub.name}` posted to r/{post.subreddit.display_name} at ", - embeds=embeds, - ) - count = reddit_count.labels( - guild_id=guild.id, - guild_name=guild.name, - subreddit_name=post.subreddit.display_name, - redditor_name=sub.name, - ) - count.inc() - except DNotFound: - logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") - await follow.delete() - num_follows -= 1 - continue - except Exception: - logger.error( - f"Failed to send message to {channel.id} in {channel.guild.name}", - exc_info=True, - ) +# try: +# await channel.send( +# f"`u/{sub.name}` posted to r/{post.subreddit.display_name} at ", +# embeds=embeds, +# ) +# count = reddit_count.labels( +# guild_id=guild.id, +# guild_name=guild.name, +# subreddit_name=post.subreddit.display_name, +# redditor_name=sub.name, +# ) +# count.inc() +# except DNotFound: +# logger.warning( +# f"Follow {follow.id}'s channel no longer exists, deleting" +# ) +# await follow.delete() +# num_follows -= 1 +# continue +# except Exception: +# logger.error( +# f"Failed to send message to {channel.id} in {channel.guild.name}", +# exc_info=True, +# ) - gauge = reddit_gauge.labels(redditor_name=sub.name) - gauge.set(num_follows) +# gauge = reddit_gauge.labels(redditor_name=sub.name) +# gauge.set(num_follows) - if num_follows == 0: - s = await Redditor.find_one(q(name=sub.name)) - if s: - await s.delete() - break - except Exception: - logger.error(f"Redditor stream {sub.name} failed", exc_info=True) - running.remove(sub.name) +# if num_follows == 0: +# s = await Redditor.find_one(Redditor.name == sub.name) +# if s: +# await s.delete() +# break +# except Exception: +# logger.error(f"Redditor stream {sub.name} failed", exc_info=True) +# running.remove(sub.name) async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None: @@ -211,7 +234,9 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None: if post.created_utc < now.timestamp(): continue logger.debug(f"Got new post in {sub.display_name}") - follows = SubredditFollow.find(q(display_name=sub.display_name)) + follows = SubredditFollow.find( + SubredditFollow.display_name == sub.display_name + ) num_follows = 0 async for follow in follows: @@ -219,14 +244,18 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None: guild = await bot.fetch_guild(follow.guild) if not guild: - logger.warning(f"Follow {follow.id}'s guild no longer exists, deleting") + logger.warning( + f"Follow {follow.id}'s guild no longer exists, deleting" + ) await follow.delete() num_follows -= 1 continue channel = await bot.fetch_channel(follow.channel) if not channel: - logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") + logger.warning( + f"Follow {follow.id}'s channel no longer exists, deleting" + ) await follow.delete() num_follows -= 1 continue @@ -247,7 +276,9 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None: ) count.inc() except DNotFound: - logger.warning(f"Follow {follow.id}'s channel no longer exists, deleting") + logger.warning( + f"Follow {follow.id}'s channel no longer exists, deleting" + ) await follow.delete() num_follows -= 1 continue @@ -263,7 +294,7 @@ async def _stream_subreddit(sub: Sub, bot: Client, reddit: Reddit) -> None: gauge.set(num_follows) if num_follows == 0: - s = await Subreddit.find_one(q(display_name=sub.display_name)) + s = await Subreddit.find_one(Subreddit.display_name == sub.display_name) if s: await s.delete() break @@ -276,12 +307,12 @@ async def _stream(sub: Sub | Ruser, bot: Client, reddit: Reddit) -> None: """ Stream handler. - Decides what type of stream to launch based on `type(sub)` + Decides what type of stream to launch based on `isinstance(sub, Sub)` """ if isinstance(sub, Sub): await _stream_subreddit(sub, bot, reddit) - else: - await _stream_user(sub, bot, reddit) + # else: + # await _stream_user(sub, bot, reddit) async def reddit(bot: Client) -> None: @@ -301,7 +332,9 @@ async def reddit(bot: Client) -> None: async for sub in Subreddit.find(): count = 0 - async for follow in SubredditFollow.find(q(display_name=sub.display_name)): + async for follow in SubredditFollow.find( + SubredditFollow.display_name == sub.display_name + ): count += 1 guild = await bot.fetch_guild(follow.guild) @@ -316,30 +349,30 @@ async def reddit(bot: Client) -> None: logger.debug(f"Subreddit {sub.display_name} has no followers, removing") await sub.delete() - logger.debug("Validating redditor follows") - async for sub in Redditor.find(): - count = 0 + # logger.debug("Validating redditor follows") + # async for sub in Redditor.find(): + # count = 0 - async for follow in RedditorFollow.find(q(name=sub.name)): - count += 1 + # async for follow in RedditorFollow.find(RedditorFollow.name == sub.name): + # count += 1 - guild = await bot.fetch_guild(follow.guild) - channel = await bot.fetch_channel(follow.channel) - if not guild or not channel: - logger.debug(f"Follow {follow.id} invalid, deleting") - await follow.delete() - count -= 1 - continue + # guild = await bot.fetch_guild(follow.guild) + # channel = await bot.fetch_channel(follow.channel) + # if not guild or not channel: + # logger.debug(f"Follow {follow.id} invalid, deleting") + # await follow.delete() + # count -= 1 + # continue - if count == 0: - logger.debug(f"Redditor {sub.name} has no followers, removing") - await sub.delete() + # if count == 0: + # logger.debug(f"Redditor {sub.name} has no followers, removing") + # await sub.delete() old_count = 0 while True: count = len(running) - subs = Subreddit.find(q(display_name__nin=running)) - users = Redditor.find(q(name__nin=running)) + subs = Subreddit.find(NotIn(Subreddit.display_name, running)) + # users = Redditor.find(NotIn(Redditor.name, running)) # Go through all actively followed subreddits async for sub in subs: @@ -348,7 +381,9 @@ async def reddit(bot: Client) -> None: logger.debug(f"Follow {sub.display_name} was found despite filter") continue - is_followed = await SubredditFollow.find_one(q(display_name=sub.display_name)) + is_followed = await SubredditFollow.find_one( + SubredditFollow.display_name == sub.display_name + ) if not is_followed: logger.warn(f"Subreddit {sub.display_name} has no followers, removing") await sub.delete() @@ -359,7 +394,9 @@ async def reddit(bot: Client) -> None: sub = await red.subreddit(sub.display_name) except (NotFound, Forbidden) as e: # Subreddit is either quarantined, deleted, or private - logger.warn(f"Subreddit {sub.display_name} raised {e.__class__.__name__}, removing") + logger.warn( + f"Subreddit {sub.display_name} raised {e.__class__.__name__}, removing" + ) try: await sub.delete() except Exception: @@ -372,34 +409,38 @@ async def reddit(bot: Client) -> None: count += 1 # Go through all actively followed redditors - async for sub in users: - logger.debug(f"Creating stream for {sub.name}") - if sub.name in running: - logger.debug(f"Follow {sub.name} was found despite filter") - continue + # async for sub in users: + # logger.debug(f"Creating stream for {sub.name}") + # if sub.name in running: + # logger.debug(f"Follow {sub.name} was found despite filter") + # continue - is_followed = await SubredditFollow.find_one(q(name=sub.name)) - if not is_followed: - logger.warn(f"Redditor {sub.name} has no followers, removing") - await sub.delete() - continue + # is_followed = await SubredditFollow.find_one( + # SubredditFollow.name == sub.name + # ) + # if not is_followed: + # logger.warn(f"Redditor {sub.name} has no followers, removing") + # await sub.delete() + # continue - # Get subreddit - try: - sub = await red.user(sub.name) - except (NotFound, Forbidden) as e: - # Subreddit is either quarantined, deleted, or private - logger.warn(f"Redditor {sub.display_name} raised {e.__class__.__name__}, removing") - try: - await sub.delete() - except Exception: - logger.debug("Ignoring deletion error") - continue + # # Get subreddit + # try: + # sub = await red.user(sub.name) + # except (NotFound, Forbidden) as e: + # # Subreddit is either quarantined, deleted, or private + # logger.warn( + # f"Redditor {sub.display_name} raised {e.__class__.__name__}, removing" + # ) + # try: + # await sub.delete() + # except Exception: + # logger.debug("Ignoring deletion error") + # continue - # Create and run stream - coro = _stream(sub, bot, red) - asyncio.create_task(coro) - count += 1 + # # Create and run stream + # coro = _stream(sub, bot, red) + # asyncio.create_task(coro) + # count += 1 if old_count != count: logger.debug(f"Now streaming {count} subreddits") diff --git a/jarvis_tasks/tasks/reminder.py b/jarvis_tasks/tasks/reminder.py index b90fe5f..9b285b5 100644 --- a/jarvis_tasks/tasks/reminder.py +++ b/jarvis_tasks/tasks/reminder.py @@ -4,12 +4,12 @@ import logging from datetime import datetime, timedelta, timezone from typing import Optional -from jarvis_core.db import q +from beanie.operators import NotIn, LTE from jarvis_core.db.models import Reminder -from naff import Client -from naff.models.discord.channel import GuildText -from naff.models.discord.embed import Embed -from naff.models.discord.user import User +from interactions import Client +from interactions.models.discord.channel import GuildText +from interactions.models.discord.embed import Embed +from interactions.models.discord.user import User from jarvis_tasks.prometheus.stats import reminder_count from jarvis_tasks.util import build_embed, runat @@ -52,14 +52,18 @@ async def _remind( f"Reminder {reminder.id} private, sent notification to origin channel" ) reminder.active = False - await reminder.commit() + await reminder.save() delete = False else: - logger.warning(f"Reminder {reminder.id} failed, no way to contact user.") + logger.warning( + f"Reminder {reminder.id} failed, no way to contact user." + ) if delete: await reminder.delete() if reminded: - count = reminder_count.labels(guild_id=channel.guild.id, guild_name=channel.guild.name) + count = reminder_count.labels( + guild_id=channel.guild.id, guild_name=channel.guild.name + ) count.inc() queue.remove(reminder.id) @@ -74,7 +78,12 @@ async def remind(bot: Client) -> None: logger.debug("Starting Task-remind") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=5) - reminders = Reminder.find(q(id__nin=queue, remind_at__lte=max_ts, active=True)) + reminders = Reminder.find( + NotIn(Reminder.id, queue), + LTE(Reminder.remind_at, max_ts), + Reminder.active == True, + ) + async for reminder in reminders: if reminder.id in queue: logger.debug(f"Reminder {reminder.id} was found despite filter") diff --git a/jarvis_tasks/tasks/temprole.py b/jarvis_tasks/tasks/temprole.py index b12a88f..8a7c15a 100644 --- a/jarvis_tasks/tasks/temprole.py +++ b/jarvis_tasks/tasks/temprole.py @@ -3,9 +3,9 @@ import asyncio import logging from datetime import datetime, timedelta, timezone -from jarvis_core.db import q +from beanie.operators import LTE, NotIn from jarvis_core.db.models import Temprole -from naff import Client +from interactions import Client from jarvis_tasks.util import runat @@ -52,7 +52,9 @@ async def remove(bot: Client) -> None: logger.debug("Starting Task-remove") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=45) - temproles = Temprole.find(q(expires_at__lte=max_ts, id__nin=queue)) + temproles = Temprole.find( + LTE(Temprole.expires_at, max_ts), NotIn(Temprole.id, queue) + ) async for temprole in temproles: if temprole.id in queue: logger.warn("Temprole found despite filter") diff --git a/jarvis_tasks/tasks/twitter.py b/jarvis_tasks/tasks/twitter.py index 78b71a1..00f6951 100644 --- a/jarvis_tasks/tasks/twitter.py +++ b/jarvis_tasks/tasks/twitter.py @@ -5,20 +5,19 @@ from datetime import datetime, timedelta, timezone from html import unescape from typing import List -from jarvis_core.db import q from jarvis_core.db.models import TwitterAccount, TwitterFollow -from naff import Client -from naff.client.errors import NotFound -from naff.models.discord.embed import Embed +from interactions import Client +from interactions.client.errors import NotFound +from interactions.models.discord.embed import Embed from tweepy.streaming import StreamRule from tweepy.asynchronous import AsyncClient, AsyncStreamingClient from tweepy import Media, Tweet, User -from jarvis_tasks.config import TaskConfig +from jarvis_tasks.config import load_config from jarvis_tasks.prometheus.stats import twitter_count, twitter_error, twitter_gauge from jarvis_tasks.util import build_embed -config = TaskConfig.from_yaml() +config = load_config() logger = logging.getLogger(__name__) tlogger = logging.getLogger("Tweepy") tlogger.setLevel(logging.DEBUG) @@ -29,7 +28,9 @@ DEFAULT_TWEET_FIELDS = "created_at" DEFAULT_USER_FIELDS = "url,profile_image_url" -async def tweet_embeds(tweet: Tweet, retweet: bool, quoted: bool, api: AsyncClient) -> List[Embed]: +async def tweet_embeds( + tweet: Tweet, retweet: bool, quoted: bool, api: AsyncClient +) -> List[Embed]: """ Build a tweet embeds. @@ -119,7 +120,10 @@ class JARVISTwitterStream(AsyncStreamingClient): Args: status_code: HTTP Status Code """ - logger.error(f"Received status code {status_code} while streaming, restarting", exc_info=True) + logger.error( + f"Received status code {status_code} while streaming, restarting", + exc_info=True, + ) errors = twitter_error.labels(error_code=status_code) errors.inc() self.disconnect() @@ -142,7 +146,7 @@ class JARVISTwitterStream(AsyncStreamingClient): ) author = status.includes.get("users")[0] logger.debug(f"{author.username} sent new tweet") - follows = TwitterFollow.find(q(twitter_id=author.id)) + follows = TwitterFollow.find(TwitterFollow.twitter_id == author.id) num_follows = 0 retweet = False @@ -184,7 +188,11 @@ class JARVISTwitterStream(AsyncStreamingClient): f"`@{author.username}` {mod} this at ", embeds=embeds, ) - count = twitter_count.labels(guild_id=guild.id, guild_name=guild.name, twitter_handle=author.username) + count = twitter_count.labels( + guild_id=guild.id, + guild_name=guild.name, + twitter_handle=author.username, + ) count.inc() except NotFound: logger.warn(f"Follow {follow.id} invalid, deleting") @@ -192,11 +200,17 @@ class JARVISTwitterStream(AsyncStreamingClient): num_follows -= 1 continue except Exception: - logger.debug(f"Failed to send message to {channel.id} in {channel.guild.name}") + logger.debug( + f"Failed to send message to {channel.id} in {channel.guild.name}" + ) if num_follows == 0: - logger.warning(f"Account {author.username} no longer has followers, removing") - account = await TwitterAccount.find_one(q(twitter_id=author.id)) + logger.warning( + f"Account {author.username} no longer has followers, removing" + ) + account = await TwitterAccount.find_one( + TwitterAccount.twitter_id == author.id + ) if account: await account.delete() self.disconnect() @@ -216,7 +230,9 @@ async def twitter(bot: Client) -> None: logger.warn("Missing Twitter config, not starting") return api = AsyncClient(bearer_token=config.twitter["bearer_token"]) - stream = JARVISTwitterStream(bot=bot, bearer_token=config.twitter["bearer_token"], api=api) + stream = JARVISTwitterStream( + bot=bot, bearer_token=config.twitter["bearer_token"], api=api + ) rules = await stream.get_rules() if rules.data: await stream.delete_rules(rules.data) @@ -226,7 +242,9 @@ async def twitter(bot: Client) -> None: async for account in TwitterAccount.find(): count = 0 - async for follow in TwitterFollow.find(q(twitter_id=account.twitter_id)): + async for follow in TwitterFollow.find( + TwitterFollow.twitter_id == account.twitter_id + ): count += 1 try: guild = await bot.fetch_guild(follow.guild) @@ -270,7 +288,7 @@ async def twitter(bot: Client) -> None: continue account.handle = user.data.username account.last_sync = datetime.now(tz=timezone.utc) - await account.commit() + await account.save() ids.append(account.twitter_id) # Get new tweets diff --git a/jarvis_tasks/tasks/warning.py b/jarvis_tasks/tasks/warning.py index 966d97f..642dc06 100644 --- a/jarvis_tasks/tasks/warning.py +++ b/jarvis_tasks/tasks/warning.py @@ -3,9 +3,9 @@ import asyncio import logging from datetime import datetime, timedelta, timezone -from jarvis_core.db import q +from beanie.operators import LTE, NotIn from jarvis_core.db.models import Warning -from naff import Client +from interactions import Client from jarvis_tasks.util import runat @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) async def _unwarn(warn: Warning) -> None: logger.debug(f"Deactivating warning {warn.id}") warn.active = False - await warn.commit() + await warn.save() queue.remove(warn.id) @@ -30,7 +30,11 @@ async def unwarn(bot: Client) -> None: logger.debug("Starting Task-unwarn") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=55) - warns = Warning.find(q(active=True, expires_at__lte=max_ts, id__nin=queue)) + warns = Warning.find( + Warning.active == True, + LTE(Warning.expires_at, max_ts), + NotIn(Warning.id, queue), + ) async for warn in warns: if warn.id in queue: logger.warn("Warning found despite filter") diff --git a/jarvis_tasks/util.py b/jarvis_tasks/util.py index 1f97220..ea40cca 100644 --- a/jarvis_tasks/util.py +++ b/jarvis_tasks/util.py @@ -4,7 +4,7 @@ from datetime import datetime, timezone from logging import Logger from typing import Coroutine -from naff.models.discord.embed import Embed +from interactions.models.discord.embed import Embed async def runat(when: datetime, coro: Coroutine, logger: Logger) -> None: diff --git a/poetry.lock b/poetry.lock index 3563842..a9e3eb1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "aiofiles" @@ -275,22 +275,22 @@ test = ["asynctest (>=0.13.0)", "mock (>=0.8)", "pytest", "pytest-vcr", "testfix [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "black" @@ -329,14 +329,14 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -651,6 +651,36 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "interactions-py" +version = "5.3.1" +description = "Easy, simple, scalable and modular: a Python API wrapper for interactions." +category = "main" +optional = false +python-versions = ">=3.10" +files = [ + {file = "interactions.py-5.3.1-py3-none-any.whl", hash = "sha256:dbc6e15b46926987e3cbd198b536976ea7bc2b87355848c3b96e77da0ad120c1"}, + {file = "interactions.py-5.3.1.tar.gz", hash = "sha256:c09b505630a33b52b3facc44837eb6c55e88e916c6302e1d6ce45b6c2d237c02"}, +] + +[package.dependencies] +aiohttp = "*" +attrs = "*" +discord-typings = ">=0.5.1" +emoji = "*" +tomli = "*" + +[package.extras] +all = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aioconsole (>=0.6.0)", "aiodns", "faust-cchardet", "jurigged", "orjson", "sentry-sdk", "uvloop"] +console = ["aioconsole (>=0.6.0)"] +dev = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aioconsole (>=0.6.0)", "aiodns", "faust-cchardet", "jurigged", "mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python", "orjson", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "python-dotenv", "sentry-sdk", "typeguard", "uvloop"] +docs = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aioconsole (>=0.6.0)", "aiodns", "faust-cchardet", "jurigged", "mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python", "orjson", "sentry-sdk", "uvloop"] +jurigged = ["jurigged"] +sentry = ["sentry-sdk"] +speedup = ["Brotli", "aiodns", "faust-cchardet", "orjson", "uvloop"] +tests = ["pytest", "pytest-asyncio", "pytest-cov", "python-dotenv", "typeguard"] +voice = ["PyNaCl (>=1.5.0,<1.6)"] + [[package]] name = "jarvis-core" version = "0.16.1" @@ -676,7 +706,7 @@ umongo = "^3.1.0" type = "git" url = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git" reference = "main" -resolved_reference = "392797c4aea76db0dff8772d95acea3ff3094b46" +resolved_reference = "ec4219e5a54bea78ff19f23f1754a036e8d0eae3" [[package]] name = "marshmallow" @@ -701,14 +731,14 @@ tests = ["pytest", "pytz", "simplejson"] [[package]] name = "motor" -version = "3.1.1" +version = "3.1.2" description = "Non-blocking MongoDB driver for Tornado or asyncio" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "motor-3.1.1-py3-none-any.whl", hash = "sha256:01d93d7c512810dcd85f4d634a7244ba42ff6be7340c869791fe793561e734da"}, - {file = "motor-3.1.1.tar.gz", hash = "sha256:a4bdadf8a08ebb186ba16e557ba432aa867f689a42b80f2e9f8b24bbb1604742"}, + {file = "motor-3.1.2-py3-none-any.whl", hash = "sha256:4bfc65230853ad61af447088527c1197f91c20ee957cfaea3144226907335716"}, + {file = "motor-3.1.2.tar.gz", hash = "sha256:80c08477c09e70db4f85c99d484f2bafa095772f1d29b3ccb253270f9041da9a"}, ] [package.dependencies] @@ -819,34 +849,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "naff" -version = "2.1.0" -description = "Not another freaking fork" -category = "main" -optional = false -python-versions = ">=3.10" -files = [ - {file = "naff-2.1.0-py3-none-any.whl", hash = "sha256:e433683b62f1a151867a44c752cb8725e8505f99086b07765f66696fa553adf2"}, - {file = "naff-2.1.0.tar.gz", hash = "sha256:a58db2f56f6f5fc4fbefb354ce4d17a78080817ac8524ce6e74dedc54e1c850c"}, -] - -[package.dependencies] -aiohttp = "*" -attrs = ">=22.1.0" -discord-typings = ">=0.5.1" -emoji = "*" -tomli = "*" - -[package.extras] -all = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aiodns", "jurigged", "orjson", "sentry-sdk"] -docs = ["Brotli", "PyNaCl (>=1.5.0,<1.6)", "aiodns", "jurigged", "mkdocs-autorefs", "mkdocs-awesome-pages-plugin", "mkdocs-git-committers-plugin-2", "mkdocs-git-revision-date-localized-plugin", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings-python", "orjson", "sentry-sdk"] -jurigged = ["jurigged"] -sentry = ["sentry-sdk"] -speedup = ["Brotli", "aiodns", "orjson"] -tests = ["pytest", "pytest-asyncio", "pytest-cov", "pytest-recording", "python-dotenv", "typeguard"] -voice = ["PyNaCl (>=1.5.0,<1.6)"] - [[package]] name = "nanoid" version = "2.0.0" @@ -878,68 +880,70 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "orjson" -version = "3.8.7" +version = "3.8.12" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "orjson-3.8.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:f98c82850b7b4b7e27785ca43706fa86c893cdb88d54576bbb9b0d9c1070e421"}, - {file = "orjson-3.8.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:1dee503c6c1a0659c5b46f5f39d9ca9d3657b11ca8bb4af8506086df416887d9"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4fa83831f42ce5c938f8cefc2e175fa1df6f661fdeaba3badf26d2b8cfcf73"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e432c6c9c8b97ad825276d5795286f7cc9689f377a97e3b7ecf14918413303f"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee519964a5a0efb9633f38b1129fd242807c5c57162844efeeaab1c8de080051"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:109b539ce5bf60a121454d008fa67c3b67e5a3249e47d277012645922cf74bd0"}, - {file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ad4d441fbde4133af6fee37f67dbf23181b9c537ecc317346ec8c3b4c8ec7705"}, - {file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89dc786419e1ce2588345f58dd6a434e6728bce66b94989644234bcdbe39b603"}, - {file = "orjson-3.8.7-cp310-none-win_amd64.whl", hash = "sha256:697abde7350fb8076d44bcb6b4ab3ce415ae2b5a9bb91efc460e5ab0d96bb5d3"}, - {file = "orjson-3.8.7-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1c19f47b35b9966a3abadf341b18ee4a860431bf2b00fd8d58906d51cf78aa70"}, - {file = "orjson-3.8.7-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:3ffaabb380cd0ee187b4fc362516df6bf739808130b1339445c7d8878fca36e7"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d88837002c5a8af970745b8e0ca1b0fdb06aafbe7f1279e110d338ea19f3d23"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff60187d1b7e0bfab376b6002b08c560b7de06c87cf3a8ac639ecf58f84c5f3b"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0110970aed35dec293f30ed1e09f8604afd5d15c5ef83de7f6c427619b3ba47b"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:51b275475d4e36118b65ad56f9764056a09d985c5d72e64579bf8816f1356a5e"}, - {file = "orjson-3.8.7-cp311-none-win_amd64.whl", hash = "sha256:63144d27735f3b60f079f247ac9a289d80dfe49a7f03880dfa0c0ba64d6491d5"}, - {file = "orjson-3.8.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a16273d77db746bb1789a2bbfded81148a60743fd6f9d5185e02d92e3732fa18"}, - {file = "orjson-3.8.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5bb32259ea22cc9dd47a6fdc4b8f9f1e2f798fcf56c7c1122a7df0f4c5d33bf3"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad02e9102d4ba67db30a136e631e32aeebd1dce26c9f5942a457b02df131c5d0"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dbcfcec2b7ac52deb7be3685b551addc28ee8fa454ef41f8b714df6ba0e32a27"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a0e5504a5fc86083cc210c6946e8d61e13fe9f1d7a7bf81b42f7050a49d4fb"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:7bd4fd37adb03b1f2a1012d43c9f95973a02164e131dfe3ff804d7e180af5653"}, - {file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:188ed9f9a781333ad802af54c55d5a48991e292239aef41bd663b6e314377eb8"}, - {file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cc52f58c688cb10afd810280e450f56fbcb27f52c053463e625c8335c95db0dc"}, - {file = "orjson-3.8.7-cp37-none-win_amd64.whl", hash = "sha256:403c8c84ac8a02c40613b0493b74d5256379e65196d39399edbf2ed3169cbeb5"}, - {file = "orjson-3.8.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:7d6ac5f8a2a17095cd927c4d52abbb38af45918e0d3abd60fb50cfd49d71ae24"}, - {file = "orjson-3.8.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0295a7bfd713fa89231fd0822c995c31fc2343c59a1d13aa1b8b6651335654f5"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feb32aaaa34cf2f891eb793ad320d4bb6731328496ae59b6c9eb1b620c42b529"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ab1a473894e609b6f1d763838c6689ba2b97620c256a32c4d9f10595ac179"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e8c430d82b532c5ab95634e034bbf6ca7432ffe175a3e63eadd493e00b3a555"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:366cc75f7e09106f9dac95a675aef413367b284f25507d21e55bd7f45f445e80"}, - {file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:84d154d07e8b17d97e990d5d710b719a031738eb1687d8a05b9089f0564ff3e0"}, - {file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06180014afcfdc167ca984b312218aa62ce20093965c437c5f9166764cb65ef7"}, - {file = "orjson-3.8.7-cp38-none-win_amd64.whl", hash = "sha256:41244431ba13f2e6ef22b52c5cf0202d17954489f4a3c0505bd28d0e805c3546"}, - {file = "orjson-3.8.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b20f29fa8371b8023f1791df035a2c3ccbd98baa429ac3114fc104768f7db6f8"}, - {file = "orjson-3.8.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:226bfc1da2f21ee74918cee2873ea9a0fec1a8830e533cb287d192d593e99d02"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75c11023ac29e29fd3e75038d0e8dd93f9ea24d7b9a5e871967a8921a88df24"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78604d3acfd7cd502f6381eea0c42281fe2b74755b334074ab3ebc0224100be1"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7129a6847f0494aa1427167486ef6aea2e835ba05f6c627df522692ee228f65"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1a1a8f4980059f48483782c608145b0f74538c266e01c183d9bcd9f8b71dbada"}, - {file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d60304172a33705ce4bd25a6261ab84bed2dab0b3d3b79672ea16c7648af4832"}, - {file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f733062d84389c32c0492e5a4929056fac217034a94523debe0430bcc602cda"}, - {file = "orjson-3.8.7-cp39-none-win_amd64.whl", hash = "sha256:010e2970ec9e826c332819e0da4b14b29b19641da0f1a6af4cec91629ef9b988"}, - {file = "orjson-3.8.7.tar.gz", hash = "sha256:8460c8810652dba59c38c80d27c325b5092d189308d8d4f3e688dbd8d4f3b2dc"}, + {file = "orjson-3.8.12-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:c84046e890e13a119404a83f2e09e622509ed4692846ff94c4ca03654fbc7fb5"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29706dd8189835bcf1781faed286e99ae54fd6165437d364dfdbf0276bf39b19"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4e22b0aa70c963ac01fcd620de15be21a5027711b0e5d4b96debcdeea43e3ae"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d1acf52d3a4b9384af09a5c2658c3a7a472a4d62a0ad1fe2c8fab8ef460c9b4"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a72b50719bdd6bb0acfca3d4d1c841aa4b191f3ff37268e7aba04e5d6be44ccd"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e8c740a718fa6d511a82e463adc7ab17631c6eea81a716b723e127a9c51d57"}, + {file = "orjson-3.8.12-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebb03e4c7648f7bb299872002a6120082da018f41ba7a9ebf4ceae8d765443d2"}, + {file = "orjson-3.8.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:44f7bb4c995652106276442de1147c9993716d1e2d79b7fd435afa154ff236b9"}, + {file = "orjson-3.8.12-cp310-none-win_amd64.whl", hash = "sha256:06e528f9a84fbb4000fd0eee573b5db543ee70ae586fdbc53e740b0ac981701c"}, + {file = "orjson-3.8.12-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:9a6c1594d5a9ff56e5babc4a87ac372af38d37adef9e06744e9f158431e33f43"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6390ce0bce24c107fc275736aa8a4f768ef7eb5df935d7dca0cc99815eb5d99"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:efb3a10030462a22c731682434df5c137a67632a8339f821cd501920b169007e"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e405d54c84c30d9b1c918c290bcf4ef484a45c69d5583a95db81ffffba40b44"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd6fbd1413559572e81b5ac64c45388147c3ba85cc3df2eaa11002945e0dbd1f"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f480ae7b84369b1860d8867f0baf8d885fede400fda390ce088bfa8edf97ffdc"}, + {file = "orjson-3.8.12-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:355055e0977c43b0e5325b9312b7208c696fe20cd54eed1d6fc80b0a4d6721f5"}, + {file = "orjson-3.8.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d937503e4dfba5edc8d5e0426d3cc97ed55716e93212b2e12a198664487b9965"}, + {file = "orjson-3.8.12-cp311-none-win_amd64.whl", hash = "sha256:eb16e0195febd24b44f4db1ab3be85ecf6038f92fd511370cebc004b3d422294"}, + {file = "orjson-3.8.12-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:dc27a8ec13f28e92dc1ea89bf1232d77e7d3ebfd5c1ccf4f3729a70561cb63bd"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77710774faed337ac4ad919dadc5f3b655b0cd40518e5386e6f1f116de9c6c25"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e549468867991f6f9cfbd9c5bbc977330173bd8f6ceb79973bbd4634e13e1b9"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96fb1eb82b578eb6c0e53e3cf950839fe98ea210626f87c8204bd4fc2cc6ba02"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d153b228b6e24f8bccf732a51e01e8e938eef59efed9030c5c257778fbe0804"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:becbd5af6d035a7ec2ee3239d4700929d52d8517806b97dd04efcc37289403f7"}, + {file = "orjson-3.8.12-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d63f524048825e05950db3b6998c756d5377a5e8c469b2e3bdb9f3217523d74"}, + {file = "orjson-3.8.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ec4f0130d9a27cb400423e09e0f9e46480e9e977f05fdcf663a7a2c68735513e"}, + {file = "orjson-3.8.12-cp37-none-win_amd64.whl", hash = "sha256:6f1b01f641f5e87168b819ac1cbd81aa6278e7572c326f3d27e92dea442a2c0d"}, + {file = "orjson-3.8.12-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:062e67108c218fdb9475edd5272b1629c05b56c66416fa915de5656adde30e73"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba645c92801417933fa74448622ba614a275ea82df05e888095c7742d913bb4"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d50d9b1ae409ea15534365fec0ce8a5a5f7dc94aa790aacfb8cfec87ab51aa4"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f00038bf5d07439d13c0c2c5cd6ad48eb86df7dbd7a484013ce6a113c421b14"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:397670665f94cf5cff779054781d80395084ba97191d82f7b3a86f0a20e6102b"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f568205519bb0197ca91915c5da6058cfbb59993e557b02dfc3b2718b34770a"}, + {file = "orjson-3.8.12-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4fd240e736ce52cd757d74142d9933fd35a3184396be887c435f0574e0388654"}, + {file = "orjson-3.8.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6cae2ff288a80e81ce30313e735c5436495ab58cf8d4fbe84900e616d0ee7a78"}, + {file = "orjson-3.8.12-cp38-none-win_amd64.whl", hash = "sha256:710c40c214b753392e46f9275fd795e9630dd737a5ab4ac6e4ee1a02fe83cc0d"}, + {file = "orjson-3.8.12-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:aff761de5ed5543a0a51e9f703668624749aa2239de5d7d37d9c9693daeaf5dc"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:135f29cf936283a0cd1b8bce86540ca181108f2a4d4483eedad6b8026865d2a9"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f999798f2fa55e567d483864ebfc30120fb055c2696a255979439323a5b15c"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fa58ca064c640fa9d823f98fbbc8e71940ecb78cea3ac2507da1cbf49d60b51"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8682f752c19f6a7d9fc727fd98588b4c8b0dce791b5794bb814c7379ccd64a79"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3d096dde3e46d01841abc1982b906694ab3c92f338d37a2e6184739dc8a958"}, + {file = "orjson-3.8.12-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:834b50df79f1fe89bbaced3a1c1d8c8c92cc99e84cdcd374d8da4974b3560d2a"}, + {file = "orjson-3.8.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ad149ed76dce2bbdfbadd61c35959305e77141badf364a158beb4ef3d88ec37"}, + {file = "orjson-3.8.12-cp39-none-win_amd64.whl", hash = "sha256:82d65e478a21f98107b4eb8390104746bb3024c27084b57edab7d427385f1f70"}, + {file = "orjson-3.8.12.tar.gz", hash = "sha256:9f0f042cf002a474a6aea006dd9f8d7a5497e35e5fb190ec78eb4d232ec19955"}, ] [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] @@ -956,19 +960,19 @@ files = [ [[package]] name = "platformdirs" -version = "3.1.1" +version = "3.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, - {file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, + {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, + {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -1001,16 +1005,69 @@ files = [ [package.extras] twisted = ["twisted"] +[[package]] +name = "pydantic" +version = "1.10.7" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -1113,18 +1170,17 @@ zstd = ["zstandard"] [[package]] name = "pytest" -version = "7.2.2" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -1133,7 +1189,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "python-dotenv" @@ -1214,21 +1270,21 @@ files = [ [[package]] name = "requests" -version = "2.28.2" +version = "2.30.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -1286,14 +1342,14 @@ files = [ [[package]] name = "tweepy" -version = "4.13.0" +version = "4.14.0" description = "Twitter library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tweepy-4.13.0-py3-none-any.whl", hash = "sha256:95207c41023b75a066b0b442a0a907acada610a3cfa09c4ccb5f2d9e522c33b5"}, - {file = "tweepy-4.13.0.tar.gz", hash = "sha256:097425335f9f6674826ba7e72b2247bbca39c9ca0a0bd82f30a38a5bef8c6c88"}, + {file = "tweepy-4.14.0-py3-none-any.whl", hash = "sha256:db6d3844ccc0c6d27f339f12ba8acc89912a961da513c1ae50fa2be502a56afb"}, + {file = "tweepy-4.14.0.tar.gz", hash = "sha256:1f9f1707d6972de6cff6c5fd90dfe6a449cd2e0d70bd40043ffab01e07a06c8c"}, ] [package.dependencies] @@ -1365,20 +1421,21 @@ test = ["pytest (>=2.7.3)"] [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" @@ -1402,86 +1459,86 @@ standard = ["PyYAML (>=5.1)", "colorama (>=0.4)", "httptools (>=0.4.0)", "python [[package]] name = "yarl" -version = "1.8.2" +version = "1.9.2" description = "Yet another URL library" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, - {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, - {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, - {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, - {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, - {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, - {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, - {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, - {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, - {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, - {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, - {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, - {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, ] [package.dependencies] @@ -1491,4 +1548,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4" -content-hash = "9ca94b33d925f4cdba1a25f6febf51c85139983788a3af7106b51222b3fdf6e5" +content-hash = "a73579b1ea2b00a08b8ce355213156911df93608c07fc7112944a1e29f1a31e1" diff --git a/pyproject.toml b/pyproject.toml index adbe0ac..c814f39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,19 @@ [tool.poetry] name = "jarvis-tasks" -version = "0.9.1" +version = "0.10.0" description = "" authors = ["Your Name "] [tool.poetry.dependencies] python = ">=3.10,<4" jarvis-core = {git = "https://git.zevaryx.com/stark-industries/jarvis/jarvis-core.git", rev = "main"} -naff = ">=2.1.0" aiohttp = "^3.8.3" tweepy = {extras = ["async"], version = "^4.13.0"} asyncpraw = "^7.5.0" -#rook = "^0.1.170" uvicorn = "^0.17.6" prometheus-client = "^0.14.1" +interactions-py = "^5.3.1" +pydantic = "^1.10.7" [tool.poetry.dev-dependencies] pytest = "^7.1"