Skip to content

Commit bac17ef

Browse files
committed
mypy: Adds some additional stubs and cleans up obsolete overrides
1 parent 1bc511e commit bac17ef

14 files changed

+458
-117
lines changed

.pre-commit-config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ repos:
2424
- 'flake8-markupsafe@git+https://github.com/vmagamedov/flake8-markupsafe@b391bd13df9330e01666d304b7f4403d67e5ceba'
2525
- flake8-noqa==1.3.2
2626
- flake8-pyi==23.11.0
27+
- flake8-type-checking==2.8.0
2728
- repo: local
2829
hooks:
2930
- id: system

pyproject.toml

-4
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,10 @@ mypy_path = "$MYPY_CONFIG_FILE_DIR/src:$MYPY_CONFIG_FILE_DIR/stubs"
4848

4949
[[tool.mypy.overrides]]
5050
module = [
51-
"alembic.*",
52-
"magic.*",
5351
"plaster.*",
5452
"pyramid.*",
5553
"pyramid_beaker.*",
5654
"pyramid_layout.*",
57-
"transaction.*",
58-
"zope.sqlalchemy.*"
5955
]
6056
ignore_missing_imports = true
6157
disallow_untyped_defs = false

stubs/transaction/__init__.pyi

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from collections.abc import Callable, Iterable
2+
from typing import Protocol
3+
4+
from transaction._manager import Attempt, ThreadTransactionManager, TransactionManager as TransactionManager
5+
from transaction._transaction import Savepoint as Savepoint, Transaction as Transaction
6+
from transaction.interfaces import ITransaction, ITransactionManager
7+
8+
9+
class _CreateSavepoint(Protocol):
10+
def __call__(self, optimistic: bool = False) -> Savepoint: ...
11+
12+
class _CreateAttempts(Protocol):
13+
def __call__(self, number: int = 3) -> Iterable[Attempt]: ...
14+
15+
manager: ThreadTransactionManager
16+
get: Callable[[], Transaction]
17+
__enter__: Callable[[], Transaction]
18+
begin: Callable[[], Transaction]
19+
commit: Callable[[], None]
20+
abort: Callable[[], None]
21+
__exit__: Callable[[object, object, object], None]
22+
doom: Callable[[], None]
23+
isDoomed: Callable[[], bool]
24+
savepoint: _CreateSavepoint
25+
attempts: _CreateAttempts

stubs/transaction/_manager.pyi

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import threading
2+
from collections.abc import Callable, Iterator
3+
from typing import ClassVar, TypeVar, overload
4+
5+
from transaction._transaction import Savepoint, Transaction
6+
from transaction.interfaces import _Synchronizer, ITransactionManager
7+
from zope.interface import implementer
8+
9+
_T = TypeVar("_T")
10+
11+
@implementer(ITransactionManager)
12+
class TransactionManager:
13+
explicit: bool
14+
def __init__(self, explicit: bool = False) -> None: ...
15+
def begin(self) -> Transaction: ...
16+
def __enter__(self) -> Transaction: ...
17+
def get(self) -> Transaction: ...
18+
def free(self, txn: Transaction) -> None: ...
19+
def registerSynch(self, synch: _Synchronizer) -> None: ...
20+
def unregisterSynch(self, synch: _Synchronizer) -> None: ...
21+
def clearSynchs(self) -> None: ...
22+
def registeredSynchs(self) -> bool: ...
23+
def isDoomed(self) -> bool: ...
24+
def doom(self) -> None: ...
25+
def commit(self) -> None: ...
26+
def abort(self) -> None: ...
27+
def __exit__(self, t: object, v: object, tb: object) -> None: ...
28+
def savepoint(self, optimistic: bool = False) -> Savepoint: ...
29+
def attempts(self, number: int = 3) -> Iterator[Attempt]: ...
30+
run_no_func_types: ClassVar[tuple[type[object], ...]]
31+
@overload
32+
def run(self, func: Callable[[], _T], tries: int = 3) -> _T: ...
33+
@overload
34+
def run(self, func: None = None, tries: int = 3) -> Callable[[Callable[[], _T]], _T]: ...
35+
@overload
36+
def run(self, tries: int, /) -> Callable[[Callable[[], _T]], _T]: ...
37+
38+
@implementer(ITransactionManager)
39+
class ThreadTransactionManager(threading.local):
40+
manager: TransactionManager
41+
def __init__(self) -> None: ...
42+
@property
43+
def explicit(self) -> bool: ...
44+
@explicit.setter
45+
def explicit(self, v: bool) -> None: ...
46+
def begin(self) -> Transaction: ...
47+
def get(self) -> Transaction: ...
48+
def __enter__(self) -> Transaction: ...
49+
def commit(self) -> None: ...
50+
def abort(self) -> None: ...
51+
def __exit__(self, t: object, v: object, tb: object) -> None: ...
52+
def doom(self) -> None: ...
53+
def isDoomed(self) -> bool: ...
54+
def savepoint(self, optimistic: bool = False) -> Savepoint: ...
55+
def registerSynch(self, synch: _Synchronizer) -> None: ...
56+
def unregisterSynch(self, synch: _Synchronizer) -> None: ...
57+
def clearSynchs(self) -> None: ...
58+
def registeredSynchs(self) -> bool: ...
59+
def attempts(self, number: int = 3) -> Iterator[Attempt]: ...
60+
@overload
61+
def run(self, func: Callable[[], _T], tries: int = 3) -> _T: ...
62+
@overload
63+
def run(self, func: None = None, tries: int = 3) -> Callable[[Callable[[], _T]], _T]: ...
64+
@overload
65+
def run(self, tries: int, /) -> Callable[[Callable[[], _T]], _T]: ...
66+
67+
class Attempt:
68+
success: bool
69+
manager: TransactionManager
70+
def __init__(self, manager: TransactionManager) -> None: ...
71+
def __enter__(self) -> Transaction: ...
72+
def __exit__(self, t: object, v: object, tb: object) -> bool: ...

stubs/transaction/_transaction.pyi

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
from collections.abc import Callable, Iterator, Sequence
2+
from logging import Logger
3+
from typing import Any, overload
4+
from typing_extensions import TypeVarTuple, Unpack
5+
6+
from transaction.interfaces import _DataManager, _Synchronizer, ISavepoint, ITransaction, ITransactionManager
7+
from transaction.weakset import WeakSet
8+
from zope.interface import implementer
9+
10+
_Ts = TypeVarTuple("_Ts")
11+
12+
class Status:
13+
ACTIVE: str
14+
COMMITTING: str
15+
COMMITTED: str
16+
DOOMED: str
17+
COMMITFAILED: str
18+
19+
class _NoSynchronizers:
20+
@staticmethod
21+
def map(_f: Callable[..., object]) -> None: ...
22+
23+
@implementer(ITransaction)
24+
class Transaction:
25+
status: str
26+
extension: dict[str, Any]
27+
log: Logger
28+
def __init__(self, synchronizers: WeakSet[_Synchronizer] | None = None, manager: ITransactionManager | None = None) -> None: ...
29+
@property
30+
def user(self) -> str: ...
31+
@user.setter
32+
def user(self, v: str) -> None: ...
33+
@property
34+
def description(self) -> str: ...
35+
@description.setter
36+
def description(self, v: str) -> None: ...
37+
def isDoomed(self) -> bool: ...
38+
def doom(self) -> None: ...
39+
def join(self, resource: _DataManager) -> None: ...
40+
def savepoint(self, optimistic: bool = False) -> Savepoint: ...
41+
def commit(self) -> None: ...
42+
def getBeforeCommitHooks(self) -> Iterator[tuple[Callable[..., object], Sequence[Any], dict[str, Any]]]: ...
43+
@overload
44+
def addBeforeCommitHook(self, hook: Callable[[], object], args: tuple[()] = (), kws: None = None) -> object: ...
45+
@overload
46+
def addBeforeCommitHook(self, hook: Callable[[Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
47+
@overload
48+
def addBeforeCommitHook(self, hook: Callable[..., object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
49+
def getAfterCommitHooks(self) -> Iterator[tuple[Callable[[bool, Unpack[tuple[Any, ...]]], object], Sequence[Any], dict[str, Any]]]: ...
50+
@overload
51+
def addAfterCommitHook(self, hook: Callable[[bool], object], args: tuple[()] = (), kws: None = None) -> object: ...
52+
@overload
53+
def addAfterCommitHook(self, hook: Callable[[bool, Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
54+
@overload
55+
def addAfterCommitHook(self, hook: Callable[[bool, Unpack[tuple[Any, ...]]], object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
56+
def getBeforeAbortHooks(self) -> Iterator[tuple[Callable[..., object], Sequence[Any], dict[str, Any]]]: ...
57+
@overload
58+
def addBeforeAbortHook(self, hook: Callable[[], object], args: tuple[()] = (), kws: None = None) -> object: ...
59+
@overload
60+
def addBeforeAbortHook(self, hook: Callable[[Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
61+
@overload
62+
def addBeforeAbortHook(self, hook: Callable[..., object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
63+
def getAfterAbortHooks(self) -> Iterator[tuple[Callable[..., object], Sequence[Any], dict[str, Any]]]: ...
64+
@overload
65+
def addAfterAbortHook(self, hook: Callable[[], object], args: tuple[()] = (), kws: None = None) -> object: ...
66+
@overload
67+
def addAfterAbortHook(self, hook: Callable[[Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
68+
@overload
69+
def addAfterAbortHook(self, hook: Callable[..., object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
70+
def data(self, ob: object) -> Any: ...
71+
def set_data(self, ob: object, ob_data: object) -> None: ...
72+
def abort(self) -> None: ...
73+
def note(self, text: str | None) -> None: ...
74+
def setUser(self, user_name: str, path: str = "/") -> None: ...
75+
def setExtendedInfo(self, name: str, value: object) -> None: ...
76+
def isRetryableError(self, error: BaseException) -> bool: ...
77+
78+
def rm_key(rm: object) -> str | None: ...
79+
80+
@implementer(ISavepoint)
81+
class Savepoint:
82+
transaction: Transaction
83+
def __init__(self, transaction: Transaction, optimistic: bool, *resources: _DataManager) -> None: ...
84+
@property
85+
def valid(self) -> bool: ...
86+
def rollback(self) -> None: ...
87+
88+
class AbortSavepoint:
89+
datamanager: _DataManager
90+
transaction: Transaction
91+
def __init__(self, datamanager: _DataManager, transaction: Transaction) -> None: ...
92+
def rollback(self) -> None: ...
93+
94+
class NoRollbackSavepoint:
95+
datamanager: _DataManager
96+
def __init__(self, datamanager: _DataManager) -> None: ...
97+
def rollback(self) -> None: ...
98+
99+
def text_or_warn(s: object) -> str: ...

stubs/transaction/interfaces.pyi

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
from collections.abc import Callable, Iterable, Sequence
2+
from typing import Any, Protocol, TypeVar, overload
3+
from typing_extensions import TypeVarTuple, Unpack
4+
5+
from zope.interface import Interface
6+
7+
_T = TypeVar("_T")
8+
_Ts = TypeVarTuple("_Ts")
9+
10+
class _Attempt(Protocol):
11+
def __enter__(self) -> ITransaction: ...
12+
def __exit__(self, t: object, v: object, tb: object, /) -> bool | None: ...
13+
14+
class _DataManager(Protocol):
15+
@property
16+
def transaction_manager(self) -> ITransactionManager: ...
17+
def abort(self, transaction: ITransaction, /) -> object: ...
18+
def tpc_begin(self, transaction: ITransaction, /) -> object: ...
19+
def commit(self, transaction: ITransaction, /) -> object: ...
20+
def tpc_vote(self, transaction: ITransaction, /) -> object: ...
21+
def tpc_finish(self, transaction: ITransaction, /) -> object: ...
22+
def tpc_abort(self, transaction: ITransaction, /) -> object: ...
23+
def sortKey(self) -> str: ...
24+
25+
class _Synchronizer(Protocol):
26+
def beforeCompletion(self, transaction: ITransaction, /) -> object: ...
27+
def afterCompletion(self, transaction: ITransaction, /) -> object: ...
28+
def newTransaction(self, transaction: ITransaction, /) -> object: ...
29+
30+
31+
class ITransactionManager(Interface):
32+
explicit: bool
33+
def begin() -> ITransaction: ...
34+
def get() -> ITransaction: ...
35+
def commit() -> object: ...
36+
def abort() -> object: ...
37+
def doom() -> object: ...
38+
def isDoomed() -> bool: ...
39+
def savepoint(optimistic: bool = False) -> ISavepoint: ...
40+
def registerSynch(synch: _Synchronizer) -> object: ...
41+
def unregisterSynch(synch: _Synchronizer) -> object: ...
42+
def clearSynchs() -> object: ...
43+
def registeredSynchs() -> bool: ...
44+
def attempts(number: int = 3) -> Iterable[_Attempt]: ...
45+
@overload
46+
def run(func: Callable[[], _T], tries: int = 3) -> _T: ...
47+
@overload
48+
def run(func: None = None, tries: int = 3) -> Callable[[Callable[[], _T]], _T]: ...
49+
@overload
50+
def run(tries: int, /) -> Callable[[Callable[[], _T]], _T]: ...
51+
52+
class ITransaction(Interface):
53+
user: str
54+
description: str
55+
extension: dict[str, Any]
56+
def commit() -> object: ...
57+
def abort() -> object: ...
58+
def doom() -> object: ...
59+
def savepoint(optimistic: bool = False) -> ISavepoint: ...
60+
def join(datamanager: _DataManager) -> object: ...
61+
def note(text: str) -> object: ...
62+
def setExtendedInfo(name: str, value: object) -> object: ...
63+
@overload
64+
def addBeforeCommitHook(hook: Callable[[], object], args: tuple[()] = (), kws: None = None) -> object: ...
65+
@overload
66+
def addBeforeCommitHook(hook: Callable[[Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
67+
@overload
68+
def addBeforeCommitHook(hook: Callable[..., object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
69+
def getBeforeCommitHooks() -> Iterable[tuple[Callable[..., object], Sequence[Any], dict[str, Any]]]: ...
70+
@overload
71+
def addAfterCommitHook(hook: Callable[[bool], object], args: tuple[()] = (), kws: None = None) -> object: ...
72+
@overload
73+
def addAfterCommitHook(hook: Callable[[bool, Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
74+
@overload
75+
def addAfterCommitHook(hook: Callable[[bool, Unpack[tuple[Any, ...]]], object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
76+
def getAfterCommitHooks() -> Iterable[tuple[Callable[[bool, Unpack[tuple[Any, ...]]], object], Sequence[Any], dict[str, Any]]]: ...
77+
@overload
78+
def addBeforeAbortHook(hook: Callable[[], object], args: tuple[()] = (), kws: None = None) -> object: ...
79+
@overload
80+
def addBeforeAbortHook(hook: Callable[[Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
81+
@overload
82+
def addBeforeAbortHook(hook: Callable[..., object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
83+
def getBeforeAbortHooks() -> Iterable[tuple[Callable[..., object], Sequence[Any], dict[str, Any]]]: ...
84+
@overload
85+
def addAfterAbortHook(hook: Callable[[], object], args: tuple[()] = (), kws: None = None) -> object: ...
86+
@overload
87+
def addAfterAbortHook(hook: Callable[[Unpack[_Ts]], object], args: tuple[Unpack[_Ts]], kws: None = None) -> object: ...
88+
@overload
89+
def addAfterAbortHook(hook: Callable[..., object], args: Sequence[Any], kws: dict[str, Any]) -> object: ...
90+
def getAfterAbortHooks() -> Iterable[tuple[Callable[..., object], Sequence[Any], dict[str, Any]]]: ...
91+
def set_data(ob: object, data: object) -> object: ...
92+
def data(ob: object) -> Any: ...
93+
def isRetryableError(error: BaseException) -> bool: ...
94+
95+
class IDataManager(Interface):
96+
transaction_manager: ITransactionManager
97+
def abort(transaction: ITransaction) -> object: ...
98+
def tpc_begin(transaction: ITransaction) -> object: ...
99+
def commit(transaction: ITransaction) -> object: ...
100+
def tpc_vote(transaction: ITransaction) -> object: ...
101+
def tpc_finish(transaction: ITransaction) -> object: ...
102+
def tpc_abort(transaction: ITransaction) -> object: ...
103+
def sortKey() -> str: ...
104+
105+
class ISavepointDataManager(IDataManager):
106+
def savepoint() -> IDataManagerSavepoint: ...
107+
108+
class IRetryDataManager(IDataManager):
109+
def should_retry(exception: BaseException) -> bool: ...
110+
111+
class IDataManagerSavepoint(Interface):
112+
def rollback() -> object: ...
113+
114+
class ISavepoint(Interface):
115+
def rollback() -> object: ...
116+
valid: bool
117+
118+
class InvalidSavepointRollbackError(Exception): ...
119+
120+
class ISynchronizer(Interface):
121+
def beforeCompletion(transaction: ITransaction) -> object: ...
122+
def afterCompletion(transaction: ITransaction) -> object: ...
123+
def newTransaction(transaction: ITransaction) -> object: ...
124+
125+
class TransactionError(Exception): ...
126+
class TransactionFailedError(TransactionError): ...
127+
class DoomedTransaction(TransactionError): ...
128+
class TransientError(TransactionError): ...
129+
class NoTransaction(TransactionError): ...
130+
class AlreadyInTransaction(TransactionError): ...

stubs/transaction/weakset.pyi

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from collections.abc import Callable
2+
from typing import Generic, TypeVar
3+
4+
from weakref import KeyedRef, WeakValueDictionary
5+
6+
_T = TypeVar("_T")
7+
8+
class WeakSet(Generic[_T]):
9+
data: WeakValueDictionary[int, _T]
10+
def __init__(self) -> None: ...
11+
def __len__(self) -> int: ...
12+
def __contains__(self, obj: object) -> bool: ...
13+
def add(self, obj: _T) -> None: ...
14+
def remove(self, obj: _T) -> None: ...
15+
def clear(self) -> None: ...
16+
def map(self, f: Callable[[_T], object]) -> None: ...
17+
def as_weakref_list(self) -> list[KeyedRef[int, _T]]: ...

stubs/zope/sqlalchemy/__init__.pyi

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from zope.sqlalchemy.datamanager import (
2+
ZopeTransactionEvents as ZopeTransactionEvents,
3+
mark_changed as mark_changed,
4+
register as register,
5+
)
6+
7+
invalidate = mark_changed

0 commit comments

Comments
 (0)