From eb5436eed5bf597ff618fd0b28c06e22076a5200 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Wed, 30 Mar 2022 05:27:25 -0500 Subject: [PATCH 1/6] Handle warnings --- ipykernel/eventloops.py | 2 +- ipykernel/tests/conftest.py | 21 +++++++++++++++++++++ ipykernel/tests/test_embed_kernel.py | 6 ++++++ ipykernel/tests/test_message_spec.py | 9 +++++---- ipykernel/tests/test_pickleutil.py | 6 +++++- pyproject.toml | 8 ++++++++ setup.py | 14 ++++++++------ 7 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 ipykernel/tests/conftest.py diff --git a/ipykernel/eventloops.py b/ipykernel/eventloops.py index 23f5f632b..d45c19590 100644 --- a/ipykernel/eventloops.py +++ b/ipykernel/eventloops.py @@ -6,7 +6,7 @@ import os import platform import sys -from distutils.version import LooseVersion as V +from pkg_resources import parse_version as V from functools import partial import zmq diff --git a/ipykernel/tests/conftest.py b/ipykernel/tests/conftest.py new file mode 100644 index 000000000..555d62573 --- /dev/null +++ b/ipykernel/tests/conftest.py @@ -0,0 +1,21 @@ + +try: + import resource +except ImportError: + # Windows + resource = None + + +# Handle resource limit +# Ensure a minimal soft limit of DEFAULT_SOFT if the current hard limit is at least that much. +if resource is not None: + soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) + + DEFAULT_SOFT = 4096 + if hard >= DEFAULT_SOFT: + soft = DEFAULT_SOFT + + if hard < soft: + hard = soft + + resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) diff --git a/ipykernel/tests/test_embed_kernel.py b/ipykernel/tests/test_embed_kernel.py index 81eb234de..cab531179 100644 --- a/ipykernel/tests/test_embed_kernel.py +++ b/ipykernel/tests/test_embed_kernel.py @@ -75,6 +75,12 @@ def connection_file_ready(connection_file): client.stop_channels() finally: kernel.terminate() + kernel.wait() + # Make sure all the fds get closed. + for attr in ['stdout', 'stderr', 'stdin']: + fid = getattr(kernel, attr) + if fid: + fid.close() @flaky(max_runs=3) diff --git a/ipykernel/tests/test_message_spec.py b/ipykernel/tests/test_message_spec.py index 94cf107f5..8cd9176a9 100644 --- a/ipykernel/tests/test_message_spec.py +++ b/ipykernel/tests/test_message_spec.py @@ -5,12 +5,12 @@ import re import sys -from distutils.version import LooseVersion as V +from pkg_resources import parse_version as V from queue import Empty import jupyter_client import pytest -from traitlets import Bool, Dict, Enum, HasTraits, Integer, List, TraitError, Unicode +from traitlets import Bool, Dict, Enum, HasTraits, Integer, List, TraitError, Unicode, observe from .utils import TIMEOUT, execute, flush_channels, get_reply, start_global_kernel @@ -98,8 +98,9 @@ class MimeBundle(Reference): metadata = Dict() data = Dict() - def _data_changed(self, name, old, new): - for k, v in new.items(): + @observe('data') + def _on_data_changed(self, change): + for k, v in change['new'].items(): assert mime_pat.match(k) assert isinstance(v, str) diff --git a/ipykernel/tests/test_pickleutil.py b/ipykernel/tests/test_pickleutil.py index 1cba3cb99..46e859d81 100644 --- a/ipykernel/tests/test_pickleutil.py +++ b/ipykernel/tests/test_pickleutil.py @@ -1,6 +1,10 @@ import pickle +import warnings -from ipykernel.pickleutil import can, uncan + +with warnings.catch_warnings(): + warnings.simplefilter("ignore") + from ipykernel.pickleutil import can, uncan def interactive(f): diff --git a/pyproject.toml b/pyproject.toml index 2efcc10fc..5dc711eb6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,3 +37,11 @@ testpaths = [ timeout = 300 # Restore this setting to debug failures # timeout_method = "thread" +filterwarnings= [ + # Fail on warnings + "error", + + # Workarounds jupyter_client + "ignore:unclosed =1.0.0,<2.0", + "debugpy>=1.0", "ipython>=7.23.1", - "traitlets>=5.1.0,<6.0", - "jupyter_client<8.0", - "tornado>=5.0,<7.0", - "matplotlib-inline>=0.1.0,<0.2.0", + "traitlets>=5.1.0", + "jupyter_client>=6.1.12", + "tornado>=6.1", + "matplotlib-inline>=0.1", 'appnope;platform_system=="Darwin"', "psutil", "nest_asyncio", + "setuptools>=60" # for pkg_resources ], extras_require={ "test": [ - "pytest !=5.3.4", + "pytest>=6.0", "pytest-cov", "flaky", "ipyparallel", @@ -92,6 +93,7 @@ def run(self): "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", ], ) From cb4af0f40d7b8f89ce2879a9b9c0ad630ca9e99a Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Wed, 30 Mar 2022 08:20:11 -0500 Subject: [PATCH 2/6] Handle warnings --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5dc711eb6..a2b27f78f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,8 @@ filterwarnings= [ # Fail on warnings "error", - # Workarounds jupyter_client + # Ignore jupyter_client warnings "ignore:unclosed Date: Wed, 30 Mar 2022 09:04:11 -0500 Subject: [PATCH 3/6] ignore more warnings --- pyproject.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a2b27f78f..edc6ecc3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,5 +44,7 @@ filterwarnings= [ # Ignore jupyter_client warnings "ignore:unclosed Date: Wed, 30 Mar 2022 10:00:53 -0500 Subject: [PATCH 4/6] fix event loop policy on windows --- ipykernel/tests/conftest.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ipykernel/tests/conftest.py b/ipykernel/tests/conftest.py index 555d62573..a14511ef8 100644 --- a/ipykernel/tests/conftest.py +++ b/ipykernel/tests/conftest.py @@ -1,3 +1,5 @@ +import asyncio +import os try: import resource @@ -19,3 +21,8 @@ hard = soft resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) + + +# Enforce selector event loop on Windows. +if os.name == "nt": + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) From aba50c9fd5e3ab04c426e7d006b28e6cf3dc401c Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Wed, 30 Mar 2022 10:46:26 -0500 Subject: [PATCH 5/6] try with latest jupyter_client --- .github/workflows/ci.yml | 4 ++-- pyproject.toml | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8de7da368..a6c216b46 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -135,7 +135,7 @@ jobs: - name: Run the tests timeout-minutes: 10 run: | - cmd="python -m pytest -vv -raXxs" + cmd="python -m pytest -vv" $cmd || $cmd --lf test_miniumum_versions: @@ -152,7 +152,7 @@ jobs: uses: jupyterlab/maintainer-tools/.github/actions/install-minimums@v1 - name: Run the unit tests run: | - cmd="python -m pytest -vv -raXxs" + cmd="python -m pytest -vv -W default" $cmd || $cmd --lf test_prereleases: diff --git a/pyproject.toml b/pyproject.toml index edc6ecc3d..ed605e2ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,5 @@ filterwarnings= [ # Ignore jupyter_client warnings "ignore:unclosed Date: Wed, 30 Mar 2022 10:47:07 -0500 Subject: [PATCH 6/6] try with latest jupyter_client --- ipykernel/eventloops.py | 2 +- ipykernel/tests/test_embed_kernel.py | 2 +- ipykernel/tests/test_message_spec.py | 18 ++++++++++++++---- ipykernel/tests/test_pickleutil.py | 1 - setup.py | 2 +- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ipykernel/eventloops.py b/ipykernel/eventloops.py index d45c19590..6f486ace1 100644 --- a/ipykernel/eventloops.py +++ b/ipykernel/eventloops.py @@ -6,10 +6,10 @@ import os import platform import sys -from pkg_resources import parse_version as V from functools import partial import zmq +from pkg_resources import parse_version as V from traitlets.config.application import Application diff --git a/ipykernel/tests/test_embed_kernel.py b/ipykernel/tests/test_embed_kernel.py index cab531179..2a9eaba98 100644 --- a/ipykernel/tests/test_embed_kernel.py +++ b/ipykernel/tests/test_embed_kernel.py @@ -77,7 +77,7 @@ def connection_file_ready(connection_file): kernel.terminate() kernel.wait() # Make sure all the fds get closed. - for attr in ['stdout', 'stderr', 'stdin']: + for attr in ["stdout", "stderr", "stdin"]: fid = getattr(kernel, attr) if fid: fid.close() diff --git a/ipykernel/tests/test_message_spec.py b/ipykernel/tests/test_message_spec.py index 8cd9176a9..c5df456f8 100644 --- a/ipykernel/tests/test_message_spec.py +++ b/ipykernel/tests/test_message_spec.py @@ -5,12 +5,22 @@ import re import sys -from pkg_resources import parse_version as V from queue import Empty import jupyter_client import pytest -from traitlets import Bool, Dict, Enum, HasTraits, Integer, List, TraitError, Unicode, observe +from pkg_resources import parse_version as V +from traitlets import ( + Bool, + Dict, + Enum, + HasTraits, + Integer, + List, + TraitError, + Unicode, + observe, +) from .utils import TIMEOUT, execute, flush_channels, get_reply, start_global_kernel @@ -98,9 +108,9 @@ class MimeBundle(Reference): metadata = Dict() data = Dict() - @observe('data') + @observe("data") def _on_data_changed(self, change): - for k, v in change['new'].items(): + for k, v in change["new"].items(): assert mime_pat.match(k) assert isinstance(v, str) diff --git a/ipykernel/tests/test_pickleutil.py b/ipykernel/tests/test_pickleutil.py index 46e859d81..c48eadf77 100644 --- a/ipykernel/tests/test_pickleutil.py +++ b/ipykernel/tests/test_pickleutil.py @@ -1,7 +1,6 @@ import pickle import warnings - with warnings.catch_warnings(): warnings.simplefilter("ignore") from ipykernel.pickleutil import can, uncan diff --git a/setup.py b/setup.py index b1e958919..1401021cb 100644 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ def run(self): 'appnope;platform_system=="Darwin"', "psutil", "nest_asyncio", - "setuptools>=60" # for pkg_resources + "setuptools>=60", # for pkg_resources ], extras_require={ "test": [