diff --git a/Dockerfile b/Dockerfile index 0d1d2cffb..314525470 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,11 +14,17 @@ WORKDIR /app RUN apt-get update -y && \ apt-get install -y python-pip python-dev git --no-install-recommends && \ rm -rf /var/lib/apt/lists/* && \ - pip install -r requirements.txt + curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \ + cd /usr/local/bin && \ + ln -s /opt/poetry/bin/poetry && \ + poetry config virtualenvs.create false + +COPY ./pyproject.toml ./app/poetry.lock* /app/ COPY ./mealie /app +RUN poetry install --no-root -no-dev COPY --from=build-stage /app/dist /app/dist -RUN rm -rf /app/test /app/temp +RUN rm -rf /app/test /app/.temp ENV ENV prod ENV APP_MODULE "app:app" diff --git a/Dockerfile.arm b/Dockerfile.arm new file mode 100644 index 000000000..01063984e --- /dev/null +++ b/Dockerfile.arm @@ -0,0 +1,30 @@ +FROM node:lts-alpine as build-stage +WORKDIR /app +COPY ./frontend/package*.json ./ +RUN npm install +COPY ./frontend/ . +RUN npm run build + +FROM mrnr91/uvicorn-gunicorn-fastapi:python3.8 + + +COPY ./requirements.txt /app/requirements.txt + +WORKDIR /app + +RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \ + cd /usr/local/bin && \ + ln -s /opt/poetry/bin/poetry && \ + poetry config virtualenvs.create false + +COPY ./pyproject.toml ./app/poetry.lock* /app/ + +COPY ./mealie /app +RUN poetry install --no-root +COPY --from=build-stage /app/dist /app/dist +RUN rm -rf /app/test /app/.temp + +ENV ENV prod +ENV APP_MODULE "app:app" + +VOLUME [ "/app/data" ] diff --git a/dev/dev-notes.md b/dev/dev-notes.md index ebf5aaf3d..7cb8c8258 100644 --- a/dev/dev-notes.md +++ b/dev/dev-notes.md @@ -24,13 +24,17 @@ Documentation - [ ] New Roadmap / Milestones Frontend -- [ ] Prep / Cook / Total Time Indicator + Editor +- [x] Prep / Cook / Total Time Indicator + Editor - [ ] No Meal Today Page instead of Null - [ ] Recipe Print Page - [ ] Recipe Editor Data Validation Client Side - [ ] Organize Home Page my Category, ideally user selectable. - [ ] Advanced Search Page, draft started -- [ ] Search Bar Re-design + - [ ] Filter by Category + - [ ] Filter by Tags +- [ ] Search Bar redesign + - [x] Initial + - [ ] Results redesign - [ ] Replace Backups card with something like Home Assistant - [x] Replace import card with something like Home Assistant - [x] Select which imports to do @@ -43,7 +47,7 @@ Backend - [x] Settings - [x] Themes - [x] Remove Print / Debug Code -- [ ] Support how to Sections and how to steps +- [ ] Support how to sections and how to steps - [ ] Recipe request by category/tags @@ -51,23 +55,3 @@ SQL - [ ] Setup Database Migrations # Draft Changelog -## v0.0.2 - -Bug Fixes -- Fixed opacity issues with marked steps - [mtoohey31](https://github.com/mtoohey31) -- Fixed hot-reloading development environment - [grssmnn](https://github.com/grssmnn) -- Fixed recipe not saving without image -- Fixed parsing error on image property null - -General Improvements -- Added Confirmation component to deleting recipes - [zackbcom](https://github.com/zackbcom) -- Updated Theme backend - [zackbcom](https://github.com/zackbcom) -- Added Persistent storage to vuex - [zackbcom](https://github.com/zackbcom) -- General Color/Theme Improvements - - More consistent UI - - More minimalist coloring -- Added API Key Extras to Recipe Data - - Users can now add custom json key/value pairs to all recipes via the editor for access in 3rd part applications. For example users can add a "message" field in the extras that can be accessed on API calls to play a message over google home. -- Improved image rendering (nearly x2 speed) -- Improved documentation + API Documentation -- Improved recipe parsing diff --git a/dev/manual_tests.md b/dev/manual_tests.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docker-compose.arm.yml b/docker-compose.arm.yml new file mode 100644 index 000000000..5c7bc88de --- /dev/null +++ b/docker-compose.arm.yml @@ -0,0 +1,16 @@ +# Use root/example as user/password credentials +# Frontend/Backend Served via the same Uvicorn Server +version: "3.1" +services: + mealie: + build: + context: ./ + dockerfile: Dockerfile.arm + container_name: mealie + restart: always + ports: + - 9090:80 + environment: + db_type: sql + volumes: + - ./mealie/data/:/app/data diff --git a/docs/docs/changelog.md b/docs/docs/changelog.md index dc32b9ce6..d1b58a33f 100644 --- a/docs/docs/changelog.md +++ b/docs/docs/changelog.md @@ -9,6 +9,7 @@ ### Features - Additional database! SQlite is now supported! Closes #48 - All site data is now backed up. + - Support for Prep Time, Total Time, and Cook Time field - Closes #63 - New backup import process with support for themes and site settings ### Code / Developer Improvements diff --git a/frontend/src/components/UI/AddRecipeFab.vue b/frontend/src/components/UI/AddRecipeFab.vue index 68329e61f..4247f1051 100644 --- a/frontend/src/components/UI/AddRecipeFab.vue +++ b/frontend/src/components/UI/AddRecipeFab.vue @@ -2,15 +2,20 @@
- {{ $t('new-recipe.from-url') }} + {{ $t("new-recipe.from-url") }} + - + - {{ $t('new-recipe.error-message') }} + {{ $t("new-recipe.error-message") }} @@ -18,8 +23,12 @@ - {{$t('general.close')}} - {{ $t('general.submit') }} + + {{ $t("general.close") }} + + + {{ $t("general.submit") }} + @@ -65,6 +74,7 @@ export default { this.addRecipe = false; this.processing = false; + this.recipeURL = ""; this.$router.push(`/recipe/${response.data}`); }, diff --git a/poetry.lock b/poetry.lock index 94a756096..50190205d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -148,7 +148,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" name = "colorama" version = "0.4.4" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -259,6 +259,17 @@ chardet = ["chardet (>=2.2)"] genshi = ["genshi"] lxml = ["lxml"] +[[package]] +name = "httptools" +version = "0.1.1" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["Cython (==0.29.14)"] + [[package]] name = "idna" version = "2.10" @@ -714,25 +725,6 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "tinydb" -version = "4.3.0" -description = "TinyDB is a tiny, document oriented database optimized for your happiness :)" -category = "main" -optional = false -python-versions = ">=3.5,<4.0" - -[[package]] -name = "tinydb-serialization" -version = "2.0.0" -description = "Serialization for objects that TinyDB otherwise couldn't handle" -category = "main" -optional = false -python-versions = ">=3.5,<4.0" - -[package.dependencies] -tinydb = ">=4.0,<5.0" - [[package]] name = "toml" version = "0.10.2" @@ -791,11 +783,26 @@ python-versions = "*" [package.dependencies] click = ">=7.0.0,<8.0.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" +httptools = {version = ">=0.1.0,<0.2.0", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +PyYAML = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchgod = {version = ">=0.6,<0.7", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=8.0.0,<9.0.0", optional = true, markers = "extra == \"standard\""} [package.extras] standard = ["websockets (>=8.0.0,<9.0.0)", "watchgod (>=0.6,<0.7)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "httptools (>=0.1.0,<0.2.0)", "uvloop (>=0.14.0)", "colorama (>=0.4)"] +[[package]] +name = "uvloop" +version = "0.14.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "validators" version = "0.18.2" @@ -822,6 +829,14 @@ python-versions = "*" [package.dependencies] six = ">=1.4.1" +[[package]] +name = "watchgod" +version = "0.6" +description = "Simple, modern file watching and code reload in python." +category = "main" +optional = false +python-versions = ">=3.5" + [[package]] name = "webencodings" version = "0.5.1" @@ -830,6 +845,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "websockets" +version = "8.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.6.1" + [[package]] name = "wrapt" version = "1.12.1" @@ -841,7 +864,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "befa5ef0da3be1250e38c23f96bab1212b9072f9acd989878564a2c21a56d3b2" +content-hash = "41e74af4ccdf3d291de04842718297a83774c80da335894e1eb0fcacb0fddac5" [metadata.files] aiofiles = [ @@ -928,6 +951,20 @@ html5lib = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, ] +httptools = [ + {file = "httptools-0.1.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:a2719e1d7a84bb131c4f1e0cb79705034b48de6ae486eb5297a139d6a3296dce"}, + {file = "httptools-0.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:fa3cd71e31436911a44620473e873a256851e1f53dee56669dae403ba41756a4"}, + {file = "httptools-0.1.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:86c6acd66765a934e8730bf0e9dfaac6fdcf2a4334212bd4a0a1c78f16475ca6"}, + {file = "httptools-0.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bc3114b9edbca5a1eb7ae7db698c669eb53eb8afbbebdde116c174925260849c"}, + {file = "httptools-0.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ac0aa11e99454b6a66989aa2d44bca41d4e0f968e395a0a8f164b401fefe359a"}, + {file = "httptools-0.1.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:96da81e1992be8ac2fd5597bf0283d832287e20cb3cfde8996d2b00356d4e17f"}, + {file = "httptools-0.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:56b6393c6ac7abe632f2294da53f30d279130a92e8ae39d8d14ee2e1b05ad1f2"}, + {file = "httptools-0.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:96eb359252aeed57ea5c7b3d79839aaa0382c9d3149f7d24dd7172b1bcecb009"}, + {file = "httptools-0.1.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:fea04e126014169384dee76a153d4573d90d0cbd1d12185da089f73c78390437"}, + {file = "httptools-0.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3592e854424ec94bd17dc3e0c96a64e459ec4147e6d53c0a42d0ebcef9cb9c5d"}, + {file = "httptools-0.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a4b1b2012b28e68306575ad14ad5e9120b34fccd02a81eb08838d7e3bbb48be"}, + {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, +] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, @@ -1336,14 +1373,6 @@ text-unidecode = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] -tinydb = [ - {file = "tinydb-4.3.0-py3-none-any.whl", hash = "sha256:c8a8887269927e077f3aa16fddbf4debd176c10edc4ac8a5ce48ced0b10adf8c"}, - {file = "tinydb-4.3.0.tar.gz", hash = "sha256:1d102d06f9bb22d739d8061b490c64d420de70dca5f95ebd43a492c43c7bd303"}, -] -tinydb-serialization = [ - {file = "tinydb-serialization-2.0.0.tar.gz", hash = "sha256:02d5ebc54652a38c52976658c1d25732112afb5ebbc4c0b730b3abef4b121b59"}, - {file = "tinydb_serialization-2.0.0-py3-none-any.whl", hash = "sha256:d1bed979e1566452b51ea065942e1208ea751285064ebb56bbab52e2ffbf3100"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1397,6 +1426,17 @@ uvicorn = [ {file = "uvicorn-0.13.3-py3-none-any.whl", hash = "sha256:1079c50a06f6338095b4f203e7861dbff318dde5f22f3a324fc6e94c7654164c"}, {file = "uvicorn-0.13.3.tar.gz", hash = "sha256:ef1e0bb5f7941c6fe324e06443ddac0331e1632a776175f87891c7bd02694355"}, ] +uvloop = [ + {file = "uvloop-0.14.0-cp35-cp35m-macosx_10_11_x86_64.whl", hash = "sha256:08b109f0213af392150e2fe6f81d33261bb5ce968a288eb698aad4f46eb711bd"}, + {file = "uvloop-0.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:4544dcf77d74f3a84f03dd6278174575c44c67d7165d4c42c71db3fdc3860726"}, + {file = "uvloop-0.14.0-cp36-cp36m-macosx_10_11_x86_64.whl", hash = "sha256:b4f591aa4b3fa7f32fb51e2ee9fea1b495eb75b0b3c8d0ca52514ad675ae63f7"}, + {file = "uvloop-0.14.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f07909cd9fc08c52d294b1570bba92186181ca01fe3dc9ffba68955273dd7362"}, + {file = "uvloop-0.14.0-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:afd5513c0ae414ec71d24f6f123614a80f3d27ca655a4fcf6cabe50994cc1891"}, + {file = "uvloop-0.14.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:e7514d7a48c063226b7d06617cbb12a14278d4323a065a8d46a7962686ce2e95"}, + {file = "uvloop-0.14.0-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:bcac356d62edd330080aed082e78d4b580ff260a677508718f88016333e2c9c5"}, + {file = "uvloop-0.14.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4315d2ec3ca393dd5bc0b0089d23101276778c304d42faff5dc4579cb6caef09"}, + {file = "uvloop-0.14.0.tar.gz", hash = "sha256:123ac9c0c7dd71464f58f1b4ee0bbd81285d96cdda8bc3519281b8973e3a461e"}, +] validators = [ {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"}, {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"}, @@ -1405,10 +1445,38 @@ w3lib = [ {file = "w3lib-1.22.0-py2.py3-none-any.whl", hash = "sha256:0161d55537063e00d95a241663ede3395c4c6d7b777972ba2fd58bbab2001e53"}, {file = "w3lib-1.22.0.tar.gz", hash = "sha256:0ad6d0203157d61149fd45aaed2e24f53902989c32fc1dccc2e2bfba371560df"}, ] +watchgod = [ + {file = "watchgod-0.6-py35.py36.py37-none-any.whl", hash = "sha256:59700dab7445aa8e6067a5b94f37bae90fc367554549b1ed2e9d0f4f38a90d2a"}, + {file = "watchgod-0.6.tar.gz", hash = "sha256:e9cca0ab9c63f17fc85df9fd8bd18156ff00aff04ebe5976cee473f4968c6858"}, +] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +websockets = [ + {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, + {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, + {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, + {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, + {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, + {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, + {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, + {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, + {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, + {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, + {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, + {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, + {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, + {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, +] wrapt = [ {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, ] diff --git a/pyproject.toml b/pyproject.toml index 9d9e8d34c..b443b13e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,15 +14,13 @@ aiofiles = "0.5.0" aniso8601 = "7.0.0" appdirs = "1.4.4" fastapi = "^0.63.0" -uvicorn = "^0.13.3" +uvicorn = {extras = ["standard"], version = "^0.13.0"} GitPython = "^3.1.12" APScheduler = "^3.6.3" SQLAlchemy = "^1.3.22" Jinja2 = "^2.11.2" python-dotenv = "^0.15.0" mongoengine = "^0.22.1" -tinydb = "^4.3.0" -tinydb-serialization = "^2.0.0" python-slugify = "^4.0.1" requests = "^2.25.1" PyYAML = "^5.3.1"