From 18c67096d4ef1688280ccf1fa1f4e23a21f65e93 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Tue, 4 Jan 2022 15:30:54 +0200 Subject: [PATCH 1/6] Ignore name argument on Python 3.7 --- sanic/app.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sanic/app.py b/sanic/app.py index c393c715d5..892917058d 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -1553,7 +1553,15 @@ def _loop_add_task( register: bool = True, ) -> Task: prepped = cls._prep_task(task, app, loop) - task = loop.create_task(prepped, name=name) + if sys.version_info == (3, 7): + if name: + error_logger.warning( + "Cannot set a name for a task when using Python 3.7. Your " + "task will be created without a name." + ) + task = loop.create_task(prepped) + else: + task = loop.create_task(prepped, name=name) if name and register: app._task_registry[name] = task From f0e30b1c473d1060df39bf17e7d9bce4cadfc856 Mon Sep 17 00:00:00 2001 From: Ryu juheon Date: Wed, 5 Jan 2022 16:57:40 +0900 Subject: [PATCH 2/6] Fixed task is created again when adding the task (#2356) --- sanic/app.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 892917058d..111ee2b40e 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -1552,16 +1552,17 @@ def _loop_add_task( name: Optional[str] = None, register: bool = True, ) -> Task: - prepped = cls._prep_task(task, app, loop) - if sys.version_info == (3, 7): - if name: - error_logger.warning( - "Cannot set a name for a task when using Python 3.7. Your " - "task will be created without a name." - ) - task = loop.create_task(prepped) - else: - task = loop.create_task(prepped, name=name) + if not isinstance(task, Future): + prepped = cls._prep_task(task, app, loop) + if sys.version_info == (3, 7): + if name: + error_logger.warning( + "Cannot set a name for a task when using Python 3.7. Your " + "task will be created without a name." + ) + task = loop.create_task(prepped) + else: + task = loop.create_task(prepped, name=name) if name and register: app._task_registry[name] = task From 458a4ead1ea82ba8d833f1954e92c6f9da77605b Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Thu, 6 Jan 2022 01:10:48 +0200 Subject: [PATCH 3/6] Add some unit tests --- sanic/app.py | 42 ++++++++++++++++++++++++--------------- tests/test_create_task.py | 20 +++++++++++++++++++ 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 892917058d..36b8f7f406 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -1563,7 +1563,7 @@ def _loop_add_task( else: task = loop.create_task(prepped, name=name) - if name and register: + if name and register and sys.version_info > (3, 7): app._task_registry[name] = task return task @@ -1625,10 +1625,12 @@ def add_task( def get_task( self, name: str, *, raise_exception: bool = True ) -> Optional[Task]: - if sys.version_info == (3, 7): - raise RuntimeError( - "This feature is only supported on using Python 3.8+." + if sys.version_info < (3, 8): + error_logger.warning( + "This feature (get_task) is only supported on using " + "Python 3.8+." ) + return try: return self._task_registry[name] except KeyError: @@ -1645,10 +1647,12 @@ async def cancel_task( *, raise_exception: bool = True, ) -> None: - if sys.version_info == (3, 7): - raise RuntimeError( - "This feature is only supported on using Python 3.8+." + if sys.version_info < (3, 8): + error_logger.warning( + "This feature (cancel_task) is only supported on using " + "Python 3.8+." ) + return task = self.get_task(name, raise_exception=raise_exception) if task and not task.cancelled(): args: Tuple[str, ...] = () @@ -1667,10 +1671,12 @@ async def cancel_task( ... def purge_tasks(self): - if sys.version_info == (3, 7): - raise RuntimeError( - "This feature is only supported on using Python 3.8+." + if sys.version_info < (3, 8): + error_logger.warning( + "This feature (purge_tasks) is only supported on using " + "Python 3.8+." ) + return for task in self.tasks: if task.done() or task.cancelled(): name = task.get_name() @@ -1683,10 +1689,12 @@ def purge_tasks(self): def shutdown_tasks( self, timeout: Optional[float] = None, increment: float = 0.1 ): - if sys.version_info == (3, 7): - raise RuntimeError( - "This feature is only supported on using Python 3.8+." + if sys.version_info < (3, 8): + error_logger.warning( + "This feature (shutdown_tasks) is only supported on using " + "Python 3.8+." ) + return for task in self.tasks: task.cancel() @@ -1700,10 +1708,12 @@ def shutdown_tasks( @property def tasks(self): - if sys.version_info == (3, 7): - raise RuntimeError( - "This feature is only supported on using Python 3.8+." + if sys.version_info < (3, 8): + error_logger.warning( + "This feature (tasks) is only supported on using " + "Python 3.8+." ) + return return iter(self._task_registry.values()) # -------------------------------------------------------------------- # diff --git a/tests/test_create_task.py b/tests/test_create_task.py index c98666a9d0..a11bc302be 100644 --- a/tests/test_create_task.py +++ b/tests/test_create_task.py @@ -2,6 +2,7 @@ import sys from threading import Event +from unittest.mock import Mock import pytest @@ -77,6 +78,25 @@ async def stop(app, _): app.run() +def test_named_task_called(app): + e = Event() + + async def coro(): + e.set() + + @app.route("/") + async def isset(request): + await asyncio.sleep(0.05) + return text(str(e.is_set())) + + @app.before_server_start + async def setup(app, _): + app.add_task(coro, name="dummy_task") + + request, response = app.test_client.get("/") + assert response.body == b"True" + + @pytest.mark.skipif(sys.version_info < (3, 8), reason="Not supported in 3.7") def test_create_named_task_fails_outside_app(app): async def dummy(): From eba894d7880386e6073b2a5a1f9ad67e83224d43 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Thu, 6 Jan 2022 09:56:37 +0200 Subject: [PATCH 4/6] Update sanic/app.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Néstor Pérez <25409753+prryplatypus@users.noreply.github.com> --- sanic/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sanic/app.py b/sanic/app.py index aa60549984..3d753ebd7b 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -1554,7 +1554,7 @@ def _loop_add_task( ) -> Task: if not isinstance(task, Future): prepped = cls._prep_task(task, app, loop) - if sys.version_info == (3, 7): + if sys.version_info < (3, 8): if name: error_logger.warning( "Cannot set a name for a task when using Python 3.7. Your " From 8f84ef02f2cae4dd423fec5259035f46221f562a Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Thu, 6 Jan 2022 10:06:45 +0200 Subject: [PATCH 5/6] squash --- sanic/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 3d753ebd7b..ec35ee771c 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -1557,8 +1557,8 @@ def _loop_add_task( if sys.version_info < (3, 8): if name: error_logger.warning( - "Cannot set a name for a task when using Python 3.7. Your " - "task will be created without a name." + "Cannot set a name for a task when using Python 3.7. " + "Your task will be created without a name." ) task = loop.create_task(prepped) else: From 39eecd06dde34fa000b0557e38e5efe9362215e6 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Thu, 6 Jan 2022 10:22:17 +0200 Subject: [PATCH 6/6] squash --- .github/workflows/pr-type-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-type-check.yml b/.github/workflows/pr-type-check.yml index c35479205f..58a90ee3fc 100644 --- a/.github/workflows/pr-type-check.yml +++ b/.github/workflows/pr-type-check.yml @@ -16,7 +16,7 @@ jobs: matrix: os: [ubuntu-latest] config: - - { python-version: 3.7, tox-env: type-checking} + # - { python-version: 3.7, tox-env: type-checking} - { python-version: 3.8, tox-env: type-checking} - { python-version: 3.9, tox-env: type-checking} - { python-version: "3.10", tox-env: type-checking}