Skip to content

Commit 4412744

Browse files
rkr-at-dbxgvanrossum
authored andcommitted
asynchat + asyncore: Python 3 compatibility (#1402)
Includes an update to smtpd, which uses asynchat.
1 parent 8607064 commit 4412744

3 files changed

Lines changed: 59 additions & 49 deletions

File tree

stdlib/2and3/asynchat.pyi

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ from typing import Union, Tuple, Sequence
66

77

88
class simple_producer:
9-
def __init__(self, data: str, buffer_size: int = ...) -> None: ...
10-
def more(self) -> str: ...
9+
def __init__(self, data: bytes, buffer_size: int = ...) -> None: ...
10+
def more(self) -> bytes: ...
1111

1212
class async_chat(asyncore.dispatcher):
1313
ac_in_buffer_size = ... # type: int
@@ -18,12 +18,12 @@ class async_chat(asyncore.dispatcher):
1818
def collect_incoming_data(self, data: bytes) -> None: ...
1919
@abstractmethod
2020
def found_terminator(self) -> None: ...
21-
def set_terminator(self, term: Union[str, int, None]) -> None: ...
22-
def get_terminator(self) -> Union[str, int, None]: ...
21+
def set_terminator(self, term: Union[bytes, int, None]) -> None: ...
22+
def get_terminator(self) -> Union[bytes, int, None]: ...
2323
def handle_read(self) -> None: ...
2424
def handle_write(self) -> None: ...
2525
def handle_close(self) -> None: ...
26-
def push(self, data: str) -> None: ...
26+
def push(self, data: bytes) -> None: ...
2727
def push_with_producer(self, producer: simple_producer) -> None: ...
2828
def readable(self) -> bool: ...
2929
def writable(self) -> bool: ...
@@ -33,9 +33,9 @@ class async_chat(asyncore.dispatcher):
3333

3434
if sys.version_info < (3, 0):
3535
class fifo:
36-
def __init__(self, list: Sequence[Union[str, simple_producer]] = ...) -> None: ...
36+
def __init__(self, list: Sequence[Union[bytes, simple_producer]] = ...) -> None: ...
3737
def __len__(self) -> int: ...
3838
def is_empty(self) -> bool: ...
39-
def first(self) -> str: ...
40-
def push(self, data: Union[str, simple_producer]) -> None: ...
41-
def pop(self) -> Tuple[int, str]: ...
39+
def first(self) -> bytes: ...
40+
def push(self, data: Union[bytes, simple_producer]) -> None: ...
41+
def pop(self) -> Tuple[int, bytes]: ...

stdlib/2and3/asyncore.pyi

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,15 @@ class dispatcher:
4747
def set_reuse_addr(self) -> None: ...
4848
def readable(self) -> bool: ...
4949
def writable(self) -> bool: ...
50+
def listen(self, backlog: int) -> None: ...
51+
def bind(self, address: Union[tuple, str]) -> None: ...
52+
def connect(self, address: Union[tuple, str]) -> None: ...
5053
def accept(self) -> Optional[Tuple[socket.socket, Any]]: ...
51-
def recv(self, buffer_size: int) -> str: ...
52-
def log(self, message: Any) -> None: ...
54+
def send(self, data: bytes) -> int: ...
55+
def recv(self, buffer_size: int) -> bytes: ...
56+
def close(self) -> None: ...
5357

58+
def log(self, message: Any) -> None: ...
5459
def log_info(self, message: Any, type: str = ...) -> None: ...
5560
def handle_read_event(self) -> None: ...
5661
def handle_connect_event(self) -> None: ...
@@ -63,46 +68,51 @@ class dispatcher:
6368
def handle_connect(self) -> None: ...
6469
def handle_accept(self) -> None: ...
6570
def handle_close(self) -> None: ...
66-
def detach(self) -> int: ...
67-
def fileno(self) -> int: ...
68-
69-
# return value is an address
70-
def getpeername(self) -> Any: ...
71-
def getsockname(self) -> Any: ...
7271

73-
@overload
74-
def getsockopt(self, level: int, optname: int) -> int: ...
75-
@overload
76-
def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
77-
78-
def gettimeout(self) -> float: ...
79-
def ioctl(self, control: object,
80-
option: Tuple[int, int, int]) -> None: ...
81-
def listen(self, backlog: int) -> None: ...
82-
# TODO the return value may be BinaryIO or TextIO, depending on mode
83-
def makefile(self, mode: str = ..., buffering: int = ...,
84-
encoding: str = ..., errors: str = ...,
85-
newline: str = ...) -> Any:
86-
...
87-
88-
# return type is an address
89-
def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
90-
def recvfrom_into(self, buffer: str, nbytes: int, flags: int = ...) -> Any: ...
91-
def recv_into(self, buffer: str, nbytes: int, flags: int = ...) -> Any: ...
92-
def send(self, data: str, flags: int = ...) -> Optional[int]: ...
93-
def sendall(self, data: str, flags: int = ...) -> None: ...
94-
def sendto(self, data: str, address: Union[tuple, str], flags: int = ...) -> int: ...
95-
def setblocking(self, flag: bool) -> None: ...
96-
def settimeout(self, value: Union[float, None]) -> None: ...
97-
def setsockopt(self, level: int, optname: int, value: Union[int, str]) -> None: ...
98-
def shutdown(self, how: int) -> None: ...
72+
if sys.version_info < (3, 5):
73+
# Historically, some methods were "imported" from `self.socket` by
74+
# means of `__getattr__`. This was long deprecated, and as of Python
75+
# 3.5 has been removed; simply call the relevant methods directly on
76+
# self.socket if necessary.
77+
78+
def detach(self) -> int: ...
79+
def fileno(self) -> int: ...
80+
81+
# return value is an address
82+
def getpeername(self) -> Any: ...
83+
def getsockname(self) -> Any: ...
84+
85+
@overload
86+
def getsockopt(self, level: int, optname: int) -> int: ...
87+
@overload
88+
def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
89+
90+
def gettimeout(self) -> float: ...
91+
def ioctl(self, control: object,
92+
option: Tuple[int, int, int]) -> None: ...
93+
# TODO the return value may be BinaryIO or TextIO, depending on mode
94+
def makefile(self, mode: str = ..., buffering: int = ...,
95+
encoding: str = ..., errors: str = ...,
96+
newline: str = ...) -> Any:
97+
...
98+
99+
# return type is an address
100+
def recvfrom(self, bufsize: int, flags: int = ...) -> Any: ...
101+
def recvfrom_into(self, buffer: bytes, nbytes: int, flags: int = ...) -> Any: ...
102+
def recv_into(self, buffer: bytes, nbytes: int, flags: int = ...) -> Any: ...
103+
def sendall(self, data: bytes, flags: int = ...) -> None: ...
104+
def sendto(self, data: bytes, address: Union[tuple, str], flags: int = ...) -> int: ...
105+
def setblocking(self, flag: bool) -> None: ...
106+
def settimeout(self, value: Union[float, None]) -> None: ...
107+
def setsockopt(self, level: int, optname: int, value: Union[int, bytes]) -> None: ...
108+
def shutdown(self, how: int) -> None: ...
99109

100110
class dispatcher_with_send(dispatcher):
101111
def __init__(self, sock: socket.socket = ..., map: _maptype = ...) -> None: ...
102112
def initiate_send(self) -> None: ...
103113
def handle_write(self) -> None: ...
104114
# incompatible signature:
105-
# def send(self, data: str) -> Optional[int]: ...
115+
# def send(self, data: bytes) -> Optional[int]: ...
106116

107117
def compact_traceback() -> Tuple[Tuple[str, str, str], type, type, str]: ...
108118
def close_all(map: _maptype = ..., ignore_all: bool = ...) -> None: ...
@@ -113,16 +123,16 @@ class file_wrapper:
113123
fd = ... # type: int
114124

115125
def __init__(self, fd: int) -> None: ...
116-
def recv(self, bufsize: int, flags: int = ...) -> str: ...
117-
def send(self, data: str, flags: int = ...) -> int: ...
126+
def recv(self, bufsize: int, flags: int = ...) -> bytes: ...
127+
def send(self, data: bytes, flags: int = ...) -> int: ...
118128

119129
@overload
120130
def getsockopt(self, level: int, optname: int) -> int: ...
121131
@overload
122132
def getsockopt(self, level: int, optname: int, buflen: int) -> bytes: ...
123133

124-
def read(self, bufsize: int, flags: int = ...) -> str: ...
125-
def write(self, data: str, flags: int = ...) -> int: ...
134+
def read(self, bufsize: int, flags: int = ...) -> bytes: ...
135+
def write(self, data: bytes, flags: int = ...) -> int: ...
126136

127137
def close(self) -> None: ...
128138
def fileno(self) -> int: ...

stdlib/2and3/smtpd.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class SMTPChannel(asynchat.async_chat):
4747
map: Optional[asyncore._maptype] = ...) -> None: ...
4848
else:
4949
def __init__(self, server: SMTPServer, conn: socket.socket, addr: Any, data_size_limit: int = ...) -> None: ...
50-
def push(self, msg: Text) -> None: ...
50+
def push(self, msg: bytes) -> None: ...
5151
def collect_incoming_data(self, data: bytes) -> None: ...
5252
def found_terminator(self) -> None: ...
5353
def smtp_HELO(self, arg: str) -> None: ...

0 commit comments

Comments
 (0)