Skip to content

Commit a057272

Browse files
authored
[pika] Complete adapters (#16073)
1 parent 58fdb3d commit a057272

10 files changed

Lines changed: 503 additions & 309 deletions

stubs/pika/@tests/stubtest_allowlist.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,29 @@ pika.connection.ConnectionParameters.T
1212

1313
# Arguments have a sentinel default, which is not reflected in the stubs.
1414
pika.connection.ConnectionParameters.__init__
15+
16+
# These are defined as None, but on initialization are set as callable attributes.
17+
pika.adapters.base_connection._StreamingProtocolShim.connection_made
18+
pika.adapters.base_connection._StreamingProtocolShim.connection_lost
19+
pika.adapters.base_connection._StreamingProtocolShim.eof_received
20+
pika.adapters.base_connection._StreamingProtocolShim.data_received
21+
22+
# The following methods are not defined directly on this class;
23+
# they are resolved via __getattr__.
24+
pika.adapters.base_connection._StreamingProtocolShim.add_on_close_callback
25+
pika.adapters.base_connection._StreamingProtocolShim.add_on_connection_blocked_callback
26+
pika.adapters.base_connection._StreamingProtocolShim.add_on_connection_unblocked_callback
27+
pika.adapters.base_connection._StreamingProtocolShim.add_on_open_callback
28+
pika.adapters.base_connection._StreamingProtocolShim.add_on_open_error_callback
29+
pika.adapters.base_connection._StreamingProtocolShim.channel
30+
pika.adapters.base_connection._StreamingProtocolShim.update_secret
31+
pika.adapters.base_connection._StreamingProtocolShim.close
32+
pika.adapters.base_connection._StreamingProtocolShim.is_closed
33+
pika.adapters.base_connection._StreamingProtocolShim.is_closing
34+
pika.adapters.base_connection._StreamingProtocolShim.is_open
35+
pika.adapters.base_connection._StreamingProtocolShim.basic_nack
36+
pika.adapters.base_connection._StreamingProtocolShim.consumer_cancel_notify
37+
pika.adapters.base_connection._StreamingProtocolShim.exchange_exchange_bindings
38+
pika.adapters.base_connection._StreamingProtocolShim.publisher_confirms
39+
pika.adapters.base_connection._StreamingProtocolShim.create_connection
40+
pika.adapters.base_connection._StreamingProtocolShim.ioloop

stubs/pika/METADATA.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ extra-description = """\
55
The `types-pika` package contains alternate, more complete type stubs, that \
66
are maintained outside of typeshed.\
77
"""
8+
optional-dependencies = ["types-gevent"]
89

910
[tool.stubtest]
1011
stubtest-dependencies = ["gevent", "tornado", "twisted"]
Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,37 @@
1+
import asyncio
12
from _typeshed import Incomplete
2-
from asyncio import AbstractEventLoop, Future, Handle
33
from collections.abc import Callable, Sequence
44
from logging import Logger
5-
from typing_extensions import Self
65

7-
from ..connection import Connection, Parameters
8-
from .base_connection import BaseConnection
9-
from .utils import io_services_utils
10-
from .utils.connection_workflow import AbstractAMQPConnectionWorkflow, AMQPConnectorException
11-
from .utils.nbio_interface import AbstractFileDescriptorServices, AbstractIOReference, AbstractIOServices, AbstractTimerReference
6+
from pika.adapters.base_connection import BaseConnection
7+
from pika.adapters.utils import io_services_utils
8+
from pika.adapters.utils.connection_workflow import AbstractAMQPConnectionWorkflow, AMQPConnectorException
9+
from pika.adapters.utils.nbio_interface import (
10+
AbstractFileDescriptorServices,
11+
AbstractIOReference,
12+
AbstractIOServices,
13+
AbstractTimerReference,
14+
)
15+
from pika.connection import Connection, Parameters
1216

1317
LOGGER: Logger
1418

15-
class AsyncioConnection(BaseConnection):
19+
class AsyncioConnection(BaseConnection[asyncio.AbstractEventLoop]):
1620
def __init__(
1721
self,
1822
parameters: Parameters | None = None,
19-
on_open_callback: Callable[[Self], object] | None = None,
20-
on_open_error_callback: Callable[[Self, BaseException], object] | None = None,
21-
on_close_callback: Callable[[Self, BaseException], object] | None = None,
22-
custom_ioloop: AbstractEventLoop | None = None,
23+
on_open_callback: Callable[[Connection], object] | None = None,
24+
on_open_error_callback: Callable[[Connection, BaseException], object] | None = None,
25+
on_close_callback: Callable[[Connection, BaseException], object] | None = None,
26+
custom_ioloop: asyncio.AbstractEventLoop | AbstractIOServices | None = None,
2327
internal_connection_workflow: bool = True,
2428
) -> None: ...
2529
@classmethod
2630
def create_connection(
2731
cls,
2832
connection_configs: Sequence[Parameters],
2933
on_done: Callable[[Connection | AMQPConnectorException], object],
30-
custom_ioloop: AbstractEventLoop | None = None,
34+
custom_ioloop: asyncio.AbstractEventLoop | None = None,
3135
workflow: AbstractAMQPConnectionWorkflow | None = None,
3236
) -> AbstractAMQPConnectionWorkflow: ...
3337

@@ -37,8 +41,8 @@ class _AsyncioIOServicesAdapter(
3741
AbstractIOServices,
3842
AbstractFileDescriptorServices,
3943
):
40-
def __init__(self, loop: AbstractEventLoop | None = None) -> None: ...
41-
def get_native_ioloop(self) -> AbstractEventLoop: ...
44+
def __init__(self, loop: asyncio.AbstractEventLoop | None = None) -> None: ...
45+
def get_native_ioloop(self) -> asyncio.AbstractEventLoop: ...
4246
def close(self) -> None: ...
4347
def run(self) -> None: ...
4448
def stop(self) -> None: ...
@@ -48,7 +52,7 @@ class _AsyncioIOServicesAdapter(
4852
self,
4953
host: str | bytes | None,
5054
port: str | bytes | int | None,
51-
on_done: Callable[[BaseConnection | BaseException], object], # type: ignore[override]
55+
on_done: Callable[[BaseConnection[asyncio.AbstractEventLoop] | BaseException], object], # type: ignore[override]
5256
family: int = 0,
5357
socktype: int = 0,
5458
proto: int = 0,
@@ -60,9 +64,13 @@ class _AsyncioIOServicesAdapter(
6064
def remove_writer(self, fd: int) -> bool: ...
6165

6266
class _TimerHandle(AbstractTimerReference):
63-
def __init__(self, handle: Handle) -> None: ...
67+
def __init__(self, handle: asyncio.Handle) -> None: ...
6468
def cancel(self) -> None: ...
6569

6670
class _AsyncioIOReference(AbstractIOReference):
67-
def __init__(self, future: Future[Incomplete], on_done: Callable[[BaseConnection | BaseException], object]) -> None: ...
71+
def __init__(
72+
self,
73+
future: asyncio.Future[Incomplete],
74+
on_done: Callable[[BaseConnection[asyncio.AbstractEventLoop] | BaseException], object],
75+
) -> None: ...
6876
def cancel(self) -> bool: ...
Lines changed: 94 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,112 @@
11
import abc
22
from _typeshed import Incomplete
3-
from collections.abc import Callable
3+
from collections.abc import Callable, Mapping, Sequence
44
from logging import Logger
5+
from typing import Final, Generic, Literal, TypeVar
56
from typing_extensions import Self
67

7-
from ..adapters.utils.nbio_interface import AbstractIOServices, AbstractStreamProtocol
8-
from ..connection import Connection, Parameters
8+
from pika.adapters.utils.connection_workflow import AbstractAMQPConnectionWorkflow, AMQPConnectorException
9+
from pika.adapters.utils.nbio_interface import AbstractIOServices, AbstractStreamProtocol, AbstractStreamTransport
10+
from pika.callback import CallbackManager
11+
from pika.channel import Channel
12+
from pika.connection import Connection, Parameters
13+
from pika.frame import Method
14+
from pika.spec import Connection as SpecConnection
915

1016
LOGGER: Logger
1117

12-
class BaseConnection(Connection, metaclass=abc.ABCMeta):
18+
_IOLoop = TypeVar("_IOLoop")
19+
20+
class BaseConnection(Connection, Generic[_IOLoop], metaclass=abc.ABCMeta):
1321
def __init__(
1422
self,
1523
parameters: Parameters | None,
16-
on_open_callback: Callable[[Self], object] | None,
17-
on_open_error_callback: Callable[[Self, BaseException], object] | None,
18-
on_close_callback: Callable[[Self, BaseException], object] | None,
24+
on_open_callback: Callable[[Connection], object] | None,
25+
on_open_error_callback: Callable[[Connection, BaseException], object] | None,
26+
on_close_callback: Callable[[Connection, BaseException], object] | None,
1927
nbio: AbstractIOServices,
2028
internal_connection_workflow: bool = True,
2129
) -> None: ...
2230
@classmethod
2331
@abc.abstractmethod
24-
def create_connection(cls, connection_configs, on_done, custom_ioloop=None, workflow=None): ...
32+
def create_connection(
33+
cls,
34+
connection_configs: Sequence[Parameters],
35+
on_done: Callable[[Connection | AMQPConnectorException], object],
36+
custom_ioloop: _IOLoop | None = None,
37+
workflow: AbstractAMQPConnectionWorkflow | None = None,
38+
) -> AbstractAMQPConnectionWorkflow: ...
39+
@property
40+
def ioloop(self) -> _IOLoop: ...
41+
42+
class _StreamingProtocolShim(AbstractStreamProtocol, Generic[_IOLoop]):
43+
conn: BaseConnection[_IOLoop]
44+
def __init__(self, conn: BaseConnection[_IOLoop]) -> None: ...
45+
# These are defined as None, but on initialization are set as callable attributes
46+
def connection_made(self, transport: AbstractStreamTransport) -> None: ...
47+
def connection_lost(self, error: BaseException | None) -> None: ...
48+
def eof_received(self) -> bool: ...
49+
def data_received(self, data: bytes) -> None: ...
50+
51+
# Next attributes are accessed via getattr() from connection.Connection class:
52+
ON_CONNECTION_CLOSED: Final = "_on_connection_closed"
53+
ON_CONNECTION_ERROR: Final = "_on_connection_error"
54+
ON_CONNECTION_OPEN_OK: Final = "_on_connection_open_ok"
55+
CONNECTION_CLOSED: Final = 0
56+
CONNECTION_INIT: Final = 1
57+
CONNECTION_PROTOCOL: Final = 2
58+
CONNECTION_START: Final = 3
59+
CONNECTION_TUNE: Final = 4
60+
CONNECTION_OPEN: Final = 5
61+
CONNECTION_CLOSING: Final = 6
62+
connection_state: Literal[0, 1, 2, 3, 4, 5, 6] # one of the constants above
63+
params: Parameters
64+
callbacks: CallbackManager
65+
server_capabilities: Mapping[str, bool] | None
66+
server_properties: Mapping[str, Incomplete] | None
67+
known_hosts: str | None
68+
def add_on_close_callback(self, callback: Callable[[Self, BaseException], object]) -> None: ...
69+
def add_on_connection_blocked_callback(self, callback: Callable[[Self, Method[SpecConnection.Blocked]], object]) -> None: ...
70+
def add_on_connection_unblocked_callback(
71+
self, callback: Callable[[Self, Method[SpecConnection.Unblocked]], object]
72+
) -> None: ...
73+
def add_on_open_callback(self, callback: Callable[[Self], object]) -> None: ...
74+
def add_on_open_error_callback(
75+
self, callback: Callable[[Self, BaseException], object], remove_default: bool = True
76+
) -> None: ...
77+
def channel(
78+
self, channel_number: int | None = None, on_open_callback: Callable[[Channel], object] | None = None
79+
) -> Channel: ...
80+
def update_secret(
81+
self,
82+
new_secret: str | bytes,
83+
reason: str | bytes,
84+
callback: Callable[[Method[SpecConnection.UpdateSecretOk]], object] | None = None,
85+
) -> None: ...
86+
def close(self, reply_code: int = 200, reply_text: str = "Normal shutdown") -> None: ...
2587
@property
26-
def ioloop(self): ...
88+
def is_closed(self) -> bool: ...
89+
@property
90+
def is_closing(self) -> bool: ...
91+
@property
92+
def is_open(self) -> bool: ...
93+
@property
94+
def basic_nack(self) -> bool: ...
95+
@property
96+
def consumer_cancel_notify(self) -> bool: ...
97+
@property
98+
def exchange_exchange_bindings(self) -> bool: ...
99+
@property
100+
def publisher_confirms(self) -> bool: ...
27101

28-
class _StreamingProtocolShim(AbstractStreamProtocol):
29-
connection_made: Incomplete
30-
connection_lost: Incomplete
31-
eof_received: Incomplete
32-
data_received: Incomplete
33-
conn: Incomplete
34-
def __init__(self, conn) -> None: ...
35-
def __getattr__(self, attr: str): ...
102+
# Next attributes are accessed via getattr() from BaseConnection class:
103+
@classmethod
104+
def create_connection(
105+
cls,
106+
connection_configs: Sequence[Parameters],
107+
on_done: Callable[[Connection | AMQPConnectorException], object],
108+
custom_ioloop: _IOLoop | None = None,
109+
workflow: AbstractAMQPConnectionWorkflow | None = None,
110+
) -> AbstractAMQPConnectionWorkflow: ...
111+
@property
112+
def ioloop(self) -> _IOLoop: ...

0 commit comments

Comments
 (0)