From 82d41b856c5226de09abbc7d1b54ab3cab98c543 Mon Sep 17 00:00:00 2001 From: Philip Nuzhnyi Date: Tue, 17 Sep 2024 09:43:24 +0100 Subject: [PATCH] test todo app --- test_todo_app/README.md | 17 + test_todo_app/favicon.ico | Bin 0 -> 15406 bytes test_todo_app/main.py | 8 + test_todo_app/picovars.css | 2 + test_todo_app/poetry.lock | 812 +++++++++++++++++++++++++++++ test_todo_app/pyproject.toml | 16 + test_todo_app/tests/__init__.py | 0 test_todo_app/tests/conftest.py | 10 + test_todo_app/tests/test_routes.py | 32 ++ test_todo_app/todo_screenshot.png | Bin 0 -> 116711 bytes test_todo_app/todos.py | 56 ++ 11 files changed, 953 insertions(+) create mode 100644 test_todo_app/README.md create mode 100644 test_todo_app/favicon.ico create mode 100644 test_todo_app/main.py create mode 100644 test_todo_app/picovars.css create mode 100644 test_todo_app/poetry.lock create mode 100644 test_todo_app/pyproject.toml create mode 100644 test_todo_app/tests/__init__.py create mode 100644 test_todo_app/tests/conftest.py create mode 100644 test_todo_app/tests/test_routes.py create mode 100644 test_todo_app/todo_screenshot.png create mode 100644 test_todo_app/todos.py diff --git a/test_todo_app/README.md b/test_todo_app/README.md new file mode 100644 index 0000000..783d385 --- /dev/null +++ b/test_todo_app/README.md @@ -0,0 +1,17 @@ +# Testing FastHTML Todo App + +This project implements a few simple unit tests for [FastHTML Todo list application](https://github.com/AnswerDotAI/fasthtml-example/tree/main/01_todo_app) using Pytest and [FastHTML Client](https://docs.fastht.ml/api/core.html#client). + + +When running in test mode, the app now relies on a in-memory instance of Sqlite to make sure data is reset on every run. Test client and database table instance are defined as Pytest fixtures in `tests/conftest.py`. + +## Running Locally + +To run the app locally: + +1. Clone the repository +2. Navigate to the project directory +3. Run `poetry install` to install dependencies +4. Run the following command: `poetry run python main.py` +5. To run tests, use `poetry run pytest tests` + diff --git a/test_todo_app/favicon.ico b/test_todo_app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8d9f7f308bfc8045848721d4755b46feb49039fb GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/test_todo_app/main.py b/test_todo_app/main.py new file mode 100644 index 0000000..66db36b --- /dev/null +++ b/test_todo_app/main.py @@ -0,0 +1,8 @@ +from fasthtml.common import * +from todos import create_app + +# actual app creation process moved to todos.py +# this way we can support different modes of the app (i.e. dev, test) +# you can further extend create_app to support a more fine-grained configuration +app, _ = create_app() +serve() diff --git a/test_todo_app/picovars.css b/test_todo_app/picovars.css new file mode 100644 index 0000000..fbaa2db --- /dev/null +++ b/test_todo_app/picovars.css @@ -0,0 +1,2 @@ +:root { --pico-font-size: 100%; } + diff --git a/test_todo_app/poetry.lock b/test_todo_app/poetry.lock new file mode 100644 index 0000000..dce926f --- /dev/null +++ b/test_todo_app/poetry.lock @@ -0,0 +1,812 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastcore" +version = "1.7.8" +description = "Python supercharged for fastai development" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastcore-1.7.8-py3-none-any.whl", hash = "sha256:446c9e787965f81f27b22d771b46d5b0af822469aab4382ff9181420455d879d"}, + {file = "fastcore-1.7.8.tar.gz", hash = "sha256:59b8e2becf9cd8a7c700b9d1f50d2f01134a086b95a5214155ffe3f476a443aa"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +dev = ["llms-txt", "matplotlib", "nbclassic", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "pysymbol-llm", "torch"] + +[[package]] +name = "fastlite" +version = "0.0.11" +description = "A bit of extra usability for sqlite" +optional = false +python-versions = ">=3.10" +files = [ + {file = "fastlite-0.0.11-py3-none-any.whl", hash = "sha256:66984ab849ae41d85d205fba3e057c24e967525184f9ecbd7536761f5551392d"}, + {file = "fastlite-0.0.11.tar.gz", hash = "sha256:3ba61eeb510b14952c24ddc69947bff79324524d0e47dfb91ff1d8fe1492adfe"}, +] + +[package.dependencies] +fastcore = ">=1.7.1" +sqlite-minutils = ">=3.37" + +[[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 = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[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,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.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 = "*" +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 = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.8" +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pytest" +version = "8.3.3" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[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 = "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]] +name = "python-fasthtml" +version = "0.6.0" +description = "The fastest way to create an HTML app" +optional = false +python-versions = ">=3.10" +files = [ + {file = "python-fasthtml-0.6.0.tar.gz", hash = "sha256:3e2791ea4aa28973afed516f86eb215223249355593697c92caabc41f7587a50"}, + {file = "python_fasthtml-0.6.0-py3-none-any.whl", hash = "sha256:c12068f1562df7eee85d4d4db779ef638c3db6c62a6a2e54bcf75d571e6d5657"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +fastcore = ">=1.7.8" +fastlite = ">=0.0.9" +httpx = "*" +itsdangerous = "*" +oauthlib = "*" +python-dateutil = "*" +python-multipart = "*" +starlette = ">0.33" +uvicorn = {version = ">=0.30", extras = ["standard"]} + +[package.extras] +dev = ["ipython", "lxml", "pysymbol-llm"] + +[[package]] +name = "python-multipart" +version = "0.0.9" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] + +[package.extras] +dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "sqlite-minutils" +version = "3.37.0.post3" +description = "A fork of sqlite-utils with CLI etc removed" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sqlite-minutils-3.37.0.post3.tar.gz", hash = "sha256:d7f8db1581ef4e8e6d507ad8998f3c0ad574c507e36715818017108c0814a1e6"}, + {file = "sqlite_minutils-3.37.0.post3-py3-none-any.whl", hash = "sha256:1990e1d44263914abcb23d8c87163925739b43110923d2263e383cabbb271cc3"}, +] + +[package.dependencies] +fastcore = "*" + +[[package]] +name = "starlette" +version = "0.38.5" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.38.5-py3-none-any.whl", hash = "sha256:632f420a9d13e3ee2a6f18f437b0a9f1faecb0bc42e1942aa2ea0e379a4c4206"}, + {file = "starlette-0.38.5.tar.gz", hash = "sha256:04a92830a9b6eb1442c766199d62260c3d4dc9c4f9188360626b1e0273cb7077"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "uvicorn" +version = "0.30.6" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.30.6-py3-none-any.whl", hash = "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"}, + {file = "uvicorn-0.30.6.tar.gz", hash = "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "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 = "uvloop" +version = "0.20.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9ebafa0b96c62881d5cafa02d9da2e44c23f9f0cd829f3a32a6aff771449c996"}, + {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35968fc697b0527a06e134999eef859b4034b37aebca537daeb598b9d45a137b"}, + {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b16696f10e59d7580979b420eedf6650010a4a9c3bd8113f24a103dfdb770b10"}, + {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b04d96188d365151d1af41fa2d23257b674e7ead68cfd61c725a422764062ae"}, + {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94707205efbe809dfa3a0d09c08bef1352f5d3d6612a506f10a319933757c006"}, + {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89e8d33bb88d7263f74dc57d69f0063e06b5a5ce50bb9a6b32f5fcbe655f9e73"}, + {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037"}, + {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9"}, + {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e"}, + {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756"}, + {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0"}, + {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, + {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0e94b221295b5e69de57a1bd4aeb0b3a29f61be6e1b478bb8a69a73377db7ba"}, + {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fee6044b64c965c425b65a4e17719953b96e065c5b7e09b599ff332bb2744bdf"}, + {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:265a99a2ff41a0fd56c19c3838b29bf54d1d177964c300dad388b27e84fd7847"}, + {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10c2956efcecb981bf9cfb8184d27d5d64b9033f917115a960b83f11bfa0d6b"}, + {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e7d61fe8e8d9335fac1bf8d5d82820b4808dd7a43020c149b63a1ada953d48a6"}, + {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2beee18efd33fa6fdb0976e18475a4042cd31c7433c866e8a09ab604c7c22ff2"}, + {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8c36fdf3e02cec92aed2d44f63565ad1522a499c654f07935c8f9d04db69e95"}, + {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0fac7be202596c7126146660725157d4813aa29a4cc990fe51346f75ff8fde7"}, + {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0fba61846f294bce41eb44d60d58136090ea2b5b99efd21cbdf4e21927c56a"}, + {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95720bae002ac357202e0d866128eb1ac82545bcf0b549b9abe91b5178d9b541"}, + {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36c530d8fa03bfa7085af54a48f2ca16ab74df3ec7108a46ba82fd8b411a2315"}, + {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e97152983442b499d7a71e44f29baa75b3b02e65d9c44ba53b10338e98dedb66"}, + {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "watchfiles" +version = "0.24.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0"}, + {file = "watchfiles-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e"}, + {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c"}, + {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188"}, + {file = "watchfiles-0.24.0-cp310-none-win32.whl", hash = "sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735"}, + {file = "watchfiles-0.24.0-cp310-none-win_amd64.whl", hash = "sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, + {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, + {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, + {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, + {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, + {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, + {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, + {file = "watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48"}, + {file = "watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f"}, + {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b"}, + {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18"}, + {file = "watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07"}, + {file = "watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366"}, + {file = "watchfiles-0.24.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318"}, + {file = "watchfiles-0.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91"}, + {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b"}, + {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22"}, + {file = "watchfiles-0.24.0-cp38-none-win32.whl", hash = "sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1"}, + {file = "watchfiles-0.24.0-cp38-none-win_amd64.whl", hash = "sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1"}, + {file = "watchfiles-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886"}, + {file = "watchfiles-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9"}, + {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca"}, + {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e"}, + {file = "watchfiles-0.24.0-cp39-none-win32.whl", hash = "sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da"}, + {file = "watchfiles-0.24.0-cp39-none-win_amd64.whl", hash = "sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, + {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "13.0.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448"}, + {file = "websockets-13.0.1-cp310-cp310-win32.whl", hash = "sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3"}, + {file = "websockets-13.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df"}, + {file = "websockets-13.0.1-cp311-cp311-win32.whl", hash = "sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f"}, + {file = "websockets-13.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237"}, + {file = "websockets-13.0.1-cp312-cp312-win32.whl", hash = "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185"}, + {file = "websockets-13.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2"}, + {file = "websockets-13.0.1-cp313-cp313-win32.whl", hash = "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb"}, + {file = "websockets-13.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb"}, + {file = "websockets-13.0.1-cp38-cp38-win32.whl", hash = "sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4"}, + {file = "websockets-13.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d"}, + {file = "websockets-13.0.1-cp39-cp39-win32.whl", hash = "sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58"}, + {file = "websockets-13.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980"}, + {file = "websockets-13.0.1-py3-none-any.whl", hash = "sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817"}, + {file = "websockets-13.0.1.tar.gz", hash = "sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "832d3ed76799b2a182cd9dc21ac9ae5e760f17bc16b847159e6258512c0e3f4e" diff --git a/test_todo_app/pyproject.toml b/test_todo_app/pyproject.toml new file mode 100644 index 0000000..6d82960 --- /dev/null +++ b/test_todo_app/pyproject.toml @@ -0,0 +1,16 @@ +[tool.poetry] +name = "test-todo-app" +version = "0.1.0" +description = "Test a FastHTML app" +authors = ["Philip Nuzhnyi "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +python-fasthtml = "^0.6.0" +pytest = "^8.3.3" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/test_todo_app/tests/__init__.py b/test_todo_app/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test_todo_app/tests/conftest.py b/test_todo_app/tests/conftest.py new file mode 100644 index 0000000..ed647ee --- /dev/null +++ b/test_todo_app/tests/conftest.py @@ -0,0 +1,10 @@ +import pytest +from typing import Tuple +from fasthtml.common import Client, Table +from todos import create_app + +@pytest.fixture +def test_client_and_database() -> Tuple[Client, Table]: + """test_client_and_database will be available to all test functions in the project""" + app, todos = create_app(mode="test") + return Client(app=app), todos diff --git a/test_todo_app/tests/test_routes.py b/test_todo_app/tests/test_routes.py new file mode 100644 index 0000000..c793106 --- /dev/null +++ b/test_todo_app/tests/test_routes.py @@ -0,0 +1,32 @@ +def test_landing_page(test_client_and_database): + client, todos = test_client_and_database + res = client.get("/") + assert res.status_code == 200 + assert "Todo list" in res.text + assert todos.count == 0 + +def test_adding_new_todo(test_client_and_database): + client, todos = test_client_and_database + res = client.post("/", data={"title": "Test Todo"}) + assert res.status_code == 200 + assert todos.count == 1 + assert todos.get(1).title == "Test Todo" + +def test_updating_existing_todo(test_client_and_database): + client, todos = test_client_and_database + todos.insert({"title": "Test Todo"}) + + res = client.put("/", data={"id": 1, "title": "Updated Todo", "done": 1}) + assert res.status_code == 200 + + assert todos.count == 1 + assert todos.get(1).title == "Updated Todo" + assert todos.get(1).done == True + +def test_deleting_existing_todo(test_client_and_database): + client, todos = test_client_and_database + todos.insert({"title": "Test Todo"}) + + res = client.delete("/todos/1") + assert res.status_code == 200 + assert todos.count == 0 diff --git a/test_todo_app/todo_screenshot.png b/test_todo_app/todo_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..72fe820a0e899c9b9e468c12dc604451fb115ca9 GIT binary patch literal 116711 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μ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 literal 0 HcmV?d00001 diff --git a/test_todo_app/todos.py b/test_todo_app/todos.py new file mode 100644 index 0000000..a5dbb05 --- /dev/null +++ b/test_todo_app/todos.py @@ -0,0 +1,56 @@ +from fasthtml.common import * +from typing import Literal, Tuple + +def create_app(mode: Literal["dev", "test"] = "dev") -> Tuple[FastHTML, Table]: + app,rt,todos,Todo = fast_app( + 'data/todos.db' if mode == 'dev' else ':memory:', + hdrs=[Style(':root { --pico-font-size: 100%; }')], + id=int, title=str, done=bool, pk='id') + + id_curr = 'current-todo' + def tid(id): return f'todo-{id}' + + @patch + def __ft__(self:Todo): + show = AX(self.title, f'/todos/{self.id}', id_curr) + edit = AX('edit', f'/edit/{self.id}' , id_curr) + dt = ' ✅' if self.done else '' + return Li(show, dt, ' | ', edit, id=tid(self.id)) + + def mk_input(**kw): return Input(id="new-title", name="title", placeholder="New Todo", required=True, **kw) + + @rt("/") + def get(): + add = Form(Group(mk_input(), Button("Add")), + hx_post="/", target_id='todo-list', hx_swap="beforeend") + card = Card(Ul(*todos(), id='todo-list'), + header=add, footer=Div(id=id_curr)), + title = 'Todo list' + return Title(title), Main(H1(title), card, cls='container') + + @rt("/todos/{id}") + def delete(id:int): + todos.delete(id) + return clear(id_curr) + + @rt("/") + def post(todo:Todo): return todos.insert(todo), mk_input(hx_swap_oob='true') + + @rt("/edit/{id}") + def get(id:int): + res = Form(Group(Input(id="title"), Button("Save")), + Hidden(id="id"), CheckboxX(id="done", label='Done'), + hx_put="/", target_id=tid(id), id="edit") + return fill_form(res, todos.get(id)) + + @rt("/") + def put(todo: Todo): return todos.upsert(todo), clear(id_curr) + + @rt("/todos/{id}") + def get(id:int): + todo = todos.get(id) + btn = Button('delete', hx_delete=f'/todos/{todo.id}', + target_id=tid(todo.id), hx_swap="outerHTML") + return Div(Div(todo.title), btn) + + return app, todos