allow using a single string as an ingredient instead of a dict

This commit is contained in:
Emi Vasilek 2023-11-28 12:28:52 +00:00
parent 072aa03a53
commit 883f0756f9
5 changed files with 59 additions and 17 deletions

View file

@ -139,6 +139,7 @@ class Builder:
def collect_unitnames(rec: parsing.Recipe) -> List[str]: def collect_unitnames(rec: parsing.Recipe) -> List[str]:
results: List[str] = [] results: List[str] = []
for ing in rec.ingredients: for ing in rec.ingredients:
if ing.unit is not None:
results.append(ing.unit.name) results.append(ing.unit.name)
return results return results

View file

@ -1,5 +1,6 @@
from abc import abstractmethod from abc import abstractmethod
import collections import collections
import re
from typing import Any, Dict, List, Optional, Self from typing import Any, Dict, List, Optional, Self
import comfyrecipes.settings as settings import comfyrecipes.settings as settings
@ -178,8 +179,8 @@ class IngredientInstance(Element):
self, self,
ctx: Context, ctx: Context,
name: str, name: str,
amount: float, amount: Optional[float],
unit: Unit, unit: Optional[Unit],
alternatives: List["IngredientInstance"], alternatives: List["IngredientInstance"],
note: str, note: str,
price: Optional["PriceDB"], price: Optional["PriceDB"],
@ -193,7 +194,37 @@ class IngredientInstance(Element):
self.price = price self.price = price
@classmethod @classmethod
def from_dict(cls, ctx: Context, dct: Dict[str, Any]) -> Self: def from_dict(cls, ctx: Context, dct: str | Dict[str, Any]) -> Self:
if isinstance(dct, str):
string = dct.strip()
p = re.compile(r"^(?:([0-9\.]+) ([a-zA-Z]+) )?([\w ]+)(?: \((.*)\))?$")
match = p.match(string)
if match is None:
raise RuntimeError(
"ingredient {string} regex not matched, it should be in the format [amount(num) unit(string, one word)] name(string, any number of words) [(note(string))]"
)
amount = float(match.group(1))
unitstr = match.group(2)
unit = ctx.default_unit
if unit is not None:
unitx = ctx.units.get(unitstr)
if unitx is None:
ctx.issues.error(issues.ISSUE_UNKNOWN_UNIT, "unknown unit {unitstr}")
else:
unit = unitx
name = match.group(3)
note = match.group(4)
if note is None:
note = ""
return cls(
ctx=ctx,
name=dct,
amount=amount,
unit=unit,
alternatives=[],
note=note,
price=None,
)
name = dct["name"] name = dct["name"]
ingredient = ctx.ingredients.get(name) ingredient = ctx.ingredients.get(name)

View file

@ -13,6 +13,9 @@
"ingredients": { "ingredients": {
"type": "array", "type": "array",
"items": { "items": {
"oneOf": [
{ "type": "string" },
{
"$id": "https://example.com/ingredient.json", "$id": "https://example.com/ingredient.json",
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@ -25,6 +28,8 @@
"note": { "type": "string" } "note": { "type": "string" }
} }
} }
]
}
}, },
"steps": { "steps": {
"type": "array", "type": "array",

View file

@ -1,6 +1,11 @@
{% extends "base.html" %} {% extends "base.html" %}
{% macro ingredientpart(ing) -%} {% macro ingredientpart(ing) -%}
{% if recipe.price != None %}{{price(ing.price)}} {%endif%}{{ing.amount|amountprint}} {{ing["unit"].name}} {{ ing.name }} {{ing.note}} {% if recipe.price != None %}{{price(ing.price)}} {%endif%}
{% if ing.amount != None %} {{ing.amount|amountprint}}
{% if ing.unit != None %} {{ing.unit.name}}{% endif %}
{%endif%}
{{ ing.name }}
{% if ing.note != "" %} {{ing.note}}{% endif %}
{%- endmacro %} {%- endmacro %}
{% macro ingredient(ing) -%} {% macro ingredient(ing) -%}