Skip to content

Commit 4c42a4d

Browse files
committed
Deprecated Makefile in favor of StreamReader and StreamWriter.
We replace the `MakeFile` factory function with direct class instantiation. The `MakeFile` function now emits a `DeprecationWarning` and will be removed in a future release. SSL adapters continue to use their own `makefile()` methods which return SSL-aware file object subclasses.
1 parent 4b4bb7f commit 4c42a4d

File tree

4 files changed

+51
-5
lines changed

4 files changed

+51
-5
lines changed

cheroot/connections.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Utilities to manage open connections."""
22

33
import contextlib as _cm
4+
import io
45
import os
56
import selectors
67
import socket
@@ -11,7 +12,7 @@
1112

1213
from . import errors
1314
from ._compat import IS_WINDOWS
14-
from .makefile import MakeFile
15+
from .makefile import StreamReader, StreamWriter
1516

1617

1718
try:
@@ -123,6 +124,15 @@ def _suppress_socket_io_errors(socket, /):
123124
raise
124125

125126

127+
def _make_file_object(sock, mode='r', bufsize=io.DEFAULT_BUFFER_SIZE):
128+
"""Create a file object from a socket."""
129+
return (
130+
StreamReader(sock, mode, bufsize)
131+
if 'r' in mode
132+
else StreamWriter(sock, mode, bufsize)
133+
)
134+
135+
126136
class ConnectionManager:
127137
"""Class which manages HTTPConnection objects.
128138
@@ -304,7 +314,7 @@ def _from_server_socket(self, server_socket): # noqa: C901 # FIXME
304314
if hasattr(s, 'settimeout'):
305315
s.settimeout(self.server.timeout)
306316

307-
mf = MakeFile
317+
mf = _make_file_object
308318
ssl_env = {}
309319
# if ssl cert and key are set, we try to be a secure HTTP server
310320
if self.server.ssl_adapter is not None:

cheroot/makefile.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# prefer slower Python-based io module
44
import _pyio as io
55
import socket
6+
from warnings import warn as _warn
67

78

89
# Write only 16K at a time to sockets
@@ -70,6 +71,15 @@ def write(self, val, *args, **kwargs):
7071

7172

7273
def MakeFile(sock, mode='r', bufsize=io.DEFAULT_BUFFER_SIZE):
73-
"""File object attached to a socket object."""
74+
"""
75+
File object attached to a socket object.
76+
77+
This method is now deprecated: Use StreamReader or StreamWriter directly.
78+
"""
79+
_warn(
80+
'MakeFile is deprecated. Use StreamReader or StreamWriter directly.',
81+
DeprecationWarning,
82+
stacklevel=2,
83+
)
7484
cls = StreamReader if 'r' in mode else StreamWriter
7585
return cls(sock, mode, bufsize)

cheroot/test/test_makefile.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Tests for :py:mod:`cheroot.makefile`."""
22

3+
import pytest
4+
35
from cheroot import makefile
46

57

@@ -39,7 +41,7 @@ def test_bytes_read():
3941
"""Reader should capture bytes read."""
4042
sock = MockSocket()
4143
sock.messages.append(b'foo')
42-
rfile = makefile.MakeFile(sock, 'r')
44+
rfile = makefile.StreamReader(sock, 'r')
4345
rfile.read()
4446
assert rfile.bytes_read == 3
4547

@@ -48,6 +50,21 @@ def test_bytes_written():
4850
"""Writer should capture bytes written."""
4951
sock = MockSocket()
5052
sock.messages.append(b'foo')
51-
wfile = makefile.MakeFile(sock, 'w')
53+
wfile = makefile.StreamWriter(sock, 'w')
5254
wfile.write(b'bar')
5355
assert wfile.bytes_written == 3
56+
57+
58+
def test_makefile_deprecated():
59+
"""MakeFile function should emit a deprecation warning."""
60+
sock = MockSocket()
61+
sock.messages.append(b'foo')
62+
63+
with pytest.warns(
64+
DeprecationWarning,
65+
match='Use StreamReader or StreamWriter directly',
66+
) as warning_info:
67+
makefile.MakeFile(sock, 'r')
68+
69+
assert len(warning_info) == 1
70+
assert 'MakeFile is deprecated' in str(warning_info[0].message)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Deprecated :py:meth:`~cheroot.makefile.MakeFile` in favor of py:meth:`~cheroot.makefile.StreamReader`
2+
and :py:meth:`~cheroot.makefile.StreamWriter`.
3+
4+
We replace the MakeFile factory function with direct class instantiation.
5+
The MakeFile function now emits a DeprecationWarning and will be
6+
removed in a future release.
7+
8+
SSL adapters continue to use their own makefile() methods which
9+
return SSL-aware file object subclasses.

0 commit comments

Comments
 (0)