
Грэм Дамплтон, известный по библиотеке wrapt, модулю mod_wsgi и Python-агенту New Relic, представил новый проект — Wrapture. Это библиотека, которая расширяет концепцию «обезьяньего патчинга» (monkey-patching) до инструмента для тестирования и трассировки. Примечательно, что весь код и документация Wrapture были написаны ИИ-ассистентом, работавшим под руководством автора.
Wrapture позволяет обернуть любую функцию или метод так, чтобы отслеживать все обращения к ним или переопределять возвращаемые значения. Библиотека позиционируется как альтернатива unittest.mock и одновременно как способ внедрения трассировки в существующие проекты.
«Прикрепление наблюдения к коду, который вы не контролируете, запись того, что через него проходит, и выполнение этого без нарушения работы наблюдаемой программы — это проблема, о которой я никогда не переставал думать», — пишет Дамплтон в анонсе.
Ключевые факты
| Параметр | Значение |
|---|---|
| Автор | Грэм Дамплтон (wrapt, mod_wsgi, New Relic Python agent) |
| Назначение | Тестирование и трассировка Python-кода через обёртывание функций |
| Поддержка OpenTelemetry | Встроенная, включая конфигурационный механизм |
| Метод создания | Весь код написан ИИ-ассистентом под руководством автора |
| Статус проекта | Молодой (несколько недель), активно развивается |
Как это работает
Библиотека предоставляет простой API для подмены возвращаемых значений и модификации результатов. В базовом примере тестирования с Wrapture вызов метода charge у класса Gateway подменяется на возврат фиктивного ответа:
def test_stub_with_wrapture():
with wrapture.binding(
Gateway, “charge”
).on_call.returns({
“id”: “stub”, “amount”: 0
}):
assert OrderService().place(500)[“id”] == “stub”
Более сложный сценарий — тест, который вызывает оригинальный метод, но затем модифицирует его возвращаемое значение:
def test_pinned_result_with_wrapture():
charge = wrapture.binding(
Gateway, “charge”
)
charge.on_call.transforms_result(
lambda r: {r, “id”: “ch_TEST”}
)
with charge:
assert OrderService().place(500) == {
“id”: “ch_TEST”, “amount”: 500
}
В обоих примерах метод OrderService().place(…) внутри вызывает Gateway().charge(…), что позволяет изолированно тестировать сервисный слой.
Трассировка через конфигурацию
Отдельного внимания заслуживает поддержка OpenTelemetry и механизм конфигурационной трассировки. Вместо программного добавления обёрток можно описать правила в TOML-файле:
capture = “summary”
[[observe]]
target = “domain:Calculator”
name = [“outer”, “inner”]
[[sink]]
type = “jsonlines”
path = “trace.jsonl”
Этот подход позволяет добавить трассировку в существующий проект без изменения исходного кода — достаточно указать, какие классы и методы отслеживать, и куда сохранять результаты.
Проект как эксперимент с ИИ
Дамплтон подчёркивает, что Wrapture стал его первой крупной попыткой полностью агентно-ориентированной разработки. Каждая строка кода и документации была написана ИИ-ассистентом под его руководством. При этом автор проводит чёткую границу между таким подходом и «vibe coding»:
«Это не было виб-кодингом, где одноразовый промпт порождает кучу сгенерированного кода, а человек надеется на лучшее, потому что у него не хватает знаний, чтобы оценить результат. Виб-кодинг заслужил свою плохую репутацию. Я тщательно спроектировал Wrapture с самого начала. Я провёл много времени в этом конкретном уголке Python и точно знал, каким должен быть результат. ИИ был средством его производства, а не источником дизайна».
Это важное разграничение для разработчиков, рассматривающих использование ИИ в программировании. Дамплтон показывает, что глубокое понимание предметной области остаётся критическим фактором — ИИ ускоряет реализацию, но не заменяет архитектурное проектирование.
Что это значит для разработчиков
Wrapture предлагает несколько практических преимуществ:
Упрощение тестирования. Библиотека позволяет создавать заглушки (stubs) и моки без изучения unittest.mock, с более декларативным синтаксисом.
Трассировка без вторжения. Конфигурационный подход делает добавление observability в существующие проекты делом нескольких строк TOML.
OpenTelemetry из коробки. Интеграция с популярным стандартом сбора телеметрии упрощает мониторинг микросервисов.
Потенциал для CI/CD. Возможность переопределять поведение методов в тестовом окружении может пригодиться при интеграционном тестировании.
Проект остаётся молодым — ему всего несколько недель. Полная документация доступна на сайте библиотеки. Дамплтон также опубликовал пост о модульном тестировании с Wrapture, где демонстрирует дополнительные паттерны.
