Compare commits

...

8 Commits

Author SHA1 Message Date
renovate[bot]
5db3b6ab72 fix(deps): update dependency openai to v2.23.0 (#7132)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-24 08:56:43 +00:00
Hayden
353c24ca4b chore(l10n): New Crowdin updates (#7131) 2026-02-24 07:02:24 +00:00
Michael Genson
216ae8571c fix: Include unmade recipes when filtering by last made (#7130) 2026-02-23 18:34:16 -06:00
renovate[bot]
02d32c8905 fix(deps): update dependency openai to v2.22.0 (#7128)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-23 22:15:25 +00:00
Hayden
7e0d083e77 chore(l10n): New Crowdin updates (#7126) 2026-02-23 18:21:38 +00:00
mealie-actions[bot]
b3cea081fe chore(auto): Update pre-commit hooks (#7122)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
2026-02-23 14:07:02 +00:00
renovate[bot]
d79252752b fix(deps): update dependency fastapi to v0.131.0 (#7113)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-22 22:44:02 +00:00
Hayden
b3c214d102 chore(l10n): New Crowdin updates (#7119) 2026-02-22 22:43:45 +00:00
15 changed files with 387 additions and 341 deletions

View File

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

View File

@@ -79,8 +79,8 @@ This filter will find all foods that are not named "carrot": <br>
##### Keyword Filters
The API supports many SQL keywords, such as `IS NULL` and `IN`, as well as their negations (e.g. `IS NOT NULL` and `NOT IN`).
Here is an example of a filter that returns all recipes where the "last made" value is not null: <br>
`lastMade IS NOT NULL`
Here is an example of a filter that returns all shopping list items without a food: <br>
`foodId IS NULL`
This filter will find all recipes that don't start with the word "Test": <br>
`name NOT LIKE "Test%"`

View File

@@ -1423,8 +1423,8 @@
"is-greater-than-or-equal-to": "jest większe lub równe",
"is-less-than": "jest mniejsze niż",
"is-less-than-or-equal-to": "jest mniejsze lub równe",
"is-older-than": "is older than",
"is-newer-than": "is newer than"
"is-older-than": "jest starsze niż",
"is-newer-than": "jest nowsze niż"
},
"relational-keywords": {
"is": "jest",
@@ -1436,7 +1436,7 @@
"is-not-like": "nie jest jak"
},
"dates": {
"days-ago": "days ago|day ago|days ago"
"days-ago": "dni temu|dzień temu|dni temu"
}
},
"validators": {

View File

@@ -212,8 +212,8 @@
"upload-file": "Enviar arquivo",
"created-on-date": "Criado em {0}",
"unsaved-changes": "Você possui alterações não salvas. Deseja salvar antes de sair? Ok para salvar, Cancelar para descartar alterações.",
"discard-changes": "Discard Changes",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?",
"discard-changes": "Descartar alterações",
"discard-changes-description": "Você tem alterações não salvas. Tem certeza de que deseja descartá-las?",
"clipboard-copy-failure": "Falha ao copiar para a área de transferência.",
"confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?",
"organizers": "Organizadores",
@@ -644,7 +644,7 @@
"scrape-recipe-website-being-blocked": "Site sendo bloqueado?",
"scrape-recipe-try-importing-raw-html-instead": "Tente importar o HTML ao invés disso.",
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
"import-original-categories": "Import original categories",
"import-original-categories": "Importar categorias originais",
"stay-in-edit-mode": "Permanecer no modo de edição",
"parse-recipe-ingredients-after-import": "Interpretar os ingredientes da receita após importar",
"import-from-zip": "Importar do .zip",
@@ -1423,7 +1423,7 @@
"is-greater-than-or-equal-to": "é maior ou igual a",
"is-less-than": "é menor que",
"is-less-than-or-equal-to": "é menor ou igual a",
"is-older-than": "is older than",
"is-older-than": "Mais antigo que",
"is-newer-than": "is newer than"
},
"relational-keywords": {

View File

@@ -1,5 +1,6 @@
import re as re
from collections.abc import Iterable, Sequence
from datetime import UTC, datetime
from random import randint
from typing import Self, cast
from uuid import UUID
@@ -51,10 +52,13 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]):
return self
def _get_last_made_col_alias(self) -> sa.ColumnElement | None:
"""Computed last_made which uses `HouseholdToRecipe.last_made` for the user's household, otherwise None"""
"""
Computed last_made which uses `HouseholdToRecipe.last_made` for the user's household,
otherwise an arbitrarily low date
"""
user_household_subquery = sa.select(User.household_id).where(User.id == self.user_id).scalar_subquery()
return (
last_made_subquery = (
sa.select(HouseholdToRecipe.last_made)
.where(
HouseholdToRecipe.recipe_id == self.model.id,
@@ -63,6 +67,7 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]):
.correlate(self.model)
.scalar_subquery()
)
return sa.func.coalesce(last_made_subquery, datetime(year=1900, month=1, day=1, tzinfo=UTC))
def _get_rating_col_alias(self) -> sa.ColumnElement | None:
"""Computed rating which uses the user's rating if it exists, otherwise falling back to the recipe's rating"""

View File

@@ -2494,25 +2494,25 @@
"aliases": [],
"description": "",
"name": "Backstein Käse",
"plural_name": "brick cheese"
"plural_name": "Brick-Käse"
},
"quick-melt cheese": {
"aliases": [],
"description": "",
"name": "quick-melt cheese",
"plural_name": "quick-melt cheese"
"name": "schnellschmelzender Käse",
"plural_name": "schnellschmelzender Käse"
},
"farmer's cheese": {
"aliases": [],
"description": "",
"name": "farmer's cheese",
"plural_name": "farmer's cheese"
"name": "Bauernkäse",
"plural_name": "Bauernkäse"
},
"manouri cheese": {
"aliases": [],
"description": "",
"name": "manouri cheese",
"plural_name": "manouri cheese"
"plural_name": "Manouri se"
},
"mimolette cheese": {
"aliases": [],
@@ -7670,7 +7670,7 @@
"aliases": [],
"description": "",
"name": "Backpulver",
"plural_name": "baking powder"
"plural_name": "Backpulver"
},
"baking soda": {
"aliases": [],

View File

@@ -5,7 +5,7 @@
"aliases": [],
"description": "",
"name": "fokhagyma",
"plural_name": "garlic"
"plural_name": "fokhagyma"
},
"onion": {
"aliases": [],
@@ -59,13 +59,13 @@
"aliases": [],
"description": "",
"name": "zeller",
"plural_name": "celery"
"plural_name": "zeller"
},
"jalapeño": {
"aliases": [],
"description": "",
"name": "jalapeño",
"plural_name": "jalapeños"
"name": "jalapeno",
"plural_name": "jalapeno"
},
"avocado": {
"aliases": [],
@@ -95,13 +95,13 @@
"aliases": [],
"description": "",
"name": "spenót",
"plural_name": "spinach"
"plural_name": "spenót"
},
"sweet corn": {
"aliases": [],
"description": "",
"name": "csemegekukorica",
"plural_name": "sweet corn"
"plural_name": "csemegekukorica"
},
"chile pepper": {
"aliases": [
@@ -121,7 +121,7 @@
"aliases": [],
"description": "",
"name": "brokkoli",
"plural_name": "broccoli"
"plural_name": "brokkoli"
},
"heart of palm": {
"aliases": [],
@@ -132,8 +132,8 @@
"baby greens": {
"aliases": [],
"description": "",
"name": "baby greens",
"plural_name": "baby greens"
"name": "salátakeverék",
"plural_name": "salátakeverék"
},
"pumpkin": {
"aliases": [],
@@ -145,7 +145,7 @@
"aliases": [],
"description": "",
"name": "karfiol",
"plural_name": "cauliflower"
"plural_name": "karfiol"
},
"cabbage": {
"aliases": [],
@@ -156,20 +156,20 @@
"asparagus": {
"aliases": [],
"description": "",
"name": "asparagus",
"plural_name": "asparagus"
"name": "spárga",
"plural_name": "spárga"
},
"kale": {
"aliases": [],
"description": "",
"name": "kelkáposzta",
"plural_name": "kale"
"plural_name": "kelkáposzta"
},
"arugula": {
"aliases": [],
"description": "",
"name": "rukkola",
"plural_name": "arugula"
"plural_name": "rukkola"
},
"leek": {
"aliases": [],
@@ -187,7 +187,7 @@
"aliases": [],
"description": "",
"name": "saláta",
"plural_name": "lettuce"
"plural_name": "fejes saláta"
},
"butternut squash": {
"aliases": [],
@@ -198,8 +198,8 @@
"romaine lettuce": {
"aliases": [],
"description": "",
"name": "romaine lettuce",
"plural_name": "romaine lettuce"
"name": "római saláta",
"plural_name": "római saláta"
},
"beetroot": {
"aliases": [],
@@ -217,7 +217,7 @@
"aliases": [],
"description": "",
"name": "édeskömény",
"plural_name": "fennel"
"plural_name": "édeskömény"
},
"sun dried tomato": {
"aliases": [],
@@ -261,8 +261,8 @@
"mixed greens": {
"aliases": [],
"description": "",
"name": "mixed greens",
"plural_name": "mixed greens"
"name": "salátakeverék",
"plural_name": "salátakeverék"
},
"parsnip": {
"aliases": [],
@@ -279,8 +279,8 @@
"mixed vegetables": {
"aliases": [],
"description": "",
"name": "mixed vegetables",
"plural_name": "mixed vegetables"
"name": "zöldségkeverék",
"plural_name": "zöldségkeverék"
},
"poblano pepper": {
"aliases": [],
@@ -304,7 +304,7 @@
"aliases": [],
"description": "",
"name": "cayenne bors",
"plural_name": "cayenne pepper"
"plural_name": "cayenne bors"
},
"green tomato": {
"aliases": [],
@@ -321,8 +321,8 @@
"iceberg lettuce": {
"aliases": [],
"description": "",
"name": "iceberg lettuce",
"plural_name": "iceberg lettuce"
"name": "jégsaláta",
"plural_name": "jégsaláta"
},
"mashed potato": {
"aliases": [],
@@ -340,13 +340,13 @@
"aliases": [],
"description": "",
"name": "mángold",
"plural_name": "chard"
"plural_name": "mángold"
},
"pimiento": {
"aliases": [],
"description": "",
"name": "kápia paprika",
"plural_name": "pimientos"
"plural_name": "kápia paprika"
},
"spaghetti squash": {
"aliases": [],
@@ -358,7 +358,7 @@
"aliases": [],
"description": "",
"name": "fejes saláta",
"plural_name": "butter lettuce"
"plural_name": "kötözősaláta"
},
"hash brown": {
"aliases": [],
@@ -419,8 +419,8 @@
"corn on the cob": {
"aliases": [],
"description": "",
"name": "corn on the cob",
"plural_name": "corn on the cob"
"name": "csöves kukorica",
"plural_name": "csöves kukorica"
},
"radicchio": {
"aliases": [],
@@ -438,7 +438,7 @@
"aliases": [],
"description": "",
"name": "brokkolini",
"plural_name": "tenderstem broccoli"
"plural_name": "bébi brokkoli"
},
"plantain": {
"aliases": [],
@@ -450,7 +450,7 @@
"aliases": [],
"description": "",
"name": "saláta",
"plural_name": "leaf lettuce"
"plural_name": "saláta"
},
"pepperoncini": {
"aliases": [],
@@ -484,11 +484,11 @@
},
"maize": {
"aliases": [
"corn husk"
"kukoricacsuhé"
],
"description": "",
"name": "maize",
"plural_name": "maize"
"name": "csemegekukorica",
"plural_name": "csemegekukorica"
},
"collard greens": {
"aliases": [],
@@ -3140,13 +3140,13 @@
"aliases": [],
"description": "",
"name": "kókusztej",
"plural_name": "coconut milk"
"plural_name": "kókusztej"
},
"almond milk": {
"aliases": [],
"description": "",
"name": "mandulatej",
"plural_name": "almond milk"
"plural_name": "mandulatej"
},
"almond butter": {
"aliases": [],
@@ -3182,7 +3182,7 @@
"aliases": [],
"description": "",
"name": "szójatej",
"plural_name": "soy milk"
"plural_name": "szójatej"
},
"extra firm tofu": {
"aliases": [],

View File

@@ -2289,32 +2289,32 @@
"colby-jack cheese": {
"aliases": [],
"description": "",
"name": "colby-jack cheese",
"plural_name": "colby-jack cheese"
"name": "colby-jack kaas",
"plural_name": "colby-jack kaas"
},
"jarlsberg cheese": {
"aliases": [],
"description": "",
"name": "jarlsberg cheese",
"plural_name": "jarlsberg cheese"
"name": "jarlsberg kaas",
"plural_name": "jarlsberg kaas"
},
"taleggio cheese": {
"aliases": [],
"description": "",
"name": "taleggio cheese",
"plural_name": "taleggio cheese"
"name": "taleggio kaas",
"plural_name": "taleggio kaas"
},
"oaxaca cheese": {
"aliases": [],
"description": "",
"name": "oaxaca cheese",
"plural_name": "oaxaca cheese"
"name": "oaxaca kaas",
"plural_name": "oaxaca kaas"
},
"labneh cheese": {
"aliases": [],
"description": "",
"name": "labneh cheese",
"plural_name": "labneh cheese"
"name": "labneh kaas",
"plural_name": "labneh kaas"
},
"edam cheese": {
"aliases": [],
@@ -2325,80 +2325,80 @@
"creamy cheese wedge": {
"aliases": [],
"description": "",
"name": "creamy cheese wedge",
"plural_name": "creamy cheese wedges"
"name": "romig stukje kaas",
"plural_name": "romig stukjes kaas"
},
"cheese powder cheese": {
"aliases": [],
"description": "",
"name": "cheese powder cheese",
"plural_name": "cheese powder cheese"
"name": "kaaspoeder",
"plural_name": "kaaspoeder"
},
"fromage blanc cheese": {
"aliases": [],
"description": "",
"name": "fromage blanc cheese",
"plural_name": "fromage blanc cheese"
"name": "kwark",
"plural_name": "kwark"
},
"asadero cheese": {
"aliases": [],
"description": "",
"name": "asadero cheese",
"plural_name": "asadero cheese"
"name": "asadero kaas",
"plural_name": "asadero kaas"
},
"marble cheese": {
"aliases": [],
"description": "",
"name": "marble cheese",
"plural_name": "marble cheese"
"name": "marmeren kaas",
"plural_name": "marmeren kaas"
},
"leicester cheese": {
"aliases": [],
"description": "",
"name": "leicester cheese",
"plural_name": "leicester cheese"
"name": "leicester kaas",
"plural_name": "leicester kaas"
},
"kefalotyri cheese": {
"aliases": [],
"description": "",
"name": "kefalotyri cheese",
"plural_name": "kefalotyri cheese"
"name": "kefalotyri kaas",
"plural_name": "kefalotyri kaas"
},
"mizithra cheese": {
"aliases": [],
"description": "",
"name": "mizithra cheese",
"plural_name": "mizithra cheese"
"name": "mizithra kaas",
"plural_name": "mizithra kaas"
},
"lancashire cheese": {
"aliases": [],
"description": "",
"name": "lancashire cheese",
"plural_name": "lancashire cheese"
"name": "lancashire kaas",
"plural_name": "lancashire kaas"
},
"kasseri cheese": {
"aliases": [],
"description": "",
"name": "kasseri cheese",
"plural_name": "kasseri cheese"
"name": "kasseri kaas",
"plural_name": "kasseri kaas"
},
"babybel cheese": {
"aliases": [],
"description": "",
"name": "babybel cheese",
"plural_name": "babybel cheese"
"name": "babybel kaas",
"plural_name": "babybel kaas"
},
"panela cheese": {
"aliases": [],
"description": "",
"name": "panela cheese",
"plural_name": "panela cheese"
"name": "panela kaas",
"plural_name": "panela kaas"
},
"longhorn cheese": {
"aliases": [],
"description": "",
"name": "longhorn cheese",
"plural_name": "longhorn cheese"
"name": "longhorn kaas",
"plural_name": "longhorn kaas"
},
"seasoned feta cheese": {
"aliases": [],
@@ -2409,49 +2409,49 @@
"comté cheese": {
"aliases": [],
"description": "",
"name": "comté cheese",
"plural_name": "comté cheese"
"name": "comte kaas",
"plural_name": "comte kaas"
},
"graviera cheese": {
"aliases": [],
"description": "",
"name": "graviera cheese",
"plural_name": "graviera cheese"
"name": "graviera kaas",
"plural_name": "graviera kaas"
},
"wensleydale cheese": {
"aliases": [],
"description": "",
"name": "wensleydale cheese",
"plural_name": "wensleydale cheese"
"name": "wensleydale kaas",
"plural_name": "wensleydale kaas"
},
"scamorza cheese": {
"aliases": [],
"description": "",
"name": "scamorza cheese",
"plural_name": "scamorza cheese"
"name": "scamorza kaas",
"plural_name": "scamorza kaas"
},
"cambozola cheese": {
"aliases": [],
"description": "",
"name": "cambozola cheese",
"plural_name": "cambozola cheese"
"name": "cambozola kaas",
"plural_name": "cambozola kaas"
},
"cheshire cheese": {
"aliases": [],
"description": "",
"name": "cheshire cheese",
"plural_name": "cheshire cheese"
"name": "cheshire kaas",
"plural_name": "cheshire kaas"
},
"anthotyro cheese": {
"aliases": [],
"description": "",
"name": "anthotyro cheese",
"plural_name": "anthotyro cheese"
"name": "anthotyro kaas",
"plural_name": "anthotyro kaas"
},
"chenna cheese": {
"aliases": [],
"description": "",
"name": "chenna cheese",
"name": "chenna kaas",
"plural_name": "chenna cheese"
},
"hard goat cheese": {
@@ -3106,19 +3106,19 @@
"aliases": [],
"description": "",
"name": "vanille melk",
"plural_name": "vanilla milk"
"plural_name": "vanille melk"
},
"yoplait whip": {
"aliases": [],
"description": "",
"name": "yoplait whip",
"plural_name": "yoplait whips"
"name": "yoplait(yoghurt) crememouse",
"plural_name": "yoplait(yoghurt) crememouse"
},
"buffalo milk": {
"aliases": [],
"description": "",
"name": "buffelmelk",
"plural_name": "buffalo milk"
"plural_name": "buffelmelk"
},
"goat kefir": {
"aliases": [],
@@ -3129,8 +3129,8 @@
"lebneh": {
"aliases": [],
"description": "",
"name": "lebneh",
"plural_name": "lebnehs"
"name": "labneh(Lebanese yoghurt dip)",
"plural_name": "labneh(Lebanese yoghurt dip)"
}
}
},
@@ -3199,8 +3199,8 @@
"kala namak salt": {
"aliases": [],
"description": "",
"name": "kala namak salt",
"plural_name": "kala namak salt"
"name": "kala namak zout(Indiaas zwart zout)",
"plural_name": "kala namak zout(Indiaas zwart zout)"
},
"coconut butter": {
"aliases": [],
@@ -3464,7 +3464,7 @@
"aliases": [],
"description": "",
"name": "veganistische ranch",
"plural_name": "vegan ranches"
"plural_name": "veganistische ranch"
},
"vegan chicken": {
"aliases": [],
@@ -3541,8 +3541,8 @@
"almond creamer": {
"aliases": [],
"description": "",
"name": "almond creamer",
"plural_name": "almond creamers"
"name": "amandelroomkoffie",
"plural_name": "amandelroomkoffie"
},
"soy milk powder": {
"aliases": [],
@@ -3553,8 +3553,8 @@
"vegan cream cheese frosting": {
"aliases": [],
"description": "",
"name": "vegan cream cheese frosting",
"plural_name": "vegan cream cheese frostings"
"name": "veganistische roomkaas glazuur",
"plural_name": "veganistische roomkazen glazuur"
},
"coconut manna": {
"aliases": [],
@@ -3583,8 +3583,8 @@
"cashew cheese sauce": {
"aliases": [],
"description": "",
"name": "cashew cheese sauce",
"plural_name": "cashew cheese sauce"
"name": "cashewnoot kaassaus",
"plural_name": "cashewnoten kaassaus"
},
"coconut fat": {
"aliases": [],
@@ -3596,13 +3596,13 @@
"aliases": [],
"description": "",
"name": "lijnzaad melk",
"plural_name": "flax milk"
"plural_name": "lijnzaadmelk"
},
"hazelnut creamer": {
"aliases": [],
"description": "",
"name": "hazelnut creamer",
"plural_name": "hazelnut creamers"
"name": "hazelnoot roomkoffie",
"plural_name": "hazelnoot roomkoffie"
},
"quorn": {
"aliases": [],
@@ -3619,8 +3619,8 @@
"tofurky": {
"aliases": [],
"description": "",
"name": "tofurky",
"plural_name": "tofurkies"
"name": "kalkoenvervanger",
"plural_name": "kalkoenvervangers"
},
"vegan nutella": {
"aliases": [],
@@ -3637,14 +3637,14 @@
"cashew cream cheese": {
"aliases": [],
"description": "",
"name": "cashew cream cheese",
"plural_name": "cashew cream cheese"
"name": "cashewnoot roomkaas",
"plural_name": "cashewnoten roomkaas"
},
"cricket flour": {
"aliases": [],
"description": "",
"name": "cricket flour",
"plural_name": "cricket flour"
"name": "krekelmeel (Acheta-poeder)",
"plural_name": "krekelsmeel (Acheta-poeder)"
},
"macadamia butter": {
"aliases": [],
@@ -3655,8 +3655,8 @@
"okara": {
"aliases": [],
"description": "",
"name": "okara",
"plural_name": "okaras"
"name": "okara (sojapulp)",
"plural_name": "okaras (sojapulpen)"
},
"egg tofu": {
"aliases": [],
@@ -3674,7 +3674,7 @@
"aliases": [],
"description": "",
"name": "macadamia melk",
"plural_name": "macadamia milk"
"plural_name": "macadamia-notenmelk"
},
"vegan taco meat": {
"aliases": [],
@@ -3698,7 +3698,7 @@
"aliases": [],
"description": "",
"name": "bananenmelk",
"plural_name": "banana milk"
"plural_name": "bananen melk"
},
"soy quark": {
"aliases": [],
@@ -3722,7 +3722,7 @@
"aliases": [],
"description": "",
"name": "walnoten melk",
"plural_name": "walnut milk"
"plural_name": "walnoten melk"
},
"latik": {
"aliases": [],
@@ -3941,7 +3941,7 @@
"ground sausage": {
"aliases": [],
"description": "",
"name": "ground sausage",
"name": "gehaktworst",
"plural_name": "gehaktworsten"
},
"ground pork sausage": {
@@ -3959,8 +3959,8 @@
"bacon bit": {
"aliases": [],
"description": "",
"name": "bacon bit",
"plural_name": "bacon bits"
"name": "spekje (varkensvlees)",
"plural_name": "spekjes (varkensvlees)"
},
"pork roast": {
"aliases": [],
@@ -4043,8 +4043,8 @@
"ham steak": {
"aliases": [],
"description": "",
"name": "ham steak",
"plural_name": "ham steaks"
"name": "beenham plakje",
"plural_name": "beenham plakjes"
},
"venison": {
"aliases": [],
@@ -4193,14 +4193,14 @@
"hard salami": {
"aliases": [],
"description": "",
"name": "hard salami",
"plural_name": "hard salamis"
"name": "salami",
"plural_name": "salami"
},
"back bacon": {
"aliases": [],
"description": "",
"name": "back bacon",
"plural_name": "back bacons"
"name": "bakbacon",
"plural_name": "bakbacons"
},
"salt pork": {
"aliases": [],
@@ -4247,26 +4247,26 @@
"gammon joint": {
"aliases": [],
"description": "",
"name": "gammon joint",
"plural_name": "gammon joints"
"name": "achterham",
"plural_name": "achterhammen"
},
"boneless beef short rib": {
"aliases": [],
"description": "",
"name": "boneless beef short rib",
"plural_name": "boneless beef short ribs"
"name": "runderrib zonder bot",
"plural_name": "runderribben zonder bot"
},
"country ham": {
"aliases": [],
"description": "",
"name": "country ham",
"plural_name": "country hams"
"name": "beenham",
"plural_name": "beenhammen"
},
"boneless ham": {
"aliases": [],
"description": "",
"name": "boneless ham",
"plural_name": "boneless hams"
"name": "schouderham",
"plural_name": "schouderhammen"
},
"mortadella": {
"aliases": [],
@@ -4277,8 +4277,8 @@
"ground bison": {
"aliases": [],
"description": "",
"name": "ground bison",
"plural_name": "ground bisons"
"name": "bizon gehakt",
"plural_name": "bizon gehakt"
},
"fresh sausage": {
"aliases": [],
@@ -4337,8 +4337,8 @@
"steak tip": {
"aliases": [],
"description": "",
"name": "steak tip",
"plural_name": "steak tips"
"name": "biefstuk puntje",
"plural_name": "biefstuk puntjes"
},
"veal chop": {
"aliases": [],
@@ -4473,8 +4473,8 @@
"deli turkey": {
"aliases": [],
"description": "",
"name": "deli turkey",
"plural_name": "deli turkeys"
"name": "plakje kalkoen",
"plural_name": "plakjes kalkoen"
},
"smoked turkey": {
"aliases": [],
@@ -4491,8 +4491,8 @@
"chicken quarter": {
"aliases": [],
"description": "",
"name": "chicken quarter",
"plural_name": "chicken quarters"
"name": "kwart van een kip",
"plural_name": "kwarten van een kip"
},
"ground turkey sausage": {
"aliases": [],
@@ -4539,7 +4539,7 @@
"turkey pepperoni": {
"aliases": [],
"description": "",
"name": "turkey pepperoni",
"name": "pepperoni van kalkoen",
"plural_name": "turkey pepperonis"
},
"turkey ham": {
@@ -4702,19 +4702,19 @@
"aliases": [],
"description": "",
"name": "turkey liver",
"plural_name": "turkey livers"
"plural_name": "kalkoen levertjes"
},
"chicken neck": {
"aliases": [],
"description": "",
"name": "chicken neck",
"plural_name": "chicken necks"
"name": "kippennek",
"plural_name": "kippennekken"
},
"duck confit": {
"aliases": [],
"description": "",
"name": "",
"plural_name": "duck confits"
"plural_name": "geconfiteerde eend"
},
"roast duck": {
"aliases": [],
@@ -4737,20 +4737,20 @@
"guinea fowl": {
"aliases": [],
"description": "",
"name": "guinea fowl",
"plural_name": "guinea fowls"
"name": "parelhoen",
"plural_name": "parelhoenen"
},
"smoked turkey wing": {
"aliases": [],
"description": "",
"name": "smoked turkey wing",
"plural_name": "smoked turkey wings"
"name": "gerookte kalkoen wing",
"plural_name": "gerookte kalkoen wings"
},
"chicken curry-cut": {
"aliases": [],
"description": "",
"name": "chicken curry-cut",
"plural_name": "chicken curry-cuts"
"name": "gesneden kippendij (met of zonder bot)",
"plural_name": "gesneden kippendijen (met of zonder bot)"
},
"chicken schnitzel": {
"aliases": [],
@@ -4761,14 +4761,14 @@
"grouse": {
"aliases": [],
"description": "",
"name": "grouse",
"plural_name": "grouses"
"name": "korhoen",
"plural_name": "korhoenen"
},
"chicken roast": {
"aliases": [],
"description": "",
"name": "chicken roast",
"plural_name": "chicken roasts"
"name": "geroosterde kip",
"plural_name": "geroosterde kippen"
},
"goose liver": {
"aliases": [],
@@ -4780,37 +4780,37 @@
"aliases": [],
"description": "",
"name": "",
"plural_name": "turkey bones"
"plural_name": "kalkoen botten"
},
"turkey lunch meat": {
"aliases": [],
"description": "",
"name": "turkey lunch meat",
"plural_name": "turkey lunch meats"
"name": "kalkoen platkjes",
"plural_name": "kalkoen plakjes"
},
"turkey roast": {
"aliases": [],
"description": "",
"name": "turkey roast",
"plural_name": "turkey roasts"
"name": "geroosterde kalkoen",
"plural_name": "geroosterde kalkoenen"
},
"capon": {
"aliases": [],
"description": "",
"name": "capon",
"plural_name": "capons"
"name": "kapoen/haan",
"plural_name": "kapoenen/haanen"
},
"smoked turkey bacon": {
"aliases": [],
"description": "",
"name": "smoked turkey bacon",
"plural_name": "smoked turkey bacons"
"name": "gerookte bacon van kalkoen",
"plural_name": "gerookte bacon van kalkoen"
},
"chicken bacon": {
"aliases": [],
"description": "",
"name": "chicken bacon",
"plural_name": "chicken bacons"
"name": "bacon van kip",
"plural_name": "bacon van kippen"
},
"turkey rissole": {
"aliases": [],
@@ -5657,8 +5657,8 @@
"roasted seaweed": {
"aliases": [],
"description": "",
"name": "roasted seaweed",
"plural_name": "roasted seaweeds"
"name": "geroosterd zeewier",
"plural_name": "geroosterd zeewier"
},
"smoked oyster": {
"aliases": [],
@@ -5688,7 +5688,7 @@
"aliases": [],
"description": "",
"name": "salted shrimp",
"plural_name": "salted shrimps"
"plural_name": "gezouten garnalen"
},
"yaki-nori": {
"aliases": [],
@@ -5735,7 +5735,7 @@
"seaweed salad": {
"aliases": [],
"description": "",
"name": "seaweed salad",
"name": "zeewier salade",
"plural_name": "seaweed salads"
},
"dulse": {
@@ -5747,8 +5747,8 @@
"smoked mussel": {
"aliases": [],
"description": "",
"name": "smoked mussel",
"plural_name": "smoked mussels"
"name": "gerookte mossel",
"plural_name": "gerookte mosselen"
},
"sea snail": {
"aliases": [],
@@ -5777,8 +5777,8 @@
"korean seaweed": {
"aliases": [],
"description": "",
"name": "korean seaweed",
"plural_name": "korean seaweeds"
"name": "koreaans zeewier",
"plural_name": "koreaans zeewier"
},
"ogo seaweed": {
"aliases": [],
@@ -6003,8 +6003,8 @@
"cracked pepper": {
"aliases": [],
"description": "",
"name": "cracked pepper",
"plural_name": "cracked pepper"
"name": "grove zwarte peper",
"plural_name": "grove zwarte peper"
},
"peppercorn": {
"aliases": [],
@@ -6208,7 +6208,7 @@
"aliases": [],
"description": "",
"name": "mangopoeder",
"plural_name": "mango powder"
"plural_name": "mangopoeder"
},
"black mustard seed": {
"aliases": [],
@@ -6243,8 +6243,8 @@
"pink peppercorn": {
"aliases": [],
"description": "",
"name": "pink peppercorn",
"plural_name": "pink peppercorns"
"name": "roze peperkorrel",
"plural_name": "roze peperkorrels"
},
"hot paprika": {
"aliases": [],
@@ -6256,7 +6256,7 @@
"aliases": [],
"description": "",
"name": "citroentijm",
"plural_name": "lemon thyme"
"plural_name": "citroentijm"
},
"galangal": {
"aliases": [],
@@ -6274,7 +6274,7 @@
"aliases": [],
"description": "",
"name": "gedroogde koriander",
"plural_name": "dried cilantro"
"plural_name": "gedroogde koreander"
},
"lemon balm": {
"aliases": [],
@@ -6315,8 +6315,8 @@
"savory herb": {
"aliases": [],
"description": "",
"name": "savory herb",
"plural_name": "savory herbs"
"name": "bonekruid",
"plural_name": "bonekruid"
},
"pandan leaf": {
"aliases": [],
@@ -6339,8 +6339,8 @@
"saigon cinnamon": {
"aliases": [],
"description": "",
"name": "saigon cinnamon",
"plural_name": "saigon cinnamon"
"name": "Saigon kaneel",
"plural_name": "Saigon kaneel"
},
"lemongrass paste": {
"aliases": [],
@@ -6363,8 +6363,8 @@
"black cumin": {
"aliases": [],
"description": "",
"name": "black cumin",
"plural_name": "black cumins"
"name": "zwarte komijn",
"plural_name": "zwarte komijn"
},
"anardana": {
"aliases": [],
@@ -6375,8 +6375,8 @@
"vietnamese mint": {
"aliases": [],
"description": "",
"name": "vietnamese mint",
"plural_name": "vietnamese mints"
"name": "Vietnamese munt",
"plural_name": "Vietnamese munt"
},
"dried orange peel": {
"aliases": [],
@@ -6399,8 +6399,8 @@
"raw stevia": {
"aliases": [],
"description": "",
"name": "raw stevia",
"plural_name": "raw stevia"
"name": "rauwe stevia",
"plural_name": "rauwe stevia"
},
"achiote paste": {
"aliases": [],
@@ -6411,8 +6411,8 @@
"summer savory": {
"aliases": [],
"description": "",
"name": "summer savory",
"plural_name": "summer savories"
"name": "zomerbonekruid",
"plural_name": "zomerbonekruid"
},
"fennel pollen": {
"aliases": [],
@@ -6428,7 +6428,7 @@
"aliases": [],
"description": "",
"name": "suiker",
"plural_name": "sugar"
"plural_name": "suiker"
},
"brown sugar": {
"aliases": [
@@ -6441,11 +6441,11 @@
"confectioners sugar": {
"aliases": [
"poedersuiker",
"icing sugar"
"poedersuiker"
],
"description": "",
"name": "poedersuiker",
"plural_name": "confectioners sugar"
"plural_name": "fondant suiker"
},
"bar sugar": {
"aliases": [
@@ -6561,7 +6561,7 @@
"aliases": [],
"description": "",
"name": "vloeibare stevia",
"plural_name": "liquid stevia"
"plural_name": "vloeibare stevia"
},
"grenadine": {
"aliases": [],
@@ -6573,7 +6573,7 @@
"aliases": [],
"description": "",
"name": "grove suiker",
"plural_name": "coarse sugar"
"plural_name": "grove suiker"
},
"salted caramel syrup": {
"aliases": [],
@@ -6584,14 +6584,14 @@
"sanding sugar": {
"aliases": [],
"description": "",
"name": "sanding sugar",
"plural_name": "sanding sugar"
"name": "sanding suiker",
"plural_name": "sanding suiker"
},
"dark corn syrup": {
"aliases": [],
"description": "",
"name": "dark corn syrup",
"plural_name": "dark corn syrup"
"name": "donkere mäissiroop",
"plural_name": "donkere mäissiroop"
},
"sucralose": {
"aliases": [],
@@ -6608,8 +6608,8 @@
"maple sugar": {
"aliases": [],
"description": "",
"name": "maple sugar",
"plural_name": "maple sugar"
"name": "esdoorn suiker",
"plural_name": "esdoorn suiker"
},
"blackstrap molass": {
"aliases": [],
@@ -6626,14 +6626,14 @@
"rock sugar": {
"aliases": [],
"description": "",
"name": "rock sugar",
"plural_name": "rock sugar"
"name": "steen suiker",
"plural_name": "steen suiker"
},
"confectioners' sweetener": {
"aliases": [],
"description": "",
"name": "confectioners' sweetener",
"plural_name": "confectioners' sweeteners"
"name": "confectie zoetstof",
"plural_name": "confectie zoetstof"
},
"xylitol": {
"aliases": [],
@@ -6716,8 +6716,8 @@
"date paste": {
"aliases": [],
"description": "",
"name": "date paste",
"plural_name": "date paste"
"name": "dadelpasta",
"plural_name": "dadelpasta"
},
"coconut syrup": {
"aliases": [],
@@ -6740,8 +6740,8 @@
"rice syrup": {
"aliases": [],
"description": "",
"name": "rice syrup",
"plural_name": "rice syrup"
"name": "rijstsiroop",
"plural_name": "rijstsiroop"
},
"manuka honey": {
"aliases": [],
@@ -6914,8 +6914,8 @@
"inulin": {
"aliases": [],
"description": "",
"name": "inulin",
"plural_name": "inulins"
"name": "inuline",
"plural_name": "inuline"
},
"sweet'n low": {
"aliases": [],
@@ -6956,8 +6956,8 @@
"date sugar": {
"aliases": [],
"description": "",
"name": "date sugar",
"plural_name": "date sugar"
"name": "dadelsuiker",
"plural_name": "dadelsuiker"
},
"mastic gum": {
"aliases": [],
@@ -8630,14 +8630,14 @@
"granola cereal": {
"aliases": [],
"description": "",
"name": "granola cereal",
"plural_name": "granola cereals"
"name": "granola",
"plural_name": "granola"
},
"bulgur": {
"aliases": [],
"description": "",
"name": "bulgur",
"plural_name": "bulgurs"
"plural_name": "bulgur"
},
"pearl barley": {
"aliases": [],
@@ -8691,7 +8691,7 @@
"aliases": [],
"description": "",
"name": "sushirijst",
"plural_name": "sushi rices"
"plural_name": "sushirijst"
},
"glutinous rice": {
"aliases": [],
@@ -8702,8 +8702,8 @@
"instant rice": {
"aliases": [],
"description": "",
"name": "instant rice",
"plural_name": "instant rices"
"name": "instantrijst",
"plural_name": "instantrijst"
},
"hominy": {
"aliases": [],
@@ -8816,8 +8816,8 @@
"paella rice": {
"aliases": [],
"description": "",
"name": "paella rice",
"plural_name": "paella rices"
"name": "paellarijst",
"plural_name": "paellarijst"
},
"sorghum": {
"aliases": [],
@@ -8834,8 +8834,8 @@
"mexican rice": {
"aliases": [],
"description": "",
"name": "mexican rice",
"plural_name": "mexican rices"
"name": "mexicaanse rijst",
"plural_name": "mexicaanse rijst"
},
"idli rice": {
"aliases": [],

View File

@@ -487,8 +487,8 @@
"łuska kukurydzy"
],
"description": "",
"name": "maize",
"plural_name": "maize"
"name": "kukurydza",
"plural_name": "kukurydza"
},
"collard greens": {
"aliases": [],
@@ -554,7 +554,7 @@
"aliases": [],
"description": "",
"name": "sałata masłowa",
"plural_name": "boston lettuce"
"plural_name": "sałata masłowa"
},
"kohlrabi": {
"aliases": [],
@@ -598,7 +598,7 @@
"aliases": [],
"description": "",
"name": "surówka z brokułów",
"plural_name": "broccoli slaw"
"plural_name": "surówka z brokułów"
},
"arbol chile pepper": {
"aliases": [],
@@ -974,7 +974,7 @@
"aliases": [],
"description": "",
"name": "pomelo",
"plural_name": "pomelos"
"plural_name": "pomelo"
},
"chestnut purée": {
"aliases": [],

View File

@@ -5,7 +5,7 @@
"aliases": [],
"description": "",
"name": "alho",
"plural_name": "garlic"
"plural_name": "alho"
},
"onion": {
"aliases": [],
@@ -59,7 +59,7 @@
"aliases": [],
"description": "",
"name": "salsão",
"plural_name": "celery"
"plural_name": "aipo"
},
"jalapeño": {
"aliases": [],

View File

@@ -101,7 +101,7 @@
"aliases": [],
"description": "",
"name": "milho doce",
"plural_name": "sweet corn"
"plural_name": "milho doce"
},
"chile pepper": {
"aliases": [
@@ -280,7 +280,7 @@
"aliases": [],
"description": "",
"name": "mixed vegetables",
"plural_name": "mixed vegetables"
"plural_name": "mistura de vegetais"
},
"poblano pepper": {
"aliases": [],
@@ -1671,8 +1671,8 @@
"chokeberry": {
"aliases": [],
"description": "",
"name": "chokeberry",
"plural_name": "chokeberries"
"name": "arónia",
"plural_name": "arónias"
},
"loganberry": {
"aliases": [],
@@ -1717,7 +1717,7 @@
"walnut": {
"aliases": [],
"description": "",
"name": "walnut",
"name": "noz",
"plural_name": "walnuts"
},
"pecan": {
@@ -1783,8 +1783,8 @@
"pumpkin seed": {
"aliases": [],
"description": "",
"name": "pumpkin seed",
"plural_name": "pumpkin seeds"
"name": "semente de abóbora",
"plural_name": "sementes de abóbora"
},
"hazelnut": {
"aliases": [],
@@ -1801,8 +1801,8 @@
"sunflower seed": {
"aliases": [],
"description": "",
"name": "sunflower seed",
"plural_name": "sunflower seeds"
"name": "semente de girassol",
"plural_name": "sementes de girassol"
},
"macadamia": {
"aliases": [],
@@ -1813,8 +1813,8 @@
"roasted peanut": {
"aliases": [],
"description": "",
"name": "roasted peanut",
"plural_name": "roasted peanuts"
"name": "amendoim torrado",
"plural_name": "amendoins torrados"
},
"chopped nut": {
"aliases": [],
@@ -2003,22 +2003,22 @@
"parmesan cheese": {
"aliases": [],
"description": "",
"name": "parmesan cheese",
"name": "queijo parmesão",
"plural_name": "parmesan cheese"
},
"cheddar cheese": {
"aliases": [
"cheddar cheese"
"queijo cheddar"
],
"description": "",
"name": "cheddar cheese",
"plural_name": "cheddar cheese"
"name": "queijo cheddar",
"plural_name": "queijos cheddar"
},
"cream cheese": {
"aliases": [],
"description": "",
"name": "cream cheese",
"plural_name": "cream cheese"
"name": "queijo creme",
"plural_name": "queijo creme"
},
"sharp cheddar cheese": {
"aliases": [
@@ -2031,26 +2031,26 @@
"cheese": {
"aliases": [],
"description": "",
"name": "cheese",
"plural_name": "cheese"
"name": "queijo",
"plural_name": "queijos"
},
"mozzarella cheese": {
"aliases": [],
"description": "",
"name": "mozzarella cheese",
"plural_name": "mozzarella cheese"
"name": "queijo mozzarella",
"plural_name": "queijos mozzarella"
},
"feta cheese": {
"aliases": [],
"description": "",
"name": "feta cheese",
"plural_name": "feta cheese"
"name": "queijo feta",
"plural_name": "queijos feta"
},
"ricotta cheese": {
"aliases": [],
"description": "",
"name": "ricotta cheese",
"plural_name": "ricotta cheese"
"name": "queijo ricotta",
"plural_name": "queijos ricotta"
},
"cheddar-jack cheese": {
"aliases": [],
@@ -2139,8 +2139,8 @@
"brie cheese": {
"aliases": [],
"description": "",
"name": "brie cheese",
"plural_name": "brie cheese"
"name": "queijo brie",
"plural_name": "queijos brie"
},
"paneer cheese": {
"aliases": [],
@@ -2617,26 +2617,26 @@
"butter": {
"aliases": [],
"description": "",
"name": "butter",
"plural_name": "butter"
"name": "manteiga",
"plural_name": "manteigas"
},
"egg": {
"aliases": [],
"description": "",
"name": "egg",
"plural_name": "eggs"
"name": "ovo",
"plural_name": "ovos"
},
"milk": {
"aliases": [],
"description": "",
"name": "milk",
"plural_name": "milk"
"name": "leite",
"plural_name": "leites"
},
"heavy cream": {
"aliases": [],
"description": "",
"name": "heavy cream",
"plural_name": "heavy cream"
"name": "nata",
"plural_name": "natas"
},
"sour cream": {
"aliases": [],
@@ -2691,8 +2691,8 @@
"condensed milk": {
"aliases": [],
"description": "",
"name": "condensed milk",
"plural_name": "condensed milk"
"name": "leite condensado",
"plural_name": "leites condensados"
},
"half and half": {
"aliases": [],
@@ -2703,20 +2703,20 @@
"sweetened condensed milk": {
"aliases": [],
"description": "",
"name": "sweetened condensed milk",
"plural_name": "sweetened condensed milk"
"name": "leite condensado açucarado",
"plural_name": "leites condensados açucarados"
},
"ice cream": {
"aliases": [],
"description": "",
"name": "ice cream",
"plural_name": "ice cream"
"name": "gelado",
"plural_name": "gelados"
},
"margarine": {
"aliases": [],
"description": "",
"name": "margarine",
"plural_name": "margarines"
"name": "margarina",
"plural_name": "margarinas"
},
"creme fraiche": {
"aliases": [],
@@ -2757,8 +2757,8 @@
"dulce de leche": {
"aliases": [],
"description": "",
"name": "dulce de leche",
"plural_name": "dulce de leche"
"name": "doce de leite",
"plural_name": "doces de leite"
},
"custard": {
"aliases": [],
@@ -2787,8 +2787,8 @@
"chocolate milk": {
"aliases": [],
"description": "",
"name": "chocolate milk",
"plural_name": "chocolate milk"
"name": "leite achocolatado",
"plural_name": "leites achocolatados"
},
"liquid egg substitute": {
"aliases": [],
@@ -3325,8 +3325,8 @@
"vegan sausage": {
"aliases": [],
"description": "",
"name": "vegan sausage",
"plural_name": "vegan sausages"
"name": "salsicha vegan",
"plural_name": "salsichas vegan"
},
"coconut whipped cream": {
"aliases": [],
@@ -3373,8 +3373,8 @@
"nut milk": {
"aliases": [],
"description": "",
"name": "nut milk",
"plural_name": "nut milk"
"name": "leite de noz",
"plural_name": "leite de nozes"
},
"non-dairy cream": {
"aliases": [],
@@ -3744,37 +3744,37 @@
"aliases": [],
"description": "",
"name": "bacon",
"plural_name": "bacons"
"plural_name": "bacon"
},
"chopped bacon": {
"aliases": [],
"description": "",
"name": "chopped bacon",
"plural_name": "chopped bacons"
"name": "bacon",
"plural_name": "bacon"
},
"ground beef": {
"aliases": [],
"description": "",
"name": "ground beef",
"plural_name": "ground beefs"
"name": "carne picada",
"plural_name": "carne picada"
},
"beef steak": {
"aliases": [],
"description": "",
"name": "beef steak",
"plural_name": "beef steaks"
"name": "bife de vaca",
"plural_name": "bifes de vaca"
},
"ham": {
"aliases": [],
"description": "",
"name": "ham",
"plural_name": "hams"
"name": "fiambre",
"plural_name": "fiambres"
},
"pork chop": {
"aliases": [],
"description": "",
"name": "pork chop",
"plural_name": "pork chops"
"name": "costoleta",
"plural_name": "costoletas"
},
"sweet italian sausage": {
"aliases": [],
@@ -3827,8 +3827,8 @@
"chorizo": {
"aliases": [],
"description": "",
"name": "chorizo",
"plural_name": "chorizoes"
"name": "chouriço",
"plural_name": "chouriços"
},
"pancetta": {
"aliases": [],
@@ -3899,8 +3899,8 @@
"deli ham": {
"aliases": [],
"description": "",
"name": "deli ham",
"plural_name": "deli hams"
"name": "fiambre",
"plural_name": "fiambres"
},
"leg of lamb": {
"aliases": [],
@@ -10638,8 +10638,8 @@
"olive oil": {
"aliases": [],
"description": "",
"name": "olive oil",
"plural_name": "olive oil"
"name": "azeite",
"plural_name": "azeite"
},
"vegetable oil": {
"aliases": [],
@@ -10650,8 +10650,8 @@
"extra virgin olive oil": {
"aliases": [],
"description": "",
"name": "extra virgin olive oil",
"plural_name": "extra virgin olive oil"
"name": "azeite extra virgem",
"plural_name": "azeite extra virgem"
},
"canola oil": {
"aliases": [],
@@ -10916,8 +10916,8 @@
"herb-infused olive oil": {
"aliases": [],
"description": "",
"name": "herb-infused olive oil",
"plural_name": "herb-infused olive oil"
"name": "azeite de ervas",
"plural_name": "azeite de ervas"
},
"roasted peanut oil": {
"aliases": [],

View File

@@ -9,7 +9,7 @@
"name": "colher de sopa",
"plural_name": "colheres de sopa",
"description": "",
"abbreviation": "csp"
"abbreviation": "c. sopa"
},
"cup": {
"name": "chávena",
@@ -25,7 +25,7 @@
},
"pint": {
"name": "pint",
"plural_name": "pintas",
"plural_name": "pints",
"description": "",
"abbreviation": "pt"
},
@@ -139,8 +139,8 @@
"abbreviation": ""
},
"sprig": {
"name": "sprig",
"plural_name": "sprigs",
"name": "ramo",
"plural_name": "ramos",
"description": "",
"abbreviation": ""
}

View File

@@ -17,7 +17,7 @@ dependencies = [
"apprise==1.9.7",
"bcrypt==5.0.0",
"extruct==0.18.0",
"fastapi==0.129.1",
"fastapi==0.131.0",
"httpx==0.28.1",
"lxml==6.0.2",
"orjson==3.11.7",
@@ -42,7 +42,7 @@ dependencies = [
"pydantic-settings==2.13.1",
"pillow-heif==1.2.1",
"pyjwt==2.11.0",
"openai==2.21.0",
"openai==2.23.0",
"typing-extensions==4.15.0",
"itsdangerous==2.2.0",
"ingredient-parser-nlp==2.5.0",

View File

@@ -647,6 +647,47 @@ def test_order_by_last_made(unique_user: TestUser, h2_user: TestUser):
assert [item.id for item in h2_query.items] == [recipe_2.id, recipe_1.id]
def test_coalesce_last_made(unique_user: TestUser):
dt = datetime.now(UTC)
made_recipe, unmade_recipe = (
unique_user.repos.recipes.create(
Recipe(user_id=unique_user.user_id, group_id=unique_user.group_id, name=random_string())
)
for _ in range(2)
)
unique_user.repos.household_recipes.create(
HouseholdRecipeCreate(recipe_id=made_recipe.id, household_id=unique_user.household_id, last_made=dt)
)
repos = get_repositories(
unique_user.repos.session, group_id=unique_user.group_id, household_id=None
).recipes.by_user(unique_user.user_id)
r = repos.page_all(
PaginationQuery(
page=1,
per_page=-1,
order_by="last_made",
order_direction=OrderDirection.asc,
query_filter=f"id IN [{made_recipe.id}, {unmade_recipe.id}] AND lastMade <= {dt.isoformat()}",
)
)
assert len(r.items) == 2
assert [item.id for item in r.items] == [unmade_recipe.id, made_recipe.id]
r = repos.page_all(
PaginationQuery(
page=1,
per_page=-1,
order_by="last_made",
order_direction=OrderDirection.desc,
query_filter=f"id IN [{made_recipe.id}, {unmade_recipe.id}]",
)
)
assert len(r.items) == 2
assert [item.id for item in r.items] == [made_recipe.id, unmade_recipe.id]
def test_order_by_rating(user_tuple: tuple[TestUser, TestUser]):
user_1, user_2 = user_tuple
database = user_1.repos

16
uv.lock generated
View File

@@ -399,7 +399,7 @@ wheels = [
[[package]]
name = "fastapi"
version = "0.129.1"
version = "0.131.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "annotated-doc" },
@@ -408,9 +408,9 @@ dependencies = [
{ name = "typing-extensions" },
{ name = "typing-inspection" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f6/37/4aa7f6ce92745458b6ce0acd706dde2ac23a3bf341266b5311c904109f67/fastapi-0.129.1.tar.gz", hash = "sha256:6ccf0eca9644e0d6280115b4fc8281bf55ec5878d4d95572f7b2034ab15708ba", size = 369852, upload-time = "2026-02-21T13:10:03.335Z" }
sdist = { url = "https://files.pythonhosted.org/packages/91/32/158cbf685b7d5a26f87131069da286bf10fc9fbf7fc968d169d48a45d689/fastapi-0.131.0.tar.gz", hash = "sha256:6531155e52bee2899a932c746c9a8250f210e3c3303a5f7b9f8a808bfe0548ff", size = 369612, upload-time = "2026-02-22T16:38:11.252Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/01/f9/f15d92bd6035d4f83be8b82dc527a3e7abc87648fda62cf8d1df344410a7/fastapi-0.129.1-py3-none-any.whl", hash = "sha256:022462403bc385b791df418d8f088eb0e8f1fe7cb8f625d682f5e9da6157cc83", size = 103226, upload-time = "2026-02-21T13:10:05.058Z" },
{ url = "https://files.pythonhosted.org/packages/ff/94/b58ec24c321acc2ad1327f69b033cadc005e0f26df9a73828c9e9c7db7ce/fastapi-0.131.0-py3-none-any.whl", hash = "sha256:ed0e53decccf4459de78837ce1b867cd04fa9ce4579497b842579755d20b405a", size = 103854, upload-time = "2026-02-22T16:38:09.814Z" },
]
[[package]]
@@ -910,7 +910,7 @@ requires-dist = [
{ name = "bcrypt", specifier = "==5.0.0" },
{ name = "beautifulsoup4", specifier = "==4.14.3" },
{ name = "extruct", specifier = "==0.18.0" },
{ name = "fastapi", specifier = "==0.129.1" },
{ name = "fastapi", specifier = "==0.131.0" },
{ name = "html2text", specifier = "==2025.4.15" },
{ name = "httpx", specifier = "==0.28.1" },
{ name = "ingredient-parser-nlp", specifier = "==2.5.0" },
@@ -918,7 +918,7 @@ requires-dist = [
{ name = "itsdangerous", specifier = "==2.2.0" },
{ name = "jinja2", specifier = "==3.1.6" },
{ name = "lxml", specifier = "==6.0.2" },
{ name = "openai", specifier = "==2.21.0" },
{ name = "openai", specifier = "==2.23.0" },
{ name = "orjson", specifier = "==3.11.7" },
{ name = "paho-mqtt", specifier = "==1.6.1" },
{ name = "pillow", specifier = "==12.1.1" },
@@ -1143,7 +1143,7 @@ wheels = [
[[package]]
name = "openai"
version = "2.21.0"
version = "2.23.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
@@ -1155,9 +1155,9 @@ dependencies = [
{ name = "tqdm" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/92/e5/3d197a0947a166649f566706d7a4c8f7fe38f1fa7b24c9bcffe4c7591d44/openai-2.21.0.tar.gz", hash = "sha256:81b48ce4b8bbb2cc3af02047ceb19561f7b1dc0d4e52d1de7f02abfd15aa59b7", size = 644374, upload-time = "2026-02-14T00:12:01.577Z" }
sdist = { url = "https://files.pythonhosted.org/packages/61/4b/dc1d84b8237205ebe48a1b1c9c3a8e1ab9fd08b30811b6d787196df58fd6/openai-2.23.0.tar.gz", hash = "sha256:7d24cc8087d5e8eed58e98aaa823391d39d12f9a9a2755770f67c7bb2004d94c", size = 657323, upload-time = "2026-02-24T03:20:20.323Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cc/56/0a89092a453bb2c676d66abee44f863e742b2110d4dbb1dbcca3f7e5fc33/openai-2.21.0-py3-none-any.whl", hash = "sha256:0bc1c775e5b1536c294eded39ee08f8407656537ccc71b1004104fe1602e267c", size = 1103065, upload-time = "2026-02-14T00:11:59.603Z" },
{ url = "https://files.pythonhosted.org/packages/1d/5f/bcdf0fb510c24f021e485f920677da363cd59d6e0310171bf2cad6e052b5/openai-2.23.0-py3-none-any.whl", hash = "sha256:1041d40bebf845053fda1946104f8bf9c3e2df957a41c3878c55c72c352630e9", size = 1118971, upload-time = "2026-02-24T03:20:18.708Z" },
]
[[package]]