started adding DB
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
|
.env
|
||||||
|
|||||||
121
inventory.json
121
inventory.json
@@ -112,8 +112,8 @@
|
|||||||
"name": "Magnesium Taurate",
|
"name": "Magnesium Taurate",
|
||||||
"quantity": 180,
|
"quantity": 180,
|
||||||
"quantityUnits": "caps",
|
"quantityUnits": "caps",
|
||||||
"servingUnit": "caps",
|
"servingUnit": "mg",
|
||||||
"numUnitsInServing": 1,
|
"numUnitsInServing": 125,
|
||||||
"numBottles": 1
|
"numBottles": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -400,8 +400,8 @@
|
|||||||
"name": "Lithium Orotate Drops",
|
"name": "Lithium Orotate Drops",
|
||||||
"quantity": 59,
|
"quantity": 59,
|
||||||
"quantityUnits": "ml",
|
"quantityUnits": "ml",
|
||||||
"servingUnit": "mg",
|
"servingUnit": "mcg",
|
||||||
"numUnitsInServing": 1,
|
"numUnitsInServing": 1000,
|
||||||
"numBottles": 1
|
"numBottles": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -409,8 +409,8 @@
|
|||||||
"name": "Liquid Iodine Plus",
|
"name": "Liquid Iodine Plus",
|
||||||
"quantity": 59,
|
"quantity": 59,
|
||||||
"quantityUnits": "ml",
|
"quantityUnits": "ml",
|
||||||
"servingUnit": "mcg",
|
"servingUnit": "ml",
|
||||||
"numUnitsInServing": 125,
|
"numUnitsInServing": 0.126,
|
||||||
"numBottles": 1
|
"numBottles": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -449,5 +449,112 @@
|
|||||||
"orderDate": "2024-02-03",
|
"orderDate": "2024-02-03",
|
||||||
"numBottles": 1
|
"numBottles": 1
|
||||||
},
|
},
|
||||||
{"orderDate":"2014-02-04T23:00:00.000Z","name":"Ashwagandha","quantity":120,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":300,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Crucera-SGS","quantity":60,"quantityUnits":"caps","servingUnit":"caps","numUnitsInServing":1,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"High Absorption CoQ10 with BioPerine","quantity":120,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":100,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Ultimate Omega","quantity":640,"quantityUnits":"mg per Soft Gel","servingUnit":"mg","numUnitsInServing":1280,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Genistein from Sophora Japonica","quantity":60,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":125,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Ginger Root","quantity":100,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":550,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Glucosamine Sulfate","quantity":240,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":750,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Glycine","quantity":250,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":1000,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Liquid Iodine Plus","quantity":59,"quantityUnits":"ml","servingUnit":"ml","numUnitsInServing":0.126,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Super K","quantity":90,"quantityUnits":"caps","servingUnit":"mcg","numUnitsInServing":1500,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Lithium","quantity":100,"quantityUnits":"caps","servingUnit":"mcg","numUnitsInServing":1000,"numBottles":1},{"orderDate":"2014-02-04T23:00:00.000Z","name":"Hyaluronic Acid","quantity":30,"quantityUnits":"caps","servingUnit":"mg","numUnitsInServing":200,"numBottles":1}
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Ashwagandha",
|
||||||
|
"quantity": 120,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 300,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Crucera-SGS",
|
||||||
|
"quantity": 60,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "caps",
|
||||||
|
"numUnitsInServing": 1,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "High Absorption CoQ10 with BioPerine",
|
||||||
|
"quantity": 120,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 100,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Ultimate Omega",
|
||||||
|
"quantity": 640,
|
||||||
|
"quantityUnits": "mg per Soft Gel",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 1280,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Genistein from Sophora Japonica",
|
||||||
|
"quantity": 60,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 125,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Ginger Root",
|
||||||
|
"quantity": 100,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 550,
|
||||||
|
"numBottles": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Glucosamine Sulfate",
|
||||||
|
"quantity": 240,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 750,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Glycine",
|
||||||
|
"quantity": 250,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 1000,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Liquid Iodine Plus",
|
||||||
|
"quantity": 59,
|
||||||
|
"quantityUnits": "ml",
|
||||||
|
"servingUnit": "ml",
|
||||||
|
"numUnitsInServing": 0.126,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Super K",
|
||||||
|
"quantity": 90,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mcg",
|
||||||
|
"numUnitsInServing": 1500,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Lithium",
|
||||||
|
"quantity": 100,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mcg",
|
||||||
|
"numUnitsInServing": 1000,
|
||||||
|
"numBottles": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderDate": "2024-02-04T23:00:00.000Z",
|
||||||
|
"name": "Hyaluronic Acid",
|
||||||
|
"quantity": 30,
|
||||||
|
"quantityUnits": "caps",
|
||||||
|
"servingUnit": "mg",
|
||||||
|
"numUnitsInServing": 200,
|
||||||
|
"numBottles": 2
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
351
poetry.lock
generated
351
poetry.lock
generated
@@ -1,5 +1,16 @@
|
|||||||
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "annotated-types"
|
||||||
|
version = "0.6.0"
|
||||||
|
description = "Reusable constraint types to use with typing.Annotated"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"},
|
||||||
|
{file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "astroid"
|
name = "astroid"
|
||||||
version = "3.0.2"
|
version = "3.0.2"
|
||||||
@@ -95,6 +106,77 @@ files = [
|
|||||||
graph = ["objgraph (>=1.7.2)"]
|
graph = ["objgraph (>=1.7.2)"]
|
||||||
profile = ["gprof2dot (>=2022.7.29)"]
|
profile = ["gprof2dot (>=2022.7.29)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "greenlet"
|
||||||
|
version = "3.0.3"
|
||||||
|
description = "Lightweight in-process concurrent programming"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"},
|
||||||
|
{file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"},
|
||||||
|
{file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"},
|
||||||
|
{file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"},
|
||||||
|
{file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"},
|
||||||
|
{file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"},
|
||||||
|
{file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"},
|
||||||
|
{file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["Sphinx", "furo"]
|
||||||
|
test = ["objgraph", "psutil"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "isort"
|
name = "isort"
|
||||||
version = "5.13.2"
|
version = "5.13.2"
|
||||||
@@ -166,6 +248,47 @@ files = [
|
|||||||
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
|
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mysql-connector-python"
|
||||||
|
version = "8.3.0"
|
||||||
|
description = "MySQL driver written in Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "mysql-connector-python-8.3.0.tar.gz", hash = "sha256:e4ff23aa8036b4c5b6463fa81398bb5a528a29f99955de6ba937f0bba57a2fe3"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f4ee7e07cca6b744874d60d6b0b24817d9246eb4e8d7269b7ddbe68763a0bd13"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:5718e426cf67f041772d4984f709052201883f74190ba6feaddce5cbd3b99e6f"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0deb38f05057e12af091a48e03a1ff00e213945880000f802879fae5665e7502"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp310-cp310-manylinux_2_17_x86_64.whl", hash = "sha256:4be4165e4cd5acb4659261ddc74e9164d2dfa0d795d5695d52f2bf39ea0762fa"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:51d97bf771519829797556718d81e8b9bdcd0a00427740ca57c085094c8bde17"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:5e2c86c60be08c71bae755d811fe8b89ec4feb8117ec3440ebc6c042dd6f06bc"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:de74055944b214bff56e1752ec213d705c421414c67a250fb695af0c5c214135"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b2901391b651d60dab3cc8985df94976fc1ea59fa7324c5b19d0a4177914c8dd"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp311-cp311-manylinux_2_17_x86_64.whl", hash = "sha256:55cb57d8098c721abce20fdef23232663977c0e5c87a4d0f9f73466f32c7d168"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:201e609159b84a247be87b76f5deb79e8c6b368e91f043790e62077f13f3fed8"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:c57d02fd6c28be444487e7905ede09e3fecb18377cf82908ca262826369d3401"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:9302d774025e76a0fac46bfeea8854b3d6819715a6a16ff23bfcda04218a76b7"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:85fa878fdd6accaeb7d609bd2637c2cfa61592e7f9bdbdc0da18b2fa998d3d5a"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp312-cp312-manylinux_2_17_x86_64.whl", hash = "sha256:de0f2f2baa9e091ca8bdc4a091f874f9cd0b84b256389596adb0e032a05fe9f9"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:27f8be2087627366a44a6831ec68b568c98dbf0f4ceff24682d90c21db6e0f1f"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:ec6dc3434a7deef74ab04e8978f6c5e181866a5423006c1b5aec5390a189d28d"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:73ee8bc5f9626c42b37342a91a825cddb3461f6bfbbd6524d8ccfd3293aaa088"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp38-cp38-manylinux_2_17_x86_64.whl", hash = "sha256:1db5b48b4ff7d24344217ed2418b162c7677eec86ab9766dc0e5feae39c90974"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:77bae496566d3da77bb0e938d89243103d20ee41633f626a47785470451bf45c"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:f7acacdf9fd4260702f360c00952ad9a9cc73e8b7475e0d0c973c085a3dd7b7d"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:5f707a9b040ad4700fc447ba955c78b08f2dd5affde37ac2401918f7b6daaba3"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:125714c998a697592bc56cce918a1acc58fadc510a7f588dbef3e53a1920e086"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp39-cp39-manylinux_2_17_x86_64.whl", hash = "sha256:7f4f5fa844c19ee3a78c4606f6e138b06829e75469592d90246a290c7befc322"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:de5c3ee89d9276356f93df003949d3ba4c486f32fec9ec9fd7bc0caab124d89c"},
|
||||||
|
{file = "mysql_connector_python-8.3.0-py2.py3-none-any.whl", hash = "sha256:e868ccc7ad9fbc242546db04673d89cee87d12b8139affd114524553df4e5d6a"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dns-srv = ["dnspython (>=1.16.0,<=2.3.0)"]
|
||||||
|
fido2 = ["fido2 (==1.1.2)"]
|
||||||
|
gssapi = ["gssapi (>=1.6.9,<=1.8.2)"]
|
||||||
|
opentelemetry = ["Deprecated (>=1.2.6)", "typing-extensions (>=3.7.4)", "zipp (>=0.5)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "packaging"
|
name = "packaging"
|
||||||
version = "23.2"
|
version = "23.2"
|
||||||
@@ -203,6 +326,116 @@ files = [
|
|||||||
docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
|
docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
|
||||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
|
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pydantic"
|
||||||
|
version = "2.6.1"
|
||||||
|
description = "Data validation using Python type hints"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"},
|
||||||
|
{file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
annotated-types = ">=0.4.0"
|
||||||
|
pydantic-core = "2.16.2"
|
||||||
|
typing-extensions = ">=4.6.1"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
email = ["email-validator (>=2.0.0)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pydantic-core"
|
||||||
|
version = "2.16.2"
|
||||||
|
description = ""
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"},
|
||||||
|
{file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"},
|
||||||
|
{file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"},
|
||||||
|
{file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pygments"
|
name = "pygments"
|
||||||
version = "2.17.2"
|
version = "2.17.2"
|
||||||
@@ -242,6 +475,20 @@ tomlkit = ">=0.10.1"
|
|||||||
spelling = ["pyenchant (>=3.2,<4.0)"]
|
spelling = ["pyenchant (>=3.2,<4.0)"]
|
||||||
testutils = ["gitpython (>3)"]
|
testutils = ["gitpython (>3)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dotenv"
|
||||||
|
version = "1.0.1"
|
||||||
|
description = "Read key-value pairs from a .env file and set them as environment variables"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
|
||||||
|
{file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
cli = ["click (>=5.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rich"
|
name = "rich"
|
||||||
version = "13.7.0"
|
version = "13.7.0"
|
||||||
@@ -286,6 +533,108 @@ files = [
|
|||||||
{file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"},
|
{file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sqlalchemy"
|
||||||
|
version = "2.0.25"
|
||||||
|
description = "Database Abstraction Library"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"},
|
||||||
|
{file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"},
|
||||||
|
{file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
greenlet = {version = "!=0.4.17", markers = "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)"]
|
||||||
|
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.14"
|
||||||
|
description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7,<4.0"
|
||||||
|
files = [
|
||||||
|
{file = "sqlmodel-0.0.14-py3-none-any.whl", hash = "sha256:accea3ff5d878e41ac439b11e78613ed61ce300cfcb860e87a2d73d4884cbee4"},
|
||||||
|
{file = "sqlmodel-0.0.14.tar.gz", hash = "sha256:0bff8fc94af86b44925aa813f56cf6aabdd7f156b73259f2f60692c6a64ac90e"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pydantic = ">=1.10.13,<3.0.0"
|
||||||
|
SQLAlchemy = ">=2.0.0,<2.1.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.10.2"
|
version = "0.10.2"
|
||||||
@@ -343,4 +692,4 @@ files = [
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.12"
|
python-versions = "^3.12"
|
||||||
content-hash = "4d919c3abe892130917c89f930787d3465a604a90ebd7a6b618bc2483abb5653"
|
content-hash = "79f33e8ba6a5c94a5af2c291bedb84d6131bd7bde31396e2f4348c1fdacfa3b2"
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ python = "^3.12"
|
|||||||
rich = "^13.7.0"
|
rich = "^13.7.0"
|
||||||
typer = "^0.9.0"
|
typer = "^0.9.0"
|
||||||
toml = "^0.10.2"
|
toml = "^0.10.2"
|
||||||
|
sqlmodel = "^0.0.14"
|
||||||
|
mysql-connector-python = "^8.3.0"
|
||||||
|
python-dotenv = "^1.0.1"
|
||||||
|
|
||||||
|
|
||||||
[tool.poetry.group.dev.dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
|
|||||||
38
src/sup/_configs_to_sql.py
Normal file
38
src/sup/_configs_to_sql.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from dataclasses import asdict
|
||||||
|
import json
|
||||||
|
import pathlib as pl
|
||||||
|
import tomllib
|
||||||
|
|
||||||
|
from sup.commands import add_user_supp_consumption
|
||||||
|
from sup.models import Supp
|
||||||
|
from sup.queries import get_product_id_from_alias
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_inventory_to_sql():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_supps_consumption_toml_to_sql():
|
||||||
|
toml = tomllib.loads(pl.Path('supps.toml').read_text())
|
||||||
|
for sup in toml["supps"]:
|
||||||
|
si = Supp(**sup)
|
||||||
|
si_dict = asdict(si)
|
||||||
|
name = si_dict['name']
|
||||||
|
del si_dict['name']
|
||||||
|
product_id = get_product_id_from_alias(name)
|
||||||
|
|
||||||
|
add_user_supp_consumption(**si_dict)
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_config_to_sql():
|
||||||
|
"""fill every x days and last fill"""
|
||||||
|
...
|
||||||
|
|
||||||
|
def transfer_aliases_to_sql():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
transfer_config_to_sql()
|
||||||
|
transfer_aliases_to_sql()
|
||||||
|
transfer_supps_consumption_toml_to_sql()
|
||||||
|
transfer_inventory_to_sql()
|
||||||
148
src/sup/_create_tables.py
Normal file
148
src/sup/_create_tables.py
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
import atexit
|
||||||
|
import os
|
||||||
|
|
||||||
|
import mysql.connector
|
||||||
|
from mysql.connector import errorcode
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
DB_NAME = os.getenv("PLANETSCALE_DATABASE")
|
||||||
|
|
||||||
|
cnx = mysql.connector.connect(
|
||||||
|
user=os.getenv("PLANETSCALE_USERNAME"),
|
||||||
|
password=os.getenv("PLANETSCALE_PW"),
|
||||||
|
host=os.getenv("PLANETSCALE_HOST"),
|
||||||
|
database=DB_NAME,
|
||||||
|
)
|
||||||
|
cursor = cnx.cursor()
|
||||||
|
|
||||||
|
def close_everything():
|
||||||
|
cnx.close()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
atexit.register(close_everything)
|
||||||
|
|
||||||
|
|
||||||
|
def do_query(create_statement: str) -> None:
|
||||||
|
try:
|
||||||
|
table_name = create_statement.lower().split("create table ")[1].split(" ")[0]
|
||||||
|
except IndexError:
|
||||||
|
table_name = create_statement.lower().split("drop table ")[1].split(" ")[0]
|
||||||
|
print(f"{table_name=}")
|
||||||
|
print(create_statement)
|
||||||
|
try:
|
||||||
|
cursor.execute(create_statement)
|
||||||
|
except mysql.connector.Error as err:
|
||||||
|
if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
|
||||||
|
print("already exists.")
|
||||||
|
else:
|
||||||
|
print(err.msg)
|
||||||
|
return
|
||||||
|
print(f"created table '{table_name}'")
|
||||||
|
|
||||||
|
|
||||||
|
def create_table_users():
|
||||||
|
query = ("""
|
||||||
|
create table users (
|
||||||
|
id VARCHAR(80) NOT NULL,
|
||||||
|
pw_hash VARCHAR(64) NOT NULL,
|
||||||
|
first_name VARCHAR(50) NOT NULL,
|
||||||
|
last_name VARCHAR(50) NOT NULL,
|
||||||
|
fill_every_x_days INTEGER NOT NULL,
|
||||||
|
last_fill_date DATE NOT NULL,
|
||||||
|
CONSTRAINT pk_user PRIMARY KEY (id)
|
||||||
|
)""").strip()
|
||||||
|
do_query(query)
|
||||||
|
|
||||||
|
|
||||||
|
def create_table_products():
|
||||||
|
query = ("""
|
||||||
|
create table products (
|
||||||
|
id INT NOT NULL AUTO_INCREMENT,
|
||||||
|
name VARCHAR(150) NOT NULL,
|
||||||
|
quantity INT NOT NULL,
|
||||||
|
quantity_units ENUM('caps', 'mg', 'g', 'ml', 'mcg', 'iu'),
|
||||||
|
serving_units ENUM('caps', 'mg', 'g', 'ml', 'mcg', 'iu'),
|
||||||
|
num_units_in_serving INT NOT NULL,
|
||||||
|
CONSTRAINT pk_product PRIMARY KEY (id)
|
||||||
|
)""").strip()
|
||||||
|
do_query(query)
|
||||||
|
|
||||||
|
|
||||||
|
def create_table_product_aliases():
|
||||||
|
query = ("""
|
||||||
|
create table user_product_aliases (
|
||||||
|
user_id VARCHAR(80) NOT NULL,
|
||||||
|
product_id INT NOT NULL,
|
||||||
|
alias VARCHAR(30) NOT NULL,
|
||||||
|
CONSTRAINT fk_product_alias_user_id FOREIGN KEY (user_id) REFERENCES users(id),
|
||||||
|
CONSTRAINT fk_product_alias_product_id FOREIGN KEY (product_id) REFERENCES products(id),
|
||||||
|
CONSTRAINT pk_user_product_alias PRIMARY KEY (user_id, product_id, alias)
|
||||||
|
)""").strip()
|
||||||
|
do_query(query)
|
||||||
|
|
||||||
|
|
||||||
|
def create_table_user_supplements_consumption():
|
||||||
|
query = ("""
|
||||||
|
create table user_supplements_consumption (
|
||||||
|
user_id VARCHAR(80) NOT NULL,
|
||||||
|
product_id INT NOT NULL,
|
||||||
|
morning INT DEFAULT 0,
|
||||||
|
lunch INT NULL,
|
||||||
|
dinner INT NULL,
|
||||||
|
bedtime INT NULL,
|
||||||
|
days_per_week INT DEFAULT 7,
|
||||||
|
units ENUM('caps', 'mg', 'g', 'ml', 'mcg', 'iu'),
|
||||||
|
winter_only BOOL DEFAULT false,
|
||||||
|
CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id),
|
||||||
|
CONSTRAINT fk_product_id FOREIGN KEY (product_id) REFERENCES products(id),
|
||||||
|
CONSTRAINT pk_user_supplement_consumption PRIMARY KEY (user_id, product_id, morning)
|
||||||
|
)""").strip().replace("\n", "")
|
||||||
|
do_query(query)
|
||||||
|
|
||||||
|
|
||||||
|
def create_table_user_supplements_inventory():
|
||||||
|
query = ("""
|
||||||
|
create table user_supplements_orders (
|
||||||
|
user_id VARCHAR(80) NOT NULL,
|
||||||
|
product_id INT NOT NULL,
|
||||||
|
order_date DATE NOT NULL,
|
||||||
|
num_bottles INT NOT NULL,
|
||||||
|
CONSTRAINT fk_user_supplements_orders_user_id FOREIGN KEY (user_id) REFERENCES users(id),
|
||||||
|
CONSTRAINT fk_user_supplements_orders_product_id FOREIGN KEY (product_id) REFERENCES products(id),
|
||||||
|
CONSTRAINT pk_user_supplement_order PRIMARY KEY (user_id, product_id, order_date)
|
||||||
|
)""").strip()
|
||||||
|
do_query(query)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def create_tables1():
|
||||||
|
try:
|
||||||
|
create_table_users()
|
||||||
|
except Exception:
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
create_table_products()
|
||||||
|
except Exception:
|
||||||
|
do_query("drop table users")
|
||||||
|
return
|
||||||
|
|
||||||
|
def create_tables2():
|
||||||
|
# try:
|
||||||
|
# create_table_user_supplements_consumption()
|
||||||
|
# except Exception:
|
||||||
|
# return
|
||||||
|
# create_table_user_supplements_inventory()
|
||||||
|
create_table_product_aliases()
|
||||||
|
|
||||||
|
def drop_tables():
|
||||||
|
do_query("drop table users")
|
||||||
|
do_query("drop table products")
|
||||||
|
do_query("drop table user_supplements_consumption")
|
||||||
|
do_query("drop table user_supplements_orders")
|
||||||
|
|
||||||
|
|
||||||
|
# drop_tables()
|
||||||
|
create_tables2()
|
||||||
@@ -1,13 +1,3 @@
|
|||||||
"""
|
|
||||||
{'orderDate': '2024-01-04T23:00:00.000Z',
|
|
||||||
'name': 'Naturally Sourced Vitamin E',
|
|
||||||
'quantity': 100,
|
|
||||||
'quantityUnits': 'caps',
|
|
||||||
'servingUnit': 'mg',
|
|
||||||
'numUnitsInServing': 134,
|
|
||||||
'numBottles': 2}]
|
|
||||||
"""
|
|
||||||
|
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
import json
|
import json
|
||||||
import math
|
import math
|
||||||
@@ -22,10 +12,11 @@ from sup.main import (
|
|||||||
load_config,
|
load_config,
|
||||||
SUPP_CONSUMPTION_FP,
|
SUPP_CONSUMPTION_FP,
|
||||||
load_inventory,
|
load_inventory,
|
||||||
Supp,
|
|
||||||
CONFIG,
|
CONFIG,
|
||||||
ALIASES_REV,
|
ALIASES_REV,
|
||||||
)
|
)
|
||||||
|
from sup.models import Supp
|
||||||
|
|
||||||
|
|
||||||
app = typer.Typer()
|
app = typer.Typer()
|
||||||
|
|
||||||
@@ -38,19 +29,37 @@ class Missing(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def get_qty_inventory(supp: Supp, inventory: dict, next_fill_date: dt.date) -> int:
|
def get_qty_inventory(supp: Supp, inventories: list[dict], next_fill_date: dt.date, last_fill_date: dt.date) -> int:
|
||||||
inventory_order_date = dt.datetime.strptime(
|
inv = 0
|
||||||
inventory["orderDate"][:10], "%Y-%m-%d"
|
CHECKING = ("broccomax", "glycine", "ginger root")
|
||||||
).date()
|
for inventory in inventories:
|
||||||
num_days_since_bought = (next_fill_date - inventory_order_date).days
|
inventory_order_date = dt.datetime.strptime(
|
||||||
if inventory["servingUnit"] != supp.units:
|
inventory["orderDate"][:10], "%Y-%m-%d"
|
||||||
raise UnitMismatch(inventory, supp)
|
).date()
|
||||||
|
if inventory_order_date > last_fill_date:
|
||||||
|
num_days_since_bought = 0
|
||||||
|
else:
|
||||||
|
num_days_since_bought = (next_fill_date - inventory_order_date).days
|
||||||
|
if supp.name in CHECKING:
|
||||||
|
print()
|
||||||
|
print(supp.name)
|
||||||
|
print(f"{inventory_order_date=}")
|
||||||
|
print(f"{num_days_since_bought=}")
|
||||||
|
if inventory["servingUnit"] != supp.units:
|
||||||
|
raise UnitMismatch(inventory, supp)
|
||||||
|
supply_units = inventory["quantity"] * inventory["numBottles"] * inventory["numUnitsInServing"]
|
||||||
|
if supp.name in CHECKING:
|
||||||
|
print(f"{supply_units=}")
|
||||||
|
|
||||||
inv = (
|
inv += supply_units - (supp * num_days_since_bought)
|
||||||
inventory["quantity"] * inventory["numBottles"] * inventory["numUnitsInServing"]
|
if inv < 0 and (
|
||||||
) - (supp * num_days_since_bought)
|
last_fill_date > inventory_order_date
|
||||||
if inv < 0:
|
or (next_fill_date - last_fill_date).days > 9 * 30
|
||||||
return 0
|
):
|
||||||
|
inv = 0
|
||||||
|
if supp.name in CHECKING:
|
||||||
|
print(f"{inv=} for {supp.name=}")
|
||||||
|
print()
|
||||||
return inv
|
return inv
|
||||||
|
|
||||||
|
|
||||||
@@ -93,9 +102,14 @@ def status():
|
|||||||
config = load_config()
|
config = load_config()
|
||||||
|
|
||||||
num_days_of_inventory_needed = config["FILL_EVERY_X_DAYS"]
|
num_days_of_inventory_needed = config["FILL_EVERY_X_DAYS"]
|
||||||
next_fill_date = dt.datetime.strptime(config["LAST_FILL_DATE"], "%Y-%m-%d").date() + dt.timedelta(
|
|
||||||
num_days_of_inventory_needed
|
last_fill_date = dt.datetime.strptime(
|
||||||
)
|
config["LAST_FILL_DATE"], "%Y-%m-%d"
|
||||||
|
).date()
|
||||||
|
next_fill_date = last_fill_date + dt.timedelta(num_days_of_inventory_needed)
|
||||||
|
print()
|
||||||
|
print(f"{next_fill_date=}")
|
||||||
|
print()
|
||||||
inventory = load_inventory()
|
inventory = load_inventory()
|
||||||
|
|
||||||
needs = []
|
needs = []
|
||||||
@@ -112,16 +126,17 @@ def status():
|
|||||||
qty_needed = sup_inst * num_days_of_inventory_needed
|
qty_needed = sup_inst * num_days_of_inventory_needed
|
||||||
|
|
||||||
try:
|
try:
|
||||||
inv = inventory[sup_inst.name.lower()]
|
invs = inventory[sup_inst.name.lower()]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
print(f"no hit for key '{sup_inst.name}'")
|
print(f"no hit for key '{sup_inst.name}'")
|
||||||
qty_of_inventory = 0
|
qty_of_inventory = 0
|
||||||
needs.append((sup_inst.name, 0, float('inf')))
|
needs.append((sup_inst.name, 0, float("inf")))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
qty_of_inventory = get_qty_inventory(sup_inst, inv, next_fill_date)
|
qty_of_inventory = get_qty_inventory(sup_inst, invs, next_fill_date, last_fill_date)
|
||||||
|
|
||||||
net_need = int(qty_needed - qty_of_inventory)
|
net_need = int(qty_needed - qty_of_inventory)
|
||||||
|
inv = invs[-1]
|
||||||
if net_need > 0:
|
if net_need > 0:
|
||||||
num_units_needed = net_need / inv["numUnitsInServing"] # type: ignore
|
num_units_needed = net_need / inv["numUnitsInServing"] # type: ignore
|
||||||
num_bottles_needed = int(math.ceil(num_units_needed / inv["quantity"])) # type: ignore
|
num_bottles_needed = int(math.ceil(num_units_needed / inv["quantity"])) # type: ignore
|
||||||
@@ -141,11 +156,11 @@ def status():
|
|||||||
|
|
||||||
@app.command()
|
@app.command()
|
||||||
def fill():
|
def fill():
|
||||||
"""reset 'next fill' clock"""
|
"""reset 'next fill' clock to today"""
|
||||||
validate_matches()
|
validate_matches()
|
||||||
config = load_config()
|
config = load_config()
|
||||||
today = dt.date.today()
|
today = dt.date.today()
|
||||||
config["LAST_FILL_DATE"] = today.strftime('%Y-%m-%d')
|
config["LAST_FILL_DATE"] = today.strftime("%Y-%m-%d")
|
||||||
fill_every_x_days = config["FILL_EVERY_X_DAYS"]
|
fill_every_x_days = config["FILL_EVERY_X_DAYS"]
|
||||||
save_config(config)
|
save_config(config)
|
||||||
print(
|
print(
|
||||||
@@ -189,6 +204,10 @@ def save_ordered_supps(ordered_supps: list[dict]) -> None:
|
|||||||
ORDERED_SUPPS_FP.write_text(json.dumps(ordered_supps, indent=2))
|
ORDERED_SUPPS_FP.write_text(json.dumps(ordered_supps, indent=2))
|
||||||
|
|
||||||
|
|
||||||
|
def _prettify_json():
|
||||||
|
ORDERED_SUPPS_FP.write_text(json.dumps(json.loads(ORDERED_SUPPS_FP.read_text()), indent=2))
|
||||||
|
|
||||||
|
|
||||||
def save_config(config: dict) -> None:
|
def save_config(config: dict) -> None:
|
||||||
SUPP_CONSUMPTION_FP.write_text(toml.dumps(config))
|
SUPP_CONSUMPTION_FP.write_text(toml.dumps(config))
|
||||||
|
|
||||||
|
|||||||
19
src/sup/commands.py
Normal file
19
src/sup/commands.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import datetime as dt
|
||||||
|
|
||||||
|
from sup.sql_funcs import do_query
|
||||||
|
|
||||||
|
|
||||||
|
def create_user(email: str, pw_hash: str, first_name: str, last_name: str, last_fill_date: dt.date, fill_every_x_days=30):
|
||||||
|
do_query(
|
||||||
|
"insert into users (id, pw_hash, first_name, last_name, last_fill_date, fill_every_x_days) values "
|
||||||
|
f"('{email}', '{pw_hash}', '{first_name}', '{last_name}', '{last_fill_date}', '{fill_every_x_days}')"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_user_supp_consumption(user_id: str, product_id: int, morning: int, lunch: int, dinner: int, bedtime: int, days_per_week: int, units: str, winter_only: bool):
|
||||||
|
do_query(
|
||||||
|
"insert into user_supplements_consumption "
|
||||||
|
"(user_id, product_id, morning, lunch, dinner, bedtime, days_per_week, units, winter_only) values ("
|
||||||
|
f"('{user_id}', {product_id}, {morning}, {lunch}, {dinner}, {bedtime}, {days_per_week}, '{units}', {winter_only}"
|
||||||
|
")"
|
||||||
|
)
|
||||||
@@ -4,12 +4,11 @@ TODO:
|
|||||||
special case: K Complex has K1, MK-4 and MK-7 in it
|
special case: K Complex has K1, MK-4 and MK-7 in it
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import collections
|
||||||
import json
|
import json
|
||||||
import pathlib as pl
|
import pathlib as pl
|
||||||
import tomllib
|
import tomllib
|
||||||
|
|
||||||
from sup.models import Supp
|
|
||||||
|
|
||||||
|
|
||||||
ORDERED_SUPPS_FP = pl.Path("inventory.json")
|
ORDERED_SUPPS_FP = pl.Path("inventory.json")
|
||||||
SUPP_CONSUMPTION_FP = pl.Path("supps.toml")
|
SUPP_CONSUMPTION_FP = pl.Path("supps.toml")
|
||||||
@@ -37,8 +36,8 @@ ALIASES_REV = {v: k for k, v in ALIASES.items()}
|
|||||||
|
|
||||||
|
|
||||||
def load_inventory():
|
def load_inventory():
|
||||||
return {
|
inventory = collections.defaultdict(list)
|
||||||
ALIASES[s["name"]]: s
|
for s in load_ordered_supps():
|
||||||
for s in load_ordered_supps()
|
if s["name"] not in CONFIG["discontinued"]:
|
||||||
if s["name"] not in CONFIG["discontinued"]
|
inventory[ALIASES[s["name"]]].append(s)
|
||||||
}
|
return inventory
|
||||||
|
|||||||
@@ -20,5 +20,7 @@ class Supp:
|
|||||||
def quantity_per_day(self) -> float:
|
def quantity_per_day(self) -> float:
|
||||||
return (
|
return (
|
||||||
sum([self.morning, self.lunch, self.dinner, self.bedtime])
|
sum([self.morning, self.lunch, self.dinner, self.bedtime])
|
||||||
* self.days_per_week / 7
|
* self.days_per_week
|
||||||
|
/ 7
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
10
src/sup/queries.py
Normal file
10
src/sup/queries.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from sup.sql_funcs import do_query
|
||||||
|
|
||||||
|
|
||||||
|
class NoResult(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_product_id_from_alias(alias: str):
|
||||||
|
res = do_query(f"select
|
||||||
|
raise NoResult(f"no product_id for alias '{alias}'")
|
||||||
15
src/sup/scripts/create_user.py
Normal file
15
src/sup/scripts/create_user.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import datetime as dt
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
from sup.commands import create_user
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
email = input('email? ')
|
||||||
|
pw = input('pw? ')
|
||||||
|
first_name = input('first name? ')
|
||||||
|
last_name = input('last name? ')
|
||||||
|
pw_hash = hashlib.new("SHA256")
|
||||||
|
pw_hash.update(pw.encode())
|
||||||
|
create_user(email, pw_hash.hexdigest(), first_name, last_name, dt.date.today(), 30)
|
||||||
|
print("okay, created user")
|
||||||
34
src/sup/sql_funcs.py
Normal file
34
src/sup/sql_funcs.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import atexit
|
||||||
|
import os
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
import mysql.connector
|
||||||
|
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
DB_NAME = os.getenv("PLANETSCALE_DATABASE")
|
||||||
|
|
||||||
|
cnx = mysql.connector.connect(
|
||||||
|
user=os.getenv("PLANETSCALE_USERNAME"),
|
||||||
|
password=os.getenv("PLANETSCALE_PW"),
|
||||||
|
host=os.getenv("PLANETSCALE_HOST"),
|
||||||
|
database=DB_NAME,
|
||||||
|
)
|
||||||
|
cursor = cnx.cursor()
|
||||||
|
|
||||||
|
def close_everything():
|
||||||
|
cnx.close()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
atexit.register(close_everything)
|
||||||
|
|
||||||
|
|
||||||
|
def do_query(query: str) -> None:
|
||||||
|
try:
|
||||||
|
cursor.execute(query)
|
||||||
|
except mysql.connector.Error as err:
|
||||||
|
print(err.msg)
|
||||||
|
raise
|
||||||
|
# TODO: return something if appropriate
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
discontinued = [ "NAD+ Cell Regenerator", "Fisetin with Novusetin", "Fisetin Novusetin", "Collagen",]
|
discontinued = [ "Magnesium Taurate +", "NAD+ Cell Regenerator", "Fisetin with Novusetin", "Fisetin Novusetin", "Collagen",]
|
||||||
FILL_EVERY_X_DAYS = 30
|
FILL_EVERY_X_DAYS = 30
|
||||||
LAST_FILL_DATE = "2024-01-16"
|
LAST_FILL_DATE = "2024-01-16"
|
||||||
[[supps]]
|
[[supps]]
|
||||||
|
|||||||
Reference in New Issue
Block a user