From bdafb4ba74d0cbcdbd8950100078645baf8c2fac Mon Sep 17 00:00:00 2001 From: AmaseCocoa Date: Thu, 22 Aug 2024 04:48:03 +0900 Subject: [PATCH 1/2] =?UTF-8?q?prisma=E3=81=AE=E3=82=B9=E3=82=AD=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=82=92combine=E3=81=97=E3=81=AA=E3=81=84=E3=81=A7?= =?UTF-8?q?=E5=88=86=E3=81=91=E3=82=8B=E6=A9=9F=E8=83=BD=E3=81=8C=E5=AE=9F?= =?UTF-8?q?=E8=A3=85=E3=81=95=E3=82=8C=E3=81=9F=E3=81=AE=E3=81=A7=E3=81=9D?= =?UTF-8?q?=E3=82=8C=E3=82=92=E4=BD=BF=E3=81=86=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 ------------------------------- app/utils/migrate.py | 22 +-------- 7 files changed, 2 insertions(+), 289 deletions(-) delete mode 100644 app/models/prisma/backend.prisma delete mode 100644 app/models/prisma/channel.prisma delete mode 100644 app/models/prisma/instance.prisma delete mode 100644 app/models/prisma/note.prisma delete mode 100644 app/models/prisma/schema.tmpl delete mode 100644 app/models/prisma/user.prisma diff --git a/app/models/prisma/backend.prisma b/app/models/prisma/backend.prisma deleted file mode 100644 index 0efb864..0000000 --- a/app/models/prisma/backend.prisma +++ /dev/null @@ -1,54 +0,0 @@ -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 deleted file mode 100644 index 0e73043..0000000 --- a/app/models/prisma/channel.prisma +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index bc8724b..0000000 --- a/app/models/prisma/instance.prisma +++ /dev/null @@ -1,50 +0,0 @@ -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 deleted file mode 100644 index 35b0a08..0000000 --- a/app/models/prisma/note.prisma +++ /dev/null @@ -1,53 +0,0 @@ -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 deleted file mode 100644 index 8bf60a6..0000000 --- a/app/models/prisma/schema.tmpl +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index a733c77..0000000 --- a/app/models/prisma/user.prisma +++ /dev/null @@ -1,78 +0,0 @@ -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/app/utils/migrate.py b/app/utils/migrate.py index 1a561ed..6c8ac86 100644 --- a/app/utils/migrate.py +++ b/app/utils/migrate.py @@ -2,31 +2,14 @@ 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() @@ -46,8 +29,7 @@ async def setup(): } ) -cleanup() -combine_schema() +# cleanup() 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) From 20bf76a86ab010bb9a179d6db72aa54caaed4855 Mon Sep 17 00:00:00 2001 From: AmaseCocoa Date: Fri, 23 Aug 2024 18:16:55 +0900 Subject: [PATCH 2/2] Migrated to Robyn --- .config/config_example.yml | 6 +- .../activities.py => .logs/.gitkeep | 0 README.md | 18 +- app/utils/response.py | 18 - pdm.lock | 698 +++++++----------- pyproject.toml | 12 +- {app => src/app}/__init__.py | 0 {app => src/app}/routes/__init__.py | 4 +- .../app}/routes/activitypub/__init__.py | 4 +- .../app/routes/activitypub/activities.py | 0 {app => src/app}/routes/activitypub/actors.py | 9 +- {app => src/app}/routes/activitypub/box.py | 8 +- .../app}/routes/activitypub/nodeinfo.py | 9 +- src/app/routes/activitypub/objects.py | 0 .../app}/routes/activitypub/well_known.py | 103 ++- {app => src/app}/routes/avatar.py | 10 +- {app => src/app}/server.py | 72 +- {app => src/app}/utils/activitypub/actor.py | 34 +- {app => src/app}/utils/activitypub/context.py | 0 {app => src/app}/utils/combine.py | 0 {app => src/app}/utils/exceptions.py | 0 {app => src/app}/utils/log.py | 0 {app => src/app}/utils/migrate.py | 0 src/app/utils/responses.py | 42 ++ src/process.py | 3 + 25 files changed, 498 insertions(+), 552 deletions(-) rename app/routes/activitypub/activities.py => .logs/.gitkeep (100%) delete mode 100644 app/utils/response.py rename {app => src/app}/__init__.py (100%) rename {app => src/app}/routes/__init__.py (67%) rename {app => src/app}/routes/activitypub/__init__.py (78%) rename app/routes/activitypub/objects.py => src/app/routes/activitypub/activities.py (100%) rename {app => src/app}/routes/activitypub/actors.py (95%) rename {app => src/app}/routes/activitypub/box.py (77%) rename {app => src/app}/routes/activitypub/nodeinfo.py (94%) create mode 100644 src/app/routes/activitypub/objects.py rename {app => src/app}/routes/activitypub/well_known.py (50%) rename {app => src/app}/routes/avatar.py (72%) rename {app => src/app}/server.py (56%) rename {app => src/app}/utils/activitypub/actor.py (72%) rename {app => src/app}/utils/activitypub/context.py (100%) rename {app => src/app}/utils/combine.py (100%) rename {app => src/app}/utils/exceptions.py (100%) rename {app => src/app}/utils/log.py (100%) rename {app => src/app}/utils/migrate.py (100%) create mode 100644 src/app/utils/responses.py create mode 100644 src/process.py diff --git a/.config/config_example.yml b/.config/config_example.yml index d1afd55..0eae665 100644 --- a/.config/config_example.yml +++ b/.config/config_example.yml @@ -15,4 +15,8 @@ job: debug: enable: true profiling: false - nossl: false \ No newline at end of file + nossl: false + +extends: + workers: 4 + process: 4 \ No newline at end of file diff --git a/app/routes/activitypub/activities.py b/.logs/.gitkeep similarity index 100% rename from app/routes/activitypub/activities.py rename to .logs/.gitkeep diff --git a/README.md b/README.md index 3c96b63..e1acd52 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# HoloBE -Holo (Hol0) backend server. +# Holo +Holo backend server. -Powered by [FastAPI](https://fastapi.tiangolo.com) with [Prisma](https://prisma.io) ([prisma-client-py](https://github.com/RobertCraigie/prisma-client-py)) +Powered by [Robyn](https://fastapi.tiangolo.com) with [Prisma](https://prisma.io) ([prisma-client-py](https://github.com/RobertCraigie/prisma-client-py)) ## Getting Started > [!WARNING] -> HoloBE is under development. Therefore, its use in a production environment is deprecated. +> Holo 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 - - [x] login - - [x] signup - - [x] CloudFlare Turnstile + - [ ] login + - [ ] signup + - [ ] CloudFlare Turnstile - [ ] password reset - - [x] CloudFlare Turnstile + - [ ] CloudFlare Turnstile - [ ] Profile - [ ] Note - [ ] Render MFM diff --git a/app/utils/response.py b/app/utils/response.py deleted file mode 100644 index 87f301b..0000000 --- a/app/utils/response.py +++ /dev/null @@ -1,18 +0,0 @@ -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 b96366d..1852c4e 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:16fa959bb52f81def8d21df124a8dab7a6182a03145a4d6aac214ef6b4995afa" +content_hash = "sha256:c6c72c26d37a6ab32aa8d909ebe62439a3c99a5a5c25dc8ad8a89ac3d5a4dda7" [[metadata.targets]] requires_python = ">=3.11" @@ -50,13 +50,25 @@ 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.9.5" +version = "3.10.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", @@ -65,84 +77,114 @@ dependencies = [ "yarl<2.0,>=1.0", ] files = [ - {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"}, + {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"}, ] [[package]] name = "aiohttp" -version = "3.9.5" +version = "3.10.5" extras = ["speedups"] requires_python = ">=3.8" summary = "Async http client/server framework (asyncio)" groups = ["default"] dependencies = [ "Brotli; platform_python_implementation == \"CPython\"", - "aiodns; sys_platform == \"linux\" or sys_platform == \"darwin\"", - "aiohttp==3.9.5", + "aiodns>=3.2.0; sys_platform == \"linux\" or sys_platform == \"darwin\"", + "aiohttp==3.10.5", "brotlicffi; platform_python_implementation != \"CPython\"", ] files = [ - {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"}, + {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"}, ] [[package]] @@ -525,65 +567,14 @@ files = [ ] [[package]] -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" +name = "dill" +version = "0.3.8" requires_python = ">=3.8" -summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +summary = "serialize all of Python" 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 = "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"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [[package]] @@ -696,30 +687,6 @@ 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" @@ -760,6 +727,21 @@ 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" @@ -788,20 +770,6 @@ 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" @@ -832,17 +800,6 @@ 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" @@ -884,6 +841,30 @@ 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" @@ -913,32 +894,31 @@ files = [ [[package]] name = "orjson" -version = "3.10.6" +version = "3.9.15" requires_python = ">=3.8" summary = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" groups = ["default"] files = [ - {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"}, + {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"}, ] [[package]] @@ -953,28 +933,14 @@ files = [ ] [[package]] -name = "passlib" -version = "1.7.4" -summary = "comprehensive password hashing framework supporting over 30 schemes" +name = "pfzy" +version = "0.3.4" +requires_python = ">=3.7,<4.0" +summary = "Python port of the fzy fuzzy string matching algorithm" groups = ["default"] 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]] -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"}, + {file = "pfzy-0.3.4-py3-none-any.whl", hash = "sha256:5f50d5b2b3207fa72e7ec0ef08372ef652685470974a107d0d4999fc5a903a96"}, + {file = "pfzy-0.3.4.tar.gz", hash = "sha256:717ea765dd10b63618e7298b2d98efd819e0b30cd5905c9707223dceeb94b3f1"}, ] [[package]] @@ -990,8 +956,8 @@ files = [ [[package]] name = "prisma" -version = "0.13.1" -requires_python = ">=3.7.0" +version = "0.15.0" +requires_python = ">=3.8.0" summary = "Prisma Client Python is an auto-generated and fully type-safe database client" groups = ["default"] dependencies = [ @@ -1007,8 +973,22 @@ dependencies = [ "typing-extensions>=4.5.0", ] files = [ - {file = "prisma-0.13.1-py3-none-any.whl", hash = "sha256:b79ad69bdf09b217431904c1250c36421233ea394a230f1665f5699fd842ea20"}, - {file = "prisma-0.13.1.tar.gz", hash = "sha256:f0f86a67c38e6f08b53cce9272dd9c736f69f4fcbb94dbdfa87bf44f983e925d"}, + {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"}, ] [[package]] @@ -1153,20 +1133,9 @@ 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.1" +version = "8.3.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["pytest"] @@ -1179,8 +1148,8 @@ dependencies = [ "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, - {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [[package]] @@ -1220,17 +1189,6 @@ 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" @@ -1258,7 +1216,7 @@ files = [ [[package]] name = "redis" -version = "5.0.7" +version = "5.0.8" requires_python = ">=3.7" summary = "Python client for Redis database and key-value store" groups = ["default"] @@ -1268,61 +1226,71 @@ dependencies = [ "typing-extensions; python_version < \"3.8\"", ] files = [ - {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, - {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [[package]] name = "redis" -version = "5.0.7" +version = "5.0.8" 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.7", + "hiredis>1.0.0", + "redis==5.0.8", ] files = [ - {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, - {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [[package]] -name = "rich" -version = "13.7.1" -requires_python = ">=3.7.0" -summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +name = "robyn" +version = "0.58.2" +summary = "A Super Fast Async Python Web Framework with a Rust runtime." groups = ["default"] dependencies = [ - "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." + "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!" groups = ["default"] -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"}, +dependencies = [ + "toml>=0.10.2", ] - -[[package]] -name = "shellingham" -version = "1.5.4" -requires_python = ">=3.7" -summary = "Tool to Detect Surrounding Shell" -groups = ["default"] files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, + {file = "rustimport-1.3.4-py3-none-any.whl", hash = "sha256:f2b931ff4e0fa931028066a7dacaae449b1a4601fe7a553c35f3dd63aba97ce0"}, + {file = "rustimport-1.3.4.tar.gz", hash = "sha256:ba80e3c28af07ba3910ad395613d01f9e421bfb59fbb1ac050e2b5d9b78b4980"}, ] [[package]] @@ -1337,18 +1305,14 @@ files = [ ] [[package]] -name = "starlette" -version = "0.37.2" -requires_python = ">=3.8" -summary = "The little ASGI library that shines." +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" groups = ["default"] -dependencies = [ - "anyio<5,>=3.4.0", - "typing-extensions>=3.10.0; python_version < \"3.10\"", -] files = [ - {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, - {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] [[package]] @@ -1362,23 +1326,6 @@ 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" @@ -1390,51 +1337,13 @@ 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 != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"" +marker = "sys_platform != \"win32\" and platform_python_implementation == \"CPython\" and platform_machine != \"armv7l\"" 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"}, @@ -1452,75 +1361,42 @@ files = [ ] [[package]] -name = "watchfiles" -version = "0.22.0" +name = "watchdog" +version = "4.0.1" requires_python = ">=3.8" -summary = "Simple, modern and high performance file watching and code reload in python." +summary = "Filesystem events monitoring" groups = ["default"] -dependencies = [ - "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)" +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" groups = ["default"] +dependencies = [ + "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", +] files = [ - {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"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index e32d94e..8baf0d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,40 +6,34 @@ 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-or-later"} +license = {text = "AGPL-3.0-only"} [tool.pdm] distribution = false [tool.pdm.scripts] -serve = "uvicorn main:app" +serve = "python src/process.py --workers=5 --process=5" 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/app/__init__.py b/src/app/__init__.py similarity index 100% rename from app/__init__.py rename to src/app/__init__.py diff --git a/app/routes/__init__.py b/src/app/routes/__init__.py similarity index 67% rename from app/routes/__init__.py rename to src/app/routes/__init__.py index 175625b..bcd41ce 100644 --- a/app/routes/__init__.py +++ b/src/app/routes/__init__.py @@ -1,7 +1,7 @@ -from fastapi import APIRouter +from robyn import SubRouter from . import activitypub, avatar -router = APIRouter() +router = SubRouter("Holo") router.include_router(activitypub.router) router.include_router(avatar.router) \ No newline at end of file diff --git a/app/routes/activitypub/__init__.py b/src/app/routes/activitypub/__init__.py similarity index 78% rename from app/routes/activitypub/__init__.py rename to src/app/routes/activitypub/__init__.py index 12f2da7..39ae33b 100644 --- a/app/routes/activitypub/__init__.py +++ b/src/app/routes/activitypub/__init__.py @@ -1,8 +1,8 @@ -from fastapi import APIRouter +from robyn import SubRouter from . import well_known, nodeinfo, box, actors -router = APIRouter() +router = SubRouter("Holo") router.include_router(well_known.router) router.include_router(nodeinfo.router) router.include_router(box.router) diff --git a/app/routes/activitypub/objects.py b/src/app/routes/activitypub/activities.py similarity index 100% rename from app/routes/activitypub/objects.py rename to src/app/routes/activitypub/activities.py diff --git a/app/routes/activitypub/actors.py b/src/app/routes/activitypub/actors.py similarity index 95% rename from app/routes/activitypub/actors.py rename to src/app/routes/activitypub/actors.py index b33a37b..e4079c6 100644 --- a/app/routes/activitypub/actors.py +++ b/src/app/routes/activitypub/actors.py @@ -1,12 +1,11 @@ import logging from prisma.models import User -from fastapi import APIRouter -from fastapi.requests import Request -from fastapi.responses import ORJSONResponse, Response +from robyn import SubRouter, Response, jsonify, Request + from prisma.models import BEConfig -router = APIRouter(include_in_schema=False) +router = SubRouter("Holo") logger: logging.Logger = None @@ -83,7 +82,7 @@ async def users(request: Request, userid: str): "sensitive": False, "name": None, } - return ORJSONResponse(actor, media_type="application/activity+json") + return Response(jsonify(actor), headers={"Content-Type": "application/activity+json"}) """ diff --git a/app/routes/activitypub/box.py b/src/app/routes/activitypub/box.py similarity index 77% rename from app/routes/activitypub/box.py rename to src/app/routes/activitypub/box.py index 22b8db0..bf5b86e 100644 --- a/app/routes/activitypub/box.py +++ b/src/app/routes/activitypub/box.py @@ -4,17 +4,15 @@ import aiohttp import aputils -from fastapi import APIRouter, HTTPException, Request -from fastapi.responses import ORJSONResponse, Response +from robyn import SubRouter, Request + from prisma.models import User from Crypto.PublicKey import RSA from ...utils import log from ... import __version__ -router = APIRouter( - include_in_schema=False -) +router = SubRouter("Holo") logger, formatter = log.getLogger(__name__) handler = logging.FileHandler('./.logs/{:%Y-%m-%d}.log'.format(log.logConfig.time)) handler.setFormatter(formatter) diff --git a/app/routes/activitypub/nodeinfo.py b/src/app/routes/activitypub/nodeinfo.py similarity index 94% rename from app/routes/activitypub/nodeinfo.py rename to src/app/routes/activitypub/nodeinfo.py index b2c26b4..5667b72 100644 --- a/app/routes/activitypub/nodeinfo.py +++ b/src/app/routes/activitypub/nodeinfo.py @@ -1,13 +1,12 @@ import logging -from fastapi import APIRouter, Request -from fastapi.responses import ORJSONResponse, Response +from robyn import SubRouter, Request, jsonify from prisma.models import BEConfig, User, Note from ... import __version__ -router = APIRouter(prefix="/nodeinfo", include_in_schema=False) +router = SubRouter("Holo", prefix="/nodeinfo") logger: logging.Logger = None @@ -71,7 +70,7 @@ async def v2_1(request: Request): ni["maintainer"] = { "name": instance.maintainerName } - return ORJSONResponse(ni) + return ni @router.get("/2.0") @@ -128,4 +127,4 @@ async def v2(request: Request): ni["maintainer"] = { "name": instance.maintainerName } - return ORJSONResponse(ni) \ No newline at end of file + return ni \ No newline at end of file diff --git a/src/app/routes/activitypub/objects.py b/src/app/routes/activitypub/objects.py new file mode 100644 index 0000000..e69de29 diff --git a/app/routes/activitypub/well_known.py b/src/app/routes/activitypub/well_known.py similarity index 50% rename from app/routes/activitypub/well_known.py rename to src/app/routes/activitypub/well_known.py index d662d63..29bbcc3 100644 --- a/app/routes/activitypub/well_known.py +++ b/src/app/routes/activitypub/well_known.py @@ -1,36 +1,33 @@ import logging from fastapi import APIRouter, Request -from fastapi.responses import ORJSONResponse, Response +from robyn import SubRouter, Response, jsonify + from prisma.models import BEConfig, User -from ...utils.response import XMLResponse +from ...utils.responses import XMLResponse + +router = SubRouter("Holo", prefix="/.well-known") -router = APIRouter( - prefix="/.well-known", - include_in_schema=False -) +logger: logging.Logger = None -logger : logging.Logger = None @router.get("/nodeinfo") async def nodeinfo(request: Request): - instance = await BEConfig.prisma().find_first(where={"id": "hol0"}) - 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" - } - ] - } - ) + 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", + }, + ] + } + @router.get("/webfinger") async def webfinger(resource: str): @@ -45,50 +42,48 @@ 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 ORJSONResponse( - { + return { "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(content=hm) + ) + return XMLResponse(xml_body=hm) elif request.url.path == "/.well-known/host-meta.json": - 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 + return { + "links": [ + { + "rel": "lrdd", + "type": "application/jrd+json", + "template": f"https://{instance.host}/.well-known/webfinger?resource=" + + "{uri}", + } + ] + } diff --git a/app/routes/avatar.py b/src/app/routes/avatar.py similarity index 72% rename from app/routes/avatar.py rename to src/app/routes/avatar.py index 3569e99..0f56fac 100644 --- a/app/routes/avatar.py +++ b/src/app/routes/avatar.py @@ -1,9 +1,11 @@ from boringavatars import avatar -from fastapi import APIRouter, Response -from fastapi.responses import RedirectResponse +from robyn import SubRouter, Response from prisma.models import User -router = APIRouter() +from ..utils.responses import Redirect + +router = SubRouter("Holo") + @router.get("/{username}.png") async def get_avatar(username: str): @@ -11,7 +13,7 @@ async def get_avatar(username: str): if user is None: return Response(status_code=404) else: - return RedirectResponse(user.avatarUrl) + return Redirect(user.avatarUrl) @router.get("/identicon/{text}/") async def identicon(text: str): diff --git a/app/server.py b/src/app/server.py similarity index 56% rename from app/server.py rename to src/app/server.py index bd99c20..571b0f5 100644 --- a/app/server.py +++ b/src/app/server.py @@ -3,9 +3,9 @@ import urllib.parse import logging -from fastapi import FastAPI -from fastapi.openapi.utils import get_openapi -from scalar_fastapi import get_scalar_api_reference +from robyn import Robyn, Request, Response #, OpenAPI +# from robyn.openapi import OpenAPIInfo, Contact, License, ExternalDocumentation, Components + import prisma import pyfiglet from omegaconf import OmegaConf @@ -16,7 +16,8 @@ from . import routes config = OmegaConf.load('./.config/config.yml') -logger, formatter = log.getLogger("HoloBE-Core") +logger, formatter = log.getLogger("Holo") +db = prisma.Prisma(auto_register=True) handler = logging.FileHandler('./.logs/{:%Y-%m-%d}.log'.format(log.logConfig.time)) handler.setFormatter(formatter) logger.addHandler(handler) @@ -26,6 +27,7 @@ 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, @@ -33,20 +35,12 @@ 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🪐", @@ -55,15 +49,61 @@ async def lifespan(app: FastAPI): 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/app/utils/activitypub/actor.py b/src/app/utils/activitypub/actor.py similarity index 72% rename from app/utils/activitypub/actor.py rename to src/app/utils/activitypub/actor.py index d25924b..262f075 100644 --- a/app/utils/activitypub/actor.py +++ b/src/app/utils/activitypub/actor.py @@ -4,6 +4,7 @@ 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 @@ -25,6 +26,7 @@ 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) @@ -46,16 +48,24 @@ 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(), - "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"] - }) + 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 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: @@ -86,4 +96,6 @@ 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") \ No newline at end of file + 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 diff --git a/app/utils/activitypub/context.py b/src/app/utils/activitypub/context.py similarity index 100% rename from app/utils/activitypub/context.py rename to src/app/utils/activitypub/context.py diff --git a/app/utils/combine.py b/src/app/utils/combine.py similarity index 100% rename from app/utils/combine.py rename to src/app/utils/combine.py diff --git a/app/utils/exceptions.py b/src/app/utils/exceptions.py similarity index 100% rename from app/utils/exceptions.py rename to src/app/utils/exceptions.py diff --git a/app/utils/log.py b/src/app/utils/log.py similarity index 100% rename from app/utils/log.py rename to src/app/utils/log.py diff --git a/app/utils/migrate.py b/src/app/utils/migrate.py similarity index 100% rename from app/utils/migrate.py rename to src/app/utils/migrate.py diff --git a/src/app/utils/responses.py b/src/app/utils/responses.py new file mode 100644 index 0000000..279514b --- /dev/null +++ b/src/app/utils/responses.py @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..1aa4ed4 --- /dev/null +++ b/src/process.py @@ -0,0 +1,3 @@ +from app.server import app + +app.start(host="0.0.0.0", port=8080) \ No newline at end of file