<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/introducing-wrapture-ohj3cvcws" -->

---
title: Introducing wrapture | daily.dev
description: wrapture is a new Python package for monkey patching, unit testing, and tracing, built on top of wrapt. Rather than substituting fake objects like...
canonical: https://daily.dev/posts/introducing-wrapture-ohj3cvcws
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Introducing wrapture | daily.dev
og:description: wrapture is a new Python package for monkey patching, unit testing, and tracing, built on top of wrapt. Rather than substituting fake objects like...
og:url: https://daily.dev/posts/introducing-wrapture-ohj3cvcws
og:image: https://api.daily.dev/og/posts/ohJ3cvCWS.png
og:image:alt: Introducing wrapture
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Introducing wrapture

**[Planet Python](https://daily.dev/sources/planetpython)** · 15 min read · 1 upvotes · 1 comments

## Summary

wrapture is a new Python package for monkey patching, unit testing, and tracing, built on top of wrapt. Rather than substituting fake objects like unittest.mock, wrapture wraps real callables so the actual code runs while calls are observed, intervened on, or exported as OpenTelemetry spans. A single binding mechanism serves three purposes: ad-hoc monkey patching with a proper lifecycle, unit testing with call-graph assertions on real execution, and production-safe tracing via a wrapture.toml config with pluggable sinks (printer, JSON lines, OTLP export). The companion wrapture-instrumentation package ships pre-built bindings for Flask and Jinja2. Notably, every line of code and documentation was written by an AI assistant under the author's direction, following a carefully engineered process of design docs, layered implementation, and doctested documentation. wrapture is currently in alpha (eleventh pre-release), requires Python 3.12+ and wrapt 2.4.0+, and is installable via pip from PyPI.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://grahamdumpleton.me/posts/2026/08/introducing-wrapture>

## Questions this post answers

### What is wrapture and how is it different from unittest.mock for testing Python code?

wrapture is a Python package built on wrapt that wraps real callables instead of replacing them with fakes, so calls run through the actual code while being recorded onto a timeline tape. Unlike unittest.mock, which returns a fabricated MagicMock and records a flat call list with no return values or nesting, wrapture captures the real call graph, arguments, return values, and nesting, and lets tests assert on how calls actually flowed, including error propagation paths.

_Developers weighing mock-based tests against real-execution tracing can track approaches like this on daily.dev._

### Can wrapture be used to trace a running Python application in production without modifying the source code?

Yes, wrapture supports ad-hoc tracing of applications you cannot modify by naming target methods in a wrapture.toml config file and running the program with python -m wrapture or via the autowrapt bootstrap environment variable. Events flow to configurable sinks including a stderr printer, JSON lines files, or an OpenTelemetry OTLP backend, without touching the application's own code.

_Teams adding observability to code they can't rewrite can follow tooling like this via daily.dev._

### What are the system requirements and installation instructions for the wrapture Python package?

wrapture requires Python 3.12 or later and wrapt 2.4.0 or later, and is installed via pip install wrapture, which currently pulls the latest alpha pre-release from PyPI since 1.0.0 has not yet shipped. The package reached its eleventh alpha release roughly two weeks after its first commit, with over 1000 tests and 150+ pages of documentation, and its public API is considered stable going forward to 1.0.0.

_Developers evaluating new testing and tracing libraries can keep tabs on releases like this through daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@leonidbugaev** · 0 upvotes

> unittest.mock's MagicMock answers every method and never runs the real body, so the object's calls to itself never happen. A green test there is agreement with the substitute. The obligation that only exists in the real callable (error propagation, nested self-calls, the actual return) cannot fail that test. Wrapping the real function and asserting the tape is a different kind of check: a wrong implementation can make it fail. Substituting it cannot.

## Similar posts on daily.dev

- [Lazy monkey patching with wrapt](https://daily.dev/posts/lazy-monkey-patching-with-wrapt-kfldjdotj) · Planet Python · 1 upvotes · 0 comments
- [Status of wrapt \(September 2025\)](https://daily.dev/posts/status-of-wrapt-september-2025--ecwcjo8i6) · Planet Python · 1 upvotes · 0 comments
- [Detecting object wrappers](https://daily.dev/posts/detecting-object-wrappers-ktjqrtamw) · Planet Python · 0 upvotes · 0 comments

---

Tags: [#python](https://daily.dev/tags/python), [#testing](https://daily.dev/tags/testing), [#ai-coding](https://daily.dev/tags/ai-coding), [#opentelemetry](https://daily.dev/tags/opentelemetry)

[View this post on daily.dev](https://daily.dev/posts/introducing-wrapture-ohj3cvcws)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Introducing wrapture","url":"https://daily.dev/posts/introducing-wrapture-ohj3cvcws","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/introducing-wrapture-ohj3cvcws"},"datePublished":"2026-08-31T01:49:23.687Z","dateModified":"2026-08-31T01:49:50.207Z","description":"wrapture is a new Python package for monkey patching, unit testing, and tracing, built on top of wrapt. Rather than substituting fake objects like...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/0bb8df1a9110bae29bdc82c29d6eb564?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/0bb8df1a9110bae29bdc82c29d6eb564?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Planet Python","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Planet Python","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/eac3cc584cb043b5a242d13752bd3d0c","url":"https://daily.dev/sources/planetpython"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/introducing-wrapture-ohj3cvcws","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"python,testing,ai-coding,opentelemetry","timeRequired":"PT15M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Planet Python","item":"https://daily.dev/sources/planetpython"},{"@type":"ListItem","position":3,"name":"Introducing wrapture"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/introducing-wrapture-ohj3cvcws","comment":[{"@type":"Comment","text":"unittest.mock’s MagicMock answers every method and never runs the real body, so the object’s calls to itself never happen. A green test there is agreement with the substitute. The obligation that only exists in the real callable (error propagation, nested self-calls, the actual return) cannot fail that test. Wrapping the real function and asserting the tape is a different kind of check: a wrong implementation can make it fail. Substituting it cannot.","datePublished":"2026-08-31T11:01:42.933Z","url":"https://daily.dev/posts/ohJ3cvCWS#c-2y3i9B6TE","author":{"@type":"Person","name":"Leonid Bugaev","url":"https://daily.dev/leonidbugaev","image":"https://lh3.googleusercontent.com/a/ACg8ocLhMgurwTmJElWaH9A8Ju8cHvZxgMCDt009jEYkmFCyUGAoaGSw=s96-c"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/introducing-wrapture-ohj3cvcws#faq","mainEntity":[{"@type":"Question","name":"What is wrapture and how is it different from unittest.mock for testing Python code?","acceptedAnswer":{"@type":"Answer","text":"wrapture is a Python package built on wrapt that wraps real callables instead of replacing them with fakes, so calls run through the actual code while being recorded onto a timeline tape. Unlike unittest.mock, which returns a fabricated MagicMock and records a flat call list with no return values or nesting, wrapture captures the real call graph, arguments, return values, and nesting, and lets tests assert on how calls actually flowed, including error propagation paths. Developers weighing mock-based tests against real-execution tracing can track approaches like this on daily.dev."}},{"@type":"Question","name":"Can wrapture be used to trace a running Python application in production without modifying the source code?","acceptedAnswer":{"@type":"Answer","text":"Yes, wrapture supports ad-hoc tracing of applications you cannot modify by naming target methods in a wrapture.toml config file and running the program with python -m wrapture or via the autowrapt bootstrap environment variable. Events flow to configurable sinks including a stderr printer, JSON lines files, or an OpenTelemetry OTLP backend, without touching the application's own code. Teams adding observability to code they can't rewrite can follow tooling like this via daily.dev."}},{"@type":"Question","name":"What are the system requirements and installation instructions for the wrapture Python package?","acceptedAnswer":{"@type":"Answer","text":"wrapture requires Python 3.12 or later and wrapt 2.4.0 or later, and is installed via pip install wrapture, which currently pulls the latest alpha pre-release from PyPI since 1.0.0 has not yet shipped. The package reached its eleventh alpha release roughly two weeks after its first commit, with over 1000 tests and 150+ pages of documentation, and its public API is considered stable going forward to 1.0.0. Developers evaluating new testing and tracing libraries can keep tabs on releases like this through daily.dev."}}]}
```

