diff --git a/stubs/peewee/@tests/stubtest_allowlist.txt b/stubs/peewee/@tests/stubtest_allowlist.txt index d7ab2ba94e5a..06bd8788cae5 100644 --- a/stubs/peewee/@tests/stubtest_allowlist.txt +++ b/stubs/peewee/@tests/stubtest_allowlist.txt @@ -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 diff --git a/stubs/peewee/METADATA.toml b/stubs/peewee/METADATA.toml index 676d1070a04d..4bb0e2ed3ad3 100644 --- a/stubs/peewee/METADATA.toml +++ b/stubs/peewee/METADATA.toml @@ -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 diff --git a/stubs/peewee/peewee.pyi b/stubs/peewee/peewee.pyi index e20cea253c56..0fb7364a0fff 100644 --- a/stubs/peewee/peewee.pyi +++ b/stubs/peewee/peewee.pyi @@ -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") @@ -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): ... @@ -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): ... @@ -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): @@ -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): ... @@ -598,8 +599,6 @@ class Select(SelectBase): distinct=None, windows=None, for_update=None, - for_update_of=None, - nowait=None, lateral=None, **kwargs, ) -> None: ... @@ -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): ... @@ -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 @@ -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 @@ -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 @@ -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): ... @@ -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): ... @@ -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: @@ -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): ... @@ -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: ... @@ -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 @@ -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: ... @@ -1878,6 +1907,7 @@ __all__ = [ "DoesNotExist", "DoubleField", "DQ", + "Entity", "EXCLUDED", "Field", "FixedCharField",