Jeremiah Lowin commited on
Commit
9cad16d
·
1 Parent(s): 800183b

Use anyio.event

Browse files
src/fastmcp/client/client.py CHANGED
@@ -196,8 +196,8 @@ class Client(Generic[ClientTransportT]):
196
  self._nesting_counter: int = 0
197
  self._context_lock = anyio.Lock()
198
  self._session_task: asyncio.Task | None = None
199
- self._ready_event = asyncio.Event()
200
- self._stop_event = asyncio.Event()
201
 
202
  @property
203
  def session(self) -> ClientSession:
 
196
  self._nesting_counter: int = 0
197
  self._context_lock = anyio.Lock()
198
  self._session_task: asyncio.Task | None = None
199
+ self._ready_event = anyio.Event()
200
+ self._stop_event = anyio.Event()
201
 
202
  @property
203
  def session(self) -> ClientSession:
src/fastmcp/client/transports.py CHANGED
@@ -18,6 +18,7 @@ from typing import (
18
  overload,
19
  )
20
 
 
21
  import httpx
22
  from mcp import ClientSession, StdioServerParameters
23
  from mcp.client.session import (
@@ -327,8 +328,8 @@ class StdioTransport(ClientTransport):
327
 
328
  self._session: ClientSession | None = None
329
  self._connect_task: asyncio.Task | None = None
330
- self._ready_event = asyncio.Event()
331
- self._stop_event = asyncio.Event()
332
 
333
  @contextlib.asynccontextmanager
334
  async def connect_session(
@@ -391,8 +392,8 @@ class StdioTransport(ClientTransport):
391
 
392
  # reset variables and events for potential future reconnects
393
  self._connect_task = None
394
- self._stop_event = asyncio.Event()
395
- self._ready_event = asyncio.Event()
396
 
397
  async def close(self):
398
  await self.disconnect()
 
18
  overload,
19
  )
20
 
21
+ import anyio
22
  import httpx
23
  from mcp import ClientSession, StdioServerParameters
24
  from mcp.client.session import (
 
328
 
329
  self._session: ClientSession | None = None
330
  self._connect_task: asyncio.Task | None = None
331
+ self._ready_event = anyio.Event()
332
+ self._stop_event = anyio.Event()
333
 
334
  @contextlib.asynccontextmanager
335
  async def connect_session(
 
392
 
393
  # reset variables and events for potential future reconnects
394
  self._connect_task = None
395
+ self._stop_event = anyio.Event()
396
+ self._ready_event = anyio.Event()
397
 
398
  async def close(self):
399
  await self.disconnect()
tests/server/test_logging.py CHANGED
@@ -2,6 +2,7 @@ import asyncio
2
  import logging
3
  from unittest.mock import AsyncMock, Mock, patch
4
 
 
5
  import pytest
6
 
7
  from fastmcp.server.server import FastMCP
@@ -27,7 +28,7 @@ async def test_uvicorn_logging_default_level(
27
  """Tests that FastMCP passes log_level to uvicorn.Config if no log_config is given."""
28
  mock_server_instance = AsyncMock()
29
  mock_uvicorn_server_constructor.return_value = mock_server_instance
30
- serve_finished_event = asyncio.Event()
31
  mock_server_instance.serve.side_effect = serve_finished_event.wait
32
 
33
  test_log_level = "warning"
@@ -63,7 +64,7 @@ async def test_uvicorn_logging_with_custom_log_config(
63
  """Tests that FastMCP passes log_config to uvicorn.Config and not log_level."""
64
  mock_server_instance = AsyncMock()
65
  mock_uvicorn_server_constructor.return_value = mock_server_instance
66
- serve_finished_event = asyncio.Event()
67
  mock_server_instance.serve.side_effect = serve_finished_event.wait
68
 
69
  sample_log_config = {
@@ -123,7 +124,7 @@ async def test_uvicorn_logging_custom_log_config_overrides_log_level_param(
123
  """Tests log_config precedence if log_level is also passed to run_http_async."""
124
  mock_server_instance = AsyncMock()
125
  mock_uvicorn_server_constructor.return_value = mock_server_instance
126
- serve_finished_event = asyncio.Event()
127
  mock_server_instance.serve.side_effect = serve_finished_event.wait
128
 
129
  sample_log_config = {
 
2
  import logging
3
  from unittest.mock import AsyncMock, Mock, patch
4
 
5
+ import anyio
6
  import pytest
7
 
8
  from fastmcp.server.server import FastMCP
 
28
  """Tests that FastMCP passes log_level to uvicorn.Config if no log_config is given."""
29
  mock_server_instance = AsyncMock()
30
  mock_uvicorn_server_constructor.return_value = mock_server_instance
31
+ serve_finished_event = anyio.Event()
32
  mock_server_instance.serve.side_effect = serve_finished_event.wait
33
 
34
  test_log_level = "warning"
 
64
  """Tests that FastMCP passes log_config to uvicorn.Config and not log_level."""
65
  mock_server_instance = AsyncMock()
66
  mock_uvicorn_server_constructor.return_value = mock_server_instance
67
+ serve_finished_event = anyio.Event()
68
  mock_server_instance.serve.side_effect = serve_finished_event.wait
69
 
70
  sample_log_config = {
 
124
  """Tests log_config precedence if log_level is also passed to run_http_async."""
125
  mock_server_instance = AsyncMock()
126
  mock_uvicorn_server_constructor.return_value = mock_server_instance
127
+ serve_finished_event = anyio.Event()
128
  mock_server_instance.serve.side_effect = serve_finished_event.wait
129
 
130
  sample_log_config = {