Compare commits

...

11 Commits

Author SHA1 Message Date
mealie-commit-bot[bot]
4101797c0e chore: bump version to v3.10.2 2026-02-04 23:32:41 +00:00
Michael Genson
6110200a04 fix: OIDC caching (#7009) 2026-02-04 14:03:40 -06:00
renovate[bot]
49f1e76776 fix(deps): update dependency fastapi to v0.128.1 (#7008)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-04 19:20:25 +00:00
Hayden
24e9417d02 chore(l10n): New Crowdin updates (#7005) 2026-02-04 11:57:13 +00:00
renovate[bot]
69d6985f3b chore(deps): update node.js to 1de022d (#7002)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-04 00:23:07 +00:00
renovate[bot]
84cdeb2398 chore(deps): update dependency coverage to v7.13.3 (#6998)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-04 00:23:00 +00:00
Hayden
6d439de144 chore(l10n): New Crowdin updates (#7004) 2026-02-03 23:33:27 +00:00
Michael Genson
1b586f8c67 chore: Upgrade to ruff 15.0.0 (#7003) 2026-02-03 16:43:42 -06:00
whattheschnell
f82f387146 fix: use BASE_URL config for redirect_url if available (#6995)
Co-authored-by: Michael Genson <genson.michael@gmail.com>
2026-02-03 16:31:20 -06:00
Hayden
d31c07a6c5 chore(l10n): New Crowdin updates (#6997) 2026-02-03 14:15:18 +00:00
renovate[bot]
84372c2f4f chore(deps): update node.js to bdc7252 (#6996)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-03 14:15:03 +00:00
33 changed files with 696 additions and 685 deletions

View File

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

View File

@@ -1,7 +1,7 @@
###############################################
# Frontend Build
###############################################
FROM node:24@sha256:b2b2184ba9b78c022e1d6a7924ec6fba577adf28f15c9d9c457730cc4ad3807a \
FROM node:24@sha256:1de022d8459f896fff2e7b865823699dc7a8d5567507e8b87b14a7442e07f206 \
AS frontend-builder
WORKDIR /frontend

View File

@@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
1. Take a backup just in case!
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.10.1`
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.10.2`
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
4. Restart the container

View File

@@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
```yaml
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.10.1 # (3)
image: ghcr.io/mealie-recipes/mealie:v3.10.2 # (3)
container_name: mealie
restart: always
ports:

View File

@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
```yaml
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.10.1 # (3)
image: ghcr.io/mealie-recipes/mealie:v3.10.2 # (3)
container_name: mealie
restart: always
ports:

View File

@@ -212,8 +212,8 @@
"upload-file": "Upload fil",
"created-on-date": "Oprettet den: {0}",
"unsaved-changes": "Du har ændringer som ikke er gemt. Vil du gemme før du forlader? Vælg \"Okay\" for at gemme, eller \"Annullér\" for at kassere ændringer.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"discard-changes": "Kassér ændringer",
"discard-changes-description": "Du har ændringer, der ikke er gemt. Er du sikker på, at du vil kassere dem?",
"clipboard-copy-failure": "Kopiering til udklipsholderen mislykkedes.",
"confirm-delete-generic-items": "Er du sikker på at du ønsker at slette de valgte emner?",
"organizers": "Organisatorer",
@@ -370,8 +370,8 @@
"applies-to-all-days": "Gælder for alle dage",
"applies-on-days": "Gælder for {0}e",
"meal-plan-settings": "Indstillinger for madplanlægning",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
"add-all-to-list": "Tilføj alle til liste",
"add-day-to-list": "Tilføj dag til liste"
},
"migration": {
"migration-data-removed": "Migreringsdata fjernet",
@@ -644,7 +644,7 @@
"scrape-recipe-website-being-blocked": "Bliver hjemmesiden blokeret?",
"scrape-recipe-try-importing-raw-html-instead": "Forsøg at importere den rå HTML i stedet.",
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
"import-original-categories": "Import original categories",
"import-original-categories": "Importér originale kategorier",
"stay-in-edit-mode": "Bliv i redigeringstilstand",
"parse-recipe-ingredients-after-import": "Fortolk opskrift ingredienser efter import",
"import-from-zip": "Importer fra zip-fil",

View File

@@ -212,8 +212,8 @@
"upload-file": "Datei hochladen",
"created-on-date": "Erstellt am: {0}",
"unsaved-changes": "Du hast ungespeicherte Änderungen. Möchtest du vor dem Verlassen speichern? OK um zu speichern, Cancel um Änderungen zu verwerfen.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"discard-changes": "Änderungen verwerfen",
"discard-changes-description": "Du hast ungespeicherte Änderungen. Bist du sicher, dass du sie verwerfen möchtest?",
"clipboard-copy-failure": "Fehler beim Kopieren in die Zwischenablage.",
"confirm-delete-generic-items": "Bist du dir sicher, dass du die folgenden Einträge löschen möchtest?",
"organizers": "Organisieren",
@@ -370,8 +370,8 @@
"applies-to-all-days": "Gilt an allen Tagen",
"applies-on-days": "Gilt {0}s",
"meal-plan-settings": "Essensplan Einstellungen",
"add-all-to-list": "Add All to List",
"add-day-to-list": "Add Day to List"
"add-all-to-list": "Alle zur Einkaufsliste hinzufügen",
"add-day-to-list": "Tag zur Einkaufsliste hinzufügen"
},
"migration": {
"migration-data-removed": "Migrationsdaten entfernt",
@@ -644,7 +644,7 @@
"scrape-recipe-website-being-blocked": "Die Website wird blockiert?",
"scrape-recipe-try-importing-raw-html-instead": "Versuche stattdessen das reine HTML zu importieren.",
"import-original-keywords-as-tags": "Importiere ursprüngliche Stichwörter als Schlagwörter",
"import-original-categories": "Import original categories",
"import-original-categories": "Importiere ursprüngliche Kategorien",
"stay-in-edit-mode": "Im Bearbeitungsmodus bleiben",
"parse-recipe-ingredients-after-import": "Zutaten nach dem Import parsen",
"import-from-zip": "Von Zip importieren",

View File

@@ -644,7 +644,7 @@
"scrape-recipe-website-being-blocked": "Η ιστοσελίδα μπλοκάρεται;",
"scrape-recipe-try-importing-raw-html-instead": "Δοκιμάστε να εισάγετε τον ακατέργαστο κώδικα HTML.",
"import-original-keywords-as-tags": "Εισαγωγή αρχικών λέξεων-κλειδιών ως ετικέτες",
"import-original-categories": "Import original categories",
"import-original-categories": "Εισαγωγή αρχικών κατηγοριών",
"stay-in-edit-mode": "Παραμονή σε λειτουργία επεξεργασίας",
"parse-recipe-ingredients-after-import": "Ανάλυση συστατικών συνταγής μετά την εισαγωγή",
"import-from-zip": "Εισαγωγή μέσω zip",

View File

@@ -1,14 +1,14 @@
{
"about": {
"about": "О апликацији",
"about-mealie": "О Мили",
"about-mealie": "О Mealie",
"api-docs": "API документација",
"api-port": "API прикључак",
"application-mode": "Режим апликације",
"database-type": "Тип базе података",
"database-url": "URL базе података",
"default-group": "Подразумевана група",
"default-household": "Default Household",
"default-household": "Подразумевано домаћинство",
"demo": "Демо",
"demo-status": "Демо статус",
"development": "Развој",
@@ -16,7 +16,7 @@
"download-log": "Преузми дневник евиденције",
"download-recipe-json": "Последњи прикупљени JSON",
"github": "GitHub",
"log-lines": "Log Lines",
"log-lines": "Лог",
"not-demo": "Није демо",
"portfolio": "Портфолио",
"production": "У продукцији",
@@ -65,11 +65,11 @@
"something-went-wrong": "Нешто је кренуло погрешно!",
"subscribed-events": "Догађаји на које сте претплаћени",
"test-message-sent": "Тест порука је послата",
"message-sent": "Message Sent",
"message-sent": "Порука послата",
"new-notification": "Ново обавештење",
"event-notifiers": "Обавештавач о догађају",
"apprise-url-skipped-if-blank": "Apprise URL (прескочено ако је празно)",
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
"apprise-url-is-left-intentionally-blank": "Како Apprise URL обично садржи сензитивне информације, ово поље је намерно остављено празно. Ако желите да промените URL, упишите нови овде или оставите поље празно да задржите тренутни URL.",
"enable-notifier": "Омогући обавештење",
"what-events": "На које догађаје би требао да се претплати овај обавештавач?",
"user-events": "Догађаји корисника",
@@ -84,12 +84,12 @@
"label-events": "Label Events"
},
"general": {
"add": "Add",
"add": "Додај",
"cancel": "Откажи",
"clear": "Обриши",
"close": "Затвори",
"confirm": "Потврди",
"confirm-how-does-everything-look": "How does everything look?",
"confirm-how-does-everything-look": "Како све изгледа?",
"confirm-delete-generic": "Да ли сте сигурни да желите обрисати ово?",
"copied_message": "Копирано!",
"create": "Креирај",
@@ -118,12 +118,12 @@
"image-upload-failed": "Неуспешно додавање слике",
"import": "Увоз",
"json": "JSON",
"keyword": "Ključna reč",
"keyword": "Кључна реч",
"link-copied": "Линк је копиран",
"loading": "Loading",
"loading": "Учитавање",
"loading-events": "Учитавање догађаја",
"loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...",
"loading-recipe": "Рецепт се учитава...",
"loading-ocr-data": "Учитавање OCR података...",
"loading-recipes": "Учитавање рецепата",
"message": "Порука",
"monday": "Понедељак",
@@ -134,7 +134,7 @@
"no-recipe-found": "Рецепт није пронађен",
"ok": "У реду",
"options": "Опције:",
"plural-name": "Ime u množini",
"plural-name": "Име у множини",
"print": "Штампа",
"print-preferences": "Подешавање штампе",
"random": "Насумично",
@@ -148,23 +148,23 @@
"save": "Сачувај",
"settings": "Подешавања",
"share": "Подели",
"show-all": "Show All",
"show-all": "Прикажи све",
"shuffle": "Помешано",
"sort": "Сортирај",
"sort-ascending": "Sort Ascending",
"sort-descending": "Sort Descending",
"sort-ascending": "Сложи по реду - растуће",
"sort-descending": "Сложи по реду - опадајуће",
"sort-alphabetically": "Азбучно",
"status": "Статус",
"subject": "Наслов",
"submit": "Пошаљи",
"success-count": "Успешно {count}",
"sunday": "недеља",
"system": "System",
"system": "Систем",
"templates": "Шаблони:",
"test": "Тест",
"themes": "Теме",
"thursday": "четвртак",
"title": "Title",
"title": "Наслов",
"token": "Токен",
"tuesday": "уторак",
"type": "Тип",
@@ -179,12 +179,12 @@
"units": "Јединице",
"back": "Назад",
"next": "Сљедећи",
"start": "Start",
"start": "Старт",
"toggle-view": "Промени приказ",
"date": "Датум",
"id": д",
"id": Д",
"owner": "Власник",
"change-owner": "Change Owner",
"change-owner": "Промени власника",
"date-added": "Датум додавања",
"none": "Ниједно",
"run": "Покрени",
@@ -211,17 +211,17 @@
"refresh": "Освежи",
"upload-file": "Учитај датотеку",
"created-on-date": "Крерирано: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers",
"caution": "Caution",
"show-advanced": "Show Advanced",
"add-field": "Add Field",
"date-created": "Date Created",
"date-updated": "Date Updated"
"unsaved-changes": "Имате несачуване измене. Да ли желите да их сачувате пре изласка? ОК за потврду, Откажи да откажете измене.",
"discard-changes": "Откажи измене",
"discard-changes-description": "Имате несачуване измене. Да ли желите да их откажете?",
"clipboard-copy-failure": "Копирање није успело.",
"confirm-delete-generic-items": "Да ли желите да обришете следеће ставке?",
"organizers": "Организатор",
"caution": "Пажња",
"show-advanced": "Прикажи напредно",
"add-field": "Додај поље",
"date-created": "Датум креирања",
"date-updated": "Датум измене"
},
"group": {
"are-you-sure-you-want-to-delete-the-group": "Да ли сте сигурни да желите да обришете <b>{groupName}<b/>?",
@@ -236,7 +236,7 @@
"group-id-with-value": "ID групе: {groupID}",
"group-name": "Назив групе",
"group-not-found": "Група није пронађена",
"group-token": "Group Token",
"group-token": "Групни токен",
"group-with-value": "Група: {groupID}",
"groups": "Групе",
"manage-groups": "Управљај групама",
@@ -248,18 +248,18 @@
"keep-my-recipes-private-description": "Поставља вашу групу и све рецепте као подразумевано приватне. Увек можете касније променити ово."
},
"manage-members": "Управљај члановима",
"manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
"manage-members-description": "Управљање дозволама у сопственом домаћинству. {manage} дозвољава кориснику приступ менаџменту података, а {invite} омогућава кориснику да генерише позивнице за друге кориснике. Власници групе не могу променити сопствене дозволе.",
"manage": "Управљај",
"manage-household": "Manage Household",
"manage-household": "Менаџмент домаћинства",
"invite": "Позови",
"looking-to-update-your-profile": "Желите ли да ажурирате свој профил?",
"default-recipe-preferences-description": "Ово су подразумевана подешавања када се креира нови рецепт у вашој групи. Ова подешавања могу бити промењена за појединачне рецепте у менију подешавања рецепата.",
"default-recipe-preferences": "Подразумевана подешавања рецепта",
"group-preferences": "Подешавања групе",
"private-group": "Приватна група",
"private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings",
"enable-public-access": "Enable Public Access",
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
"private-group-description": "Подешавњем групе као приватне ће онемогућити јавни преглед у потпуности. Ово поништава све индивидуална подешавања јавног приступа",
"enable-public-access": "Дозволи јавни приступ",
"enable-public-access-description": "Подеси рецепте у групи уобичајно као јавне и дозволи гостима преглед рецепата без логовања",
"allow-users-outside-of-your-group-to-see-your-recipes": "Дозволите корисницима, који су ван ваше групе, да виде ваше рецепте",
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Када је омогућено, можете користити јавну везу за дељење одређених рецепата без одобравања корисника. Када је онемогућено, рецепте можете делити само са корисницима који су у вашој групи или помоћу претходно генерисане приватне везе",
"show-nutrition-information": "Прикажи информације о исхрани",
@@ -271,37 +271,37 @@
"disable-users-from-commenting-on-recipes": "Онемогући кориснике да коментаришу рецепте",
"disable-users-from-commenting-on-recipes-description": "Сакрива секцију коментара на страници рецепта и онемогућава коментаре",
"disable-organizing-recipe-ingredients-by-units-and-food": "Онемогући организацију састојака рецепта по јединицама и намирницама",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Сакриј тип, јединицу мере и количину за састојке и третирај их као поље са обичним текстом",
"general-preferences": "Општа подешавања",
"group-recipe-preferences": "Подешавања групе рецепта",
"report": "Извештај",
"report-with-id": "Report ID: {id}",
"report-with-id": "ИД извештаја: {id}",
"group-management": "Управљање групом",
"admin-group-management": "Управљање администраторском групом",
"admin-group-management-text": "Промене у овој групи биће одмах видљиве.",
"group-id-value": "Group Id: {0}",
"total-households": "Total Households",
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
"group-id-value": "ИД групе: {0}",
"total-households": "Укупно домаћинстава",
"you-must-select-a-group-before-selecting-a-household": "Морате селектовати групу пре селектовања домаћинства"
},
"household": {
"household": "Household",
"households": "Households",
"user-household": "User Household",
"create-household": "Create Household",
"household-name": "Household Name",
"household-group": "Household Group",
"household-management": "Household Management",
"manage-households": "Manage Households",
"admin-household-management": "Admin Household Management",
"admin-household-management-text": "Changes to this household will be reflected immediately.",
"household-id-value": "Household Id: {0}",
"private-household": "Private Household",
"private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings",
"lock-recipe-edits-from-other-households": "Lock recipe edits from other households",
"lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household",
"household-recipe-preferences": "Household Recipe Preferences",
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes",
"household": "Домаћинство",
"households": "Домаћинства",
"user-household": "Корисниково домаћинство",
"create-household": "Креирај домаћинство",
"household-name": "Назив домаћинства",
"household-group": "Група домаћинства",
"household-management": "Управљање домаћинством",
"manage-households": "Управљање домаћинствима",
"admin-household-management": "Административно управљање домаћинством",
"admin-household-management-text": "Промене за ово домаћинство ће бити видљиве одмах.",
"household-id-value": "ИД домаћинства {0}",
"private-household": "Приватно домаћинство",
"private-household-description": "Подешавање сопственог домаћинства као приватно ће онемогућити сав јавни преглед. Ово поништава сва индивидуална подешавања за преглед",
"lock-recipe-edits-from-other-households": "Забрани измене рецепата од стране других домаћинстава",
"lock-recipe-edits-from-other-households-description": "Када је опција укључена, само корисници из вашег домаћинства могу мењати рецепте креиране унутар њега",
"household-recipe-preferences": "Подешавање рецепата за домаћинство",
"default-recipe-preferences-description": "Ово су уобичајна подешавања када се нови рецепт креира у вашем домаћинству. Подешавања могу бити промењена за појединачне рецепте из менија за подешавања.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Дозволите корисницима ван вашег домаћинства да прегледају ваше рецепте",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link",
"household-preferences": "Household Preferences"
},
@@ -507,7 +507,7 @@
"insert-below": "Insert Below",
"instructions": "Instructions",
"key-name-required": "Key Name Required",
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
"landscape-view-coming-soon": "Хорижонтални поглед (Ускоро)",
"milligrams": "milligrams",
"new-key-name": "New Key Name",
"no-white-space-allowed": "No White Space Allowed",
@@ -624,7 +624,7 @@
"create-recipe-description": "Create a new recipe from scratch.",
"create-recipes": "Create Recipes",
"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.",
"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-images": "Create from Images",
@@ -759,7 +759,7 @@
"restore-success": "Restore successful",
"restore-fail": "Restore failed. Check your server logs for more details",
"backup-tag": "Backup Tag",
"create-heading": "Create a Backup",
"create-heading": "Креирај бекап",
"delete-backup": "Delete Backup",
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
"full-backup": "Full Backup",
@@ -904,13 +904,13 @@
"create-shopping-list": "Направи списак за куповину",
"from-recipe": "From Recipe",
"list-name": "List Name",
"new-list": "Novi spisak",
"new-list": "Нови списак",
"quantity": "Quantity: {0}",
"shopping-list": "Shopping List",
"shopping-lists": "Списак за куповину",
"food": "Храна",
"note": "Note",
"label": "Natpis",
"label": "Натпис",
"save-label": "Save Label",
"linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.",
"toggle-food": "Toggle Food",
@@ -1413,33 +1413,33 @@
},
"query-filter": {
"logical-operators": {
"and": "AND",
"or": "OR"
"and": "И",
"or": "ИЛИ"
},
"relational-operators": {
"equals": "equals",
"does-not-equal": "does not equal",
"is-greater-than": "is greater than",
"is-greater-than-or-equal-to": "is greater than or equal to",
"is-less-than": "is less than",
"is-less-than-or-equal-to": "is less than or equal to"
"equals": "једнако са",
"does-not-equal": "није једнако са",
"is-greater-than": "је веће од",
"is-greater-than-or-equal-to": "је веће или једнако са",
"is-less-than": "је мање од",
"is-less-than-or-equal-to": "је мање или једнако са"
},
"relational-keywords": {
"is": "is",
"is-not": "is not",
"is-one-of": "is one of",
"is-not-one-of": "is not one of",
"contains-all-of": "contains all of",
"is-like": "is like",
"is-not-like": "is not like"
"is": "је",
"is-not": "није ",
"is-one-of": "је једно од",
"is-not-one-of": "није једно од",
"contains-all-of": "садржи све из",
"is-like": "је као",
"is-not-like": "није као"
}
},
"validators": {
"required": "This Field is Required",
"invalid-email": "Email Must Be Valid",
"invalid-url": "Must Be A Valid URL",
"no-whitespace": "No Whitespace Allowed",
"min-length": "Must Be At Least {min} Characters",
"max-length": "Must Be At Most {max} Characters"
"required": "Ово поље је обавезно",
"invalid-email": "Имејл мора бити валидан",
"invalid-url": "Мора бити валидан URL",
"no-whitespace": "Размак није дозвољен",
"min-length": "Мора бити најмање {min} карактера",
"max-length": "Мора бити највише {max} карактера"
}
}

View File

@@ -219,6 +219,7 @@ export default defineNuxtConfig({
},
workbox: {
navigateFallback: "/",
navigateFallbackAllowlist: [/^(?!\/api)/],
globPatterns: ["**/*.{js,css,html,png,svg,ico}"],
globIgnores: ["404.html", "200.html"],
cleanupOutdatedCaches: true,

View File

@@ -1,6 +1,6 @@
{
"name": "mealie",
"version": "3.10.1",
"version": "3.10.2",
"private": true,
"scripts": {
"dev": "nuxt dev",

View File

@@ -110,6 +110,11 @@ class AppSettings(AppLoggingSettings):
BASE_URL: str = "http://localhost:8080"
"""trailing slashes are trimmed (ex. `http://localhost:8080/` becomes ``http://localhost:8080`)"""
@property
def is_default_base_url(self) -> bool:
"""Returns True if BASE_URL has not been changed from the default."""
return self.BASE_URL == "http://localhost:8080"
STATIC_FILES: str = str(PACKAGE_DIR / "frontend")
"""path to static files directory (ex. `mealie/dist`)"""

View File

File diff suppressed because it is too large Load Diff

View File

@@ -64,8 +64,8 @@
"jalapeño": {
"aliases": [],
"description": "",
"name": "jalapeño",
"plural_name": "jalapeños"
"name": "Jalapeño",
"plural_name": "Jalapeños"
},
"avocado": {
"aliases": [],
@@ -591,7 +591,7 @@
"cress": {
"aliases": [],
"description": "",
"name": "cress",
"name": "Kresse",
"plural_name": "cress"
},
"broccoli slaw": {
@@ -974,12 +974,12 @@
"aliases": [],
"description": "",
"name": "Pomelo",
"plural_name": "pomelos"
"plural_name": "Pomelos"
},
"chestnut purée": {
"aliases": [],
"description": "",
"name": "chestnut purée",
"name": "Kastanienpüree",
"plural_name": "chestnut purée"
},
"prickly pear": {
@@ -2003,7 +2003,7 @@
"parmesan cheese": {
"aliases": [],
"description": "",
"name": "parmesan cheese",
"name": "Parmesanse",
"plural_name": "parmesan cheese"
},
"cheddar cheese": {
@@ -2011,7 +2011,7 @@
"cheddar cheese"
],
"description": "",
"name": "cheddar cheese",
"name": "Cheddarse",
"plural_name": "cheddar cheese"
},
"cream cheese": {
@@ -2031,26 +2031,26 @@
"cheese": {
"aliases": [],
"description": "",
"name": "cheese",
"plural_name": "cheese"
"name": "se",
"plural_name": "se"
},
"mozzarella cheese": {
"aliases": [],
"description": "",
"name": "mozzarella cheese",
"plural_name": "mozzarella cheese"
"name": "Mozzarellase",
"plural_name": "Mozzarellase"
},
"feta cheese": {
"aliases": [],
"description": "",
"name": "feta cheese",
"plural_name": "feta cheese"
"name": "Fetase",
"plural_name": "Fetase"
},
"ricotta cheese": {
"aliases": [],
"description": "",
"name": "ricotta cheese",
"plural_name": "ricotta cheese"
"name": "Ricottase",
"plural_name": "Ricottase"
},
"cheddar-jack cheese": {
"aliases": [],
@@ -2073,7 +2073,7 @@
"goat cheese": {
"aliases": [],
"description": "",
"name": "goat cheese",
"name": "Ziegenkäse",
"plural_name": "goat cheese"
},
"fresh mozzarella cheese": {
@@ -2097,8 +2097,8 @@
"gruyere cheese": {
"aliases": [],
"description": "",
"name": "gruyere cheese",
"plural_name": "gruyere cheese"
"name": "Gruyère",
"plural_name": "Gruyère"
},
"mascarpone cheese": {
"aliases": [],
@@ -2109,8 +2109,8 @@
"cottage cheese": {
"aliases": [],
"description": "",
"name": "cottage cheese",
"plural_name": "cottage cheese"
"name": "Hüttenkäse",
"plural_name": "Hüttenkäse"
},
"american cheese": {
"aliases": [],
@@ -2121,7 +2121,7 @@
"provolone cheese": {
"aliases": [],
"description": "",
"name": "provolone cheese",
"name": "Provolone-Käse",
"plural_name": "provolone cheese"
},
"mexican cheese blend": {
@@ -2301,8 +2301,8 @@
"taleggio cheese": {
"aliases": [],
"description": "",
"name": "taleggio cheese",
"plural_name": "taleggio cheese"
"name": "Taleggio",
"plural_name": "Taleggio"
},
"oaxaca cheese": {
"aliases": [],
@@ -2319,8 +2319,8 @@
"edam cheese": {
"aliases": [],
"description": "",
"name": "edam cheese",
"plural_name": "edam cheese"
"name": "Edamer",
"plural_name": "Edamer"
},
"creamy cheese wedge": {
"aliases": [],
@@ -2427,8 +2427,8 @@
"scamorza cheese": {
"aliases": [],
"description": "",
"name": "scamorza cheese",
"plural_name": "scamorza cheese"
"name": "Scamorza",
"plural_name": "Scamorza"
},
"cambozola cheese": {
"aliases": [],
@@ -2469,8 +2469,8 @@
"sheep cheese": {
"aliases": [],
"description": "",
"name": "sheep cheese",
"plural_name": "sheep cheese"
"name": "Schafskäse",
"plural_name": "Schafskäse"
},
"amul cheese": {
"aliases": [],
@@ -2595,8 +2595,8 @@
"maasdam cheese": {
"aliases": [],
"description": "",
"name": "maasdam cheese",
"plural_name": "maasdam cheese"
"name": "Maasdamer",
"plural_name": "Maasdamer"
},
"petit-suisse cheese": {
"aliases": [],
@@ -2630,7 +2630,7 @@
"aliases": [],
"description": "",
"name": "Milch",
"plural_name": "milk"
"plural_name": "Milch"
},
"heavy cream": {
"aliases": [],
@@ -2642,13 +2642,13 @@
"aliases": [],
"description": "",
"name": "Schmand",
"plural_name": "sour cream"
"plural_name": "Saure Sahne"
},
"buttermilk": {
"aliases": [],
"description": "",
"name": "Buttermilch",
"plural_name": "buttermilk"
"plural_name": "Buttermilch"
},
"yogurt": {
"aliases": [],
@@ -2666,13 +2666,13 @@
"aliases": [],
"description": "",
"name": "Sahne",
"plural_name": "cream"
"plural_name": "Sahne"
},
"whipped cream": {
"aliases": [],
"description": "",
"name": "Schlagsahne",
"plural_name": "whipped cream"
"plural_name": "Schlagsahne"
},
"ghee": {
"aliases": [
@@ -2692,7 +2692,7 @@
"aliases": [],
"description": "",
"name": "Kondensmilch",
"plural_name": "condensed milk"
"plural_name": "Kondensmilch"
},
"half and half": {
"aliases": [],
@@ -2704,13 +2704,13 @@
"aliases": [],
"description": "",
"name": "gezuckerte Kondensmilch",
"plural_name": "sweetened condensed milk"
"plural_name": "gezuckerte Kondensmilch"
},
"ice cream": {
"aliases": [],
"description": "",
"name": "Eiscreme",
"plural_name": "ice cream"
"plural_name": "Eiscreme"
},
"margarine": {
"aliases": [],
@@ -2734,7 +2734,7 @@
"aliases": [],
"description": "",
"name": "Milchpulver",
"plural_name": "milk powder"
"plural_name": "Milchpulver"
},
"curd": {
"aliases": [],
@@ -2764,7 +2764,7 @@
"aliases": [],
"description": "",
"name": "Pudding",
"plural_name": "custard"
"plural_name": "Pudding"
},
"chocolate frosting": {
"aliases": [],
@@ -2788,7 +2788,7 @@
"aliases": [],
"description": "",
"name": "Schokoladenmilch",
"plural_name": "chocolate milk"
"plural_name": "Schokoladenmilch"
},
"liquid egg substitute": {
"aliases": [],
@@ -2854,7 +2854,7 @@
"aliases": [],
"description": "",
"name": "Ziegenmilch",
"plural_name": "goat milk"
"plural_name": "Ziegenmilch"
},
"cheese curd": {
"aliases": [],
@@ -2866,7 +2866,7 @@
"aliases": [],
"description": "",
"name": "Sauermilch",
"plural_name": "sour milk"
"plural_name": "Sauermilch"
},
"ganache": {
"aliases": [],
@@ -2908,7 +2908,7 @@
"aliases": [],
"description": "",
"name": "Rohmilch",
"plural_name": "raw milk"
"plural_name": "Rohmilch"
},
"lime curd": {
"aliases": [],
@@ -2974,7 +2974,7 @@
"aliases": [],
"description": "",
"name": "Erdbeerfrischkäse",
"plural_name": "strawberry cream cheese"
"plural_name": "Erdbeerfrischkäse"
},
"goat butter": {
"aliases": [],
@@ -3028,7 +3028,7 @@
"aliases": [],
"description": "",
"name": "Schokoladenmilchpulver",
"plural_name": "chocolate milk powder"
"plural_name": "Schokoladenmilchpulver"
},
"liquid rennet": {
"aliases": [],
@@ -3046,7 +3046,7 @@
"aliases": [],
"description": "",
"name": "Erdbeermilch",
"plural_name": "strawberry milk"
"plural_name": "Erdbeermilch"
},
"ayran": {
"aliases": [],
@@ -3082,7 +3082,7 @@
"aliases": [],
"description": "",
"name": "Schafsmilch",
"plural_name": "sheep milk"
"plural_name": "Schafsmilch"
},
"starter culture": {
"aliases": [],
@@ -3106,7 +3106,7 @@
"aliases": [],
"description": "",
"name": "Vanillemilch",
"plural_name": "vanilla milk"
"plural_name": "Vanillemilch"
},
"yoplait whip": {
"aliases": [],
@@ -3118,7 +3118,7 @@
"aliases": [],
"description": "",
"name": "Büffelmilch",
"plural_name": "buffalo milk"
"plural_name": "Büffelmilch"
},
"goat kefir": {
"aliases": [],
@@ -3140,13 +3140,13 @@
"aliases": [],
"description": "",
"name": "Kokosmilch",
"plural_name": "coconut milk"
"plural_name": "Kokosmilch"
},
"almond milk": {
"aliases": [],
"description": "",
"name": "Mandelmilch",
"plural_name": "almond milk"
"plural_name": "Mandelmilch"
},
"almond butter": {
"aliases": [],
@@ -3164,7 +3164,7 @@
"aliases": [],
"description": "",
"name": "Kokoscreme",
"plural_name": "coconut cream"
"plural_name": "Kokoscreme"
},
"vegan butter": {
"aliases": [],
@@ -3176,13 +3176,13 @@
"aliases": [],
"description": "",
"name": "Pflanzliche Milch",
"plural_name": "non-dairy milk"
"plural_name": "Pflanzliche Milch"
},
"soy milk": {
"aliases": [],
"description": "",
"name": "Soyamilch",
"plural_name": "soy milk"
"plural_name": "Soyamilch"
},
"extra firm tofu": {
"aliases": [],
@@ -3218,13 +3218,13 @@
"aliases": [],
"description": "",
"name": "Vegane Ma­yon­nai­se",
"plural_name": "vegan mayonnaise"
"plural_name": "Vegane Ma­yon­nai­se"
},
"vegan cheese": {
"aliases": [],
"description": "",
"name": "Veganer Käse",
"plural_name": "vegan cheese"
"plural_name": "Veganer Käse"
},
"cashew butter": {
"aliases": [],
@@ -3242,7 +3242,7 @@
"aliases": [],
"description": "",
"name": "Veganer Frischkäse",
"plural_name": "vegan cream cheese"
"plural_name": "Veganer Frischkäse"
},
"coconut yogurt": {
"aliases": [],
@@ -3266,13 +3266,13 @@
"aliases": [],
"description": "",
"name": "Cashewmilch",
"plural_name": "cashew milk"
"plural_name": "Cashewmilch"
},
"oat milk": {
"aliases": [],
"description": "",
"name": "Hafermilch",
"plural_name": "oat milk"
"plural_name": "Hafermilch"
},
"nut butter": {
"aliases": [],
@@ -3284,13 +3284,13 @@
"aliases": [],
"description": "",
"name": "Reismilch",
"plural_name": "rice milk"
"plural_name": "Reismilch"
},
"vegan sour cream": {
"aliases": [],
"description": "",
"name": "Veganer Schmand",
"plural_name": "vegan sour cream"
"plural_name": "Veganer Schmand"
},
"textured vegetable protein": {
"aliases": [],
@@ -3332,7 +3332,7 @@
"aliases": [],
"description": "",
"name": "Kokos-Schlagsahne",
"plural_name": "coconut whipped cream"
"plural_name": "Kokos-Schlagsahne"
},
"smoked tofu": {
"aliases": [],
@@ -3344,13 +3344,13 @@
"aliases": [],
"description": "",
"name": "Kokospulver",
"plural_name": "coconut powder"
"plural_name": "Kokospulver"
},
"soy cream": {
"aliases": [],
"description": "",
"name": "Sojasahne",
"plural_name": "soy cream"
"plural_name": "Sojasahne"
},
"seitan": {
"aliases": [],
@@ -3362,7 +3362,7 @@
"aliases": [],
"description": "",
"name": "Kokosmilchpulver",
"plural_name": "coconut milk powder"
"plural_name": "Kokosmilchpulver"
},
"non-dairy whipped topping": {
"aliases": [],
@@ -3374,13 +3374,13 @@
"aliases": [],
"description": "",
"name": "Nussmilch",
"plural_name": "nut milk"
"plural_name": "Nussmilch"
},
"non-dairy cream": {
"aliases": [],
"description": "",
"name": "Geschlagene non-dairy Toppings",
"plural_name": "non-dairy cream"
"plural_name": "Pflanzliche Sahne"
},
"vegan burger patty": {
"aliases": [],
@@ -3392,7 +3392,7 @@
"aliases": [],
"description": "",
"name": "Kondensierte Kokosmilch",
"plural_name": "condensed coconut milk"
"plural_name": "Kondensierte Kokosmilch"
},
"vegan ground beef": {
"aliases": [],
@@ -3446,7 +3446,7 @@
"aliases": [],
"description": "",
"name": "Hanfmilch",
"plural_name": "hemp milk"
"plural_name": "Hanfmilch"
},
"vegan beef": {
"aliases": [],
@@ -3476,7 +3476,7 @@
"aliases": [],
"description": "",
"name": "Kokosnuss-Paste",
"plural_name": "coconut paste"
"plural_name": "Kokosnusspaste"
},
"vegetable suet": {
"aliases": [],
@@ -3494,7 +3494,7 @@
"aliases": [],
"description": "",
"name": "Mandel-Kokosmilch",
"plural_name": "almond-coconut milk"
"plural_name": "Mandel-Kokosmilch"
},
"banana blossom": {
"aliases": [],
@@ -3506,7 +3506,7 @@
"aliases": [],
"description": "",
"name": "Vegane Fischsoße",
"plural_name": "vegan fish sauce"
"plural_name": "Vegane Fischsoße"
},
"vegetarian hot dog": {
"aliases": [],
@@ -3518,7 +3518,7 @@
"aliases": [],
"description": "",
"name": "Haselnussmilch",
"plural_name": "hazelnut milk"
"plural_name": "Haselnussmilch"
},
"maple almond butter": {
"aliases": [],
@@ -3548,7 +3548,7 @@
"aliases": [],
"description": "",
"name": "Soja-Milchpulver",
"plural_name": "soy milk powder"
"plural_name": "Soja-Milchpulver"
},
"vegan cream cheese frosting": {
"aliases": [],
@@ -3596,7 +3596,7 @@
"aliases": [],
"description": "",
"name": "Leinsamenmilch",
"plural_name": "flax milk"
"plural_name": "Leinsamenmilch"
},
"hazelnut creamer": {
"aliases": [],
@@ -3644,7 +3644,7 @@
"aliases": [],
"description": "",
"name": "Grillenmehl",
"plural_name": "cricket flour"
"plural_name": "Grillenmehl"
},
"macadamia butter": {
"aliases": [],
@@ -3674,7 +3674,7 @@
"aliases": [],
"description": "",
"name": "Macadamia-Milch",
"plural_name": "macadamia milk"
"plural_name": "Macadamia-Milch"
},
"vegan taco meat": {
"aliases": [],
@@ -3698,7 +3698,7 @@
"aliases": [],
"description": "",
"name": "Bananenmilch",
"plural_name": "banana milk"
"plural_name": "Bananenmilch"
},
"soy quark": {
"aliases": [],
@@ -3722,7 +3722,7 @@
"aliases": [],
"description": "",
"name": "Walnuss-Milch",
"plural_name": "walnut milk"
"plural_name": "Walnussmilch"
},
"latik": {
"aliases": [],
@@ -5395,8 +5395,8 @@
"pangasius": {
"aliases": [],
"description": "",
"name": "pangasius",
"plural_name": "pangasius"
"name": "Pangasius",
"plural_name": "Pangasien"
},
"salt herring": {
"aliases": [],
@@ -5579,8 +5579,8 @@
"octopus": {
"aliases": [],
"description": "",
"name": "octopus",
"plural_name": "octopi"
"name": "Tintenfisch",
"plural_name": "Tintenfische"
},
"kombu": {
"aliases": [],
@@ -5818,7 +5818,7 @@
"aliases": [],
"description": "",
"name": "Zimt",
"plural_name": "cinnamon"
"plural_name": "Zimt"
},
"parsley": {
"aliases": [],
@@ -5848,7 +5848,7 @@
"aliases": [],
"description": "",
"name": "Thymian",
"plural_name": "thyme"
"plural_name": "Thymian"
},
"ginger root": {
"aliases": [],
@@ -5860,7 +5860,7 @@
"aliases": [],
"description": "",
"name": "Knoblauchpulver",
"plural_name": "garlic powder"
"plural_name": "Knoblauchpulver"
},
"oregano": {
"aliases": [],
@@ -5884,13 +5884,13 @@
"aliases": [],
"description": "",
"name": "Chilipulver",
"plural_name": "chili powder"
"plural_name": "Chilipulver"
},
"paprika": {
"aliases": [],
"description": "",
"name": "Paprika",
"plural_name": "paprika"
"plural_name": "Paprikas"
},
"cayenne": {
"aliases": [],
@@ -5926,13 +5926,13 @@
"aliases": [],
"description": "",
"name": "Zwiebelpulver",
"plural_name": "onion powder"
"plural_name": "Zwiebelpulver"
},
"ginger powder": {
"aliases": [],
"description": "",
"name": "Ingwerpulver",
"plural_name": "ginger powder"
"plural_name": "Ingwerpulver"
},
"panch puran": {
"aliases": [],
@@ -5968,7 +5968,7 @@
"aliases": [],
"description": "",
"name": "geräucherter Paprika",
"plural_name": "smoked paprika"
"plural_name": "geräucherte Paprika"
},
"fresh mint": {
"aliases": [],
@@ -5980,7 +5980,7 @@
"aliases": [],
"description": "",
"name": "Koriander-Pulver",
"plural_name": "coriander powder"
"plural_name": "Korianderpulver"
},
"sage": {
"aliases": [],
@@ -6022,7 +6022,7 @@
"aliases": [],
"description": "",
"name": "Weißer Pfeffer",
"plural_name": "white pepper"
"plural_name": "Weißer Pfeffer"
},
"curry leaf": {
"aliases": [],
@@ -6094,7 +6094,7 @@
"aliases": [],
"description": "",
"name": "Chipotlepulver",
"plural_name": "chipotle powder"
"plural_name": "Chipotlepulver"
},
"chipotle": {
"aliases": [],
@@ -6118,7 +6118,7 @@
"aliases": [],
"description": "",
"name": "Matcha-Pulver",
"plural_name": "matcha powder"
"plural_name": "Matcha-Pulver"
},
"ancho chile powder": {
"aliases": [],
@@ -6208,7 +6208,7 @@
"aliases": [],
"description": "",
"name": "Mango-Pulver",
"plural_name": "mango powder"
"plural_name": "Mangopulver"
},
"black mustard seed": {
"aliases": [],
@@ -6250,13 +6250,13 @@
"aliases": [],
"description": "",
"name": "Scharfe Paprika",
"plural_name": "hot paprika"
"plural_name": "Scharfe Paprikas"
},
"lemon thyme": {
"aliases": [],
"description": "",
"name": "Zitronenthymian",
"plural_name": "lemon thyme"
"plural_name": "Zitronenthymian"
},
"galangal": {
"aliases": [],
@@ -6334,7 +6334,7 @@
"aliases": [],
"description": "",
"name": "Gochugaru",
"plural_name": "gochugaru"
"plural_name": "Gochugaru"
},
"saigon cinnamon": {
"aliases": [],
@@ -6428,7 +6428,7 @@
"aliases": [],
"description": "",
"name": "Zucker",
"plural_name": "sugar"
"plural_name": "Zucker"
},
"brown sugar": {
"aliases": [
@@ -6436,7 +6436,7 @@
],
"description": "",
"name": "Brauner Zucker",
"plural_name": "brown sugar"
"plural_name": "Brauner Zucker"
},
"confectioners sugar": {
"aliases": [
@@ -6445,7 +6445,7 @@
],
"description": "",
"name": "Puderzucker",
"plural_name": "confectioners sugar"
"plural_name": "Puderzucker"
},
"bar sugar": {
"aliases": [
@@ -6453,25 +6453,25 @@
],
"description": "",
"name": "Rohrzucker",
"plural_name": "bar sugar"
"plural_name": "Rohrzucker"
},
"maple syrup": {
"aliases": [],
"description": "",
"name": "Ahornsirup",
"plural_name": "maple syrup"
"plural_name": "Ahornsirup"
},
"corn syrup": {
"aliases": [],
"description": "",
"name": "Maissirup",
"plural_name": "corn syrup"
"plural_name": "Maissirup"
},
"coconut sugar": {
"aliases": [],
"description": "",
"name": "Kokosblütenzucker",
"plural_name": "coconut sugar"
"plural_name": "Kokosblütenzucker"
},
"molasses": {
"aliases": [],

View File

@@ -261,8 +261,8 @@
"mixed greens": {
"aliases": [],
"description": "",
"name": "gemengde groenten",
"plural_name": "gemengde groenten"
"name": "gemengde sla",
"plural_name": "gemengde sla"
},
"parsnip": {
"aliases": [],
@@ -2193,20 +2193,20 @@
"halloumi cheese": {
"aliases": [],
"description": "",
"name": "halloumi cheese",
"plural_name": "halloumi cheese"
"name": "halloumi kaas",
"plural_name": "halloumi kaas"
},
"chevre cheese": {
"aliases": [],
"description": "",
"name": "chevre cheese",
"plural_name": "chevre cheese"
"name": "chèvre",
"plural_name": "chèvre"
},
"manchego cheese": {
"aliases": [],
"description": "",
"name": "manchego cheese",
"plural_name": "manchego cheese"
"name": "manchego",
"plural_name": "manchego"
},
"italian cheese blend": {
"aliases": [],
@@ -2229,8 +2229,8 @@
"burrata cheese": {
"aliases": [],
"description": "",
"name": "burrata cheese",
"plural_name": "burrata cheese"
"name": "burrata",
"plural_name": "burrata"
},
"havarti cheese": {
"aliases": [],
@@ -2277,8 +2277,8 @@
"stilton cheese": {
"aliases": [],
"description": "",
"name": "stilton cheese",
"plural_name": "stilton cheese"
"name": "stilton",
"plural_name": "stilton"
},
"raclette cheese": {
"aliases": [],
@@ -2457,8 +2457,8 @@
"hard goat cheese": {
"aliases": [],
"description": "",
"name": "hard goat cheese",
"plural_name": "hard goat cheese"
"name": "harde geitenkaas",
"plural_name": "harde geitenkaas"
},
"kashkaval cheese": {
"aliases": [],
@@ -3124,7 +3124,7 @@
"aliases": [],
"description": "",
"name": "geitenkefir",
"plural_name": "goat kefirs"
"plural_name": "geitenkefir"
},
"lebneh": {
"aliases": [],

View File

@@ -144,14 +144,14 @@
"cauliflower": {
"aliases": [],
"description": "",
"name": "сунцокрет",
"plural_name": "сунцокрет"
"name": "карфиол",
"plural_name": "карфиол"
},
"cabbage": {
"aliases": [],
"description": "",
"name": "купус",
"plural_name": "cabbages"
"plural_name": "купус"
},
"asparagus": {
"aliases": [],
@@ -303,14 +303,14 @@
"cayenne pepper": {
"aliases": [],
"description": "",
"name": "cayenne pepper",
"plural_name": "cayenne pepper"
"name": "кајенска паприка",
"plural_name": "кајенска паприка"
},
"green tomato": {
"aliases": [],
"description": "",
"name": "green tomato",
"plural_name": "green tomatoes"
"name": "зелени парадајз",
"plural_name": "зелени парадајз"
},
"watercress": {
"aliases": [],
@@ -321,8 +321,8 @@
"iceberg lettuce": {
"aliases": [],
"description": "",
"name": "iceberg lettuce",
"plural_name": "iceberg lettuce"
"name": "ајсберг салата",
"plural_name": "ајсберг салата"
},
"mashed potato": {
"aliases": [],
@@ -345,8 +345,8 @@
"pimiento": {
"aliases": [],
"description": "",
"name": "pimiento",
"plural_name": "pimientos"
"name": "пинмент",
"plural_name": "пимент"
},
"spaghetti squash": {
"aliases": [],
@@ -377,8 +377,8 @@
"celeriac": {
"aliases": [],
"description": "",
"name": "celeriac",
"plural_name": "celeriacs"
"name": "целер",
"plural_name": "целер"
},
"water chestnut": {
"aliases": [],
@@ -425,8 +425,8 @@
"radicchio": {
"aliases": [],
"description": "",
"name": "radicchio",
"plural_name": "radicchio"
"name": "радич",
"plural_name": "радич"
},
"pearl onion": {
"aliases": [],
@@ -479,16 +479,16 @@
"habanero pepper": {
"aliases": [],
"description": "",
"name": "habanero pepper",
"plural_name": "habanero peppers"
"name": "хабанеро паприка",
"plural_name": "хабанеро паприка"
},
"maize": {
"aliases": [
"corn husk"
],
"description": "",
"name": "maize",
"plural_name": "maize"
"name": "кукуруз",
"plural_name": "кукуруз"
},
"collard greens": {
"aliases": [],
@@ -511,8 +511,8 @@
"baby corn": {
"aliases": [],
"description": "",
"name": "baby corn",
"plural_name": "baby corns"
"name": "беби кукуруз",
"plural_name": "беби кукуруз"
},
"broccoli rabe": {
"aliases": [],
@@ -621,8 +621,8 @@
"alfalfa": {
"aliases": [],
"description": "",
"name": "alfalfa",
"plural_name": "alfalfa"
"name": "алфалфа",
"plural_name": "алфалфа"
}
}
},
@@ -630,75 +630,75 @@
"foods": {
"tomato": {
"aliases": [],
"description": "Yes they are a fruit",
"name": "tomato",
"plural_name": "tomatoes"
"description": "да то је воће",
"name": "парадајз",
"plural_name": "парадајз"
},
"lemon": {
"aliases": [],
"description": "",
"name": "lemon",
"plural_name": "lemons"
"name": "лимун",
"plural_name": "лимун"
},
"lime": {
"aliases": [],
"description": "",
"name": "lime",
"plural_name": "limes"
"name": "лимета",
"plural_name": "лимета"
},
"apple": {
"aliases": [],
"description": "",
"name": "apple",
"plural_name": "apples"
"name": "јабука",
"plural_name": "јабука"
},
"banana": {
"aliases": [],
"description": "",
"name": "banana",
"plural_name": "bananas"
"name": "банана",
"plural_name": "банана"
},
"orange": {
"aliases": [],
"description": "",
"name": "orange",
"plural_name": "oranges"
"name": "наранџа",
"plural_name": "наранџа"
},
"raisin": {
"aliases": [],
"description": "",
"name": "raisin",
"plural_name": "raisins"
"name": "суво грожђе",
"plural_name": "суво грожђе"
},
"pineapple": {
"aliases": [],
"description": "",
"name": "pineapple",
"plural_name": "pineapples"
"name": "ананас",
"plural_name": "ананас"
},
"mango": {
"aliases": [],
"description": "",
"name": "mango",
"plural_name": "mangoes"
"name": "манго",
"plural_name": "манго"
},
"peach": {
"aliases": [],
"description": "",
"name": "peach",
"plural_name": "peaches"
"name": "бресква",
"plural_name": "бресква"
},
"date": {
"aliases": [],
"description": "",
"name": "date",
"plural_name": "dates"
"name": "урма",
"plural_name": "урма"
},
"coconut": {
"aliases": [],
"description": "",
"name": "coconut",
"plural_name": "coconuts"
"name": "кокос",
"plural_name": "кокос"
},
"craisin": {
"aliases": [],
@@ -709,68 +709,68 @@
"pear": {
"aliases": [],
"description": "",
"name": "pear",
"plural_name": "pears"
"name": "крушка",
"plural_name": "крушка"
},
"grape": {
"aliases": [],
"description": "",
"name": "grape",
"plural_name": "grapes"
"name": "грожђе",
"plural_name": "горжђе"
},
"pomegranate": {
"aliases": [],
"description": "",
"name": "pomegranate",
"plural_name": "pomegranates"
"name": "поморанџа",
"plural_name": "поморанџа"
},
"watermelon": {
"aliases": [],
"description": "",
"name": "watermelon",
"plural_name": "watermelons"
"name": "лубеница",
"plural_name": "лубеница"
},
"rhubarb": {
"aliases": [],
"description": "",
"name": "rhubarb",
"plural_name": "rhubarbs"
"name": "рабарбара",
"plural_name": "рабарабара"
},
"dried apricot": {
"aliases": [],
"description": "",
"name": "dried apricot",
"plural_name": "dried apricots"
"name": "сува кајсија",
"plural_name": "сува кајсија"
},
"kiwi": {
"aliases": [],
"description": "",
"name": "kiwi",
"plural_name": "kiwis"
"name": "киви",
"plural_name": "киви"
},
"grapefruit": {
"aliases": [],
"description": "",
"name": "grapefruit",
"plural_name": "grapefruits"
"name": "зрно грожђа",
"plural_name": "зрно горжђа"
},
"plum": {
"aliases": [],
"description": "",
"name": "plum",
"plural_name": "plums"
"name": "шљива",
"plural_name": "шљива"
},
"fig": {
"aliases": [],
"description": "",
"name": "fig",
"plural_name": "figs"
"name": "смоква",
"plural_name": "смоква"
},
"apricot": {
"aliases": [],
"description": "",
"name": "apricot",
"plural_name": "apricots"
"name": "кајсија",
"plural_name": "кајсија"
},
"currant": {
"aliases": [],
@@ -781,38 +781,38 @@
"mandarin": {
"aliases": [],
"description": "",
"name": "mandarin",
"plural_name": "mandarins"
"name": "мандарина",
"plural_name": "мандарина"
},
"prune": {
"aliases": [],
"description": "",
"name": "prune",
"plural_name": "prunes"
"name": "сува шљива",
"plural_name": "сува шљива"
},
"cantaloupe": {
"aliases": [],
"description": "",
"name": "cantaloupe",
"plural_name": "cantaloupes"
"name": "канталупа диња",
"plural_name": "канталупа диња"
},
"sultana": {
"aliases": [],
"description": "",
"name": "sultana",
"plural_name": "sultanas"
"name": "султана бело грожђе",
"plural_name": "султана бело грожђе"
},
"passion fruit": {
"aliases": [],
"description": "",
"name": "passion fruit",
"plural_name": "passion fruits"
"name": "маракуја",
"plural_name": "маракуја"
},
"papaya": {
"aliases": [],
"description": "",
"name": "papaya",
"plural_name": "papayas"
"name": "папаја",
"plural_name": "папаја"
},
"tamarind": {
"aliases": [],
@@ -823,56 +823,56 @@
"nectarine": {
"aliases": [],
"description": "",
"name": "nectarine",
"plural_name": "nectarines"
"name": "нектарина",
"plural_name": "нектарина"
},
"dried fig": {
"aliases": [],
"description": "",
"name": "dried fig",
"plural_name": "dried figs"
"name": "сува смоква",
"plural_name": "сува смоква"
},
"chestnut": {
"aliases": [],
"description": "",
"name": "chestnut",
"plural_name": "chestnuts"
"name": "кестен",
"plural_name": "нестен"
},
"meyer lemon": {
"aliases": [],
"description": "",
"name": "meyer lemon",
"plural_name": "meyer lemons"
"name": "мејер лимун",
"plural_name": "мејер лимун"
},
"honeydew melon": {
"aliases": [],
"description": "",
"name": "honeydew melon",
"plural_name": "honeydew melons"
"name": "диња медена роса",
"plural_name": "диња медена роса"
},
"dried fruit": {
"aliases": [],
"description": "",
"name": "dried fruit",
"plural_name": "dried fruits"
"name": "суво воће",
"plural_name": "суво воће"
},
"clementine": {
"aliases": [],
"description": "",
"name": "clementine",
"plural_name": "clementines"
"name": "клементина",
"plural_name": "клементина"
},
"persimmon": {
"aliases": [],
"description": "",
"name": "persimmon",
"plural_name": "persimmons"
"name": "јапанска јабука - персимон",
"plural_name": "јапанска јабука - персимон"
},
"melon": {
"aliases": [],
"description": "",
"name": "melon",
"plural_name": "melons"
"name": "диња",
"plural_name": "диња"
},
"tangerine": {
"aliases": [],
@@ -883,38 +883,38 @@
"dried mango": {
"aliases": [],
"description": "",
"name": "dried mango",
"plural_name": "dried mangoes"
"name": "сушени манго",
"plural_name": "сушени манго"
},
"dried apple": {
"aliases": [],
"description": "",
"name": "dried apple",
"plural_name": "dried apples"
"name": "сушена јабука",
"plural_name": "сушена јабука"
},
"quince": {
"aliases": [],
"description": "",
"name": "quince",
"plural_name": "quinces"
"name": "дуња",
"plural_name": "дуња"
},
"guava": {
"aliases": [],
"description": "",
"name": "guava",
"plural_name": "guavas"
"name": "гуава",
"plural_name": "гуава"
},
"banana chip": {
"aliases": [],
"description": "",
"name": "banana chip",
"plural_name": "banana chips"
"name": "банана чипс",
"plural_name": "банана чипс"
},
"kumquat": {
"aliases": [],
"description": "",
"name": "kumquat",
"plural_name": "kumquats"
"name": "кумкват",
"plural_name": "кумкват"
},
"jackfruit": {
"aliases": [],
@@ -925,20 +925,20 @@
"dragon fruit": {
"aliases": [],
"description": "",
"name": "dragon fruit",
"plural_name": "dragon fruits"
"name": "змајево воће",
"plural_name": "змајево воће"
},
"mixed fruit": {
"aliases": [],
"description": "",
"name": "mixed fruit",
"plural_name": "mixed fruits"
"name": "мешано воће",
"plural_name": "мешано воће"
},
"asian pear": {
"aliases": [],
"description": "",
"name": "asian pear",
"plural_name": "asian pears"
"name": "азијска крушка",
"plural_name": "азијска крушка"
},
"lychee": {
"aliases": [],
@@ -949,38 +949,38 @@
"young coconut": {
"aliases": [],
"description": "",
"name": "young coconut",
"plural_name": "young coconuts"
"name": "млади кокос",
"plural_name": "млади кокос"
},
"kaffir lime": {
"aliases": [],
"description": "",
"name": "kaffir lime",
"plural_name": "kaffir limes"
"name": "кафир лимета",
"plural_name": "кафир лимета"
},
"star fruit": {
"aliases": [],
"description": "",
"name": "star fruit",
"plural_name": "star fruits"
"name": "звездасто воће",
"plural_name": "звездасто воће"
},
"green papaya": {
"aliases": [],
"description": "",
"name": "green papaya",
"plural_name": "green papayas"
"name": "зелена папаја",
"plural_name": "зелена папаја"
},
"pomelo": {
"aliases": [],
"description": "",
"name": "pomelo",
"plural_name": "pomelos"
"name": "помело",
"plural_name": "помело"
},
"chestnut purée": {
"aliases": [],
"description": "",
"name": "chestnut purée",
"plural_name": "chestnut purée"
"name": "кестен пире",
"plural_name": "кестен пире"
},
"prickly pear": {
"aliases": [],
@@ -1033,20 +1033,20 @@
"dried lime": {
"aliases": [],
"description": "",
"name": "dried lime",
"plural_name": "dried limes"
"name": "сушена лимета",
"plural_name": "сушена лимета"
},
"jujube": {
"aliases": [],
"description": "",
"name": "jujube",
"plural_name": "jujubes"
"name": "јујуба",
"plural_name": "јујубс"
},
"sweet lime": {
"aliases": [],
"description": "",
"name": "sweet lime",
"plural_name": "sweet limes"
"name": "слатки лимун",
"plural_name": "слатки лимун"
},
"custard-apple": {
"aliases": [],
@@ -1057,8 +1057,8 @@
"dried lemon": {
"aliases": [],
"description": "",
"name": "dried lemon",
"plural_name": "dried lemons"
"name": "сушени лимун",
"plural_name": "сушени лимун"
},
"young jackfruit": {
"aliases": [],
@@ -1069,8 +1069,8 @@
"durian": {
"aliases": [],
"description": "",
"name": "durian",
"plural_name": "durians"
"name": "дуриан",
"plural_name": "дуриан"
},
"freeze-dried apple": {
"aliases": [],
@@ -1087,8 +1087,8 @@
"honey date": {
"aliases": [],
"description": "",
"name": "honey date",
"plural_name": "honey dates"
"name": "медена урма",
"plural_name": "медена урма"
},
"physali": {
"aliases": [],
@@ -1099,8 +1099,8 @@
"tamarillo": {
"aliases": [],
"description": "",
"name": "tamarillo",
"plural_name": "tamarillos"
"name": "тамарило",
"plural_name": "тамарило"
},
"ice-apple": {
"aliases": [],
@@ -1123,14 +1123,14 @@
"bitter orange": {
"aliases": [],
"description": "",
"name": "bitter orange",
"plural_name": "bitter oranges"
"name": "горка поморанџа",
"plural_name": "горка поморанџа"
},
"feijoa": {
"aliases": [],
"description": "",
"name": "feijoa",
"plural_name": "feijoas"
"name": "феђоја",
"plural_name": "феђоја"
},
"dried persimmon": {
"aliases": [],
@@ -1171,8 +1171,8 @@
"fig leaf": {
"aliases": [],
"description": "",
"name": "fig leaf",
"plural_name": "fig leaves"
"name": "смоквин лист",
"plural_name": "смоквин лист"
},
"freeze-dried pineapple": {
"aliases": [],
@@ -1231,8 +1231,8 @@
"kiwano": {
"aliases": [],
"description": "",
"name": "kiwano",
"plural_name": "kiwanos"
"name": "кивано",
"plural_name": "кивано"
}
}
},
@@ -1241,14 +1241,14 @@
"button mushroom": {
"aliases": [],
"description": "",
"name": "button mushroom",
"plural_name": "button mushrooms"
"name": "шампињони",
"plural_name": "шампињони"
},
"shiitake mushroom": {
"aliases": [],
"description": "",
"name": "shiitake mushroom",
"plural_name": "shiitake mushrooms"
"name": "шитаке",
"plural_name": "шитаке"
},
"portobello mushroom": {
"aliases": [],
@@ -1259,74 +1259,74 @@
"wild mushroom": {
"aliases": [],
"description": "",
"name": "wild mushroom",
"plural_name": "wild mushrooms"
"name": "шумске печурке ",
"plural_name": "шумске печурке"
},
"porcini": {
"aliases": [],
"description": "",
"name": "porcini",
"plural_name": "porcinis"
"name": "прави вргањ",
"plural_name": "прави вргањ"
},
"mixed mushroom": {
"aliases": [],
"description": "",
"name": "mixed mushroom",
"plural_name": "mixed mushrooms"
"name": "микс печурки",
"plural_name": "микс печурки"
},
"oyster mushroom": {
"aliases": [],
"description": "",
"name": "oyster mushroom",
"plural_name": "oyster mushrooms"
"name": "буковаче",
"plural_name": "буковаче"
},
"chestnut mushroom": {
"aliases": [],
"description": "",
"name": "chestnut mushroom",
"plural_name": "chestnut mushrooms"
"name": "смеђи шампињони",
"plural_name": "смеђи шампињони"
},
"enoki mushroom": {
"aliases": [],
"description": "",
"name": "enoki mushroom",
"plural_name": "enoki mushrooms"
"name": "еноки печурке",
"plural_name": "еноки печурке"
},
"black fungu": {
"aliases": [],
"description": "",
"name": "black fungus",
"plural_name": "black fungus"
"name": "црне печурке",
"plural_name": "црне печурке"
},
"black truffle": {
"aliases": [],
"description": "",
"name": "black truffle",
"plural_name": "black truffles"
"name": "црни тартуф",
"plural_name": "црни тартуф"
},
"morel mushroom": {
"aliases": [],
"description": "",
"name": "morel mushroom",
"plural_name": "morel mushrooms"
"name": "смрчак",
"plural_name": "смрчак"
},
"field mushroom": {
"aliases": [],
"description": "",
"name": "field mushroom",
"plural_name": "field mushrooms"
"name": "рудњача",
"plural_name": "рудњача"
},
"king oyster mushroom": {
"aliases": [],
"description": "",
"name": "king oyster mushroom",
"plural_name": "king oyster mushrooms"
"name": "краљевска буковача",
"plural_name": "краљевска буковача"
},
"shimeji mushroom": {
"aliases": [],
"description": "",
"name": "shimeji mushroom",
"plural_name": "shimeji mushrooms"
"name": "шимеји печурке",
"plural_name": "шимеји печурке"
},
"straw mushroom": {
"aliases": [],
@@ -1337,26 +1337,26 @@
"dried chinese mushroom": {
"aliases": [],
"description": "",
"name": "dried chinese mushroom",
"plural_name": "dried chinese mushrooms"
"name": "суве кинеске печурке",
"plural_name": "суве кинеске печурке"
},
"maitake": {
"aliases": [],
"description": "",
"name": "maitake",
"plural_name": "maitakes"
"name": "зечарка (маитаке)",
"plural_name": "зечарка (маитаке)"
},
"trumpet mushroom": {
"aliases": [],
"description": "",
"name": "trumpet mushroom",
"plural_name": "trumpet mushrooms"
"name": "црна труба",
"plural_name": "црна труба"
},
"white truffle": {
"aliases": [],
"description": "",
"name": "white truffle",
"plural_name": "white truffles"
"name": "бели тартуф",
"plural_name": "бели тартуф"
},
"white fungu": {
"aliases": [],
@@ -1385,14 +1385,14 @@
"boletu": {
"aliases": [],
"description": "",
"name": "boletus",
"plural_name": "boletus"
"name": "вргањ",
"plural_name": "вргањ"
},
"huitlacoche": {
"aliases": [],
"description": "",
"name": "huitlacoche",
"plural_name": "huitlacoches"
"name": "мехураста гар",
"plural_name": "матсутаке"
},
"matsutake": {
"aliases": [],
@@ -1421,8 +1421,8 @@
"puffball": {
"aliases": [],
"description": "",
"name": "puffball",
"plural_name": "puffballs"
"name": "пухара",
"plural_name": "пухара"
},
"honey fungu": {
"aliases": [],
@@ -13848,8 +13848,8 @@
"cream of cauliflower": {
"aliases": [],
"description": "",
"name": "cream of cauliflower",
"plural_name": "cream of cauliflower"
"name": "пире од карфиола",
"plural_name": "пире од карфиола"
},
"dashida": {
"aliases": [],

View File

@@ -139,8 +139,8 @@
"abbreviation": ""
},
"sprig": {
"name": "sprig",
"plural_name": "sprigs",
"name": "Zweig",
"plural_name": "Zweige",
"description": "",
"abbreviation": ""
}

View File

@@ -99,7 +99,12 @@ async def oauth_login(request: Request):
# in development, we want to redirect to the frontend
redirect_url = "http://localhost:3000/login"
else:
redirect_url = URLPath("/login").make_absolute_url(request.base_url)
# Prioritize User Configuration over Request Headers.
if not settings.is_default_base_url:
base = settings.BASE_URL or request.base_url
else:
base = request.base_url
redirect_url = URLPath("/login").make_absolute_url(base)
response: RedirectResponse = await client.authorize_redirect(request, redirect_url)
return response

View File

@@ -1,4 +1,4 @@
from enum import Enum
from enum import StrEnum
from fastapi import APIRouter, HTTPException, status
from pydantic import UUID4
@@ -10,7 +10,7 @@ from mealie.schema.recipe.recipe_timeline_events import RecipeTimelineEventOut
router = APIRouter(prefix="/recipes")
class ImageType(str, Enum):
class ImageType(StrEnum):
original = "original.webp"
small = "min-original.webp"
tiny = "tiny-original.webp"

View File

@@ -3,7 +3,7 @@ import enum
from mealie.schema._mealie import MealieModel
class SupportedMigrations(str, enum.Enum):
class SupportedMigrations(enum.StrEnum):
nextcloud = "nextcloud"
chowdown = "chowdown"
copymethat = "copymethat"

View File

@@ -9,7 +9,7 @@ from mealie.schema._mealie.datetime_parse import parse_datetime
from mealie.schema.response.pagination import PaginationBase
class WebhookType(str, enum.Enum):
class WebhookType(enum.StrEnum):
mealplan = "mealplan"

View File

@@ -1,5 +1,5 @@
from datetime import date
from enum import Enum
from enum import StrEnum
from typing import Annotated
from uuid import UUID
@@ -16,7 +16,7 @@ from mealie.schema.recipe.recipe import RecipeSummary
from mealie.schema.response.pagination import PaginationBase
class PlanEntryType(str, Enum):
class PlanEntryType(StrEnum):
breakfast = "breakfast"
lunch = "lunch"
dinner = "dinner"

View File

@@ -1,5 +1,5 @@
import datetime
from enum import Enum
from enum import StrEnum
from typing import Annotated
import sqlalchemy as sa
@@ -14,7 +14,7 @@ from mealie.services.query_filter.builder import QueryFilterBuilder, QueryFilter
logger = get_logger()
class PlanRulesDay(str, Enum):
class PlanRulesDay(StrEnum):
monday = "monday"
tuesday = "tuesday"
wednesday = "wednesday"
@@ -33,7 +33,7 @@ class PlanRulesDay(str, Enum):
return PlanRulesDay.unset
class PlanRulesType(str, Enum):
class PlanRulesType(StrEnum):
breakfast = "breakfast"
lunch = "lunch"
dinner = "dinner"

View File

@@ -5,7 +5,7 @@ from mealie.schema.recipe.recipe_category import CategoryBase, TagBase
from mealie.schema.recipe.recipe_settings import RecipeSettings
class ExportTypes(str, enum.Enum):
class ExportTypes(enum.StrEnum):
JSON = "json"

View File

@@ -1,7 +1,7 @@
from enum import Enum
from enum import StrEnum
class RecipeImageTypes(str, Enum):
class RecipeImageTypes(StrEnum):
original = "original.webp"
min = "min-original.webp"
tiny = "tiny-original.webp"

View File

@@ -320,7 +320,7 @@ class ParsedIngredient(MealieModel):
ingredient: RecipeIngredient
class RegisteredParser(str, enum.Enum):
class RegisteredParser(enum.StrEnum):
nlp = "nlp"
brute = "brute"
openai = "openai"

View File

@@ -11,14 +11,14 @@ from mealie.db.models.group import ReportModel
from mealie.schema._mealie import MealieModel
class ReportCategory(str, enum.Enum):
class ReportCategory(enum.StrEnum):
backup = "backup"
restore = "restore"
migration = "migration"
bulk_import = "bulk_import"
class ReportSummaryStatus(str, enum.Enum):
class ReportSummaryStatus(enum.StrEnum):
in_progress = "in-progress"
success = "success"
failure = "failure"

View File

@@ -9,12 +9,12 @@ from pydantic_core.core_schema import ValidationInfo
from mealie.schema._mealie import MealieModel
class OrderDirection(str, enum.Enum):
class OrderDirection(enum.StrEnum):
asc = "asc"
desc = "desc"
class OrderByNullPosition(str, enum.Enum):
class OrderByNullPosition(enum.StrEnum):
first = "first"
last = "last"

View File

@@ -7,7 +7,7 @@ from mealie.schema.recipe.recipe_image_types import RecipeImageTypes
from mealie.services._base_service import BaseService
class TemplateType(str, enum.Enum):
class TemplateType(enum.StrEnum):
json = "json"
zip = "zip"

View File

@@ -1,4 +1,4 @@
from enum import Enum
from enum import StrEnum
from re import search as regex_search
from uuid import uuid4
@@ -15,7 +15,7 @@ from mealie.services.scraper.scraped_extras import ScrapedExtras
from .recipe_scraper import RecipeScraper
class ParserErrors(str, Enum):
class ParserErrors(StrEnum):
BAD_RECIPE_DATA = "BAD_RECIPE_DATA"
NO_RECIPE_DATA = "NO_RECIPE_DATA"
CONNECTION_ERROR = "CONNECTION_ERROR"

View File

@@ -1,6 +1,6 @@
[project]
name = "mealie"
version = "3.10.1"
version = "3.10.2"
description = "A Recipe Manager"
authors = [{ name = "Hayden", email = "hay-kot@pm.me" }]
license = "AGPL-3.0-only"
@@ -17,7 +17,7 @@ dependencies = [
"apprise==1.9.7",
"bcrypt==5.0.0",
"extruct==0.18.0",
"fastapi==0.128.0",
"fastapi==0.128.1",
"httpx==0.28.1",
"lxml==6.0.2",
"orjson==3.11.7",
@@ -61,7 +61,7 @@ docs = [
"mkdocs-material==9.7.1",
]
dev = [
"coverage==7.13.2",
"coverage==7.13.3",
"coveragepy-lcov==0.1.2",
"mkdocs-material==9.7.1",
"mypy==1.19.1",
@@ -70,7 +70,7 @@ dev = [
"pytest==9.0.2",
"pytest-asyncio==1.3.0",
"rich==14.3.2",
"ruff==0.14.14",
"ruff==0.15.0",
"types-PyYAML==6.0.12.20250915",
"types-python-dateutil==2.9.0.20260124",
"types-python-slugify==8.0.2.20240310",

View File

@@ -27,6 +27,7 @@ services:
network_mode: host
environment:
ALLOW_SIGNUP: True
BASE_URL: http://localhost:9000
DB_ENGINE: sqlite
OIDC_AUTH_ENABLED: True

85
uv.lock generated
View File

@@ -275,24 +275,24 @@ wheels = [
[[package]]
name = "coverage"
version = "7.13.2"
version = "7.13.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" }
sdist = { url = "https://files.pythonhosted.org/packages/11/43/3e4ac666cc35f231fa70c94e9f38459299de1a152813f9d2f60fc5f3ecaf/coverage-7.13.3.tar.gz", hash = "sha256:f7f6182d3dfb8802c1747eacbfe611b669455b69b7c037484bb1efbbb56711ac", size = 826832, upload-time = "2026-02-03T14:02:30.944Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" },
{ url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" },
{ url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" },
{ url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" },
{ url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" },
{ url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" },
{ url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" },
{ url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" },
{ url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" },
{ url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" },
{ url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" },
{ url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" },
{ url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" },
{ url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" },
{ url = "https://files.pythonhosted.org/packages/94/44/330f8e83b143f6668778ed61d17ece9dc48459e9e74669177de02f45fec5/coverage-7.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ed48b4170caa2c4420e0cd27dc977caaffc7eecc317355751df8373dddcef595", size = 219441, upload-time = "2026-02-03T14:00:22.585Z" },
{ url = "https://files.pythonhosted.org/packages/08/e7/29db05693562c2e65bdf6910c0af2fd6f9325b8f43caf7a258413f369e30/coverage-7.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8f2adf4bcffbbec41f366f2e6dffb9d24e8172d16e91da5799c9b7ed6b5716e6", size = 219801, upload-time = "2026-02-03T14:00:24.186Z" },
{ url = "https://files.pythonhosted.org/packages/90/ae/7f8a78249b02b0818db46220795f8ac8312ea4abd1d37d79ea81db5cae81/coverage-7.13.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01119735c690786b6966a1e9f098da4cd7ca9174c4cfe076d04e653105488395", size = 251306, upload-time = "2026-02-03T14:00:25.798Z" },
{ url = "https://files.pythonhosted.org/packages/62/71/a18a53d1808e09b2e9ebd6b47dad5e92daf4c38b0686b4c4d1b2f3e42b7f/coverage-7.13.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8bb09e83c603f152d855f666d70a71765ca8e67332e5829e62cb9466c176af23", size = 254051, upload-time = "2026-02-03T14:00:27.474Z" },
{ url = "https://files.pythonhosted.org/packages/4a/0a/eb30f6455d04c5a3396d0696cad2df0269ae7444bb322f86ffe3376f7bf9/coverage-7.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b607a40cba795cfac6d130220d25962931ce101f2f478a29822b19755377fb34", size = 255160, upload-time = "2026-02-03T14:00:29.024Z" },
{ url = "https://files.pythonhosted.org/packages/7b/7e/a45baac86274ce3ed842dbb84f14560c673ad30535f397d89164ec56c5df/coverage-7.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:44f14a62f5da2e9aedf9080e01d2cda61df39197d48e323538ec037336d68da8", size = 251709, upload-time = "2026-02-03T14:00:30.641Z" },
{ url = "https://files.pythonhosted.org/packages/c0/df/dd0dc12f30da11349993f3e218901fdf82f45ee44773596050c8f5a1fb25/coverage-7.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:debf29e0b157769843dff0981cc76f79e0ed04e36bb773c6cac5f6029054bd8a", size = 253083, upload-time = "2026-02-03T14:00:32.14Z" },
{ url = "https://files.pythonhosted.org/packages/ab/32/fc764c8389a8ce95cb90eb97af4c32f392ab0ac23ec57cadeefb887188d3/coverage-7.13.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:824bb95cd71604031ae9a48edb91fd6effde669522f960375668ed21b36e3ec4", size = 251227, upload-time = "2026-02-03T14:00:34.721Z" },
{ url = "https://files.pythonhosted.org/packages/dd/ca/d025e9da8f06f24c34d2da9873957cfc5f7e0d67802c3e34d0caa8452130/coverage-7.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8f1010029a5b52dc427c8e2a8dbddb2303ddd180b806687d1acd1bb1d06649e7", size = 250794, upload-time = "2026-02-03T14:00:36.278Z" },
{ url = "https://files.pythonhosted.org/packages/45/c7/76bf35d5d488ec8f68682eb8e7671acc50a6d2d1c1182de1d2b6d4ffad3b/coverage-7.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd5dee4fd7659d8306ffa79eeaaafd91fa30a302dac3af723b9b469e549247e0", size = 252671, upload-time = "2026-02-03T14:00:38.368Z" },
{ url = "https://files.pythonhosted.org/packages/bf/10/1921f1a03a7c209e1cb374f81a6b9b68b03cdb3ecc3433c189bc90e2a3d5/coverage-7.13.3-cp312-cp312-win32.whl", hash = "sha256:f7f153d0184d45f3873b3ad3ad22694fd73aadcb8cdbc4337ab4b41ea6b4dff1", size = 221986, upload-time = "2026-02-03T14:00:40.442Z" },
{ url = "https://files.pythonhosted.org/packages/3c/7c/f5d93297f8e125a80c15545edc754d93e0ed8ba255b65e609b185296af01/coverage-7.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:03a6e5e1e50819d6d7436f5bc40c92ded7e484e400716886ac921e35c133149d", size = 222793, upload-time = "2026-02-03T14:00:42.106Z" },
{ url = "https://files.pythonhosted.org/packages/43/59/c86b84170015b4555ebabca8649bdf9f4a1f737a73168088385ed0f947c4/coverage-7.13.3-cp312-cp312-win_arm64.whl", hash = "sha256:51c4c42c0e7d09a822b08b6cf79b3c4db8333fffde7450da946719ba0d45730f", size = 221410, upload-time = "2026-02-03T14:00:43.726Z" },
{ url = "https://files.pythonhosted.org/packages/7d/fb/70af542d2d938c778c9373ce253aa4116dbe7c0a5672f78b2b2ae0e1b94b/coverage-7.13.3-py3-none-any.whl", hash = "sha256:90a8af9dba6429b2573199622d72e0ebf024d6276f16abce394ad4d181bb0910", size = 211237, upload-time = "2026-02-03T14:02:27.986Z" },
]
[[package]]
@@ -397,7 +397,7 @@ wheels = [
[[package]]
name = "fastapi"
version = "0.128.0"
version = "0.128.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "annotated-doc" },
@@ -405,9 +405,9 @@ dependencies = [
{ name = "starlette" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682, upload-time = "2025-12-27T15:21:13.714Z" }
sdist = { url = "https://files.pythonhosted.org/packages/f6/59/28bde150415783ff084334e3de106eb7461a57864cf69f343950ad5a5ddd/fastapi-0.128.1.tar.gz", hash = "sha256:ce5be4fa26d4ce6f54debcc873d1fb8e0e248f5c48d7502ba6c61457ab2dc766", size = 374260, upload-time = "2026-02-04T17:35:10.542Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094, upload-time = "2025-12-27T15:21:12.154Z" },
{ url = "https://files.pythonhosted.org/packages/1a/08/3953db1979ea131c68279b997c6465080118b407f0800445b843f8e164b3/fastapi-0.128.1-py3-none-any.whl", hash = "sha256:ee82146bbf91ea5bbf2bb8629e4c6e056c4fbd997ea6068501b11b15260b50fb", size = 103810, upload-time = "2026-02-04T17:35:08.02Z" },
]
[[package]]
@@ -822,7 +822,7 @@ wheels = [
[[package]]
name = "mealie"
version = "3.10.1"
version = "3.10.2"
source = { editable = "." }
dependencies = [
{ name = "aiofiles" },
@@ -907,7 +907,7 @@ requires-dist = [
{ name = "bcrypt", specifier = "==5.0.0" },
{ name = "beautifulsoup4", specifier = "==4.14.3" },
{ name = "extruct", specifier = "==0.18.0" },
{ name = "fastapi", specifier = "==0.128.0" },
{ name = "fastapi", specifier = "==0.128.1" },
{ name = "html2text", specifier = "==2025.4.15" },
{ name = "httpx", specifier = "==0.28.1" },
{ name = "ingredient-parser-nlp", specifier = "==2.5.0" },
@@ -944,7 +944,7 @@ provides-extras = ["pgsql"]
[package.metadata.requires-dev]
dev = [
{ name = "coverage", specifier = "==7.13.2" },
{ name = "coverage", specifier = "==7.13.3" },
{ name = "coveragepy-lcov", specifier = "==0.1.2" },
{ name = "freezegun", specifier = "==1.5.5" },
{ name = "mkdocs-material", specifier = "==9.7.1" },
@@ -955,7 +955,7 @@ dev = [
{ name = "pytest", specifier = "==9.0.2" },
{ name = "pytest-asyncio", specifier = "==1.3.0" },
{ name = "rich", specifier = "==14.3.2" },
{ name = "ruff", specifier = "==0.14.14" },
{ name = "ruff", specifier = "==0.15.0" },
{ name = "types-python-dateutil", specifier = "==2.9.0.20260124" },
{ name = "types-python-slugify", specifier = "==8.0.2.20240310" },
{ name = "types-pyyaml", specifier = "==6.0.12.20250915" },
@@ -1737,28 +1737,27 @@ wheels = [
[[package]]
name = "ruff"
version = "0.14.14"
version = "0.15.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" }
sdist = { url = "https://files.pythonhosted.org/packages/c8/39/5cee96809fbca590abea6b46c6d1c586b49663d1d2830a751cc8fc42c666/ruff-0.15.0.tar.gz", hash = "sha256:6bdea47cdbea30d40f8f8d7d69c0854ba7c15420ec75a26f463290949d7f7e9a", size = 4524893, upload-time = "2026-02-03T17:53:35.357Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" },
{ url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" },
{ url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" },
{ url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" },
{ url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" },
{ url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" },
{ url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" },
{ url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" },
{ url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" },
{ url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" },
{ url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" },
{ url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" },
{ url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" },
{ url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" },
{ url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" },
{ url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" },
{ url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" },
{ url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" },
{ url = "https://files.pythonhosted.org/packages/bc/88/3fd1b0aa4b6330d6aaa63a285bc96c9f71970351579152d231ed90914586/ruff-0.15.0-py3-none-linux_armv6l.whl", hash = "sha256:aac4ebaa612a82b23d45964586f24ae9bc23ca101919f5590bdb368d74ad5455", size = 10354332, upload-time = "2026-02-03T17:52:54.892Z" },
{ url = "https://files.pythonhosted.org/packages/72/f6/62e173fbb7eb75cc29fe2576a1e20f0a46f671a2587b5f604bfb0eaf5f6f/ruff-0.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dcd4be7cc75cfbbca24a98d04d0b9b36a270d0833241f776b788d59f4142b14d", size = 10767189, upload-time = "2026-02-03T17:53:19.778Z" },
{ url = "https://files.pythonhosted.org/packages/99/e4/968ae17b676d1d2ff101d56dc69cf333e3a4c985e1ec23803df84fc7bf9e/ruff-0.15.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d747e3319b2bce179c7c1eaad3d884dc0a199b5f4d5187620530adf9105268ce", size = 10075384, upload-time = "2026-02-03T17:53:29.241Z" },
{ url = "https://files.pythonhosted.org/packages/a2/bf/9843c6044ab9e20af879c751487e61333ca79a2c8c3058b15722386b8cae/ruff-0.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:650bd9c56ae03102c51a5e4b554d74d825ff3abe4db22b90fd32d816c2e90621", size = 10481363, upload-time = "2026-02-03T17:52:43.332Z" },
{ url = "https://files.pythonhosted.org/packages/55/d9/4ada5ccf4cd1f532db1c8d44b6f664f2208d3d93acbeec18f82315e15193/ruff-0.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6664b7eac559e3048223a2da77769c2f92b43a6dfd4720cef42654299a599c9", size = 10187736, upload-time = "2026-02-03T17:53:00.522Z" },
{ url = "https://files.pythonhosted.org/packages/86/e2/f25eaecd446af7bb132af0a1d5b135a62971a41f5366ff41d06d25e77a91/ruff-0.15.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f811f97b0f092b35320d1556f3353bf238763420ade5d9e62ebd2b73f2ff179", size = 10968415, upload-time = "2026-02-03T17:53:15.705Z" },
{ url = "https://files.pythonhosted.org/packages/e7/dc/f06a8558d06333bf79b497d29a50c3a673d9251214e0d7ec78f90b30aa79/ruff-0.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:761ec0a66680fab6454236635a39abaf14198818c8cdf691e036f4bc0f406b2d", size = 11809643, upload-time = "2026-02-03T17:53:23.031Z" },
{ url = "https://files.pythonhosted.org/packages/dd/45/0ece8db2c474ad7df13af3a6d50f76e22a09d078af63078f005057ca59eb/ruff-0.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:940f11c2604d317e797b289f4f9f3fa5555ffe4fb574b55ed006c3d9b6f0eb78", size = 11234787, upload-time = "2026-02-03T17:52:46.432Z" },
{ url = "https://files.pythonhosted.org/packages/8a/d9/0e3a81467a120fd265658d127db648e4d3acfe3e4f6f5d4ea79fac47e587/ruff-0.15.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcbca3d40558789126da91d7ef9a7c87772ee107033db7191edefa34e2c7f1b4", size = 11112797, upload-time = "2026-02-03T17:52:49.274Z" },
{ url = "https://files.pythonhosted.org/packages/b2/cb/8c0b3b0c692683f8ff31351dfb6241047fa873a4481a76df4335a8bff716/ruff-0.15.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9a121a96db1d75fa3eb39c4539e607f628920dd72ff1f7c5ee4f1b768ac62d6e", size = 11033133, upload-time = "2026-02-03T17:53:33.105Z" },
{ url = "https://files.pythonhosted.org/packages/f8/5e/23b87370cf0f9081a8c89a753e69a4e8778805b8802ccfe175cc410e50b9/ruff-0.15.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5298d518e493061f2eabd4abd067c7e4fb89e2f63291c94332e35631c07c3662", size = 10442646, upload-time = "2026-02-03T17:53:06.278Z" },
{ url = "https://files.pythonhosted.org/packages/e1/9a/3c94de5ce642830167e6d00b5c75aacd73e6347b4c7fc6828699b150a5ee/ruff-0.15.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:afb6e603d6375ff0d6b0cee563fa21ab570fd15e65c852cb24922cef25050cf1", size = 10195750, upload-time = "2026-02-03T17:53:26.084Z" },
{ url = "https://files.pythonhosted.org/packages/30/15/e396325080d600b436acc970848d69df9c13977942fb62bb8722d729bee8/ruff-0.15.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:77e515f6b15f828b94dc17d2b4ace334c9ddb7d9468c54b2f9ed2b9c1593ef16", size = 10676120, upload-time = "2026-02-03T17:53:09.363Z" },
{ url = "https://files.pythonhosted.org/packages/8d/c9/229a23d52a2983de1ad0fb0ee37d36e0257e6f28bfd6b498ee2c76361874/ruff-0.15.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6f6e80850a01eb13b3e42ee0ebdf6e4497151b48c35051aab51c101266d187a3", size = 11201636, upload-time = "2026-02-03T17:52:57.281Z" },
{ url = "https://files.pythonhosted.org/packages/6f/b0/69adf22f4e24f3677208adb715c578266842e6e6a3cc77483f48dd999ede/ruff-0.15.0-py3-none-win32.whl", hash = "sha256:238a717ef803e501b6d51e0bdd0d2c6e8513fe9eec14002445134d3907cd46c3", size = 10465945, upload-time = "2026-02-03T17:53:12.591Z" },
{ url = "https://files.pythonhosted.org/packages/51/ad/f813b6e2c97e9b4598be25e94a9147b9af7e60523b0cb5d94d307c15229d/ruff-0.15.0-py3-none-win_amd64.whl", hash = "sha256:dd5e4d3301dc01de614da3cdffc33d4b1b96fb89e45721f1598e5532ccf78b18", size = 11564657, upload-time = "2026-02-03T17:52:51.893Z" },
{ url = "https://files.pythonhosted.org/packages/f6/b0/2d823f6e77ebe560f4e397d078487e8d52c1516b331e3521bc75db4272ca/ruff-0.15.0-py3-none-win_arm64.whl", hash = "sha256:c480d632cc0ca3f0727acac8b7d053542d9e114a462a145d0b00e7cd658c515a", size = 10865753, upload-time = "2026-02-03T17:53:03.014Z" },
]
[[package]]