From caf736c5d718812aef90a756e1d2676464099b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=80=AC=E3=81=93=E3=81=93=E3=81=82?= Date: Fri, 23 Aug 2024 18:26:34 +0900 Subject: [PATCH] Revert "Migration to Robyn" --- .config/config_example.yml | 6 +- .logs/.gitkeep | 0 README.md | 18 +- {src/app => app}/__init__.py | 0 app/models/prisma/backend.prisma | 54 ++ app/models/prisma/channel.prisma | 26 + app/models/prisma/instance.prisma | 50 ++ app/models/prisma/note.prisma | 53 ++ app/models/prisma/schema.tmpl | 8 + app/models/prisma/user.prisma | 78 ++ {src/app => app}/routes/__init__.py | 4 +- .../routes/activitypub/__init__.py | 4 +- .../routes/activitypub/activities.py | 0 {src/app => app}/routes/activitypub/actors.py | 9 +- {src/app => app}/routes/activitypub/box.py | 8 +- .../routes/activitypub/nodeinfo.py | 9 +- .../app => app}/routes/activitypub/objects.py | 0 .../routes/activitypub/well_known.py | 103 +-- {src/app => app}/routes/avatar.py | 10 +- {src/app => app}/server.py | 72 +- {src/app => app}/utils/activitypub/actor.py | 34 +- {src/app => app}/utils/activitypub/context.py | 0 {src/app => app}/utils/combine.py | 0 {src/app => app}/utils/exceptions.py | 0 {src/app => app}/utils/log.py | 0 {src/app => app}/utils/migrate.py | 22 +- app/utils/response.py | 18 + pdm.lock | 698 +++++++++++------- pyproject.toml | 12 +- src/app/utils/responses.py | 42 -- src/process.py | 3 - 31 files changed, 841 insertions(+), 500 deletions(-) delete mode 100644 .logs/.gitkeep rename {src/app => app}/__init__.py (100%) create mode 100644 app/models/prisma/backend.prisma create mode 100644 app/models/prisma/channel.prisma create mode 100644 app/models/prisma/instance.prisma create mode 100644 app/models/prisma/note.prisma create mode 100644 app/models/prisma/schema.tmpl create mode 100644 app/models/prisma/user.prisma rename {src/app => app}/routes/__init__.py (67%) rename {src/app => app}/routes/activitypub/__init__.py (78%) rename {src/app => app}/routes/activitypub/activities.py (100%) rename {src/app => app}/routes/activitypub/actors.py (95%) rename {src/app => app}/routes/activitypub/box.py (77%) rename {src/app => app}/routes/activitypub/nodeinfo.py (94%) rename {src/app => app}/routes/activitypub/objects.py (100%) rename {src/app => app}/routes/activitypub/well_known.py (50%) rename {src/app => app}/routes/avatar.py (72%) rename {src/app => app}/server.py (56%) rename {src/app => app}/utils/activitypub/actor.py (72%) rename {src/app => app}/utils/activitypub/context.py (100%) rename {src/app => app}/utils/combine.py (100%) rename {src/app => app}/utils/exceptions.py (100%) rename {src/app => app}/utils/log.py (100%) rename {src/app => app}/utils/migrate.py (54%) create mode 100644 app/utils/response.py delete mode 100644 src/app/utils/responses.py delete mode 100644 src/process.py diff --git a/.config/config_example.yml b/.config/config_example.yml index 0eae665..d1afd55 100644 --- a/.config/config_example.yml +++ b/.config/config_example.yml @@ -15,8 +15,4 @@ job: debug: enable: true profiling: false - nossl: false - -extends: - workers: 4 - process: 4 \ No newline at end of file + nossl: false \ No newline at end of file diff --git a/.logs/.gitkeep b/.logs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md index e1acd52..3c96b63 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# Holo -Holo backend server. +# HoloBE +Holo (Hol0) backend server. -Powered by [Robyn](https://fastapi.tiangolo.com) with [Prisma](https://prisma.io) ([prisma-client-py](https://github.com/RobertCraigie/prisma-client-py)) +Powered by [FastAPI](https://fastapi.tiangolo.com) with [Prisma](https://prisma.io) ([prisma-client-py](https://github.com/RobertCraigie/prisma-client-py)) ## Getting Started > [!WARNING] -> Holo is under development. Therefore, its use in a production environment is deprecated. +> HoloBE is under development. Therefore, its use in a production environment is deprecated. By following this guide, you can build an instance of Hol0. ```shell @@ -26,7 +26,7 @@ Hol0 is inspired by the following software: - [ ] ActivityPub (1/8 done) - [x] webfinger - [ ] Person - + - [ ] Instance Actor - [ ] Inbox - [ ] Outbox - [ ] Post Activity To Remote @@ -45,11 +45,11 @@ Hol0 is inspired by the following software: - [ ] Misskey's summaly proxy support - [ ] Allow registration to be approved/or invite code-based (from Misskey (and Sharkey)) - [ ] Frontend - - [ ] login - - [ ] signup - - [ ] CloudFlare Turnstile + - [x] login + - [x] signup + - [x] CloudFlare Turnstile - [ ] password reset - - [ ] CloudFlare Turnstile + - [x] CloudFlare Turnstile - [ ] Profile - [ ] Note - [ ] Render MFM diff --git a/src/app/__init__.py b/app/__init__.py similarity index 100% rename from src/app/__init__.py rename to app/__init__.py diff --git a/app/models/prisma/backend.prisma b/app/models/prisma/backend.prisma new file mode 100644 index 0000000..0efb864 --- /dev/null +++ b/app/models/prisma/backend.prisma @@ -0,0 +1,54 @@ +model BEConfig { // 略してベーコn((( + id String @id @default("hol0") + host String @unique + + name String @default("Hol0") + description String @default("An Interconnected Extensible Microblogging Platform🪐") + + repositoryUrl String @default("https://github.com/hol0-dev/backend") + feedbackUrl String @default("https://github.com/hol0-dev/backend/issues") + + admin String? + adminEmail String? // 実はメールアドレス以外も入る。 + + maintainerName String? + maintainerEmail String? + + impressumUrl String? + tosUrl String? + privacyPolicyUrl String? + + PushNotification Boolean @default(false) + SWPublicKey String? + SWPrivateKey String? + + enableMail Boolean @default(false) + mailAddress String? + smtpHost String? + smtpPort String? + smtpUser String? + smtpPass String? + smtpSSL Boolean @default(false) + + useObjectStorage Boolean @default(false) + s3BaseUrl String? + s3Bucket String? + s3Prefix String? + s3Endpoint String? + s3Region String @default("us-east-1") + s3AccessKey String? + s3SecretKey String? + s3useSSL Boolean @default(false) + s3ForcePathStyle Boolean @default(false) + s3setPublicRead Boolean @default(false) + + enableTurnstile Boolean @default(false) + turnstileSiteKey String? + turnstileSecretKey String? + + faviconUrl String? + appleTouchIconUrl String? + androidTouchIconUrl String? + + themeColor String @default("#B0F7DD") +} \ No newline at end of file diff --git a/app/models/prisma/channel.prisma b/app/models/prisma/channel.prisma new file mode 100644 index 0000000..0e73043 --- /dev/null +++ b/app/models/prisma/channel.prisma @@ -0,0 +1,26 @@ +model ChannelFollow { + followeeId String @id + channelId String + + createdAt DateTime @default(now()) + + channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade) + followee User @relation("channelFollowee", fields: [followeeId], references: [id], onDelete: Cascade) +} + +model Channel { + id String @id + + name String + description String + + remote String? + + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @updatedAt @map("updated_at") + + host Instance? @relation(fields: [remote], references: [host]) + + followers ChannelFollow[] + notes Note[] +} diff --git a/app/models/prisma/instance.prisma b/app/models/prisma/instance.prisma new file mode 100644 index 0000000..bc8724b --- /dev/null +++ b/app/models/prisma/instance.prisma @@ -0,0 +1,50 @@ +model Instance { + id String @id + host String @unique + + usersCount Int @default(0) + notesCount Int @default(0) + + name String? + description String? + + iconUrl String + faviconUrl String + themeColor String @default("#ffffff") + + firstRetrievedAt DateTime? @default(now()) + + isNotResponding Boolean? @default(false) + isSuspended Boolean? @default(false) + isBlocked Boolean? @default(false) + isSilenced Boolean? @default(false) + + softwareName String? + softwareVersion String? + softwareHomepage String? + + openRegistrations Boolean + + adminName String? + adminEmail String? + + maintainerName String? + maintainerEmail String? + + infoUpdatedAt DateTime @default(now()) + latestRequestReceivedAt DateTime @default(now()) + + moderationNote String? + + langs String[] + + tosUrl String? + privacyPolicyUrl String? + inquiryUrl String? + impressumUrl String? + repositoryUrl String? + feedbackUrl String? + + channels Channel[] + user User[] +} \ No newline at end of file diff --git a/app/models/prisma/note.prisma b/app/models/prisma/note.prisma new file mode 100644 index 0000000..35b0a08 --- /dev/null +++ b/app/models/prisma/note.prisma @@ -0,0 +1,53 @@ +model Reactions { + id String @id @default(cuid()) + + noteId String + userId String + + note Note @relation(fields: [noteId], references: [id]) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +model File { + id String @id + hash String @unique + + url String + + isSensitive Boolean + + fileSize Int? + fileType String + + caption String? + + createdAt DateTime @default(now()) @map("created_at") + attachedNotes Note[] @relation("AttachmentsToNote") +} + +model Note { + id String @id + + content String? + content_html String? + + username String + + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + + visibility String + visibleUserIds String[] + + replyId String? + renoteId String? + + channelId String? + channel Channel? @relation(fields: [channelId], references: [id], onDelete: Cascade) + + authorId String + author User @relation(fields: [authorId], references: [id], onDelete: Cascade) + + reactions Reactions[] + attachments File[] @relation("AttachmentsToNote") +} \ No newline at end of file diff --git a/app/models/prisma/schema.tmpl b/app/models/prisma/schema.tmpl new file mode 100644 index 0000000..8bf60a6 --- /dev/null +++ b/app/models/prisma/schema.tmpl @@ -0,0 +1,8 @@ +generator client { + provider = "prisma-client-py" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} \ No newline at end of file diff --git a/app/models/prisma/user.prisma b/app/models/prisma/user.prisma new file mode 100644 index 0000000..a733c77 --- /dev/null +++ b/app/models/prisma/user.prisma @@ -0,0 +1,78 @@ +model Field { + id String @id + authorId String + + name String + value String + + user User @relation(fields: [authorId], references: [id]) +} + +model User { + id String @id + host String + username String + + email String? @unique + password String? // BackendやWheet経由ではパスワードなしのユーザーは作成できない。ただシステムのユーザー用にNoneなパスワードも設定できるようになってる + + displayName String? + description String? + + avatarUrl String? + bannerUrl String? + + bday DateTime? + address String? + + manuallyApprovesFollowers Boolean @default(false) + discoverable Boolean @default(true) + + publicKeyPem String + publicKeyOwner String + + privateKeyPem String? + + accessTokens AccessToken[] + channelFollowees ChannelFollow[] @relation("channelFollowee") + notes Note[] + reactions Reactions[] + fields Field[] + followees Follow[] @relation("followee") + followers Follow[] @relation("follower") + instance Instance? @relation(fields: [host], references: [host]) +} + +model Follow { + followerId String + followeeId String + + createdAt DateTime @default(now()) + + followee User @relation("followee", fields: [followeeId], references: [id], onDelete: Cascade) + follower User @relation("follower", fields: [followerId], references: [id], onDelete: Cascade) + + @@id([followerId, followeeId]) +} + + +model AccessToken { + id String @id + + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime? @updatedAt + expiresAt DateTime? + + name String + + scope String[] // if WebClient: web:read, web:write + + token String @unique + + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + fromWeb Boolean @default(false) + + @@index([token]) +} \ No newline at end of file diff --git a/src/app/routes/__init__.py b/app/routes/__init__.py similarity index 67% rename from src/app/routes/__init__.py rename to app/routes/__init__.py index bcd41ce..175625b 100644 --- a/src/app/routes/__init__.py +++ b/app/routes/__init__.py @@ -1,7 +1,7 @@ -from robyn import SubRouter +from fastapi import APIRouter from . import activitypub, avatar -router = SubRouter("Holo") +router = APIRouter() router.include_router(activitypub.router) router.include_router(avatar.router) \ No newline at end of file diff --git a/src/app/routes/activitypub/__init__.py b/app/routes/activitypub/__init__.py similarity index 78% rename from src/app/routes/activitypub/__init__.py rename to app/routes/activitypub/__init__.py index 39ae33b..12f2da7 100644 --- a/src/app/routes/activitypub/__init__.py +++ b/app/routes/activitypub/__init__.py @@ -1,8 +1,8 @@ -from robyn import SubRouter +from fastapi import APIRouter from . import well_known, nodeinfo, box, actors -router = SubRouter("Holo") +router = APIRouter() router.include_router(well_known.router) router.include_router(nodeinfo.router) router.include_router(box.router) diff --git a/src/app/routes/activitypub/activities.py b/app/routes/activitypub/activities.py similarity index 100% rename from src/app/routes/activitypub/activities.py rename to app/routes/activitypub/activities.py diff --git a/src/app/routes/activitypub/actors.py b/app/routes/activitypub/actors.py similarity index 95% rename from src/app/routes/activitypub/actors.py rename to app/routes/activitypub/actors.py index e4079c6..b33a37b 100644 --- a/src/app/routes/activitypub/actors.py +++ b/app/routes/activitypub/actors.py @@ -1,11 +1,12 @@ import logging from prisma.models import User -from robyn import SubRouter, Response, jsonify, Request - +from fastapi import APIRouter +from fastapi.requests import Request +from fastapi.responses import ORJSONResponse, Response from prisma.models import BEConfig -router = SubRouter("Holo") +router = APIRouter(include_in_schema=False) logger: logging.Logger = None @@ -82,7 +83,7 @@ async def users(request: Request, userid: str): "sensitive": False, "name": None, } - return Response(jsonify(actor), headers={"Content-Type": "application/activity+json"}) + return ORJSONResponse(actor, media_type="application/activity+json") """ diff --git a/src/app/routes/activitypub/box.py b/app/routes/activitypub/box.py similarity index 77% rename from src/app/routes/activitypub/box.py rename to app/routes/activitypub/box.py index bf5b86e..22b8db0 100644 --- a/src/app/routes/activitypub/box.py +++ b/app/routes/activitypub/box.py @@ -4,15 +4,17 @@ import aiohttp import aputils -from robyn import SubRouter, Request - +from fastapi import APIRouter, HTTPException, Request +from fastapi.responses import ORJSONResponse, Response from prisma.models import User from Crypto.PublicKey import RSA from ...utils import log from ... import __version__ -router = SubRouter("Holo") +router = APIRouter( + include_in_schema=False +) logger, formatter = log.getLogger(__name__) handler = logging.FileHandler('./.logs/{:%Y-%m-%d}.log'.format(log.logConfig.time)) handler.setFormatter(formatter) diff --git a/src/app/routes/activitypub/nodeinfo.py b/app/routes/activitypub/nodeinfo.py similarity index 94% rename from src/app/routes/activitypub/nodeinfo.py rename to app/routes/activitypub/nodeinfo.py index 5667b72..b2c26b4 100644 --- a/src/app/routes/activitypub/nodeinfo.py +++ b/app/routes/activitypub/nodeinfo.py @@ -1,12 +1,13 @@ import logging -from robyn import SubRouter, Request, jsonify +from fastapi import APIRouter, Request +from fastapi.responses import ORJSONResponse, Response from prisma.models import BEConfig, User, Note from ... import __version__ -router = SubRouter("Holo", prefix="/nodeinfo") +router = APIRouter(prefix="/nodeinfo", include_in_schema=False) logger: logging.Logger = None @@ -70,7 +71,7 @@ async def v2_1(request: Request): ni["maintainer"] = { "name": instance.maintainerName } - return ni + return ORJSONResponse(ni) @router.get("/2.0") @@ -127,4 +128,4 @@ async def v2(request: Request): ni["maintainer"] = { "name": instance.maintainerName } - return ni \ No newline at end of file + return ORJSONResponse(ni) \ No newline at end of file diff --git a/src/app/routes/activitypub/objects.py b/app/routes/activitypub/objects.py similarity index 100% rename from src/app/routes/activitypub/objects.py rename to app/routes/activitypub/objects.py diff --git a/src/app/routes/activitypub/well_known.py b/app/routes/activitypub/well_known.py similarity index 50% rename from src/app/routes/activitypub/well_known.py rename to app/routes/activitypub/well_known.py index 29bbcc3..d662d63 100644 --- a/src/app/routes/activitypub/well_known.py +++ b/app/routes/activitypub/well_known.py @@ -1,33 +1,36 @@ import logging from fastapi import APIRouter, Request -from robyn import SubRouter, Response, jsonify - +from fastapi.responses import ORJSONResponse, Response from prisma.models import BEConfig, User -from ...utils.responses import XMLResponse - -router = SubRouter("Holo", prefix="/.well-known") +from ...utils.response import XMLResponse -logger: logging.Logger = None +router = APIRouter( + prefix="/.well-known", + include_in_schema=False +) +logger : logging.Logger = None @router.get("/nodeinfo") async def nodeinfo(request: Request): + instance = await BEConfig.prisma().find_first(where={"id": "hol0"}) - return { - "links": [ - { - "rel": "http://nodeinfo.diaspora.software/ns/schema/2.1", - "href": f"https://{instance.host}/nodeinfo/2.1", - }, - { - "rel": "http://nodeinfo.diaspora.software/ns/schema/2.0", - "href": f"https://{instance.host}/nodeinfo/2.0", - }, - ] - } - + return ORJSONResponse( + { + "links": [ + { + "rel": "http://nodeinfo.diaspora.software/ns/schema/2.1", + "href": f"https://{instance.host}/nodeinfo/2.1" + }, + { + "rel": "http://nodeinfo.diaspora.software/ns/schema/2.0", + "href": f"https://{instance.host}/nodeinfo/2.0" + } + ] + } + ) @router.get("/webfinger") async def webfinger(resource: str): @@ -42,48 +45,50 @@ async def webfinger(resource: str): else: return Response(status_code=400) user = await User.prisma().find_first( - where={"normalizedUserName": acct[0].lower(), "host": None} + where={ + "normalizedUserName": acct[0].lower(), + "host": None + } ) if user is None: return Response(status_code=404) - return { + return ORJSONResponse( + { "subject": f"acct:{acct[0]}@{acct[1]}", - "links": [ - { + "links": [ + { "rel": "http://webfinger.net/rel/profile-page", "type": "text/html", - "href": f"https://{instance.host}/@{user.username}", - }, - { - "rel": "self", - "type": "application/activity+json", - "href": f"https://{instance.host}/users/{user.id}", - }, - ], - } - + "href": f"https://{instance.host}/@{user.username}" + }, + { + "rel": "self", + "type": "application/activity+json", + "href": f"https://{instance.host}/users/{user.id}" + } + ] + } + ) @router.get("/host-meta") @router.get("/host-meta.json") async def host_meta(request: Request): instance = await BEConfig.prisma().find_first(where={"id": "hol0"}) if request.url.path == "/.well-known/host-meta": - hm = ( - f""" + hm = f""" - + """ - ) - return XMLResponse(xml_body=hm) + return XMLResponse(content=hm) elif request.url.path == "/.well-known/host-meta.json": - return { - "links": [ - { - "rel": "lrdd", - "type": "application/jrd+json", - "template": f"https://{instance.host}/.well-known/webfinger?resource=" - + "{uri}", - } - ] - } + return ORJSONResponse( + { + "links": [ + { + "rel": "lrdd", + "type": "application/jrd+json", + "template": f"https://{instance.host}/.well-known/webfinger?resource=" + "{uri}" + } + ] + } + ) \ No newline at end of file diff --git a/src/app/routes/avatar.py b/app/routes/avatar.py similarity index 72% rename from src/app/routes/avatar.py rename to app/routes/avatar.py index 0f56fac..3569e99 100644 --- a/src/app/routes/avatar.py +++ b/app/routes/avatar.py @@ -1,11 +1,9 @@ from boringavatars import avatar -from robyn import SubRouter, Response +from fastapi import APIRouter, Response +from fastapi.responses import RedirectResponse from prisma.models import User -from ..utils.responses import Redirect - -router = SubRouter("Holo") - +router = APIRouter() @router.get("/{username}.png") async def get_avatar(username: str): @@ -13,7 +11,7 @@ async def get_avatar(username: str): if user is None: return Response(status_code=404) else: - return Redirect(user.avatarUrl) + return RedirectResponse(user.avatarUrl) @router.get("/identicon/{text}/") async def identicon(text: str): diff --git a/src/app/server.py b/app/server.py similarity index 56% rename from src/app/server.py rename to app/server.py index 571b0f5..bd99c20 100644 --- a/src/app/server.py +++ b/app/server.py @@ -3,9 +3,9 @@ import urllib.parse import logging -from robyn import Robyn, Request, Response #, OpenAPI -# from robyn.openapi import OpenAPIInfo, Contact, License, ExternalDocumentation, Components - +from fastapi import FastAPI +from fastapi.openapi.utils import get_openapi +from scalar_fastapi import get_scalar_api_reference import prisma import pyfiglet from omegaconf import OmegaConf @@ -16,8 +16,7 @@ from . import routes config = OmegaConf.load('./.config/config.yml') -logger, formatter = log.getLogger("Holo") -db = prisma.Prisma(auto_register=True) +logger, formatter = log.getLogger("HoloBE-Core") handler = logging.FileHandler('./.logs/{:%Y-%m-%d}.log'.format(log.logConfig.time)) handler.setFormatter(formatter) logger.addHandler(handler) @@ -27,7 +26,6 @@ def generate_schema(): logger.info("\n" + Hol0_figlet) logger.info(f"v{__version__}, Created By Holo Team") logger.info("Generating OpenAPI JSON...") - """ openapi = get_openapi( title=app.title, version=app.version, @@ -35,12 +33,20 @@ def generate_schema(): description=app.description, routes=app.routes, ) - """ logger.info("OpenAPI JSON data was successfully generated.") -# return openapi + return openapi +@asynccontextmanager +async def lifespan(app: FastAPI): + env = os.environ + env["DATABASE_URL"] = f"postgresql://{urllib.parse.quote(config.database.user)}:{urllib.parse.quote(config.database.password)}@{config.database.host}:{config.database.port}/{urllib.parse.quote(config.database.name)}" + db = prisma.Prisma(auto_register=True) + await db.connect() + await init() + logger.info("server is running on: " + config.url) + yield + await db.disconnect() -""" app = FastAPI( title="Holo", description="An Interconnected Extensible Microblogging Platform🪐", @@ -49,61 +55,15 @@ def generate_schema(): docs_url=None, redoc_url=None ) - app.include_router(routes.router) -""" -app = Robyn( - file_object="Holo", -# openapi=OpenAPI( -# info=OpenAPIInfo( -# title="Holo", -# description="An Interconnected Extensible Microblogging Platform🪐", -# version=__version__, -# contact=Contact( -# name="holo-social", -# url="https://github.com/holo-social/backend/issues/new", -# ), -# license=License( -# name="AGPL-3.0", -# url="https://opensource.org/license/agpl-v3", -# ), -# externalDocs=ExternalDocumentation(description="Find more info here", url="https://docs.hol0.dev/"), -# components=Components(), -# ), -# ), -) -app.include_router(routes.router) - -@app.before_request() -async def log_request(request: Request): - logger.info( - f' {request.ip_addr if request.ip_addr else "unknown"} - {request.method.upper()} {request.url.path}' - ) - return request - -@app.startup_handler -async def startup_handler() -> None: - env = os.environ - env["DATABASE_URL"] = f"postgresql://{urllib.parse.quote(config.database.user)}:{urllib.parse.quote(config.database.password)}@{config.database.host}:{config.database.port}/{urllib.parse.quote(config.database.name)}" - await db.connect() - await init() - logger.info("server is running on: " + config.url) - -@app.shutdown_handler -async def shutdown_handler() -> None: - if db.is_connected(): - await db.disconnect() - -""" @app.get("/api-doc", include_in_schema=False) async def openapi_docs(): return get_scalar_api_reference( openapi_url=app.openapi_url, title=app.title, ) -""" - + async def init(): Hol0_figlet = pyfiglet.figlet_format("Holo", font="chunky") logger.info("\n" + Hol0_figlet) diff --git a/src/app/utils/activitypub/actor.py b/app/utils/activitypub/actor.py similarity index 72% rename from src/app/utils/activitypub/actor.py rename to app/utils/activitypub/actor.py index 262f075..d25924b 100644 --- a/src/app/utils/activitypub/actor.py +++ b/app/utils/activitypub/actor.py @@ -4,7 +4,6 @@ from aiohttp.client_exceptions import ClientConnectorError from prisma.models import User from python_aid import aidx -from yarl import URL from ... import __version__ from ..exceptions import HostNotFoundError, WebFingerNotSupported, ActorNotFound, RemoteActorException @@ -26,7 +25,6 @@ async def get_remote_user_from_url(url: str): "actorUrl": url } ) - remote = URL(url) if actor is None: async with aiohttp.ClientSession() as session: raw_actor = fetch_remote_actor_from_url(url, session) @@ -48,24 +46,16 @@ async def get_remote_user_from_url(url: str): description = raw_actor.get("summary") else: description = "" - actor = await User.prisma().create( - data={ - "id": aidx.genAidx(), - "host": remote.host, - "username": raw_actor["preferredUsername"], - "normalizedUserName": raw_actor["preferredUsername"].lower(), - "avatarUrl": avatarUrl, - "bannerUrl": bannerUrl, - "description": description, - "manuallyApprovesFollowers": raw_actor.get("manuallyApprovesFollowers", False), - "discoverable": raw_actor.get("discoverable", False), - "publicKeyOwner": raw_actor["publicKey"]["owner"], - "publicKeyPem": raw_actor["publicKey"]["publicKeyPem"], - "bday": raw_actor.get("vcard:bday"), - "address": raw_actor.get("vcard:Address") - } - ) - return actor + actor = await User.prisma().create(data={ + "id": aidx.genAidx(), + "username": raw_actor["preferredUsername"], + "normalizedUserName": raw_actor["preferredUsername"].lower(), + "avatarUrl": avatarUrl, + "bannerUrl": bannerUrl, + "description": description, + "publicKeyOwner": raw_actor["publicKey"]["owner"], + "publicKeyPem": raw_actor["publicKey"]["publicKeyPem"] + }) async def fetch_remote_actor_from_url(url: str, session: aiohttp.ClientSession): async with session.get(url, headers={"User-Agent": f"Hol0/{__version__} ()", "Accept": "application/activity+json"}) as resp: @@ -96,6 +86,4 @@ async def fetch_remote_actor(host: str, handle: str, acct_host: str=None): break return actor except ClientConnectorError: - raise HostNotFoundError(f"Host: {host} is unavailable") - -asyncio.run(get_remote_user_from_url("https://misskey.io/users/9sx9majyf5k302i8")) \ No newline at end of file + raise HostNotFoundError(f"Host: {host} is unavailable") \ No newline at end of file diff --git a/src/app/utils/activitypub/context.py b/app/utils/activitypub/context.py similarity index 100% rename from src/app/utils/activitypub/context.py rename to app/utils/activitypub/context.py diff --git a/src/app/utils/combine.py b/app/utils/combine.py similarity index 100% rename from src/app/utils/combine.py rename to app/utils/combine.py diff --git a/src/app/utils/exceptions.py b/app/utils/exceptions.py similarity index 100% rename from src/app/utils/exceptions.py rename to app/utils/exceptions.py diff --git a/src/app/utils/log.py b/app/utils/log.py similarity index 100% rename from src/app/utils/log.py rename to app/utils/log.py diff --git a/src/app/utils/migrate.py b/app/utils/migrate.py similarity index 54% rename from src/app/utils/migrate.py rename to app/utils/migrate.py index 6c8ac86..1a561ed 100644 --- a/src/app/utils/migrate.py +++ b/app/utils/migrate.py @@ -2,14 +2,31 @@ import os import urllib.parse import subprocess +import shutil import importlib from yarl import URL from omegaconf import OmegaConf -# from prisma_cleanup import cleanup +from prisma_cleanup import cleanup config = OmegaConf.load('./.config/config.yml') +def combine_schema(): + schemas = "\n\n" + try: + shutil.rmtree("./prisma", ignore_errors=True) + except FileNotFoundError: + pass + os.makedirs("./prisma", exist_ok=True) + for f in os.listdir("./app/models/prisma"): + if os.path.isfile(os.path.join("./app/models/prisma", f)) and f.endswith(".prisma"): + with open(os.path.join("./app/models/prisma", f), "r", encoding="utf-8") as schema: + schemas += schema.read() + "\n\n" + with open("./app/models/prisma/schema.tmpl", "r", encoding="utf-8") as p: + prisma_tmpl = p.read() + with open("./prisma/schema.prisma", "w", encoding="utf-8") as f: + f.write(prisma_tmpl + schemas) + async def setup(): prisma = importlib.import_module('prisma') db = prisma.Prisma() @@ -29,7 +46,8 @@ async def setup(): } ) -# cleanup() +cleanup() +combine_schema() env = os.environ env["DATABASE_URL"] = f"postgresql://{urllib.parse.quote(config.database.user)}:{urllib.parse.quote(config.database.password)}@{config.database.host}:{config.database.port}/{urllib.parse.quote(config.database.name)}" subprocess.run("prisma db push", env=env) diff --git a/app/utils/response.py b/app/utils/response.py new file mode 100644 index 0000000..87f301b --- /dev/null +++ b/app/utils/response.py @@ -0,0 +1,18 @@ +from typing import Optional, Union + +from fastapi import Response +from starlette.background import BackgroundTask + +class XMLResponse(Response): + def __init__( + self, + content: Union[str, bytes], + status_code: int = 200, + background: Optional[BackgroundTask] = None, + ): + super().__init__( + content, + status_code=status_code, + media_type="application/xml", + background=background, + ) \ No newline at end of file diff --git a/pdm.lock b/pdm.lock index 1852c4e..b96366d 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "pytest"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:c6c72c26d37a6ab32aa8d909ebe62439a3c99a5a5c25dc8ad8a89ac3d5a4dda7" +content_hash = "sha256:16fa959bb52f81def8d21df124a8dab7a6182a03145a4d6aac214ef6b4995afa" [[metadata.targets]] requires_python = ">=3.11" @@ -50,25 +50,13 @@ files = [ {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, ] -[[package]] -name = "aiohappyeyeballs" -version = "2.3.5" -requires_python = ">=3.8" -summary = "Happy Eyeballs for asyncio" -groups = ["default"] -files = [ - {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, - {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, -] - [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.9.5" requires_python = ">=3.8" summary = "Async http client/server framework (asyncio)" groups = ["default"] dependencies = [ - "aiohappyeyeballs>=2.3.0", "aiosignal>=1.1.2", "async-timeout<5.0,>=4.0; python_version < \"3.11\"", "attrs>=17.3.0", @@ -77,114 +65,84 @@ dependencies = [ "yarl<2.0,>=1.0", ] files = [ - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.9.5" extras = ["speedups"] requires_python = ">=3.8" summary = "Async http client/server framework (asyncio)" groups = ["default"] dependencies = [ "Brotli; platform_python_implementation == \"CPython\"", - "aiodns>=3.2.0; sys_platform == \"linux\" or sys_platform == \"darwin\"", - "aiohttp==3.10.5", + "aiodns; sys_platform == \"linux\" or sys_platform == \"darwin\"", + "aiohttp==3.9.5", "brotlicffi; platform_python_implementation != \"CPython\"", ] files = [ - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [[package]] @@ -567,14 +525,65 @@ files = [ ] [[package]] -name = "dill" -version = "0.3.8" +name = "dnspython" +version = "2.6.1" +requires_python = ">=3.8" +summary = "DNS toolkit" +groups = ["default"] +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[[package]] +name = "email-validator" +version = "2.2.0" +requires_python = ">=3.8" +summary = "A robust email address syntax and deliverability validation library." +groups = ["default"] +dependencies = [ + "dnspython>=2.0.0", + "idna>=2.0.0", +] +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[[package]] +name = "fastapi" +version = "0.111.1" requires_python = ">=3.8" -summary = "serialize all of Python" +summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" groups = ["default"] +dependencies = [ + "email-validator>=2.0.0", + "fastapi-cli>=0.0.2", + "httpx>=0.23.0", + "jinja2>=2.11.2", + "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", + "python-multipart>=0.0.7", + "starlette<0.38.0,>=0.37.2", + "typing-extensions>=4.8.0", + "uvicorn[standard]>=0.12.0", +] files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "fastapi-0.111.1-py3-none-any.whl", hash = "sha256:4f51cfa25d72f9fbc3280832e84b32494cf186f50158d364a8765aabf22587bf"}, + {file = "fastapi-0.111.1.tar.gz", hash = "sha256:ddd1ac34cb1f76c2e2d7f8545a4bcb5463bce4834e81abf0b189e0c359ab2413"}, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.4" +requires_python = ">=3.8" +summary = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +groups = ["default"] +dependencies = [ + "typer>=0.12.3", +] +files = [ + {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, + {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, ] [[package]] @@ -687,6 +696,30 @@ files = [ {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] +[[package]] +name = "httptools" +version = "0.6.1" +requires_python = ">=3.8.0" +summary = "A collection of framework independent HTTP protocol utils." +groups = ["default"] +files = [ + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + [[package]] name = "httpx" version = "0.27.0" @@ -727,21 +760,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "inquirerpy" -version = "0.3.4" -requires_python = ">=3.7,<4.0" -summary = "Python port of Inquirer.js (A collection of common interactive command-line user interfaces)" -groups = ["default"] -dependencies = [ - "pfzy<0.4.0,>=0.3.1", - "prompt-toolkit<4.0.0,>=3.0.1", -] -files = [ - {file = "InquirerPy-0.3.4-py3-none-any.whl", hash = "sha256:c65fdfbac1fa00e3ee4fb10679f4d3ed7a012abf4833910e63c295827fe2a7d4"}, - {file = "InquirerPy-0.3.4.tar.gz", hash = "sha256:89d2ada0111f337483cb41ae31073108b2ec1e618a49d7110b0d7ade89fc197e"}, -] - [[package]] name = "jinja2" version = "3.1.4" @@ -770,6 +788,20 @@ files = [ {file = "joserfc-1.0.0.tar.gz", hash = "sha256:298a9820c76576f8ca63375d1851cc092f3f225508305c7a36c4632cec38f7bc"}, ] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +requires_python = ">=3.8" +summary = "Python port of markdown-it. Markdown parsing, done right!" +groups = ["default"] +dependencies = [ + "mdurl~=0.1", +] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + [[package]] name = "markupsafe" version = "2.1.5" @@ -800,6 +832,17 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "mdurl" +version = "0.1.2" +requires_python = ">=3.7" +summary = "Markdown URL utilities" +groups = ["default"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "multidict" version = "6.0.5" @@ -841,30 +884,6 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[package]] -name = "multiprocess" -version = "0.70.14" -requires_python = ">=3.7" -summary = "better multiprocessing and multithreading in python" -groups = ["default"] -dependencies = [ - "dill>=0.3.6", -] -files = [ - {file = "multiprocess-0.70.14.tar.gz", hash = "sha256:3eddafc12f2260d27ae03fe6069b12570ab4764ab59a75e81624fac453fbf46a"}, -] - -[[package]] -name = "nestd" -version = "0.3.1" -requires_python = ">=3.7,<4.0" -summary = "A package to extract your nested functions!" -groups = ["default"] -files = [ - {file = "nestd-0.3.1-py3-none-any.whl", hash = "sha256:9a27d65e0676477acf50f1dcadb15755eb85076983e5abaffc94b0f4e26eef62"}, - {file = "nestd-0.3.1.tar.gz", hash = "sha256:1b946d2bbc16df67ca169b8cb59794ec70b54d4a56a017e3d1c092d364d22a39"}, -] - [[package]] name = "nodeenv" version = "1.9.1" @@ -894,31 +913,32 @@ files = [ [[package]] name = "orjson" -version = "3.9.15" +version = "3.10.6" requires_python = ">=3.8" summary = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" groups = ["default"] files = [ - {file = "orjson-3.9.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5"}, - {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde"}, - {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404"}, - {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357"}, - {file = "orjson-3.9.15-cp311-none-win32.whl", hash = "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7"}, - {file = "orjson-3.9.15-cp311-none-win_amd64.whl", hash = "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8"}, - {file = "orjson-3.9.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d"}, - {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494"}, - {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068"}, - {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda"}, - {file = "orjson-3.9.15-cp312-none-win_amd64.whl", hash = "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2"}, - {file = "orjson-3.9.15.tar.gz", hash = "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061"}, + {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, + {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, + {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, + {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, + {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, + {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, + {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] [[package]] @@ -933,14 +953,28 @@ files = [ ] [[package]] -name = "pfzy" -version = "0.3.4" -requires_python = ">=3.7,<4.0" -summary = "Python port of the fzy fuzzy string matching algorithm" +name = "passlib" +version = "1.7.4" +summary = "comprehensive password hashing framework supporting over 30 schemes" groups = ["default"] files = [ - {file = "pfzy-0.3.4-py3-none-any.whl", hash = "sha256:5f50d5b2b3207fa72e7ec0ef08372ef652685470974a107d0d4999fc5a903a96"}, - {file = "pfzy-0.3.4.tar.gz", hash = "sha256:717ea765dd10b63618e7298b2d98efd819e0b30cd5905c9707223dceeb94b3f1"}, + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[[package]] +name = "passlib" +version = "1.7.4" +extras = ["bcrypt"] +summary = "comprehensive password hashing framework supporting over 30 schemes" +groups = ["default"] +dependencies = [ + "bcrypt>=3.1.0", + "passlib==1.7.4", +] +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, ] [[package]] @@ -956,8 +990,8 @@ files = [ [[package]] name = "prisma" -version = "0.15.0" -requires_python = ">=3.8.0" +version = "0.13.1" +requires_python = ">=3.7.0" summary = "Prisma Client Python is an auto-generated and fully type-safe database client" groups = ["default"] dependencies = [ @@ -973,22 +1007,8 @@ dependencies = [ "typing-extensions>=4.5.0", ] files = [ - {file = "prisma-0.15.0-py3-none-any.whl", hash = "sha256:de949cc94d3d91243615f22ff64490aa6e2d7cb81aabffce53d92bd3977c09a4"}, - {file = "prisma-0.15.0.tar.gz", hash = "sha256:5cd6402aa8322625db3fc1152040404e7fc471fe7f8fa3a314fa8a99529ca107"}, -] - -[[package]] -name = "prompt-toolkit" -version = "3.0.47" -requires_python = ">=3.7.0" -summary = "Library for building powerful interactive command lines in Python" -groups = ["default"] -dependencies = [ - "wcwidth", -] -files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prisma-0.13.1-py3-none-any.whl", hash = "sha256:b79ad69bdf09b217431904c1250c36421233ea394a230f1665f5699fd842ea20"}, + {file = "prisma-0.13.1.tar.gz", hash = "sha256:f0f86a67c38e6f08b53cce9272dd9c736f69f4fcbb94dbdfa87bf44f983e925d"}, ] [[package]] @@ -1133,9 +1153,20 @@ files = [ {file = "pyfiglet-1.0.2.tar.gz", hash = "sha256:758788018ab8faaddc0984e1ea05ff330d3c64be663c513cc1f105f6a3066dab"}, ] +[[package]] +name = "pygments" +version = "2.18.0" +requires_python = ">=3.8" +summary = "Pygments is a syntax highlighting package written in Python." +groups = ["default"] +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.1" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["pytest"] @@ -1148,8 +1179,8 @@ dependencies = [ "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [[package]] @@ -1189,6 +1220,17 @@ files = [ {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] +[[package]] +name = "python-multipart" +version = "0.0.9" +requires_python = ">=3.8" +summary = "A streaming multipart parser for Python" +groups = ["default"] +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -1216,7 +1258,7 @@ files = [ [[package]] name = "redis" -version = "5.0.8" +version = "5.0.7" requires_python = ">=3.7" summary = "Python client for Redis database and key-value store" groups = ["default"] @@ -1226,71 +1268,61 @@ dependencies = [ "typing-extensions; python_version < \"3.8\"", ] files = [ - {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, - {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, + {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, + {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, ] [[package]] name = "redis" -version = "5.0.8" +version = "5.0.7" extras = ["hiredis"] requires_python = ">=3.7" summary = "Python client for Redis database and key-value store" groups = ["default"] dependencies = [ - "hiredis>1.0.0", - "redis==5.0.8", + "hiredis>=1.0.0", + "redis==5.0.7", ] files = [ - {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, - {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, + {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, + {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, ] [[package]] -name = "robyn" -version = "0.58.2" -summary = "A Super Fast Async Python Web Framework with a Rust runtime." +name = "rich" +version = "13.7.1" +requires_python = ">=3.7.0" +summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" groups = ["default"] dependencies = [ - "inquirerpy==0.3.4", - "multiprocess==0.70.14", - "nestd==0.3.1", - "orjson==3.9.15", - "rustimport==1.3.4", - "uvloop~=0.19.0; sys_platform != \"win32\" and platform_python_implementation == \"CPython\" and platform_machine != \"armv7l\"", - "watchdog==4.0.1", -] -files = [ - {file = "robyn-0.58.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:92718fcbe28def92c3cab94b41e7384b3c4172b92b87956926a61fbdeaca077a"}, - {file = "robyn-0.58.2-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:015fa064504baa6724b5db7cfa74b34053f1455253df49692d4cda71444f00ae"}, - {file = "robyn-0.58.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c83ffbe99a310f298f693a09189dad074114382b71f01aeb08be4444a6102d8"}, - {file = "robyn-0.58.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4205e03b8f2a747f50b46b5abc4f790eb06e2b447e578a95bfaa76b234599b4"}, - {file = "robyn-0.58.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ace19085c71eae9d81ead8345f2478479ba15bccee0a9e6875c10648594c207"}, - {file = "robyn-0.58.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:750dfbe3d1ef8bac2b1f1b95c46a3eb9c600ccf6f6fdb348bb4c4dc1937c31a8"}, - {file = "robyn-0.58.2-cp311-none-win32.whl", hash = "sha256:be1413e4c6dc1b1da1433b37099ac681a16240f87ddca118dddaa0dc19dedb13"}, - {file = "robyn-0.58.2-cp311-none-win_amd64.whl", hash = "sha256:706aeeec1af7df244017a63a458f4029a2897ad4cd7bd97bd74d3b0271615c3f"}, - {file = "robyn-0.58.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:324ee8212782fdb1c164bb51f28d2a7e00e55dd3e820a46bdf906d129a521d42"}, - {file = "robyn-0.58.2-cp312-cp312-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ff8d7ac36679c5e1e3a643bfcd49005dc3881353f9a759d6cee1ce2a3f97adc0"}, - {file = "robyn-0.58.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f149d0d7ae667bd91fee40a19e964e3c15637026dae07bb3ad4f63fa797a43ba"}, - {file = "robyn-0.58.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98201bcff5dc28f50f2490b04fad393fae22316c059f58bd9e613c3c5f47aea6"}, - {file = "robyn-0.58.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29ce6d657808eb5325faf61991e58e836ddc29cfa3e8061b12181d1bf2cb9dcf"}, - {file = "robyn-0.58.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54d2ad3e780ae2cd6ea96f96e7cb56150642d9e839136a5e990fd2a74df80db"}, - {file = "robyn-0.58.2-cp312-none-win32.whl", hash = "sha256:1d1cff7ee0dff9e7ce1dfcb6ad0dd92c9060f01866bd3d45fedbf60f8db78952"}, - {file = "robyn-0.58.2-cp312-none-win_amd64.whl", hash = "sha256:8c4ed7aac8d0ea85c1f58116b5428b4b2f69374ede0765c97de46a7ee5d54240"}, - {file = "robyn-0.58.2.tar.gz", hash = "sha256:406b4bd5380c20721af8da4c4d736406b09923998a3118606f84648b16743129"}, -] - -[[package]] -name = "rustimport" -version = "1.3.4" -summary = "Import Rust files directly from Python!" + "markdown-it-py>=2.2.0", + "pygments<3.0.0,>=2.13.0", + "typing-extensions<5.0,>=4.0.0; python_version < \"3.9\"", +] +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[[package]] +name = "scalar-fastapi" +version = "1.0.2" +summary = "This plugin provides an easy way to render a beautiful API reference based on a OpenAPI/Swagger file with FastAPI." groups = ["default"] -dependencies = [ - "toml>=0.10.2", +files = [ + {file = "scalar_fastapi-1.0.2-py3-none-any.whl", hash = "sha256:a4344e6281e99f01f0aadc1020588754b358a1cd48e892bd3b24a31661d24c9a"}, + {file = "scalar_fastapi-1.0.2.tar.gz", hash = "sha256:fd21ada877a9c406500feadcf1dd0d3168ab735a9d97b44ddfac00769e149ac7"}, ] + +[[package]] +name = "shellingham" +version = "1.5.4" +requires_python = ">=3.7" +summary = "Tool to Detect Surrounding Shell" +groups = ["default"] files = [ - {file = "rustimport-1.3.4-py3-none-any.whl", hash = "sha256:f2b931ff4e0fa931028066a7dacaae449b1a4601fe7a553c35f3dd63aba97ce0"}, - {file = "rustimport-1.3.4.tar.gz", hash = "sha256:ba80e3c28af07ba3910ad395613d01f9e421bfb59fbb1ac050e2b5d9b78b4980"}, + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] [[package]] @@ -1305,14 +1337,18 @@ files = [ ] [[package]] -name = "toml" -version = "0.10.2" -requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -summary = "Python Library for Tom's Obvious, Minimal Language" +name = "starlette" +version = "0.37.2" +requires_python = ">=3.8" +summary = "The little ASGI library that shines." groups = ["default"] +dependencies = [ + "anyio<5,>=3.4.0", + "typing-extensions>=3.10.0; python_version < \"3.10\"", +] files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [[package]] @@ -1326,6 +1362,23 @@ files = [ {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] +[[package]] +name = "typer" +version = "0.12.3" +requires_python = ">=3.7" +summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." +groups = ["default"] +dependencies = [ + "click>=8.0.0", + "rich>=10.11.0", + "shellingham>=1.3.0", + "typing-extensions>=3.7.4.3", +] +files = [ + {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, + {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1337,13 +1390,51 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "uvicorn" +version = "0.30.3" +requires_python = ">=3.8" +summary = "The lightning-fast ASGI server." +groups = ["default"] +dependencies = [ + "click>=7.0", + "h11>=0.8", + "typing-extensions>=4.0; python_version < \"3.11\"", +] +files = [ + {file = "uvicorn-0.30.3-py3-none-any.whl", hash = "sha256:94a3608da0e530cea8f69683aa4126364ac18e3826b6630d1a65f4638aade503"}, + {file = "uvicorn-0.30.3.tar.gz", hash = "sha256:0d114d0831ff1adbf231d358cbf42f17333413042552a624ea6a9b4c33dcfd81"}, +] + +[[package]] +name = "uvicorn" +version = "0.30.3" +extras = ["standard"] +requires_python = ">=3.8" +summary = "The lightning-fast ASGI server." +groups = ["default"] +dependencies = [ + "colorama>=0.4; sys_platform == \"win32\"", + "httptools>=0.5.0", + "python-dotenv>=0.13", + "pyyaml>=5.1", + "uvicorn==0.30.3", + "uvloop!=0.15.0,!=0.15.1,>=0.14.0; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"", + "watchfiles>=0.13", + "websockets>=10.4", +] +files = [ + {file = "uvicorn-0.30.3-py3-none-any.whl", hash = "sha256:94a3608da0e530cea8f69683aa4126364ac18e3826b6630d1a65f4638aade503"}, + {file = "uvicorn-0.30.3.tar.gz", hash = "sha256:0d114d0831ff1adbf231d358cbf42f17333413042552a624ea6a9b4c33dcfd81"}, +] + [[package]] name = "uvloop" version = "0.19.0" requires_python = ">=3.8.0" summary = "Fast implementation of asyncio event loop on top of libuv" groups = ["default"] -marker = "sys_platform != \"win32\" and platform_python_implementation == \"CPython\" and platform_machine != \"armv7l\"" +marker = "(sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"" files = [ {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, @@ -1361,42 +1452,75 @@ files = [ ] [[package]] -name = "watchdog" -version = "4.0.1" +name = "watchfiles" +version = "0.22.0" requires_python = ">=3.8" -summary = "Filesystem events monitoring" -groups = ["default"] -files = [ - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, -] - -[[package]] -name = "wcwidth" -version = "0.2.13" -summary = "Measures the displayed width of unicode strings in a terminal" +summary = "Simple, modern and high performance file watching and code reload in python." groups = ["default"] dependencies = [ - "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", -] + "anyio>=3.0.0", +] +files = [ + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, +] + +[[package]] +name = "websockets" +version = "12.0" +requires_python = ">=3.8" +summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +groups = ["default"] files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 8baf0d6..e32d94e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,34 +6,40 @@ authors = [ {name = "AmaseCocoa", email = "amase.cocoa@gmail.com"}, ] dependencies = [ + "fastapi>=0.111.0", "aiohttp[speedups]>=3.9.5", "aiofiles>=23.2.1", + "orjson>=3.10.3", "pycryptodome>=3.20.0", # "granian>=1.4.1", "boringavatars>=1.0.3", "bcrypt>=4.2.0", "joserfc>=1.0.0", + "uvicorn[standard]>=0.30.0", "pyfiglet>=1.0.2", "redis[hiredis]>=5.0.4", + "passlib[bcrypt]>=1.7.4", "prisma>=0.13.1", "activitypub-utils>=0.3.1.post1", "python-aid>=0.2.1", "omegaconf>=2.3.0", + "scalar-fastapi>=1.0.2", "colorlog>=6.8.2", - "robyn>=0.58.2", ] requires-python = ">=3.11" readme = "README.md" -license = {text = "AGPL-3.0-only"} +license = {text = "AGPL-3.0-or-later"} [tool.pdm] distribution = false [tool.pdm.scripts] -serve = "python src/process.py --workers=5 --process=5" +serve = "uvicorn main:app" test = "pytest --cov=./ --cov-report=xml" migrate = "python app/utils/migrate.py" +# "granian:serve" = "granian --interface asgi main:app" +# grapctl [tool.pdm.dev-dependencies] pytest = [ diff --git a/src/app/utils/responses.py b/src/app/utils/responses.py deleted file mode 100644 index 279514b..0000000 --- a/src/app/utils/responses.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import Optional - -from robyn import Response - -def Redirect(location: str, status_code: int = 302, headers: Optional[dict] = None, description: Optional[str] = None) -> Response: - """ - Function to create a Response instance for HTTP redirects. - - @param location: The URL to redirect to. - @param status_code: The status code of the redirect response. - @param headers: Additional headers for the response. - @param description: The description of the response. - @return: A Response instance configured for redirection. - """ - if headers is None: - headers = {} - headers["Location"] = location - return Response( - status_code=status_code, - headers=headers, - description=description if description else f"Redirecting to {location}", - response_type="text/html" - ) - -def XMLResponse(xml_body: str, status_code: int = 200, headers: Optional[dict] = None) -> Response: - """ - Function to create a Response instance for XML responses. - - @param xml_body: The XML content of the response. - @param status_code: The status code of the XML response. - @param headers: Additional headers for the response. - @return: A Response instance configured for XML content. - """ - if headers is None: - headers = {} - headers["Content-Type"] = "application/xml" - return Response( - status_code=status_code, - headers=headers, - description=xml_body, - response_type="application/xml" - ) \ No newline at end of file diff --git a/src/process.py b/src/process.py deleted file mode 100644 index 1aa4ed4..0000000 --- a/src/process.py +++ /dev/null @@ -1,3 +0,0 @@ -from app.server import app - -app.start(host="0.0.0.0", port=8080) \ No newline at end of file