Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions stubs/peewee/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
peewee.Model.insert
peewee.Model.replace
peewee.Model.update

# Wrapped with @Node.copy which changes the signature to "def (self, *args, **kwargs)"
peewee.DQ.__invert__
peewee.Window.as_groups
peewee.Window.as_range
peewee.Window.as_rows
peewee._ModelQueryHelper.models

# Wrapped with @database_required which sometimes injects the database argument
peewee.BaseQuery.execute
peewee.CompoundSelectQuery.exists
Expand Down
2 changes: 1 addition & 1 deletion stubs/peewee/METADATA.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = "4.0.1"
version = "4.0.5"
upstream-repository = "https://github.com/coleifer/peewee"
# We're not providing stubs for all playhouse modules right now
# https://github.com/python/typeshed/pull/11731#issuecomment-2065729058
Expand Down
100 changes: 65 additions & 35 deletions stubs/peewee/peewee.pyi
Original file line number Diff line number Diff line change
@@ -1,24 +1,19 @@
import itertools
import logging
import re
import threading
from _typeshed import Incomplete, SupportsKeysAndGetItem
from _typeshed import Incomplete, SupportsKeysAndGetItem, Unused
from collections.abc import Callable, Generator, Iterable, Iterator
from datetime import datetime
from decimal import Decimal
from types import TracebackType
from typing import Any, ClassVar, Final, Literal, NamedTuple, TypeVar, overload
from typing_extensions import Self
from typing import Any, ClassVar, Final, Literal, NamedTuple, NoReturn, TypeVar, overload, type_check_only
from typing_extensions import Self, TypeIs
from uuid import UUID

class NullHandler(logging.Handler):
def emit(self, record) -> None: ...
def callable_(c: object) -> TypeIs[Callable[..., object]]: ...

text_type = str
bytes_type = bytes
buffer_type = memoryview
basestring = str
long = int
izip_longest = itertools.zip_longest
multi_types: tuple[type[Incomplete], ...]

def reraise(tp: Unused, value: BaseException, tb: TracebackType | None = None) -> NoReturn: ...

_T = TypeVar("_T")
_VT = TypeVar("_VT")
Expand All @@ -44,8 +39,13 @@ SCOPE_COLUMN: Final = 16
CSQ_PARENTHESES_NEVER: Final = 0
CSQ_PARENTHESES_ALWAYS: Final = 1
CSQ_PARENTHESES_UNNESTED: Final = 2
SNAKE_CASE_STEP1: Final[re.Pattern[str]]
SNAKE_CASE_STEP2: Final[re.Pattern[str]]
IDENTIFIER_RE: Final[re.Pattern[str]]
MODEL_BASE: Final = "_metaclass_helper_"

def chunked(it, n) -> Generator[Incomplete]: ...
def make_identifier(s: str) -> str: ...
def chunked(it, n) -> Generator[list[Incomplete]]: ...

class _callable_context_manager:
def __call__(self, fn): ...
Expand Down Expand Up @@ -347,14 +347,15 @@ class BitwiseMixin:
def __invert__(self) -> BitwiseNegated: ...

class BitwiseNegated(BitwiseMixin, WrappedNode):
op: str
def __invert__(self): ...
def __sql__(self, ctx): ...

class Value(ColumnBase):
value: Incomplete
converter: Incomplete
multi: Incomplete
values: list[Incomplete]
multi: bool
values: list[Incomplete] | None
def __init__(self, value, converter=None, unpack: bool = True) -> None: ...
def __sql__(self, ctx): ...

Expand Down Expand Up @@ -463,7 +464,7 @@ class WindowAlias(Node):
def __sql__(self, ctx): ...

class ForUpdate(Node):
def __init__(self, expr, of=None, nowait=None) -> None: ...
def __init__(self, expr, of=None, nowait: bool | None = None, skip_locked: bool | None = None) -> None: ...
def __sql__(self, ctx): ...

class Case(ColumnBase):
Expand All @@ -476,7 +477,7 @@ class Case(ColumnBase):
class NodeList(ColumnBase):
nodes: Incomplete
glue: Incomplete
parens: Incomplete
parens: bool
def __init__(self, nodes, glue: str = " ", parens: bool = False) -> None: ...
def __sql__(self, ctx): ...

Expand Down Expand Up @@ -598,8 +599,6 @@ class Select(SelectBase):
distinct=None,
windows=None,
for_update=None,
for_update_of=None,
nowait=None,
lateral=None,
**kwargs,
) -> None: ...
Expand All @@ -619,7 +618,9 @@ class Select(SelectBase):
def having(self, *expressions) -> Self: ...
def distinct(self, *columns) -> Self: ...
def window(self, *windows) -> Self: ...
def for_update(self, for_update: bool = True, of=None, nowait=None) -> Self: ...
def for_update(
self, for_update: bool = True, of=None, nowait: bool | None = None, skip_locked: bool | None = None
) -> Self: ...
def lateral(self, lateral: bool = True) -> Self: ...
def __sql_selection__(self, ctx, is_subquery: bool = False): ...
def __sql__(self, ctx): ...
Expand Down Expand Up @@ -931,7 +932,6 @@ class Psycopg2Adapter(_BasePsycopgAdapter):
def is_connection_usable(self, conn) -> bool: ...
def is_connection_reusable(self, conn) -> bool: ...
def is_connection_closed(self, conn) -> bool: ...
def extract_date(self, date_part, date_field) -> Function: ...

class Psycopg3Adapter(_BasePsycopgAdapter):
json_type: Incomplete
Expand All @@ -945,7 +945,6 @@ class Psycopg3Adapter(_BasePsycopgAdapter):
def is_connection_usable(self, conn) -> bool: ...
def is_connection_reusable(self, conn) -> bool: ...
def is_connection_closed(self, conn) -> bool: ...
def extract_date(self, date_part, date_field) -> Function: ...

class PostgresqlDatabase(Database):
field_types: Incomplete
Expand All @@ -956,7 +955,6 @@ class PostgresqlDatabase(Database):
for_update: bool
nulls_ordering: bool
returning_clause: bool
safe_create_index: bool
sequences: bool
psycopg2_adapter: Incomplete
psycopg3_adapter: Incomplete
Expand Down Expand Up @@ -986,6 +984,7 @@ class PostgresqlDatabase(Database):
def conflict_update(self, oc, query) -> NodeList: ...
def extract_date(self, date_part, date_field) -> Function: ...
def truncate_date(self, date_part, date_field) -> Function: ...
def interval(self, val) -> NodeList: ...
def to_timestamp(self, date_field) -> Function: ...
def from_timestamp(self, date_field) -> Function: ...
def get_noop_select(self, ctx): ...
Expand Down Expand Up @@ -1077,8 +1076,11 @@ class CursorWrapper:
def process_row(self, row): ...
def iterator(self) -> Generator[Incomplete]: ...
def fill_cache(self, n: int = 0) -> None: ...
def dedupe_columns(self, columns: Iterable[str], valid_identifiers: bool = True) -> list[str]: ...

class DictCursorWrapper(CursorWrapper):
columns: list[str]
ncols: int
def initialize(self) -> None: ...
def process_row(self, row): ...

Expand All @@ -1089,7 +1091,10 @@ class NamedTupleCursorWrapper(CursorWrapper):

class ObjectCursorWrapper(DictCursorWrapper):
constructor: Incomplete
columns: list[str]
ncols: int
def __init__(self, cursor, constructor) -> None: ...
def initialize(self) -> None: ...
def process_row(self, row): ...

class ResultIterator:
Expand Down Expand Up @@ -1231,7 +1236,7 @@ class CharField(_StringField):
def get_modifiers(self) -> list[int] | None: ...

class FixedCharField(CharField):
def python_value(self, value): ...
def adapt(self, value) -> str: ...

class TextField(_StringField): ...

Expand Down Expand Up @@ -1510,6 +1515,7 @@ class SchemaManager:
def drop_table(self, safe: bool = True, **options) -> None: ...
def truncate_table(self, restart_identity: bool = False, cascade: bool = False) -> None: ...
def create_indexes(self, safe: bool = True) -> None: ...
def drop_index(self, field=None, index=None, safe: bool = True): ...
def drop_indexes(self, safe: bool = True) -> None: ...
def create_sequence(self, field) -> None: ...
def drop_sequence(self, field) -> None: ...
Expand Down Expand Up @@ -1735,6 +1741,7 @@ class _ModelQueryHelper:
default_row_type: Incomplete
def __init__(self, *args, **kwargs) -> None: ...
def objects(self, constructor=None) -> Self: ...
def models(self) -> Self: ...

class ModelRaw(_ModelQueryHelper, RawQuery): # type: ignore[misc]
model: Incomplete
Expand Down Expand Up @@ -1804,41 +1811,63 @@ class ManyToManyQuery(ModelSelect):
class BaseModelCursorWrapper(DictCursorWrapper):
model: Incomplete
select: Incomplete
ncols: int
columns: list[str]
converters: list[Incomplete]
fields: list[Incomplete]
no_convert: list[int]
convert: list[int]
def __init__(self, cursor, model, columns) -> None: ...
initialize: Incomplete
def initialize(self) -> None: ...
def process_row(self, row): ...

class ModelDictCursorWrapper(BaseModelCursorWrapper):
def process_row(self, row) -> dict[Incomplete, Incomplete]: ...
unique_columns: list[str]
def initialize(self) -> None: ...
def process_row(self, row) -> dict[str, Incomplete]: ...

class ModelTupleCursorWrapper(ModelDictCursorWrapper):
class ModelTupleCursorWrapper(BaseModelCursorWrapper):
constructor: Incomplete
def process_row(self, row) -> tuple[Incomplete, ...]: ... # type: ignore[override]

class ModelNamedTupleCursorWrapper(ModelTupleCursorWrapper):
tuple_class: Incomplete
impl: Incomplete
constructor: Incomplete
def initialize(self) -> None: ...

class ModelObjectCursorWrapper(ModelDictCursorWrapper):
constructor: Incomplete
is_model: Incomplete
identifiers: list[str]
def __init__(self, cursor, model, select, constructor) -> None: ...
def initialize(self) -> None: ...
def process_row(self, row): ...

class ModelCursorWrapper(BaseModelCursorWrapper):
from_list: Incomplete
joins: Incomplete
def __init__(self, cursor, model, select, from_list, joins) -> None: ...
dicts: bool
def __init__(self, cursor, model, select, from_list, joins, dicts: bool = False) -> None: ...
key_to_constructor: Incomplete
src_is_dest: Incomplete
src_to_dest: Incomplete
column_keys: Incomplete
src_is_dest: dict[Incomplete, Incomplete]
src_to_dest: list[tuple[Incomplete, Incomplete, Incomplete, bool, Incomplete, bool]]
column_keys: list[Incomplete]
def initialize(self) -> None: ...
def process_row(self, row): ...

class PrefetchQuery:
def __new__(cls, query, fields=None, is_backref=None, rel_models=None, field_to_name=None, model=None) -> Self: ...
@type_check_only
class _PrefetchQuery(NamedTuple):
query: Incomplete
fields: Incomplete
is_backref: bool
rel_models: Incomplete
field_to_name: Incomplete
model: Incomplete

class PrefetchQuery(_PrefetchQuery):
def __new__(
cls, query, fields=None, is_backref: bool | None = None, rel_models=None, field_to_name=None, model=None
) -> Self: ...
def populate_instance(self, instance, id_map) -> None: ...
def store_instance(self, instance, id_map) -> None: ...

Expand Down Expand Up @@ -1878,6 +1907,7 @@ __all__ = [
"DoesNotExist",
"DoubleField",
"DQ",
"Entity",
"EXCLUDED",
"Field",
"FixedCharField",
Expand Down