From 7aa45d9bb34047118d9c1e483bf90ffd8d3a2ec5 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Mon, 6 Jan 2025 17:53:33 -0500
Subject: [PATCH 01/28] docs(journal): updating daily entry
---
apps/kbve.com/src/content/journal/01-06.mdx | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/apps/kbve.com/src/content/journal/01-06.mdx b/apps/kbve.com/src/content/journal/01-06.mdx
index 8d66cc7a0..c9760e502 100644
--- a/apps/kbve.com/src/content/journal/01-06.mdx
+++ b/apps/kbve.com/src/content/journal/01-06.mdx
@@ -32,6 +32,14 @@ tags:
pnpm nx run pydiscordsh:add --name fastapi
```
+- 05:21PM
+
+ **Python**
+
+ After adding the fastapi, we will need to also add the supabase and then figure out the best way to add the service key.
+ I am not too sure if we just need the basic service key or if we need a whole new key, hmm but regardless, I was thinking that we could also integrate turso aka sqlite.
+ Majority of the voting records, bumps and server information should be stored in the turso db, but the user information should be through the supabase.
+
## 2024
- 3:54pm - Working on the JS Embed Passport with Soksoa!
From 3a78a99e15905426f06b86b678b0946153e3b895 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Mon, 6 Jan 2025 17:59:24 -0500
Subject: [PATCH 02/28] fix(atlas): version bump issue
---
apps/atlas/pyproject.toml | 2 +-
apps/kbve.com/src/content/journal/01-06.mdx | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/apps/atlas/pyproject.toml b/apps/atlas/pyproject.toml
index b57e70389..809ecb70a 100644
--- a/apps/atlas/pyproject.toml
+++ b/apps/atlas/pyproject.toml
@@ -36,7 +36,7 @@ autoSearchPaths = true
[tool.poetry]
name = "kbve"
-version = "1.0.14"
+version = "1.0.15"
description = "ATLAS"
authors = [ ]
license = 'Proprietary'
diff --git a/apps/kbve.com/src/content/journal/01-06.mdx b/apps/kbve.com/src/content/journal/01-06.mdx
index c9760e502..5f022b6a3 100644
--- a/apps/kbve.com/src/content/journal/01-06.mdx
+++ b/apps/kbve.com/src/content/journal/01-06.mdx
@@ -40,6 +40,13 @@ tags:
I am not too sure if we just need the basic service key or if we need a whole new key, hmm but regardless, I was thinking that we could also integrate turso aka sqlite.
Majority of the voting records, bumps and server information should be stored in the turso db, but the user information should be through the supabase.
+- 05:58PM
+
+ **Atlas**
+
+ Looks like the atlas build seem to fail, but it might be because the version was not bumped?
+ We can loop back around and see why there were issues on that end.
+
## 2024
- 3:54pm - Working on the JS Embed Passport with Soksoa!
From 379494dbfac7409393994b35c8fb10d44d542c06 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 14:47:36 -0500
Subject: [PATCH 03/28] feat(pydiscordsh): adding the supabase pip
---
apps/kbve.com/src/content/journal/01-06.mdx | 4 +
apps/pydiscordsh/poetry.lock | 901 +++++++++++++++++++-
apps/pydiscordsh/pyproject.toml | 1 +
3 files changed, 905 insertions(+), 1 deletion(-)
diff --git a/apps/kbve.com/src/content/journal/01-06.mdx b/apps/kbve.com/src/content/journal/01-06.mdx
index 5f022b6a3..973ba8bb0 100644
--- a/apps/kbve.com/src/content/journal/01-06.mdx
+++ b/apps/kbve.com/src/content/journal/01-06.mdx
@@ -40,6 +40,10 @@ tags:
I am not too sure if we just need the basic service key or if we need a whole new key, hmm but regardless, I was thinking that we could also integrate turso aka sqlite.
Majority of the voting records, bumps and server information should be stored in the turso db, but the user information should be through the supabase.
+```shell
+ pnpm nx run pydiscordsh:add --name supabase
+```
+
- 05:58PM
**Atlas**
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index f404db0f3..e9426a0cc 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -1,5 +1,128 @@
# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand.
+[[package]]
+name = "aiohappyeyeballs"
+version = "2.4.4"
+description = "Happy Eyeballs for asyncio"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"},
+ {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"},
+]
+
+[[package]]
+name = "aiohttp"
+version = "3.11.11"
+description = "Async http client/server framework (asyncio)"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"},
+ {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"},
+ {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"},
+ {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"},
+ {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"},
+ {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"},
+ {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"},
+ {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"},
+ {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"},
+ {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"},
+ {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"},
+ {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"},
+ {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"},
+ {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"},
+ {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"},
+ {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"},
+ {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"},
+ {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"},
+ {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"},
+ {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"},
+ {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"},
+ {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"},
+ {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"},
+ {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"},
+ {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"},
+ {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"},
+ {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"},
+ {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"},
+ {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"},
+ {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"},
+ {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"},
+ {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"},
+ {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"},
+ {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"},
+ {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"},
+ {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"},
+ {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"},
+ {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"},
+ {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"},
+ {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"},
+ {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"},
+ {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"},
+ {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"},
+ {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"},
+ {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"},
+ {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"},
+ {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"},
+ {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"},
+ {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"},
+ {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"},
+ {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"},
+ {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"},
+ {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"},
+ {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"},
+ {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"},
+ {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"},
+ {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"},
+ {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"},
+ {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"},
+ {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"},
+ {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"},
+ {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"},
+ {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"},
+ {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"},
+ {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"},
+ {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"},
+ {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"},
+ {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"},
+ {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"},
+ {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"},
+ {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"},
+ {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"},
+ {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"},
+ {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"},
+ {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"},
+ {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"},
+]
+
+[package.dependencies]
+aiohappyeyeballs = ">=2.3.0"
+aiosignal = ">=1.1.2"
+async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""}
+attrs = ">=17.3.0"
+frozenlist = ">=1.1.1"
+multidict = ">=4.5,<7.0"
+propcache = ">=0.2.0"
+yarl = ">=1.17.0,<2.0"
+
+[package.extras]
+speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"]
+
+[[package]]
+name = "aiosignal"
+version = "1.3.2"
+description = "aiosignal: a list of registered asynchronous callbacks"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"},
+ {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"},
+]
+
+[package.dependencies]
+frozenlist = ">=1.1.0"
+
[[package]]
name = "annotated-types"
version = "0.7.0"
@@ -33,6 +156,36 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)",
test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"]
trio = ["trio (>=0.26.1)"]
+[[package]]
+name = "async-timeout"
+version = "5.0.1"
+description = "Timeout context manager for asyncio programs"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"},
+ {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"},
+]
+
+[[package]]
+name = "attrs"
+version = "24.3.0"
+description = "Classes Without Boilerplate"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"},
+ {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"},
+]
+
+[package.extras]
+benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
+tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"]
+
[[package]]
name = "autopep8"
version = "2.3.1"
@@ -48,6 +201,17 @@ files = [
pycodestyle = ">=2.12.0"
tomli = {version = "*", markers = "python_version < \"3.11\""}
+[[package]]
+name = "certifi"
+version = "2024.12.14"
+description = "Python package for providing Mozilla's CA Bundle."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
+ {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
+]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -136,6 +300,20 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1
[package.extras]
toml = ["tomli"]
+[[package]]
+name = "deprecation"
+version = "2.1.0"
+description = "A library to handle automated deprecations"
+optional = false
+python-versions = "*"
+files = [
+ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"},
+ {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"},
+]
+
+[package.dependencies]
+packaging = "*"
+
[[package]]
name = "exceptiongroup"
version = "1.2.2"
@@ -186,6 +364,217 @@ mccabe = ">=0.7.0,<0.8.0"
pycodestyle = ">=2.12.0,<2.13.0"
pyflakes = ">=3.2.0,<3.3.0"
+[[package]]
+name = "frozenlist"
+version = "1.5.0"
+description = "A list-like structure which implements collections.abc.MutableSequence"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"},
+ {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"},
+ {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"},
+ {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"},
+ {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"},
+ {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"},
+ {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"},
+ {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"},
+ {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"},
+ {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"},
+ {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"},
+ {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"},
+ {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"},
+ {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"},
+ {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"},
+]
+
+[[package]]
+name = "gotrue"
+version = "2.11.1"
+description = "Python Client Library for Supabase Auth"
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "gotrue-2.11.1-py3-none-any.whl", hash = "sha256:1b2d915bdc65fd0ad608532759ce9c72fa2e910145c1e6901f2188519e7bcd2d"},
+ {file = "gotrue-2.11.1.tar.gz", hash = "sha256:5594ceee60bd873e5f4fdd028b08dece3906f6013b6ed08e7786b71c0092fed0"},
+]
+
+[package.dependencies]
+httpx = {version = ">=0.26,<0.29", extras = ["http2"]}
+pydantic = ">=1.10,<3"
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
+ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
+]
+
+[[package]]
+name = "h2"
+version = "4.1.0"
+description = "HTTP/2 State-Machine based protocol implementation"
+optional = false
+python-versions = ">=3.6.1"
+files = [
+ {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"},
+ {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"},
+]
+
+[package.dependencies]
+hpack = ">=4.0,<5"
+hyperframe = ">=6.0,<7"
+
+[[package]]
+name = "hpack"
+version = "4.0.0"
+description = "Pure-Python HPACK header compression"
+optional = false
+python-versions = ">=3.6.1"
+files = [
+ {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"},
+ {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"},
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.7"
+description = "A minimal low-level HTTP client."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
+ {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
+]
+
+[package.dependencies]
+certifi = "*"
+h11 = ">=0.13,<0.15"
+
+[package.extras]
+asyncio = ["anyio (>=4.0,<5.0)"]
+http2 = ["h2 (>=3,<5)"]
+socks = ["socksio (==1.*)"]
+trio = ["trio (>=0.22.0,<1.0)"]
+
+[[package]]
+name = "httpx"
+version = "0.27.2"
+description = "The next generation HTTP client."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"},
+ {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"},
+]
+
+[package.dependencies]
+anyio = "*"
+certifi = "*"
+h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""}
+httpcore = "==1.*"
+idna = "*"
+sniffio = "*"
+
+[package.extras]
+brotli = ["brotli", "brotlicffi"]
+cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
+http2 = ["h2 (>=3,<5)"]
+socks = ["socksio (==1.*)"]
+zstd = ["zstandard (>=0.18.0)"]
+
+[[package]]
+name = "hyperframe"
+version = "6.0.1"
+description = "HTTP/2 framing layer for Python"
+optional = false
+python-versions = ">=3.6.1"
+files = [
+ {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"},
+ {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"},
+]
+
[[package]]
name = "idna"
version = "3.10"
@@ -309,6 +698,110 @@ files = [
{file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
]
+[[package]]
+name = "multidict"
+version = "6.1.0"
+description = "multidict implementation"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"},
+ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"},
+ {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"},
+ {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"},
+ {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"},
+ {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"},
+ {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"},
+ {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"},
+ {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"},
+ {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"},
+ {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"},
+ {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"},
+ {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"},
+ {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"},
+ {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"},
+ {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"},
+ {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"},
+ {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"},
+ {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"},
+ {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"},
+ {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"},
+ {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"},
+ {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"},
+ {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"},
+ {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"},
+ {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"},
+ {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"},
+ {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"},
+ {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"},
+ {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"},
+ {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"},
+ {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"},
+ {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"},
+ {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"},
+ {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"},
+ {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"},
+ {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"},
+ {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"},
+ {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"},
+ {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"},
+ {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"},
+ {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"},
+ {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"},
+ {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"},
+ {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"},
+ {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"},
+ {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"},
+ {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"},
+ {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"},
+ {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"},
+ {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"},
+ {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"},
+ {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"},
+ {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"},
+ {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"},
+ {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"},
+ {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"},
+ {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"},
+ {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"},
+ {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"},
+ {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"},
+ {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"},
+ {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"},
+ {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"},
+ {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"},
+ {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"},
+ {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"},
+ {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"},
+ {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"},
+ {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"},
+ {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"},
+ {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"},
+ {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"},
+ {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"},
+ {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"},
+ {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"},
+ {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"},
+ {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"},
+ {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"},
+ {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"},
+ {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"},
+ {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"},
+ {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"},
+ {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"},
+ {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"},
+ {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"},
+ {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"},
+ {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"},
+ {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"},
+ {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"},
+ {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"},
+ {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"},
+]
+
+[package.dependencies]
+typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""}
+
[[package]]
name = "packaging"
version = "24.2"
@@ -335,6 +828,114 @@ files = [
dev = ["pre-commit", "tox"]
testing = ["pytest", "pytest-benchmark"]
+[[package]]
+name = "postgrest"
+version = "0.19.1"
+description = "PostgREST client for Python. This library provides an ORM interface to PostgREST."
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "postgrest-0.19.1-py3-none-any.whl", hash = "sha256:a8e7be4e1abc69fd8eee5a49d7dc3a76dfbffbd778beed0b2bd7accb3f4f3a2a"},
+ {file = "postgrest-0.19.1.tar.gz", hash = "sha256:d8fa88953cced4f45efa0f412056c364f64ece8a35b5b35f458a7e58c133fbca"},
+]
+
+[package.dependencies]
+deprecation = ">=2.1.0,<3.0.0"
+httpx = {version = ">=0.26,<0.29", extras = ["http2"]}
+pydantic = ">=1.9,<3.0"
+strenum = {version = ">=0.4.9,<0.5.0", markers = "python_version < \"3.11\""}
+
+[[package]]
+name = "propcache"
+version = "0.2.1"
+description = "Accelerated property cache"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"},
+ {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"},
+ {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"},
+ {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"},
+ {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"},
+ {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"},
+ {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"},
+ {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"},
+ {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"},
+ {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"},
+ {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"},
+ {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"},
+ {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"},
+ {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"},
+ {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"},
+ {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"},
+ {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"},
+ {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"},
+ {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"},
+ {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"},
+ {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"},
+ {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"},
+ {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"},
+ {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"},
+ {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"},
+ {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"},
+ {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"},
+ {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"},
+ {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"},
+ {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"},
+ {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"},
+ {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"},
+ {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"},
+ {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"},
+ {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"},
+ {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"},
+ {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"},
+ {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"},
+ {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"},
+ {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"},
+ {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"},
+ {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"},
+ {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"},
+ {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"},
+ {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"},
+ {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"},
+ {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"},
+ {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"},
+ {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"},
+ {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"},
+ {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"},
+ {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"},
+ {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"},
+ {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"},
+ {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"},
+ {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"},
+ {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"},
+ {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"},
+ {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"},
+ {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"},
+ {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"},
+ {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"},
+ {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"},
+ {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"},
+ {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"},
+ {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"},
+ {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"},
+ {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"},
+ {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"},
+ {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"},
+ {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"},
+ {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"},
+ {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"},
+ {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"},
+ {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"},
+ {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"},
+ {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"},
+ {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"},
+ {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"},
+ {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"},
+ {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"},
+ {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"},
+]
+
[[package]]
name = "pycodestyle"
version = "2.12.1"
@@ -585,6 +1186,48 @@ termcolor = ">=2.1.0"
[package.extras]
dev = ["black", "flake8", "pre-commit"]
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+description = "Extensions to the standard Python datetime module"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+files = [
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
+]
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "realtime"
+version = "2.1.0"
+description = ""
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "realtime-2.1.0-py3-none-any.whl", hash = "sha256:e2d4f28bb2a08c1cf80e40fbf31e6116544ad29d67dd4093093e511ad738708c"},
+ {file = "realtime-2.1.0.tar.gz", hash = "sha256:ca3ae6be47667a3cf3a307fec982ec1bf60313c38a8e29f016ab0380b76d7adb"},
+]
+
+[package.dependencies]
+aiohttp = ">=3.11.11,<4.0.0"
+python-dateutil = ">=2.8.1,<3.0.0"
+typing-extensions = ">=4.12.2,<5.0.0"
+websockets = ">=11,<14"
+
+[[package]]
+name = "six"
+version = "1.17.0"
+description = "Python 2 and 3 compatibility utilities"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+files = [
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
+]
+
[[package]]
name = "sniffio"
version = "1.3.1"
@@ -614,6 +1257,71 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""
[package.extras]
full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"]
+[[package]]
+name = "storage3"
+version = "0.11.0"
+description = "Supabase Storage client for Python."
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "storage3-0.11.0-py3-none-any.whl", hash = "sha256:de2d8f9c9103ca91a9a9d0d69d80b07a3ab6f647b93e023e6a1a97d3607b9728"},
+ {file = "storage3-0.11.0.tar.gz", hash = "sha256:243583f2180686c0f0a19e6117d8a9796fd60c0ca72ec567d62b75a5af0d57a1"},
+]
+
+[package.dependencies]
+httpx = {version = ">=0.26,<0.29", extras = ["http2"]}
+python-dateutil = ">=2.8.2,<3.0.0"
+
+[[package]]
+name = "strenum"
+version = "0.4.15"
+description = "An Enum that inherits from str."
+optional = false
+python-versions = "*"
+files = [
+ {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"},
+ {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"},
+]
+
+[package.extras]
+docs = ["myst-parser[linkify]", "sphinx", "sphinx-rtd-theme"]
+release = ["twine"]
+test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"]
+
+[[package]]
+name = "supabase"
+version = "2.11.0"
+description = "Supabase client for Python."
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "supabase-2.11.0-py3-none-any.whl", hash = "sha256:67a0da498895f4cd6554935e2854b4c41f87b297b78fb9c9414902a382041406"},
+ {file = "supabase-2.11.0.tar.gz", hash = "sha256:2a906f7909fd9a50f944cd9332ce66c684e2d37c0864284d34c5815e6c63cc01"},
+]
+
+[package.dependencies]
+gotrue = ">=2.11.0,<3.0.0"
+httpx = ">=0.26,<0.29"
+postgrest = ">=0.19,<0.20"
+realtime = ">=2.0.0,<3.0.0"
+storage3 = ">=0.10,<0.12"
+supafunc = ">=0.9,<0.10"
+
+[[package]]
+name = "supafunc"
+version = "0.9.0"
+description = "Library for Supabase Functions"
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "supafunc-0.9.0-py3-none-any.whl", hash = "sha256:2aa3ab4d125c1843c28f1b437db2442ea68448f2654b6b78196dbe077197c52a"},
+ {file = "supafunc-0.9.0.tar.gz", hash = "sha256:64cdf331f5a3f2afc7c181697d4723efc084620ea66611f3211dd5ecbef595c1"},
+]
+
+[package.dependencies]
+httpx = {version = ">=0.26,<0.28", extras = ["http2"]}
+strenum = ">=0.4.15,<0.5.0"
+
[[package]]
name = "termcolor"
version = "2.5.0"
@@ -680,7 +1388,198 @@ files = [
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
]
+[[package]]
+name = "websockets"
+version = "13.1"
+description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"},
+ {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"},
+ {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"},
+ {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"},
+ {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"},
+ {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"},
+ {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"},
+ {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"},
+ {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"},
+ {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"},
+ {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"},
+ {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"},
+ {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"},
+ {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"},
+ {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"},
+ {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"},
+ {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"},
+ {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"},
+ {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"},
+ {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"},
+ {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"},
+ {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"},
+ {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"},
+ {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"},
+ {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"},
+ {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"},
+ {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"},
+ {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"},
+ {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"},
+ {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"},
+ {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"},
+ {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"},
+ {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"},
+ {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"},
+ {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"},
+ {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"},
+ {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"},
+ {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"},
+ {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"},
+ {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"},
+ {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"},
+ {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"},
+ {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"},
+ {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"},
+ {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"},
+ {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"},
+ {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"},
+ {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"},
+ {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"},
+ {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"},
+ {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"},
+ {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"},
+ {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"},
+ {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"},
+ {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"},
+ {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"},
+ {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"},
+ {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"},
+ {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"},
+ {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"},
+ {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"},
+ {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"},
+ {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"},
+ {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"},
+ {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"},
+ {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"},
+ {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"},
+ {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"},
+ {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"},
+ {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"},
+ {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"},
+ {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"},
+ {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"},
+ {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"},
+ {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"},
+ {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"},
+ {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"},
+ {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"},
+ {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"},
+ {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"},
+ {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"},
+ {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"},
+ {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"},
+ {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"},
+ {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"},
+ {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"},
+]
+
+[[package]]
+name = "yarl"
+version = "1.18.3"
+description = "Yet another URL library"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"},
+ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"},
+ {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"},
+ {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"},
+ {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"},
+ {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"},
+ {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"},
+ {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"},
+ {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"},
+ {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"},
+ {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"},
+ {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"},
+ {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"},
+ {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"},
+ {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"},
+ {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"},
+ {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"},
+ {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"},
+ {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"},
+ {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"},
+ {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"},
+ {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"},
+ {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"},
+ {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"},
+ {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"},
+ {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"},
+ {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"},
+]
+
+[package.dependencies]
+idna = ">=2.0"
+multidict = ">=4.0"
+propcache = ">=0.2.0"
+
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.13"
-content-hash = "ab778ee378026c62ee40ff13efcb98ceb863c5e45adcd533d582e4cb67a56cb4"
+content-hash = "e4ac4adbc6c1a7e8f028aafcf8774b74d43f2e48f81fef10c3208a051fe009c8"
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index 7098030de..2b1376201 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -23,6 +23,7 @@ readme = 'README.md'
[tool.poetry.dependencies]
python = ">=3.9,<3.13"
fastapi = "^0.115.6"
+ supabase = "^2.11.0"
[tool.poetry.group.dev.dependencies]
autopep8 = "2.3.1"
From 77f7cde26e7decc835454a4065aa7eb498908af2 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 17:49:07 -0500
Subject: [PATCH 04/28] feat(pydiscordsh): added basic cors
---
apps/kbve.com/src/content/docs/gaming/wow.mdx | 54 +++++++++++++++++++
apps/kbve.com/src/content/journal/01-07.mdx | 16 +++++-
apps/pydiscordsh/main.py | 7 +++
apps/pydiscordsh/poetry.lock | 35 +++++++++++-
apps/pydiscordsh/pydiscordsh/api/__init__.py | 1 +
apps/pydiscordsh/pydiscordsh/api/cors.py | 37 +++++++++++++
apps/pydiscordsh/pyproject.toml | 1 +
7 files changed, 149 insertions(+), 2 deletions(-)
create mode 100644 apps/kbve.com/src/content/docs/gaming/wow.mdx
create mode 100644 apps/pydiscordsh/pydiscordsh/api/__init__.py
create mode 100644 apps/pydiscordsh/pydiscordsh/api/cors.py
diff --git a/apps/kbve.com/src/content/docs/gaming/wow.mdx b/apps/kbve.com/src/content/docs/gaming/wow.mdx
new file mode 100644
index 000000000..2a7663068
--- /dev/null
+++ b/apps/kbve.com/src/content/docs/gaming/wow.mdx
@@ -0,0 +1,54 @@
+---
+title: World of Warcraft
+description: |
+ An all in one future guide for World of Warcraft, including some amazing macros
+sidebar:
+ label: World of Warcraft
+ order: 5500
+unsplash: 1581276879432-15e50529f34b
+img: https://images.unsplash.com/photo-1581276879432-15e50529f34b?fit=crop&w=1400&h=700&q=75
+tags:
+ - gaming
+ - strategy
+ - mmorpg
+---
+
+import {
+ Aside,
+ Steps,
+ Card,
+ CardGrid,
+ Code,
+ FileTree,
+} from '@astrojs/starlight/components';
+
+import { Giscus, Adsense } from '@kbve/astropad';
+
+## World of Warcraft
+
+This is still a proof of concept guide and needs to be worked on.
+
+
+
+However for the time being, I am going to start the document and then reference it back when I get more information.
+
+
+
+### Macros
+
+This is a quick breakdown of all the macros that we will be using, I am currently playing between a warrior and a warlock but I will try to keep them noted here for future reference.
+
+#### Warrior
+
+##### Charge,Rend,Throw
+
+This is a quick macro to cast `Charge` in non-combat, then Rend if in combat and finally a quick throw without a modshift.
+
+```
+/cast [nocombat] Charge; Rend
+/cast Throw
+```
+
+This macro still needs to be worked on.
+
+
diff --git a/apps/kbve.com/src/content/journal/01-07.mdx b/apps/kbve.com/src/content/journal/01-07.mdx
index 743629fd9..6a0001fec 100644
--- a/apps/kbve.com/src/content/journal/01-07.mdx
+++ b/apps/kbve.com/src/content/journal/01-07.mdx
@@ -14,7 +14,21 @@ tags:
Lucky 7 of the first.
-### 2024
+## 2025
+
+- 03:00PM
+
+ **SPY**
+
+ Damn I am still bag holding a bunch of spy, hopefully I can offload them before the end of this month.
+
+ **Python**
+
+ The best way to handle the supabase jwts, hmm.
+ One idea would be to just pass the JWT secret over and use that to validate the information.
+
+
+## 2024
- 12:38am - There are a couple library names that I wanted to use for the `egui` and `wasm` build, but I think I might go with `wasm-bosm`.
I am also thinking maybe there might be a play on words that I could use?
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index e69de29bb..f744e7e12 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -0,0 +1,7 @@
+from fastapi import FastAPI, WebSocket
+from pydiscordsh import Routes, CORS
+from contextlib import asynccontextmanager
+
+import logging
+
+logger = logging.getLogger("uvicorn")
\ No newline at end of file
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index e9426a0cc..9a7b9118c 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -212,6 +212,20 @@ files = [
{file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
]
+[[package]]
+name = "click"
+version = "8.1.8"
+description = "Composable command line interface toolkit"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
+ {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -1388,6 +1402,25 @@ files = [
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
]
+[[package]]
+name = "uvicorn"
+version = "0.34.0"
+description = "The lightning-fast ASGI server."
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"},
+ {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"},
+]
+
+[package.dependencies]
+click = ">=7.0"
+h11 = ">=0.8"
+typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
+
+[package.extras]
+standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
+
[[package]]
name = "websockets"
version = "13.1"
@@ -1582,4 +1615,4 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.13"
-content-hash = "e4ac4adbc6c1a7e8f028aafcf8774b74d43f2e48f81fef10c3208a051fe009c8"
+content-hash = "41d8e441531c178b783900c4862027fccb81d937c5f66fb3702bbc8536902fb4"
diff --git a/apps/pydiscordsh/pydiscordsh/api/__init__.py b/apps/pydiscordsh/pydiscordsh/api/__init__.py
new file mode 100644
index 000000000..f5546c355
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/api/__init__.py
@@ -0,0 +1 @@
+from .cors import CORS
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/cors.py b/apps/pydiscordsh/pydiscordsh/api/cors.py
new file mode 100644
index 000000000..1e792b7ac
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/api/cors.py
@@ -0,0 +1,37 @@
+from fastapi import FastAPI
+from fastapi.middleware.cors import CORSMiddleware
+from typing import List
+
+class CORS:
+ def __init__(
+ self,
+ app: FastAPI,
+ origins: List[str] = [
+ "http://localhost:8086",
+ "http://localhost:4321",
+ "http://localhost:1337",
+ "http://localhost",
+ "http://localhost:8080",
+ "https://discord.sh",
+ "https://supabase.kbve.com",
+ "https://kbve.com",
+ ],
+ allow_credentials: bool = True,
+ allow_methods: List[str] = ["*"],
+ allow_headers: List[str] = ["*"],
+ ):
+ self.app = app
+ self.origins = origins
+ self.allow_credentials = allow_credentials
+ self.allow_methods = allow_methods
+ self.allow_headers = allow_headers
+ self.add_cors_middleware()
+
+ def add_cors_middleware(self):
+ self.app.add_middleware(
+ CORSMiddleware,
+ allow_origins=self.origins,
+ allow_credentials=self.allow_credentials,
+ allow_methods=self.allow_methods,
+ allow_headers=self.allow_headers,
+ )
\ No newline at end of file
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index 2b1376201..71e247adc 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -24,6 +24,7 @@ readme = 'README.md'
python = ">=3.9,<3.13"
fastapi = "^0.115.6"
supabase = "^2.11.0"
+ uvicorn = "^0.34.0"
[tool.poetry.group.dev.dependencies]
autopep8 = "2.3.1"
From b58527d445f473ce2a62c1acf935c847a968eb29 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 17:52:28 -0500
Subject: [PATCH 05/28] fix(pydiscordsh): updating the cors to include api url
---
apps/pydiscordsh/Dockerfile | 2 +-
apps/pydiscordsh/pydiscordsh/__init__.py | 2 +-
apps/pydiscordsh/pydiscordsh/api/__init__.py | 3 +-
apps/pydiscordsh/pydiscordsh/api/cors.py | 1 +
apps/pydiscordsh/pydiscordsh/api/routes.py | 51 ++++++++++++++++++++
apps/pydiscordsh/pydiscordsh/hello.py | 6 ---
6 files changed, 56 insertions(+), 9 deletions(-)
create mode 100644 apps/pydiscordsh/pydiscordsh/api/routes.py
delete mode 100644 apps/pydiscordsh/pydiscordsh/hello.py
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index ff2d9be51..89028d955 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -1,5 +1,5 @@
# Base image with Python and Poetry pre-installed
-FROM python:3.11-slim
+FROM python:3.12-slim
# Set environment variables for Poetry and Python
ENV PYTHONUNBUFFERED=1 \
diff --git a/apps/pydiscordsh/pydiscordsh/__init__.py b/apps/pydiscordsh/pydiscordsh/__init__.py
index 66c4c27e1..62004a037 100644
--- a/apps/pydiscordsh/pydiscordsh/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/__init__.py
@@ -1 +1 @@
-"""Automatically generated by Nx."""
+from .api import Routes, CORS
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/__init__.py b/apps/pydiscordsh/pydiscordsh/api/__init__.py
index f5546c355..f842ffbd9 100644
--- a/apps/pydiscordsh/pydiscordsh/api/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/api/__init__.py
@@ -1 +1,2 @@
-from .cors import CORS
\ No newline at end of file
+from .cors import CORS
+from .routes import Routes
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/cors.py b/apps/pydiscordsh/pydiscordsh/api/cors.py
index 1e792b7ac..d048ed527 100644
--- a/apps/pydiscordsh/pydiscordsh/api/cors.py
+++ b/apps/pydiscordsh/pydiscordsh/api/cors.py
@@ -13,6 +13,7 @@ def __init__(
"http://localhost",
"http://localhost:8080",
"https://discord.sh",
+ "https://api.discord.sh",
"https://supabase.kbve.com",
"https://kbve.com",
],
diff --git a/apps/pydiscordsh/pydiscordsh/api/routes.py b/apps/pydiscordsh/pydiscordsh/api/routes.py
new file mode 100644
index 000000000..5e56fec65
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/api/routes.py
@@ -0,0 +1,51 @@
+from fastapi import FastAPI, HTTPException, Request
+from fastapi.responses import HTMLResponse
+from fastapi.templating import Jinja2Templates
+from typing import Type, Callable
+from pydantic import ValidationError
+
+class Routes:
+ def __init__(self, app: FastAPI, templates_dir: str = "templates"):
+ self.app = app
+ self.templates = Jinja2Templates(directory=templates_dir)
+
+ async def parse_json_body(self, request: Request):
+ try:
+ return await request.json()
+ except (ValueError, ValidationError):
+ raise HTTPException(status_code=400, detail="Invalid JSON payload")
+
+ def get_client_method(self, client, method_name: str):
+ method = getattr(client, method_name, None)
+ if not callable(method):
+ raise HTTPException(status_code=500, detail="Method not callable")
+ return method
+
+ def add_route(self, path: str, client_class: Type, method_name: str, methods=["GET"]):
+ async def wrapper(request: Request = None):
+ client = client_class()
+ try:
+ method = self.get_client_method(client, method_name)
+ if request and request.method == "POST":
+ body = await self.parse_json_body(request)
+ result = await method(body)
+ else:
+ result = await method()
+
+ return result if isinstance(result, (dict, list)) else {"data": str(result)}
+ finally:
+ await client.close()
+
+ self.app.add_api_route(path, wrapper, methods=methods)
+
+ def render(self, path: str, template_name: str):
+ async def wrapper(request: Request):
+ return self.templates.TemplateResponse(template_name, {"request": request})
+
+ self.app.add_api_route(path, wrapper, methods=["GET"])
+
+ def get(self, path: str, client_class: Type, method_name: str):
+ self.add_route(path, client_class, method_name, methods=["GET"])
+
+ def post(self, path: str, client_class: Type, method_name: str):
+ self.add_route(path, client_class, method_name, methods=["POST"])
diff --git a/apps/pydiscordsh/pydiscordsh/hello.py b/apps/pydiscordsh/pydiscordsh/hello.py
deleted file mode 100644
index c8f58abbe..000000000
--- a/apps/pydiscordsh/pydiscordsh/hello.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""Sample Hello World application."""
-
-
-def hello():
- """Return a friendly greeting."""
- return "Hello pydiscordsh"
From fb0a9918431105b28719bb25cac72539965f0eb7 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 18:18:55 -0500
Subject: [PATCH 06/28] fix(pydiscordsh): docker image is now working
---
apps/pydiscordsh/Dockerfile | 5 ++++-
apps/pydiscordsh/main.py | 11 ++++++++---
apps/pydiscordsh/poetry.lock | 2 +-
apps/pydiscordsh/pydiscordsh/__init__.py | 3 ++-
apps/pydiscordsh/pydiscordsh/apps/__init__.py | 1 +
apps/pydiscordsh/pydiscordsh/apps/turso.py | 16 ++++++++++++++++
apps/pydiscordsh/pyproject.toml | 1 +
7 files changed, 33 insertions(+), 6 deletions(-)
create mode 100644 apps/pydiscordsh/pydiscordsh/apps/__init__.py
create mode 100644 apps/pydiscordsh/pydiscordsh/apps/turso.py
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index 89028d955..819581103 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -33,5 +33,8 @@ COPY . .
# Install the project itself (if it's structured as a package)
RUN poetry install --no-dev
+# Expose Port
+EXPOSE 3000
+
# Set the default command to run the application
-CMD ["poetry", "run", "python", "-m", "pydiscordsh"]
+CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index f744e7e12..bdc1ff2b7 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -1,7 +1,12 @@
from fastapi import FastAPI, WebSocket
-from pydiscordsh import Routes, CORS
-from contextlib import asynccontextmanager
+from pydiscordsh import Routes, CORS, TursoDatabase
import logging
-logger = logging.getLogger("uvicorn")
\ No newline at end of file
+logger = logging.getLogger("uvicorn")
+
+app = FastAPI()
+routes = Routes(app, templates_dir="templates")
+CORS(app)
+
+routes.get("/", TursoDatabase, "start_client")
\ No newline at end of file
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index 9a7b9118c..2796b0c88 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -1615,4 +1615,4 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.13"
-content-hash = "41d8e441531c178b783900c4862027fccb81d937c5f66fb3702bbc8536902fb4"
+content-hash = "1aa5006dfbd14f4c2df32b9669fd55bd9f6ea955a1bd2cf869ba3acb65ab561c"
diff --git a/apps/pydiscordsh/pydiscordsh/__init__.py b/apps/pydiscordsh/pydiscordsh/__init__.py
index 62004a037..135b6688f 100644
--- a/apps/pydiscordsh/pydiscordsh/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/__init__.py
@@ -1 +1,2 @@
-from .api import Routes, CORS
\ No newline at end of file
+from .api import Routes, CORS
+from .apps import TursoDatabase
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/apps/__init__.py b/apps/pydiscordsh/pydiscordsh/apps/__init__.py
new file mode 100644
index 000000000..7dc8b0453
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/apps/__init__.py
@@ -0,0 +1 @@
+from .turso import TursoDatabase
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/apps/turso.py b/apps/pydiscordsh/pydiscordsh/apps/turso.py
new file mode 100644
index 000000000..5bb3e22ba
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/apps/turso.py
@@ -0,0 +1,16 @@
+import logging
+logger = logging.getLogger("uvicorn")
+
+class TursoDatabase:
+ async def start_client(self):
+ return {"status": 200, "message": "Client started successfully."}
+
+ async def stop_client(self):
+ return {"status": 200, "message": "Client stopped successfully."}
+
+ async def status_client(self):
+ return {"status": 200, "message": "Client is running."}
+
+ async def close(self):
+ logger.info("Closing the database connection.")
+ return {"status": 200, "message": "Database connection closed."}
\ No newline at end of file
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index 71e247adc..08c72fa8d 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -25,6 +25,7 @@ readme = 'README.md'
fastapi = "^0.115.6"
supabase = "^2.11.0"
uvicorn = "^0.34.0"
+ jinja2 = "^3.1.5"
[tool.poetry.group.dev.dependencies]
autopep8 = "2.3.1"
From 4469e44897fc3f9744e27a46dad3233acfde4326 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 18:32:29 -0500
Subject: [PATCH 07/28] fix(pydiscordsh): smaller docker file
---
apps/pydiscordsh/.dockerignore | 8 +++++++
apps/pydiscordsh/Dockerfile | 40 +++++++++++++++++++++-------------
2 files changed, 33 insertions(+), 15 deletions(-)
create mode 100644 apps/pydiscordsh/.dockerignore
diff --git a/apps/pydiscordsh/.dockerignore b/apps/pydiscordsh/.dockerignore
new file mode 100644
index 000000000..44419589b
--- /dev/null
+++ b/apps/pydiscordsh/.dockerignore
@@ -0,0 +1,8 @@
+__pycache__/
+*.pyc
+*.pyo
+*.pyd
+*.log
+.git
+node_modules
+tests
\ No newline at end of file
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index 819581103..bd3eb458b 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -1,5 +1,5 @@
-# Base image with Python and Poetry pre-installed
-FROM python:3.12-slim
+# Stage 1: Builder
+FROM python:3.12-slim as builder
# Set environment variables for Poetry and Python
ENV PYTHONUNBUFFERED=1 \
@@ -11,30 +11,40 @@ ENV PYTHONUNBUFFERED=1 \
# Install system dependencies and Poetry
RUN apt-get update && apt-get install -y --no-install-recommends \
- curl \
- git \
+ curl git \
&& curl -sSL https://install.python-poetry.org | python3 - \
&& ln -s /opt/poetry/bin/poetry /usr/local/bin/poetry \
- && apt-get clean \
- && rm -rf /var/lib/apt/lists/*
+ && apt-get clean && rm -rf /var/lib/apt/lists/*
-# Set working directory
WORKDIR /app
-# Copy only the relevant files for dependency installation first
+# Copy and install dependencies
COPY pyproject.toml poetry.lock ./
-
-# Install dependencies with Poetry (including project dependencies)
RUN poetry install --no-root --only main
-# Copy the rest of the app code
+# Stage 2: Final lightweight image
+FROM python:3.12-slim
+
+# Set the same environment variables for consistency
+ENV PYTHONUNBUFFERED=1 \
+ PIP_NO_CACHE_DIR=1 \
+ POETRY_VERSION=1.8.2 \
+ POETRY_HOME="/opt/poetry" \
+ POETRY_VIRTUALENVS_IN_PROJECT=true \
+ POETRY_NO_INTERACTION=1
+
+# Copy Poetry from the builder stage
+COPY --from=builder /opt/poetry /opt/poetry
+COPY --from=builder /usr/local/bin/poetry /usr/local/bin/poetry
+
+WORKDIR /app
+# Copy the installed dependencies and the rest of the app
+COPY --from=builder /app /app
COPY . .
-# Install the project itself (if it's structured as a package)
+# Install the app without dev dependencies
RUN poetry install --no-dev
-# Expose Port
+# Expose the port and run the server
EXPOSE 3000
-
-# Set the default command to run the application
CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
From 7a94f361b1808098eb258784aeed2267b941bbf6 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 19:38:32 -0500
Subject: [PATCH 08/28] fix(pydiscordsh): updated the dockerfile to be a bit
smaller
---
apps/pydiscordsh/Dockerfile | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index bd3eb458b..69019d759 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -1,7 +1,7 @@
# Stage 1: Builder
FROM python:3.12-slim as builder
-# Set environment variables for Poetry and Python
+# Set environment variables for Python and Poetry
ENV PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
POETRY_VERSION=1.8.2 \
@@ -18,33 +18,27 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
WORKDIR /app
-# Copy and install dependencies
+# Copy and install dependencies using Poetry
COPY pyproject.toml poetry.lock ./
-RUN poetry install --no-root --only main
+RUN poetry export -f requirements.txt --without-hashes --output requirements.txt \
+ && poetry install --no-root --only main
-# Stage 2: Final lightweight image
+# Stage 2: Final lightweight image using pip
FROM python:3.12-slim
-# Set the same environment variables for consistency
+# Set environment variables for Python
ENV PYTHONUNBUFFERED=1 \
- PIP_NO_CACHE_DIR=1 \
- POETRY_VERSION=1.8.2 \
- POETRY_HOME="/opt/poetry" \
- POETRY_VIRTUALENVS_IN_PROJECT=true \
- POETRY_NO_INTERACTION=1
-
-# Copy Poetry from the builder stage
-COPY --from=builder /opt/poetry /opt/poetry
-COPY --from=builder /usr/local/bin/poetry /usr/local/bin/poetry
+ PIP_NO_CACHE_DIR=1
WORKDIR /app
-# Copy the installed dependencies and the rest of the app
-COPY --from=builder /app /app
-COPY . .
-# Install the app without dev dependencies
-RUN poetry install --no-dev
+# Copy the exported requirements and use pip instead of Poetry
+COPY --from=builder /app/requirements.txt requirements.txt
+RUN pip install --no-cache-dir -r requirements.txt
+
+# Copy the application source code
+COPY . .
-# Expose the port and run the server
+# Expose the port and run the server using Python directly
EXPOSE 3000
-CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
+CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
From 9dc5ddac5d24a633390c888cee5994e3233a549d Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 19:46:55 -0500
Subject: [PATCH 09/28] fix(pydiscordsh): alpine test case
---
apps/pydiscordsh/Dockerfile | 36 +++++++++++++++++++++++-------------
1 file changed, 23 insertions(+), 13 deletions(-)
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index 69019d759..c395b39eb 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -1,7 +1,6 @@
# Stage 1: Builder
FROM python:3.12-slim as builder
-# Set environment variables for Python and Poetry
ENV PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
POETRY_VERSION=1.8.2 \
@@ -9,7 +8,6 @@ ENV PYTHONUNBUFFERED=1 \
POETRY_VIRTUALENVS_IN_PROJECT=true \
POETRY_NO_INTERACTION=1
-# Install system dependencies and Poetry
RUN apt-get update && apt-get install -y --no-install-recommends \
curl git \
&& curl -sSL https://install.python-poetry.org | python3 - \
@@ -18,27 +16,39 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
WORKDIR /app
-# Copy and install dependencies using Poetry
-COPY pyproject.toml poetry.lock ./
+# Copy the entire source code, not just the lock files
+COPY . .
+
+# Export dependencies and compile bytecode
RUN poetry export -f requirements.txt --without-hashes --output requirements.txt \
- && poetry install --no-root --only main
+ && poetry install --no-root --only main \
+ && python -m compileall -b .
+
+# Stage 2: Bytecode Extractor
+FROM python:3.12-slim as bytecode-extractor
-# Stage 2: Final lightweight image using pip
-FROM python:3.12-slim
+WORKDIR /app
+# Copy the entire app including the compiled bytecode
+COPY --from=builder /app /app
+
+# Stage 3: Final Lightweight Image
+FROM python:3.12-alpine
-# Set environment variables for Python
ENV PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
-# Copy the exported requirements and use pip instead of Poetry
-COPY --from=builder /app/requirements.txt requirements.txt
+# Copy everything from the bytecode-extractor stage
+COPY --from=bytecode-extractor /app/requirements.txt requirements.txt
+COPY --from=bytecode-extractor /app .
+
+# Install dependencies using pip
RUN pip install --no-cache-dir -r requirements.txt
-# Copy the application source code
-COPY . .
+# Confirm the presence of the `main.py` file
+RUN ls -la /app/main.py
-# Expose the port and run the server using Python directly
+# Expose the port and run the server using the ASGI app
EXPOSE 3000
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
From e862276cc10dfd415a161a6cee3ebc4c2e19ec8f Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 20:44:18 -0500
Subject: [PATCH 10/28] fix(pydiscordsh): down to 100mb for now
---
apps/pydiscordsh/Dockerfile | 63 ++++++++++++++++++++-------------
apps/pydiscordsh/poetry.lock | 4 +--
apps/pydiscordsh/pyproject.toml | 2 +-
3 files changed, 41 insertions(+), 28 deletions(-)
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index c395b39eb..3673d5dc0 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -1,6 +1,7 @@
# Stage 1: Builder
-FROM python:3.12-slim as builder
+FROM python:3.12-slim AS stage1
+# Set environment variables for Python and Poetry
ENV PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
POETRY_VERSION=1.8.2 \
@@ -8,6 +9,7 @@ ENV PYTHONUNBUFFERED=1 \
POETRY_VIRTUALENVS_IN_PROJECT=true \
POETRY_NO_INTERACTION=1
+# Install system dependencies and Poetry
RUN apt-get update && apt-get install -y --no-install-recommends \
curl git \
&& curl -sSL https://install.python-poetry.org | python3 - \
@@ -16,39 +18,50 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
WORKDIR /app
-# Copy the entire source code, not just the lock files
-COPY . .
-
-# Export dependencies and compile bytecode
+# Copy and install dependencies using Poetry
+COPY pyproject.toml poetry.lock ./
RUN poetry export -f requirements.txt --without-hashes --output requirements.txt \
- && poetry install --no-root --only main \
- && python -m compileall -b .
-
-# Stage 2: Bytecode Extractor
-FROM python:3.12-slim as bytecode-extractor
-
-WORKDIR /app
-# Copy the entire app including the compiled bytecode
-COPY --from=builder /app /app
+ && poetry install --no-root --only main
-# Stage 3: Final Lightweight Image
-FROM python:3.12-alpine
+# Stage 2: Final lightweight image using pip
+FROM python:3.12-slim AS stage2
+# Set environment variables for Python
ENV PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
-# Copy everything from the bytecode-extractor stage
-COPY --from=bytecode-extractor /app/requirements.txt requirements.txt
-COPY --from=bytecode-extractor /app .
-
-# Install dependencies using pip
+# Copy the exported requirements and use pip instead of Poetry
+COPY --from=stage1 /app/requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
-# Confirm the presence of the `main.py` file
-RUN ls -la /app/main.py
+# Copy the application source code
+COPY ./pydiscordsh pydiscordsh
+COPY ./main.py main.py
+
+# Expose the port and run the server using Python directly
+#EXPOSE 3000
+#CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
+
+# Stage 3: Final production-ready Ubuntu base image
+# FROM ubuntu/python:3.12-24.04_stable AS stage3
+FROM al3xos/python-distroless:3.12-debian12 AS stage3
+
+# # Set environment variables
+# ENV PYTHONUNBUFFERED=1 \
+# PIP_NO_CACHE_DIR=1
+
+WORKDIR /app
+
+# # Copy the application and Python dependencies from stage2
+ENV PYTHONPATH=/usr/local/lib/python3.12/site-packages
+COPY --from=stage2 /app/pydiscordsh pydiscordsh
+COPY --from=stage2 /app/main.py main.py
+COPY --from=stage2 /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
+COPY --from=stage2 /usr/local/bin /usr/local/bin
+
-# Expose the port and run the server using the ASGI app
+# # Optional: Expose the port and run the server
EXPOSE 3000
-CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
+ENTRYPOINT ["python3", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000", "--ws-ping-interval", "25", "--ws-ping-timeout", "5"]
\ No newline at end of file
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index 2796b0c88..901c88e47 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -1614,5 +1614,5 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
-python-versions = ">=3.9,<3.13"
-content-hash = "1aa5006dfbd14f4c2df32b9669fd55bd9f6ea955a1bd2cf869ba3acb65ab561c"
+python-versions = ">=3.9,<3.14"
+content-hash = "b4313e9fb0224d47be4114e5684c4fea9d6e9cc26a87a2908a8f96549cfb8afa"
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index 08c72fa8d..dafd7ad59 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -21,7 +21,7 @@ readme = 'README.md'
include = "pydiscordsh"
[tool.poetry.dependencies]
- python = ">=3.9,<3.13"
+ python = ">=3.9,<3.14"
fastapi = "^0.115.6"
supabase = "^2.11.0"
uvicorn = "^0.34.0"
From 3ad678ea5666bc7cdd5c92e476c2f139c8cfb1c1 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 21:05:04 -0500
Subject: [PATCH 11/28] chore(pydiscordsh): updating the docker ignore
---
apps/pydiscordsh/.dockerignore | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/apps/pydiscordsh/.dockerignore b/apps/pydiscordsh/.dockerignore
index 44419589b..abbdd2225 100644
--- a/apps/pydiscordsh/.dockerignore
+++ b/apps/pydiscordsh/.dockerignore
@@ -5,4 +5,5 @@ __pycache__/
*.log
.git
node_modules
-tests
\ No newline at end of file
+tests
+*.env
\ No newline at end of file
From 51d7076dbcf499274cdbcf429d48975ec0167da3 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Tue, 7 Jan 2025 21:05:55 -0500
Subject: [PATCH 12/28] chore(pydiscordsh): addeed the libsql experimental
---
apps/pydiscordsh/poetry.lock | 27 ++++++++++++++++++++++++++-
apps/pydiscordsh/pyproject.toml | 1 +
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index 901c88e47..26ca2ab67 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -631,6 +631,31 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
+[[package]]
+name = "libsql-experimental"
+version = "0.0.41"
+description = ""
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "libsql_experimental-0.0.41-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:07dfdae0ec984ba5ef1cd9808e6418eaf57c0c4e4ba4f1db8baccbc1278d2f77"},
+ {file = "libsql_experimental-0.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01a3f61eccd2bfa29d0c9a6f12294f21c974a9853536831bb06f7e3c7fd7899b"},
+ {file = "libsql_experimental-0.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9faf5a6b34f128a34d6a3d4b6c58d76b3f171ec6824957872c70d0c459ee3de2"},
+ {file = "libsql_experimental-0.0.41-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ff5c484e7ec66b46590f2674be0ad1e5c797b3a363afa763beb83edc6dc4e77d"},
+ {file = "libsql_experimental-0.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7654734d1641c224df4bb62924153eade65fb25ef2132060478574e8a4755497"},
+ {file = "libsql_experimental-0.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbb2afb1c53b41b40d064531f5da6224b2dd363e5e2126e4560ad5c537db7fce"},
+ {file = "libsql_experimental-0.0.41-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3d8e316d2975d9c7b104b041d777b69eb241c11d32c443225b4f8f3c752e8b31"},
+ {file = "libsql_experimental-0.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0acb263526c353061bf8e12ff66ae78d6cc4ab59603acd3d313df7e431a05c82"},
+ {file = "libsql_experimental-0.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af8df4474b4f95d662ca97b0b5f604a9acdc0e05fe92f2e26a33c34ca72a9557"},
+ {file = "libsql_experimental-0.0.41-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e85123063f53bdd9c1a7750c41dd1d13dd7d756492645a1e170ccd13e39c87"},
+ {file = "libsql_experimental-0.0.41-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d41e3d6ba80af37418cc98c55ea2102dd6c922170fe5b3fe74b682c118444b9"},
+ {file = "libsql_experimental-0.0.41-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0be5c063dffc40ff78fd32f6ec13df9a7472e80bfb971a2bbdf7ef8605a248"},
+ {file = "libsql_experimental-0.0.41-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6bae8fc18cf5e20e338f4f79cdab0774f7f7c076be5d78d4d46d85cf97083c5"},
+ {file = "libsql_experimental-0.0.41-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee76d2d442f1f31aa7526aa0f1eaee7e057203bb8260522d7f15b257bcb4f398"},
+ {file = "libsql_experimental-0.0.41-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94d3c461e053fcd1a3cc2d2a3f7bdd2c345f773324c5345c53e7076f68158999"},
+ {file = "libsql_experimental-0.0.41.tar.gz", hash = "sha256:d72e3da6c2488fd6e4410ae74a5339886b8b54a62c71e63f72d05e27d9fb3288"},
+]
+
[[package]]
name = "markupsafe"
version = "3.0.2"
@@ -1615,4 +1640,4 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.14"
-content-hash = "b4313e9fb0224d47be4114e5684c4fea9d6e9cc26a87a2908a8f96549cfb8afa"
+content-hash = "dfd2a0dcc6840fed3f685d9e82565c920df2f192965ade56a89f8b4478440fde"
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index dafd7ad59..0d8a5f149 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -26,6 +26,7 @@ readme = 'README.md'
supabase = "^2.11.0"
uvicorn = "^0.34.0"
jinja2 = "^3.1.5"
+ libsql-experimental = "^0.0.41"
[tool.poetry.group.dev.dependencies]
autopep8 = "2.3.1"
From 5b19c11e731883b06cc218cbbad35b51a4c806b5 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 00:31:57 -0500
Subject: [PATCH 13/28] fix(pydiscordsh): turso basic db connection added
---
apps/pydiscordsh/main.py | 14 +++++-
apps/pydiscordsh/project.json | 16 +++++++
apps/pydiscordsh/pydiscordsh/apps/turso.py | 54 +++++++++++++++++++---
3 files changed, 77 insertions(+), 7 deletions(-)
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index bdc1ff2b7..4f6d4f171 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -9,4 +9,16 @@
routes = Routes(app, templates_dir="templates")
CORS(app)
-routes.get("/", TursoDatabase, "start_client")
\ No newline at end of file
+database = TursoDatabase()
+
+@app.get("/v1/db/start_client")
+async def start_client():
+ return await database.start_client()
+
+@app.get("/v1/db/stop_client")
+async def stop_client():
+ return await database.stop_client()
+
+@app.get("/v1/db/status_client")
+async def status_client():
+ return await database.status_client()
\ No newline at end of file
diff --git a/apps/pydiscordsh/project.json b/apps/pydiscordsh/project.json
index 7d92d0018..7e1f8740a 100644
--- a/apps/pydiscordsh/project.json
+++ b/apps/pydiscordsh/project.json
@@ -94,6 +94,22 @@
}
}
}
+ },
+ "orb": {
+ "executor": "nx:run-commands",
+ "options": {
+ "commands": [
+ {
+ "command": "pnpm nx container pydiscordsh",
+ "forwardAllArgs": false
+ },
+ {
+ "command": "docker run --env-file .env -p 3000:3000 kbve/pydiscordsh:1.42",
+ "forwardAllArgs": false
+ }
+ ],
+ "parallel": false
+ }
}
},
"tags": [],
diff --git a/apps/pydiscordsh/pydiscordsh/apps/turso.py b/apps/pydiscordsh/pydiscordsh/apps/turso.py
index 5bb3e22ba..3f034753c 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/turso.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/turso.py
@@ -1,16 +1,58 @@
import logging
+import os
+import libsql_experimental as libsql
+
logger = logging.getLogger("uvicorn")
class TursoDatabase:
- async def start_client(self):
- return {"status": 200, "message": "Client started successfully."}
+ def __init__(self):
+ self.conn = None
+
+ async def start_client(self):
+ try:
+ # Read environment variables for database connection
+ url = os.getenv("TURSO_DATABASE_URL")
+ auth_token = os.getenv("TURSO_AUTH_TOKEN")
+
+ if not url or not auth_token:
+ raise ValueError("TURSO_DATABASE_URL or TURSO_AUTH_TOKEN is not set in environment variables.")
+
+ # Initialize the database connection
+ self.conn = libsql.connect("hello.db", sync_url=url, auth_token=auth_token)
+ self.conn.sync()
+ logger.info("Database client started.")
+ return {"status": 200, "message": "Client started successfully."}
+ except Exception as e:
+ logger.error(f"Error starting client: {e}")
+ return {"status": 500, "message": f"Error starting client: {e}"}
+
async def stop_client(self):
- return {"status": 200, "message": "Client stopped successfully."}
+ try:
+ if self.conn:
+ self.conn = None
+ logger.info("Database client stopped.")
+ return {"status": 200, "message": "Client stopped successfully."}
+ else:
+ return {"status": 400, "message": "No active client to stop."}
+ except Exception as e:
+ logger.error(f"Error stopping client: {e}")
+ return {"status": 500, "message": f"Error stopping client: {e}"}
async def status_client(self):
- return {"status": 200, "message": "Client is running."}
+ if self.conn:
+ return {"status": 200, "message": "Client is running."}
+ else:
+ return {"status": 400, "message": "Client is not running."}
async def close(self):
- logger.info("Closing the database connection.")
- return {"status": 200, "message": "Database connection closed."}
\ No newline at end of file
+ try:
+ if self.conn:
+ self.conn = None
+ logger.info("Closing the database connection.")
+ return {"status": 200, "message": "Database connection closed."}
+ else:
+ return {"status": 400, "message": "No active connection to close."}
+ except Exception as e:
+ logger.error(f"Error closing the database connection: {e}")
+ return {"status": 500, "message": f"Error closing the database connection: {e}"}
\ No newline at end of file
From 18a903dee3ca54dcf2c142560a82fa856b2bdb3b Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 00:43:36 -0500
Subject: [PATCH 14/28] refactor(pydiscordsh): moved the initialized connection
into its own function within the class.
---
apps/pydiscordsh/pydiscordsh/apps/turso.py | 23 ++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/apps/pydiscordsh/pydiscordsh/apps/turso.py b/apps/pydiscordsh/pydiscordsh/apps/turso.py
index 3f034753c..e8dd9ddc9 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/turso.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/turso.py
@@ -8,19 +8,22 @@ class TursoDatabase:
def __init__(self):
self.conn = None
+ def initialize_connection(self):
+ """Initialize the database connection."""
+ url = os.getenv("TURSO_DATABASE_URL")
+ auth_token = os.getenv("TURSO_AUTH_TOKEN")
+
+ if not url or not auth_token:
+ raise ValueError("TURSO_DATABASE_URL or TURSO_AUTH_TOKEN is not set in environment variables.")
+
+ # Initialize the database connection
+ self.conn = libsql.connect("hello.db", sync_url=url, auth_token=auth_token)
+ self.conn.sync()
+ logger.info("Database connection initialized.")
async def start_client(self):
try:
- # Read environment variables for database connection
- url = os.getenv("TURSO_DATABASE_URL")
- auth_token = os.getenv("TURSO_AUTH_TOKEN")
-
- if not url or not auth_token:
- raise ValueError("TURSO_DATABASE_URL or TURSO_AUTH_TOKEN is not set in environment variables.")
-
- # Initialize the database connection
- self.conn = libsql.connect("hello.db", sync_url=url, auth_token=auth_token)
- self.conn.sync()
+ self.initialize_connection()
logger.info("Database client started.")
return {"status": 200, "message": "Client started successfully."}
except Exception as e:
From 66d1381cd21cf7297cd206fc50bc4d0a46706242 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 00:47:02 -0500
Subject: [PATCH 15/28] fix(pydiscordsh): added back the lifespan of the
database.
---
apps/pydiscordsh/main.py | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index 4f6d4f171..e34f9a834 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -1,16 +1,28 @@
from fastapi import FastAPI, WebSocket
from pydiscordsh import Routes, CORS, TursoDatabase
+from contextlib import asynccontextmanager
import logging
logger = logging.getLogger("uvicorn")
-app = FastAPI()
+
+@asynccontextmanager
+async def lifespan(app: FastAPI):
+ logger.info("[DB]@PENDING")
+ await database.start_client()
+ yield
+ logger.info("[DB]@DISINT")
+ await database.stop_client()
+ logger.info("[DB]@STOPPING")
+
+app = FastAPI(lifespan=lifespan)
routes = Routes(app, templates_dir="templates")
CORS(app)
database = TursoDatabase()
+
@app.get("/v1/db/start_client")
async def start_client():
return await database.start_client()
From 12d10ac5eb582965691368b064b759b7a3102aea Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 01:00:05 -0500
Subject: [PATCH 16/28] feat(pydiscordsh): preparing the schmea file for the
database.
---
apps/pydiscordsh/poetry.lock | 198 +++++++++++++++++++++++++++++++-
apps/pydiscordsh/pyproject.toml | 2 +
2 files changed, 199 insertions(+), 1 deletion(-)
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index 26ca2ab67..bcfbcd3b7 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -494,6 +494,92 @@ files = [
httpx = {version = ">=0.26,<0.29", extras = ["http2"]}
pydantic = ">=1.10,<3"
+[[package]]
+name = "greenlet"
+version = "3.1.1"
+description = "Lightweight in-process concurrent programming"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"},
+ {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"},
+ {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"},
+ {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"},
+ {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"},
+ {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"},
+ {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"},
+ {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"},
+ {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"},
+ {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"},
+ {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"},
+ {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"},
+ {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"},
+ {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"},
+ {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"},
+ {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"},
+ {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"},
+ {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"},
+ {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"},
+ {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"},
+ {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"},
+ {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"},
+ {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"},
+ {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"},
+ {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"},
+ {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"},
+ {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"},
+ {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"},
+ {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"},
+ {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"},
+ {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"},
+ {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"},
+ {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"},
+ {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"},
+ {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"},
+ {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"},
+ {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"},
+ {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"},
+ {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"},
+ {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"},
+ {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"},
+]
+
+[package.extras]
+docs = ["Sphinx", "furo"]
+test = ["objgraph", "psutil"]
+
[[package]]
name = "h11"
version = "0.14.0"
@@ -1278,6 +1364,116 @@ files = [
{file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
]
+[[package]]
+name = "sqlalchemy"
+version = "2.0.36"
+description = "Database Abstraction Library"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"},
+ {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"},
+ {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"},
+ {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"},
+ {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"},
+ {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"},
+ {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"},
+ {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"},
+ {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"},
+ {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"},
+]
+
+[package.dependencies]
+greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
+typing-extensions = ">=4.6.0"
+
+[package.extras]
+aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"]
+aioodbc = ["aioodbc", "greenlet (!=0.4.17)"]
+aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
+asyncio = ["greenlet (!=0.4.17)"]
+asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"]
+mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"]
+mssql = ["pyodbc"]
+mssql-pymssql = ["pymssql"]
+mssql-pyodbc = ["pyodbc"]
+mypy = ["mypy (>=0.910)"]
+mysql = ["mysqlclient (>=1.4.0)"]
+mysql-connector = ["mysql-connector-python"]
+oracle = ["cx_oracle (>=8)"]
+oracle-oracledb = ["oracledb (>=1.0.1)"]
+postgresql = ["psycopg2 (>=2.7)"]
+postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
+postgresql-pg8000 = ["pg8000 (>=1.29.1)"]
+postgresql-psycopg = ["psycopg (>=3.0.7)"]
+postgresql-psycopg2binary = ["psycopg2-binary"]
+postgresql-psycopg2cffi = ["psycopg2cffi"]
+postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
+pymysql = ["pymysql"]
+sqlcipher = ["sqlcipher3_binary"]
+
+[[package]]
+name = "sqlmodel"
+version = "0.0.22"
+description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "sqlmodel-0.0.22-py3-none-any.whl", hash = "sha256:a1ed13e28a1f4057cbf4ff6cdb4fc09e85702621d3259ba17b3c230bfb2f941b"},
+ {file = "sqlmodel-0.0.22.tar.gz", hash = "sha256:7d37c882a30c43464d143e35e9ecaf945d88035e20117bf5ec2834a23cbe505e"},
+]
+
+[package.dependencies]
+pydantic = ">=1.10.13,<3.0.0"
+SQLAlchemy = ">=2.0.14,<2.1.0"
+
[[package]]
name = "starlette"
version = "0.41.3"
@@ -1640,4 +1836,4 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.14"
-content-hash = "dfd2a0dcc6840fed3f685d9e82565c920df2f192965ade56a89f8b4478440fde"
+content-hash = "efc9b5282b47339616311346537efdcca10ea51c4695c640c43e64095ac9f36b"
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index 0d8a5f149..f3cfab5f2 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -27,6 +27,8 @@ readme = 'README.md'
uvicorn = "^0.34.0"
jinja2 = "^3.1.5"
libsql-experimental = "^0.0.41"
+ sqlmodel = "^0.0.22"
+ pydantic = "^2.10.4"
[tool.poetry.group.dev.dependencies]
autopep8 = "2.3.1"
From b77c8451dd2c0a59707a09029843796b23210df6 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 01:39:25 -0500
Subject: [PATCH 17/28] feat(pydiscordsh): writing to the database
---
apps/pydiscordsh/Dockerfile | 5 +-
apps/pydiscordsh/main.py | 14 +-
apps/pydiscordsh/poetry.lock | 430 ++++++++++++++++++-
apps/pydiscordsh/pydiscordsh/__init__.py | 3 +-
apps/pydiscordsh/pydiscordsh/api/__init__.py | 3 +-
apps/pydiscordsh/pydiscordsh/api/schema.py | 44 ++
apps/pydiscordsh/pydiscordsh/apps/turso.py | 5 +
apps/pydiscordsh/pyproject.toml | 1 +
8 files changed, 500 insertions(+), 5 deletions(-)
create mode 100644 apps/pydiscordsh/pydiscordsh/api/schema.py
diff --git a/apps/pydiscordsh/Dockerfile b/apps/pydiscordsh/Dockerfile
index 3673d5dc0..c9886ccec 100644
--- a/apps/pydiscordsh/Dockerfile
+++ b/apps/pydiscordsh/Dockerfile
@@ -11,7 +11,7 @@ ENV PYTHONUNBUFFERED=1 \
# Install system dependencies and Poetry
RUN apt-get update && apt-get install -y --no-install-recommends \
- curl git \
+ curl git libsqlite3-0 \
&& curl -sSL https://install.python-poetry.org | python3 - \
&& ln -s /opt/poetry/bin/poetry /usr/local/bin/poetry \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
@@ -52,6 +52,9 @@ FROM al3xos/python-distroless:3.12-debian12 AS stage3
# ENV PYTHONUNBUFFERED=1 \
# PIP_NO_CACHE_DIR=1
+COPY --from=stage1 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 /usr/lib/libsqlite3.so.0
+
+
WORKDIR /app
# # Copy the application and Python dependencies from stage2
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index e34f9a834..0b9dc0a0a 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -1,5 +1,5 @@
from fastapi import FastAPI, WebSocket
-from pydiscordsh import Routes, CORS, TursoDatabase
+from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero
from contextlib import asynccontextmanager
import logging
@@ -22,6 +22,18 @@ async def lifespan(app: FastAPI):
database = TursoDatabase()
+## Debug
+
+@app.get("/v1/db/setup")
+async def setup_database():
+ try:
+ schema_setup = SetupSchema()
+ schema_setup.create_tables()
+ return {"status": 200, "message": "Database schema setup completed successfully."}
+ except Exception as e:
+ logger.error(f"Error setting up the database: {e}")
+ return {"status": 500, "message": f"Error setting up the database: {e}"}
+
@app.get("/v1/db/start_client")
async def start_client():
diff --git a/apps/pydiscordsh/poetry.lock b/apps/pydiscordsh/poetry.lock
index bcfbcd3b7..d6f18ddb5 100644
--- a/apps/pydiscordsh/poetry.lock
+++ b/apps/pydiscordsh/poetry.lock
@@ -123,6 +123,17 @@ files = [
[package.dependencies]
frozenlist = ">=1.1.0"
+[[package]]
+name = "alabaster"
+version = "0.7.16"
+description = "A light, configurable Sphinx theme"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"},
+ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"},
+]
+
[[package]]
name = "annotated-types"
version = "0.7.0"
@@ -201,6 +212,20 @@ files = [
pycodestyle = ">=2.12.0"
tomli = {version = "*", markers = "python_version < \"3.11\""}
+[[package]]
+name = "babel"
+version = "2.16.0"
+description = "Internationalization utilities"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
+ {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
+]
+
+[package.extras]
+dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
+
[[package]]
name = "certifi"
version = "2024.12.14"
@@ -212,6 +237,107 @@ files = [
{file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
]
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
+ {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
+ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+]
+
[[package]]
name = "click"
version = "8.1.8"
@@ -328,6 +454,17 @@ files = [
[package.dependencies]
packaging = "*"
+[[package]]
+name = "docutils"
+version = "0.21.2"
+description = "Docutils -- Python Documentation Utilities"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"},
+ {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"},
+]
+
[[package]]
name = "exceptiongroup"
version = "1.2.2"
@@ -689,6 +826,40 @@ files = [
[package.extras]
all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+description = "Getting image size from png/jpeg/jpeg2000/gif file"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
+ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
+]
+
+[[package]]
+name = "importlib-metadata"
+version = "8.5.0"
+description = "Read metadata from Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
+ {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
+]
+
+[package.dependencies]
+zipp = ">=3.20"
+
+[package.extras]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
+cover = ["pytest-cov"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+enabler = ["pytest-enabler (>=2.2)"]
+perf = ["ipython"]
+test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
+type = ["pytest-mypy"]
+
[[package]]
name = "iniconfig"
version = "2.0.0"
@@ -717,6 +888,22 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
+[[package]]
+name = "libsql-client"
+version = "0.3.1"
+description = "Python SDK for libSQL"
+optional = false
+python-versions = "<4.0,>=3.7"
+files = [
+ {file = "libsql_client-0.3.1-py3-none-any.whl", hash = "sha256:088756f65802f5ca5857a99cf374d9b7aa015b97b91b0cb725ef6a033e23268b"},
+ {file = "libsql_client-0.3.1.tar.gz", hash = "sha256:1815893bf5271f1940919b2a583ebbafb0ec54028e9d01e4eda151a6e85a8618"},
+]
+
+[package.dependencies]
+aiohttp = ">=3.0,<4.0"
+sphinx-press-theme = ">=0.8.0,<0.9.0"
+typing-extensions = ">=4.5,<5.0"
+
[[package]]
name = "libsql-experimental"
version = "0.0.41"
@@ -1215,6 +1402,20 @@ files = [
{file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"},
]
+[[package]]
+name = "pygments"
+version = "2.19.1"
+description = "Pygments is a syntax highlighting package written in Python."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
+ {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
+]
+
+[package.extras]
+windows-terminal = ["colorama (>=0.4.6)"]
+
[[package]]
name = "pytest"
version = "8.3.4"
@@ -1342,6 +1543,27 @@ python-dateutil = ">=2.8.1,<3.0.0"
typing-extensions = ">=4.12.2,<5.0.0"
websockets = ">=11,<14"
+[[package]]
+name = "requests"
+version = "2.32.3"
+description = "Python HTTP for Humans."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
+ {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
+]
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = ">=2,<4"
+idna = ">=2.5,<4"
+urllib3 = ">=1.21.1,<3"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+
[[package]]
name = "six"
version = "1.17.0"
@@ -1364,6 +1586,161 @@ files = [
{file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
]
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+optional = false
+python-versions = "*"
+files = [
+ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+
+[[package]]
+name = "sphinx"
+version = "7.4.7"
+description = "Python documentation generator"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"},
+ {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"},
+]
+
+[package.dependencies]
+alabaster = ">=0.7.14,<0.8.0"
+babel = ">=2.13"
+colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""}
+docutils = ">=0.20,<0.22"
+imagesize = ">=1.3"
+importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""}
+Jinja2 = ">=3.1"
+packaging = ">=23.0"
+Pygments = ">=2.17"
+requests = ">=2.30.0"
+snowballstemmer = ">=2.2"
+sphinxcontrib-applehelp = "*"
+sphinxcontrib-devhelp = "*"
+sphinxcontrib-htmlhelp = ">=2.0.0"
+sphinxcontrib-jsmath = "*"
+sphinxcontrib-qthelp = "*"
+sphinxcontrib-serializinghtml = ">=1.1.9"
+tomli = {version = ">=2", markers = "python_version < \"3.11\""}
+
+[package.extras]
+docs = ["sphinxcontrib-websupport"]
+lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"]
+test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"]
+
+[[package]]
+name = "sphinx-press-theme"
+version = "0.8.0"
+description = "A Sphinx-doc theme based on Vuepress"
+optional = false
+python-versions = "*"
+files = [
+ {file = "sphinx_press_theme-0.8.0-py3-none-any.whl", hash = "sha256:ddf877d414a2c66e13396d726115aa3f0c94d1ac9133b4df028c261bf388ab25"},
+ {file = "sphinx_press_theme-0.8.0.tar.gz", hash = "sha256:2884caab1dc01ecb11d158d4dd6d3179e2dd97cd48516c769cc27360272e62b3"},
+]
+
+[package.dependencies]
+sphinx = ">=4.0.1"
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "2.0.0"
+description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"},
+ {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "2.0.0"
+description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"},
+ {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.1.0"
+description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"},
+ {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["html5lib", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+description = "A sphinx extension which renders display math in HTML via JavaScript"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
+ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
+]
+
+[package.extras]
+test = ["flake8", "mypy", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "2.0.0"
+description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"},
+ {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["defusedxml (>=0.7.1)", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "2.0.0"
+description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"},
+ {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
[[package]]
name = "sqlalchemy"
version = "2.0.36"
@@ -1459,6 +1836,21 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
pymysql = ["pymysql"]
sqlcipher = ["sqlcipher3_binary"]
+[[package]]
+name = "sqlalchemy-libsql"
+version = "0.1.0"
+description = "LibSQL.org for SQLAlchemy"
+optional = false
+python-versions = ">=3.7,<4.0"
+files = [
+ {file = "sqlalchemy_libsql-0.1.0-py3-none-any.whl", hash = "sha256:a4d5cf4089cf3a229d5b1b20e9b8ca7ac8e2c0784a11c5ead3c66c5c9b18ae19"},
+ {file = "sqlalchemy_libsql-0.1.0.tar.gz", hash = "sha256:5b44506d0e59f5021b6b63b7b97496889cb3692cdd443c0fe5e2b63abcab589f"},
+]
+
+[package.dependencies]
+libsql-client = ">=0.3.0,<0.4.0"
+SQLAlchemy = ">=2.0.0,<3.0.0"
+
[[package]]
name = "sqlmodel"
version = "0.0.22"
@@ -1623,6 +2015,23 @@ files = [
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
]
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
+ {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+]
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
+h2 = ["h2 (>=4,<5)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["zstandard (>=0.18.0)"]
+
[[package]]
name = "uvicorn"
version = "0.34.0"
@@ -1833,7 +2242,26 @@ idna = ">=2.0"
multidict = ">=4.0"
propcache = ">=0.2.0"
+[[package]]
+name = "zipp"
+version = "3.21.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
+ {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
+]
+
+[package.extras]
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
+cover = ["pytest-cov"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+enabler = ["pytest-enabler (>=2.2)"]
+test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
+type = ["pytest-mypy"]
+
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.14"
-content-hash = "efc9b5282b47339616311346537efdcca10ea51c4695c640c43e64095ac9f36b"
+content-hash = "339575f4580060800ca4e9bd8ae0da328e12609723431b34c340a1ac6d2b6f63"
diff --git a/apps/pydiscordsh/pydiscordsh/__init__.py b/apps/pydiscordsh/pydiscordsh/__init__.py
index 135b6688f..0e0d2cb26 100644
--- a/apps/pydiscordsh/pydiscordsh/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/__init__.py
@@ -1,2 +1,3 @@
from .api import Routes, CORS
-from .apps import TursoDatabase
\ No newline at end of file
+from .apps import TursoDatabase
+from .api import SetupSchema, Hero
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/__init__.py b/apps/pydiscordsh/pydiscordsh/api/__init__.py
index f842ffbd9..dd06d0385 100644
--- a/apps/pydiscordsh/pydiscordsh/api/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/api/__init__.py
@@ -1,2 +1,3 @@
from .cors import CORS
-from .routes import Routes
\ No newline at end of file
+from .routes import Routes
+from .schema import SetupSchema, Hero
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
new file mode 100644
index 000000000..8e2bce818
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -0,0 +1,44 @@
+from typing import Optional
+import os
+from sqlmodel import Field, Session, SQLModel, create_engine, select
+
+class Hero(SQLModel, table=True):
+ id: Optional[int] = Field(default=None, primary_key=True)
+ name: str = Field(..., max_length=64)
+ secret_name: str = Field(..., max_length=64)
+ age: Optional[int] = Field(default=None, ge=0, le=10000)
+
+class SetupSchema:
+ def __init__(self):
+ # Load the database URL and token from environment variables
+ self.TURSO_DATABASE_URL = os.getenv("TURSO_DATABASE_URL")
+ self.TURSO_AUTH_TOKEN = os.getenv("TURSO_AUTH_TOKEN")
+
+ if not self.TURSO_DATABASE_URL or not self.TURSO_AUTH_TOKEN:
+ raise ValueError("TURSO_DATABASE_URL or TURSO_AUTH_TOKEN is not set in environment variables.")
+
+ # Prepare the database connection URL
+ db_url = f"sqlite+{self.TURSO_DATABASE_URL}/?authToken={self.TURSO_AUTH_TOKEN}&secure=true"
+
+ # Create the engine
+ self.engine = create_engine(db_url, connect_args={'check_same_thread': False}, echo=True)
+
+ def create_tables(self):
+ """Create database tables based on the defined models."""
+ SQLModel.metadata.create_all(self.engine)
+ print("Database tables created successfully.")
+
+ def get_session(self) -> Session:
+ """Provide a new database session."""
+ return Session(self.engine)
+
+ def fetch_hero_by_name(self, hero_name: str):
+ """Fetch a hero by name for demonstration purposes."""
+ with self.get_session() as session:
+ statement = select(Hero).where(Hero.name == hero_name)
+ hero = session.exec(statement).first()
+ if hero:
+ print(f"Hero found: {hero.name}")
+ else:
+ print("Hero not found.")
+ return hero
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/apps/turso.py b/apps/pydiscordsh/pydiscordsh/apps/turso.py
index e8dd9ddc9..9a0aaa1fc 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/turso.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/turso.py
@@ -23,6 +23,11 @@ def initialize_connection(self):
async def start_client(self):
try:
+ # Check if the connection already exists
+ if self.conn is not None:
+ logger.warning("Attempted to start client, but connection already exists.")
+ return {"status": 400, "message": "Client already started."}
+
self.initialize_connection()
logger.info("Database client started.")
return {"status": 200, "message": "Client started successfully."}
diff --git a/apps/pydiscordsh/pyproject.toml b/apps/pydiscordsh/pyproject.toml
index f3cfab5f2..1bd81cbdb 100644
--- a/apps/pydiscordsh/pyproject.toml
+++ b/apps/pydiscordsh/pyproject.toml
@@ -29,6 +29,7 @@ readme = 'README.md'
libsql-experimental = "^0.0.41"
sqlmodel = "^0.0.22"
pydantic = "^2.10.4"
+ sqlalchemy-libsql = "^0.1.0"
[tool.poetry.group.dev.dependencies]
autopep8 = "2.3.1"
From 2b233b87671e00b23ee554ea8388594cf1274179 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 03:42:26 -0500
Subject: [PATCH 18/28] feat(pydiscordsh): added discord server model and fixed
GET/POST routes.
Co-authored-by: Bradley Haljendi
---
apps/pydiscordsh/main.py | 27 +++++++------
apps/pydiscordsh/pydiscordsh/__init__.py | 2 +-
apps/pydiscordsh/pydiscordsh/api/__init__.py | 3 +-
apps/pydiscordsh/pydiscordsh/api/heath.py | 41 +++++++++++++++++++
apps/pydiscordsh/pydiscordsh/api/routes.py | 27 +++++++++++++
apps/pydiscordsh/pydiscordsh/api/schema.py | 34 ++++++++++++++--
apps/pydiscordsh/pydiscordsh/apps/discord.py | 42 ++++++++++++++++++++
apps/pydiscordsh/pydiscordsh/apps/turso.py | 27 ++++++++++++-
8 files changed, 184 insertions(+), 19 deletions(-)
create mode 100644 apps/pydiscordsh/pydiscordsh/api/heath.py
create mode 100644 apps/pydiscordsh/pydiscordsh/apps/discord.py
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index 0b9dc0a0a..c8a23f113 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -1,5 +1,5 @@
from fastapi import FastAPI, WebSocket
-from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero
+from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero, DiscordServer, Health
from contextlib import asynccontextmanager
import logging
@@ -10,17 +10,17 @@
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("[DB]@PENDING")
- await database.start_client()
+ await db.start_client()
yield
logger.info("[DB]@DISINT")
- await database.stop_client()
+ await db.stop_client()
logger.info("[DB]@STOPPING")
app = FastAPI(lifespan=lifespan)
routes = Routes(app, templates_dir="templates")
CORS(app)
-database = TursoDatabase()
+db = TursoDatabase()
## Debug
@@ -29,20 +29,21 @@ async def setup_database():
try:
schema_setup = SetupSchema()
schema_setup.create_tables()
+ db.sync()
return {"status": 200, "message": "Database schema setup completed successfully."}
except Exception as e:
logger.error(f"Error setting up the database: {e}")
return {"status": 500, "message": f"Error setting up the database: {e}"}
+##
-@app.get("/v1/db/start_client")
-async def start_client():
- return await database.start_client()
+routes.db_get("/v1/db/start_client", Health, db, "start_client")
+routes.db_get("/v1/db/stop_client", Health, db, "stop_client")
+routes.db_get("/v1/db/status_client", Health, db, "status_client")
-@app.get("/v1/db/stop_client")
-async def stop_client():
- return await database.stop_client()
+##
+
+# @app.post("/v1/discord/add_server")
+# async def discord_add_server():
+# return await discord.add_server()
-@app.get("/v1/db/status_client")
-async def status_client():
- return await database.status_client()
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/__init__.py b/apps/pydiscordsh/pydiscordsh/__init__.py
index 0e0d2cb26..8fcb3d27f 100644
--- a/apps/pydiscordsh/pydiscordsh/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/__init__.py
@@ -1,3 +1,3 @@
from .api import Routes, CORS
from .apps import TursoDatabase
-from .api import SetupSchema, Hero
\ No newline at end of file
+from .api import SetupSchema, Hero, DiscordServer, Health
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/__init__.py b/apps/pydiscordsh/pydiscordsh/api/__init__.py
index dd06d0385..2bd9dc95d 100644
--- a/apps/pydiscordsh/pydiscordsh/api/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/api/__init__.py
@@ -1,3 +1,4 @@
from .cors import CORS
from .routes import Routes
-from .schema import SetupSchema, Hero
\ No newline at end of file
+from .schema import SetupSchema, Hero, DiscordServer
+from .heath import Health
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/heath.py b/apps/pydiscordsh/pydiscordsh/api/heath.py
new file mode 100644
index 000000000..426de5b2a
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/api/heath.py
@@ -0,0 +1,41 @@
+import logging
+
+logger = logging.getLogger("uvicorn")
+
+class Health:
+ def __init__(self, db):
+ self.db = db
+
+ async def start_client(self):
+ """Start the database client."""
+ try:
+ if self.db.conn is not None:
+ logger.warning("Attempted to start client, but connection already exists.")
+ return {"status": 400, "message": "Client already started."}
+
+ self.db.initialize_connection()
+ logger.info("Database client started.")
+ return {"status": 200, "message": "Client started successfully."}
+ except Exception as e:
+ logger.error(f"Error starting client: {e}")
+ return {"status": 500, "message": f"Error starting client: {e}"}
+
+ async def stop_client(self):
+ """Stop the database client."""
+ try:
+ if self.db.conn:
+ self.db.conn = None
+ logger.info("Database client stopped.")
+ return {"status": 200, "message": "Client stopped successfully."}
+ else:
+ return {"status": 400, "message": "No active client to stop."}
+ except Exception as e:
+ logger.error(f"Error stopping client: {e}")
+ return {"status": 500, "message": f"Error stopping client: {e}"}
+
+ async def status_client(self):
+ """Check the status of the database client."""
+ if self.db.conn:
+ return {"status": 200, "message": "Client is running."}
+ else:
+ return {"status": 400, "message": "Client is not running."}
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/routes.py b/apps/pydiscordsh/pydiscordsh/api/routes.py
index 5e56fec65..4192de589 100644
--- a/apps/pydiscordsh/pydiscordsh/api/routes.py
+++ b/apps/pydiscordsh/pydiscordsh/api/routes.py
@@ -49,3 +49,30 @@ def get(self, path: str, client_class: Type, method_name: str):
def post(self, path: str, client_class: Type, method_name: str):
self.add_route(path, client_class, method_name, methods=["POST"])
+
+ def db_post(self, path: str, client_class: Type, db, method_name: str):
+ """Handle POST requests with a persistent database connection."""
+ async def wrapper(request: Request):
+ try:
+ client = client_class(db) # Pass the db instance correctly
+ body = await self.parse_json_body(request)
+ method = self.get_client_method(client, method_name)
+ result = await method(body)
+ return result if isinstance(result, dict) else {"data": str(result)}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e))
+
+ self.app.add_api_route(path, wrapper, methods=["POST"])
+
+ def db_get(self, path: str, client_class: Type, db, method_name: str):
+ """Handle GET requests with a persistent database connection."""
+ async def wrapper(request: Request):
+ try:
+ client = client_class(db) # Pass the db instance correctly
+ method = self.get_client_method(client, method_name)
+ result = await method()
+ return result if isinstance(result, dict) else {"data": str(result)}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e))
+
+ self.app.add_api_route(path, wrapper, methods=["GET"])
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
index 8e2bce818..4ceb562ee 100644
--- a/apps/pydiscordsh/pydiscordsh/api/schema.py
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -1,13 +1,41 @@
-from typing import Optional
+from typing import Optional, List
import os
-from sqlmodel import Field, Session, SQLModel, create_engine, select
+from sqlmodel import Field, Session, SQLModel, create_engine, select, JSON, Column
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(..., max_length=64)
secret_name: str = Field(..., max_length=64)
age: Optional[int] = Field(default=None, ge=0, le=10000)
-
+
+class DiscordServer(SQLModel, table=True):
+ server_id: int = Field(primary_key=True) # Pre-existing unique server ID
+ owner_id: str = Field(nullable=False, max_length=50)
+ lang: Optional[List[str]] = Field(default=None, sa_column=Column(JSON))
+ public: Optional[bool] = Field(default=False)
+ invite: str = Field(..., max_length=100)
+ nsfw: Optional[bool] = Field(default=False)
+ name: str = Field(..., max_length=100)
+ summary: str = Field(..., max_length=255)
+ description: Optional[str] = Field(default=None, max_length=1024)
+ website: str = Field(..., max_length=100)
+ logo: str = Field(..., max_length=255)
+ banner: str = Field(..., max_length=255)
+ video: str = Field(..., max_length=255)
+ bumps: int = Field(default=0, ge=0) # Bumps or votes
+ bump_at: Optional[int] = Field(default=None, nullable=True) # UNIX timestamp for bump date
+ categories: Optional[List[str]] = Field(default=None, sa_column=Column(JSON)) # List of categories
+ tags: Optional[List[str]] = Field(default=None, sa_column=Column(JSON)) # List of tags
+ vip: Optional[bool] = Field(default=False) # VIP status
+ url: Optional[str] = Field(default=None, max_length=255)
+ invoice: Optional[str] = Field(default=None, max_length=255) # Invoice field as a string
+ invoice_at: Optional[int] = Field(default=None, nullable=True) # UNIX timestamp for the invoice date
+ created_at: Optional[int] = Field(default=None, nullable=False) # UNIX timestamp for creation date
+ updated_at: Optional[int] = Field(default=None, nullable=True) # UNIX timestamp for update date
+
+ class Config:
+ arbitrary_types_allowed = True
+
class SetupSchema:
def __init__(self):
# Load the database URL and token from environment variables
diff --git a/apps/pydiscordsh/pydiscordsh/apps/discord.py b/apps/pydiscordsh/pydiscordsh/apps/discord.py
new file mode 100644
index 000000000..db0becad7
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/apps/discord.py
@@ -0,0 +1,42 @@
+from sqlmodel import SQLModel, Session
+from fastapi import HTTPException
+
+from pydiscordsh.api.schema import DiscordServer
+from pydiscordsh.apps.turso import TursoDatabase
+
+class DiscordServerManager:
+ def __init__(self, db: TursoDatabase):
+ self.db = db
+
+ async def add_server(self, data: dict):
+ """Add a new Discord server."""
+ try:
+ server = DiscordServer(**data)
+ cursor = self.db.get_cursor()
+ cursor.execute(
+ """
+ INSERT INTO discordserver (
+ server_id, owner_id, name, description, bumps, categories, tags, vip, url, invoice, invoice_at, created_at, updated_at, bump_at
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ """,
+ (
+ server.server_id,
+ server.owner_id,
+ server.name,
+ server.description,
+ server.bumps,
+ str(server.categories),
+ str(server.tags),
+ server.vip,
+ server.url,
+ server.invoice,
+ server.invoice_at,
+ server.created_at,
+ server.updated_at,
+ server.bump_at
+ )
+ )
+ self.db.conn.commit()
+ return {"status": 200, "message": "Discord server added successfully."}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=f"Error adding server: {e}")
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/apps/turso.py b/apps/pydiscordsh/pydiscordsh/apps/turso.py
index 9a0aaa1fc..1e4874549 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/turso.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/turso.py
@@ -63,4 +63,29 @@ async def close(self):
return {"status": 400, "message": "No active connection to close."}
except Exception as e:
logger.error(f"Error closing the database connection: {e}")
- return {"status": 500, "message": f"Error closing the database connection: {e}"}
\ No newline at end of file
+ return {"status": 500, "message": f"Error closing the database connection: {e}"}
+
+ async def sync(self):
+ """Sync the database."""
+ try:
+ if self.conn:
+ self.conn.sync()
+ logger.info("Database synced successfully.")
+ return {"status": 200, "message": "Database synced successfully."}
+ else:
+ return {"status": 400, "message": "No active connection to sync."}
+ except Exception as e:
+ logger.error(f"Error syncing the database: {e}")
+ return {"status": 500, "message": f"Error syncing the database: {e}"}
+
+ def get_cursor(self):
+ """Get a cursor for executing SQL queries."""
+ try:
+ if not self.conn:
+ raise ValueError("No active database connection.")
+ cursor = self.conn.cursor()
+ logger.info("Cursor obtained successfully.")
+ return cursor
+ except Exception as e:
+ logger.error(f"Error getting the database cursor: {e}")
+ raise
\ No newline at end of file
From 52d5279ce354fd582e778f3e42175dabc9f3724e Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 04:53:34 -0500
Subject: [PATCH 19/28] feat(pydiscordsh): added a generic route to insert
discord servers.
---
apps/pydiscordsh/main.py | 13 +++--
apps/pydiscordsh/pydiscordsh/__init__.py | 4 +-
apps/pydiscordsh/pydiscordsh/api/__init__.py | 2 +-
apps/pydiscordsh/pydiscordsh/api/schema.py | 25 +++++---
apps/pydiscordsh/pydiscordsh/apps/__init__.py | 3 +-
apps/pydiscordsh/pydiscordsh/apps/discord.py | 57 +++++++++----------
apps/pydiscordsh/pydiscordsh/apps/turso.py | 56 +++++++++++++++---
.../pydiscordsh/pydiscordsh/demo/hero_demo.py | 44 ++++++++++++++
8 files changed, 149 insertions(+), 55 deletions(-)
create mode 100644 apps/pydiscordsh/pydiscordsh/demo/hero_demo.py
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index c8a23f113..9fc361e31 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -1,5 +1,5 @@
from fastapi import FastAPI, WebSocket
-from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero, DiscordServer, Health
+from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero, DiscordServerManager, Health, SchemaEngine
from contextlib import asynccontextmanager
import logging
@@ -7,6 +7,9 @@
logger = logging.getLogger("uvicorn")
+schema_engine = SchemaEngine()
+db = TursoDatabase(schema_engine)
+
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("[DB]@PENDING")
@@ -20,15 +23,14 @@ async def lifespan(app: FastAPI):
routes = Routes(app, templates_dir="templates")
CORS(app)
-db = TursoDatabase()
## Debug
@app.get("/v1/db/setup")
async def setup_database():
try:
- schema_setup = SetupSchema()
- schema_setup.create_tables()
+ setup_schema = SetupSchema(schema_engine)
+ setup_schema.create_tables()
db.sync()
return {"status": 200, "message": "Database schema setup completed successfully."}
except Exception as e:
@@ -43,6 +45,9 @@ async def setup_database():
##
+routes.db_post("/v1/discord/add_server", DiscordServerManager, db, "add_server")
+routes.db_get("/v1/discord/get_server/{server_id}", DiscordServerManager, db, "get_server")
+
# @app.post("/v1/discord/add_server")
# async def discord_add_server():
# return await discord.add_server()
diff --git a/apps/pydiscordsh/pydiscordsh/__init__.py b/apps/pydiscordsh/pydiscordsh/__init__.py
index 8fcb3d27f..045215606 100644
--- a/apps/pydiscordsh/pydiscordsh/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/__init__.py
@@ -1,3 +1,3 @@
from .api import Routes, CORS
-from .apps import TursoDatabase
-from .api import SetupSchema, Hero, DiscordServer, Health
\ No newline at end of file
+from .apps import TursoDatabase, DiscordServerManager
+from .api import SetupSchema, Hero, DiscordServer, Health, SchemaEngine
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/__init__.py b/apps/pydiscordsh/pydiscordsh/api/__init__.py
index 2bd9dc95d..eb61a693e 100644
--- a/apps/pydiscordsh/pydiscordsh/api/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/api/__init__.py
@@ -1,4 +1,4 @@
from .cors import CORS
from .routes import Routes
-from .schema import SetupSchema, Hero, DiscordServer
+from .schema import SetupSchema, Hero, DiscordServer, SchemaEngine
from .heath import Health
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
index 4ceb562ee..0f415ab84 100644
--- a/apps/pydiscordsh/pydiscordsh/api/schema.py
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -36,9 +36,10 @@ class DiscordServer(SQLModel, table=True):
class Config:
arbitrary_types_allowed = True
-class SetupSchema:
+
+class SchemaEngine:
def __init__(self):
- # Load the database URL and token from environment variables
+ """Initialize the database connection."""
self.TURSO_DATABASE_URL = os.getenv("TURSO_DATABASE_URL")
self.TURSO_AUTH_TOKEN = os.getenv("TURSO_AUTH_TOKEN")
@@ -51,22 +52,28 @@ def __init__(self):
# Create the engine
self.engine = create_engine(db_url, connect_args={'check_same_thread': False}, echo=True)
+ def get_session(self) -> Session:
+ """Provide the database session."""
+ return Session(self.engine)
+
+
+class SetupSchema:
+ def __init__(self, schema_engine: SchemaEngine):
+ self.schema_engine = schema_engine
+
def create_tables(self):
"""Create database tables based on the defined models."""
- SQLModel.metadata.create_all(self.engine)
+ SQLModel.metadata.create_all(self.schema_engine.engine)
print("Database tables created successfully.")
- def get_session(self) -> Session:
- """Provide a new database session."""
- return Session(self.engine)
-
def fetch_hero_by_name(self, hero_name: str):
"""Fetch a hero by name for demonstration purposes."""
- with self.get_session() as session:
+ with self.schema_engine.get_session() as session:
statement = select(Hero).where(Hero.name == hero_name)
hero = session.exec(statement).first()
if hero:
print(f"Hero found: {hero.name}")
else:
print("Hero not found.")
- return hero
\ No newline at end of file
+ return hero
+
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/apps/__init__.py b/apps/pydiscordsh/pydiscordsh/apps/__init__.py
index 7dc8b0453..6704d86b2 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/__init__.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/__init__.py
@@ -1 +1,2 @@
-from .turso import TursoDatabase
\ No newline at end of file
+from .turso import TursoDatabase
+from .discord import DiscordServerManager
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/apps/discord.py b/apps/pydiscordsh/pydiscordsh/apps/discord.py
index db0becad7..0898763ef 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/discord.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/discord.py
@@ -1,42 +1,41 @@
-from sqlmodel import SQLModel, Session
+from sqlmodel import SQLModel, Session, select
from fastapi import HTTPException
-
+import logging
from pydiscordsh.api.schema import DiscordServer
from pydiscordsh.apps.turso import TursoDatabase
+logger = logging.getLogger("uvicorn")
+
class DiscordServerManager:
def __init__(self, db: TursoDatabase):
self.db = db
-
+
async def add_server(self, data: dict):
"""Add a new Discord server."""
try:
server = DiscordServer(**data)
- cursor = self.db.get_cursor()
- cursor.execute(
- """
- INSERT INTO discordserver (
- server_id, owner_id, name, description, bumps, categories, tags, vip, url, invoice, invoice_at, created_at, updated_at, bump_at
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- """,
- (
- server.server_id,
- server.owner_id,
- server.name,
- server.description,
- server.bumps,
- str(server.categories),
- str(server.tags),
- server.vip,
- server.url,
- server.invoice,
- server.invoice_at,
- server.created_at,
- server.updated_at,
- server.bump_at
- )
- )
- self.db.conn.commit()
+ with self.db.schema_engine.get_session() as session:
+ session.add(server)
+ session.commit()
+ logger.info(f"Server added successfully with server_id: {server.server_id}")
return {"status": 200, "message": "Discord server added successfully."}
except Exception as e:
- raise HTTPException(status_code=500, detail=f"Error adding server: {e}")
\ No newline at end of file
+ logger.error(f"Error adding server: {e}")
+ raise HTTPException(status_code=500, detail=f"Error adding server: {e}")
+
+ async def get_server(self, server_id: int):
+ """Retrieve a Discord server by server_id."""
+ try:
+ with self.db.schema_engine.get_session() as session:
+ statement = select(DiscordServer).where(DiscordServer.server_id == server_id)
+ server = session.exec(statement).first()
+
+ if server:
+ logger.info(f"Server found: {server.server_id}")
+ return server
+ else:
+ logger.warning(f"Server with ID {server_id} not found.")
+ raise HTTPException(status_code=404, detail=f"Server with ID {server_id} not found.")
+ except Exception as e:
+ logger.error(f"Error retrieving server: {e}")
+ raise HTTPException(status_code=500, detail=f"Error retrieving server: {e}")
diff --git a/apps/pydiscordsh/pydiscordsh/apps/turso.py b/apps/pydiscordsh/pydiscordsh/apps/turso.py
index 1e4874549..a91641f74 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/turso.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/turso.py
@@ -1,11 +1,14 @@
import logging
import os
import libsql_experimental as libsql
+from pydiscordsh.api.schema import SchemaEngine
logger = logging.getLogger("uvicorn")
class TursoDatabase:
- def __init__(self):
+ def __init__(self, schema_engine: SchemaEngine):
+ """Initialize both a local connection and a schema engine connection."""
+ self.schema_engine = schema_engine
self.conn = None
def initialize_connection(self):
@@ -19,7 +22,11 @@ def initialize_connection(self):
# Initialize the database connection
self.conn = libsql.connect("hello.db", sync_url=url, auth_token=auth_token)
self.conn.sync()
- logger.info("Database connection initialized.")
+ logger.info("Local libsql database connection initialized.")
+
+ if not self.schema_engine.engine:
+ self.schema_engine.get_session()
+ logger.info("SchemaEngine connection initialized.")
async def start_client(self):
try:
@@ -39,19 +46,26 @@ async def stop_client(self):
try:
if self.conn:
self.conn = None
- logger.info("Database client stopped.")
+ logger.info("Database client stopped.")
return {"status": 200, "message": "Client stopped successfully."}
- else:
- return {"status": 400, "message": "No active client to stop."}
+ if self.schema_engine:
+ self.schema_engine.engine.dispose()
+ logger.info("Schema engine connection stopped.")
+ return {"status": 400, "message": "No active client to stop."}
except Exception as e:
logger.error(f"Error stopping client: {e}")
return {"status": 500, "message": f"Error stopping client: {e}"}
async def status_client(self):
- if self.conn:
- return {"status": 200, "message": "Client is running."}
- else:
- return {"status": 400, "message": "Client is not running."}
+ """Check both connections."""
+ if self.conn:
+ return {"status": 200, "message": "Local client is running."}
+ try:
+ with self.schema_engine.get_session() as session:
+ session.execute("SELECT 1")
+ return {"status": 200, "message": "SchemaEngine is running."}
+ except Exception as e:
+ return {"status": 400, "message": f"SchemaEngine not running: {e}"}
async def close(self):
try:
@@ -88,4 +102,28 @@ def get_cursor(self):
return cursor
except Exception as e:
logger.error(f"Error getting the database cursor: {e}")
+ raise
+
+ def get_local_cursor(self):
+ """Get a cursor from the local connection."""
+ if not self.conn:
+ raise ValueError("Local connection is not active.")
+ return self.conn.cursor()
+
+ def get_schema_cursor(self):
+ """Get a cursor from the schema engine connection."""
+ try:
+ session = self.schema_engine.get_session()
+ return session.connection().connection.cursor()
+ except Exception as e:
+ logger.error(f"Error getting schema engine cursor: {e}")
+ raise
+
+ def get_session(self):
+ """Get a cursor from the schema engine connection."""
+ try:
+ session = self.schema_engine.get_session()
+ return session
+ except Exception as e:
+ logger.error(f"Error getting schema engine cursor: {e}")
raise
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/demo/hero_demo.py b/apps/pydiscordsh/pydiscordsh/demo/hero_demo.py
new file mode 100644
index 000000000..b9c34c213
--- /dev/null
+++ b/apps/pydiscordsh/pydiscordsh/demo/hero_demo.py
@@ -0,0 +1,44 @@
+from fastapi import FastAPI
+from sqlmodel import Field, Session, SQLModel, create_engine, select
+
+
+class Hero(SQLModel, table=True):
+ id: int | None = Field(default=None, primary_key=True)
+ name: str = Field(index=True)
+ secret_name: str
+ age: int | None = Field(default=None, index=True)
+
+
+sqlite_file_name = "database.db"
+sqlite_url = f"sqlite:///{sqlite_file_name}"
+
+connect_args = {"check_same_thread": False}
+engine = create_engine(sqlite_url, echo=True, connect_args=connect_args)
+
+
+def create_db_and_tables():
+ SQLModel.metadata.create_all(engine)
+
+
+app = FastAPI()
+
+
+@app.on_event("startup")
+def on_startup():
+ create_db_and_tables()
+
+
+@app.post("/heroes/")
+def create_hero(hero: Hero):
+ with Session(engine) as session:
+ session.add(hero)
+ session.commit()
+ session.refresh(hero)
+ return hero
+
+
+@app.get("/heroes/")
+def read_heroes():
+ with Session(engine) as session:
+ heroes = session.exec(select(Hero)).all()
+ return heroes
\ No newline at end of file
From 25d3f62a1dfef0ac8e27025192e3ef028c3c5925 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 06:44:33 -0500
Subject: [PATCH 20/28] feat(pydiscordclient): added the update server
Co-authored-by: Bradley Haljendi
---
apps/pydiscordsh/main.py | 40 ++++++++--
apps/pydiscordsh/pydiscordsh/api/schema.py | 2 +
apps/pydiscordsh/pydiscordsh/apps/discord.py | 81 +++++++++++++++++++-
3 files changed, 115 insertions(+), 8 deletions(-)
diff --git a/apps/pydiscordsh/main.py b/apps/pydiscordsh/main.py
index 9fc361e31..c9e8c80c1 100644
--- a/apps/pydiscordsh/main.py
+++ b/apps/pydiscordsh/main.py
@@ -1,5 +1,5 @@
-from fastapi import FastAPI, WebSocket
-from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero, DiscordServerManager, Health, SchemaEngine
+from fastapi import FastAPI, WebSocket, HTTPException
+from pydiscordsh import Routes, CORS, TursoDatabase, SetupSchema, Hero, DiscordServerManager, Health, SchemaEngine, DiscordServer
from contextlib import asynccontextmanager
import logging
@@ -46,9 +46,37 @@ async def setup_database():
##
routes.db_post("/v1/discord/add_server", DiscordServerManager, db, "add_server")
-routes.db_get("/v1/discord/get_server/{server_id}", DiscordServerManager, db, "get_server")
+routes.db_post("/v1/discord/update_server", DiscordServerManager, db, "update_server")
-# @app.post("/v1/discord/add_server")
-# async def discord_add_server():
-# return await discord.add_server()
+@app.get("/v1/discord/get_server/{server_id}")
+async def get_server(server_id: int):
+ try:
+ manager = DiscordServerManager(db)
+ result = await manager.get_server(server_id)
+ return result if isinstance(result, DiscordServer) else {"data": str(result)}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e))
+
+@app.get("/v1/discord/bump_server/{server_id}")
+async def bump_server(server_id: int):
+ try:
+ manager = DiscordServerManager(db)
+ result = await manager.bump_server(server_id)
+ return result
+ except HTTPException as http_ex:
+ raise http_ex
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e))
+##
+
+@app.get("/v1/discord/reset_bump/{server_id}")
+async def reset_bump(server_id: int):
+ try:
+ manager = DiscordServerManager(db)
+ result = await manager.reset_bump(server_id)
+ return result
+ except HTTPException as http_ex:
+ raise http_ex
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e))
\ No newline at end of file
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
index 0f415ab84..ef2b817aa 100644
--- a/apps/pydiscordsh/pydiscordsh/api/schema.py
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -36,6 +36,8 @@ class DiscordServer(SQLModel, table=True):
class Config:
arbitrary_types_allowed = True
+# class BumpVote(SQLModel, table=False)
+
class SchemaEngine:
def __init__(self):
diff --git a/apps/pydiscordsh/pydiscordsh/apps/discord.py b/apps/pydiscordsh/pydiscordsh/apps/discord.py
index 0898763ef..cb0133d74 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/discord.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/discord.py
@@ -1,5 +1,6 @@
from sqlmodel import SQLModel, Session, select
from fastapi import HTTPException
+from datetime import datetime, timedelta, timezone
import logging
from pydiscordsh.api.schema import DiscordServer
from pydiscordsh.apps.turso import TursoDatabase
@@ -27,15 +28,91 @@ async def get_server(self, server_id: int):
"""Retrieve a Discord server by server_id."""
try:
with self.db.schema_engine.get_session() as session:
- statement = select(DiscordServer).where(DiscordServer.server_id == server_id)
- server = session.exec(statement).first()
+ #statement = select(DiscordServer).where(DiscordServer.server_id == server_id)
+ #server = session.exec(statement).first()
+ server = session.get(DiscordServer, server_id)
+
if server:
logger.info(f"Server found: {server.server_id}")
return server
else:
logger.warning(f"Server with ID {server_id} not found.")
raise HTTPException(status_code=404, detail=f"Server with ID {server_id} not found.")
+
except Exception as e:
logger.error(f"Error retrieving server: {e}")
raise HTTPException(status_code=500, detail=f"Error retrieving server: {e}")
+
+ async def bump_server(self, server_id: int):
+ """Bump the Discord server, ensuring it can only be bumped once per hour."""
+ try:
+ with self.db.schema_engine.get_session() as session:
+ # server = session.exec(select(DiscordServer).where(DiscordServer.server_id == server_id)).first()
+ server = session.get(DiscordServer, server_id)
+
+ if not server:
+ raise HTTPException(status_code=404, detail="Server not found.")
+
+ if server.bump_at:
+ last_bumped = datetime.fromtimestamp(server.bump_at, tz=timezone.utc)
+ if datetime.now(tz=timezone.utc) - last_bumped < timedelta(hours=1):
+ raise HTTPException(status_code=400, detail="Server can only be bumped once every hour.")
+
+ server.bumps += 1
+ server.bump_at = int(datetime.now(tz=timezone.utc).timestamp()) # Current timestamp in UNIX format
+
+ session.commit()
+ logger.info(f"Server with server_id: {server_id} bumped successfully.")
+
+ return {"status": 200, "message": "Server bumped successfully."}
+
+ except Exception as e:
+ logger.error(f"Error bumping server: {e}")
+ raise HTTPException(status_code=500, detail=f"Error bumping server: {e}")
+
+ ## TODO: Make it admin only.
+ async def reset_bump(self, server_id: int):
+ """Reset the bump for the specified Discord server to 5 hours ago."""
+ try:
+ five_hours_ago = datetime.now(tz=timezone.utc) - timedelta(hours=5)
+
+ with self.db.schema_engine.get_session() as session:
+ server = session.get(DiscordServer, server_id)
+
+ if not server:
+ raise HTTPException(status_code=404, detail="Server not found.")
+
+ server.bump_at = int(five_hours_ago.timestamp())
+
+ session.commit()
+ logger.info(f"Bump for server {server_id} reset to {five_hours_ago}.")
+
+ return {"status": 200, "message": f"Bump for server {server_id} reset to {five_hours_ago}."}
+
+ except Exception as e:
+ logger.error(f"Error resetting bump for server {server_id}: {e}")
+ raise HTTPException(status_code=500, detail=f"Error resetting bump: {e}")
+
+ ## TODO: Add Permissions, making sure the owner / mod => are on the list
+ async def update_server(self, data: dict):
+ """update a new Discord server."""
+ try:
+ update_server = DiscordServer(**data)
+
+ with self.db.schema_engine.get_session() as session:
+ og_server = session.get(DiscordServer, update_server.server_id)
+ if not og_server:
+ raise HTTPException(status_code=404, detail="Server not found.")
+
+ allowed_fields = ["lang", "public", "invite", "nsfw", "summary", "description", "website", "video", "categories", "tags"]
+ for field in allowed_fields:
+ if field in data:
+ setattr(og_server, field, data[field])
+ session.flush()
+ session.commit()
+ logger.info(f"Server updated successfully with server_id: {og_server.server_id}")
+ return {"status": 200, "message": "Discord server updated successfully."}
+ except Exception as e:
+ logger.error(f"Error adding server: {e}")
+ raise HTTPException(status_code=500, detail=f"Error adding server: {e}")
\ No newline at end of file
From 20745aa3cf73883b899f701e9eb4d75e14558016 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 07:11:56 -0500
Subject: [PATCH 21/28] feat(pydiscordsh): updating the update server function
---
apps/pydiscordsh/pydiscordsh/apps/discord.py | 28 +++++++++++++-------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/apps/pydiscordsh/pydiscordsh/apps/discord.py b/apps/pydiscordsh/pydiscordsh/apps/discord.py
index cb0133d74..aaa361a22 100644
--- a/apps/pydiscordsh/pydiscordsh/apps/discord.py
+++ b/apps/pydiscordsh/pydiscordsh/apps/discord.py
@@ -98,21 +98,31 @@ async def reset_bump(self, server_id: int):
async def update_server(self, data: dict):
"""update a new Discord server."""
try:
- update_server = DiscordServer(**data)
-
+ ## update_server = DiscordServer(**data)
+ server_id = data.get("server_id")
+ if not server_id:
+ raise HTTPException(status_code=400, detail="server_id is required for updating.")
+
with self.db.schema_engine.get_session() as session:
- og_server = session.get(DiscordServer, update_server.server_id)
+ og_server = session.get(DiscordServer, server_id)
+
if not og_server:
raise HTTPException(status_code=404, detail="Server not found.")
allowed_fields = ["lang", "public", "invite", "nsfw", "summary", "description", "website", "video", "categories", "tags"]
+ updated = False
+
for field in allowed_fields:
- if field in data:
- setattr(og_server, field, data[field])
- session.flush()
- session.commit()
- logger.info(f"Server updated successfully with server_id: {og_server.server_id}")
- return {"status": 200, "message": "Discord server updated successfully."}
+ if field in data and getattr(og_server, field) != data[field]:
+ setattr(og_server, field, data[field])
+ updated = True
+ if updated:
+ session.commit()
+ logger.info(f"Server updated successfully with server_id: {og_server.server_id}")
+ return {"status": 200, "message": "Discord server updated successfully."}
+ else:
+ logger.info(f"No changes detected for server_id: {server_id}")
+ return {"status": 200, "message": "No changes were made."}
except Exception as e:
logger.error(f"Error adding server: {e}")
raise HTTPException(status_code=500, detail=f"Error adding server: {e}")
\ No newline at end of file
From 2f1c7d12aaa2f888e3722ff0785676b4cdffc2eb Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 07:20:24 -0500
Subject: [PATCH 22/28] sync(pydiscordsh): preparing user profile
---
apps/pydiscordsh/pydiscordsh/api/schema.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
index ef2b817aa..2800238f2 100644
--- a/apps/pydiscordsh/pydiscordsh/api/schema.py
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -8,6 +8,9 @@ class Hero(SQLModel, table=True):
secret_name: str = Field(..., max_length=64)
age: Optional[int] = Field(default=None, ge=0, le=10000)
+# class User(SQLModel, table=True):
+# user_id: int = Field(primary_key=True)
+
class DiscordServer(SQLModel, table=True):
server_id: int = Field(primary_key=True) # Pre-existing unique server ID
owner_id: str = Field(nullable=False, max_length=50)
From 6fca518c7bbde8eb9b9173ccbea958f21ed13066 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 17:57:41 -0500
Subject: [PATCH 23/28] docs(journal): updating the journal entires
---
apps/kbve.com/src/content/journal/01-07.mdx | 4 ++++
apps/kbve.com/src/content/journal/01-08.mdx | 12 +++++++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/apps/kbve.com/src/content/journal/01-07.mdx b/apps/kbve.com/src/content/journal/01-07.mdx
index 6a0001fec..808ef678f 100644
--- a/apps/kbve.com/src/content/journal/01-07.mdx
+++ b/apps/kbve.com/src/content/journal/01-07.mdx
@@ -26,6 +26,10 @@ Lucky 7 of the first.
The best way to handle the supabase jwts, hmm.
One idea would be to just pass the JWT secret over and use that to validate the information.
+
+ We ended up going HAM!
+ A huge chunk of the code has been updated and now we can almost see a production ready server live within the next week.
+ There are a couple things that still need to be fixed but that should not be an issue, we just need to tackle it all slowly.
## 2024
diff --git a/apps/kbve.com/src/content/journal/01-08.mdx b/apps/kbve.com/src/content/journal/01-08.mdx
index b1fdc837a..ffdc63c18 100644
--- a/apps/kbve.com/src/content/journal/01-08.mdx
+++ b/apps/kbve.com/src/content/journal/01-08.mdx
@@ -12,7 +12,17 @@ tags:
## Notes
-### 2024
+## 2025
+
+- 05:56PM
+
+ **Rancher**
+
+ Something went wrong with the rancher certs and I was able to figure it out by going through the issue tickets.
+ I believe the issue was that when we updated rancher, it might have reset the certs but we were able to make sure that ACME / LetsEncrypt does its job.
+ After going through some casual walk through with ChatGPT, we were able to solve the issue.
+
+## 2024
- 2:31pm - erust
From ad0071c54b066c5fee940f8e9864104171162109 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 19:22:06 -0500
Subject: [PATCH 24/28] fix(kilobase): updated the service key for the sealed
secrets.
---
apps/kbve.com/src/content/journal/01-08.mdx | 18 +++++++++++++
.../templates/sealed-secrets-vault.yaml | 27 ++++++++++---------
2 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/apps/kbve.com/src/content/journal/01-08.mdx b/apps/kbve.com/src/content/journal/01-08.mdx
index ffdc63c18..ae156d72e 100644
--- a/apps/kbve.com/src/content/journal/01-08.mdx
+++ b/apps/kbve.com/src/content/journal/01-08.mdx
@@ -22,6 +22,24 @@ tags:
I believe the issue was that when we updated rancher, it might have reset the certs but we were able to make sure that ACME / LetsEncrypt does its job.
After going through some casual walk through with ChatGPT, we were able to solve the issue.
+- 06:58PM
+
+ **Secrets**
+
+ We need to update the Sealed secrets once more and then enable the `discord` namespace to have access to the `service_role`.
+
+```shell
+
+ ./kbve.sh -nx kilobase:seal --namespace=supabase --keyName=supabase-secret-jwt --secrets=""
+
+```
+
+ Going to recreate the secrets here and then move forward, making sure that the `service_role` has the right key.
+ After using the jwt decrypt, I think we put the wrong service key in the seal!
+ Once we update the sealed secret, I will add another seal inside of the new `discordsh` namespace, which will then grab that information and use it.
+ Our goal would then be to migrate some of the user-defined functions directly to the supabase, including the JWT/Auth.
+
+
## 2024
- 2:31pm - erust
diff --git a/migrations/kube/charts/kilobase/supabase/templates/sealed-secrets-vault.yaml b/migrations/kube/charts/kilobase/supabase/templates/sealed-secrets-vault.yaml
index 68f5f8174..9688a25f0 100644
--- a/migrations/kube/charts/kilobase/supabase/templates/sealed-secrets-vault.yaml
+++ b/migrations/kube/charts/kilobase/supabase/templates/sealed-secrets-vault.yaml
@@ -5,10 +5,13 @@ metadata:
namespace: supabase
spec:
encryptedData:
- anonKey: AgASgHQQbobPbN5X4PpXN0Vs+O/Kkr3DA3GyDWHiMvruKAEEGyEhMXw7U8pakPUQ6OXTs3KmZ9kR+T1kLxWsrPwckui3MlrHmd4zjCAcZPTs1joJlulpuO+Hhg4/tyTIEKllEAk/t0TACrgoqhHnsYvtMSOeIMQE141tlZR6O9GYrDW9dB0kObtNKegQf7aysf921ubmNcdNbyo64v13a+e7YBYG26b7kFb0lN96nXTWH5FUchOFBx/fGY6ZE5AjGihNNGL52/4IZ/SHNLs8lOs97a2ahT4OZpOlFM+hKLV5pdV7uwy5F0f4oT3sbN8pUf/aGZxhmyE11V3sYWtWcmCX2FdR/AjI9Lp7WKTKUkVu/81g+gATjwGrX15F2HPX2TDcEUVZqHieSDhOJLF+STnA2IUoeVmmd9eTL29IGcy+7IegoPelKPJ8vFQW3AArpysLKMt2TzD81j3siGTVhwElIHGtjvoL89kTvsQT2h3nQQoz0zX9zp3/ixgSFs98bxsk3IFUSvkxD/DmxQv6b65bs2Ug3Dn9OFLpGrC7f1m8L65myEQDvISdcVDQ9GYFa7KpN81yGepc71YYqgWnjCfPFcV7pbz7AN9SKaxU6mpKRJmKtlKMbmbjOhodKkb9+XgNc+MdHVGpfXUmqch/DrBErczbXDMTqYxlCtWzNvQNp/EwxN+ijnT6zbh+C3YaWv2RzRXDb9t77GgynE3itr3t+NdrdVFTIE9fPROw3kLU+xMWTMAMxlPyNBbh+L8Phg7S9nhZvrMp5poWwuxfVcrM0P9LkxR3j5XBM6ZI6H6Q9OJeIWCXUJSTuTvw7qkQ608eoIYmQ7P3+Q9PgtqPcOb9CbH7RiKKHn9RJhocNl+9p6K58s8Q6VBo+DUgWYd4W4rl3KiT2omMWU408+qpl/kk5YZ9ESoLYAp0RzIipmzCwCzkGmfCP0Y3ajVryRmWLik=
- serviceKey: AgBJErW8aqMLENNAEHTOYnoALoHRBezVYPe2x7igujHZQZnVQGp+D+ibfxOSV0ABDxgnvB321+3hgPXLF7xyJbfbMzrznfopVUTFWsAAoRzGo4rZRa/GY9hB92yzw1HGJVol+PW/sM45wqPikHslvofbn0qA5p9aGih8Jgu5/cN0dS70kRvyeDQ/p2a2q7o2bPGPjj2ruJw7MHE+4lCGfO6zOZxqK5C1c3gK3nLfl5hIM594FPSBo3QwikXJAu8cNcRvL3QnUes2czBJV74EkYnjBSSn+rb06r8yfoRKxa9kKj7WsDahX+X6iPFuF10vgCyY0k77pVNHYBv6h2hjJiLdFIV0kIXfbNoa1ngOn6ShJpI4zPAjIr6Pmb5/8kjXr3IcPYCgUjgndeTjPsJScpUgKPZFM4/pMNRkZzm7WKHo8Et0IZVF8qNB1ibYGMDERruwGCYkeJZ+1XvixqbJdcroNTQwTUR0xTrrJ2JjgUNRLz4SnjypRm4JNwGrPa+ktndCWIA+OOGs1YurAbYAaGl9LsyCUudXgxxcd+Mz9GIR+fAgUkHI7LDiG5ydZGQn+tYtp7t8Xj5VHD5utE1hsn70jNk9SFTeujq+vWEoYAYWLTLxEUjcPs7VSmUMln8mRYTtmdLHi9cJaMTvLNJ9tH3B0ML51NYxQWeqTtO6NQVmByVARbZ4vv4qmOlmOU5GMSq/CrK/NYZKdB9E9zeikEmuP8psR+/LyAeY01uHqQXy9hiOSo50ye5LKKODGT8tGVV9tirBheQopBjnu7HWdySMMJabdn+pDnPKPB4cIxdEMIwLqNIYx8uVCigB2RoLQ90t4amC/90uhoeiXzWHNqP+rpICKcqeISmPvpOhgYal2QQtjVWULS7YkZ0K3+uHdmo7qcHCcFkPXlteDXFchJdn1gO4yyZgw6QPjq7gPKa+a+0CnAw+o4I0b8CA/NWIsNw=
- secret: AgAWbzPcjupyVggoEe2XeENe2R3vW/k9TAMeLitIQ99gcMygaF3c8dMRKCra4k+62ZgIsKfHAwVJVnWUXzRdZn4BuYmXzL9TpvCQz+9WGJ/FBWMa7JEDE9BfZ285QQLax0udEHCGzKz6hQXu2Eu622honjU/sU8DcMr2cqf6MY3XnIpZDdcMe2KVXl+HD92nR3OI/4KxlEJZbY4q7nbDKmOH7EcMcwoOEiYN/lRTMoCHjQ0rhNGc34DRsMUgCgqVV9++6xwmHegSdO9m9t5GUcK7CfrHeZG0mqbNqBBrha2LnA/kQ4GTHv8C/fn2BGYslx4tYbRcEJmkzqG6HdCQ8v8lG03eKS5tgJcqTM/5IopyzBZ5Tk3F44Qrb7flKhu2+PdZxcswtjLlOEn23EikdCLyslVyePzzNhpT4LPu70ELB7C8QhcLs74DcJGWC/YeVCvUwuzbdK0U0GMiQwiwEBHXr+uR1KMD5JbCNxxP/SRYXtvSNudA+JZSF49H736J/1t9YjCZVeyQ6XgeDEBV84QjbgX8Sb6ilGSvaMlIDSDdQf+LrTJNRAbSsHFP3DyRxDRCdtTC3dIwUxwGv/cGA+ZDWyk4HOzSx3SyR09qN6OmYLlloXTWRtHay/fl1J0WEHPfh0U/LjEJ62cYo2kyTHXQKdbU6NA6930HOx1EUPPkVuSjseAtLZqpLg0ED8gbRgtA7+cbUoeYXat8OWAAcIw0u//boaBCG2oMcKWAjOZlR8uPwJQwB2ur
-
+ anonKey: AgAH1EbikjAvyiDA8HIxF/syah8Sn3OyMKLS79huadKCJ77U1QvG6zuxoVMZIPfLynE0K9RiDJ79E6hDdJmzXOImP92NCj6WreaunYctRZEUoGYo15Ls04PXC8JlCMpwu8PQOV7GaADcvYJ7MebuPvbX72SixnB9c9KJnRVVZDx4Dw60+Wf9G8ASzEInHL1npPXvJ+nnddgUCZ3NjHp/DVpRniXUtgaeLtISYhCf9Ric/cHkaLaI/SNXezVfjSps3S12YyN6LdddR/8+XePE0Nfrfbwi1mawOWSagsfWSzGMAja2foOsxqJNgJsb3NpuPDBpYzIKjj/sPpOU/VRm5tXfkMIAelYUO3f3LQ+uvOswIPxuZ2pfTtH1nHFC19BLiuYEO/Ev1kTyvb8Rl3Al0TC7bHHK2/m0hzIsyilFYomLh674krgPUbN0T/8i8J4b0fnuJdZQHwQohFgRcD49fUGSrkUUsL3lB17JBF9EhgA+ixa9sbSnCVMhZcCMlneRP+c1Tt6ybymb/4Zl+aPz22gZSU09FkhP1rBMWDMXNF6XCCIjb205kvUpR6VQtw7+xUxV/KhUp9ezyWpMRPvyVvnd5xNT5hJ4yWwcQCcpZ6C5uJUisIlCjtRHhJg59qkCgBcBxoL4IoNfaA794XbJVc7lYTrRtUWjl35d/LxKshILk4ifhO4EPQ6HNd5I9thyQb6NFPvbtnb6+7F/E37p9eGIqIi3/mnpp8I373rCsubUSs+r3cGDTHSwRi4IIFRjswnL1W7QDWE68Z1ewcti7j0TMsby0XQU4nXUSByaLAKvTBUNlxutZPxJSRylA/4v0/OgsQ+DQp00gblaEPu7jnaOwhvxuaP7W42rmCi90MyHvQElgiOooEOyTVaX6PGvogs4VmWyARs8Nw0t1JhqhulAIgcRS8rf0XWxuYuuHtjlQDl6/VHSvQyKPcri1HVGUKc=
+ secret: AgAfKqiE07XFRFLfsAwN8dzG4pQ+mUYhdG2cx5ANqcojMX32ICYNhbS1Z5OnMY6Nt849k7gc3PDWPCUM/ctm85s90hsJD6voFPp8EhIfvG2FCFbAhvl1ME635h7zQdNsxXO1wUV/W/zjEl3sbHrp+/SOfCCoU3MNohMFZ1Z6UxnlOQNILyaUB/QZbzSsOHgmIvOJj/aPaHVHfvR/xnA55v+CjD+WhxpFYcT2Wl1OED9IwP0vB++jtM/YSm1kqCRy/VPrwgMib0YXQRAYGwExW8zcsT2kAl8nnNOS3nlUzU+N51p4A2UjQtxOo5oUARIATk2TTgPKdkeskIcJx05w8CDIGaKAr1LARuosS52HxFdmURIm9eXlmXXFbZwM+vYlWBFBdWXAIMhemSfFn0+wwPRlfPI+2F6Ruj5eY9fYRwlW0NiuTDrEcAyScL8meAIfaTRnAsCvyawreuOSJ6X5BsBGEupQ7CiTosi9g+If952mkMlmYQxC1Y16DBK2sRyacFrlJISiyQA75YqjzJVTACCh9BumEs0KvWIbMs9Pg+0iQcJioMYn3Vmp4C4qaX4DHTOufpgrXRYtjnQ5BAc7C1RNMl3giDit78NrrICPdJHu/Lb3YYYunLEelhSCddtks7CP389Oeaam5/pRHKBSA+M9uF/J/49RXaiss+HD9kSSFNuGXMM9DYgdmj6hpGRc46Yflq32pI7Vbmp5T3YrzHI9XSwBjo3cy7u8qPUrkw7I2jRWxnj8pLCW
+ serviceKey: AgAiYBv/W/o+7d1da8j730MOlXdWW2mQAd16MFgCD/PzgCBDm9NKlb1tsw0tvn6ILeRsV8oQGiMojklfP/Ve5CNli8eiYgsD/GSq9Wuosh5Ehnlg9B2OjpEk/9w1Mrv9dZZ15QdSclC1E3PJ3ZpM/tPv5DkWXsjKrZfRBnmT4GEIYU6pbN5Psz5DczVYWPSfnj8sd4KtfCrDht8+wJ7uR/NYUjatKLT8aPy9T5crNwuW+FFCp/K8YjZF+WxcYgP3nVn4177Vgj/PYNStPJjGXynBJ/C4DND7ZGneMPeWg0+RvwpFPhpbmGbE+ASwv3NQ8QOHall3sx6bmzFOfPAT+bUrh2U+xsgvzxrLGRlvCNO56wssaECqXJwCz7KvoKuM4s92yTb960m1d1mZQk02/xIrMiO3zSx5Y83qpgNqpczUa6uvu3rLZudTP/ruPBcCCbVpBBnOKQzpE9q4uEai1uoUxRrsIIx+FYXZMkJmeehsJoNNFGcLPrqDVFv9VQgB4aCL1jNRIcEsIaKWVDg1CqPYL5yGr2mMOlBaOv6xFcbgYNV1nUPQmIDmvtJ7nSPeI7RrZa8XSM1wgrCE+/0FwKNN2xA9vONS3rUZhpt6ohvFoZTG2StpbDMqUTZ+fkDFP8TTav3IaPhgZ8WdWUwU++s9In0UxyqlIz2WS/CG0L7cuudD1gwJHYF/IRf6VPV367yb8Ey60u8VisOcPcOwGotJ3Jb6wg0NfREPNlbZE1EelxQhgrAsTYKGWXzNIIe+6c7aXxvrRNNMG8eGSaS8TugFAO4J2t/C4ee2fMfocxtZaTuGt+CiOYPK5tpsgVuAocEdU5isoJH8iG37aJcteZMuHBcixBWKrzYtOgTpnixu2Gn6VydOZvgXnXMo/EFxKu23hYC4HYXJExyqliDSd1673oI8G4Cr/6xjbha8PiAEvc2LkggdEo4HANu11VcDpp8c/IFR2T5fdSw1Fw==
+ template:
+ metadata:
+ name: supabase-secret-jwt
+ namespace: supabase
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
@@ -94,12 +97,12 @@ spec:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
- name: hcaptcha
- namespace: supabase
+ name: hcaptcha
+ namespace: supabase
spec:
- encryptedData:
- secret: AgBrE41GDd9m9NCXkLpJlQRUzQWYZsGuxDHdhPHNZELiCKlyRDRHGaSdbQOMcS/+cjCzrobDJMCTocdL+GqmjMpXRRl2SvyrhTutfBgt+ujOBfy/4XHnlGCxOYRDVruyI15h6W8/PIT3DvLcUiNy1DE+36HSFUOkrIC6o6OHqgUsZYBVgn7xSe+YZzU3eWcd3HPzdPvaHZT92JOn2mR2SBVP7dUatUTgZ12opnkbRFn8nXZNwd2ce4ed+zJxNl2ZqoQHIFcmZXDQkEttdUILUVxkbtgAlbkhJFIKjSP2nkkQfH0j9Ef7fq7KZ7K2+iF51ZNWbtv4QW3ck9JdfjFY4+1xK13l99zURVIY2CJ0LV0FY7+QqxfxgGzJ27t+qo4b83bTJIoLomyioH2PfFijghZlBCtF3cCYNAubODY+dCKjMYbtrv5tuG766w6s/J2P4j3jvYAfMGZCmpiZHMFuL5Oyft24jwz7+aeJdwsX5zNNTUs3VxddJhTSc0ZhCSIG7stcDVKdhX1Oj5+tr7nrJKbat1fkmZForoBf9pofKEYqGlciIHxvZERXKYJGTWFew0MC88vD2nK9W1PoA24K9F0KY68OhgGXgQ0QQc15Hm/v4h7Qdm1pVDl5YlqslyPq6RzCGPa1RyPP9YHQEE5AewCrgu+8dfCcA6RzCJ85mppen41/h8swez27IzDXX8HyW9VQ80667fvPIYLkjNWOniAaeruS9wJkaRBvXdZXPADeWZXLSg==
- template:
- metadata:
- name: hcaptcha
- namespace: supabase
\ No newline at end of file
+ encryptedData:
+ secret: AgBrE41GDd9m9NCXkLpJlQRUzQWYZsGuxDHdhPHNZELiCKlyRDRHGaSdbQOMcS/+cjCzrobDJMCTocdL+GqmjMpXRRl2SvyrhTutfBgt+ujOBfy/4XHnlGCxOYRDVruyI15h6W8/PIT3DvLcUiNy1DE+36HSFUOkrIC6o6OHqgUsZYBVgn7xSe+YZzU3eWcd3HPzdPvaHZT92JOn2mR2SBVP7dUatUTgZ12opnkbRFn8nXZNwd2ce4ed+zJxNl2ZqoQHIFcmZXDQkEttdUILUVxkbtgAlbkhJFIKjSP2nkkQfH0j9Ef7fq7KZ7K2+iF51ZNWbtv4QW3ck9JdfjFY4+1xK13l99zURVIY2CJ0LV0FY7+QqxfxgGzJ27t+qo4b83bTJIoLomyioH2PfFijghZlBCtF3cCYNAubODY+dCKjMYbtrv5tuG766w6s/J2P4j3jvYAfMGZCmpiZHMFuL5Oyft24jwz7+aeJdwsX5zNNTUs3VxddJhTSc0ZhCSIG7stcDVKdhX1Oj5+tr7nrJKbat1fkmZForoBf9pofKEYqGlciIHxvZERXKYJGTWFew0MC88vD2nK9W1PoA24K9F0KY68OhgGXgQ0QQc15Hm/v4h7Qdm1pVDl5YlqslyPq6RzCGPa1RyPP9YHQEE5AewCrgu+8dfCcA6RzCJ85mppen41/h8swez27IzDXX8HyW9VQ80667fvPIYLkjNWOniAaeruS9wJkaRBvXdZXPADeWZXLSg==
+ template:
+ metadata:
+ name: hcaptcha
+ namespace: supabase
From fd31b4b07d5b706a28367d80932dafd362792b80 Mon Sep 17 00:00:00 2001
From: Fudster <5642609+Fudster@users.noreply.github.com>
Date: Wed, 8 Jan 2025 19:32:15 -0500
Subject: [PATCH 25/28] Add categories validator
https://github.com/fastapi/sqlmodel/issues/453
---
apps/pydiscordsh/pydiscordsh/api/schema.py | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
index 2800238f2..b579c988c 100644
--- a/apps/pydiscordsh/pydiscordsh/api/schema.py
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -1,6 +1,7 @@
from typing import Optional, List
import os
from sqlmodel import Field, Session, SQLModel, create_engine, select, JSON, Column
+from pydantic import validator
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
@@ -38,6 +39,13 @@ class DiscordServer(SQLModel, table=True):
class Config:
arbitrary_types_allowed = True
+ validate_assignment = True
+
+ @validator("categories", pre=True, always=True)
+ def validate_categories(cls, value):
+ if value and len(value) > 2:
+ raise ValueError("Categories list cannot have more than 2 items.")
+ return value
# class BumpVote(SQLModel, table=False)
From 165fdfffaab0700e91ab80fec595c3333a345267 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 19:33:09 -0500
Subject: [PATCH 26/28] ci(pydiscordsh): adding the dockerhub image release
---
.github/workflows/ci-alpha.yml | 63 +++++++++++++++++++++
apps/kbve.com/src/content/journal/01-08.mdx | 6 ++
2 files changed, 69 insertions(+)
diff --git a/.github/workflows/ci-alpha.yml b/.github/workflows/ci-alpha.yml
index 0a9b9f86c..202f03a54 100644
--- a/.github/workflows/ci-alpha.yml
+++ b/.github/workflows/ci-alpha.yml
@@ -73,6 +73,7 @@ jobs:
kilonet: ${{ steps.delta.outputs.kilonet_any_changed }}
rustrareicongameserver: ${{ steps.delta.outputs.rustrareicongameserver_any_changed }}
kanban: ${{ steps.delta.outputs.kanban_any_changed }}
+ pydiscordsh: ${{ steps.delta.outputs.pydiscordsh_any_changed }}
steps:
- name: Checkout the repository using git
@@ -105,6 +106,8 @@ jobs:
- 'apps/rust_rareicon_gameserver/README.md'
kanban:
- 'apps/rust_kanban/README.md'
+ pydiscordsh
+ - 'apps/pydiscordsh/README.md'
expo-lcagents-web-build:
needs: ['alter', 'globals']
@@ -259,6 +262,66 @@ jobs:
itchUsername: kbve
itchGameId: rareicon
buildChannel: webgl
+ python_discordsh:
+ needs: ['alter', 'globals']
+ if: needs.alter.outputs.pydiscordsh == 'true'
+ name: PyDiscordSH Docker
+ runs-on: 'ubuntu-latest'
+ permissions:
+ contents: read
+ packages: write
+ # id-token: write
+ steps:
+ - name: Checkout the monorepo using git
+ uses: actions/checkout@v4
+
+ - name: Setup Node v20
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v3
+ with:
+ version: 9
+ run_install: false
+
+ - name: Get pnpm Store
+ shell: bash
+ run: |
+ echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
+
+ - name: Setup pnpm Cache
+ uses: actions/cache@v4
+ with:
+ path: ${{ env.STORE_PATH }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install pnpm dependencies
+ shell: bash
+ run: |
+ pnpm install
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Build PyDiscordSH container with Nx
+ env:
+ INPUT_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ pnpm nx run pydiscordsh:container --configuration=production --push
+
rust_kanban:
needs: ['alter', 'globals']
if: needs.alter.outputs.kanban == 'true'
diff --git a/apps/kbve.com/src/content/journal/01-08.mdx b/apps/kbve.com/src/content/journal/01-08.mdx
index ae156d72e..9478c3b39 100644
--- a/apps/kbve.com/src/content/journal/01-08.mdx
+++ b/apps/kbve.com/src/content/journal/01-08.mdx
@@ -39,6 +39,12 @@ tags:
Once we update the sealed secret, I will add another seal inside of the new `discordsh` namespace, which will then grab that information and use it.
Our goal would then be to migrate some of the user-defined functions directly to the supabase, including the JWT/Auth.
+- 07:32PM
+
+ **DockerHub**
+
+ Next on the agenda will be to add in the dockerhub image for DiscordSH!
+ After it gets added, we can move forward with building out the helm chart and we should be good to go!
## 2024
From 509bc678b71b605ce109f775d04a06e6529f3c71 Mon Sep 17 00:00:00 2001
From: h0lybyte <5599058+h0lybyte@users.noreply.github.com>
Date: Wed, 8 Jan 2025 19:53:34 -0500
Subject: [PATCH 27/28] ci(pydiscordsh): updating the alpha pipeline, forgot a
semicolon.
---
.github/workflows/ci-alpha.yml | 2 +-
apps/kbve.com/src/content/journal/01-08.mdx | 1 +
apps/pydiscordsh/README.md | 4 ++--
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/ci-alpha.yml b/.github/workflows/ci-alpha.yml
index 202f03a54..8144ac334 100644
--- a/.github/workflows/ci-alpha.yml
+++ b/.github/workflows/ci-alpha.yml
@@ -106,7 +106,7 @@ jobs:
- 'apps/rust_rareicon_gameserver/README.md'
kanban:
- 'apps/rust_kanban/README.md'
- pydiscordsh
+ pydiscordsh:
- 'apps/pydiscordsh/README.md'
expo-lcagents-web-build:
diff --git a/apps/kbve.com/src/content/journal/01-08.mdx b/apps/kbve.com/src/content/journal/01-08.mdx
index 9478c3b39..7fe2854bc 100644
--- a/apps/kbve.com/src/content/journal/01-08.mdx
+++ b/apps/kbve.com/src/content/journal/01-08.mdx
@@ -45,6 +45,7 @@ tags:
Next on the agenda will be to add in the dockerhub image for DiscordSH!
After it gets added, we can move forward with building out the helm chart and we should be good to go!
+ That was a quick fix to the docker build, next we want to prepare the discord shell build.
## 2024
diff --git a/apps/pydiscordsh/README.md b/apps/pydiscordsh/README.md
index 769f92f83..92c531596 100644
--- a/apps/pydiscordsh/README.md
+++ b/apps/pydiscordsh/README.md
@@ -1,3 +1,3 @@
-# pydiscordsh
+# PyDiscordSh
-Project description here.
+This is a `/v1/` of the Discord.sh API.
From eb0576a943be0fbce8485150b08bbb1834bb70b0 Mon Sep 17 00:00:00 2001
From: Fudster <5642609+Fudster@users.noreply.github.com>
Date: Wed, 8 Jan 2025 19:55:35 -0500
Subject: [PATCH 28/28] feat(pydiscordsh): adding youtube validation
---
apps/pydiscordsh/pydiscordsh/api/schema.py | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/apps/pydiscordsh/pydiscordsh/api/schema.py b/apps/pydiscordsh/pydiscordsh/api/schema.py
index b579c988c..ee59cae96 100644
--- a/apps/pydiscordsh/pydiscordsh/api/schema.py
+++ b/apps/pydiscordsh/pydiscordsh/api/schema.py
@@ -1,5 +1,5 @@
from typing import Optional, List
-import os
+import os, re
from sqlmodel import Field, Session, SQLModel, create_engine, select, JSON, Column
from pydantic import validator
@@ -46,6 +46,18 @@ def validate_categories(cls, value):
if value and len(value) > 2:
raise ValueError("Categories list cannot have more than 2 items.")
return value
+
+ @validator("video", pre=True, always=True)
+ def validate_video(cls, value):
+ youtube_url_pattern = r"(https?://(?:www\.)?(?:youtube\.com/(?:[^/]+/)*[^/]+(?:\?v=|\/)([a-zA-Z0-9_-]{11}))|youtu\.be/([a-zA-Z0-9_-]{11}))"
+
+ if value:
+ match = re.match(youtube_url_pattern, value)
+ if match:
+ return match.group(2) if match.group(2) else match.group(3)
+ if len(value) == 11 and re.match(r"^[a-zA-Z0-9_-]{11}$", value):
+ return value
+ raise ValueError("Invalid YouTube video ID or URL.")
# class BumpVote(SQLModel, table=False)