Skip to content

Commit cc73545

Browse files
authored
Improve engine.cursor (#100)
* Improve `engine.cursor` * Updates based on PR feedback
1 parent 50836ea commit cc73545

File tree

1 file changed

+113
-84
lines changed

1 file changed

+113
-84
lines changed

sqlalchemy-stubs/engine/cursor.pyi

Lines changed: 113 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
import abc
21
from typing import Any
2+
from typing import List
3+
from typing import NoReturn
34
from typing import Optional
5+
from typing import Sequence
6+
from typing import TypeVar
47

5-
from .result import Result as Result
6-
from .result import ResultMetaData as ResultMetaData
7-
from .result import SimpleResultMetaData as SimpleResultMetaData
8-
from .result import tuplegetter as tuplegetter
9-
from .row import LegacyRow as LegacyRow
10-
from .. import exc as exc
11-
from .. import util as util
12-
from ..sql import expression as expression
13-
from ..sql import sqltypes as sqltypes
14-
from ..sql.compiler import RM_NAME as RM_NAME
15-
from ..sql.compiler import RM_OBJECTS as RM_OBJECTS
16-
from ..sql.compiler import RM_RENDERED_NAME as RM_RENDERED_NAME
17-
from ..sql.compiler import RM_TYPE as RM_TYPE
8+
from .base import Connection
9+
from .interfaces import _DBAPICursor
10+
from .interfaces import Dialect
11+
from .interfaces import ExecutionContext
12+
from .result import MergedResult
13+
from .result import Result
14+
from .result import ResultMetaData
15+
from .result import Row
16+
from .row import LegacyRow
17+
18+
_TCursorResult = TypeVar("_TCursorResult", bound=CursorResult)
1819

1920
MD_INDEX: int
2021
MD_RESULT_MAP_INDEX: int
@@ -26,139 +27,167 @@ MD_UNTRANSLATED: int
2627

2728
class CursorResultMetaData(ResultMetaData):
2829
returns_rows: bool = ...
29-
case_sensitive: Any = ...
30-
def __init__(self, parent: Any, cursor_description: Any) -> None: ...
30+
case_sensitive: bool = ...
31+
def __init__(
32+
self, parent: BaseCursorResult, cursor_description: Any
33+
) -> None: ...
3134

3235
class LegacyCursorResultMetaData(CursorResultMetaData): ...
3336

3437
class ResultFetchStrategy:
3538
alternate_cursor_description: Any = ...
36-
def soft_close(self, result: Any, dbapi_cursor: Any) -> None: ...
37-
def hard_close(self, result: Any, dbapi_cursor: Any) -> None: ...
38-
def yield_per(self, result: Any, dbapi_cursor: Any, num: Any) -> None: ...
39-
def fetchone(
40-
self, result: Any, dbapi_cursor: Any, hard_close: bool = ...
39+
def soft_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
40+
def hard_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
41+
def yield_per(
42+
self, result: Any, dbapi_cursor: _DBAPICursor, num: int
4143
) -> None: ...
44+
def fetchone(
45+
self, result: Any, dbapi_cursor: _DBAPICursor, hard_close: bool = ...
46+
) -> Any: ...
4247
def fetchmany(
43-
self, result: Any, dbapi_cursor: Any, size: Optional[Any] = ...
44-
) -> None: ...
45-
def fetchall(self, result: Any) -> None: ...
48+
self,
49+
result: Any,
50+
dbapi_cursor: _DBAPICursor,
51+
size: Optional[Any] = ...,
52+
) -> Sequence[Any]: ...
53+
def fetchall(self, result: Any) -> Sequence[Any]: ...
4654
def handle_exception(
47-
self, result: Any, dbapi_cursor: Any, err: Any
55+
self, result: Any, dbapi_cursor: _DBAPICursor, err: Any
4856
) -> None: ...
4957

5058
class NoCursorFetchStrategy(ResultFetchStrategy):
51-
def soft_close(self, result: Any, dbapi_cursor: Any) -> None: ...
52-
def hard_close(self, result: Any, dbapi_cursor: Any) -> None: ...
59+
def soft_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
60+
def hard_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
5361
def fetchone(
54-
self, result: Any, dbapi_cursor: Any, hard_close: bool = ...
55-
): ...
62+
self, result: Any, dbapi_cursor: _DBAPICursor, hard_close: bool = ...
63+
) -> Any: ...
5664
def fetchmany(
57-
self, result: Any, dbapi_cursor: Any, size: Optional[Any] = ...
58-
): ...
59-
def fetchall(self, result: Any, dbapi_cursor: Any): ...
65+
self,
66+
result: Any,
67+
dbapi_cursor: _DBAPICursor,
68+
size: Optional[Any] = ...,
69+
) -> Sequence[Any]: ...
70+
def fetchall(self, result: Any, dbapi_cursor: _DBAPICursor) -> Sequence[Any]: ... # type: ignore[override]
6071

6172
class NoCursorDQLFetchStrategy(NoCursorFetchStrategy): ...
6273
class NoCursorDMLFetchStrategy(NoCursorFetchStrategy): ...
6374

6475
class CursorFetchStrategy(ResultFetchStrategy):
65-
def soft_close(self, result: Any, dbapi_cursor: Any) -> None: ...
66-
def hard_close(self, result: Any, dbapi_cursor: Any) -> None: ...
76+
def soft_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
77+
def hard_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
6778
def handle_exception(
68-
self, result: Any, dbapi_cursor: Any, err: Any
79+
self, result: Any, dbapi_cursor: _DBAPICursor, err: Any
80+
) -> None: ...
81+
def yield_per(
82+
self, result: Any, dbapi_cursor: _DBAPICursor, num: int
6983
) -> None: ...
70-
def yield_per(self, result: Any, dbapi_cursor: Any, num: Any) -> None: ...
7184
def fetchone(
72-
self, result: Any, dbapi_cursor: Any, hard_close: bool = ...
73-
): ...
85+
self, result: Any, dbapi_cursor: _DBAPICursor, hard_close: bool = ...
86+
) -> Any: ...
7487
def fetchmany(
75-
self, result: Any, dbapi_cursor: Any, size: Optional[Any] = ...
76-
): ...
77-
def fetchall(self, result: Any, dbapi_cursor: Any): ...
88+
self,
89+
result: Any,
90+
dbapi_cursor: _DBAPICursor,
91+
size: Optional[Any] = ...,
92+
) -> Sequence[Any]: ...
93+
def fetchall(self, result: Any, dbapi_cursor: _DBAPICursor) -> Sequence[Any]: ... # type: ignore[override]
7894

7995
class BufferedRowCursorFetchStrategy(CursorFetchStrategy):
8096
def __init__(
8197
self,
82-
dbapi_cursor: Any,
98+
dbapi_cursor: _DBAPICursor,
8399
execution_options: Any,
84100
growth_factor: int = ...,
85101
initial_buffer: Optional[Any] = ...,
86102
) -> None: ...
87103
@classmethod
88-
def create(cls, result: Any): ...
89-
def yield_per(self, result: Any, dbapi_cursor: Any, num: Any) -> None: ...
90-
def soft_close(self, result: Any, dbapi_cursor: Any) -> None: ...
91-
def hard_close(self, result: Any, dbapi_cursor: Any) -> None: ...
104+
def create(cls, result: Any) -> BufferedRowCursorFetchStrategy: ...
105+
def yield_per(
106+
self, result: Any, dbapi_cursor: _DBAPICursor, num: int
107+
) -> None: ...
108+
def soft_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
109+
def hard_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
92110
def fetchone(
93-
self, result: Any, dbapi_cursor: Any, hard_close: bool = ...
94-
): ...
111+
self, result: Any, dbapi_cursor: _DBAPICursor, hard_close: bool = ...
112+
) -> Any: ...
95113
def fetchmany(
96-
self, result: Any, dbapi_cursor: Any, size: Optional[Any] = ...
97-
): ...
98-
def fetchall(self, result: Any, dbapi_cursor: Any): ...
114+
self,
115+
result: Any,
116+
dbapi_cursor: _DBAPICursor,
117+
size: Optional[Any] = ...,
118+
) -> Sequence[Any]: ...
119+
def fetchall(self, result: Any, dbapi_cursor: _DBAPICursor) -> Sequence[Any]: ... # type: ignore[override]
99120

100121
class FullyBufferedCursorFetchStrategy(CursorFetchStrategy):
101122
alternate_cursor_description: Any = ...
102123
def __init__(
103124
self,
104-
dbapi_cursor: Any,
125+
dbapi_cursor: _DBAPICursor,
105126
alternate_description: Optional[Any] = ...,
106127
initial_buffer: Optional[Any] = ...,
107128
) -> None: ...
108-
def yield_per(self, result: Any, dbapi_cursor: Any, num: Any) -> None: ...
109-
def soft_close(self, result: Any, dbapi_cursor: Any) -> None: ...
110-
def hard_close(self, result: Any, dbapi_cursor: Any) -> None: ...
129+
def yield_per(
130+
self, result: Any, dbapi_cursor: _DBAPICursor, num: int
131+
) -> None: ...
132+
def soft_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
133+
def hard_close(self, result: Any, dbapi_cursor: _DBAPICursor) -> None: ...
111134
def fetchone(
112-
self, result: Any, dbapi_cursor: Any, hard_close: bool = ...
113-
): ...
135+
self, result: Any, dbapi_cursor: _DBAPICursor, hard_close: bool = ...
136+
) -> Any: ...
114137
def fetchmany(
115-
self, result: Any, dbapi_cursor: Any, size: Optional[Any] = ...
116-
): ...
117-
def fetchall(self, result: Any, dbapi_cursor: Any): ...
138+
self,
139+
result: Any,
140+
dbapi_cursor: _DBAPICursor,
141+
size: Optional[Any] = ...,
142+
) -> Sequence[Any]: ...
143+
def fetchall(self, result: Any, dbapi_cursor: _DBAPICursor) -> Sequence[Any]: ... # type: ignore[override]
118144

119145
class _NoResultMetaData(ResultMetaData):
120146
returns_rows: bool = ...
121147
@property
122-
def keys(self) -> None: ...
148+
def keys(self) -> NoReturn: ...
123149

124150
class BaseCursorResult:
125151
out_parameters: Any = ...
126152
closed: bool = ...
127-
context: Any = ...
128-
dialect: Any = ...
153+
context: ExecutionContext = ...
154+
dialect: Dialect = ...
129155
cursor: Any = ...
130-
cursor_strategy: Any = ...
131-
connection: Any = ...
156+
cursor_strategy: CursorFetchStrategy = ...
157+
connection: Connection = ...
132158
def __init__(
133-
self, context: Any, cursor_strategy: Any, cursor_description: Any
159+
self,
160+
context: ExecutionContext,
161+
cursor_strategy: CursorFetchStrategy,
162+
cursor_description: Any,
134163
): ...
135164
@property
136-
def inserted_primary_key_rows(self): ...
165+
def inserted_primary_key_rows(self) -> Any: ...
137166
@property
138-
def inserted_primary_key(self): ...
139-
def last_updated_params(self): ...
140-
def last_inserted_params(self): ...
167+
def inserted_primary_key(self) -> Row: ...
168+
def last_updated_params(self) -> Any: ...
169+
def last_inserted_params(self) -> Any: ...
141170
@property
142-
def returned_defaults_rows(self): ...
171+
def returned_defaults_rows(self) -> List[Row]: ...
143172
@property
144-
def returned_defaults(self): ...
145-
def lastrow_has_defaults(self): ...
146-
def postfetch_cols(self): ...
147-
def prefetch_cols(self): ...
148-
def supports_sane_rowcount(self): ...
149-
def supports_sane_multi_rowcount(self): ...
150-
def rowcount(self): ...
173+
def returned_defaults(self) -> Optional[Row]: ...
174+
def lastrow_has_defaults(self) -> bool: ...
175+
def postfetch_cols(self) -> bool: ...
176+
def prefetch_cols(self) -> bool: ...
177+
def supports_sane_rowcount(self) -> bool: ...
178+
def supports_sane_multi_rowcount(self) -> bool: ...
179+
def rowcount(self) -> int: ...
151180
@property
152-
def lastrowid(self): ...
181+
def lastrowid(self) -> Any: ...
153182
@property
154-
def returns_rows(self): ...
183+
def returns_rows(self) -> bool: ...
155184
@property
156-
def is_insert(self): ...
185+
def is_insert(self) -> bool: ...
157186

158187
class CursorResult(BaseCursorResult, Result):
159-
def merge(self, *others: Any): ...
188+
def merge(self, *others: Any) -> MergedResult: ...
160189
def close(self) -> None: ...
161-
def yield_per(self, num: Any) -> None: ...
190+
def yield_per(self: _TCursorResult, num: Any) -> _TCursorResult: ...
162191

163192
class LegacyCursorResult(CursorResult):
164193
def close(self) -> None: ...
@@ -167,5 +196,5 @@ ResultProxy = LegacyCursorResult
167196

168197
class BufferedRowResultProxy(ResultProxy): ...
169198
class FullyBufferedResultProxy(ResultProxy): ...
170-
class BufferedColumnRow(LegacyRow, metaclass=abc.ABCMeta): ...
199+
class BufferedColumnRow(LegacyRow): ...
171200
class BufferedColumnResultProxy(ResultProxy): ...

0 commit comments

Comments
 (0)