Spaces:
Running
Running
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 =
|
| 200 |
-
self._stop_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 =
|
| 331 |
-
self._stop_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 =
|
| 395 |
-
self._ready_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 =
|
| 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 =
|
| 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 =
|
| 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 = {
|