|
1 | 1 | from __future__ import annotations as _annotations
|
2 | 2 |
|
3 | 3 | import asyncio
|
| 4 | +import contextvars |
4 | 5 | import os
|
5 | 6 | from collections.abc import AsyncIterator
|
6 | 7 | from importlib.metadata import distributions
|
|
9 | 10 | from inline_snapshot import snapshot
|
10 | 11 |
|
11 | 12 | from pydantic_ai import UserError
|
12 |
| -from pydantic_ai._utils import UNSET, PeekableAsyncStream, check_object_json_schema, group_by_temporal |
| 13 | +from pydantic_ai._utils import UNSET, PeekableAsyncStream, check_object_json_schema, group_by_temporal, run_in_executor |
13 | 14 |
|
14 | 15 | from .models.mock_async_stream import MockAsyncStream
|
15 | 16 |
|
@@ -136,3 +137,19 @@ def test_package_versions(capsys: pytest.CaptureFixture[str]):
|
136 | 137 | packages = sorted((package.metadata['Name'], package.version) for package in distributions())
|
137 | 138 | for name, version in packages:
|
138 | 139 | print(f'{name:30} {version}')
|
| 140 | + |
| 141 | + |
| 142 | +async def test_run_in_executor_with_contextvars() -> None: |
| 143 | + ctx_var = contextvars.ContextVar('test_var', default='default') |
| 144 | + ctx_var.set('original_value') |
| 145 | + |
| 146 | + result = await run_in_executor(ctx_var.get) |
| 147 | + assert result == ctx_var.get() |
| 148 | + |
| 149 | + ctx_var.set('new_value') |
| 150 | + result = await run_in_executor(ctx_var.get) |
| 151 | + assert result == ctx_var.get() |
| 152 | + |
| 153 | + # show that the old version did not work |
| 154 | + old_result = asyncio.get_running_loop().run_in_executor(None, ctx_var.get) |
| 155 | + assert old_result != ctx_var.get() |
0 commit comments