Merge branch 'mealie-next' into feat/nuxt3-migration

This commit is contained in:
Michael Genson 2025-06-17 13:11:24 -05:00 committed by GitHub
commit 347c788606
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 220 additions and 211 deletions

View file

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

View file

@ -1049,7 +1049,7 @@
"merge-dialog-text": "La combinaison des aliments sélectionnés fusionnera laliment source et laliment cible en un seul aliment. Laliment source sera supprimé et toutes les références à laliment source seront mises à jour pour pointer vers laliment cible.",
"merge-food-example": "Fusion de {food1} dans {food2}",
"seed-dialog-text": "Initialisez la base de données avec des aliments basés sur votre langue locale. Cela permettra de créer plus de 200 aliments communs qui pourront être utilisés pour organiser votre base de données. Les aliments sont traduits grâce à un effort communautaire.",
"seed-dialog-warning": "Vous avez déjà des éléments dans votre base de données. Cette action ne fusionnera pas les doublons, vous devrez les gérer manuellement.",
"seed-dialog-warning": "Vous avez déjà des éléments dans votre base de données. Cette action ne conciliera pas les doublons, vous devrez les gérer manuellement.",
"combine-food": "Combiner les aliments",
"source-food": "Aliment source",
"target-food": "Aliment cible",

View file

@ -45,13 +45,13 @@
"category-filter": "Kategória szűrő",
"category-update-failed": "Kategória frissítése sikertelen",
"category-updated": "Kategória frissítve",
"uncategorized-count": "Kategórizálatlan {count}",
"uncategorized-count": "Kategorizálatlan {count}",
"create-a-category": "Kategória létrehozása",
"category-name": "Kategória név",
"category": "Kategória"
},
"events": {
"apprise-url": "Apprise URL",
"apprise-url": "Apprise cím (URL)",
"database": "Adatbázis",
"delete-event": "Esemény törlése",
"event-delete-confirmation": "Biztosan törölni szeretné ezt az eseményt?",
@ -638,7 +638,7 @@
"tree-view": "Fa nézet",
"recipe-servings": "Recept tálalások",
"recipe-yield": "Adagonkénti információk",
"recipe-yield-text": "Recipe Yield Text",
"recipe-yield-text": "Recept Késleltetés szöveg",
"unit": "Mennyiségi egység",
"upload-image": "Kép feltöltése",
"screen-awake": "Képernyő ébren tartása",
@ -720,7 +720,7 @@
"backup-restore": "Biztonsági Mentés/Visszaállítás",
"back-restore-description": "A biztonsági mentés visszaállítása felülírja az adatbázisban és az adatkönyvtárban lévő összes aktuális adatot, és a biztonsági mentés tartalmával helyettesíti azokat. {cannot-be-undone} Ha a visszaállítás sikeres, akkor a rendszer kilépteti Önt.",
"cannot-be-undone": "Ezt a műveletet visszavonható - óvatosan használja.",
"postgresql-note": "If you are using PostgreSQL, please review the {backup-restore-process} prior to restoring.",
"postgresql-note": "Ha PostgreSQL-t használ, kérjük, a visszaállítás előtt tekintse át a {backup-restore-process}-t.",
"backup-restore-process-in-the-documentation": "biztonsági mentés/visszaállítás folyamata a dokumentációban",
"irreversible-acknowledgment": "Tudomásul veszem, hogy ez a művelet visszafordíthatatlan, helyrehozhatatlan, és adatvesztéssel járhat",
"restore-backup": "Biztonsági mentés visszaállítása"

View file

@ -26,7 +26,7 @@
"sponsor": "Sponsor"
},
"asset": {
"assets": "Bijlagen",
"assets": "Onderdelen",
"code": "Code",
"file": "Bestand",
"image": "Afbeelding",

View file

@ -15,7 +15,7 @@
"serving": "Adag",
"servings": "Adag",
"yield": "Adag",
"yields": "Yields"
"yields": "Késleltetve"
}
},
"mealplan": {

View file

@ -3,10 +3,10 @@
"name": "acorn squash"
},
"alfalfa-sprouts": {
"name": "alfalfa sprouts"
"name": "lucernacsíra"
},
"anchovies": {
"name": "anchovies"
"name": "szardella"
},
"apples": {
"name": "alma",
@ -16,7 +16,7 @@
"name": "articsóka"
},
"arugula": {
"name": "arugula"
"name": "borsmustár"
},
"asparagus": {
"name": "spárga"
@ -63,16 +63,16 @@
"name": "kenyér"
},
"breadfruit": {
"name": "breadfruit"
"name": "kenyérfa"
},
"broccoflower": {
"name": "broccoflower"
"name": "brokkoli"
},
"broccoli": {
"name": "brokkoli"
},
"broccoli-rabe": {
"name": "broccoli rabe"
"name": "rapini"
},
"broccolini": {
"name": "broccolini"
@ -138,109 +138,109 @@
"name": "zeller"
},
"celery": {
"name": "celery"
"name": "zeller"
},
"cereal-grains": {
"name": "cereal grains"
"name": "darált zeller"
},
"chard": {
"name": "chard"
"name": "mángold"
},
"cheese": {
"name": "cheese"
"name": "sajt"
},
"chicory": {
"name": "chicory"
"name": "katáng"
},
"chilli-peppers": {
"name": "chilli pepper",
"plural_name": "chilli peppers"
"name": "chili paprika",
"plural_name": "chili paprikák"
},
"chinese-leaves": {
"name": "chinese leaves"
"name": "kínai kel"
},
"chives": {
"name": "chives"
"name": "metélőhagyma"
},
"chocolate": {
"name": "chocolate"
"name": "csoki"
},
"cilantro": {
"name": "cilantro"
},
"cinnamon": {
"name": "cinnamon"
"name": "fahéj"
},
"clarified-butter": {
"name": "clarified butter"
"name": "tisztított vaj"
},
"coconut": {
"name": "coconut",
"plural_name": "coconuts"
"name": "kókusz",
"plural_name": "kókuszok"
},
"coconut-milk": {
"name": "coconut milk"
"name": "kókusztej"
},
"cod": {
"name": "cod"
"name": "tőkehal"
},
"coffee": {
"name": "coffee"
"name": "kávé"
},
"collard-greens": {
"name": "collard greens"
"name": "kelkáposzta"
},
"confectioners-sugar": {
"name": "confectioners' sugar"
"name": "porcukor"
},
"coriander": {
"name": "coriander"
"name": "koriander"
},
"corn": {
"name": "corn",
"plural_name": "corns"
"name": "kukorica",
"plural_name": "kukoricák"
},
"corn-syrup": {
"name": "corn syrup"
"name": "kukorica szirup"
},
"cottonseed-oil": {
"name": "cottonseed oil"
"name": "gyapotmag-olaj"
},
"courgette": {
"name": "courgette"
"name": "cukkini"
},
"cream-of-tartar": {
"name": "cream of tartar"
},
"cucumber": {
"name": "cucumber",
"plural_name": "cucumbers"
"name": "uborka",
"plural_name": "uborkák"
},
"cumin": {
"name": "cumin"
"name": "kömény"
},
"daikon": {
"name": "daikon",
"plural_name": "daikons"
"name": "jégcsapretek",
"plural_name": "jégcsapretkek"
},
"dairy-products-and-dairy-substitutes": {
"name": "dairy products and dairy substitutes"
"name": "tejtermékek és tej helyettesítők"
},
"dandelion": {
"name": "dandelion"
"name": "pitypang"
},
"demerara-sugar": {
"name": "demerara sugar"
"name": "demerara cukor"
},
"dough": {
"name": "dough"
"name": "tészta"
},
"edible-cactus": {
"name": "edible cactus"
"name": "ehető kaktusz"
},
"eggplant": {
"name": "eggplant",
"plural_name": "eggplants"
"name": "padlizsán",
"plural_name": "padlizsánok"
},
"eggs": {
"name": "tojás",
@ -421,42 +421,42 @@
"name": "nutritional yeast flakes"
},
"nuts": {
"name": "nuts"
"name": "diófélék"
},
"octopuses": {
"name": "octopus",
"plural_name": "octopuses"
"name": "polip",
"plural_name": "polipok"
},
"oils": {
"name": "oils"
"name": "olajok"
},
"okra": {
"name": "okra"
},
"olive": {
"name": "olive"
"name": "olívabogyó"
},
"olive-oil": {
"name": "olive oil"
"name": "olivaolaj"
},
"onion": {
"name": "onion"
"name": "hagyma"
},
"onion-family": {
"name": "onion family"
"name": "hagymafélék"
},
"orange-blossom-water": {
"name": "orange blossom water"
},
"oranges": {
"name": "orange",
"plural_name": "oranges"
"name": "narancs",
"plural_name": "narancsok"
},
"oregano": {
"name": "oregano"
"name": "oregánó"
},
"oysters": {
"name": "oysters"
"name": "osztriga"
},
"panch-puran": {
"name": "panch puran"
@ -465,66 +465,66 @@
"name": "paprika"
},
"parsley": {
"name": "parsley"
"name": "petrezselyem"
},
"parsnip": {
"name": "parsnip",
"plural_name": "parsnips"
"name": "paszternák",
"plural_name": "paszternákok"
},
"pear": {
"name": "pear",
"plural_name": "pears"
"name": "körte",
"plural_name": "körték"
},
"peas": {
"name": "peas"
"name": "borsó"
},
"pepper": {
"name": "pepper",
"plural_name": "peppers"
"name": "bors",
"plural_name": "bors"
},
"pineapple": {
"name": "pineapple",
"plural_name": "pineapples"
"name": "ananász",
"plural_name": "ananász"
},
"plantain": {
"name": "plantain",
"plural_name": "plantains"
},
"poppy-seeds": {
"name": "poppy seeds"
"name": "mák"
},
"potato": {
"name": "potato",
"plural_name": "potatoes"
"name": "burgonya",
"plural_name": "burgonyák"
},
"poultry": {
"name": "poultry"
"name": "baromfi"
},
"powdered-sugar": {
"name": "powdered sugar"
"name": "porcukor"
},
"pumpkin": {
"name": "pumpkin",
"plural_name": "pumpkins"
"name": "tök",
"plural_name": "tökök"
},
"pumpkin-seeds": {
"name": "pumpkin seeds"
"name": "tökmag"
},
"radish": {
"name": "radish",
"plural_name": "radishes"
"name": "retek",
"plural_name": "retkek"
},
"raw-sugar": {
"name": "raw sugar"
"name": "barna cukor"
},
"refined-sugar": {
"name": "refined sugar"
"name": "finomitott cukor"
},
"rice": {
"name": "rice"
"name": "rizs"
},
"rice-flour": {
"name": "rice flour"
"name": "rízsliszt"
},
"rock-sugar": {
"name": "rock sugar"
@ -533,13 +533,13 @@
"name": "rum"
},
"salmon": {
"name": "salmon"
"name": "lazac"
},
"salt": {
"name": "salt"
"name": "só"
},
"salt-cod": {
"name": "salt cod"
"name": "sózott tőkehal"
},
"scallion": {
"name": "scallion",
@ -649,44 +649,44 @@
"name": "turbanado sugar"
},
"turnip": {
"name": "turnip",
"plural_name": "turnips"
"name": "fehér répa",
"plural_name": "fehérrépák"
},
"unrefined-sugar": {
"name": "unrefined sugar"
"name": "finomitatlan cukor"
},
"vanilla": {
"name": "vanilla"
"name": "vanília"
},
"vegetables": {
"name": "vegetables"
"name": "zöldségek"
},
"watercress": {
"name": "watercress"
},
"watermelon": {
"name": "watermelon",
"plural_name": "watermelons"
"name": "görögdinnye",
"plural_name": "görögdinnyék"
},
"white-mushroom": {
"name": "white mushroom",
"plural_name": "white mushrooms"
"name": "fehér gomba",
"plural_name": "fehér gombák"
},
"white-sugar": {
"name": "white sugar"
"name": "fehér cukor"
},
"xanthan-gum": {
"name": "xanthan gum"
"name": "xantángumi"
},
"yam": {
"name": "yam",
"plural_name": "yams"
"name": "jamgyökér",
"plural_name": "jamgyökerek"
},
"yeast": {
"name": "yeast"
"name": "élesztő"
},
"zucchini": {
"name": "zucchini",
"plural_name": "zucchinis"
"name": "cukkini",
"plural_name": "cukkinik"
}
}

View file

@ -23,7 +23,7 @@
},
"avocado": {
"name": "avocado",
"plural_name": "avocado"
"plural_name": "avocados"
},
"bacon": {
"name": "spek\nontbijtspek\nbacon"
@ -47,7 +47,7 @@
"name": "bonen"
},
"bell-peppers": {
"name": "paprikas",
"name": "paprika",
"plural_name": "paprikas"
},
"blackberries": {
@ -135,7 +135,7 @@
"name": "cayennepeper"
},
"celeriac": {
"name": "knolselder"
"name": "knolselderij"
},
"celery": {
"name": "selderij"
@ -201,7 +201,7 @@
"plural_name": "maïs"
},
"corn-syrup": {
"name": "maisstroop"
"name": "maïsstroop"
},
"cottonseed-oil": {
"name": "katoenzaadolie"
@ -402,7 +402,7 @@
"name": "mortadella"
},
"mushroom": {
"name": "paddestoel",
"name": "paddenstoel",
"plural_name": "paddenstoelen"
},
"mussels": {
@ -518,7 +518,7 @@
"name": "ruwe suiker"
},
"refined-sugar": {
"name": "gerafineerde suiker"
"name": "geraffineerde suiker"
},
"rice": {
"name": "rijst"
@ -539,7 +539,7 @@
"name": "zout"
},
"salt-cod": {
"name": "gezoute kabeljauw"
"name": "gezouten kabeljauw"
},
"scallion": {
"name": "lente-ui",
@ -555,7 +555,7 @@
"name": "sesamzaad"
},
"shallot": {
"name": "sjalotte",
"name": "sjalot",
"plural_name": "sjalotjes"
},
"skate": {
@ -585,7 +585,7 @@
},
"spring-onion": {
"name": "lente-ui",
"plural_name": "lente-uitjes"
"plural_name": "lente-uien"
},
"squash": {
"name": "pompoen",
@ -626,7 +626,7 @@
},
"taro": {
"name": "taro",
"plural_name": "taroes"
"plural_name": "taros"
},
"teff": {
"name": "abessijns liefdegras"
@ -639,7 +639,7 @@
"name": "forel"
},
"tubers": {
"name": "knolgewassen",
"name": "knolgewas",
"plural_name": "knolgewassen"
},
"tuna": {
@ -653,7 +653,7 @@
"plural_name": "knolrapen"
},
"unrefined-sugar": {
"name": "ongerafineerde suiker"
"name": "ongeraffineerde suiker"
},
"vanilla": {
"name": "vanille"

View file

@ -46,5 +46,5 @@ class RecipeSharedController(BaseUserController):
return self.mixins.get_one(item_id)
@router.delete("/{item_id}")
def delete_one(self, item_id: UUID4 | None = None) -> None:
def delete_one(self, item_id: UUID4) -> None:
return self.mixins.delete_one(item_id)

View file

@ -2,6 +2,7 @@ import contextlib
import functools
import html
import json
import numbers
import operator
import re
import typing
@ -392,7 +393,7 @@ def clean_yield(yields: str | list[str] | None) -> tuple[float, float, str]:
return servings_qty, yld_qty, yld_str
def clean_time(time_entry: str | timedelta | None, translator: Translator) -> None | str:
def clean_time(time_entry: str | timedelta | int | float | None, translator: Translator) -> None | str:
"""_summary_
Supported Structures:
@ -401,6 +402,7 @@ def clean_time(time_entry: str | timedelta | None, translator: Translator) -> No
- `"PT1H30M"` - returns "1 hour 30 minutes"
- `timedelta(hours=1, minutes=30)` - returns "1 hour 30 minutes"
- `{"minValue": "PT1H30M"}` - returns "1 hour 30 minutes"
- `30` - as a `int` or `float` assumed to be in minutes, returns "30 minutes"
Raises:
TypeError: if the type is not supported a TypeError is raised
@ -412,6 +414,10 @@ def clean_time(time_entry: str | timedelta | None, translator: Translator) -> No
return None
match time_entry:
case numbers.Number():
# type checked by case statement
time_delta = timedelta(minutes=time_entry) # type: ignore
return pretty_print_timedelta(time_delta, translator)
case str(time_entry):
if not time_entry.strip():
return None
@ -431,7 +437,9 @@ def clean_time(time_entry: str | timedelta | None, translator: Translator) -> No
# TODO: Not sure what to do here
return str(time_entry)
case _:
logger.warning("[SCRAPER] Unexpected type or structure for variable time_entry")
logger.warning(
"[SCRAPER] Unexpected type(%s) or structure for variable time_entry: %s", type(time_entry), time_entry
)
return None

163
poetry.lock generated
View file

@ -684,14 +684,14 @@ cli = ["requests"]
[[package]]
name = "fastapi"
version = "0.115.12"
version = "0.115.13"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d"},
{file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"},
{file = "fastapi-0.115.13-py3-none-any.whl", hash = "sha256:0a0cab59afa7bab22f5eb347f8c9864b681558c278395e94035a741fc10cd865"},
{file = "fastapi-0.115.13.tar.gz", hash = "sha256:55d1d25c2e1e0a0a50aceb1c8705cd932def273c102bff0b1c1da88b3c6eb307"},
]
[package.dependencies]
@ -1666,44 +1666,44 @@ files = [
[[package]]
name = "mypy"
version = "1.16.0"
version = "1.16.1"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
{file = "mypy-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7909541fef256527e5ee9c0a7e2aeed78b6cda72ba44298d1334fe7881b05c5c"},
{file = "mypy-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e71d6f0090c2256c713ed3d52711d01859c82608b5d68d4fa01a3fe30df95571"},
{file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:936ccfdd749af4766be824268bfe22d1db9eb2f34a3ea1d00ffbe5b5265f5491"},
{file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4086883a73166631307fdd330c4a9080ce24913d4f4c5ec596c601b3a4bdd777"},
{file = "mypy-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:feec38097f71797da0231997e0de3a58108c51845399669ebc532c815f93866b"},
{file = "mypy-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:09a8da6a0ee9a9770b8ff61b39c0bb07971cda90e7297f4213741b48a0cc8d93"},
{file = "mypy-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9f826aaa7ff8443bac6a494cf743f591488ea940dd360e7dd330e30dd772a5ab"},
{file = "mypy-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82d056e6faa508501af333a6af192c700b33e15865bda49611e3d7d8358ebea2"},
{file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:089bedc02307c2548eb51f426e085546db1fa7dd87fbb7c9fa561575cf6eb1ff"},
{file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a2322896003ba66bbd1318c10d3afdfe24e78ef12ea10e2acd985e9d684a666"},
{file = "mypy-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:021a68568082c5b36e977d54e8f1de978baf401a33884ffcea09bd8e88a98f4c"},
{file = "mypy-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:54066fed302d83bf5128632d05b4ec68412e1f03ef2c300434057d66866cea4b"},
{file = "mypy-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5436d11e89a3ad16ce8afe752f0f373ae9620841c50883dc96f8b8805620b13"},
{file = "mypy-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2622af30bf01d8fc36466231bdd203d120d7a599a6d88fb22bdcb9dbff84090"},
{file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d045d33c284e10a038f5e29faca055b90eee87da3fc63b8889085744ebabb5a1"},
{file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4968f14f44c62e2ec4a038c8797a87315be8df7740dc3ee8d3bfe1c6bf5dba8"},
{file = "mypy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb14a4a871bb8efb1e4a50360d4e3c8d6c601e7a31028a2c79f9bb659b63d730"},
{file = "mypy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:bd4e1ebe126152a7bbaa4daedd781c90c8f9643c79b9748caa270ad542f12bec"},
{file = "mypy-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e056237c89f1587a3be1a3a70a06a698d25e2479b9a2f57325ddaaffc3567b"},
{file = "mypy-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b07e107affb9ee6ce1f342c07f51552d126c32cd62955f59a7db94a51ad12c0"},
{file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6fb60cbd85dc65d4d63d37cb5c86f4e3a301ec605f606ae3a9173e5cf34997b"},
{file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7e32297a437cc915599e0578fa6bc68ae6a8dc059c9e009c628e1c47f91495d"},
{file = "mypy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:afe420c9380ccec31e744e8baff0d406c846683681025db3531b32db56962d52"},
{file = "mypy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:55f9076c6ce55dd3f8cd0c6fff26a008ca8e5131b89d5ba6d86bd3f47e736eeb"},
{file = "mypy-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f56236114c425620875c7cf71700e3d60004858da856c6fc78998ffe767b73d3"},
{file = "mypy-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:15486beea80be24ff067d7d0ede673b001d0d684d0095803b3e6e17a886a2a92"},
{file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ed0e0847a80655afa2c121835b848ed101cc7b8d8d6ecc5205aedc732b1436"},
{file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb5fbc8063cb4fde7787e4c0406aa63094a34a2daf4673f359a1fb64050e9cb2"},
{file = "mypy-1.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a5fcfdb7318c6a8dd127b14b1052743b83e97a970f0edb6c913211507a255e20"},
{file = "mypy-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e7e0ad35275e02797323a5aa1be0b14a4d03ffdb2e5f2b0489fa07b89c67b21"},
{file = "mypy-1.16.0-py3-none-any.whl", hash = "sha256:29e1499864a3888bca5c1542f2d7232c6e586295183320caa95758fc84034031"},
{file = "mypy-1.16.0.tar.gz", hash = "sha256:84b94283f817e2aa6350a14b4a8fb2a35a53c286f97c9d30f53b63620e7af8ab"},
{file = "mypy-1.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4f0fed1022a63c6fec38f28b7fc77fca47fd490445c69d0a66266c59dd0b88a"},
{file = "mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72"},
{file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea"},
{file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352025753ef6a83cb9e7f2427319bb7875d1fdda8439d1e23de12ab164179574"},
{file = "mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d"},
{file = "mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6"},
{file = "mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc"},
{file = "mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782"},
{file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507"},
{file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca"},
{file = "mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4"},
{file = "mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6"},
{file = "mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d"},
{file = "mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9"},
{file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79"},
{file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15"},
{file = "mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd"},
{file = "mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b"},
{file = "mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438"},
{file = "mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536"},
{file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f"},
{file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359"},
{file = "mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be"},
{file = "mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee"},
{file = "mypy-1.16.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fc688329af6a287567f45cc1cefb9db662defeb14625213a5b7da6e692e2069"},
{file = "mypy-1.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e198ab3f55924c03ead626ff424cad1732d0d391478dfbf7bb97b34602395da"},
{file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09aa4f91ada245f0a45dbc47e548fd94e0dd5a8433e0114917dc3b526912a30c"},
{file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13c7cd5b1cb2909aa318a90fd1b7e31f17c50b242953e7dd58345b2a814f6383"},
{file = "mypy-1.16.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58e07fb958bc5d752a280da0e890c538f1515b79a65757bbdc54252ba82e0b40"},
{file = "mypy-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:f895078594d918f93337a505f8add9bd654d1a24962b4c6ed9390e12531eb31b"},
{file = "mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37"},
{file = "mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab"},
]
[package.dependencies]
@ -1855,14 +1855,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]]
name = "openai"
version = "1.82.1"
version = "1.86.0"
description = "The official Python library for the openai API"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "openai-1.82.1-py3-none-any.whl", hash = "sha256:334eb5006edf59aa464c9e932b9d137468d810b2659e5daea9b3a8c39d052395"},
{file = "openai-1.82.1.tar.gz", hash = "sha256:ffc529680018e0417acac85f926f92aa0bbcbc26e82e2621087303c66bc7f95d"},
{file = "openai-1.86.0-py3-none-any.whl", hash = "sha256:c8889c39410621fe955c230cc4c21bfe36ec887f4e60a957de05f507d7e1f349"},
{file = "openai-1.86.0.tar.gz", hash = "sha256:c64d5b788359a8fdf69bd605ae804ce41c1ce2e78b8dd93e2542e0ee267f1e4b"},
]
[package.dependencies]
@ -2377,14 +2377,14 @@ files = [
[[package]]
name = "pydantic"
version = "2.11.5"
version = "2.11.7"
description = "Data validation using Python type hints"
optional = false
python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
{file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"},
{file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"},
{file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"},
{file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"},
]
[package.dependencies]
@ -2675,24 +2675,25 @@ requests = ">=2.32.3"
[[package]]
name = "pytest"
version = "8.3.5"
version = "8.4.0"
description = "pytest: simple powerful testing with Python"
optional = false
python-versions = ">=3.8"
python-versions = ">=3.9"
groups = ["dev"]
files = [
{file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"},
{file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"},
{file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"},
{file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"},
]
[package.dependencies]
colorama = {version = "*", markers = "sys_platform == \"win32\""}
iniconfig = "*"
packaging = "*"
colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
iniconfig = ">=1"
packaging = ">=20"
pluggy = ">=1.5,<2"
pygments = ">=2.7.2"
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-asyncio"
@ -3065,14 +3066,14 @@ orjson = ["orjson (>=3.9.14,<4)"]
[[package]]
name = "recipe-scrapers"
version = "15.7.1"
version = "15.8.0"
description = "Python package, scraping recipes from all over the internet"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "recipe_scrapers-15.7.1-py3-none-any.whl", hash = "sha256:f5131c3c9ce7c7a261ffe25514334c2b86b911fc3e53935c91cf7dd420b80855"},
{file = "recipe_scrapers-15.7.1.tar.gz", hash = "sha256:7657a743994712fdb1f7ff463891e593a55c6f9597be4e64425dcadd3b9aa75f"},
{file = "recipe_scrapers-15.8.0-py3-none-any.whl", hash = "sha256:65015802f3d6e60493b9a9de4737c0aa42eb67c6d2ced43a1f32ffaf4fb9c48e"},
{file = "recipe_scrapers-15.8.0.tar.gz", hash = "sha256:938d0510b88809fa181e49d95498bbc40db40d8d973637b3f7b77da837bcda12"},
]
[package.dependencies]
@ -3188,19 +3189,19 @@ files = [
[[package]]
name = "requests"
version = "2.32.3"
version = "2.32.4"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
{file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
{file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
{file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"},
{file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"},
]
[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = ">=2,<4"
charset_normalizer = ">=2,<4"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<3"
@ -3248,30 +3249,30 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]]
name = "ruff"
version = "0.11.12"
version = "0.11.13"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
groups = ["dev"]
files = [
{file = "ruff-0.11.12-py3-none-linux_armv6l.whl", hash = "sha256:c7680aa2f0d4c4f43353d1e72123955c7a2159b8646cd43402de6d4a3a25d7cc"},
{file = "ruff-0.11.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2cad64843da9f134565c20bcc430642de897b8ea02e2e79e6e02a76b8dcad7c3"},
{file = "ruff-0.11.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9b6886b524a1c659cee1758140138455d3c029783d1b9e643f3624a5ee0cb0aa"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc3a3690aad6e86c1958d3ec3c38c4594b6ecec75c1f531e84160bd827b2012"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f97fdbc2549f456c65b3b0048560d44ddd540db1f27c778a938371424b49fe4a"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74adf84960236961090e2d1348c1a67d940fd12e811a33fb3d107df61eef8fc7"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b56697e5b8bcf1d61293ccfe63873aba08fdbcbbba839fc046ec5926bdb25a3a"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d47afa45e7b0eaf5e5969c6b39cbd108be83910b5c74626247e366fd7a36a13"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bf9603fe1bf949de8b09a2da896f05c01ed7a187f4a386cdba6760e7f61be"},
{file = "ruff-0.11.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08033320e979df3b20dba567c62f69c45e01df708b0f9c83912d7abd3e0801cd"},
{file = "ruff-0.11.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:929b7706584f5bfd61d67d5070f399057d07c70585fa8c4491d78ada452d3bef"},
{file = "ruff-0.11.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7de4a73205dc5756b8e09ee3ed67c38312dce1aa28972b93150f5751199981b5"},
{file = "ruff-0.11.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2635c2a90ac1b8ca9e93b70af59dfd1dd2026a40e2d6eebaa3efb0465dd9cf02"},
{file = "ruff-0.11.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d05d6a78a89166f03f03a198ecc9d18779076ad0eec476819467acb401028c0c"},
{file = "ruff-0.11.12-py3-none-win32.whl", hash = "sha256:f5a07f49767c4be4772d161bfc049c1f242db0cfe1bd976e0f0886732a4765d6"},
{file = "ruff-0.11.12-py3-none-win_amd64.whl", hash = "sha256:5a4d9f8030d8c3a45df201d7fb3ed38d0219bccd7955268e863ee4a115fa0832"},
{file = "ruff-0.11.12-py3-none-win_arm64.whl", hash = "sha256:65194e37853158d368e333ba282217941029a28ea90913c67e558c611d04daa5"},
{file = "ruff-0.11.12.tar.gz", hash = "sha256:43cf7f69c7d7c7d7513b9d59c5d8cafd704e05944f978614aa9faff6ac202603"},
{file = "ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46"},
{file = "ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48"},
{file = "ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71"},
{file = "ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9"},
{file = "ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc"},
{file = "ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7"},
{file = "ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432"},
{file = "ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492"},
{file = "ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250"},
{file = "ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3"},
{file = "ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b"},
{file = "ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514"},
]
[[package]]
@ -3555,14 +3556,14 @@ files = [
[[package]]
name = "typing-extensions"
version = "4.13.2"
description = "Backported and Experimental Type Hints for Python 3.8+"
version = "4.14.0"
description = "Backported and Experimental Type Hints for Python 3.9+"
optional = false
python-versions = ">=3.8"
python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
{file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"},
{file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"},
{file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"},
{file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"},
]
[[package]]