Merge remote-tracking branch 'upstream/mealie-next' into pr/mrth2/5184

This commit is contained in:
Michael Genson 2025-05-27 21:05:00 +00:00
commit 605863e6ca
15 changed files with 425 additions and 404 deletions

View file

@ -12,7 +12,7 @@ repos:
exclude: ^tests/data/ exclude: ^tests/data/
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: v0.11.9 rev: v0.11.11
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format

View file

@ -52,6 +52,8 @@ Before you can start using OIDC Authentication, you must first configure a new c
Take the client id and your discovery URL and update your environment variables to include the required OIDC variables described in [Installation - Backend Configuration](../installation/backend-config.md#openid-connect-oidc). Take the client id and your discovery URL and update your environment variables to include the required OIDC variables described in [Installation - Backend Configuration](../installation/backend-config.md#openid-connect-oidc).
You might also want to set ALLOW_PASSWORD_LOGIN to false, to hide the username+password inputs, if you want to allow logins only via OIDC.
### Groups ### Groups
There are two (optional) [environment variables](../installation/backend-config.md#openid-connect-oidc) that can control which of the users in your IdP can log in to Mealie and what permissions they will have. Keep in mind that these groups **do not necessarily correspond to groups in Mealie**. The groups claim is configurable via the `OIDC_GROUPS_CLAIM` environment variable. The groups should be **defined in your IdP** and be returned in the configured claim value. There are two (optional) [environment variables](../installation/backend-config.md#openid-connect-oidc) that can control which of the users in your IdP can log in to Mealie and what permissions they will have. Keep in mind that these groups **do not necessarily correspond to groups in Mealie**. The groups claim is configurable via the `OIDC_GROUPS_CLAIM` environment variable. The groups should be **defined in your IdP** and be returned in the configured claim value.

View file

@ -36,6 +36,10 @@ Before you can start using OIDC Authentication, you must first configure a new c
http://localhost:9091/login http://localhost:9091/login
https://mealie.example.com/login https://mealie.example.com/login
If you are hosting Mealie behind a reverse proxy (nginx, Caddy, ...) to terminate TLS, make sure to start Mealie's Gunicorn server
with `--forwarded-allow-ips=<ip-of-proxy>`, otherwise the `X-Forwarded-*` headers will be ignored and the generated OIDC redirect
URI will use the wrong scheme (http instead of https). This will lead to authentication errors with strict OIDC providers.
3. Configure origins 3. Configure origins
If your identity provider enforces CORS on any endpoints, you will need to specify your Mealie URL as an Allowed Origin. If your identity provider enforces CORS on any endpoints, you will need to specify your Mealie URL as an Allowed Origin.

View file

@ -16,6 +16,7 @@
| API_DOCS | True | Turns on/off access to the API documentation locally | | API_DOCS | True | Turns on/off access to the API documentation locally |
| TZ | UTC | Must be set to get correct date/time on the server | | TZ | UTC | Must be set to get correct date/time on the server |
| ALLOW_SIGNUP<super>\*</super> | false | Allow user sign-up without token | | ALLOW_SIGNUP<super>\*</super> | false | Allow user sign-up without token |
| ALLOW_PASSWORD_LOGIN | true | Whether or not to display the username+password input fields. Keep set to true unless you use OIDC authentication |
| LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path | | LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path |
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug) | | LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug) |
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run daily server tasks, in HH:MM format. Use the server's local time, *not* UTC | | DAILY_SCHEDULE_TIME | 23:45 | The time of day to run daily server tasks, in HH:MM format. Use the server's local time, *not* UTC |

View file

@ -851,13 +851,13 @@
}, },
"shopping-list": { "shopping-list": {
"all-lists": "Όλες οι λίστες", "all-lists": "Όλες οι λίστες",
"create-shopping-list": "Δημιουργία Λίστας Αγορών", "create-shopping-list": "Δημιουργία λίστας για ψώνια",
"from-recipe": "Από Τη Συνταγή", "from-recipe": "Από Τη Συνταγή",
"list-name": "Όνομα λίστας", "list-name": "Όνομα λίστας",
"new-list": "Νέα λίστα", "new-list": "Νέα λίστα",
"quantity": "Ποσότητα: {0}", "quantity": "Ποσότητα: {0}",
"shopping-list": "Λίστα αγορών", "shopping-list": "Λίστα για ψώνια",
"shopping-lists": "Λίστες Αγορών", "shopping-lists": "Λίστες για ψώνια",
"food": "Τρόφιμο", "food": "Τρόφιμο",
"note": "Σημείωση", "note": "Σημείωση",
"label": "Ετικέτα", "label": "Ετικέτα",
@ -874,7 +874,7 @@
"uncheck-all-items": "Αποεπιλογή όλων των αντικειμένων", "uncheck-all-items": "Αποεπιλογή όλων των αντικειμένων",
"check-all-items": "Επιλογή όλων των αντικειμένων", "check-all-items": "Επιλογή όλων των αντικειμένων",
"linked-recipes-count": "Χωρίς συνδεδεμένες συνταγές|Μία συνδεδεμένη συνταγή|{count} συνδεδεμένες συνταγές", "linked-recipes-count": "Χωρίς συνδεδεμένες συνταγές|Μία συνδεδεμένη συνταγή|{count} συνδεδεμένες συνταγές",
"items-checked-count": "Δεν επιλέχθηκαν αντικείμενο|Επιλέχθηκε ένα αντικείμενο|Επιλέχθηκαν {count} αντικείμενα", "items-checked-count": "Δεν επιλέχθηκαν αντικείμενα|Επιλέχθηκε ένα αντικείμενο|Επιλέχθηκαν {count} αντικείμενα",
"no-label": "Χωρίς ετικέτα", "no-label": "Χωρίς ετικέτα",
"completed-on": "Ολοκληρώθηκε στις {date}", "completed-on": "Ολοκληρώθηκε στις {date}",
"you-are-offline": "Είστε εκτός σύνδεσης", "you-are-offline": "Είστε εκτός σύνδεσης",
@ -882,7 +882,7 @@
"are-you-sure-you-want-to-check-all-items": "Θέλετε σίγουρα να επιλέξετε όλα τα αντικείμενα;", "are-you-sure-you-want-to-check-all-items": "Θέλετε σίγουρα να επιλέξετε όλα τα αντικείμενα;",
"are-you-sure-you-want-to-uncheck-all-items": "Θέλετε σίγουρα να αποεπιλέξετε όλα τα αντικείμενα;", "are-you-sure-you-want-to-uncheck-all-items": "Θέλετε σίγουρα να αποεπιλέξετε όλα τα αντικείμενα;",
"are-you-sure-you-want-to-delete-checked-items": "Θέλετε σίγουρα να διαγράψετε όλα τα επιλεγμένα αντικείμενα;", "are-you-sure-you-want-to-delete-checked-items": "Θέλετε σίγουρα να διαγράψετε όλα τα επιλεγμένα αντικείμενα;",
"no-shopping-lists-found": "Δεν βρέθηκαν λίστες αγορών" "no-shopping-lists-found": "Δεν βρέθηκαν λίστες για ψώνια"
}, },
"sidebar": { "sidebar": {
"all-recipes": "Συνταγές όλες", "all-recipes": "Συνταγές όλες",
@ -1060,7 +1060,7 @@
"example-food-singular": "ex: Κρεμμύδι", "example-food-singular": "ex: Κρεμμύδι",
"example-food-plural": "ex: Κρεμμύδια", "example-food-plural": "ex: Κρεμμύδια",
"label-overwrite-warning": "Αυτό θα αντιστοιχίσει την επιλεγμένη ετικέτα σε όλα τα επιλεγμένα τρόφιμα και ενδεχομένως να αντικαταστήσει τις υπάρχουσες ετικέτες σας.", "label-overwrite-warning": "Αυτό θα αντιστοιχίσει την επιλεγμένη ετικέτα σε όλα τα επιλεγμένα τρόφιμα και ενδεχομένως να αντικαταστήσει τις υπάρχουσες ετικέτες σας.",
"on-hand-checkbox-label": "Η ρύθμιση αυτής της σημαίας θα κάνει αυτό το τρόφιμο αποεπιλεγμένο από προεπιλογή κατά την προσθήκη μιας συνταγής σε μια λίστα αγορών." "on-hand-checkbox-label": "Η ρύθμιση αυτής της σημαίας θα κάνει αυτό το τρόφιμο αποεπιλεγμένο από προεπιλογή κατά την προσθήκη μιας συνταγής σε μια λίστα για ψώνια."
}, },
"units": { "units": {
"seed-dialog-text": "Τροφοδοτήστε τη βάση δεδομένων με κοινές μονάδες με βάση την τοπική σας γλώσσα.", "seed-dialog-text": "Τροφοδοτήστε τη βάση δεδομένων με κοινές μονάδες με βάση την τοπική σας γλώσσα.",
@ -1151,7 +1151,7 @@
"create-a-new-group": "Δημιουργία νέας ομάδας", "create-a-new-group": "Δημιουργία νέας ομάδας",
"provide-registration-token-description": "Παρακαλώ δώστε το διακριτικό εγγραφής που σχετίζεται με την ομάδα που θα θέλατε να συμμετάσχετε. Θα χρειαστεί να το αποκτήσετε από ένα υπάρχον μέλος της ομάδας.", "provide-registration-token-description": "Παρακαλώ δώστε το διακριτικό εγγραφής που σχετίζεται με την ομάδα που θα θέλατε να συμμετάσχετε. Θα χρειαστεί να το αποκτήσετε από ένα υπάρχον μέλος της ομάδας.",
"group-details": "Λεπτομέρειες ομάδας", "group-details": "Λεπτομέρειες ομάδας",
"group-details-description": "Πριν δημιουργήσετε ένα λογαριασμό θα πρέπει να δημιουργήσετε μια ομάδα. Η ομάδα σας θα περιέχει μόνο εσάς, αλλά θα μπορείτε να προσκαλέσετε άλλους αργότερα. Μέλη της ομάδας σας μπορούν να μοιραστούν προγράμματα γευμάτων, λίστες αγορών, συνταγές και πολλά άλλα!", "group-details-description": "Πριν δημιουργήσετε ένα λογαριασμό θα πρέπει να δημιουργήσετε μια ομάδα. Η ομάδα σας θα περιέχει μόνο εσάς, αλλά θα μπορείτε να προσκαλέσετε άλλους αργότερα. Μέλη της ομάδας σας μπορούν να μοιραστούν προγράμματα γευμάτων, λίστες για ψώνια, συνταγές και πολλά άλλα!",
"use-seed-data": "Χρήση δεδομένων από τροφοδοσία", "use-seed-data": "Χρήση δεδομένων από τροφοδοσία",
"use-seed-data-description": "Το Mealie έρχεται με μια συλλογή Τροφίμων, Μονάδων και Ετικετών που μπορούν να χρησιμοποιηθούν για τη συμπλήρωση της ομάδας σας με χρήσιμα δεδομένα για την οργάνωση των συνταγών σας.", "use-seed-data-description": "Το Mealie έρχεται με μια συλλογή Τροφίμων, Μονάδων και Ετικετών που μπορούν να χρησιμοποιηθούν για τη συμπλήρωση της ομάδας σας με χρήσιμα δεδομένα για την οργάνωση των συνταγών σας.",
"account-details": "Λεπτομέρειες λογαριασμού" "account-details": "Λεπτομέρειες λογαριασμού"

View file

@ -413,11 +413,11 @@
"description-long": "Mealie может импортировать рецепты из Plan to Eat." "description-long": "Mealie может импортировать рецепты из Plan to Eat."
}, },
"myrecipebox": { "myrecipebox": {
"title": "My Recipe Box", "title": "Мой ящик с рецептами",
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below." "description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
}, },
"recipekeeper": { "recipekeeper": {
"title": "Recipe Keeper", "title": "Хранитель рецептов",
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below." "description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
} }
}, },
@ -432,7 +432,7 @@
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Вставьте в данные рецепта. Каждая строка будет рассматриваться как отдельный предмет в списке", "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Вставьте в данные рецепта. Каждая строка будет рассматриваться как отдельный предмет в списке",
"recipe-markup-specification": "Спецификация разметки рецепта", "recipe-markup-specification": "Спецификация разметки рецепта",
"recipe-url": "URL-адрес рецепта", "recipe-url": "URL-адрес рецепта",
"recipe-html-or-json": "Recipe HTML or JSON", "recipe-html-or-json": "Рецепт в HTML или JSON",
"upload-a-recipe": "Загрузить рецепт", "upload-a-recipe": "Загрузить рецепт",
"upload-individual-zip-file": "Загрузить отдельный .zip файл, экспортированный из другой Mealie.", "upload-individual-zip-file": "Загрузить отдельный .zip файл, экспортированный из другой Mealie.",
"url-form-hint": "Скопируйте и вставьте ссылку из вашего любимого сайта рецептов", "url-form-hint": "Скопируйте и вставьте ссылку из вашего любимого сайта рецептов",
@ -518,7 +518,7 @@
"save-recipe-before-use": "Сохранить рецепт перед использованием", "save-recipe-before-use": "Сохранить рецепт перед использованием",
"section-title": "Название раздела", "section-title": "Название раздела",
"servings": "Порций", "servings": "Порций",
"serves-amount": "Serves {amount}", "serves-amount": "Серверов {amount}",
"share-recipe-message": "Я хотел(а) поделиться с тобой моим рецептом {0}.", "share-recipe-message": "Я хотел(а) поделиться с тобой моим рецептом {0}.",
"show-nutrition-values": "Показать пищевую ценность", "show-nutrition-values": "Показать пищевую ценность",
"sodium-content": "Соль", "sodium-content": "Соль",
@ -528,7 +528,7 @@
"total-time": "Общее время", "total-time": "Общее время",
"trans-fat-content": "Трансжиры", "trans-fat-content": "Трансжиры",
"unable-to-delete-recipe": "Не получилось удалить рецепт", "unable-to-delete-recipe": "Не получилось удалить рецепт",
"unsaturated-fat-content": "Unsaturated fat", "unsaturated-fat-content": "Насыщенные жиры",
"no-recipe": "Нет рецепта", "no-recipe": "Нет рецепта",
"locked-by-owner": "Заблокировано владельцем", "locked-by-owner": "Заблокировано владельцем",
"join-the-conversation": "Присоединиться к беседе", "join-the-conversation": "Присоединиться к беседе",
@ -596,10 +596,10 @@
"create-recipe-description": "Создать новый рецепт с нуля.", "create-recipe-description": "Создать новый рецепт с нуля.",
"create-recipes": "Создать Рецепт", "create-recipes": "Создать Рецепт",
"import-with-zip": "Импорт из .zip", "import-with-zip": "Импорт из .zip",
"create-recipe-from-an-image": "Create Recipe from an Image", "create-recipe-from-an-image": "Создать рецепт из изображения",
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", "create-recipe-from-an-image-description": "Создайте рецепт, загрузив изображение. Mealie попытается извлечь текст из изображения с помощью ИИ и создать рецепт из него.",
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
"create-from-image": "Create from Image", "create-from-image": "Создать из изображения",
"should-translate-description": "Перевести рецепт на мой язык", "should-translate-description": "Перевести рецепт на мой язык",
"please-wait-image-procesing": "Подождите, идет обработка изображения.", "please-wait-image-procesing": "Подождите, идет обработка изображения.",
"bulk-url-import": "Массовый импорт по URL", "bulk-url-import": "Массовый импорт по URL",
@ -618,7 +618,7 @@
"import-from-zip-description": "Импорт одного рецепта, который был экспортирован из другого экземпляра Mealie.", "import-from-zip-description": "Импорт одного рецепта, который был экспортирован из другого экземпляра Mealie.",
"import-from-html-or-json": "Импортировать из HTML или JSON", "import-from-html-or-json": "Импортировать из HTML или JSON",
"import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.", "import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.",
"json-import-format-description-colon": "To import via JSON, it must be in valid format:", "json-import-format-description-colon": "Для импорта через JSON, он должен быть в правильном формате:",
"json-editor": "Редактор JSON", "json-editor": "Редактор JSON",
"zip-files-must-have-been-exported-from-mealie": ".zip файлы должны быть экспортированы из Mealie", "zip-files-must-have-been-exported-from-mealie": ".zip файлы должны быть экспортированы из Mealie",
"create-a-recipe-by-uploading-a-scan": "Создайте рецепт, загрузив скан.", "create-a-recipe-by-uploading-a-scan": "Создайте рецепт, загрузив скан.",
@ -636,7 +636,7 @@
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.", "recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
"debug": "Отладка", "debug": "Отладка",
"tree-view": "В виде дерева", "tree-view": "В виде дерева",
"recipe-servings": "Recipe Servings", "recipe-servings": "Порции",
"recipe-yield": "Количество порций", "recipe-yield": "Количество порций",
"recipe-yield-text": "Recipe Yield Text", "recipe-yield-text": "Recipe Yield Text",
"unit": "Единица измерения", "unit": "Единица измерения",
@ -654,9 +654,9 @@
"brute-parser": "Brute Parser", "brute-parser": "Brute Parser",
"openai-parser": "OpenAI Parser", "openai-parser": "OpenAI Parser",
"parse-all": "Обработать все", "parse-all": "Обработать все",
"no-unit": "No unit", "no-unit": "Без единиц",
"missing-unit": "Create missing unit: {unit}", "missing-unit": "Создать недостающую единицу: {unit}",
"missing-food": "Create missing food: {food}", "missing-food": "Создать недостающую еду: {food}",
"no-food": "Нет еды" "no-food": "Нет еды"
}, },
"reset-servings-count": "Сбросить количество порций", "reset-servings-count": "Сбросить количество порций",
@ -666,18 +666,18 @@
"recipe-finder": "Поиск рецептов", "recipe-finder": "Поиск рецептов",
"recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.",
"selected-ingredients": "Выбранные ингредиенты", "selected-ingredients": "Выбранные ингредиенты",
"no-ingredients-selected": "No ingredients selected", "no-ingredients-selected": "Нет выбранных ингредиентов",
"missing": "Missing", "missing": "Отсутствует",
"no-recipes-found": "Рецепты не найдены", "no-recipes-found": "Рецепты не найдены",
"no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", "no-recipes-found-description": "Попробуйте добавить больше ингредиентов для поиска или измените настройки фильтров",
"include-ingredients-on-hand": "Include Ingredients On Hand", "include-ingredients-on-hand": "Include Ingredients On Hand",
"include-tools-on-hand": "Include Tools On Hand", "include-tools-on-hand": "Include Tools On Hand",
"max-missing-ingredients": "Max Missing Ingredients", "max-missing-ingredients": "Максимальное количество отсутствующих ингредиентов",
"max-missing-tools": "Max Missing Tools", "max-missing-tools": "Максимальное количество отсутствующих инструментов",
"selected-tools": "Selected Tools", "selected-tools": "Выбранные инструменты",
"other-filters": "Other Filters", "other-filters": "Другие фильтры",
"ready-to-make": "Ready to Make", "ready-to-make": "Готово к созданию",
"almost-ready-to-make": "Almost Ready to Make" "almost-ready-to-make": "Почти готово к созданию"
}, },
"search": { "search": {
"advanced-search": "Расширенный поиск", "advanced-search": "Расширенный поиск",
@ -688,7 +688,7 @@
"or": "Или", "or": "Или",
"has-any": "Включает любое", "has-any": "Включает любое",
"has-all": "Включает все", "has-all": "Включает все",
"clear-selection": "Clear Selection", "clear-selection": "Очистить выделение",
"results": "Результаты", "results": "Результаты",
"search": "Поиск", "search": "Поиск",
"search-mealie": "Поиск Mealie (нажмите /)", "search-mealie": "Поиск Mealie (нажмите /)",
@ -707,7 +707,7 @@
"backup-created-at-response-export_path": "Резервная копия создана в {path}", "backup-created-at-response-export_path": "Резервная копия создана в {path}",
"backup-deleted": "Резервная копия удалена", "backup-deleted": "Резервная копия удалена",
"restore-success": "Восстановление прошло успешно", "restore-success": "Восстановление прошло успешно",
"restore-fail": "Restore failed. Check your server logs for more details", "restore-fail": "Восстановление не удалось. Проверьте журналы сервера для более подробной информации",
"backup-tag": "Тег резервной копии", "backup-tag": "Тег резервной копии",
"create-heading": "Создать резервную копию", "create-heading": "Создать резервную копию",
"delete-backup": "Удалить резервную копию", "delete-backup": "Удалить резервную копию",
@ -720,7 +720,7 @@
"backup-restore": "Восстановление резервной копии", "backup-restore": "Восстановление резервной копии",
"back-restore-description": "Восстановление этой резервной копии перезапишет все текущие данные в вашей базе данных и в каталоге данных и заменит их содержимым этой резервной копии. {cannot-be-undone} при успешном восстановлении вы выйдете из системы.", "back-restore-description": "Восстановление этой резервной копии перезапишет все текущие данные в вашей базе данных и в каталоге данных и заменит их содержимым этой резервной копии. {cannot-be-undone} при успешном восстановлении вы выйдете из системы.",
"cannot-be-undone": "Это действие нельзя отменить, используйте с осторожностью.", "cannot-be-undone": "Это действие нельзя отменить, используйте с осторожностью.",
"postgresql-note": "If you are using PostgreSQL, please review the {backup-restore-process} prior to restoring.", "postgresql-note": "Если вы используете PostgreSQL пожалуйста, просмотрите {backup-restore-process} перед восстановлением.",
"backup-restore-process-in-the-documentation": "процесс резервного копирования/восстановления в документации", "backup-restore-process-in-the-documentation": "процесс резервного копирования/восстановления в документации",
"irreversible-acknowledgment": "Я понимаю, что это действие является необратимым, разрушительным и может привести к потере данных", "irreversible-acknowledgment": "Я понимаю, что это действие является необратимым, разрушительным и может привести к потере данных",
"restore-backup": "Восстановить резервную копию" "restore-backup": "Восстановить резервную копию"

View file

@ -10,6 +10,7 @@ export interface AdminAboutInfo {
version: string; version: string;
demoStatus: boolean; demoStatus: boolean;
allowSignup: boolean; allowSignup: boolean;
allowPasswordLogin: boolean;
defaultGroupSlug?: string | null; defaultGroupSlug?: string | null;
defaultHouseholdSlug?: string | null; defaultHouseholdSlug?: string | null;
enableOidc: boolean; enableOidc: boolean;
@ -41,6 +42,7 @@ export interface AppInfo {
version: string; version: string;
demoStatus: boolean; demoStatus: boolean;
allowSignup: boolean; allowSignup: boolean;
allowPasswordLogin: boolean;
defaultGroupSlug?: string | null; defaultGroupSlug?: string | null;
defaultHouseholdSlug?: string | null; defaultHouseholdSlug?: string | null;
enableOidc: boolean; enableOidc: boolean;

View file

@ -68,6 +68,7 @@
<v-card-text class="w-100"> <v-card-text class="w-100">
<v-form @submit.prevent="authenticate"> <v-form @submit.prevent="authenticate">
<v-text-field <v-text-field
v-if="allowPasswordLogin"
v-model="form.email" v-model="form.email"
:prepend-inner-icon="$globals.icons.email" :prepend-inner-icon="$globals.icons.email"
variant="solo-filled" variant="solo-filled"
@ -80,6 +81,7 @@
type="text" type="text"
/> />
<v-text-field <v-text-field
v-if="allowPasswordLogin"
id="password" id="password"
v-model="form.password" v-model="form.password"
:prepend-inner-icon="$globals.icons.lock" :prepend-inner-icon="$globals.icons.lock"
@ -97,7 +99,7 @@
class="ml-2 mt-n2" class="ml-2 mt-n2"
:label="$t('user.remember-me')" :label="$t('user.remember-me')"
/> />
<v-card-actions class="justify-center pt-0"> <v-card-actions v-if="allowPasswordLogin" class="justify-center pt-0">
<div class="max-button"> <div class="max-button">
<v-btn <v-btn
:loading="loggingIn" :loading="loggingIn"
@ -279,6 +281,7 @@ export default defineNuxtComponent({
const allowOidc = computed(() => appInfo.value?.enableOidc || false); const allowOidc = computed(() => appInfo.value?.enableOidc || false);
const oidcRedirect = computed(() => appInfo.value?.oidcRedirect || false); const oidcRedirect = computed(() => appInfo.value?.oidcRedirect || false);
const oidcProviderName = computed(() => appInfo.value?.oidcProviderName || "OAuth"); const oidcProviderName = computed(() => appInfo.value?.oidcProviderName || "OAuth");
const allowPasswordLogin = computed(() => appInfo.value?.allowPasswordLogin ?? true);
whenever( whenever(
() => allowOidc.value && oidcRedirect.value && !isCallback() && !isDirectLogin() /* && !$auth.check().valid */, () => allowOidc.value && oidcRedirect.value && !isCallback() && !isDirectLogin() /* && !$auth.check().valid */,
@ -364,6 +367,7 @@ export default defineNuxtComponent({
form, form,
loggingIn, loggingIn,
allowSignup, allowSignup,
allowPasswordLogin,
allowOidc, allowOidc,
authenticate, authenticate,
oidcAuthenticate, oidcAuthenticate,

View file

@ -129,6 +129,7 @@ class AppSettings(AppLoggingSettings):
GIT_COMMIT_HASH: str = "unknown" GIT_COMMIT_HASH: str = "unknown"
ALLOW_SIGNUP: bool = False ALLOW_SIGNUP: bool = False
ALLOW_PASSWORD_LOGIN: bool = True
DAILY_SCHEDULE_TIME: str = "23:45" DAILY_SCHEDULE_TIME: str = "23:45"
"""Local server time, in HH:MM format. See `DAILY_SCHEDULE_TIME_UTC` for the parsed UTC equivalent""" """Local server time, in HH:MM format. See `DAILY_SCHEDULE_TIME_UTC` for the parsed UTC equivalent"""

View file

@ -6,33 +6,33 @@
"name": "alfalfa sprouts" "name": "alfalfa sprouts"
}, },
"anchovies": { "anchovies": {
"name": "anchovies" "name": "анчоусы"
}, },
"apples": { "apples": {
"name": "apple", "name": "яблоки",
"plural_name": "apples" "plural_name": "яблоки"
}, },
"artichoke": { "artichoke": {
"name": "artichoke" "name": "артишок"
}, },
"arugula": { "arugula": {
"name": "arugula" "name": "руккола"
}, },
"asparagus": { "asparagus": {
"name": "asparagus" "name": "спаржа"
}, },
"avocado": { "avocado": {
"name": "avocado", "name": "авокадо",
"plural_name": "avocado" "plural_name": "авокадо"
}, },
"bacon": { "bacon": {
"name": "bacon" "name": "бекон"
}, },
"baking-powder": { "baking-powder": {
"name": "baking powder" "name": "разрыхлитель"
}, },
"baking-soda": { "baking-soda": {
"name": "baking soda" "name": "пищевая сода"
}, },
"baking-sugar": { "baking-sugar": {
"name": "baking sugar" "name": "baking sugar"
@ -41,35 +41,35 @@
"name": "bar sugar" "name": "bar sugar"
}, },
"basil": { "basil": {
"name": "basil" "name": "базилик"
}, },
"beans": { "beans": {
"name": "beans" "name": "фасоль"
}, },
"bell-peppers": { "bell-peppers": {
"name": "bell peppers", "name": "болгарский перец",
"plural_name": "bell peppers" "plural_name": "болгарский перец"
}, },
"blackberries": { "blackberries": {
"name": "blackberries" "name": "ежевика"
}, },
"bok-choy": { "bok-choy": {
"name": "bok choy" "name": "bok choy"
}, },
"brassicas": { "brassicas": {
"name": "brassicas" "name": "капуста"
}, },
"bread": { "bread": {
"name": "bread" "name": "хлеб"
}, },
"breadfruit": { "breadfruit": {
"name": "breadfruit" "name": "плод хлебного дерева"
}, },
"broccoflower": { "broccoflower": {
"name": "broccoflower" "name": "broccoflower"
}, },
"broccoli": { "broccoli": {
"name": "broccoli" "name": "брокколи"
}, },
"broccoli-rabe": { "broccoli-rabe": {
"name": "broccoli rabe" "name": "broccoli rabe"
@ -78,13 +78,13 @@
"name": "broccolini" "name": "broccolini"
}, },
"brown-sugar": { "brown-sugar": {
"name": "brown sugar" "name": "коричневый сахар"
}, },
"brussels-sprouts": { "brussels-sprouts": {
"name": "brussels sprouts" "name": "брюссельская капуста"
}, },
"butter": { "butter": {
"name": "butter" "name": "сливочное масло"
}, },
"butternut-pumpkin": { "butternut-pumpkin": {
"name": "butternut pumpkin" "name": "butternut pumpkin"
@ -93,165 +93,165 @@
"name": "butternut squash" "name": "butternut squash"
}, },
"cabbage": { "cabbage": {
"name": "cabbage", "name": "капуста",
"plural_name": "cabbages" "plural_name": "капуста"
}, },
"cactus-edible": { "cactus-edible": {
"name": "cactus, edible" "name": "кактус, съедобный"
}, },
"calabrese": { "calabrese": {
"name": "calabrese" "name": "calabrese"
}, },
"cane-sugar": { "cane-sugar": {
"name": "cane sugar" "name": "тростниковый сахар"
}, },
"cannabis": { "cannabis": {
"name": "cannabis" "name": "конопля"
}, },
"capsicum": { "capsicum": {
"name": "capsicum" "name": "стручковый перец"
}, },
"caraway": { "caraway": {
"name": "caraway" "name": "тмин"
}, },
"carrot": { "carrot": {
"name": "carrot", "name": "морковь",
"plural_name": "carrots" "plural_name": ""
}, },
"caster-sugar": { "caster-sugar": {
"name": "caster sugar" "name": "мелкозернистый сахар"
}, },
"castor-sugar": { "castor-sugar": {
"name": "castor sugar" "name": "сахарная пудра"
}, },
"catfish": { "catfish": {
"name": "catfish" "name": "сом"
}, },
"cauliflower": { "cauliflower": {
"name": "cauliflower", "name": "цветная капуста",
"plural_name": "cauliflowers" "plural_name": "цветная капуста"
}, },
"cayenne-pepper": { "cayenne-pepper": {
"name": "cayenne pepper" "name": "кайенский перец"
}, },
"celeriac": { "celeriac": {
"name": "celery root" "name": "корень сельдерея"
}, },
"celery": { "celery": {
"name": "celery" "name": "сельдерей"
}, },
"cereal-grains": { "cereal-grains": {
"name": "cereal grains" "name": "злаковое зерно"
}, },
"chard": { "chard": {
"name": "chard" "name": "мангольд"
}, },
"cheese": { "cheese": {
"name": "cheese" "name": "сыр"
}, },
"chicory": { "chicory": {
"name": "chicory" "name": "цикорий"
}, },
"chilli-peppers": { "chilli-peppers": {
"name": "chilli pepper", "name": "перец чили",
"plural_name": "chilli peppers" "plural_name": "перец чили"
}, },
"chinese-leaves": { "chinese-leaves": {
"name": "chinese leaves" "name": "китайская капуста"
}, },
"chives": { "chives": {
"name": "chives" "name": "chives"
}, },
"chocolate": { "chocolate": {
"name": "chocolate" "name": "шоколад"
}, },
"cilantro": { "cilantro": {
"name": "cilantro" "name": "кинза"
}, },
"cinnamon": { "cinnamon": {
"name": "cinnamon" "name": "корица"
}, },
"clarified-butter": { "clarified-butter": {
"name": "clarified butter" "name": "топленое масло"
}, },
"coconut": { "coconut": {
"name": "coconut", "name": "кокос",
"plural_name": "coconuts" "plural_name": "кокосы"
}, },
"coconut-milk": { "coconut-milk": {
"name": "coconut milk" "name": "кокосовое молоко"
}, },
"cod": { "cod": {
"name": "cod" "name": "треска"
}, },
"coffee": { "coffee": {
"name": "coffee" "name": "кофе"
}, },
"collard-greens": { "collard-greens": {
"name": "collard greens" "name": "листовая капуста"
}, },
"confectioners-sugar": { "confectioners-sugar": {
"name": "confectioners' sugar" "name": "кондитерский сахар"
}, },
"coriander": { "coriander": {
"name": "coriander" "name": "кориандр"
}, },
"corn": { "corn": {
"name": "corn", "name": "кукуруза",
"plural_name": "corns" "plural_name": "кукуруза"
}, },
"corn-syrup": { "corn-syrup": {
"name": "corn syrup" "name": "кукурузный сироп"
}, },
"cottonseed-oil": { "cottonseed-oil": {
"name": "cottonseed oil" "name": ""
}, },
"courgette": { "courgette": {
"name": "courgette" "name": "цукини"
}, },
"cream-of-tartar": { "cream-of-tartar": {
"name": "cream of tartar" "name": "cream of tartar"
}, },
"cucumber": { "cucumber": {
"name": "cucumber", "name": "огурец",
"plural_name": "cucumbers" "plural_name": "огурцы"
}, },
"cumin": { "cumin": {
"name": "cumin" "name": "cumin"
}, },
"daikon": { "daikon": {
"name": "daikon", "name": "дайкон",
"plural_name": "daikons" "plural_name": "дайкон"
}, },
"dairy-products-and-dairy-substitutes": { "dairy-products-and-dairy-substitutes": {
"name": "dairy products and dairy substitutes" "name": "молочные продукты и их заменители"
}, },
"dandelion": { "dandelion": {
"name": "dandelion" "name": "одуванчик"
}, },
"demerara-sugar": { "demerara-sugar": {
"name": "demerara sugar" "name": "demerara sugar"
}, },
"dough": { "dough": {
"name": "dough" "name": "тесто"
}, },
"edible-cactus": { "edible-cactus": {
"name": "edible cactus" "name": "съедобный кактус"
}, },
"eggplant": { "eggplant": {
"name": "eggplant", "name": "баклажан",
"plural_name": "eggplants" "plural_name": "баклажаны"
}, },
"eggs": { "eggs": {
"name": "egg", "name": "яйцо",
"plural_name": "eggs" "plural_name": "яйца"
}, },
"endive": { "endive": {
"name": "endive", "name": "endive",
"plural_name": "endives" "plural_name": "endives"
}, },
"fats": { "fats": {
"name": "fats" "name": "жиры"
}, },
"fava-beans": { "fava-beans": {
"name": "fava beans" "name": "fava beans"
@ -264,22 +264,22 @@
"plural_name": "fiddlehead ferns" "plural_name": "fiddlehead ferns"
}, },
"fish": { "fish": {
"name": "fish" "name": "рыба"
}, },
"five-spice-powder": { "five-spice-powder": {
"name": "five spice powder" "name": "фруктоза"
}, },
"flour": { "flour": {
"name": "flour" "name": "мука"
}, },
"frisee": { "frisee": {
"name": "frisee" "name": "frisee"
}, },
"fructose": { "fructose": {
"name": "fructose" "name": "фруктоза"
}, },
"fruit": { "fruit": {
"name": "fruit" "name": "фрукт"
}, },
"fruit-sugar": { "fruit-sugar": {
"name": "fruit sugar" "name": "fruit sugar"
@ -291,8 +291,8 @@
"name": "garam masala" "name": "garam masala"
}, },
"garlic": { "garlic": {
"name": "garlic", "name": "чеснок",
"plural_name": "garlics" "plural_name": "чеснок"
}, },
"gem-squash": { "gem-squash": {
"name": "gem squash" "name": "gem squash"
@ -304,58 +304,58 @@
"name": "giblets" "name": "giblets"
}, },
"ginger": { "ginger": {
"name": "ginger" "name": "имбирь"
}, },
"grains": { "grains": {
"name": "grains" "name": "крупы"
}, },
"granulated-sugar": { "granulated-sugar": {
"name": "granulated sugar" "name": "гранулированный сахар"
}, },
"grape-seed-oil": { "grape-seed-oil": {
"name": "grape seed oil" "name": "масло из семян винограда"
}, },
"green-onion": { "green-onion": {
"name": "green onion", "name": "зеленый лук",
"plural_name": "green onions" "plural_name": "зелёный лук"
}, },
"heart-of-palm": { "heart-of-palm": {
"name": "heart of palm", "name": "heart of palm",
"plural_name": "heart of palms" "plural_name": "heart of palms"
}, },
"hemp": { "hemp": {
"name": "hemp" "name": "конопля"
}, },
"herbs": { "herbs": {
"name": "herbs" "name": "травы"
}, },
"honey": { "honey": {
"name": "honey" "name": "мёд"
}, },
"isomalt": { "isomalt": {
"name": "isomalt" "name": "изомальт"
}, },
"jackfruit": { "jackfruit": {
"name": "jackfruit", "name": "джекфрут",
"plural_name": "jackfruits" "plural_name": "джекфрут"
}, },
"jaggery": { "jaggery": {
"name": "jaggery" "name": "пальмовый сахар"
}, },
"jams": { "jams": {
"name": "jams" "name": "джем"
}, },
"jellies": { "jellies": {
"name": "jellies" "name": "желе"
}, },
"jerusalem-artichoke": { "jerusalem-artichoke": {
"name": "jerusalem artichoke" "name": "топинамбур"
}, },
"jicama": { "jicama": {
"name": "jicama" "name": "jicama"
}, },
"kale": { "kale": {
"name": "kale" "name": "капуста"
}, },
"kohlrabi": { "kohlrabi": {
"name": "kohlrabi" "name": "kohlrabi"
@ -364,83 +364,83 @@
"name": "kumara" "name": "kumara"
}, },
"leavening-agents": { "leavening-agents": {
"name": "leavening agents" "name": "разрыхлитель"
}, },
"leek": { "leek": {
"name": "leek", "name": "лук-порей",
"plural_name": "leeks" "plural_name": "лук-порей"
}, },
"legumes": { "legumes": {
"name": "legumes" "name": "бобовые"
}, },
"lemongrass": { "lemongrass": {
"name": "lemongrass" "name": "лемонграсс"
}, },
"lentils": { "lentils": {
"name": "lentils" "name": "чечевица"
}, },
"lettuce": { "lettuce": {
"name": "lettuce" "name": "салат"
}, },
"liver": { "liver": {
"name": "liver", "name": "печень",
"plural_name": "livers" "plural_name": "печень"
}, },
"maize": { "maize": {
"name": "maize" "name": "maize"
}, },
"maple-syrup": { "maple-syrup": {
"name": "maple syrup" "name": "кленовый сироп"
}, },
"meat": { "meat": {
"name": "meat" "name": "мясо"
}, },
"milk": { "milk": {
"name": "milk" "name": "молоко"
}, },
"mortadella": { "mortadella": {
"name": "mortadella" "name": "мортаделла"
}, },
"mushroom": { "mushroom": {
"name": "mushroom", "name": "гриб",
"plural_name": "mushrooms" "plural_name": "грибы"
}, },
"mussels": { "mussels": {
"name": "mussels" "name": "мидии"
}, },
"nanaimo-bar-mix": { "nanaimo-bar-mix": {
"name": "nanaimo bar mix" "name": "nanaimo bar mix"
}, },
"nori": { "nori": {
"name": "nori" "name": "нори"
}, },
"nutmeg": { "nutmeg": {
"name": "nutmeg" "name": "мускат"
}, },
"nutritional-yeast-flakes": { "nutritional-yeast-flakes": {
"name": "nutritional yeast flakes" "name": "пищевые дрожжи"
}, },
"nuts": { "nuts": {
"name": "nuts" "name": "орехи"
}, },
"octopuses": { "octopuses": {
"name": "octopus", "name": "осьминог",
"plural_name": "octopuses" "plural_name": "осьминоги"
}, },
"oils": { "oils": {
"name": "oils" "name": "масла"
}, },
"okra": { "okra": {
"name": "okra" "name": "okra"
}, },
"olive": { "olive": {
"name": "olive" "name": "оливка"
}, },
"olive-oil": { "olive-oil": {
"name": "olive oil" "name": "оливковое масло"
}, },
"onion": { "onion": {
"name": "onion" "name": "лук"
}, },
"onion-family": { "onion-family": {
"name": "onion family" "name": "onion family"
@ -449,143 +449,143 @@
"name": "orange blossom water" "name": "orange blossom water"
}, },
"oranges": { "oranges": {
"name": "orange", "name": "апельсин",
"plural_name": "oranges" "plural_name": "апельсины"
}, },
"oregano": { "oregano": {
"name": "oregano" "name": "орегано"
}, },
"oysters": { "oysters": {
"name": "oysters" "name": "устрицы"
}, },
"panch-puran": { "panch-puran": {
"name": "panch puran" "name": "panch puran"
}, },
"paprika": { "paprika": {
"name": "paprika" "name": "паприка"
}, },
"parsley": { "parsley": {
"name": "parsley" "name": "петрушка"
}, },
"parsnip": { "parsnip": {
"name": "parsnip", "name": "пастернак",
"plural_name": "parsnips" "plural_name": "пастернак"
}, },
"pear": { "pear": {
"name": "pear", "name": "груша",
"plural_name": "pears" "plural_name": "груши"
}, },
"peas": { "peas": {
"name": "peas" "name": "горох"
}, },
"pepper": { "pepper": {
"name": "pepper", "name": "перец",
"plural_name": "peppers" "plural_name": "перцы"
}, },
"pineapple": { "pineapple": {
"name": "pineapple", "name": "ананас",
"plural_name": "pineapples" "plural_name": "ананасы"
}, },
"plantain": { "plantain": {
"name": "plantain", "name": "plantain",
"plural_name": "plantains" "plural_name": "plantains"
}, },
"poppy-seeds": { "poppy-seeds": {
"name": "poppy seeds" "name": "семена мака"
}, },
"potato": { "potato": {
"name": "potato", "name": "картофель",
"plural_name": "potatoes" "plural_name": "картофель"
}, },
"poultry": { "poultry": {
"name": "poultry" "name": "мясо птицы"
}, },
"powdered-sugar": { "powdered-sugar": {
"name": "powdered sugar" "name": "сахарная пудра"
}, },
"pumpkin": { "pumpkin": {
"name": "pumpkin", "name": "тыква",
"plural_name": "pumpkins" "plural_name": "тыквы"
}, },
"pumpkin-seeds": { "pumpkin-seeds": {
"name": "pumpkin seeds" "name": "семена тыквы"
}, },
"radish": { "radish": {
"name": "radish", "name": "редис",
"plural_name": "radishes" "plural_name": "редис"
}, },
"raw-sugar": { "raw-sugar": {
"name": "raw sugar" "name": "нерафинированный сахар"
}, },
"refined-sugar": { "refined-sugar": {
"name": "refined sugar" "name": "refined sugar"
}, },
"rice": { "rice": {
"name": "rice" "name": "рис"
}, },
"rice-flour": { "rice-flour": {
"name": "rice flour" "name": "рисовая мука"
}, },
"rock-sugar": { "rock-sugar": {
"name": "rock sugar" "name": "rock sugar"
}, },
"rum": { "rum": {
"name": "rum" "name": "ром"
}, },
"salmon": { "salmon": {
"name": "salmon" "name": "лосось"
}, },
"salt": { "salt": {
"name": "salt" "name": "соль"
}, },
"salt-cod": { "salt-cod": {
"name": "salt cod" "name": "вяленая треска"
}, },
"scallion": { "scallion": {
"name": "scallion", "name": "scallion",
"plural_name": "scallions" "plural_name": "scallions"
}, },
"seafood": { "seafood": {
"name": "seafood" "name": "морепродукты"
}, },
"seeds": { "seeds": {
"name": "seeds" "name": "семена"
}, },
"sesame-seeds": { "sesame-seeds": {
"name": "sesame seeds" "name": "семена кунжута"
}, },
"shallot": { "shallot": {
"name": "shallot", "name": "shallot",
"plural_name": "shallots" "plural_name": "shallots"
}, },
"skate": { "skate": {
"name": "skate" "name": "скат"
}, },
"soda": { "soda": {
"name": "soda" "name": "сода"
}, },
"soda-baking": { "soda-baking": {
"name": "soda, baking" "name": "пищевая сода"
}, },
"soybean": { "soybean": {
"name": "soybean" "name": "соевые бобы"
}, },
"spaghetti-squash": { "spaghetti-squash": {
"name": "spaghetti squash", "name": "spaghetti squash",
"plural_name": "spaghetti squashes" "plural_name": "spaghetti squashes"
}, },
"speck": { "speck": {
"name": "speck" "name": "шпик"
}, },
"spices": { "spices": {
"name": "spices" "name": "специи"
}, },
"spinach": { "spinach": {
"name": "spinach" "name": "шпинат"
}, },
"spring-onion": { "spring-onion": {
"name": "spring onion", "name": "зелёный лук",
"plural_name": "spring onions" "plural_name": "зелёный лук"
}, },
"squash": { "squash": {
"name": "squash", "name": "squash",
@ -595,98 +595,98 @@
"name": "squash family" "name": "squash family"
}, },
"stockfish": { "stockfish": {
"name": "stockfish" "name": "вяленая рыба"
}, },
"sugar": { "sugar": {
"name": "sugar" "name": "сахар"
}, },
"sunchoke": { "sunchoke": {
"name": "sunchoke", "name": "топинамбур",
"plural_name": "sunchokes" "plural_name": "топинамбур"
}, },
"sunflower-seeds": { "sunflower-seeds": {
"name": "sunflower seeds" "name": "семена подсолнечника"
}, },
"superfine-sugar": { "superfine-sugar": {
"name": "superfine sugar" "name": "superfine sugar"
}, },
"sweet-potato": { "sweet-potato": {
"name": "sweet potato", "name": "сладкий картофель",
"plural_name": "sweet potatoes" "plural_name": "сладкий картофель"
}, },
"sweetcorn": { "sweetcorn": {
"name": "sweetcorn", "name": "sweetcorn",
"plural_name": "sweetcorns" "plural_name": "sweetcorns"
}, },
"sweeteners": { "sweeteners": {
"name": "sweeteners" "name": "подсластители"
}, },
"tahini": { "tahini": {
"name": "tahini" "name": "тахини"
}, },
"taro": { "taro": {
"name": "taro", "name": "таро",
"plural_name": "taroes" "plural_name": "таро"
}, },
"teff": { "teff": {
"name": "teff" "name": "teff"
}, },
"tomato": { "tomato": {
"name": "tomato", "name": "помидор",
"plural_name": "tomatoes" "plural_name": "помидоры"
}, },
"trout": { "trout": {
"name": "trout" "name": "форель"
}, },
"tubers": { "tubers": {
"name": "tuber", "name": "клубень",
"plural_name": "tubers" "plural_name": "клубни"
}, },
"tuna": { "tuna": {
"name": "tuna" "name": "тунец"
}, },
"turbanado-sugar": { "turbanado-sugar": {
"name": "turbanado sugar" "name": "turbanado sugar"
}, },
"turnip": { "turnip": {
"name": "turnip", "name": "репа",
"plural_name": "turnips" "plural_name": "репа"
}, },
"unrefined-sugar": { "unrefined-sugar": {
"name": "unrefined sugar" "name": "нерафинированный сахар"
}, },
"vanilla": { "vanilla": {
"name": "vanilla" "name": "ваниль"
}, },
"vegetables": { "vegetables": {
"name": "vegetables" "name": "овощи"
}, },
"watercress": { "watercress": {
"name": "watercress" "name": "watercress"
}, },
"watermelon": { "watermelon": {
"name": "watermelon", "name": "арбуз",
"plural_name": "watermelons" "plural_name": "арбузы"
}, },
"white-mushroom": { "white-mushroom": {
"name": "white mushroom", "name": "белый гриб",
"plural_name": "white mushrooms" "plural_name": "белые грибы"
}, },
"white-sugar": { "white-sugar": {
"name": "white sugar" "name": "белый сахар"
}, },
"xanthan-gum": { "xanthan-gum": {
"name": "xanthan gum" "name": "ксантановая камедь"
}, },
"yam": { "yam": {
"name": "yam", "name": "батат",
"plural_name": "yams" "plural_name": "батат"
}, },
"yeast": { "yeast": {
"name": "yeast" "name": "дрожжи"
}, },
"zucchini": { "zucchini": {
"name": "zucchini", "name": "цуккини",
"plural_name": "zucchinis" "plural_name": "цуккини"
} }
} }

View file

@ -29,6 +29,7 @@ class AdminAboutController(BaseAdminController):
default_group=settings.DEFAULT_GROUP, default_group=settings.DEFAULT_GROUP,
default_household=settings.DEFAULT_HOUSEHOLD, default_household=settings.DEFAULT_HOUSEHOLD,
allow_signup=settings.ALLOW_SIGNUP, allow_signup=settings.ALLOW_SIGNUP,
allow_password_login=settings.ALLOW_PASSWORD_LOGIN,
build_id=settings.GIT_COMMIT_HASH, build_id=settings.GIT_COMMIT_HASH,
recipe_scraper_version=recipe_scraper_version.__version__, recipe_scraper_version=recipe_scraper_version.__version__,
enable_oidc=settings.OIDC_AUTH_ENABLED, enable_oidc=settings.OIDC_AUTH_ENABLED,

View file

@ -43,6 +43,7 @@ def get_app_info(session: Session = Depends(generate_session)):
oidc_provider_name=settings.OIDC_PROVIDER_NAME, oidc_provider_name=settings.OIDC_PROVIDER_NAME,
enable_openai=settings.OPENAI_ENABLED, enable_openai=settings.OPENAI_ENABLED,
enable_openai_image_services=settings.OPENAI_ENABLED and settings.OPENAI_ENABLE_IMAGE_SERVICES, enable_openai_image_services=settings.OPENAI_ENABLED and settings.OPENAI_ENABLE_IMAGE_SERVICES,
allow_password_login=settings.ALLOW_PASSWORD_LOGIN,
) )

View file

@ -15,6 +15,7 @@ class AppInfo(MealieModel):
version: str version: str
demo_status: bool demo_status: bool
allow_signup: bool allow_signup: bool
allow_password_login: bool
default_group_slug: str | None = None default_group_slug: str | None = None
default_household_slug: str | None = None default_household_slug: str | None = None
enable_oidc: bool enable_oidc: bool

334
poetry.lock generated
View file

@ -14,14 +14,14 @@ files = [
[[package]] [[package]]
name = "alembic" name = "alembic"
version = "1.15.2" version = "1.16.1"
description = "A database migration tool for SQLAlchemy." description = "A database migration tool for SQLAlchemy."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "alembic-1.15.2-py3-none-any.whl", hash = "sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53"}, {file = "alembic-1.16.1-py3-none-any.whl", hash = "sha256:0cdd48acada30d93aa1035767d67dff25702f8de74d7c3919f2e8492c8db2e67"},
{file = "alembic-1.15.2.tar.gz", hash = "sha256:1c72391bbdeffccfe317eefba686cb9a3c078005478885413b95c3b26c57a8a7"}, {file = "alembic-1.16.1.tar.gz", hash = "sha256:43d37ba24b3d17bc1eb1024fe0f51cd1dc95aeb5464594a02c6bb9ca9864bfa4"},
] ]
[package.dependencies] [package.dependencies]
@ -126,14 +126,14 @@ files = [
[[package]] [[package]]
name = "authlib" name = "authlib"
version = "1.5.2" version = "1.6.0"
description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "authlib-1.5.2-py2.py3-none-any.whl", hash = "sha256:8804dd4402ac5e4a0435ac49e0b6e19e395357cfa632a3f624dcb4f6df13b4b1"}, {file = "authlib-1.6.0-py2.py3-none-any.whl", hash = "sha256:91685589498f79e8655e8a8947431ad6288831d643f11c55c2143ffcc738048d"},
{file = "authlib-1.5.2.tar.gz", hash = "sha256:fe85ec7e50c5f86f1e2603518bb3b4f632985eb4a355e52256530790e326c512"}, {file = "authlib-1.6.0.tar.gz", hash = "sha256:4367d32031b7af175ad3a323d571dc7257b7099d55978087ceae4a0d88cd3210"},
] ]
[package.dependencies] [package.dependencies]
@ -478,75 +478,79 @@ markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\""}
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.8.0" version = "7.8.2"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"}, {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"},
{file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"}, {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"},
{file = "coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3"}, {file = "coverage-7.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aec326ed237e5880bfe69ad41616d333712c7937bcefc1343145e972938f9b3"},
{file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676"}, {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e818796f71702d7a13e50c70de2a1924f729228580bcba1607cccf32eea46e6"},
{file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d"}, {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:546e537d9e24efc765c9c891328f30f826e3e4808e31f5d0f87c4ba12bbd1622"},
{file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a"}, {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab9b09a2349f58e73f8ebc06fac546dd623e23b063e5398343c5270072e3201c"},
{file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c"}, {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd51355ab8a372d89fb0e6a31719e825cf8df8b6724bee942fb5b92c3f016ba3"},
{file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f"}, {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0774df1e093acb6c9e4d58bce7f86656aeed6c132a16e2337692c12786b32404"},
{file = "coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f"}, {file = "coverage-7.8.2-cp310-cp310-win32.whl", hash = "sha256:00f2e2f2e37f47e5f54423aeefd6c32a7dbcedc033fcd3928a4f4948e8b96af7"},
{file = "coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23"}, {file = "coverage-7.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:145b07bea229821d51811bf15eeab346c236d523838eda395ea969d120d13347"},
{file = "coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27"}, {file = "coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9"},
{file = "coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea"}, {file = "coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879"},
{file = "coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7"}, {file = "coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a"},
{file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040"}, {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5"},
{file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543"}, {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11"},
{file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2"}, {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a"},
{file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318"}, {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb"},
{file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9"}, {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54"},
{file = "coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c"}, {file = "coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a"},
{file = "coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78"}, {file = "coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975"},
{file = "coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc"}, {file = "coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53"},
{file = "coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6"}, {file = "coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c"},
{file = "coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d"}, {file = "coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1"},
{file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05"}, {file = "coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279"},
{file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a"}, {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99"},
{file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6"}, {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20"},
{file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47"}, {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2"},
{file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe"}, {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57"},
{file = "coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545"}, {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f"},
{file = "coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b"}, {file = "coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8"},
{file = "coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd"}, {file = "coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223"},
{file = "coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00"}, {file = "coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f"},
{file = "coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64"}, {file = "coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca"},
{file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067"}, {file = "coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d"},
{file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008"}, {file = "coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85"},
{file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733"}, {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257"},
{file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323"}, {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108"},
{file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3"}, {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0"},
{file = "coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d"}, {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050"},
{file = "coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487"}, {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48"},
{file = "coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25"}, {file = "coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7"},
{file = "coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42"}, {file = "coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3"},
{file = "coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502"}, {file = "coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7"},
{file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1"}, {file = "coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008"},
{file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4"}, {file = "coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36"},
{file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73"}, {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46"},
{file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a"}, {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be"},
{file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883"}, {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740"},
{file = "coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada"}, {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625"},
{file = "coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257"}, {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b"},
{file = "coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"}, {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199"},
{file = "coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a"}, {file = "coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8"},
{file = "coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82"}, {file = "coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d"},
{file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814"}, {file = "coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b"},
{file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c"}, {file = "coverage-7.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:496948261eaac5ac9cf43f5d0a9f6eb7a6d4cb3bedb2c5d294138142f5c18f2a"},
{file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd"}, {file = "coverage-7.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eacd2de0d30871eff893bab0b67840a96445edcb3c8fd915e6b11ac4b2f3fa6d"},
{file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4"}, {file = "coverage-7.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b039ffddc99ad65d5078ef300e0c7eed08c270dc26570440e3ef18beb816c1ca"},
{file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899"}, {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e49824808d4375ede9dd84e9961a59c47f9113039f1a525e6be170aa4f5c34d"},
{file = "coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f"}, {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b069938961dfad881dc2f8d02b47645cd2f455d3809ba92a8a687bf513839787"},
{file = "coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3"}, {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:de77c3ba8bb686d1c411e78ee1b97e6e0b963fb98b1637658dd9ad2c875cf9d7"},
{file = "coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd"}, {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1676628065a498943bd3f64f099bb573e08cf1bc6088bbe33cf4424e0876f4b3"},
{file = "coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7"}, {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8e1a26e7e50076e35f7afafde570ca2b4d7900a491174ca357d29dece5aacee7"},
{file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"}, {file = "coverage-7.8.2-cp39-cp39-win32.whl", hash = "sha256:6782a12bf76fa61ad9350d5a6ef5f3f020b57f5e6305cbc663803f2ebd0f270a"},
{file = "coverage-7.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1efa4166ba75ccefd647f2d78b64f53f14fb82622bc94c5a5cb0a622f50f1c9e"},
{file = "coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837"},
{file = "coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32"},
{file = "coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27"},
] ]
[package.extras] [package.extras]
@ -754,14 +758,14 @@ test = ["pytest", "pytest-cov", "pytest-mpl", "pytest-subtests"]
[[package]] [[package]]
name = "freezegun" name = "freezegun"
version = "1.5.1" version = "1.5.2"
description = "Let your Python tests travel through time" description = "Let your Python tests travel through time"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.8"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, {file = "freezegun-1.5.2-py3-none-any.whl", hash = "sha256:5aaf3ba229cda57afab5bd311f0108d86b6fb119ae89d2cd9c43ec8c1733c85b"},
{file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, {file = "freezegun-1.5.2.tar.gz", hash = "sha256:a54ae1d2f9c02dbf42e02c18a3ab95ab4295818b549a34dac55592d72a905181"},
] ]
[package.dependencies] [package.dependencies]
@ -1051,20 +1055,20 @@ files = [
[[package]] [[package]]
name = "ingredient-parser-nlp" name = "ingredient-parser-nlp"
version = "2.1.0" version = "2.1.1"
description = "A Python package to parse structured information from recipe ingredient sentences" description = "A Python package to parse structured information from recipe ingredient sentences"
optional = false optional = false
python-versions = "<3.14,>=3.10" python-versions = "<3.14,>=3.10"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "ingredient_parser_nlp-2.1.0-py3-none-any.whl", hash = "sha256:b987cc8c3e4561ad5828d1529a0d973690c75b731f5a06619e72deeb78b904cc"}, {file = "ingredient_parser_nlp-2.1.1-py3-none-any.whl", hash = "sha256:e09f73b28d2805d33f5523b84a304225bf62ebdca47560aa8e6c7176442ef6b6"},
{file = "ingredient_parser_nlp-2.1.0.tar.gz", hash = "sha256:bd2edfd09ea4ecd9f12c2326aab36a61e1518e3bc96abd6946ada0fd2929e2ed"}, {file = "ingredient_parser_nlp-2.1.1.tar.gz", hash = "sha256:e7070b849d05395006b6a27923304b01ed4da04b53a82047c5ddddf1bbfe1fc7"},
] ]
[package.dependencies] [package.dependencies]
nltk = ">=3.9.1" nltk = ">=3.9.1"
numpy = "*" numpy = "*"
pint = ">=0.24.4" pint = "0.24.4"
python-crfsuite = "*" python-crfsuite = "*"
[[package]] [[package]]
@ -1850,14 +1854,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]] [[package]]
name = "openai" name = "openai"
version = "1.78.1" version = "1.82.0"
description = "The official Python library for the openai API" description = "The official Python library for the openai API"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "openai-1.78.1-py3-none-any.whl", hash = "sha256:7368bf147ca499804cc408fe68cdb6866a060f38dec961bbc97b04f9d917907e"}, {file = "openai-1.82.0-py3-none-any.whl", hash = "sha256:8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30"},
{file = "openai-1.78.1.tar.gz", hash = "sha256:8b26b364531b100df1b961d03560042e5f5be11301d7d49a6cd1a2b9af824dca"}, {file = "openai-1.82.0.tar.gz", hash = "sha256:b0a009b9a58662d598d07e91e4219ab4b1e3d8ba2db3f173896a92b9b874d1a7"},
] ]
[package.dependencies] [package.dependencies]
@ -2372,14 +2376,14 @@ files = [
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.11.4" version = "2.11.5"
description = "Data validation using Python type hints" description = "Data validation using Python type hints"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main", "dev"] groups = ["main", "dev"]
files = [ files = [
{file = "pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb"}, {file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"},
{file = "pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d"}, {file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"},
] ]
[package.dependencies] [package.dependencies]
@ -2691,14 +2695,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
version = "0.26.0" version = "1.0.0"
description = "Pytest support for asyncio" description = "Pytest support for asyncio"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0"}, {file = "pytest_asyncio-1.0.0-py3-none-any.whl", hash = "sha256:4f024da9f1ef945e680dc68610b52550e36590a67fd31bb3b4943979a1f90ef3"},
{file = "pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f"}, {file = "pytest_asyncio-1.0.0.tar.gz", hash = "sha256:d15463d13f4456e1ead2594520216b225a16f781e144f8fdf6c5bb4667c48b3f"},
] ]
[package.dependencies] [package.dependencies]
@ -3243,30 +3247,30 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.11.9" version = "0.11.11"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "ruff-0.11.9-py3-none-linux_armv6l.whl", hash = "sha256:a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c"}, {file = "ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092"},
{file = "ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722"}, {file = "ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4"},
{file = "ruff-0.11.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1"}, {file = "ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b"},
{file = "ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70"}, {file = "ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875"},
{file = "ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381"}, {file = "ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1"},
{file = "ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787"}, {file = "ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81"},
{file = "ruff-0.11.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd"}, {file = "ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639"},
{file = "ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b"}, {file = "ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345"},
{file = "ruff-0.11.9-py3-none-win32.whl", hash = "sha256:7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a"}, {file = "ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112"},
{file = "ruff-0.11.9-py3-none-win_amd64.whl", hash = "sha256:52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964"}, {file = "ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f"},
{file = "ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca"}, {file = "ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b"},
{file = "ruff-0.11.9.tar.gz", hash = "sha256:ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517"}, {file = "ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d"},
] ]
[[package]] [[package]]
@ -3328,69 +3332,69 @@ files = [
[[package]] [[package]]
name = "sqlalchemy" name = "sqlalchemy"
version = "2.0.40" version = "2.0.41"
description = "Database Abstraction Library" description = "Database Abstraction Library"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "SQLAlchemy-2.0.40-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae9597cab738e7cc823f04a704fb754a9249f0b6695a6aeb63b74055cd417a96"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6854175807af57bdb6425e47adbce7d20a4d79bbfd6f6d6519cd10bb7109a7f8"},
{file = "SQLAlchemy-2.0.40-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37a5c21ab099a83d669ebb251fddf8f5cee4d75ea40a5a1653d9c43d60e20867"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05132c906066142103b83d9c250b60508af556982a385d96c4eaa9fb9720ac2b"},
{file = "SQLAlchemy-2.0.40-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bece9527f5a98466d67fb5d34dc560c4da964240d8b09024bb21c1246545e04e"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4af17bda11e907c51d10686eda89049f9ce5669b08fbe71a29747f1e876036"},
{file = "SQLAlchemy-2.0.40-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:8bb131ffd2165fae48162c7bbd0d97c84ab961deea9b8bab16366543deeab625"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c0b0e5e1b5d9f3586601048dd68f392dc0cc99a59bb5faf18aab057ce00d00b2"},
{file = "SQLAlchemy-2.0.40-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9408fd453d5f8990405cc9def9af46bfbe3183e6110401b407c2d073c3388f47"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0b3dbf1e7e9bc95f4bac5e2fb6d3fb2f083254c3fdd20a1789af965caf2d2348"},
{file = "SQLAlchemy-2.0.40-cp37-cp37m-win32.whl", hash = "sha256:00a494ea6f42a44c326477b5bee4e0fc75f6a80c01570a32b57e89cf0fbef85a"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-win32.whl", hash = "sha256:1e3f196a0c59b0cae9a0cd332eb1a4bda4696e863f4f1cf84ab0347992c548c2"},
{file = "SQLAlchemy-2.0.40-cp37-cp37m-win_amd64.whl", hash = "sha256:c7b927155112ac858357ccf9d255dd8c044fd9ad2dc6ce4c4149527c901fa4c3"}, {file = "SQLAlchemy-2.0.41-cp37-cp37m-win_amd64.whl", hash = "sha256:6ab60a5089a8f02009f127806f777fca82581c49e127f08413a66056bd9166dd"},
{file = "sqlalchemy-2.0.40-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1ea21bef99c703f44444ad29c2c1b6bd55d202750b6de8e06a955380f4725d7"}, {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b"},
{file = "sqlalchemy-2.0.40-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:afe63b208153f3a7a2d1a5b9df452b0673082588933e54e7c8aac457cf35e758"}, {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5"},
{file = "sqlalchemy-2.0.40-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8aae085ea549a1eddbc9298b113cffb75e514eadbb542133dd2b99b5fb3b6af"}, {file = "sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747"},
{file = "sqlalchemy-2.0.40-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ea9181284754d37db15156eb7be09c86e16e50fbe77610e9e7bee09291771a1"}, {file = "sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30"},
{file = "sqlalchemy-2.0.40-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5434223b795be5c5ef8244e5ac98056e290d3a99bdcc539b916e282b160dda00"}, {file = "sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29"},
{file = "sqlalchemy-2.0.40-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15d08d5ef1b779af6a0909b97be6c1fd4298057504eb6461be88bd1696cb438e"}, {file = "sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11"},
{file = "sqlalchemy-2.0.40-cp310-cp310-win32.whl", hash = "sha256:cd2f75598ae70bcfca9117d9e51a3b06fe29edd972fdd7fd57cc97b4dbf3b08a"}, {file = "sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda"},
{file = "sqlalchemy-2.0.40-cp310-cp310-win_amd64.whl", hash = "sha256:2cbafc8d39ff1abdfdda96435f38fab141892dc759a2165947d1a8fffa7ef596"}, {file = "sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08"},
{file = "sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e"}, {file = "sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f"},
{file = "sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011"}, {file = "sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560"},
{file = "sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4"}, {file = "sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f"},
{file = "sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1"}, {file = "sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6"},
{file = "sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51"}, {file = "sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04"},
{file = "sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a"}, {file = "sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582"},
{file = "sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b"}, {file = "sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8"},
{file = "sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4"}, {file = "sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504"},
{file = "sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d"}, {file = "sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9"},
{file = "sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a"}, {file = "sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1"},
{file = "sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d"}, {file = "sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70"},
{file = "sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716"}, {file = "sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e"},
{file = "sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2"}, {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078"},
{file = "sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191"}, {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae"},
{file = "sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1"}, {file = "sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6"},
{file = "sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0"}, {file = "sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0"},
{file = "sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01"}, {file = "sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443"},
{file = "sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705"}, {file = "sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc"},
{file = "sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364"}, {file = "sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1"},
{file = "sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0"}, {file = "sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a"},
{file = "sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db"}, {file = "sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d"},
{file = "sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26"}, {file = "sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23"},
{file = "sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500"}, {file = "sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f"},
{file = "sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad"}, {file = "sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df"},
{file = "sqlalchemy-2.0.40-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50f5885bbed261fc97e2e66c5156244f9704083a674b8d17f24c72217d29baf5"}, {file = "sqlalchemy-2.0.41-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90144d3b0c8b139408da50196c5cad2a6909b51b23df1f0538411cd23ffa45d3"},
{file = "sqlalchemy-2.0.40-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf0e99cdb600eabcd1d65cdba0d3c91418fee21c4aa1d28db47d095b1064a7d8"}, {file = "sqlalchemy-2.0.41-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:023b3ee6169969beea3bb72312e44d8b7c27c75b347942d943cf49397b7edeb5"},
{file = "sqlalchemy-2.0.40-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe147fcd85aaed53ce90645c91ed5fca0cc88a797314c70dfd9d35925bd5d106"}, {file = "sqlalchemy-2.0.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725875a63abf7c399d4548e686debb65cdc2549e1825437096a0af1f7e374814"},
{file = "sqlalchemy-2.0.40-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf7cee56bd552385c1ee39af360772fbfc2f43be005c78d1140204ad6148438"}, {file = "sqlalchemy-2.0.41-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81965cc20848ab06583506ef54e37cf15c83c7e619df2ad16807c03100745dea"},
{file = "sqlalchemy-2.0.40-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4aeb939bcac234b88e2d25d5381655e8353fe06b4e50b1c55ecffe56951d18c2"}, {file = "sqlalchemy-2.0.41-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dd5ec3aa6ae6e4d5b5de9357d2133c07be1aff6405b136dad753a16afb6717dd"},
{file = "sqlalchemy-2.0.40-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c268b5100cfeaa222c40f55e169d484efa1384b44bf9ca415eae6d556f02cb08"}, {file = "sqlalchemy-2.0.41-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ff8e80c4c4932c10493ff97028decfdb622de69cae87e0f127a7ebe32b4069c6"},
{file = "sqlalchemy-2.0.40-cp38-cp38-win32.whl", hash = "sha256:46628ebcec4f23a1584fb52f2abe12ddb00f3bb3b7b337618b80fc1b51177aff"}, {file = "sqlalchemy-2.0.41-cp38-cp38-win32.whl", hash = "sha256:4d44522480e0bf34c3d63167b8cfa7289c1c54264c2950cc5fc26e7850967e45"},
{file = "sqlalchemy-2.0.40-cp38-cp38-win_amd64.whl", hash = "sha256:7e0505719939e52a7b0c65d20e84a6044eb3712bb6f239c6b1db77ba8e173a37"}, {file = "sqlalchemy-2.0.41-cp38-cp38-win_amd64.whl", hash = "sha256:81eedafa609917040d39aa9332e25881a8e7a0862495fcdf2023a9667209deda"},
{file = "sqlalchemy-2.0.40-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c884de19528e0fcd9dc34ee94c810581dd6e74aef75437ff17e696c2bfefae3e"}, {file = "sqlalchemy-2.0.41-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2"},
{file = "sqlalchemy-2.0.40-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1abb387710283fc5983d8a1209d9696a4eae9db8d7ac94b402981fe2fe2e39ad"}, {file = "sqlalchemy-2.0.41-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f"},
{file = "sqlalchemy-2.0.40-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cfa124eda500ba4b0d3afc3e91ea27ed4754e727c7f025f293a22f512bcd4c9"}, {file = "sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769"},
{file = "sqlalchemy-2.0.40-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b6b28d303b9d57c17a5164eb1fd2d5119bb6ff4413d5894e74873280483eeb5"}, {file = "sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b"},
{file = "sqlalchemy-2.0.40-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b5a5bbe29c10c5bfd63893747a1bf6f8049df607638c786252cb9243b86b6706"}, {file = "sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826"},
{file = "sqlalchemy-2.0.40-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f0fda83e113bb0fb27dc003685f32a5dcb99c9c4f41f4fa0838ac35265c23b5c"}, {file = "sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923"},
{file = "sqlalchemy-2.0.40-cp39-cp39-win32.whl", hash = "sha256:957f8d85d5e834397ef78a6109550aeb0d27a53b5032f7a57f2451e1adc37e98"}, {file = "sqlalchemy-2.0.41-cp39-cp39-win32.whl", hash = "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440"},
{file = "sqlalchemy-2.0.40-cp39-cp39-win_amd64.whl", hash = "sha256:1ffdf9c91428e59744f8e6f98190516f8e1d05eec90e936eb08b257332c5e870"}, {file = "sqlalchemy-2.0.41-cp39-cp39-win_amd64.whl", hash = "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71"},
{file = "sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a"}, {file = "sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576"},
{file = "sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00"}, {file = "sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9"},
] ]
[package.dependencies] [package.dependencies]
@ -3878,4 +3882,4 @@ pgsql = ["psycopg2-binary"]
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = ">=3.12,<3.13" python-versions = ">=3.12,<3.13"
content-hash = "d3a15e25572e69988681ed78fc6d45ae25121095f5e9d08a687a587fa5f0a690" content-hash = "2b8479e18ef741f5254b8c9d64566bf42d597cfb6564c1aa622f6a1afb117402"

View file

@ -67,7 +67,7 @@ mypy = "^1.5.1"
pre-commit = "^4.0.0" pre-commit = "^4.0.0"
pylint = "^3.0.0" pylint = "^3.0.0"
pytest = "^8.0.0" pytest = "^8.0.0"
pytest-asyncio = "^0.26.0" pytest-asyncio = "^1.0.0"
rich = "^14.0.0" rich = "^14.0.0"
ruff = "^0.11.0" ruff = "^0.11.0"
types-PyYAML = "^6.0.4" types-PyYAML = "^6.0.4"