Skip to content

Commit 728d1ea

Browse files
committed
fix: use lax no cover and no branch pragmas for src/ files
Replace incorrect pragma types with the appropriate ones: - Use 'lax no cover' for covered lines with uncovered bodies (excluded from coverage but not checked by strict-no-cover) - Use 'no branch' for branches where target lines are covered but the branch path itself is not taken - Keep 'no cover' only for genuinely uncovered code paths
1 parent b327300 commit 728d1ea

File tree

14 files changed

+35
-35
lines changed

14 files changed

+35
-35
lines changed

src/mcp/cli/claude.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def update_claude_config(
7272
)
7373

7474
config_file = config_dir / "claude_desktop_config.json"
75-
if not config_file.exists():
75+
if not config_file.exists(): # pragma: lax no cover
7676
try:
7777
config_file.write_text("{}")
7878
except Exception:

src/mcp/cli/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def _build_uv_command(
7777

7878
if with_packages:
7979
for pkg in with_packages:
80-
if pkg:
80+
if pkg: # pragma: no branch
8181
cmd.extend(["--with", pkg])
8282

8383
# Add mcp run command

src/mcp/client/auth/oauth2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ async def async_auth_flow(self, request: httpx.Request) -> AsyncGenerator[httpx.
534534
)
535535

536536
# Step 2: Discover OAuth Authorization Server Metadata (OASM) (with fallback for legacy servers)
537-
for url in asm_discovery_urls:
537+
for url in asm_discovery_urls: # pragma: no branch
538538
oauth_metadata_request = create_oauth_metadata_request(url)
539539
oauth_metadata_response = yield oauth_metadata_request
540540

src/mcp/client/session_group.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,22 +223,22 @@ async def disconnect_from_server(self, session: mcp.ClientSession) -> None:
223223
)
224224
)
225225

226-
if session_known_for_components:
226+
if session_known_for_components: # pragma: no branch
227227
component_names = self._sessions.pop(session) # Pop from _sessions tracking
228228

229229
# Remove prompts associated with the session.
230230
for name in component_names.prompts:
231-
if name in self._prompts:
231+
if name in self._prompts: # pragma: no branch
232232
del self._prompts[name]
233233
# Remove resources associated with the session.
234234
for name in component_names.resources:
235-
if name in self._resources:
235+
if name in self._resources: # pragma: no branch
236236
del self._resources[name]
237237
# Remove tools associated with the session.
238238
for name in component_names.tools:
239-
if name in self._tools:
239+
if name in self._tools: # pragma: no branch
240240
del self._tools[name]
241-
if name in self._tool_to_session:
241+
if name in self._tool_to_session: # pragma: no branch
242242
del self._tool_to_session[name]
243243

244244
# Clean up the session's resources via its dedicated exit stack

src/mcp/client/sse.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ async def sse_reader(task_status: TaskStatus[str] = anyio.TASK_STATUS_IGNORED):
119119
await read_stream_writer.send(session_message)
120120
case _: # pragma: no cover
121121
logger.warning(f"Unknown SSE event: {sse.event}") # pragma: no cover
122-
except SSEError as sse_exc:
122+
except SSEError as sse_exc: # pragma: lax no cover
123123
logger.exception("Encountered SSE exception")
124124
raise sse_exc
125-
except Exception as exc:
125+
except Exception as exc: # pragma: lax no cover
126126
logger.exception("Error in sse_reader")
127127
await read_stream_writer.send(exc)
128128
finally:
@@ -143,7 +143,7 @@ async def post_writer(endpoint_url: str):
143143
)
144144
response.raise_for_status()
145145
logger.debug(f"Client message sent successfully: {response.status_code}")
146-
except Exception:
146+
except Exception: # pragma: lax no cover
147147
logger.exception("Error in post_writer")
148148
finally:
149149
await write_stream.aclose()

src/mcp/client/streamable_http.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,16 +474,16 @@ async def handle_request_async():
474474

475475
async def terminate_session(self, client: httpx.AsyncClient) -> None:
476476
"""Terminate the session by sending a DELETE request."""
477-
if not self.session_id: # pragma: no branch
477+
if not self.session_id: # pragma: lax no cover
478478
return
479479

480480
try:
481481
headers = self._prepare_headers()
482482
response = await client.delete(self.url, headers=headers)
483483

484-
if response.status_code == 405: # pragma: no branch
484+
if response.status_code == 405: # pragma: lax no cover
485485
logger.debug("Server does not allow session termination")
486-
elif response.status_code not in (200, 204): # pragma: no branch
486+
elif response.status_code not in (200, 204): # pragma: lax no cover
487487
logger.warning(f"Session termination failed: {response.status_code}")
488488
except Exception as exc: # pragma: no cover
489489
logger.warning(f"Session termination failed: {exc}")

src/mcp/server/auth/handlers/token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ async def handle(self, request: Request):
178178
except TokenError as e:
179179
return self.response(TokenErrorResponse(error=e.error, error_description=e.error_description))
180180

181-
case RefreshTokenRequest():
181+
case RefreshTokenRequest(): # pragma: no branch
182182
refresh_token = await self.provider.load_refresh_token(client_info, token_request.refresh_token)
183183
if refresh_token is None or refresh_token.client_id != token_request.client_id:
184184
# if token belongs to different client, pretend it doesn't exist

src/mcp/server/experimental/task_context.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ async def elicit_url(
317317
response_data = await resolver.wait()
318318
await self._store.update_task(self.task_id, status=TASK_STATUS_WORKING)
319319
return ElicitResult.model_validate(response_data)
320-
except anyio.get_cancelled_exc_class():
320+
except anyio.get_cancelled_exc_class(): # pragma: no cover
321321
await self._store.update_task(self.task_id, status=TASK_STATUS_WORKING)
322322
raise
323323

@@ -486,7 +486,7 @@ async def elicit_as_task(
486486
await self._store.update_task(self.task_id, status=TASK_STATUS_WORKING)
487487
return result
488488

489-
except anyio.get_cancelled_exc_class():
489+
except anyio.get_cancelled_exc_class(): # pragma: no cover
490490
await self._store.update_task(self.task_id, status=TASK_STATUS_WORKING)
491491
raise
492492

src/mcp/server/fastmcp/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ async def handle_sse(scope: Scope, receive: Receive, send: Send): # pragma: no
876876
else:
877877
# Auth is disabled, no need for RequireAuthMiddleware
878878
# Since handle_sse is an ASGI app, we need to create a compatible endpoint
879-
async def sse_endpoint(request: Request) -> Response:
879+
async def sse_endpoint(request: Request) -> Response: # pragma: no cover
880880
# Convert the Starlette request to ASGI parameters
881881
return await handle_sse(request.scope, request.receive, request._send) # type: ignore[reportPrivateUsage]
882882

src/mcp/server/fastmcp/tools/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ async def run(
118118

119119

120120
def _is_async_callable(obj: Any) -> bool:
121-
while isinstance(obj, functools.partial):
121+
while isinstance(obj, functools.partial): # pragma: lax no cover
122122
obj = obj.func
123123

124124
return inspect.iscoroutinefunction(obj) or (

0 commit comments

Comments
 (0)