Get baseline 100% clean coverage (#1553)

This commit is contained in:
Max Isbey 2025-11-11 13:09:32 +00:00 • committed by GitHub
commit 89e9c43acf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 1032 additions and 1084 deletions

View file

@ -147,7 +147,7 @@ class FuncMetadata(BaseModel):
key_to_field_info[field_info.alias] = field_info
for data_key, data_value in data.items():
if data_key not in key_to_field_info:
if data_key not in key_to_field_info: # pragma: no cover
continue
field_info = key_to_field_info[data_key]
@ -217,7 +217,7 @@ def func_metadata(
dynamic_pydantic_model_params: dict[str, Any] = {}
globalns = getattr(func, "__globals__", {})
for param in params.values():
if param.name.startswith("_"):
if param.name.startswith("_"): # pragma: no cover
raise InvalidSignature(f"Parameter {param.name} of {func.__name__} cannot start with '_'")
if param.name in skip_names:
continue
@ -412,7 +412,7 @@ def _create_model_from_class(cls: type[Any]) -> type[BaseModel]:
model_fields: dict[str, Any] = {}
for field_name, field_type in type_hints.items():
if field_name.startswith("_"):
if field_name.startswith("_"): # pragma: no cover
continue
default = getattr(cls, field_name, PydanticUndefined)
@ -477,7 +477,9 @@ def _create_dict_model(func_name: str, dict_annotation: Any) -> type[BaseModel]:
def _get_typed_annotation(annotation: Any, globalns: dict[str, Any]) -> Any:
def try_eval_type(value: Any, globalns: dict[str, Any], localns: dict[str, Any]) -> tuple[Any, bool]:
def try_eval_type(
value: Any, globalns: dict[str, Any], localns: dict[str, Any]
) -> tuple[Any, bool]: # pragma: no cover
try:
return eval_type_backport(value, globalns, localns), True
except NameError:
@ -489,7 +491,7 @@ def _get_typed_annotation(annotation: Any, globalns: dict[str, Any]) -> Any:
# This check and raise could perhaps be skipped, and we (FastMCP) just call
# model_rebuild right before using it 🤷
if status is False:
if status is False: # pragma: no cover
raise InvalidSignature(f"Unable to evaluate type annotation {annotation}")
return annotation
@ -524,7 +526,7 @@ def _convert_to_content(
output than the lowlevel server tool call handler, which just serializes structured
content verbatim.
"""
if result is None:
if result is None: # pragma: no cover
return []
if isinstance(result, ContentBlock):

View file

@ -25,15 +25,15 @@ def configure_logging(
level: the log level to use
"""
handlers: list[logging.Handler] = []
try:
try: # pragma: no cover
from rich.console import Console
from rich.logging import RichHandler
handlers.append(RichHandler(console=Console(stderr=True), rich_tracebacks=True))
except ImportError:
except ImportError: # pragma: no cover
pass
if not handlers:
if not handlers: # pragma: no cover
handlers.append(logging.StreamHandler())
logging.basicConfig(

View file

@ -15,9 +15,9 @@ class Image:
data: bytes | None = None,
format: str | None = None,
):
if path is None and data is None:
if path is None and data is None: # pragma: no cover
raise ValueError("Either path or data must be provided")
if path is not None and data is not None:
if path is not None and data is not None: # pragma: no cover
raise ValueError("Only one of path or data can be provided")
self.path = Path(path) if path else None
@ -27,7 +27,7 @@ class Image:
def _get_mime_type(self) -> str:
"""Get MIME type from format or guess from file extension."""
if self._format:
if self._format: # pragma: no cover
return f"image/{self._format.lower()}"
if self.path:
@ -39,16 +39,16 @@ class Image:
".gif": "image/gif",
".webp": "image/webp",
}.get(suffix, "application/octet-stream")
return "image/png" # default for raw binary data
return "image/png" # pragma: no cover # default for raw binary data
def to_image_content(self) -> ImageContent:
"""Convert to MCP ImageContent."""
if self.path:
with open(self.path, "rb") as f:
data = base64.b64encode(f.read()).decode()
elif self.data is not None:
elif self.data is not None: # pragma: no cover
data = base64.b64encode(self.data).decode()
else:
else: # pragma: no cover
raise ValueError("No image data available")
return ImageContent(type="image", data=data, mimeType=self._mime_type)
@ -63,7 +63,7 @@ class Audio:
data: bytes | None = None,
format: str | None = None,
):
if not bool(path) ^ bool(data):
if not bool(path) ^ bool(data): # pragma: no cover
raise ValueError("Either path or data can be provided")
self.path = Path(path) if path else None
@ -73,7 +73,7 @@ class Audio:
def _get_mime_type(self) -> str:
"""Get MIME type from format or guess from file extension."""
if self._format:
if self._format: # pragma: no cover
return f"audio/{self._format.lower()}"
if self.path:
@ -86,16 +86,16 @@ class Audio:
".aac": "audio/aac",
".m4a": "audio/mp4",
}.get(suffix, "application/octet-stream")
return "audio/wav" # default for raw binary data
return "audio/wav" # pragma: no cover # default for raw binary data
def to_audio_content(self) -> AudioContent:
"""Convert to MCP AudioContent."""
if self.path:
with open(self.path, "rb") as f:
data = base64.b64encode(f.read()).decode()
elif self.data is not None:
elif self.data is not None: # pragma: no cover
data = base64.b64encode(self.data).decode()
else:
else: # pragma: no cover
raise ValueError("No audio data available")
return AudioContent(type="audio", data=data, mimeType=self._mime_type)