Merge branch 'master' into dev-typo_doc_r0

This commit is contained in:
Adam Hopkins 2020-12-24 21:00:20 +02:00 committed by GitHub
commit ecb6db29e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 19 additions and 110 deletions

View File

@ -10,6 +10,7 @@ from pathlib import Path
from sanic import Sanic, response from sanic import Sanic, response
app = Sanic(__name__) app = Sanic(__name__)
@ -42,7 +43,9 @@ async def handler_file(request):
@app.route("/file_stream") @app.route("/file_stream")
async def handler_file_stream(request): async def handler_file_stream(request):
return await response.file_stream(Path("../") / "setup.py", chunk_size=1024) return await response.file_stream(
Path("../") / "setup.py", chunk_size=1024
)
@app.route("/stream", stream=True) @app.route("/stream", stream=True)

View File

@ -714,28 +714,6 @@ class Sanic:
self._blueprint_order.append(blueprint) self._blueprint_order.append(blueprint)
blueprint.register(self, options) blueprint.register(self, options)
def register_blueprint(self, *args, **kwargs):
"""
Proxy method provided for invoking the :func:`blueprint` method
.. note::
To be deprecated in 1.0. Use :func:`blueprint` instead.
:param args: Blueprint object or (list, tuple) thereof
:param kwargs: option dictionary with blueprint defaults
:return: None
"""
if self.debug:
warnings.simplefilter("default")
warnings.warn(
"Use of register_blueprint will be deprecated in "
"version 1.0. Please use the blueprint method"
" instead",
DeprecationWarning,
)
return self.blueprint(*args, **kwargs)
def url_for(self, view_name: str, **kwargs): def url_for(self, view_name: str, **kwargs):
r"""Build a URL based on a view name and the values provided. r"""Build a URL based on a view name and the values provided.
@ -1026,7 +1004,6 @@ class Sanic:
workers: int = 1, workers: int = 1,
protocol: Optional[Type[Protocol]] = None, protocol: Optional[Type[Protocol]] = None,
backlog: int = 100, backlog: int = 100,
stop_event: Any = None,
register_sys_signals: bool = True, register_sys_signals: bool = True,
access_log: Optional[bool] = None, access_log: Optional[bool] = None,
unix: Optional[str] = None, unix: Optional[str] = None,
@ -1056,9 +1033,6 @@ class Sanic:
:param backlog: a number of unaccepted connections that the system :param backlog: a number of unaccepted connections that the system
will allow before refusing new connections will allow before refusing new connections
:type backlog: int :type backlog: int
:param stop_event: event to be triggered
before stopping the app - deprecated
:type stop_event: None
:param register_sys_signals: Register SIG* events :param register_sys_signals: Register SIG* events
:type register_sys_signals: bool :type register_sys_signals: bool
:param access_log: Enables writing access logs (slows server) :param access_log: Enables writing access logs (slows server)
@ -1086,13 +1060,6 @@ class Sanic:
protocol = ( protocol = (
WebSocketProtocol if self.websocket_enabled else HttpProtocol WebSocketProtocol if self.websocket_enabled else HttpProtocol
) )
if stop_event is not None:
if debug:
warnings.simplefilter("default")
warnings.warn(
"stop_event will be removed from future versions.",
DeprecationWarning,
)
# if access_log is passed explicitly change config.ACCESS_LOG # if access_log is passed explicitly change config.ACCESS_LOG
if access_log is not None: if access_log is not None:
self.config.ACCESS_LOG = access_log self.config.ACCESS_LOG = access_log
@ -1149,7 +1116,6 @@ class Sanic:
sock: Optional[socket] = None, sock: Optional[socket] = None,
protocol: Type[Protocol] = None, protocol: Type[Protocol] = None,
backlog: int = 100, backlog: int = 100,
stop_event: Any = None,
access_log: Optional[bool] = None, access_log: Optional[bool] = None,
unix: Optional[str] = None, unix: Optional[str] = None,
return_asyncio_server=False, return_asyncio_server=False,
@ -1182,9 +1148,6 @@ class Sanic:
:param backlog: a number of unaccepted connections that the system :param backlog: a number of unaccepted connections that the system
will allow before refusing new connections will allow before refusing new connections
:type backlog: int :type backlog: int
:param stop_event: event to be triggered
before stopping the app - deprecated
:type stop_event: None
:param access_log: Enables writing access logs (slows server) :param access_log: Enables writing access logs (slows server)
:type access_log: bool :type access_log: bool
:param return_asyncio_server: flag that defines whether there's a need :param return_asyncio_server: flag that defines whether there's a need
@ -1204,13 +1167,6 @@ class Sanic:
protocol = ( protocol = (
WebSocketProtocol if self.websocket_enabled else HttpProtocol WebSocketProtocol if self.websocket_enabled else HttpProtocol
) )
if stop_event is not None:
if debug:
warnings.simplefilter("default")
warnings.warn(
"stop_event will be removed from future versions.",
DeprecationWarning,
)
# if access_log is passed explicitly change config.ACCESS_LOG # if access_log is passed explicitly change config.ACCESS_LOG
if access_log is not None: if access_log is not None:
self.config.ACCESS_LOG = access_log self.config.ACCESS_LOG = access_log
@ -1292,7 +1248,6 @@ class Sanic:
loop=None, loop=None,
protocol=HttpProtocol, protocol=HttpProtocol,
backlog=100, backlog=100,
stop_event=None,
register_sys_signals=True, register_sys_signals=True,
run_async=False, run_async=False,
auto_reload=False, auto_reload=False,
@ -1307,13 +1262,6 @@ class Sanic:
context = create_default_context(purpose=Purpose.CLIENT_AUTH) context = create_default_context(purpose=Purpose.CLIENT_AUTH)
context.load_cert_chain(cert, keyfile=key) context.load_cert_chain(cert, keyfile=key)
ssl = context ssl = context
if stop_event is not None:
if debug:
warnings.simplefilter("default")
warnings.warn(
"stop_event will be removed from future versions.",
DeprecationWarning,
)
if self.config.PROXIES_COUNT and self.config.PROXIES_COUNT < 0: if self.config.PROXIES_COUNT and self.config.PROXIES_COUNT < 0:
raise ValueError( raise ValueError(
"PROXIES_COUNT cannot be negative. " "PROXIES_COUNT cannot be negative. "

View File

@ -136,15 +136,18 @@ class Request:
return f"<{class_name}: {self.method} {self.path}>" return f"<{class_name}: {self.method} {self.path}>"
def body_init(self): def body_init(self):
""".. deprecated:: 20.3""" """.. deprecated:: 20.3
To be removed in 21.3"""
self.body = [] self.body = []
def body_push(self, data): def body_push(self, data):
""".. deprecated:: 20.3""" """.. deprecated:: 20.3
To be removed in 21.3"""
self.body.append(data) self.body.append(data)
def body_finish(self): def body_finish(self):
""".. deprecated:: 20.3""" """.. deprecated:: 20.3
To be removed in 21.3"""
self.body = b"".join(self.body) self.body = b"".join(self.body)
async def receive_body(self): async def receive_body(self):

View File

@ -1,5 +1,3 @@
import warnings
from functools import partial from functools import partial
from mimetypes import guess_type from mimetypes import guess_type
from os import path from os import path
@ -26,6 +24,8 @@ class BaseHTTPResponse:
self.asgi = False self.asgi = False
def _encode_body(self, data): def _encode_body(self, data):
if data is None:
return b""
return data.encode() if hasattr(data, "encode") else data return data.encode() if hasattr(data, "encode") else data
def _parse_headers(self): def _parse_headers(self):
@ -45,7 +45,7 @@ class BaseHTTPResponse:
body=b"", body=b"",
): ):
""".. deprecated:: 20.3: """.. deprecated:: 20.3:
This function is not public API and will be removed.""" This function is not public API and will be removed in 21.3."""
# self.headers get priority over content_type # self.headers get priority over content_type
if self.content_type and "Content-Type" not in self.headers: if self.content_type and "Content-Type" not in self.headers:
@ -149,22 +149,15 @@ class HTTPResponse(BaseHTTPResponse):
status=200, status=200,
headers=None, headers=None,
content_type=None, content_type=None,
body_bytes=b"",
): ):
super().__init__() super().__init__()
self.content_type = content_type self.content_type = content_type
self.body = body_bytes if body is None else self._encode_body(body) self.body = self._encode_body(body)
self.status = status self.status = status
self.headers = Header(headers or {}) self.headers = Header(headers or {})
self._cookies = None self._cookies = None
if body_bytes:
warnings.warn(
"Parameter `body_bytes` is deprecated, use `body` instead",
DeprecationWarning,
)
def output(self, version="1.1", keep_alive=False, keep_alive_timeout=None): def output(self, version="1.1", keep_alive=False, keep_alive_timeout=None):
body = b"" body = b""
if has_message_body(self.status): if has_message_body(self.status):
@ -228,20 +221,10 @@ def text(
:param content_type: the content type (string) of the response :param content_type: the content type (string) of the response
""" """
if not isinstance(body, str): if not isinstance(body, str):
warnings.warn( raise TypeError(
"Types other than str will be deprecated in future versions for" f"Bad body type. Expected str, got {type(body).__name__})"
f" response.text, got type {type(body).__name__})",
DeprecationWarning,
) )
# Type conversions are deprecated and quite b0rked but still supported for
# text() until applications get fixed. This try-except should be removed.
try:
# Avoid repr(body).encode() b0rkage for body that is already encoded.
# memoryview used only to test bytes-ishness.
with memoryview(body):
pass
except TypeError:
body = f"{body}" # no-op if body is already str
return HTTPResponse( return HTTPResponse(
body, status=status, headers=headers, content_type=content_type body, status=status, headers=headers, content_type=content_type
) )

View File

@ -825,21 +825,6 @@ def test_duplicate_blueprint(app):
) )
@pytest.mark.parametrize("debug", [True, False, None])
def test_register_blueprint(app, debug):
bp = Blueprint("bp")
app.debug = debug
with pytest.warns(DeprecationWarning) as record:
app.register_blueprint(bp)
assert record[0].message.args[0] == (
"Use of register_blueprint will be deprecated in "
"version 1.0. Please use the blueprint method"
" instead"
)
def test_strict_slashes_behavior_adoption(app): def test_strict_slashes_behavior_adoption(app):
app.strict_slashes = True app.strict_slashes = True

View File

@ -41,7 +41,8 @@ def test_response_body_not_a_string(app):
return text(random_num) return text(random_num)
request, response = app.test_client.get("/hello") request, response = app.test_client.get("/hello")
assert response.text == str(random_num) assert response.status == 500
assert b"Internal Server Error" in response.body
async def sample_streaming_fn(response): async def sample_streaming_fn(response):
@ -624,17 +625,3 @@ def test_empty_response(app):
request, response = app.test_client.get("/test") request, response = app.test_client.get("/test")
assert response.content_type is None assert response.content_type is None
assert response.body == b"" assert response.body == b""
def test_response_body_bytes_deprecated(app):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
HTTPResponse(body_bytes=b"bytes")
assert len(w) == 1
assert issubclass(w[0].category, DeprecationWarning)
assert (
"Parameter `body_bytes` is deprecated, use `body` instead"
in str(w[0].message)
)