From 58ca887be444275c7b1d04677cabba258f9392d6 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Mon, 28 Dec 2020 23:11:29 +0200 Subject: [PATCH 1/4] Bump to v20.12 --- CHANGELOG.rst | 197 ++++++++++++++++++++++++++++++------------- sanic/__version__.py | 2 +- 2 files changed, 141 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e0ee0d93f3..d38dc50b9e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,9 +1,92 @@ +Version 20.12.0 +=============== + +Features +******** + + * + `#1954 `_ + Fix static routes registration on a blueprint + + * + `#1961 `_ + Add Python 3.9 support + + * + `#1962 `_ + Sanic CLI upgrade + + * + `#1967 `_ + Update aiofile version requirements + + * + `#1969 `_ + Update multidict version requirements + + * + `#1970 `_ + Add py.typed file + + * + `#1972 `_ + Speed optimization in request handler + + * + `#1979 `_ + Add app registry and Sanic class level app retrieval + +Bugfixes +******** + + * + `#1965 `_ + Fix Chunked Transport-Encoding in ASGI streaming response + +Deprecations and Removals +************************* + + * + `#1981 `_ + Cleanup and remove deprecated code + +Developer infrastructure +************************ + + * + `#1956 `_ + Fix load module test + + * + `#1973 `_ + Transition Travis from .org to .com + + * + `#1986 `_ + Update tox requirements + +Improved Documentation +********************** + + * + `#1951 `_ + Documentation improvements + + * + `#1983 `_ + Remove duplicate contents in testing.rst + + * + `#1984 `_ + Fix typo in routing.rst + + Version 20.9.1 =============== Bugfixes ******** - + * `#1954 `_ Fix static route registration on blueprints @@ -17,7 +100,7 @@ Version 19.12.3 Bugfixes ******** - + * `#1959 `_ Removes duplicate headers in ASGI streaming body @@ -37,27 +120,27 @@ Features * `#1894 `_ Automatically set ``test_mode`` flag on app instance - + * - `#1903 `_ + `#1903 `_ Add new unified method for updating app values - + * `#1906 `_, `#1909 `_ Adds WEBSOCKET_PING_TIMEOUT and WEBSOCKET_PING_INTERVAL configuration values - + * `#1935 `_ httpx version dependency updated, it is slated for removal as a dependency in v20.12 * - `#1937 `_ + `#1937 `_ Added auto, text, and json fallback error handlers (in v21.3, the default will change form html to auto) Bugfixes ******** - + * `#1897 `_ Resolves exception from unread bytes in stream @@ -98,7 +181,7 @@ Version 20.6.3 Bugfixes ******** - + * `#1884 `_ Revert change to multiprocessing mode @@ -109,7 +192,7 @@ Version 20.6.2 Features ******** - + * `#1641 `_ Socket binding implemented properly for IPv6 and UNIX sockets @@ -120,7 +203,7 @@ Version 20.6.1 Features ******** - + * `#1760 `_ Add version parameter to websocket routes @@ -131,7 +214,7 @@ Features * `#1880 `_ - Add handler names for websockets for url_for usage + Add handler names for websockets for url_for usage Bugfixes ******** @@ -151,7 +234,7 @@ Bugfixes * `#1848 `_ Reverse named_response_middlware execution order, to match normal response middleware execution order - + * `#1853 `_ Fix pickle error when attempting to pickle an application which contains websocket routes @@ -203,28 +286,28 @@ Version 20.3.0 Features ******** - * + * `#1762 `_ Add ``srv.start_serving()`` and ``srv.serve_forever()`` to ``AsyncioServer`` - * + * `#1767 `_ Make Sanic usable on ``hypercorn -k trio myweb.app`` - * + * `#1768 `_ No tracebacks on normal errors and prettier error pages - * + * `#1769 `_ Code cleanup in file responses - * + * `#1793 `_ and - `#1819 `_ + `#1819 `_ Upgrade ``str.format()`` to f-strings - * + * `#1798 `_ Allow multiple workers on MacOS with Python 3.8 @@ -235,19 +318,19 @@ Features Bugfixes ******** - * + * `#1748 `_ Remove loop argument in ``asyncio.Event`` in Python 3.8 - * + * `#1764 `_ Allow route decorators to stack up again - * + * `#1789 `_ Fix tests using hosts yielding incorrect ``url_for`` - * + * `#1808 `_ Fix Ctrl+C and tests on Windows @@ -261,7 +344,7 @@ Deprecations and Removals * `#1801 `_ Complete deprecation from `#1666 `_ of dictionary context on ``request`` objects. - + * `#1807 `_ Remove server config args that can be read directly from app @@ -284,22 +367,22 @@ Dependencies Developer infrastructure ************************ - * + * `#1833 `_ Resolve broken documentation builds Improved Documentation ********************** - * + * `#1755 `_ Usage of ``response.empty()`` - * + * `#1778 `_ Update README - * + * `#1783 `_ Fix typo @@ -326,7 +409,7 @@ Improved Documentation * `#1834 `_ Order of listeners - + Version 19.12.0 =============== @@ -392,16 +475,16 @@ Version 19.6.2 Features ******** - * + * `#1562 `_ Remove ``aiohttp`` dependency and create new ``SanicTestClient`` based upon `requests-async `_ - * + * `#1475 `_ Added ASGI support (Beta) - * + * `#1436 `_ Add Configure support from object string @@ -409,19 +492,19 @@ Features Bugfixes ******** - * + * `#1587 `_ Add missing handle for Expect header. - * + * `#1560 `_ Allow to disable Transfer-Encoding: chunked. - * + * `#1558 `_ Fix graceful shutdown. - * + * `#1594 `_ Strict Slashes behavior fix @@ -432,11 +515,11 @@ Deprecations and Removals `#1544 `_ Drop dependency on distutil - * + * `#1562 `_ Drop support for Python 3.5 - * + * `#1568 `_ Deprecate route removal. @@ -453,39 +536,39 @@ Version 19.3 Features ******** - * + * `#1497 `_ Add support for zero-length and RFC 5987 encoded filename for multipart/form-data requests. - * + * `#1484 `_ The type of ``expires`` attribute of ``sanic.cookies.Cookie`` is now enforced to be of type ``datetime``. - * + * `#1482 `_ Add support for the ``stream`` parameter of ``sanic.Sanic.add_route()`` available to ``sanic.Blueprint.add_route()``. - * + * `#1481 `_ Accept negative values for route parameters with type ``int`` or ``number``. - * + * `#1476 `_ Deprecated the use of ``sanic.request.Request.raw_args`` - it has a fundamental flaw in which is drops repeated query string parameters. Added ``sanic.request.Request.query_args`` as a replacement for the original use-case. - * + * `#1472 `_ Remove an unwanted ``None`` check in Request class ``repr`` implementation. This changes the default ``repr`` of a Request from ```` to ```` - * + * `#1470 `_ Added 2 new parameters to ``sanic.app.Sanic.create_server``\ : @@ -496,21 +579,21 @@ Features This is a breaking change. - * + * `#1499 `_ Added a set of test cases that test and benchmark route resolution. - * + * `#1457 `_ The type of the ``"max-age"`` value in a ``sanic.cookies.Cookie`` is now enforced to be an integer. Non-integer values are replaced with ``0``. - * + * `#1445 `_ Added the ``endpoint`` attribute to an incoming ``request``\ , containing the name of the handler function. - * + * `#1423 `_ Improved request streaming. ``request.stream`` is now a bounded-size buffer instead of an unbounded queue. Callers must now call @@ -523,7 +606,7 @@ Bugfixes ******** - * + * `#1502 `_ Sanic was prefetching ``time.time()`` and updating it once per second to avoid excessive ``time.time()`` calls. The implementation was observed to @@ -531,25 +614,25 @@ Bugfixes to negligible, so this has been removed. Fixes `#1500 `_ - * + * `#1501 `_ Fix a bug in the auto-reloader when the process was launched as a module i.e. ``python -m init0.mod1`` where the sanic server is started in ``init0/mod1.py`` with ``debug`` enabled and imports another module in ``init0``. - * + * `#1376 `_ Allow sanic test client to bind to a random port by specifying ``port=None`` when constructing a ``SanicTestClient`` - * + * `#1399 `_ Added the ability to specify middleware on a blueprint group, so that all routes produced from the blueprints in the group have the middleware applied. - * + * `#1442 `_ Allow the the use the ``SANIC_ACCESS_LOG`` environment variable to enable/disable the access log when not explicitly passed to ``app.run()``. @@ -591,7 +674,7 @@ Version 18.12 18.12.0 ******* -* +* Changes: @@ -609,7 +692,7 @@ Version 18.12 * Deprecate Handler.log * Pinned httptools requirement to version 0.0.10+ -* +* Fixes: diff --git a/sanic/__version__.py b/sanic/__version__.py index 0d8f82c659..cb74ea5e26 100644 --- a/sanic/__version__.py +++ b/sanic/__version__.py @@ -1 +1 @@ -__version__ = "20.9.1" +__version__ = "20.12.0" From bf6175fb20edc5b9d1de9fe969428f4e65e98731 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Mon, 28 Dec 2020 23:18:19 +0200 Subject: [PATCH 2/4] Update Changelog --- CHANGELOG.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d38dc50b9e..cb828d0092 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,10 @@ Version 20.12.0 Features ******** + * + `#1945 `_ + Static route more verbose if file not found + * `#1954 `_ Fix static routes registration on a blueprint From caa3e3d69c500ebe642b69e51d3f8813aa63a6cb Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Tue, 5 Jan 2021 09:04:37 +0200 Subject: [PATCH 3/4] Add disable app registry --- sanic/app.py | 7 ++++++- sanic/config.py | 1 + tests/test_app.py | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/sanic/app.py b/sanic/app.py index 81cd66d170..7ddbbdbc06 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -50,6 +50,7 @@ def __init__( strict_slashes=False, log_config=None, configure_logging=True, + register=None, ): # Get name from previous stack frame @@ -88,7 +89,11 @@ def __init__( # Register alternative method names self.go_fast = self.run - self.__class__.register_app(self) + if register is not None: + self.config.REGISTER = register + + if self.config.REGISTER: + self.__class__.register_app(self) @property def loop(self): diff --git a/sanic/config.py b/sanic/config.py index 55ab7b515c..e3d50227ca 100644 --- a/sanic/config.py +++ b/sanic/config.py @@ -40,6 +40,7 @@ "PROXIES_COUNT": None, "FORWARDED_FOR_HEADER": "X-Forwarded-For", "FALLBACK_ERROR_FORMAT": "html", + "REGISTER": True, } diff --git a/tests/test_app.py b/tests/test_app.py index 7527b1c202..45c251dace 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -3,6 +3,7 @@ import sys from inspect import isawaitable +from os import environ from unittest.mock import patch import pytest @@ -290,6 +291,7 @@ def test_app_registry_name_reuse(): with pytest.raises(SanicException): Sanic("test") Sanic.test_mode = True + Sanic("test") def test_app_registry_retrieval(): @@ -306,3 +308,16 @@ def test_get_app_does_not_exist_force_create(): assert isinstance( Sanic.get_app("does-not-exist", force_create=True), Sanic ) + + +def test_app_no_registry(): + Sanic("no-register", register=False) + with pytest.raises(SanicException): + Sanic.get_app("no-register") + + +def test_app_no_registry_env(): + environ["SANIC_REGISTER"] = "False" + Sanic("no-register") + with pytest.raises(SanicException): + Sanic.get_app("no-register") From d11ec1951c37764e3568c94660a28c7b0705af9c Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Tue, 5 Jan 2021 09:14:13 +0200 Subject: [PATCH 4/4] squash --- tests/test_app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_app.py b/tests/test_app.py index 45c251dace..36f303757b 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -321,3 +321,4 @@ def test_app_no_registry_env(): Sanic("no-register") with pytest.raises(SanicException): Sanic.get_app("no-register") + del environ["SANIC_REGISTER"]