Skip to content

Commit 1fd452c

Browse files
committed
Fix typing stub for new classmethod-only declaration.
1 parent 65b44c7 commit 1fd452c

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

peewee-stubs/__init__.pyi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,6 +1842,12 @@ class _BoundModelsContext(_callable_context_manager):
18421842
self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None
18431843
) -> None: ...
18441844

1845+
# Mirrors the runtime classmethod_only descriptor: no instance overload, so
1846+
# instance access is an error rather than the TypeError it raises at runtime.
1847+
@type_check_only
1848+
class _classmethod_only(Generic[_F]):
1849+
def __get__(self, instance: None, owner: type) -> _F: ...
1850+
18451851
class Model(metaclass=ModelBase):
18461852
__data__: Incomplete
18471853
__rel__: Incomplete
@@ -1867,8 +1873,7 @@ class Model(metaclass=ModelBase):
18671873
def replace_many(cls, rows, fields=None): ...
18681874
@classmethod
18691875
def raw(cls, sql, *params) -> ModelRaw: ...
1870-
@classmethod
1871-
def delete(cls) -> ModelDelete: ...
1876+
delete: _classmethod_only[Callable[[], ModelDelete]]
18721877
@classmethod
18731878
def create(cls, **query) -> Self: ...
18741879
@classmethod

typecheck/check_stub.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
IntegerField,
1515
Model,
1616
ModelAlias,
17+
ModelDelete,
1718
ModelSelect,
1819
NodeList,
1920
NoopModelSelect,
@@ -88,6 +89,12 @@ class Event(Model):
8889
assert_type(User.select().get(), User)
8990
assert_type(User.select().get_or_none(), User | None)
9091

92+
# delete() constructs a DELETE query and resolves only on the class. On an
93+
# instance it raises TypeError at runtime (delete_instance() is the instance
94+
# path), and the descriptor makes that a type error as well.
95+
assert_type(User.delete(), ModelDelete)
96+
User().delete() # type: ignore
97+
9198

9299
# A `database=` argument accepts a real Database or a DatabaseProxy stand-in.
93100
proxy = DatabaseProxy()

0 commit comments

Comments
 (0)