mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-06-03 23:50:12 -04:00
Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e24187fefb | ||
|
|
396fcd5ee4 | ||
|
|
5a3d202879 | ||
|
|
62377ae7ad | ||
|
|
7498e22278 | ||
|
|
af6c9e074e | ||
|
|
71dba654b8 | ||
|
|
ba69fcf824 | ||
|
|
8219ac0168 | ||
|
|
47f66676e4 | ||
|
|
31d9479d17 | ||
|
|
6a8eae7ce4 | ||
|
|
3bddfc21ce | ||
|
|
975a16c74b | ||
|
|
840da0e935 | ||
|
|
0e22f3f8fa | ||
|
|
ff67fb6a4f | ||
|
|
97f37d0def | ||
|
|
37171d174b | ||
|
|
f010c13661 | ||
|
|
84622af5f8 | ||
|
|
024dad6663 | ||
|
|
f1998121aa | ||
|
|
94ca311616 | ||
|
|
44c4bbb9ab | ||
|
|
0c263c98c9 | ||
|
|
c235dc8d4d | ||
|
|
1b7eda0f2c | ||
|
|
f3725b7184 | ||
|
|
00a4b51ec1 | ||
|
|
2cf042fce9 | ||
|
|
55a8fdfee5 | ||
|
|
1ab5323f34 | ||
|
|
fb4ba490af |
@@ -1,7 +1,7 @@
|
|||||||
###############################################
|
###############################################
|
||||||
# Frontend Build
|
# Frontend Build
|
||||||
###############################################
|
###############################################
|
||||||
FROM node:24@sha256:050bf2bbe33c1d6754e060bec89378a79ed831f04a7bb1a53fe45e997df7b3bb \
|
FROM node:24@sha256:8530f76a96d88820d288761f022e318970dda93d01536919fbc16076b7983e63 \
|
||||||
AS frontend-builder
|
AS frontend-builder
|
||||||
|
|
||||||
WORKDIR /frontend
|
WORKDIR /frontend
|
||||||
|
|||||||
@@ -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:
|
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!
|
1. Take a backup just in case!
|
||||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.19.0`
|
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.19.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.
|
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
|
4. Restart the container
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
|||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
mealie:
|
mealie:
|
||||||
image: ghcr.io/mealie-recipes/mealie:v3.19.0 # (3)
|
image: ghcr.io/mealie-recipes/mealie:v3.19.2 # (3)
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
|||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
mealie:
|
mealie:
|
||||||
image: ghcr.io/mealie-recipes/mealie:v3.19.0 # (3)
|
image: ghcr.io/mealie-recipes/mealie:v3.19.2 # (3)
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
|
|||||||
@@ -224,8 +224,8 @@
|
|||||||
"add-field": "Tilføj felt",
|
"add-field": "Tilføj felt",
|
||||||
"date-created": "Oprettet",
|
"date-created": "Oprettet",
|
||||||
"date-updated": "Opdateret",
|
"date-updated": "Opdateret",
|
||||||
"key": "Key",
|
"key": "Nøgle",
|
||||||
"value": "Value"
|
"value": "Værdi"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
||||||
@@ -287,37 +287,37 @@
|
|||||||
"total-households": "Husstande i Alt",
|
"total-households": "Husstande i Alt",
|
||||||
"you-must-select-a-group-before-selecting-a-household": "Du skal vælge en gruppe, før du vælger en husstand",
|
"you-must-select-a-group-before-selecting-a-household": "Du skal vælge en gruppe, før du vælger en husstand",
|
||||||
"ai-provider-settings": {
|
"ai-provider-settings": {
|
||||||
"ai-provider-settings": "AI Provider Settings",
|
"ai-provider-settings": "AI-udbyderindstillinger",
|
||||||
"ai-provider": "AI Provider",
|
"ai-provider": "AI-udbyder",
|
||||||
"ai-providers": "AI Providers",
|
"ai-providers": "AI-udbydere",
|
||||||
"ai-provider-settings-description": "Configure AI providers to enable AI-powered features, such as enhanced ingredient parsing, creating recipes from videos, and more!",
|
"ai-provider-settings-description": "Konfigurér AI-udbydere for at slå AI-funktioner til, såsom forbedret ingredienshåndtering, at oprette opskrifter fra videoer med mere.",
|
||||||
"providers": "Providers",
|
"providers": "Udbydere",
|
||||||
"create-provider": "Create Provider",
|
"create-provider": "Opret udbyder",
|
||||||
"edit-provider": "Edit Provider",
|
"edit-provider": "Redigér udbyder",
|
||||||
"default-provider": "Default Provider",
|
"default-provider": "Standardudbyder",
|
||||||
"default-provider-description": "Required to enable AI features",
|
"default-provider-description": "Påkrævet for at slå AI-funktioner til",
|
||||||
"audio-provider": "Audio Provider",
|
"audio-provider": "Lydudbyder",
|
||||||
"audio-provider-description": "Enables audio transcription features, such as creating recipes from videos",
|
"audio-provider-description": "Slå lydtranskriberingsfunktioner til, såsom at oprette opskrifter fra videoer",
|
||||||
"image-provider": "Image Provider",
|
"image-provider": "Billedudbyder",
|
||||||
"image-provider-description": "Enables image recognition features, such as creating recipes from images",
|
"image-provider-description": "Slår billedgenkendelsesfunktioner til, såsom at oprette opskrifter fra billeder",
|
||||||
"provider-name": "Provider Name",
|
"provider-name": "Udbydernavn",
|
||||||
"api-key": "API Key",
|
"api-key": "API-nøgle",
|
||||||
"api-key-description-create": "Your provider's API key for authentication. If your service (e.g. Ollama) doesn't use an API key, you still have to put something here.",
|
"api-key-description-create": "Din udbyders API-nøgle til godkendelse. Hvis din udbyder ikke benytter en API-nøgle (eks. Ollama), skal du stadig skrive ét eller andet,",
|
||||||
"api-key-description-edit": "Leave this blank unless you want to change it.",
|
"api-key-description-edit": "Undlad at udfylde dette, medmindre du vil ændre det.",
|
||||||
"base-url": "Base URL",
|
"base-url": "Basis-URL",
|
||||||
"base-url-description": "If you're using OpenAI leave this blank. Must be an OpenAI-compatible endpoint (e.g. \"http://localhost:11434/v1\").",
|
"base-url-description": "Undlad at udfylde, hvis du benytter OpenAI. Skal være et OpenAI-kompatibelt endpoint (eks. \"http://localhost:11434/v1\").",
|
||||||
"model": "Model",
|
"model": "Model",
|
||||||
"model-description": "Which model your AI provider should use (e.g. \"gpt-5\").",
|
"model-description": "Hvilken model skal din udbyder benytte (eks. \"gpt-5\")?",
|
||||||
"request-timeout-seconds": "Request Timeout (seconds)",
|
"request-timeout-seconds": "Forespørgsels-time-out",
|
||||||
"provider-created": "Provider created",
|
"provider-created": "Udbyder oprettet",
|
||||||
"provider-updated": "Provider updated",
|
"provider-updated": "Udbyder opdateret",
|
||||||
"provider-deleted": "Provider deleted",
|
"provider-deleted": "Udbyder slettet",
|
||||||
"provider-create-failed": "Failed to create provider",
|
"provider-create-failed": "Kunne ikke oprette udbyder",
|
||||||
"provider-update-failed": "Failed to update provider",
|
"provider-update-failed": "Kunne ikke opdatere udbyder",
|
||||||
"provider-delete-failed": "Failed to delete provider",
|
"provider-delete-failed": "Kunne ikke slette udbyder",
|
||||||
"request-headers": "Request Headers",
|
"request-headers": "Forespørgsels-headers",
|
||||||
"request-params": "Request Parameters",
|
"request-params": "Forespørgselsparametre",
|
||||||
"no-default-provider-warning": "You have not set a default provider, so AI features are disabled"
|
"no-default-provider-warning": "Du har ikke sat en standardudbyder, så AI-funktioner er slået fra"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"household": {
|
"household": {
|
||||||
@@ -1397,7 +1397,7 @@
|
|||||||
"already-set-up-bring-to-homepage": "Jeg er allerede oprettet, bare bringe mig til startsiden",
|
"already-set-up-bring-to-homepage": "Jeg er allerede oprettet, bare bringe mig til startsiden",
|
||||||
"common-settings-for-new-sites": "Her er nogle almindelige indstillinger for nye sites",
|
"common-settings-for-new-sites": "Her er nogle almindelige indstillinger for nye sites",
|
||||||
"setup-complete": "Opsætning færdig!",
|
"setup-complete": "Opsætning færdig!",
|
||||||
"ai-providers-description": "Optionally configure AI providers for your group. AI providers enable features like creating recipes from images, importing recipes from videos, and enhanced ingredient parsing. You can always configure this later from your group settings.",
|
"ai-providers-description": "Konfigurér valgfrit AI-udbydere for din gruppe. AI-udbydere muliggør handlinger, såsom at oprette opskrifter fra billeder, importere opskrifter fra videoer, og forbedret håndtering af ingredienser. Det er altid muligt at konfigurere dette senere under dine gruppeindstillinger.",
|
||||||
"here-are-a-few-things-to-help-you-get-started": "Her er et par ting, der kan hjælpe dig i gang med Mealie",
|
"here-are-a-few-things-to-help-you-get-started": "Her er et par ting, der kan hjælpe dig i gang med Mealie",
|
||||||
"restore-from-v1-backup": "Har du en sikkerhedskopi fra en tidligere udgave af Mealie v1? Du kan gendanne den her.",
|
"restore-from-v1-backup": "Har du en sikkerhedskopi fra en tidligere udgave af Mealie v1? Du kan gendanne den her.",
|
||||||
"manage-profile-or-get-invite-link": "Administrer din egen profil, eller tag et invitationslink til at dele med andre."
|
"manage-profile-or-get-invite-link": "Administrer din egen profil, eller tag et invitationslink til at dele med andre."
|
||||||
|
|||||||
@@ -169,7 +169,7 @@
|
|||||||
"token": "Token",
|
"token": "Token",
|
||||||
"tuesday": "Τρίτη",
|
"tuesday": "Τρίτη",
|
||||||
"type": "Τύπος",
|
"type": "Τύπος",
|
||||||
"undo": "Undo",
|
"undo": "Αναίρεση",
|
||||||
"update": "Ενημέρωση",
|
"update": "Ενημέρωση",
|
||||||
"updated": "Ενημερώθηκε",
|
"updated": "Ενημερώθηκε",
|
||||||
"upload": "Ανέβασμα",
|
"upload": "Ανέβασμα",
|
||||||
@@ -952,7 +952,7 @@
|
|||||||
"quantity": "Ποσότητα: {0}",
|
"quantity": "Ποσότητα: {0}",
|
||||||
"shopping-list": "Λίστα για ψώνια",
|
"shopping-list": "Λίστα για ψώνια",
|
||||||
"shopping-lists": "Λίστες για ψώνια",
|
"shopping-lists": "Λίστες για ψώνια",
|
||||||
"add-item": "Add item",
|
"add-item": "Προσθήκη στοιχείου",
|
||||||
"food": "Τρόφιμο",
|
"food": "Τρόφιμο",
|
||||||
"note": "Σημείωση",
|
"note": "Σημείωση",
|
||||||
"label": "Ετικέτα",
|
"label": "Ετικέτα",
|
||||||
|
|||||||
@@ -224,8 +224,8 @@
|
|||||||
"add-field": "Veld toevoegen",
|
"add-field": "Veld toevoegen",
|
||||||
"date-created": "Datum aangemaakt",
|
"date-created": "Datum aangemaakt",
|
||||||
"date-updated": "Datum bijgewerkt",
|
"date-updated": "Datum bijgewerkt",
|
||||||
"key": "Key",
|
"key": "Sleutel",
|
||||||
"value": "Value"
|
"value": "Waarde"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Weet je zeker dat je <b>{groupName}<b/> wil verwijderen?",
|
"are-you-sure-you-want-to-delete-the-group": "Weet je zeker dat je <b>{groupName}<b/> wil verwijderen?",
|
||||||
@@ -287,37 +287,37 @@
|
|||||||
"total-households": "Totaal aantal huishoudens",
|
"total-households": "Totaal aantal huishoudens",
|
||||||
"you-must-select-a-group-before-selecting-a-household": "Kies een groep voordat je een huishouden kiest",
|
"you-must-select-a-group-before-selecting-a-household": "Kies een groep voordat je een huishouden kiest",
|
||||||
"ai-provider-settings": {
|
"ai-provider-settings": {
|
||||||
"ai-provider-settings": "AI Provider Settings",
|
"ai-provider-settings": "AI-aanbieder instellingen",
|
||||||
"ai-provider": "AI Provider",
|
"ai-provider": "AI-aanbieder",
|
||||||
"ai-providers": "AI Providers",
|
"ai-providers": "AI-aanbieders",
|
||||||
"ai-provider-settings-description": "Configure AI providers to enable AI-powered features, such as enhanced ingredient parsing, creating recipes from videos, and more!",
|
"ai-provider-settings-description": "Configureer AI-aanbieders om krachtige AI-aangedreven functies, zoals verbeterde ingrediënt parsing, aanmaken van recepten op basis van video's en nog meer!",
|
||||||
"providers": "Providers",
|
"providers": "Aanbieders",
|
||||||
"create-provider": "Create Provider",
|
"create-provider": "Aanbieder aanmaken",
|
||||||
"edit-provider": "Edit Provider",
|
"edit-provider": "Aanbieder bewerken",
|
||||||
"default-provider": "Default Provider",
|
"default-provider": "Standaard aanbieder",
|
||||||
"default-provider-description": "Required to enable AI features",
|
"default-provider-description": "Vereist om AI-functies in te schakelen",
|
||||||
"audio-provider": "Audio Provider",
|
"audio-provider": "Audio aanbieder",
|
||||||
"audio-provider-description": "Enables audio transcription features, such as creating recipes from videos",
|
"audio-provider-description": "Maakt audiotransscriptie functionaliteiten mogelijk, waarmee recepten op basis van video's gemaakt kunnen worden",
|
||||||
"image-provider": "Image Provider",
|
"image-provider": "Afbeelding aanbieder",
|
||||||
"image-provider-description": "Enables image recognition features, such as creating recipes from images",
|
"image-provider-description": "Maakt beeldherkenning functionaliteiten mogelijk, waarmee recepten op basis van afbeeldingen gemaakt kunnen worden",
|
||||||
"provider-name": "Provider Name",
|
"provider-name": "Naam aanbieder",
|
||||||
"api-key": "API Key",
|
"api-key": "API-sleutel",
|
||||||
"api-key-description-create": "Your provider's API key for authentication. If your service (e.g. Ollama) doesn't use an API key, you still have to put something here.",
|
"api-key-description-create": "Je aanbieder's API-sleutel voor authenticatie. Als je service (bijv. Ollama) geen API-sleutel gebruikt, moet je hier alsnog iets invoeren.",
|
||||||
"api-key-description-edit": "Leave this blank unless you want to change it.",
|
"api-key-description-edit": "Laat dit leeg tenzij je het wilt wijzigen.",
|
||||||
"base-url": "Base URL",
|
"base-url": "Basis URL",
|
||||||
"base-url-description": "If you're using OpenAI leave this blank. Must be an OpenAI-compatible endpoint (e.g. \"http://localhost:11434/v1\").",
|
"base-url-description": "Als je OpenAI gebruikt laat je dit leeg. Moet een OpenAI-compatibel eindpunt zijn (bijv. \"http://localhost:11434/v1\").",
|
||||||
"model": "Model",
|
"model": "Model",
|
||||||
"model-description": "Which model your AI provider should use (e.g. \"gpt-5\").",
|
"model-description": "Welk model je AI-aanbieder moet gebruiken (bijv. \"gpt-5\").",
|
||||||
"request-timeout-seconds": "Request Timeout (seconds)",
|
"request-timeout-seconds": "Verzoek time-out (seconden)",
|
||||||
"provider-created": "Provider created",
|
"provider-created": "Aanbieder aangemaakt",
|
||||||
"provider-updated": "Provider updated",
|
"provider-updated": "Aanbieder bijgewerkt",
|
||||||
"provider-deleted": "Provider deleted",
|
"provider-deleted": "Aanbieder verwijderd",
|
||||||
"provider-create-failed": "Failed to create provider",
|
"provider-create-failed": "Aanmaken van aanbieder mislukt",
|
||||||
"provider-update-failed": "Failed to update provider",
|
"provider-update-failed": "Bijwerken van aanbieder mislukt",
|
||||||
"provider-delete-failed": "Failed to delete provider",
|
"provider-delete-failed": "Verwijderen van aanbieder mislukt",
|
||||||
"request-headers": "Request Headers",
|
"request-headers": "Aanvraagheaders",
|
||||||
"request-params": "Request Parameters",
|
"request-params": "Aanvraag parameters",
|
||||||
"no-default-provider-warning": "You have not set a default provider, so AI features are disabled"
|
"no-default-provider-warning": "Je hebt geen standaard aanbieder ingesteld, AI-functies zijn uitgeschakeld"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"household": {
|
"household": {
|
||||||
@@ -663,7 +663,7 @@
|
|||||||
"create-recipe-description": "Maak een nieuw recept.",
|
"create-recipe-description": "Maak een nieuw recept.",
|
||||||
"create-recipes": "Recepten aanmaken",
|
"create-recipes": "Recepten aanmaken",
|
||||||
"import-with-zip": "Importeer met .zip",
|
"import-with-zip": "Importeer met .zip",
|
||||||
"create-recipe-from-images": "Create Recipe from Images",
|
"create-recipe-from-images": "Maak een recept op basis van een afbeelding",
|
||||||
"create-recipe-from-an-image-description": "Maak een recept door een afbeelding ervan te uploaden. Mealie probeert de tekst met behulp van AI uit de afbeelding te halen en er een recept uit te maken.",
|
"create-recipe-from-an-image-description": "Maak een recept door een afbeelding ervan te uploaden. Mealie probeert de tekst met behulp van AI uit de afbeelding te halen en er een recept uit te maken.",
|
||||||
"crop-and-rotate-the-image": "Snijd de afbeelding bij zodat alleen tekst zichtbaar is. En draai t plaatje zodat het leesbaar is.",
|
"crop-and-rotate-the-image": "Snijd de afbeelding bij zodat alleen tekst zichtbaar is. En draai t plaatje zodat het leesbaar is.",
|
||||||
"create-from-images": "Maak recept van een afbeelding",
|
"create-from-images": "Maak recept van een afbeelding",
|
||||||
@@ -1397,7 +1397,7 @@
|
|||||||
"already-set-up-bring-to-homepage": "Ik ben al ingesteld, breng me naar de startpagina",
|
"already-set-up-bring-to-homepage": "Ik ben al ingesteld, breng me naar de startpagina",
|
||||||
"common-settings-for-new-sites": "Hier zijn enkele algemene instellingen voor nieuwe sites",
|
"common-settings-for-new-sites": "Hier zijn enkele algemene instellingen voor nieuwe sites",
|
||||||
"setup-complete": "Installatie voltooid!",
|
"setup-complete": "Installatie voltooid!",
|
||||||
"ai-providers-description": "Optionally configure AI providers for your group. AI providers enable features like creating recipes from images, importing recipes from videos, and enhanced ingredient parsing. You can always configure this later from your group settings.",
|
"ai-providers-description": "Optioneel kun je AI-aanbieders instellen voor je groep. AI-aanbieders maken functies, zoals het maken van recepten op basis van afbeeldingen, het malen van recepten op basis van video's, en verbeterde ingrediëntenparsing mogelijk. Je kunt dit later altijd instellen vanuit je groepsinstellingen.",
|
||||||
"here-are-a-few-things-to-help-you-get-started": "Hier zijn een aantal dingen om je op weg te helpen met Mealie",
|
"here-are-a-few-things-to-help-you-get-started": "Hier zijn een aantal dingen om je op weg te helpen met Mealie",
|
||||||
"restore-from-v1-backup": "Heb je een back-up van een vorig exemplaar van Mealie v1? Deze kan je hier terugzetten.",
|
"restore-from-v1-backup": "Heb je een back-up van een vorig exemplaar van Mealie v1? Deze kan je hier terugzetten.",
|
||||||
"manage-profile-or-get-invite-link": "Beheer je eigen profiel, of gebruik een uitnodigingslink om te delen met anderen."
|
"manage-profile-or-get-invite-link": "Beheer je eigen profiel, of gebruik een uitnodigingslink om te delen met anderen."
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
"dashboard": "Panou de control",
|
"dashboard": "Panou de control",
|
||||||
"delete": "Șterge",
|
"delete": "Șterge",
|
||||||
"disabled": "Inactiv",
|
"disabled": "Inactiv",
|
||||||
"done": "Done",
|
"done": "Gata",
|
||||||
"download": "Descarcă",
|
"download": "Descarcă",
|
||||||
"duplicate": "Duplicat",
|
"duplicate": "Duplicat",
|
||||||
"edit": "Editează",
|
"edit": "Editează",
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
"token": "Token",
|
"token": "Token",
|
||||||
"tuesday": "Marţi",
|
"tuesday": "Marţi",
|
||||||
"type": "Tip",
|
"type": "Tip",
|
||||||
"undo": "Undo",
|
"undo": "Anulează acțiunea",
|
||||||
"update": "Actualizează",
|
"update": "Actualizează",
|
||||||
"updated": "Actualizat",
|
"updated": "Actualizat",
|
||||||
"upload": "Încarcă",
|
"upload": "Încarcă",
|
||||||
@@ -368,8 +368,8 @@
|
|||||||
"any-household": "Orice locuință",
|
"any-household": "Orice locuință",
|
||||||
"no-meal-plan-defined-yet": "Nici un plan de mese definit încă",
|
"no-meal-plan-defined-yet": "Nici un plan de mese definit încă",
|
||||||
"no-meal-planned-for-today": "Nicio masă planificată pentru astăzi",
|
"no-meal-planned-for-today": "Nicio masă planificată pentru astăzi",
|
||||||
"numberOfDaysPast-hint": "Number of days in the past on page load",
|
"numberOfDaysPast-hint": "Numărul de zile din trecut la încărcarea paginii",
|
||||||
"numberOfDaysPast-label": "Default Days in the Past",
|
"numberOfDaysPast-label": "Număr implicit de zile din trecut",
|
||||||
"numberOfDays-hint": "Număr de zile pe pagină încărcată",
|
"numberOfDays-hint": "Număr de zile pe pagină încărcată",
|
||||||
"numberOfDays-label": "Zile implicite",
|
"numberOfDays-label": "Zile implicite",
|
||||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Numai rețetele cu aceste categorii vor fi utilizate în Planurile de mese",
|
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Numai rețetele cu aceste categorii vor fi utilizate în Planurile de mese",
|
||||||
@@ -675,8 +675,8 @@
|
|||||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Creează o rețetă furnizând numele. Toate rețetele trebuie să aibă nume unice.",
|
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Creează o rețetă furnizând numele. Toate rețetele trebuie să aibă nume unice.",
|
||||||
"new-recipe-names-must-be-unique": "Numele rețetei trebuie să fie unic",
|
"new-recipe-names-must-be-unique": "Numele rețetei trebuie să fie unic",
|
||||||
"scrape-recipe": "Importare rețetă",
|
"scrape-recipe": "Importare rețetă",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Extrage o rețetă după url. Introdu url-ul site-ului din care vrei să extragi rețeta, iar Mealie va încerca să o importe și să o adauge în colecția ta.",
|
||||||
"scrape-recipe-description-transcription": "You can also provide the url to a video and Mealie will attempt to transcribe it into a recipe.",
|
"scrape-recipe-description-transcription": "Poți introduce și URL-ul unui videoclip, iar Mealie va încerca să îl transcrie într-o rețetă.",
|
||||||
"scrape-recipe-have-a-lot-of-recipes": "Ai mai multe rețete pe care vrei să le imporți simultan?",
|
"scrape-recipe-have-a-lot-of-recipes": "Ai mai multe rețete pe care vrei să le imporți simultan?",
|
||||||
"scrape-recipe-suggest-bulk-importer": "Încearcă importatorul în bulk",
|
"scrape-recipe-suggest-bulk-importer": "Încearcă importatorul în bulk",
|
||||||
"scrape-recipe-have-raw-html-or-json-data": "Ai date de tip HTML sau JSON?",
|
"scrape-recipe-have-raw-html-or-json-data": "Ai date de tip HTML sau JSON?",
|
||||||
@@ -815,7 +815,7 @@
|
|||||||
"irreversible-acknowledgment": "Înțeleg că această acțiune este ireversibilă, distructivă și poate provoca pierderea datelor",
|
"irreversible-acknowledgment": "Înțeleg că această acțiune este ireversibilă, distructivă și poate provoca pierderea datelor",
|
||||||
"restore-backup": "Restaurează backup"
|
"restore-backup": "Restaurează backup"
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Copii de rezervă",
|
||||||
"change-password": "Schimbă parola",
|
"change-password": "Schimbă parola",
|
||||||
"current": "Versiune:",
|
"current": "Versiune:",
|
||||||
"custom-pages": "Pagini personalizate",
|
"custom-pages": "Pagini personalizate",
|
||||||
@@ -928,17 +928,17 @@
|
|||||||
"server-side-base-url-error-text": "`BASE_URL` încă este setat la valoarea implicită pe serverul API. Acest lucru va cauza probleme cu link-urile de notificări generate pe server pentru e-mailuri, etc.",
|
"server-side-base-url-error-text": "`BASE_URL` încă este setat la valoarea implicită pe serverul API. Acest lucru va cauza probleme cu link-urile de notificări generate pe server pentru e-mailuri, etc.",
|
||||||
"server-side-base-url-success-text": "Adresa URL a serverului nu se potrivește cu cea implicită",
|
"server-side-base-url-success-text": "Adresa URL a serverului nu se potrivește cu cea implicită",
|
||||||
"ldap-ready": "LDAP pregătit",
|
"ldap-ready": "LDAP pregătit",
|
||||||
"ldap-not-ready": "LDAP Not Ready",
|
"ldap-not-ready": "LDAP nu este pregătit\"",
|
||||||
"ldap-ready-error-text": "Nu toate valorile LDAP sunt configurate. Acest lucru poate fi ignorat dacă nu utilizați autentificarea cu LDAP.",
|
"ldap-ready-error-text": "Nu toate valorile LDAP sunt configurate. Acest lucru poate fi ignorat dacă nu utilizați autentificarea cu LDAP.",
|
||||||
"ldap-ready-success-text": "Variabilele LDAP necesare sunt setate.",
|
"ldap-ready-success-text": "Variabilele LDAP necesare sunt setate.",
|
||||||
"build": "Compilare",
|
"build": "Compilare",
|
||||||
"recipe-scraper-version": "Versiune \"scraper\" de rețete",
|
"recipe-scraper-version": "Versiune \"scraper\" de rețete",
|
||||||
"oidc-ready": "OIDC pregătit",
|
"oidc-ready": "OIDC pregătit",
|
||||||
"oidc-not-ready": "OIDC Not Ready",
|
"oidc-not-ready": "OIDC nu este pregătit",
|
||||||
"oidc-ready-error-text": "Nu toate valorile OIDC sunt configurate. Acest lucru poate fi ignorat dacă nu folosiți autentificarea OIDC.",
|
"oidc-ready-error-text": "Nu toate valorile OIDC sunt configurate. Acest lucru poate fi ignorat dacă nu folosiți autentificarea OIDC.",
|
||||||
"oidc-ready-success-text": "Variabilele OIDC necesare sunt setate.",
|
"oidc-ready-success-text": "Variabilele OIDC necesare sunt setate.",
|
||||||
"openai-ready": "OpenAI pregătit",
|
"openai-ready": "OpenAI pregătit",
|
||||||
"openai-not-ready": "OpenAI Not Ready",
|
"openai-not-ready": "OpenAI nu este pregătit",
|
||||||
"openai-ready-error-text": "Nu toate valorile OpenAI sunt configurate. Acest lucru poate fi ignorat dacă nu utilizaţi caracteristicile OpenAI.",
|
"openai-ready-error-text": "Nu toate valorile OpenAI sunt configurate. Acest lucru poate fi ignorat dacă nu utilizaţi caracteristicile OpenAI.",
|
||||||
"openai-ready-success-text": "Variabilele necesare OpenAI sunt setate."
|
"openai-ready-success-text": "Variabilele necesare OpenAI sunt setate."
|
||||||
},
|
},
|
||||||
@@ -946,15 +946,15 @@
|
|||||||
"all-lists": "Toate listele",
|
"all-lists": "Toate listele",
|
||||||
"create-shopping-list": "Creează listă de cumpărături",
|
"create-shopping-list": "Creează listă de cumpărături",
|
||||||
"from-recipe": "Dintr-o rețetă",
|
"from-recipe": "Dintr-o rețetă",
|
||||||
"ingredient-of-recipe": "Ingredient of {recipe}",
|
"ingredient-of-recipe": "Ingredient din {recipe}",
|
||||||
"list-name": "Nume listă",
|
"list-name": "Nume listă",
|
||||||
"new-list": "Listă nouă",
|
"new-list": "Listă nouă",
|
||||||
"quantity": "Cantitate: {0}",
|
"quantity": "Cantitate: {0}",
|
||||||
"shopping-list": "Listă de cumpărături",
|
"shopping-list": "Listă de cumpărături",
|
||||||
"shopping-lists": "Liste de cumpărături",
|
"shopping-lists": "Liste de cumpărături",
|
||||||
"add-item": "Add item",
|
"add-item": "Adaugă articol",
|
||||||
"food": "Aliment",
|
"food": "Aliment",
|
||||||
"note": "Note",
|
"note": "Notă",
|
||||||
"label": "Etichetă",
|
"label": "Etichetă",
|
||||||
"save-label": "Salvează etichetă",
|
"save-label": "Salvează etichetă",
|
||||||
"linked-item-warning": "Acest element este legat de una sau mai multe rețete. Ajustarea unităților sau a alimentelor va produce rezultate neașteptate la adăugarea sau scoaterea rețetei din listă.",
|
"linked-item-warning": "Acest element este legat de una sau mai multe rețete. Ajustarea unităților sau a alimentelor va produce rezultate neașteptate la adăugarea sau scoaterea rețetei din listă.",
|
||||||
@@ -978,7 +978,7 @@
|
|||||||
"are-you-sure-you-want-to-uncheck-all-items": "Sunteți sigur că doriți să debifați toate elementele?",
|
"are-you-sure-you-want-to-uncheck-all-items": "Sunteți sigur că doriți să debifați toate elementele?",
|
||||||
"are-you-sure-you-want-to-delete-checked-items": "Sunteți sigur că doriți să ștergeți toate elementele selectate?",
|
"are-you-sure-you-want-to-delete-checked-items": "Sunteți sigur că doriți să ștergeți toate elementele selectate?",
|
||||||
"no-shopping-lists-found": "Nu s-au găsit liste de cumpărături",
|
"no-shopping-lists-found": "Nu s-au găsit liste de cumpărături",
|
||||||
"item-checked-off": "Checked off {item}"
|
"item-checked-off": "{item} a fost bifat"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"all-recipes": "Toate reţetele",
|
"all-recipes": "Toate reţetele",
|
||||||
@@ -1181,18 +1181,18 @@
|
|||||||
"example-unit-plural": "ex: Linguri",
|
"example-unit-plural": "ex: Linguri",
|
||||||
"example-unit-abbreviation-singular": "ex: Lg",
|
"example-unit-abbreviation-singular": "ex: Lg",
|
||||||
"example-unit-abbreviation-plural": "ex: Lg",
|
"example-unit-abbreviation-plural": "ex: Lg",
|
||||||
"standardization": "Standardization",
|
"standardization": "Standardizare",
|
||||||
"standardization-description": "How this unit can be represented as a standard unit. This enables unit conversion features such as merging compatible units in shopping lists.",
|
"standardization-description": "Modul în care această unitate poate fi reprezentată ca unitate standard. Activează funcții de conversie a unităților, cum ar fi combinarea unităților compatibile în listele de cumpărături.",
|
||||||
"standard-unit": "Standard Unit",
|
"standard-unit": "Unitate standard",
|
||||||
"standard-quantity": "Standard Quantity",
|
"standard-quantity": "Cantitate standard",
|
||||||
"unit-conversion": "Unit Conversion",
|
"unit-conversion": "Conversie unități",
|
||||||
"standard-unit-labels": {
|
"standard-unit-labels": {
|
||||||
"fluid-ounce": "fluid ounce",
|
"fluid-ounce": "uncie fluidă",
|
||||||
"cup": "cup",
|
"cup": "cană",
|
||||||
"ounce": "ounce",
|
"ounce": "uncie",
|
||||||
"pound": "pound",
|
"pound": "livră",
|
||||||
"milliliter": "milliliter",
|
"milliliter": "mililitru",
|
||||||
"liter": "liter",
|
"liter": "litru",
|
||||||
"gram": "gram",
|
"gram": "gram",
|
||||||
"kilogram": "kilogram"
|
"kilogram": "kilogram"
|
||||||
}
|
}
|
||||||
@@ -1514,10 +1514,10 @@
|
|||||||
"max-length": "Trebuie să aibă cel mult {max} caracter | Trebuie să aibă cel mult {max} caractere"
|
"max-length": "Trebuie să aibă cel mult {max} caracter | Trebuie să aibă cel mult {max} caractere"
|
||||||
},
|
},
|
||||||
"announcements": {
|
"announcements": {
|
||||||
"announcements": "Announcements",
|
"announcements": "Anunțuri",
|
||||||
"all-announcements": "All announcements",
|
"all-announcements": "Toate anunțurile",
|
||||||
"mark-all-as-read": "Mark All as Read",
|
"mark-all-as-read": "Marchează toate ca citite",
|
||||||
"show-announcements-from-mealie": "Show announcements from Mealie",
|
"show-announcements-from-mealie": "Afișează anunțurile de la Mealie",
|
||||||
"show-announcements-setting-description": "Whether or not you want to allow users to see announcements from Mealie. When enabled users can still opt-out from seeing them in their user settings"
|
"show-announcements-setting-description": "Stabilește dacă utilizatorii pot vedea anunțuri de la Mealie. Când opțiunea este activată, utilizatorii pot alege în continuare să nu le vadă în setările personale"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mealie",
|
"name": "mealie",
|
||||||
"version": "3.19.0",
|
"version": "3.19.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "nuxt dev",
|
"dev": "nuxt dev",
|
||||||
|
|||||||
4973
frontend/yarn.lock
4973
frontend/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -50,13 +50,19 @@ def determine_secrets(data_dir: Path, secret: str, production: bool) -> str:
|
|||||||
secrets_file = data_dir.joinpath(secret)
|
secrets_file = data_dir.joinpath(secret)
|
||||||
if secrets_file.is_file():
|
if secrets_file.is_file():
|
||||||
with open(secrets_file) as f:
|
with open(secrets_file) as f:
|
||||||
return f.read()
|
existing_secret = f.read().strip()
|
||||||
else:
|
if existing_secret:
|
||||||
data_dir.mkdir(parents=True, exist_ok=True)
|
return existing_secret
|
||||||
with open(secrets_file, "w") as f:
|
|
||||||
new_secret = secrets.token_hex(32)
|
data_dir.mkdir(parents=True, exist_ok=True)
|
||||||
f.write(new_secret)
|
new_secret = secrets.token_hex(32)
|
||||||
return new_secret
|
tmp_file = secrets_file.with_suffix(".tmp")
|
||||||
|
with open(tmp_file, "w") as f:
|
||||||
|
f.write(new_secret)
|
||||||
|
f.flush()
|
||||||
|
os.fsync(f.fileno())
|
||||||
|
tmp_file.replace(secrets_file)
|
||||||
|
return new_secret
|
||||||
|
|
||||||
|
|
||||||
def get_secrets_dir() -> str | None:
|
def get_secrets_dir() -> str | None:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING
|
|||||||
from sqlalchemy import ForeignKey, String
|
from sqlalchemy import ForeignKey, String
|
||||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||||
|
|
||||||
from .._model_base import BaseMixins, SqlAlchemyBase
|
from .._model_base import BaseMixins, FilterableColumn, SqlAlchemyBase
|
||||||
from .._model_utils.auto_init import auto_init
|
from .._model_utils.auto_init import auto_init
|
||||||
from .._model_utils.guid import GUID
|
from .._model_utils.guid import GUID
|
||||||
|
|
||||||
@@ -14,14 +14,14 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
class GroupRecipeAction(SqlAlchemyBase, BaseMixins):
|
class GroupRecipeAction(SqlAlchemyBase, BaseMixins):
|
||||||
__tablename__ = "recipe_actions"
|
__tablename__ = "recipe_actions"
|
||||||
id: Mapped[GUID] = mapped_column(GUID, primary_key=True, default=GUID.generate)
|
id: FilterableColumn[GUID] = mapped_column(GUID, primary_key=True, default=GUID.generate)
|
||||||
group_id: Mapped[GUID] = mapped_column(GUID, ForeignKey("groups.id"), index=True)
|
group_id: FilterableColumn[GUID] = mapped_column(GUID, ForeignKey("groups.id"), index=True)
|
||||||
group: Mapped["Group"] = relationship("Group", back_populates="recipe_actions", single_parent=True)
|
group: Mapped["Group"] = relationship("Group", back_populates="recipe_actions", single_parent=True)
|
||||||
household_id: Mapped[GUID | None] = mapped_column(GUID, ForeignKey("households.id"), index=True)
|
household_id: FilterableColumn[GUID | None] = mapped_column(GUID, ForeignKey("households.id"), index=True)
|
||||||
household: Mapped["Household"] = relationship("Household", back_populates="recipe_actions")
|
household: Mapped["Household"] = relationship("Household", back_populates="recipe_actions")
|
||||||
|
|
||||||
action_type: Mapped[str] = mapped_column(String, index=True)
|
action_type: FilterableColumn[str] = mapped_column(String, index=True)
|
||||||
title: Mapped[str] = mapped_column(String, index=True)
|
title: FilterableColumn[str] = mapped_column(String, index=True)
|
||||||
url: Mapped[str] = mapped_column(String)
|
url: Mapped[str] = mapped_column(String)
|
||||||
|
|
||||||
@auto_init()
|
@auto_init()
|
||||||
|
|||||||
@@ -18,17 +18,17 @@
|
|||||||
"yield": "Recoltă",
|
"yield": "Recoltă",
|
||||||
"yields": "Producţii"
|
"yields": "Producţii"
|
||||||
},
|
},
|
||||||
"and-amount": "and {amount}",
|
"and-amount": "și {amount}",
|
||||||
"or-ingredient": "or {ingredient}",
|
"or-ingredient": "sau {ingredient}",
|
||||||
"create-progress": {
|
"create-progress": {
|
||||||
"creating-recipe-with-ai": "Creating recipe with AI...",
|
"creating-recipe-with-ai": "Se creează rețeta cu AI...",
|
||||||
"creating-recipe-from-transcript-with-ai": "Creating recipe from transcript with AI...",
|
"creating-recipe-from-transcript-with-ai": "Se creează rețeta din transcriere cu AI...",
|
||||||
"creating-recipe-from-webpage-data": "Creating recipe from webpage data...",
|
"creating-recipe-from-webpage-data": "Se creează rețeta din datele paginii web...",
|
||||||
"downloading-image": "Downloading image...",
|
"downloading-image": "Se descarcă imaginea...",
|
||||||
"downloading-video": "Downloading video...",
|
"downloading-video": "Se descarcă videoclipul...",
|
||||||
"extracting-recipe-data": "Extracting recipe data...",
|
"extracting-recipe-data": "Se extrag datele rețetei...",
|
||||||
"fetching-webpage": "Fetching webpage...",
|
"fetching-webpage": "Se preia pagina web...",
|
||||||
"transcribing-audio-with-ai": "Transcribing audio with AI..."
|
"transcribing-audio-with-ai": "Se transcrie sunetul cu AI..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mealplan": {
|
"mealplan": {
|
||||||
|
|||||||
@@ -6427,8 +6427,8 @@
|
|||||||
"sugar": {
|
"sugar": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "sugar",
|
"name": "ζάχαρη",
|
||||||
"plural_name": "sugar"
|
"plural_name": "ζάχαρη"
|
||||||
},
|
},
|
||||||
"brown sugar": {
|
"brown sugar": {
|
||||||
"aliases": [
|
"aliases": [
|
||||||
@@ -6542,8 +6542,8 @@
|
|||||||
"raw sugar": {
|
"raw sugar": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "raw sugar",
|
"name": "ακατέργαστη ζάχαρη",
|
||||||
"plural_name": "raw sugar"
|
"plural_name": "ακατέργαστη ζάχαρη"
|
||||||
},
|
},
|
||||||
"golden syrup": {
|
"golden syrup": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -6560,8 +6560,8 @@
|
|||||||
"liquid stevia": {
|
"liquid stevia": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "liquid stevia",
|
"name": "υγρή στέβια",
|
||||||
"plural_name": "liquid stevia"
|
"plural_name": "υγρή στέβια"
|
||||||
},
|
},
|
||||||
"grenadine": {
|
"grenadine": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -16087,8 +16087,8 @@
|
|||||||
"fish oil": {
|
"fish oil": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "fish oil",
|
"name": "ιχθυέλαιο",
|
||||||
"plural_name": "fish oil"
|
"plural_name": "ιχθυέλαιο"
|
||||||
},
|
},
|
||||||
"lime essential oil": {
|
"lime essential oil": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -16099,8 +16099,8 @@
|
|||||||
"probiotic": {
|
"probiotic": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "probiotic",
|
"name": "προβιοτικό",
|
||||||
"plural_name": "probiotics"
|
"plural_name": "προβιοτικά"
|
||||||
},
|
},
|
||||||
"activated charcoal": {
|
"activated charcoal": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -16111,8 +16111,8 @@
|
|||||||
"egg powder": {
|
"egg powder": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "egg powder",
|
"name": "σκόνη αυγών",
|
||||||
"plural_name": "egg powder"
|
"plural_name": "σκόνη αυγών"
|
||||||
},
|
},
|
||||||
"reishi mushroom": {
|
"reishi mushroom": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -16267,8 +16267,8 @@
|
|||||||
"banana powder": {
|
"banana powder": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "banana powder",
|
"name": "σκόνη μπανάνας",
|
||||||
"plural_name": "banana powder"
|
"plural_name": "σκόνη μπανάνας"
|
||||||
},
|
},
|
||||||
"chaga mushroom powder": {
|
"chaga mushroom powder": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
|||||||
@@ -3930,7 +3930,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "andouille",
|
"name": "andouille",
|
||||||
"plural_name": "andouilles"
|
"plural_name": "andouillette"
|
||||||
},
|
},
|
||||||
"boneless lamb": {
|
"boneless lamb": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
|||||||
@@ -1856,7 +1856,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "onion seed",
|
"name": "onion seed",
|
||||||
"plural_name": "onion seeds"
|
"plural_name": "Semințe de ceapă"
|
||||||
},
|
},
|
||||||
"watermelon seed": {
|
"watermelon seed": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -1873,8 +1873,8 @@
|
|||||||
"melon seed": {
|
"melon seed": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "melon seed",
|
"name": "Sămânță de pepene",
|
||||||
"plural_name": "melon seeds"
|
"plural_name": "Semințe de pepene"
|
||||||
},
|
},
|
||||||
"lotus seed": {
|
"lotus seed": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2038,19 +2038,19 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "brânză mozzarella",
|
"name": "brânză mozzarella",
|
||||||
"plural_name": "mozzarella cheese"
|
"plural_name": "brânză mozzarella"
|
||||||
},
|
},
|
||||||
"feta cheese": {
|
"feta cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "feta cheese",
|
"name": "brânză feta",
|
||||||
"plural_name": "feta cheese"
|
"plural_name": "brânză feta"
|
||||||
},
|
},
|
||||||
"ricotta cheese": {
|
"ricotta cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "ricotta cheese",
|
"name": "brânză ricotta",
|
||||||
"plural_name": "ricotta cheese"
|
"plural_name": "brânză ricotta"
|
||||||
},
|
},
|
||||||
"cheddar-jack cheese": {
|
"cheddar-jack cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2067,32 +2067,32 @@
|
|||||||
"blue cheese": {
|
"blue cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "blue cheese",
|
"name": "brânză cu mucegai albastru",
|
||||||
"plural_name": "blue cheese"
|
"plural_name": "brânzeturi cu mucegai albastru"
|
||||||
},
|
},
|
||||||
"goat cheese": {
|
"goat cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "goat cheese",
|
"name": "brânză de capră",
|
||||||
"plural_name": "goat cheese"
|
"plural_name": "brânzeturi de capră"
|
||||||
},
|
},
|
||||||
"fresh mozzarella cheese": {
|
"fresh mozzarella cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "fresh mozzarella cheese",
|
"name": "mozzarella proaspătă",
|
||||||
"plural_name": "fresh mozzarella cheese"
|
"plural_name": "mozzarella proaspătă"
|
||||||
},
|
},
|
||||||
"swis cheese": {
|
"swis cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "swis cheese",
|
"name": "brânză elvețiană",
|
||||||
"plural_name": "swis cheese"
|
"plural_name": "brânzeturi elvețiene"
|
||||||
},
|
},
|
||||||
"pecorino cheese": {
|
"pecorino cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "pecorino cheese",
|
"name": "brânză pecorino",
|
||||||
"plural_name": "pecorino cheese"
|
"plural_name": "brânză pecorino"
|
||||||
},
|
},
|
||||||
"gruyere cheese": {
|
"gruyere cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2109,8 +2109,8 @@
|
|||||||
"cottage cheese": {
|
"cottage cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "cottage cheese",
|
"name": "brânză de vaci",
|
||||||
"plural_name": "cottage cheese"
|
"plural_name": "brânză de vaci"
|
||||||
},
|
},
|
||||||
"american cheese": {
|
"american cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2121,8 +2121,8 @@
|
|||||||
"provolone cheese": {
|
"provolone cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "provolone cheese",
|
"name": "brânză provolone",
|
||||||
"plural_name": "provolone cheese"
|
"plural_name": "brânză provolone"
|
||||||
},
|
},
|
||||||
"mexican cheese blend": {
|
"mexican cheese blend": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2169,7 +2169,7 @@
|
|||||||
"gouda cheese": {
|
"gouda cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "gouda cheese",
|
"name": "brânză gouda",
|
||||||
"plural_name": "gouda cheese"
|
"plural_name": "gouda cheese"
|
||||||
},
|
},
|
||||||
"cotija cheese": {
|
"cotija cheese": {
|
||||||
@@ -2187,8 +2187,8 @@
|
|||||||
"smoked cheese": {
|
"smoked cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "smoked cheese",
|
"name": "brânză afumată",
|
||||||
"plural_name": "smoked cheese"
|
"plural_name": "brânză afumată"
|
||||||
},
|
},
|
||||||
"halloumi cheese": {
|
"halloumi cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2229,7 +2229,7 @@
|
|||||||
"burrata cheese": {
|
"burrata cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "burrata cheese",
|
"name": "brânză burrata",
|
||||||
"plural_name": "burrata cheese"
|
"plural_name": "burrata cheese"
|
||||||
},
|
},
|
||||||
"havarti cheese": {
|
"havarti cheese": {
|
||||||
@@ -2283,8 +2283,8 @@
|
|||||||
"raclette cheese": {
|
"raclette cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "raclette cheese",
|
"name": "brânză raclette",
|
||||||
"plural_name": "raclette cheese"
|
"plural_name": "brânză raclette"
|
||||||
},
|
},
|
||||||
"colby-jack cheese": {
|
"colby-jack cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2457,8 +2457,8 @@
|
|||||||
"hard goat cheese": {
|
"hard goat cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "hard goat cheese",
|
"name": "brânză tare de capră",
|
||||||
"plural_name": "hard goat cheese"
|
"plural_name": "brânză tare de capră"
|
||||||
},
|
},
|
||||||
"kashkaval cheese": {
|
"kashkaval cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2469,8 +2469,8 @@
|
|||||||
"sheep cheese": {
|
"sheep cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "sheep cheese",
|
"name": "brânză de oaie",
|
||||||
"plural_name": "sheep cheese"
|
"plural_name": "brânză de oaie"
|
||||||
},
|
},
|
||||||
"amul cheese": {
|
"amul cheese": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2630,49 +2630,49 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "lapte",
|
"name": "lapte",
|
||||||
"plural_name": "milk"
|
"plural_name": "lapte"
|
||||||
},
|
},
|
||||||
"heavy cream": {
|
"heavy cream": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "smântână pentru frișcă",
|
"name": "smântână pentru frișcă",
|
||||||
"plural_name": "heavy cream"
|
"plural_name": "smântână pentru frișcă"
|
||||||
},
|
},
|
||||||
"sour cream": {
|
"sour cream": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "smântână",
|
"name": "smântână",
|
||||||
"plural_name": "sour cream"
|
"plural_name": "smântână"
|
||||||
},
|
},
|
||||||
"buttermilk": {
|
"buttermilk": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "buttermilk",
|
"name": "lapte bătut",
|
||||||
"plural_name": "buttermilk"
|
"plural_name": "lapte bătut"
|
||||||
},
|
},
|
||||||
"yogurt": {
|
"yogurt": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "iaurt",
|
"name": "iaurt",
|
||||||
"plural_name": "yogurts"
|
"plural_name": "iaurt"
|
||||||
},
|
},
|
||||||
"greek yogurt": {
|
"greek yogurt": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "greek yogurt",
|
"name": "iaurt grecesc",
|
||||||
"plural_name": "greek yogurts"
|
"plural_name": "iaurturi grecești"
|
||||||
},
|
},
|
||||||
"cream": {
|
"cream": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "cream",
|
"name": "smântână",
|
||||||
"plural_name": "cream"
|
"plural_name": "smântână"
|
||||||
},
|
},
|
||||||
"whipped cream": {
|
"whipped cream": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "whipped cream",
|
"name": "frișcă",
|
||||||
"plural_name": "whipped cream"
|
"plural_name": "frișcă"
|
||||||
},
|
},
|
||||||
"ghee": {
|
"ghee": {
|
||||||
"aliases": [
|
"aliases": [
|
||||||
@@ -2692,7 +2692,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "lapte condensat",
|
"name": "lapte condensat",
|
||||||
"plural_name": "condensed milk"
|
"plural_name": "lapte condensat"
|
||||||
},
|
},
|
||||||
"half and half": {
|
"half and half": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2710,7 +2710,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "înghețată",
|
"name": "înghețată",
|
||||||
"plural_name": "ice cream"
|
"plural_name": "înghețată"
|
||||||
},
|
},
|
||||||
"margarine": {
|
"margarine": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2734,7 +2734,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "lapte praf",
|
"name": "lapte praf",
|
||||||
"plural_name": "milk powder"
|
"plural_name": "lapte praf"
|
||||||
},
|
},
|
||||||
"curd": {
|
"curd": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2788,7 +2788,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "lapte cu ciocolată",
|
"name": "lapte cu ciocolată",
|
||||||
"plural_name": "chocolate milk"
|
"plural_name": "lapte cu ciocolată"
|
||||||
},
|
},
|
||||||
"liquid egg substitute": {
|
"liquid egg substitute": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2872,7 +2872,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "ganache",
|
"name": "ganache",
|
||||||
"plural_name": "ganaches"
|
"plural_name": "ganache"
|
||||||
},
|
},
|
||||||
"cajeta": {
|
"cajeta": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2883,8 +2883,8 @@
|
|||||||
"duck egg": {
|
"duck egg": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "duck egg",
|
"name": "ou de rață",
|
||||||
"plural_name": "duck eggs"
|
"plural_name": "ouă de rață"
|
||||||
},
|
},
|
||||||
"salted egg": {
|
"salted egg": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -2908,7 +2908,7 @@
|
|||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "lapte crud",
|
"name": "lapte crud",
|
||||||
"plural_name": "raw milk"
|
"plural_name": "lapte crud"
|
||||||
},
|
},
|
||||||
"lime curd": {
|
"lime curd": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
@@ -3027,7 +3027,7 @@
|
|||||||
"chocolate milk powder": {
|
"chocolate milk powder": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "chocolate milk powder",
|
"name": "lapte praf de ciocolată",
|
||||||
"plural_name": "chocolate milk powder"
|
"plural_name": "chocolate milk powder"
|
||||||
},
|
},
|
||||||
"liquid rennet": {
|
"liquid rennet": {
|
||||||
@@ -3337,7 +3337,7 @@
|
|||||||
"smoked tofu": {
|
"smoked tofu": {
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
"name": "smoked tofu",
|
"name": "tofu afumat",
|
||||||
"plural_name": "smoked tofus"
|
"plural_name": "smoked tofus"
|
||||||
},
|
},
|
||||||
"coconut powder": {
|
"coconut powder": {
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
"name": "lingură",
|
"name": "lingură",
|
||||||
"plural_name": "linguri",
|
"plural_name": "linguri",
|
||||||
"description": "",
|
"description": "",
|
||||||
"abbreviation": "tbsp"
|
"abbreviation": "lg"
|
||||||
},
|
},
|
||||||
"cup": {
|
"cup": {
|
||||||
"name": "cană",
|
"name": "cană",
|
||||||
"plural_name": "căni",
|
"plural_name": "căni",
|
||||||
"description": "",
|
"description": "",
|
||||||
"abbreviation": "c"
|
"abbreviation": "cană"
|
||||||
},
|
},
|
||||||
"fluid-ounce": {
|
"fluid-ounce": {
|
||||||
"name": "uncie fluidă",
|
"name": "uncie fluidă",
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
"abbreviation": "pt"
|
"abbreviation": "pt"
|
||||||
},
|
},
|
||||||
"quart": {
|
"quart": {
|
||||||
"name": "quart",
|
"name": "sfert de galon",
|
||||||
"plural_name": "sferturi de galon",
|
"plural_name": "sferturi de galon",
|
||||||
"description": "",
|
"description": "",
|
||||||
"abbreviation": "qt"
|
"abbreviation": "qt"
|
||||||
@@ -139,8 +139,8 @@
|
|||||||
"abbreviation": ""
|
"abbreviation": ""
|
||||||
},
|
},
|
||||||
"sprig": {
|
"sprig": {
|
||||||
"name": "sprig",
|
"name": "crenguță",
|
||||||
"plural_name": "sprigs",
|
"plural_name": "crenguțe",
|
||||||
"description": "",
|
"description": "",
|
||||||
"abbreviation": ""
|
"abbreviation": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "mealie"
|
name = "mealie"
|
||||||
version = "3.19.0"
|
version = "3.19.2"
|
||||||
description = "A Recipe Manager"
|
description = "A Recipe Manager"
|
||||||
authors = [{ name = "Hayden", email = "hay-kot@pm.me" }]
|
authors = [{ name = "Hayden", email = "hay-kot@pm.me" }]
|
||||||
license = "AGPL-3.0-only"
|
license = "AGPL-3.0-only"
|
||||||
@@ -9,7 +9,7 @@ dependencies = [
|
|||||||
"Jinja2==3.1.6",
|
"Jinja2==3.1.6",
|
||||||
"Pillow==12.2.0",
|
"Pillow==12.2.0",
|
||||||
"PyYAML==6.0.3",
|
"PyYAML==6.0.3",
|
||||||
"SQLAlchemy==2.0.49",
|
"SQLAlchemy==2.0.50",
|
||||||
"aiofiles==25.1.0",
|
"aiofiles==25.1.0",
|
||||||
"alembic==1.18.4",
|
"alembic==1.18.4",
|
||||||
"aniso8601==10.0.1",
|
"aniso8601==10.0.1",
|
||||||
@@ -17,21 +17,21 @@ dependencies = [
|
|||||||
"apprise==1.10.0",
|
"apprise==1.10.0",
|
||||||
"bcrypt==5.0.0",
|
"bcrypt==5.0.0",
|
||||||
"extruct==0.18.0",
|
"extruct==0.18.0",
|
||||||
"fastapi==0.136.1",
|
"fastapi==0.136.3",
|
||||||
"httpx==0.28.1",
|
"httpx==0.28.1",
|
||||||
"lxml==6.1.0",
|
"lxml==6.1.1",
|
||||||
"orjson==3.11.8",
|
"orjson==3.11.9",
|
||||||
"pydantic==2.13.3",
|
"pydantic==2.13.4",
|
||||||
"pyhumps==3.8.0",
|
"pyhumps==3.8.0",
|
||||||
"python-dateutil==2.9.0.post0",
|
"python-dateutil==2.9.0.post0",
|
||||||
"python-dotenv==1.2.2",
|
"python-dotenv==1.2.2",
|
||||||
"python-ldap==3.4.5",
|
"python-ldap==3.4.7",
|
||||||
"python-multipart==0.0.27",
|
"python-multipart==0.0.29",
|
||||||
"python-slugify==8.0.4",
|
"python-slugify==8.0.4",
|
||||||
"recipe-scrapers==15.11.0",
|
"recipe-scrapers==15.11.0",
|
||||||
"requests==2.33.1",
|
"requests==2.34.2",
|
||||||
"tzdata==2026.2",
|
"tzdata==2026.2",
|
||||||
"uvicorn[standard]==0.46.0",
|
"uvicorn[standard]==0.48.0",
|
||||||
"beautifulsoup4==4.14.3",
|
"beautifulsoup4==4.14.3",
|
||||||
"isodate==0.7.2",
|
"isodate==0.7.2",
|
||||||
"text-unidecode==1.3",
|
"text-unidecode==1.3",
|
||||||
@@ -39,14 +39,14 @@ dependencies = [
|
|||||||
"authlib==1.7.2",
|
"authlib==1.7.2",
|
||||||
"html2text==2025.4.15",
|
"html2text==2025.4.15",
|
||||||
"paho-mqtt==1.6.1",
|
"paho-mqtt==1.6.1",
|
||||||
"pydantic-settings==2.14.0",
|
"pydantic-settings==2.14.1",
|
||||||
"pillow-heif==1.3.0",
|
"pillow-heif==1.3.0",
|
||||||
"pyjwt==2.12.1",
|
"pyjwt==2.13.0",
|
||||||
"openai==2.34.0",
|
"openai==2.38.0",
|
||||||
"typing-extensions==4.15.0",
|
"typing-extensions==4.15.0",
|
||||||
"itsdangerous==2.2.0",
|
"itsdangerous==2.2.0",
|
||||||
"yt-dlp==2026.3.17",
|
"yt-dlp==2026.3.17",
|
||||||
"ingredient-parser-nlp==2.6.0",
|
"ingredient-parser-nlp==2.7.0",
|
||||||
"pint==0.25.3",
|
"pint==0.25.3",
|
||||||
"httpx-curl-cffi==0.1.5",
|
"httpx-curl-cffi==0.1.5",
|
||||||
]
|
]
|
||||||
@@ -64,20 +64,20 @@ docs = [
|
|||||||
"mkdocs-material==9.7.6",
|
"mkdocs-material==9.7.6",
|
||||||
]
|
]
|
||||||
dev = [
|
dev = [
|
||||||
"coverage==7.13.5",
|
"coverage==7.14.1",
|
||||||
"coveragepy-lcov==0.1.2",
|
"coveragepy-lcov==0.1.2",
|
||||||
"mkdocs-material==9.7.6",
|
"mkdocs-material==9.7.6",
|
||||||
"mypy==2.0.0",
|
"mypy==2.1.0",
|
||||||
"pre-commit==4.6.0",
|
"pre-commit==4.6.0",
|
||||||
"pylint==4.0.5",
|
"pylint==4.0.5",
|
||||||
"pytest==9.0.3",
|
"pytest==9.0.3",
|
||||||
"pytest-asyncio==1.3.0",
|
"pytest-asyncio==1.3.0",
|
||||||
"rich==15.0.0",
|
"rich==15.0.0",
|
||||||
"ruff==0.15.12",
|
"ruff==0.15.14",
|
||||||
"types-PyYAML==6.0.12.20260408",
|
"types-PyYAML==6.0.12.20260518",
|
||||||
"types-python-dateutil==2.9.0.20260408",
|
"types-python-dateutil==2.9.0.20260518",
|
||||||
"types-python-slugify==8.0.2.20240310",
|
"types-python-slugify==8.0.2.20240310",
|
||||||
"types-requests==2.33.0.20260503",
|
"types-requests==2.33.0.20260518",
|
||||||
"types-urllib3==1.26.25.14",
|
"types-urllib3==1.26.25.14",
|
||||||
"pydantic-to-typescript2==1.0.6",
|
"pydantic-to-typescript2==1.0.6",
|
||||||
"freezegun==1.5.5",
|
"freezegun==1.5.5",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"prCreation": "immediate",
|
||||||
"lockFileMaintenance": {
|
"lockFileMaintenance": {
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
@@ -24,6 +25,13 @@
|
|||||||
],
|
],
|
||||||
"dependencyDashboardApproval": true
|
"dependencyDashboardApproval": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Always create lockfile maintenance PRs without dashboard approval",
|
||||||
|
"matchUpdateTypes": [
|
||||||
|
"lockFileMaintenance"
|
||||||
|
],
|
||||||
|
"dependencyDashboardApproval": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"matchManagers": [
|
"matchManagers": [
|
||||||
"pep621"
|
"pep621"
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from mealie.core.config import get_app_settings
|
from mealie.core.config import get_app_settings
|
||||||
from mealie.core.settings.settings import AppSettings
|
from mealie.core.settings.settings import AppSettings, determine_secrets
|
||||||
|
|
||||||
|
|
||||||
def test_non_default_settings(monkeypatch):
|
def test_non_default_settings(monkeypatch):
|
||||||
@@ -367,3 +368,42 @@ def test_sensitive_settings_mask(monkeypatch: pytest.MonkeyPatch):
|
|||||||
for setting in sensitive_settings:
|
for setting in sensitive_settings:
|
||||||
assert settings[setting] == "*****"
|
assert settings[setting] == "*****"
|
||||||
assert settings_json[setting] == "*****"
|
assert settings_json[setting] == "*****"
|
||||||
|
|
||||||
|
|
||||||
|
class DetermineSecretsTests:
|
||||||
|
def test_non_production_returns_fixed_key(self, tmp_path: Path):
|
||||||
|
result = determine_secrets(tmp_path, ".secret", production=False)
|
||||||
|
assert result == "shh-secret-test-key"
|
||||||
|
|
||||||
|
def test_generates_secret_when_file_missing(self, tmp_path: Path):
|
||||||
|
result = determine_secrets(tmp_path, ".secret", production=True)
|
||||||
|
assert result
|
||||||
|
assert (tmp_path / ".secret").read_text() == result
|
||||||
|
|
||||||
|
def test_reuses_existing_secret(self, tmp_path: Path):
|
||||||
|
(tmp_path / ".secret").write_text("existing-secret")
|
||||||
|
result = determine_secrets(tmp_path, ".secret", production=True)
|
||||||
|
assert result == "existing-secret"
|
||||||
|
|
||||||
|
def test_regenerates_when_file_is_empty(self, tmp_path: Path):
|
||||||
|
(tmp_path / ".secret").write_text("")
|
||||||
|
result = determine_secrets(tmp_path, ".secret", production=True)
|
||||||
|
assert result
|
||||||
|
assert (tmp_path / ".secret").read_text() == result
|
||||||
|
|
||||||
|
def test_regenerates_when_file_is_whitespace_only(self, tmp_path: Path):
|
||||||
|
(tmp_path / ".secret").write_text(" \n ")
|
||||||
|
result = determine_secrets(tmp_path, ".secret", production=True)
|
||||||
|
assert result
|
||||||
|
assert (tmp_path / ".secret").read_text() == result
|
||||||
|
|
||||||
|
def test_generates_unique_secrets(self, tmp_path: Path):
|
||||||
|
dir_a = tmp_path / "a"
|
||||||
|
dir_b = tmp_path / "b"
|
||||||
|
result_a = determine_secrets(dir_a, ".secret", production=True)
|
||||||
|
result_b = determine_secrets(dir_b, ".secret", production=True)
|
||||||
|
assert result_a != result_b
|
||||||
|
|
||||||
|
def test_no_tmp_file_left_after_write(self, tmp_path: Path):
|
||||||
|
determine_secrets(tmp_path, ".secret", production=True)
|
||||||
|
assert not (tmp_path / ".tmp").exists()
|
||||||
|
|||||||
Reference in New Issue
Block a user