From d6dd5c2d9b4fbebb12b3191d7d86013f704d4c29 Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 11 Jan 2023 02:12:58 -0500 Subject: [PATCH 1/9] Use of twisted in pika --- stubs/pika/@tests/stubtest_allowlist.txt | 1 - stubs/pika/METADATA.toml | 1 + .../pika/pika/adapters/twisted_connection.pyi | 91 +++++++++++-------- 3 files changed, 53 insertions(+), 40 deletions(-) diff --git a/stubs/pika/@tests/stubtest_allowlist.txt b/stubs/pika/@tests/stubtest_allowlist.txt index 008ad7a1c170..e67afc3b23f4 100644 --- a/stubs/pika/@tests/stubtest_allowlist.txt +++ b/stubs/pika/@tests/stubtest_allowlist.txt @@ -5,7 +5,6 @@ pika.compat.StringIO.truncate # Requires external libraries to be installed. pika\.adapters\.gevent_connection.* pika\.adapters\.tornado_connection.* -pika\.adapters\.twisted_connection.* # Stubtest doesn't understand that a property alias is also read-only. pika.BlockingConnection.basic_nack diff --git a/stubs/pika/METADATA.toml b/stubs/pika/METADATA.toml index 828214149984..a7cc55900a57 100644 --- a/stubs/pika/METADATA.toml +++ b/stubs/pika/METADATA.toml @@ -1,4 +1,5 @@ version = "1.3.*" +requires = ["twisted"] stub_distribution = "types-pika-ts" # https://github.com/python/typeshed/issues/9246 extra_description = """\ The `types-pika` package contains alternate, more complete type stubs, that \ diff --git a/stubs/pika/pika/adapters/twisted_connection.pyi b/stubs/pika/pika/adapters/twisted_connection.pyi index 1e6a6ab292d1..c7888eca79b7 100644 --- a/stubs/pika/pika/adapters/twisted_connection.pyi +++ b/stubs/pika/pika/adapters/twisted_connection.pyi @@ -1,22 +1,23 @@ from _typeshed import Incomplete -from typing import Any, NamedTuple -from typing_extensions import TypeAlias +from typing import NamedTuple, TypeVar import pika.connection from pika.adapters.utils import nbio_interface +from twisted.internet import base, defer, interfaces, protocol +from twisted.python.failure import Failure -DeferredQueue: TypeAlias = Any # TODO: twisted.internet.defer.DeferredQueue -Protocol: TypeAlias = Any # TODO: twisted.internet.protocol.Protocol +_T = TypeVar("_T") LOGGER: Incomplete -class ClosableDeferredQueue(DeferredQueue): - closed: Incomplete +class ClosableDeferredQueue(defer.DeferredQueue[_T]): + closed: Failure | BaseException | None def __init__(self, size: Incomplete | None = ..., backlog: Incomplete | None = ...) -> None: ... - def put(self, obj): ... - def get(self): ... + # Returns a Deferred with an error if fails. None if success + def put(self, obj: _T) -> defer.Deferred[Failure | BaseException] | None: ... # type: ignore[override] + def get(self) -> defer.Deferred[Failure | BaseException | _T]: ... pending: Incomplete - def close(self, reason) -> None: ... + def close(self, reason: Failure | BaseException | None) -> None: ... class ReceivedMessage(NamedTuple): channel: Incomplete @@ -25,7 +26,7 @@ class ReceivedMessage(NamedTuple): body: Incomplete class TwistedChannel: - on_closed: Incomplete + on_closed: defer.Deferred[Incomplete | Failure | BaseException | None] def __init__(self, channel) -> None: ... @property def channel_number(self): ... @@ -44,7 +45,7 @@ class TwistedChannel: def callback_deferred(self, deferred, replies) -> None: ... def add_on_return_callback(self, callback): ... def basic_ack(self, delivery_tag: int = ..., multiple: bool = ...): ... - def basic_cancel(self, consumer_tag: str = ...): ... + def basic_cancel(self, consumer_tag: str = ...) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def basic_consume( self, queue, @@ -52,16 +53,22 @@ class TwistedChannel: exclusive: bool = ..., consumer_tag: Incomplete | None = ..., arguments: Incomplete | None = ..., - ): ... - def basic_get(self, queue, auto_ack: bool = ...): ... + ) -> defer.Deferred[Incomplete | Failure | BaseException]: ... + def basic_get(self, queue, auto_ack: bool = ...) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def basic_nack(self, delivery_tag: Incomplete | None = ..., multiple: bool = ..., requeue: bool = ...): ... - def basic_publish(self, exchange, routing_key, body, properties: Incomplete | None = ..., mandatory: bool = ...): ... - def basic_qos(self, prefetch_size: int = ..., prefetch_count: int = ..., global_qos: bool = ...): ... + def basic_publish( + self, exchange, routing_key, body, properties: Incomplete | None = ..., mandatory: bool = ... + ) -> defer.Deferred[Incomplete | Failure | BaseException]: ... + def basic_qos( + self, prefetch_size: int = ..., prefetch_count: int = ..., global_qos: bool = ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def basic_reject(self, delivery_tag, requeue: bool = ...): ... - def basic_recover(self, requeue: bool = ...): ... + def basic_recover(self, requeue: bool = ...) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def close(self, reply_code: int = ..., reply_text: str = ...): ... - def confirm_delivery(self): ... - def exchange_bind(self, destination, source, routing_key: str = ..., arguments: Incomplete | None = ...): ... + def confirm_delivery(self) -> defer.Deferred[Incomplete | None]: ... + def exchange_bind( + self, destination, source, routing_key: str = ..., arguments: Incomplete | None = ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def exchange_declare( self, exchange, @@ -71,18 +78,22 @@ class TwistedChannel: auto_delete: bool = ..., internal: bool = ..., arguments: Incomplete | None = ..., - ): ... - def exchange_delete(self, exchange: Incomplete | None = ..., if_unused: bool = ...): ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def exchange_delete( + self, exchange: Incomplete | None = ..., if_unused: bool = ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def exchange_unbind( self, destination: Incomplete | None = ..., source: Incomplete | None = ..., routing_key: str = ..., arguments: Incomplete | None = ..., - ): ... - def flow(self, active): ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def flow(self, active) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def open(self): ... - def queue_bind(self, queue, exchange, routing_key: Incomplete | None = ..., arguments: Incomplete | None = ...): ... + def queue_bind( + self, queue, exchange, routing_key: Incomplete | None = ..., arguments: Incomplete | None = ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def queue_declare( self, queue, @@ -91,37 +102,39 @@ class TwistedChannel: exclusive: bool = ..., auto_delete: bool = ..., arguments: Incomplete | None = ..., - ): ... - def queue_delete(self, queue, if_unused: bool = ..., if_empty: bool = ...): ... - def queue_purge(self, queue): ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def queue_delete( + self, queue, if_unused: bool = ..., if_empty: bool = ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def queue_purge(self, queue) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... def queue_unbind( self, queue, exchange: Incomplete | None = ..., routing_key: Incomplete | None = ..., arguments: Incomplete | None = ... - ): ... - def tx_commit(self): ... - def tx_rollback(self): ... - def tx_select(self): ... + ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def tx_commit(self) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def tx_rollback(self) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def tx_select(self) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... class _TwistedConnectionAdapter(pika.connection.Connection): def __init__(self, parameters, on_open_callback, on_open_error_callback, on_close_callback, custom_reactor) -> None: ... - def connection_made(self, transport) -> None: ... - def connection_lost(self, error) -> None: ... + def connection_made(self, transport: interfaces.ITransport) -> None: ... + def connection_lost(self, error: Failure) -> None: ... def data_received(self, data) -> None: ... -class TwistedProtocolConnection(Protocol): - ready: Incomplete - closed: Incomplete +class TwistedProtocolConnection(protocol.Protocol): + ready: defer.Deferred[None] | None + closed: defer.Deferred[None] | Failure | BaseException | None def __init__(self, parameters: Incomplete | None = ..., custom_reactor: Incomplete | None = ...) -> None: ... def channel(self, channel_number: Incomplete | None = ...): ... @property def is_open(self): ... @property def is_closed(self): ... - def close(self, reply_code: int = ..., reply_text: str = ...): ... + def close(self, reply_code: int = ..., reply_text: str = ...) -> defer.Deferred[None] | Failure | BaseException | None: ... def dataReceived(self, data) -> None: ... - def connectionLost(self, reason=...) -> None: ... - def makeConnection(self, transport) -> None: ... + def connectionLost(self, reason: Failure | BaseException = ...) -> None: ... + def makeConnection(self, transport: interfaces.ITransport) -> None: ... def connectionReady(self): ... class _TimerHandle(nbio_interface.AbstractTimerReference): - def __init__(self, handle) -> None: ... + def __init__(self, handle: base.DelayedCall) -> None: ... def cancel(self) -> None: ... From a0ce7c7a6d21cac7d3c1c8bdc458d3e122606835 Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 11 Jan 2023 19:59:04 -0500 Subject: [PATCH 2/9] Shimmed twisted in pika --- stubs/pika/@tests/stubtest_allowlist.txt | 6 +- stubs/pika/METADATA.toml | 1 - stubs/pika/pika/adapters/_twisted_shims.pyi | 205 ++++++++++++++++++ .../pika/pika/adapters/twisted_connection.pyi | 70 +++--- 4 files changed, 244 insertions(+), 38 deletions(-) create mode 100644 stubs/pika/pika/adapters/_twisted_shims.pyi diff --git a/stubs/pika/@tests/stubtest_allowlist.txt b/stubs/pika/@tests/stubtest_allowlist.txt index e67afc3b23f4..50dbf0403aa8 100644 --- a/stubs/pika/@tests/stubtest_allowlist.txt +++ b/stubs/pika/@tests/stubtest_allowlist.txt @@ -3,8 +3,10 @@ pika.compat.StringIO.seek pika.compat.StringIO.truncate # Requires external libraries to be installed. -pika\.adapters\.gevent_connection.* -pika\.adapters\.tornado_connection.* +pika.adapters.gevent_connection +pika.adapters.tornado_connection +pika.adapters.twisted_connection +pika.adapters._twisted_shims # Stubtest doesn't understand that a property alias is also read-only. pika.BlockingConnection.basic_nack diff --git a/stubs/pika/METADATA.toml b/stubs/pika/METADATA.toml index a7cc55900a57..828214149984 100644 --- a/stubs/pika/METADATA.toml +++ b/stubs/pika/METADATA.toml @@ -1,5 +1,4 @@ version = "1.3.*" -requires = ["twisted"] stub_distribution = "types-pika-ts" # https://github.com/python/typeshed/issues/9246 extra_description = """\ The `types-pika` package contains alternate, more complete type stubs, that \ diff --git a/stubs/pika/pika/adapters/_twisted_shims.pyi b/stubs/pika/pika/adapters/_twisted_shims.pyi new file mode 100644 index 000000000000..62d8dd9f6623 --- /dev/null +++ b/stubs/pika/pika/adapters/_twisted_shims.pyi @@ -0,0 +1,205 @@ +from _typeshed import Incomplete, Self +from asyncio import AbstractEventLoop, Future +from collections.abc import Awaitable, Callable, Coroutine, Generator, Iterable, Mapping, Sequence +from enum import Enum +from typing import Any, Generic, NoReturn, Protocol as _TypingProtocol, TypeVar +from typing_extensions import Literal, TypeAlias + +_T = TypeVar("_T") + +# region twisted.python.failure +class Failure(BaseException): + pickled: int + stack: Incomplete + count: Incomplete + type: Incomplete + captureVars: Incomplete + value: Incomplete + tb: Incomplete + parents: Incomplete + def __init__( + self, + exc_value: Incomplete | None = ..., + exc_type: Incomplete | None = ..., + exc_tb: Incomplete | None = ..., + captureVars: bool = ..., + ) -> None: ... + def trap(self, *errorTypes): ... + def check(self, *errorTypes): ... + def raiseException(self) -> NoReturn: ... + def throwExceptionIntoGenerator(self, g): ... + __dict__: Incomplete + def cleanFailure(self) -> None: ... + def getTracebackObject(self): ... + def getErrorMessage(self) -> str: ... + def getBriefTraceback(self) -> str: ... + def getTraceback(self, elideFrameworkCode: int = ..., detail: str = ...) -> str: ... + def printTraceback(self, file: Incomplete | None = ..., elideFrameworkCode: bool = ..., detail: str = ...) -> None: ... + def printBriefTraceback(self, file: Incomplete | None = ..., elideFrameworkCode: int = ...) -> None: ... + def printDetailedTraceback(self, file: Incomplete | None = ..., elideFrameworkCode: int = ...) -> None: ... + +# endregion + +# region twisted.internet.interfaces + +class Interface: # incomplete + def __init__(self, obj, alternate=...) -> None: ... + +class _InterfaceProtocol(_TypingProtocol): # incomplete + def __init__(self, obj, alternate=...) -> None: ... + +class IAddress(Interface): ... + +class IDelayedCall(Interface): + def getTime(self) -> float: ... + def cancel(self) -> None: ... + def delay(self, secondsLater: float) -> None: ... + def reset(sself, econdsFromNow: float) -> None: ... + def active(self) -> bool: ... + +class IReactorTime(_InterfaceProtocol): + def seconds(self) -> float: ... + def callLater(self, delay: float, callable: Callable[..., Any], *args: object, **kwargs: object) -> IDelayedCall: ... + def getDelayedCalls(self) -> Sequence[IDelayedCall]: ... + +class ITransport(_InterfaceProtocol): + def write(self, data: bytes) -> None: ... + def writeSequence(self, data: Iterable[bytes]) -> None: ... + def loseConnection(self) -> None: ... + def getPeer(self) -> IAddress: ... + def getHost(self) -> IAddress: ... + +# endregion + +# region twisted.internet.base +class _Sentinel(Enum): + _NO_RESULT = object() + _CONTINUE = object() + +DeferredCallback: TypeAlias = Callable[..., object] +DeferredErrback: TypeAlias = Callable[..., object] +_CallbackOrderedArguments: TypeAlias = tuple[object, ...] +_CallbackKeywordArguments: TypeAlias = Mapping[str, object] +_CallbackChain: TypeAlias = tuple[ + tuple[DeferredCallback | Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments], + tuple[ + DeferredErrback | DeferredCallback, Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments, + ], +] +_DeferredResultT = TypeVar("_DeferredResultT", contravariant=True) +_NextDeferredResultT = TypeVar("_NextDeferredResultT", covariant=True) + +class DelayedCall(_TypingProtocol): + debug: bool + creator: Sequence[str] | None + resetter: Incomplete + canceller: Incomplete + seconds: Incomplete + cancelled: int + delayed_time: float + def __init__( + self, + time: float, + func: Callable[..., Any], + args: Sequence[object], + kw: dict[str, object], + cancel: Callable[[DelayedCall], None], + reset: Callable[[DelayedCall], None], + seconds: Callable[[], float] = ..., + ) -> None: ... + def getTime(self) -> float: ... + def cancel(self) -> None: ... + time: Incomplete + def reset(self, secondsFromNow: float) -> None: ... + def delay(self, secondsLater: float) -> None: ... + def activate_delay(self) -> None: ... + def active(self) -> bool: ... + def __le__(self, other: object) -> bool: ... + def __lt__(self, other: object) -> bool: ... + +# Variance: This is how it's typed in source +class Deferred(Awaitable[_DeferredResultT]): # type: ignore[type-var] # pyright: ignore[reportGeneralTypeIssues] + called: bool + paused: int + debug: bool + callbacks: list[_CallbackChain] + def __init__(self, canceller: Callable[[Deferred[Any]], None] | None = ...) -> None: ... + def addCallbacks( + self, + callback: Callable[..., _NextDeferredResultT | Deferred[_NextDeferredResultT]], + errback: Callable[..., Failure | _NextDeferredResultT | Deferred[_NextDeferredResultT]] = ..., + callbackArgs: _CallbackOrderedArguments = ..., + callbackKeywords: _CallbackKeywordArguments = ..., + errbackArgs: _CallbackOrderedArguments = ..., + errbackKeywords: _CallbackKeywordArguments = ..., + ) -> Deferred[_NextDeferredResultT]: ... + def addCallback( + self, callback: Callable[..., _NextDeferredResultT | Deferred[_NextDeferredResultT]], *args: object, **kwargs: object + ) -> Deferred[_NextDeferredResultT]: ... + def addErrback( + self, + errback: Callable[..., Failure | _NextDeferredResultT | Deferred[_NextDeferredResultT]], + *args: object, + **kwargs: object, + ) -> Deferred[_DeferredResultT | _NextDeferredResultT]: ... + def addBoth( + self, callback: Callable[..., _NextDeferredResultT | Deferred[_NextDeferredResultT]], *args: object, **kwargs: object + ) -> Deferred[_NextDeferredResultT]: ... + def addTimeout( + self, timeout: float, clock: IReactorTime, onTimeoutCancel: Callable[[object, float], object] | None = ... + ) -> Deferred[_DeferredResultT]: ... + def chainDeferred(self, d: Deferred[_DeferredResultT]) -> Deferred[None]: ... + def callback(self, result: _DeferredResultT | Failure) -> None: ... + def errback(self, fail: Failure | BaseException | None = ...) -> None: ... + def pause(self) -> None: ... + def unpause(self) -> None: ... + def cancel(self) -> None: ... + def __iter__(self) -> Deferred[_DeferredResultT]: ... + def send(self, value: object = ...) -> Deferred[_DeferredResultT]: ... + def __await__(self) -> Generator[Any, None, _DeferredResultT]: ... + __next__: Incomplete + def asFuture(self, loop: AbstractEventLoop) -> Future[_DeferredResultT]: ... + @classmethod + def fromFuture(cls, future: Future[Incomplete]) -> Deferred[Any]: ... + @classmethod + def fromCoroutine(cls, coro: Coroutine[Deferred[_T], Any, _T] | Generator[Deferred[_T], Any, _T]) -> Deferred[_T]: ... + +class DeferredQueue(Generic[_T]): + waiting: list[Deferred[_T]] + pending: list[_T] + size: int | None + backlog: int | None + def __init__(self, size: int | None = ..., backlog: int | None = ...) -> None: ... + def put(self, obj: _T) -> None: ... + def get(self) -> Deferred[_T]: ... + +# endregion + +# region twisted.internet.protocol + +class Factory: + protocol: Callable[[], Protocol] | None + numPorts: int + noisy: bool + @classmethod + def forProtocol(cls: type[Self], protocol: Protocol, *args, **kwargs) -> Self: ... + def logPrefix(self): ... + def doStart(self) -> None: ... + def doStop(self) -> None: ... + def startFactory(self) -> None: ... + def stopFactory(self) -> None: ... + def buildProtocol(self, addr: IAddress) -> Protocol | None: ... + +class BaseProtocol: + connected: int + transport: ITransport | None + def makeConnection(self, transport) -> None: ... + def connectionMade(self) -> None: ... + +class Protocol(BaseProtocol): + factory: Factory | None + def logPrefix(self): ... + def dataReceived(self, data: bytes): ... + def connectionLost(self, reason: BaseException = ...): ... + +# endregion diff --git a/stubs/pika/pika/adapters/twisted_connection.pyi b/stubs/pika/pika/adapters/twisted_connection.pyi index c7888eca79b7..56bad6795aed 100644 --- a/stubs/pika/pika/adapters/twisted_connection.pyi +++ b/stubs/pika/pika/adapters/twisted_connection.pyi @@ -3,21 +3,21 @@ from typing import NamedTuple, TypeVar import pika.connection from pika.adapters.utils import nbio_interface -from twisted.internet import base, defer, interfaces, protocol -from twisted.python.failure import Failure + +from ._twisted_shims import Deferred, DeferredQueue, DelayedCall, Failure, ITransport, Protocol _T = TypeVar("_T") LOGGER: Incomplete -class ClosableDeferredQueue(defer.DeferredQueue[_T]): +class ClosableDeferredQueue(DeferredQueue[_T]): closed: Failure | BaseException | None def __init__(self, size: Incomplete | None = ..., backlog: Incomplete | None = ...) -> None: ... # Returns a Deferred with an error if fails. None if success - def put(self, obj: _T) -> defer.Deferred[Failure | BaseException] | None: ... # type: ignore[override] - def get(self) -> defer.Deferred[Failure | BaseException | _T]: ... + def put(self, obj: _T) -> Deferred[Failure | BaseException] | None: ... # type: ignore[override] + def get(self) -> Deferred[Failure | BaseException | _T]: ... pending: Incomplete - def close(self, reason: Failure | BaseException | None) -> None: ... + def close(self, reason: BaseException | None) -> None: ... class ReceivedMessage(NamedTuple): channel: Incomplete @@ -26,7 +26,7 @@ class ReceivedMessage(NamedTuple): body: Incomplete class TwistedChannel: - on_closed: defer.Deferred[Incomplete | Failure | BaseException | None] + on_closed: Deferred[Incomplete | Failure | BaseException | None] def __init__(self, channel) -> None: ... @property def channel_number(self): ... @@ -45,7 +45,7 @@ class TwistedChannel: def callback_deferred(self, deferred, replies) -> None: ... def add_on_return_callback(self, callback): ... def basic_ack(self, delivery_tag: int = ..., multiple: bool = ...): ... - def basic_cancel(self, consumer_tag: str = ...) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def basic_cancel(self, consumer_tag: str = ...) -> Deferred[Incomplete | Failure | BaseException | None]: ... def basic_consume( self, queue, @@ -53,22 +53,22 @@ class TwistedChannel: exclusive: bool = ..., consumer_tag: Incomplete | None = ..., arguments: Incomplete | None = ..., - ) -> defer.Deferred[Incomplete | Failure | BaseException]: ... - def basic_get(self, queue, auto_ack: bool = ...) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException]: ... + def basic_get(self, queue, auto_ack: bool = ...) -> Deferred[Incomplete | Failure | BaseException | None]: ... def basic_nack(self, delivery_tag: Incomplete | None = ..., multiple: bool = ..., requeue: bool = ...): ... def basic_publish( self, exchange, routing_key, body, properties: Incomplete | None = ..., mandatory: bool = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException]: ... + ) -> Deferred[Incomplete | Failure | BaseException]: ... def basic_qos( self, prefetch_size: int = ..., prefetch_count: int = ..., global_qos: bool = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... def basic_reject(self, delivery_tag, requeue: bool = ...): ... - def basic_recover(self, requeue: bool = ...) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + def basic_recover(self, requeue: bool = ...) -> Deferred[Incomplete | Failure | BaseException | None]: ... def close(self, reply_code: int = ..., reply_text: str = ...): ... - def confirm_delivery(self) -> defer.Deferred[Incomplete | None]: ... + def confirm_delivery(self) -> Deferred[Incomplete | None]: ... def exchange_bind( self, destination, source, routing_key: str = ..., arguments: Incomplete | None = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... def exchange_declare( self, exchange, @@ -78,22 +78,22 @@ class TwistedChannel: auto_delete: bool = ..., internal: bool = ..., arguments: Incomplete | None = ..., - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... def exchange_delete( self, exchange: Incomplete | None = ..., if_unused: bool = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... def exchange_unbind( self, destination: Incomplete | None = ..., source: Incomplete | None = ..., routing_key: str = ..., arguments: Incomplete | None = ..., - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... - def flow(self, active) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... + def flow(self, active) -> Deferred[Incomplete | Failure | BaseException | None]: ... def open(self): ... def queue_bind( self, queue, exchange, routing_key: Incomplete | None = ..., arguments: Incomplete | None = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... def queue_declare( self, queue, @@ -102,39 +102,39 @@ class TwistedChannel: exclusive: bool = ..., auto_delete: bool = ..., arguments: Incomplete | None = ..., - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... def queue_delete( self, queue, if_unused: bool = ..., if_empty: bool = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... - def queue_purge(self, queue) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... + def queue_purge(self, queue) -> Deferred[Incomplete | Failure | BaseException | None]: ... def queue_unbind( self, queue, exchange: Incomplete | None = ..., routing_key: Incomplete | None = ..., arguments: Incomplete | None = ... - ) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... - def tx_commit(self) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... - def tx_rollback(self) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... - def tx_select(self) -> defer.Deferred[Incomplete | Failure | BaseException | None]: ... + ) -> Deferred[Incomplete | Failure | BaseException | None]: ... + def tx_commit(self) -> Deferred[Incomplete | Failure | BaseException | None]: ... + def tx_rollback(self) -> Deferred[Incomplete | Failure | BaseException | None]: ... + def tx_select(self) -> Deferred[Incomplete | Failure | BaseException | None]: ... class _TwistedConnectionAdapter(pika.connection.Connection): def __init__(self, parameters, on_open_callback, on_open_error_callback, on_close_callback, custom_reactor) -> None: ... - def connection_made(self, transport: interfaces.ITransport) -> None: ... - def connection_lost(self, error: Failure) -> None: ... + def connection_made(self, transport: ITransport) -> None: ... + def connection_lost(self, error: Exception) -> None: ... def data_received(self, data) -> None: ... -class TwistedProtocolConnection(protocol.Protocol): - ready: defer.Deferred[None] | None - closed: defer.Deferred[None] | Failure | BaseException | None +class TwistedProtocolConnection(Protocol): + ready: Deferred[None] | None + closed: Deferred[None] | Failure | BaseException | None def __init__(self, parameters: Incomplete | None = ..., custom_reactor: Incomplete | None = ...) -> None: ... def channel(self, channel_number: Incomplete | None = ...): ... @property def is_open(self): ... @property def is_closed(self): ... - def close(self, reply_code: int = ..., reply_text: str = ...) -> defer.Deferred[None] | Failure | BaseException | None: ... + def close(self, reply_code: int = ..., reply_text: str = ...) -> Deferred[None] | Failure | BaseException | None: ... def dataReceived(self, data) -> None: ... def connectionLost(self, reason: Failure | BaseException = ...) -> None: ... - def makeConnection(self, transport: interfaces.ITransport) -> None: ... + def makeConnection(self, transport: ITransport) -> None: ... def connectionReady(self): ... class _TimerHandle(nbio_interface.AbstractTimerReference): - def __init__(self, handle: base.DelayedCall) -> None: ... + def __init__(self, handle: DelayedCall) -> None: ... def cancel(self) -> None: ... From bacf27586ec1dc638b38c4b46d3e8bd392e5a4f6 Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 11 Jan 2023 21:16:38 -0500 Subject: [PATCH 3/9] Specify requirements-stubtest --- stubs/pika/@tests/requirements-stubtest.txt | 2 ++ stubs/pika/@tests/stubtest_allowlist.txt | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 stubs/pika/@tests/requirements-stubtest.txt diff --git a/stubs/pika/@tests/requirements-stubtest.txt b/stubs/pika/@tests/requirements-stubtest.txt new file mode 100644 index 000000000000..9dbdf66db808 --- /dev/null +++ b/stubs/pika/@tests/requirements-stubtest.txt @@ -0,0 +1,2 @@ +twisted +tornado diff --git a/stubs/pika/@tests/stubtest_allowlist.txt b/stubs/pika/@tests/stubtest_allowlist.txt index 50dbf0403aa8..fc5dd77f4a17 100644 --- a/stubs/pika/@tests/stubtest_allowlist.txt +++ b/stubs/pika/@tests/stubtest_allowlist.txt @@ -4,8 +4,6 @@ pika.compat.StringIO.truncate # Requires external libraries to be installed. pika.adapters.gevent_connection -pika.adapters.tornado_connection -pika.adapters.twisted_connection pika.adapters._twisted_shims # Stubtest doesn't understand that a property alias is also read-only. From 20daf8c7b74545b8ef312ecfa5db8194f8d89d52 Mon Sep 17 00:00:00 2001 From: Avasam Date: Thu, 12 Jan 2023 09:35:37 -0500 Subject: [PATCH 4/9] Apply suggestions from code review --- stubs/pika/@tests/requirements-stubtest.txt | 1 + stubs/pika/@tests/stubtest_allowlist.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/pika/@tests/requirements-stubtest.txt b/stubs/pika/@tests/requirements-stubtest.txt index 9dbdf66db808..483fd5f8ba3c 100644 --- a/stubs/pika/@tests/requirements-stubtest.txt +++ b/stubs/pika/@tests/requirements-stubtest.txt @@ -1,2 +1,3 @@ twisted +gevent tornado diff --git a/stubs/pika/@tests/stubtest_allowlist.txt b/stubs/pika/@tests/stubtest_allowlist.txt index fc5dd77f4a17..d6e64f8a4529 100644 --- a/stubs/pika/@tests/stubtest_allowlist.txt +++ b/stubs/pika/@tests/stubtest_allowlist.txt @@ -3,7 +3,6 @@ pika.compat.StringIO.seek pika.compat.StringIO.truncate # Requires external libraries to be installed. -pika.adapters.gevent_connection pika.adapters._twisted_shims # Stubtest doesn't understand that a property alias is also read-only. From 74b37ebd3e35eda0616f235aea1408fdbecd0e76 Mon Sep 17 00:00:00 2001 From: Avasam Date: Thu, 12 Jan 2023 09:38:44 -0500 Subject: [PATCH 5/9] Update stubs/pika/@tests/stubtest_allowlist.txt Co-authored-by: Alex Waygood --- stubs/pika/@tests/stubtest_allowlist.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/pika/@tests/stubtest_allowlist.txt b/stubs/pika/@tests/stubtest_allowlist.txt index d6e64f8a4529..5cee67d269b8 100644 --- a/stubs/pika/@tests/stubtest_allowlist.txt +++ b/stubs/pika/@tests/stubtest_allowlist.txt @@ -2,7 +2,7 @@ pika.compat.StringIO.seek pika.compat.StringIO.truncate -# Requires external libraries to be installed. +# Fake module so we don't have to declare a dependency on `twisted` just for an optional backend pika.adapters._twisted_shims # Stubtest doesn't understand that a property alias is also read-only. From 3e0ffa213810eefa8d92e8ed7e534e0562a38858 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 1 Feb 2023 04:03:47 +0000 Subject: [PATCH 6/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/pika/@tests/requirements-stubtest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/pika/@tests/requirements-stubtest.txt b/stubs/pika/@tests/requirements-stubtest.txt index 483fd5f8ba3c..11c4ad02f53a 100644 --- a/stubs/pika/@tests/requirements-stubtest.txt +++ b/stubs/pika/@tests/requirements-stubtest.txt @@ -1,3 +1,3 @@ -twisted gevent tornado +twisted From 5bb6334244c23b6d051e36129fc22f6b45eaae81 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:50:01 +0000 Subject: [PATCH 7/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/pika/pika/adapters/_twisted_shims.pyi | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stubs/pika/pika/adapters/_twisted_shims.pyi b/stubs/pika/pika/adapters/_twisted_shims.pyi index 62d8dd9f6623..51e3d98aee42 100644 --- a/stubs/pika/pika/adapters/_twisted_shims.pyi +++ b/stubs/pika/pika/adapters/_twisted_shims.pyi @@ -82,9 +82,7 @@ _CallbackOrderedArguments: TypeAlias = tuple[object, ...] _CallbackKeywordArguments: TypeAlias = Mapping[str, object] _CallbackChain: TypeAlias = tuple[ tuple[DeferredCallback | Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments], - tuple[ - DeferredErrback | DeferredCallback, Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments, - ], + tuple[DeferredErrback | DeferredCallback, Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments], ] _DeferredResultT = TypeVar("_DeferredResultT", contravariant=True) _NextDeferredResultT = TypeVar("_NextDeferredResultT", covariant=True) From 29510eda9e60124a0f21dd958d30cfc268cc87a2 Mon Sep 17 00:00:00 2001 From: Avasam Date: Mon, 27 Feb 2023 18:55:35 -0500 Subject: [PATCH 8/9] Update stubtest requiremetns location --- stubs/pika/@tests/requirements-stubtest.txt | 3 --- stubs/pika/METADATA.toml | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 stubs/pika/@tests/requirements-stubtest.txt diff --git a/stubs/pika/@tests/requirements-stubtest.txt b/stubs/pika/@tests/requirements-stubtest.txt deleted file mode 100644 index 11c4ad02f53a..000000000000 --- a/stubs/pika/@tests/requirements-stubtest.txt +++ /dev/null @@ -1,3 +0,0 @@ -gevent -tornado -twisted diff --git a/stubs/pika/METADATA.toml b/stubs/pika/METADATA.toml index 82393b7a899c..d1d388dbdcb5 100644 --- a/stubs/pika/METADATA.toml +++ b/stubs/pika/METADATA.toml @@ -4,3 +4,6 @@ extra_description = """\ The `types-pika` package contains alternate, more complete type stubs, that \ are maintained outside of typeshed.\ """ + +[tool.stubtest] +stubtest_requirements = ["gevent", "tornado", "twisted"] From 12f0bcc01f1f8f3fdc4f628ef98e4e5e71af480f Mon Sep 17 00:00:00 2001 From: Avasam Date: Wed, 22 Mar 2023 12:53:13 -0400 Subject: [PATCH 9/9] Try twisted in pika without shims --- stubs/pika/@tests/stubtest_allowlist.txt | 20 +- stubs/pika/pika/adapters/_twisted_shims.pyi | 203 ------------------ .../pika/pika/adapters/twisted_connection.pyi | 16 +- tests/pytype_exclude_list.txt | 3 + 4 files changed, 19 insertions(+), 223 deletions(-) delete mode 100644 stubs/pika/pika/adapters/_twisted_shims.pyi diff --git a/stubs/pika/@tests/stubtest_allowlist.txt b/stubs/pika/@tests/stubtest_allowlist.txt index 452a12273986..711d3d08ac05 100644 --- a/stubs/pika/@tests/stubtest_allowlist.txt +++ b/stubs/pika/@tests/stubtest_allowlist.txt @@ -2,22 +2,12 @@ pika.compat.StringIO.seek pika.compat.StringIO.truncate -# Fake module so we don't have to declare a dependency on `twisted` just for an optional backend -pika.adapters._twisted_shims - # Stubtest doesn't understand that a property alias is also read-only. -pika.BlockingConnection.basic_nack -pika.BlockingConnection.consumer_cancel_notify -pika.BlockingConnection.exchange_exchange_bindings -pika.BlockingConnection.publisher_confirms -pika.adapters.BlockingConnection.basic_nack -pika.adapters.BlockingConnection.consumer_cancel_notify -pika.adapters.BlockingConnection.exchange_exchange_bindings -pika.adapters.BlockingConnection.publisher_confirms -pika.adapters.blocking_connection.BlockingConnection.basic_nack -pika.adapters.blocking_connection.BlockingConnection.consumer_cancel_notify -pika.adapters.blocking_connection.BlockingConnection.exchange_exchange_bindings -pika.adapters.blocking_connection.BlockingConnection.publisher_confirms +# https://github.com/python/mypy/issues/13975 +pika(\.adapters)?(\.blocking_connection)?\.BlockingConnection\.basic_nack +pika(\.adapters)?(\.blocking_connection)?\.BlockingConnection\.consumer_cancel_notify +pika(\.adapters)?(\.blocking_connection)?\.BlockingConnection\.exchange_exchange_bindings +pika(\.adapters)?(\.blocking_connection)?\.BlockingConnection\.publisher_confirms # The implementation has defaults for the arguments that would make the # created instances unusable, so we require the arguments in the stub. diff --git a/stubs/pika/pika/adapters/_twisted_shims.pyi b/stubs/pika/pika/adapters/_twisted_shims.pyi deleted file mode 100644 index 51e3d98aee42..000000000000 --- a/stubs/pika/pika/adapters/_twisted_shims.pyi +++ /dev/null @@ -1,203 +0,0 @@ -from _typeshed import Incomplete, Self -from asyncio import AbstractEventLoop, Future -from collections.abc import Awaitable, Callable, Coroutine, Generator, Iterable, Mapping, Sequence -from enum import Enum -from typing import Any, Generic, NoReturn, Protocol as _TypingProtocol, TypeVar -from typing_extensions import Literal, TypeAlias - -_T = TypeVar("_T") - -# region twisted.python.failure -class Failure(BaseException): - pickled: int - stack: Incomplete - count: Incomplete - type: Incomplete - captureVars: Incomplete - value: Incomplete - tb: Incomplete - parents: Incomplete - def __init__( - self, - exc_value: Incomplete | None = ..., - exc_type: Incomplete | None = ..., - exc_tb: Incomplete | None = ..., - captureVars: bool = ..., - ) -> None: ... - def trap(self, *errorTypes): ... - def check(self, *errorTypes): ... - def raiseException(self) -> NoReturn: ... - def throwExceptionIntoGenerator(self, g): ... - __dict__: Incomplete - def cleanFailure(self) -> None: ... - def getTracebackObject(self): ... - def getErrorMessage(self) -> str: ... - def getBriefTraceback(self) -> str: ... - def getTraceback(self, elideFrameworkCode: int = ..., detail: str = ...) -> str: ... - def printTraceback(self, file: Incomplete | None = ..., elideFrameworkCode: bool = ..., detail: str = ...) -> None: ... - def printBriefTraceback(self, file: Incomplete | None = ..., elideFrameworkCode: int = ...) -> None: ... - def printDetailedTraceback(self, file: Incomplete | None = ..., elideFrameworkCode: int = ...) -> None: ... - -# endregion - -# region twisted.internet.interfaces - -class Interface: # incomplete - def __init__(self, obj, alternate=...) -> None: ... - -class _InterfaceProtocol(_TypingProtocol): # incomplete - def __init__(self, obj, alternate=...) -> None: ... - -class IAddress(Interface): ... - -class IDelayedCall(Interface): - def getTime(self) -> float: ... - def cancel(self) -> None: ... - def delay(self, secondsLater: float) -> None: ... - def reset(sself, econdsFromNow: float) -> None: ... - def active(self) -> bool: ... - -class IReactorTime(_InterfaceProtocol): - def seconds(self) -> float: ... - def callLater(self, delay: float, callable: Callable[..., Any], *args: object, **kwargs: object) -> IDelayedCall: ... - def getDelayedCalls(self) -> Sequence[IDelayedCall]: ... - -class ITransport(_InterfaceProtocol): - def write(self, data: bytes) -> None: ... - def writeSequence(self, data: Iterable[bytes]) -> None: ... - def loseConnection(self) -> None: ... - def getPeer(self) -> IAddress: ... - def getHost(self) -> IAddress: ... - -# endregion - -# region twisted.internet.base -class _Sentinel(Enum): - _NO_RESULT = object() - _CONTINUE = object() - -DeferredCallback: TypeAlias = Callable[..., object] -DeferredErrback: TypeAlias = Callable[..., object] -_CallbackOrderedArguments: TypeAlias = tuple[object, ...] -_CallbackKeywordArguments: TypeAlias = Mapping[str, object] -_CallbackChain: TypeAlias = tuple[ - tuple[DeferredCallback | Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments], - tuple[DeferredErrback | DeferredCallback, Literal[_Sentinel._CONTINUE], _CallbackOrderedArguments, _CallbackKeywordArguments], -] -_DeferredResultT = TypeVar("_DeferredResultT", contravariant=True) -_NextDeferredResultT = TypeVar("_NextDeferredResultT", covariant=True) - -class DelayedCall(_TypingProtocol): - debug: bool - creator: Sequence[str] | None - resetter: Incomplete - canceller: Incomplete - seconds: Incomplete - cancelled: int - delayed_time: float - def __init__( - self, - time: float, - func: Callable[..., Any], - args: Sequence[object], - kw: dict[str, object], - cancel: Callable[[DelayedCall], None], - reset: Callable[[DelayedCall], None], - seconds: Callable[[], float] = ..., - ) -> None: ... - def getTime(self) -> float: ... - def cancel(self) -> None: ... - time: Incomplete - def reset(self, secondsFromNow: float) -> None: ... - def delay(self, secondsLater: float) -> None: ... - def activate_delay(self) -> None: ... - def active(self) -> bool: ... - def __le__(self, other: object) -> bool: ... - def __lt__(self, other: object) -> bool: ... - -# Variance: This is how it's typed in source -class Deferred(Awaitable[_DeferredResultT]): # type: ignore[type-var] # pyright: ignore[reportGeneralTypeIssues] - called: bool - paused: int - debug: bool - callbacks: list[_CallbackChain] - def __init__(self, canceller: Callable[[Deferred[Any]], None] | None = ...) -> None: ... - def addCallbacks( - self, - callback: Callable[..., _NextDeferredResultT | Deferred[_NextDeferredResultT]], - errback: Callable[..., Failure | _NextDeferredResultT | Deferred[_NextDeferredResultT]] = ..., - callbackArgs: _CallbackOrderedArguments = ..., - callbackKeywords: _CallbackKeywordArguments = ..., - errbackArgs: _CallbackOrderedArguments = ..., - errbackKeywords: _CallbackKeywordArguments = ..., - ) -> Deferred[_NextDeferredResultT]: ... - def addCallback( - self, callback: Callable[..., _NextDeferredResultT | Deferred[_NextDeferredResultT]], *args: object, **kwargs: object - ) -> Deferred[_NextDeferredResultT]: ... - def addErrback( - self, - errback: Callable[..., Failure | _NextDeferredResultT | Deferred[_NextDeferredResultT]], - *args: object, - **kwargs: object, - ) -> Deferred[_DeferredResultT | _NextDeferredResultT]: ... - def addBoth( - self, callback: Callable[..., _NextDeferredResultT | Deferred[_NextDeferredResultT]], *args: object, **kwargs: object - ) -> Deferred[_NextDeferredResultT]: ... - def addTimeout( - self, timeout: float, clock: IReactorTime, onTimeoutCancel: Callable[[object, float], object] | None = ... - ) -> Deferred[_DeferredResultT]: ... - def chainDeferred(self, d: Deferred[_DeferredResultT]) -> Deferred[None]: ... - def callback(self, result: _DeferredResultT | Failure) -> None: ... - def errback(self, fail: Failure | BaseException | None = ...) -> None: ... - def pause(self) -> None: ... - def unpause(self) -> None: ... - def cancel(self) -> None: ... - def __iter__(self) -> Deferred[_DeferredResultT]: ... - def send(self, value: object = ...) -> Deferred[_DeferredResultT]: ... - def __await__(self) -> Generator[Any, None, _DeferredResultT]: ... - __next__: Incomplete - def asFuture(self, loop: AbstractEventLoop) -> Future[_DeferredResultT]: ... - @classmethod - def fromFuture(cls, future: Future[Incomplete]) -> Deferred[Any]: ... - @classmethod - def fromCoroutine(cls, coro: Coroutine[Deferred[_T], Any, _T] | Generator[Deferred[_T], Any, _T]) -> Deferred[_T]: ... - -class DeferredQueue(Generic[_T]): - waiting: list[Deferred[_T]] - pending: list[_T] - size: int | None - backlog: int | None - def __init__(self, size: int | None = ..., backlog: int | None = ...) -> None: ... - def put(self, obj: _T) -> None: ... - def get(self) -> Deferred[_T]: ... - -# endregion - -# region twisted.internet.protocol - -class Factory: - protocol: Callable[[], Protocol] | None - numPorts: int - noisy: bool - @classmethod - def forProtocol(cls: type[Self], protocol: Protocol, *args, **kwargs) -> Self: ... - def logPrefix(self): ... - def doStart(self) -> None: ... - def doStop(self) -> None: ... - def startFactory(self) -> None: ... - def stopFactory(self) -> None: ... - def buildProtocol(self, addr: IAddress) -> Protocol | None: ... - -class BaseProtocol: - connected: int - transport: ITransport | None - def makeConnection(self, transport) -> None: ... - def connectionMade(self) -> None: ... - -class Protocol(BaseProtocol): - factory: Factory | None - def logPrefix(self): ... - def dataReceived(self, data: bytes): ... - def connectionLost(self, reason: BaseException = ...): ... - -# endregion diff --git a/stubs/pika/pika/adapters/twisted_connection.pyi b/stubs/pika/pika/adapters/twisted_connection.pyi index 56bad6795aed..a6530488369d 100644 --- a/stubs/pika/pika/adapters/twisted_connection.pyi +++ b/stubs/pika/pika/adapters/twisted_connection.pyi @@ -1,20 +1,26 @@ +# twisted is optional and self-contained in this module. +# We don't want to force it as a dependency but that means we also can't test it with type-checkers given the current setup. + from _typeshed import Incomplete from typing import NamedTuple, TypeVar import pika.connection from pika.adapters.utils import nbio_interface - -from ._twisted_shims import Deferred, DeferredQueue, DelayedCall, Failure, ITransport, Protocol +from twisted.internet.base import DelayedCall # type: ignore[import] # pyright: ignore[reportMissingImports] +from twisted.internet.defer import Deferred, DeferredQueue # type: ignore[import] # pyright: ignore[reportMissingImports] +from twisted.internet.interfaces import ITransport # type: ignore[import] # pyright: ignore[reportMissingImports] +from twisted.internet.protocol import Protocol # type: ignore[import] # pyright: ignore[reportMissingImports] +from twisted.python.failure import Failure # type: ignore[import] # pyright: ignore[reportMissingImports] _T = TypeVar("_T") LOGGER: Incomplete -class ClosableDeferredQueue(DeferredQueue[_T]): +class ClosableDeferredQueue(DeferredQueue[_T]): # pyright: ignore[reportUntypedBaseClass] closed: Failure | BaseException | None def __init__(self, size: Incomplete | None = ..., backlog: Incomplete | None = ...) -> None: ... # Returns a Deferred with an error if fails. None if success - def put(self, obj: _T) -> Deferred[Failure | BaseException] | None: ... # type: ignore[override] + def put(self, obj: _T) -> Deferred[Failure | BaseException] | None: ... # type: ignore[override] # pyright: ignore[reportInvalidTypeVarUse] def get(self) -> Deferred[Failure | BaseException | _T]: ... pending: Incomplete def close(self, reason: BaseException | None) -> None: ... @@ -120,7 +126,7 @@ class _TwistedConnectionAdapter(pika.connection.Connection): def connection_lost(self, error: Exception) -> None: ... def data_received(self, data) -> None: ... -class TwistedProtocolConnection(Protocol): +class TwistedProtocolConnection(Protocol): # pyright: ignore[reportUntypedBaseClass] ready: Deferred[None] | None closed: Deferred[None] | Failure | BaseException | None def __init__(self, parameters: Incomplete | None = ..., custom_reactor: Incomplete | None = ...) -> None: ... diff --git a/tests/pytype_exclude_list.txt b/tests/pytype_exclude_list.txt index 562e4fe2bb66..ff83a0ce7990 100644 --- a/tests/pytype_exclude_list.txt +++ b/tests/pytype_exclude_list.txt @@ -10,6 +10,9 @@ stubs/mysqlclient/MySQLdb/__init__.pyi stubs/mysqlclient/MySQLdb/connections.pyi stubs/mysqlclient/MySQLdb/cursors.pyi +# twisted not installed during tests +stubs/pika/pika/adapters/twisted_connection.pyi + # _pb2.pyi have some constructs that break pytype # Eg # pytype.pyi.parser.ParseError: File: "/Users/nipunn/src/typeshed/third_party/2and3/google/protobuf/descriptor_pb2.pyi", line 195