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/ exclude: ^tests/data/
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: v0.15.1 rev: v0.15.2
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format

View File

@@ -79,8 +79,8 @@ This filter will find all foods that are not named "carrot": <br>
##### Keyword Filters ##### 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`). 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> Here is an example of a filter that returns all shopping list items without a food: <br>
`lastMade IS NOT NULL` `foodId IS NULL`
This filter will find all recipes that don't start with the word "Test": <br> This filter will find all recipes that don't start with the word "Test": <br>
`name NOT LIKE "Test%"` `name NOT LIKE "Test%"`

View File

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

View File

@@ -212,8 +212,8 @@
"upload-file": "Enviar arquivo", "upload-file": "Enviar arquivo",
"created-on-date": "Criado em {0}", "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.", "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": "Descartar alterações",
"discard-changes-description": "You have unsaved changes. Are you sure you want to discard them?", "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.", "clipboard-copy-failure": "Falha ao copiar para a área de transferência.",
"confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?", "confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?",
"organizers": "Organizadores", "organizers": "Organizadores",
@@ -644,7 +644,7 @@
"scrape-recipe-website-being-blocked": "Site sendo bloqueado?", "scrape-recipe-website-being-blocked": "Site sendo bloqueado?",
"scrape-recipe-try-importing-raw-html-instead": "Tente importar o HTML ao invés disso.", "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-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", "stay-in-edit-mode": "Permanecer no modo de edição",
"parse-recipe-ingredients-after-import": "Interpretar os ingredientes da receita após importar", "parse-recipe-ingredients-after-import": "Interpretar os ingredientes da receita após importar",
"import-from-zip": "Importar do .zip", "import-from-zip": "Importar do .zip",
@@ -1423,7 +1423,7 @@
"is-greater-than-or-equal-to": "é maior ou igual a", "is-greater-than-or-equal-to": "é maior ou igual a",
"is-less-than": "é menor que", "is-less-than": "é menor que",
"is-less-than-or-equal-to": "é menor ou igual a", "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" "is-newer-than": "is newer than"
}, },
"relational-keywords": { "relational-keywords": {

View File

@@ -1,5 +1,6 @@
import re as re import re as re
from collections.abc import Iterable, Sequence from collections.abc import Iterable, Sequence
from datetime import UTC, datetime
from random import randint from random import randint
from typing import Self, cast from typing import Self, cast
from uuid import UUID from uuid import UUID
@@ -51,10 +52,13 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]):
return self return self
def _get_last_made_col_alias(self) -> sa.ColumnElement | None: 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() 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) sa.select(HouseholdToRecipe.last_made)
.where( .where(
HouseholdToRecipe.recipe_id == self.model.id, HouseholdToRecipe.recipe_id == self.model.id,
@@ -63,6 +67,7 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]):
.correlate(self.model) .correlate(self.model)
.scalar_subquery() .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: 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""" """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": [], "aliases": [],
"description": "", "description": "",
"name": "Backstein Käse", "name": "Backstein Käse",
"plural_name": "brick cheese" "plural_name": "Brick-Käse"
}, },
"quick-melt cheese": { "quick-melt cheese": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "quick-melt cheese", "name": "schnellschmelzender Käse",
"plural_name": "quick-melt cheese" "plural_name": "schnellschmelzender Käse"
}, },
"farmer's cheese": { "farmer's cheese": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "farmer's cheese", "name": "Bauernkäse",
"plural_name": "farmer's cheese" "plural_name": "Bauernkäse"
}, },
"manouri cheese": { "manouri cheese": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "manouri cheese", "name": "manouri cheese",
"plural_name": "manouri cheese" "plural_name": "Manouri se"
}, },
"mimolette cheese": { "mimolette cheese": {
"aliases": [], "aliases": [],
@@ -7670,7 +7670,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Backpulver", "name": "Backpulver",
"plural_name": "baking powder" "plural_name": "Backpulver"
}, },
"baking soda": { "baking soda": {
"aliases": [], "aliases": [],

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,7 +17,7 @@ dependencies = [
"apprise==1.9.7", "apprise==1.9.7",
"bcrypt==5.0.0", "bcrypt==5.0.0",
"extruct==0.18.0", "extruct==0.18.0",
"fastapi==0.129.1", "fastapi==0.131.0",
"httpx==0.28.1", "httpx==0.28.1",
"lxml==6.0.2", "lxml==6.0.2",
"orjson==3.11.7", "orjson==3.11.7",
@@ -42,7 +42,7 @@ dependencies = [
"pydantic-settings==2.13.1", "pydantic-settings==2.13.1",
"pillow-heif==1.2.1", "pillow-heif==1.2.1",
"pyjwt==2.11.0", "pyjwt==2.11.0",
"openai==2.21.0", "openai==2.23.0",
"typing-extensions==4.15.0", "typing-extensions==4.15.0",
"itsdangerous==2.2.0", "itsdangerous==2.2.0",
"ingredient-parser-nlp==2.5.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] 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]): def test_order_by_rating(user_tuple: tuple[TestUser, TestUser]):
user_1, user_2 = user_tuple user_1, user_2 = user_tuple
database = user_1.repos database = user_1.repos

16
uv.lock generated
View File

@@ -399,7 +399,7 @@ wheels = [
[[package]] [[package]]
name = "fastapi" name = "fastapi"
version = "0.129.1" version = "0.131.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "annotated-doc" }, { name = "annotated-doc" },
@@ -408,9 +408,9 @@ dependencies = [
{ name = "typing-extensions" }, { name = "typing-extensions" },
{ name = "typing-inspection" }, { 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 = [ 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]] [[package]]
@@ -910,7 +910,7 @@ requires-dist = [
{ name = "bcrypt", specifier = "==5.0.0" }, { name = "bcrypt", specifier = "==5.0.0" },
{ name = "beautifulsoup4", specifier = "==4.14.3" }, { name = "beautifulsoup4", specifier = "==4.14.3" },
{ name = "extruct", specifier = "==0.18.0" }, { 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 = "html2text", specifier = "==2025.4.15" },
{ name = "httpx", specifier = "==0.28.1" }, { name = "httpx", specifier = "==0.28.1" },
{ name = "ingredient-parser-nlp", specifier = "==2.5.0" }, { name = "ingredient-parser-nlp", specifier = "==2.5.0" },
@@ -918,7 +918,7 @@ requires-dist = [
{ name = "itsdangerous", specifier = "==2.2.0" }, { name = "itsdangerous", specifier = "==2.2.0" },
{ name = "jinja2", specifier = "==3.1.6" }, { name = "jinja2", specifier = "==3.1.6" },
{ name = "lxml", specifier = "==6.0.2" }, { 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 = "orjson", specifier = "==3.11.7" },
{ name = "paho-mqtt", specifier = "==1.6.1" }, { name = "paho-mqtt", specifier = "==1.6.1" },
{ name = "pillow", specifier = "==12.1.1" }, { name = "pillow", specifier = "==12.1.1" },
@@ -1143,7 +1143,7 @@ wheels = [
[[package]] [[package]]
name = "openai" name = "openai"
version = "2.21.0" version = "2.23.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "anyio" }, { name = "anyio" },
@@ -1155,9 +1155,9 @@ dependencies = [
{ name = "tqdm" }, { name = "tqdm" },
{ name = "typing-extensions" }, { 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 = [ 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]] [[package]]