Skip to content

Commit d515c85

Browse files
committed
Cover the deferred-signature edge cases: instance access and defer_build turned off
1 parent 1facb57 commit d515c85

1 file changed

Lines changed: 19 additions & 1 deletion

File tree

‎tests/types/test_deferred.py‎

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,26 @@ class Probe(MCPModel):
2727
def test_deferred_signature_is_not_a_type_hint_and_is_class_only() -> None:
2828
"""The lazy `__signature__` never leaks into `get_type_hints`, and instances do not
2929
expose one (matching `BaseModel`)."""
30-
assert "__signature__" not in typing.get_type_hints(Tool)
30+
31+
class Probe(MCPModel):
32+
name: str
33+
34+
assert "__signature__" not in typing.get_type_hints(Probe)
35+
assert not hasattr(Probe.model_construct(name="x"), "__signature__") # still-deferred class
3136
assert not hasattr(Implementation(name="probe", version="1"), "__signature__")
37+
assert "__signature__" not in typing.get_type_hints(Tool)
38+
39+
40+
def test_a_subclass_that_disables_defer_build_keeps_its_eager_signature() -> None:
41+
"""A subclass may turn `defer_build` back off; it builds at class creation and keeps the
42+
signature pydantic gave it (the lazy one is only installed on still-deferred classes)."""
43+
44+
class Eager(MCPModel):
45+
model_config = ConfigDict(defer_build=False)
46+
value: int
47+
48+
assert Eager.__pydantic_complete__
49+
assert str(inspect.signature(Eager)) == "(*, value: int) -> None"
3250

3351

3452
def test_decorated_root_model_covers_its_subclasses_too() -> None:

0 commit comments

Comments
 (0)