diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9701cdf81..8187aa0d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,8 +81,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - name: Run Linters - run: | + - name: Run Linters + run: | hatch run typing:test hatch run lint:style pipx run interrogate -vv . diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0a955ea56..4d68ae2fb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,6 @@ ci: autoupdate_schedule: monthly + autoupdate_commit_msg: "chore: update pre-commit hooks" repos: - repo: https://github.com/pre-commit/pre-commit-hooks @@ -29,14 +30,47 @@ repos: rev: 0.7.17 hooks: - id: mdformat + additional_dependencies: + [mdformat-gfm, mdformat-frontmatter, mdformat-footnote] - - repo: https://github.com/psf/black + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.0.2" + hooks: + - id: prettier + types_or: [yaml, html, json] + + - repo: https://github.com/adamchainz/blacken-docs + rev: "1.16.0" + hooks: + - id: blacken-docs + additional_dependencies: [black==23.7.0] + + - repo: https://github.com/psf/black-pre-commit-mirror rev: 23.7.0 hooks: - id: black + - repo: https://github.com/codespell-project/codespell + rev: "v2.2.5" + hooks: + - id: codespell + args: ["-L", "sur,nd"] + + - repo: https://github.com/pre-commit/pygrep-hooks + rev: "v1.10.0" + hooks: + - id: rst-backticks + - id: rst-directive-colons + - id: rst-inline-touching-normal + - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.0.287 hooks: - id: ruff - args: ["--fix"] + args: ["--fix", "--show-fixes"] + + - repo: https://github.com/scientific-python/cookie + rev: "2023.08.23" + hooks: + - id: sp-repo-review + additional_dependencies: ["repo-review[cli]"] diff --git a/examples/embedding/inprocess_qtconsole.py b/examples/embedding/inprocess_qtconsole.py index c346a97fb..18ce28638 100644 --- a/examples/embedding/inprocess_qtconsole.py +++ b/examples/embedding/inprocess_qtconsole.py @@ -19,7 +19,7 @@ def init_asyncio_patch(): asyncio implementation on Windows Pick the older SelectorEventLoopPolicy on Windows if the known-incompatible default policy is in use. - do this as early as possible to make it a low priority and overrideable + do this as early as possible to make it a low priority and overridable ref: https://github.com/tornadoweb/tornado/issues/2608 FIXME: if/when tornado supports the defaults in asyncio, remove and bump tornado requirement for py38 diff --git a/examples/embedding/inprocess_terminal.py b/examples/embedding/inprocess_terminal.py index 79e11e03a..b644c94af 100644 --- a/examples/embedding/inprocess_terminal.py +++ b/examples/embedding/inprocess_terminal.py @@ -19,7 +19,7 @@ def init_asyncio_patch(): asyncio implementation on Windows Pick the older SelectorEventLoopPolicy on Windows if the known-incompatible default policy is in use. - do this as early as possible to make it a low priority and overrideable + do this as early as possible to make it a low priority and overridable ref: https://github.com/tornadoweb/tornado/issues/2608 FIXME: if/when tornado supports the defaults in asyncio, remove and bump tornado requirement for py38 diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index 1c9b94395..90e4f8885 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -40,7 +40,7 @@ raise e -# Required for backwards compatiblity +# Required for backwards compatibility ROUTING_ID = getattr(zmq, "ROUTING_ID", None) or zmq.IDENTITY @@ -644,7 +644,7 @@ async def richInspectVariables(self, message): repr_data = {} repr_metadata = {} if not self.stopped_threads: - # The code did not hit a breakpoint, we use the intepreter + # The code did not hit a breakpoint, we use the interpreter # to get the rich representation of the variable result = get_ipython().user_expressions({var_name: var_name})[var_name] if result.get("status", "error") == "ok": diff --git a/ipykernel/eventloops.py b/ipykernel/eventloops.py index 4082f4cf7..ef54f4105 100644 --- a/ipykernel/eventloops.py +++ b/ipykernel/eventloops.py @@ -429,7 +429,7 @@ async def close_loop(): close_loop() elif not loop.is_closed(): - loop.run_until_complete(close_loop) # type:ignore + loop.run_until_complete(close_loop) # type:ignore[arg-type] loop.close() @@ -566,8 +566,12 @@ def enable_gui(gui, kernel=None): make_qt_app_for_kernel(gui, kernel) loop = loop_map[gui] - if loop and kernel.eventloop is not None and kernel.eventloop is not loop: - msg = "Cannot activate multiple GUI eventloops" + if ( + loop + and kernel.eventloop is not None + and kernel.eventloop is not loop # type:ignore[unreachable] + ): + msg = "Cannot activate multiple GUI eventloops" # type:ignore[unreachable] raise RuntimeError(msg) kernel.eventloop = loop # We set `eventloop`; the function the user chose is executed in `Kernel.enter_eventloop`, thus diff --git a/ipykernel/inprocess/channels.py b/ipykernel/inprocess/channels.py index 964015ed3..d3f03fcfd 100644 --- a/ipykernel/inprocess/channels.py +++ b/ipykernel/inprocess/channels.py @@ -18,7 +18,7 @@ class InProcessChannel: proxy_methods: List[object] = [] def __init__(self, client=None): - """Initialze the channel.""" + """Initialize the channel.""" super().__init__() self.client = client self._is_alive = False diff --git a/ipykernel/inprocess/client.py b/ipykernel/inprocess/client.py index ea964ecde..1fa80bc20 100644 --- a/ipykernel/inprocess/client.py +++ b/ipykernel/inprocess/client.py @@ -193,7 +193,7 @@ def _dispatch_to_kernel(self, msg): dispatch_shell = run_sync(kernel.dispatch_shell) dispatch_shell(msg_parts) else: - loop = asyncio.get_event_loop() + loop = asyncio.get_event_loop() # type:ignore[unreachable] loop.run_until_complete(kernel.dispatch_shell(msg_parts)) idents, reply_msg = self.session.recv(stream, copy=False) self.shell_channel.call_handlers_later(reply_msg) diff --git a/ipykernel/inprocess/ipkernel.py b/ipykernel/inprocess/ipkernel.py index 3f7fcce9e..f3cac4a8c 100644 --- a/ipykernel/inprocess/ipkernel.py +++ b/ipykernel/inprocess/ipkernel.py @@ -111,7 +111,7 @@ def _input_request(self, prompt, ident, parent, password=False): # Await a response. while self.raw_input_str is None: frontend.stdin_channel.process_events() - return self.raw_input_str + return self.raw_input_str # type:ignore[unreachable] # ------------------------------------------------------------------------- # Protected interface diff --git a/ipykernel/iostream.py b/ipykernel/iostream.py index 87834e26b..0c8a2fa9d 100644 --- a/ipykernel/iostream.py +++ b/ipykernel/iostream.py @@ -93,7 +93,7 @@ def _start_event_gc(): if self._event_pipe_gc_task is not None: # cancel gc task to avoid pending task warnings async def _cancel(): - self._event_pipe_gc_task.cancel() # type:ignore + self._event_pipe_gc_task.cancel() # type:ignore[union-attr] if not self._stopped: self.io_loop.run_sync(_cancel) @@ -373,7 +373,7 @@ def fileno(self): def _watch_pipe_fd(self): """ - We've redirected standards steams 0 and 1 into a pipe. + We've redirected standards streams 0 and 1 into a pipe. We need to watch in a thread and redirect them to the right places. @@ -424,7 +424,7 @@ def __init__( that will swap the give file descriptor for a pipe, read from the pipe, and insert this into the current Stream. isatty : bool (default, False) - Indication of whether this stream has termimal capabilities (e.g. can handle colors) + Indication of whether this stream has terminal capabilities (e.g. can handle colors) """ if pipe is not None: @@ -634,7 +634,7 @@ def write(self, string: str) -> Optional[int]: # type:ignore[override] """ if not isinstance(string, str): - msg = f"write() argument must be str, not {type(string)}" + msg = f"write() argument must be str, not {type(string)}" # type:ignore[unreachable] raise TypeError(msg) if self.echo is not None: diff --git a/ipykernel/ipkernel.py b/ipykernel/ipkernel.py index c1c79e942..f82831cc7 100644 --- a/ipykernel/ipkernel.py +++ b/ipykernel/ipkernel.py @@ -29,7 +29,7 @@ try: from IPython.core.interactiveshell import _asyncio_runner # type:ignore[attr-defined] except ImportError: - _asyncio_runner = None # type:ignore + _asyncio_runner = None # type:ignore[assignment] try: from IPython.core.completer import provisionalcompleter as _provisionalcompleter @@ -328,7 +328,7 @@ def set_sigint_result(): # use add_callback for thread safety self.io_loop.add_callback(set_sigint_result) - # set the custom sigint hander during this context + # set the custom sigint handler during this context save_sigint = signal.signal(signal.SIGINT, handle_sigint) try: yield @@ -377,7 +377,7 @@ async def run_cell(*args, **kwargs): preprocessing_exc_tuple = sys.exc_info() if ( - _asyncio_runner + _asyncio_runner # type:ignore[truthy-bool] and shell.loop_runner is _asyncio_runner and asyncio.get_event_loop().is_running() and should_run_async( diff --git a/ipykernel/kernelapp.py b/ipykernel/kernelapp.py index da6d19656..990d6ba4f 100644 --- a/ipykernel/kernelapp.py +++ b/ipykernel/kernelapp.py @@ -460,9 +460,9 @@ def init_blackhole(self): if self.no_stdout or self.no_stderr: blackhole = open(os.devnull, "w") # noqa if self.no_stdout: - sys.stdout = sys.__stdout__ = blackhole # type:ignore + sys.stdout = sys.__stdout__ = blackhole # type:ignore[misc] if self.no_stderr: - sys.stderr = sys.__stderr__ = blackhole # type:ignore + sys.stderr = sys.__stderr__ = blackhole # type:ignore[misc] def init_io(self): """Redirect input streams and set a display hook.""" @@ -634,7 +634,7 @@ def _init_asyncio_patch(self): but it is still preferable to run the Selector in the main thread instead of the background. - do this as early as possible to make it a low priority and overrideable + do this as early as possible to make it a low priority and overridable ref: https://github.com/tornadoweb/tornado/issues/2608 @@ -670,8 +670,8 @@ def init_pdb(self): if hasattr(debugger, "InterruptiblePdb"): # Only available in newer IPython releases: - debugger.Pdb = debugger.InterruptiblePdb # type:ignore - pdb.Pdb = debugger.Pdb # type:ignore + debugger.Pdb = debugger.InterruptiblePdb # type:ignore[misc] + pdb.Pdb = debugger.Pdb # type:ignore[assignment,misc] pdb.set_trace = debugger.set_trace # type:ignore[assignment] @catch_config_error diff --git a/ipykernel/parentpoller.py b/ipykernel/parentpoller.py index b6b34f7e5..a6d9c7538 100644 --- a/ipykernel/parentpoller.py +++ b/ipykernel/parentpoller.py @@ -66,7 +66,7 @@ def __init__(self, interrupt_handle=None, parent_handle=None): assert interrupt_handle or parent_handle super().__init__() if ctypes is None: - msg = "ParentPollerWindows requires ctypes" + msg = "ParentPollerWindows requires ctypes" # type:ignore[unreachable] raise ImportError(msg) self.daemon = True self.interrupt_handle = interrupt_handle diff --git a/ipykernel/trio_runner.py b/ipykernel/trio_runner.py index 62fc9ea35..977302a8a 100644 --- a/ipykernel/trio_runner.py +++ b/ipykernel/trio_runner.py @@ -65,6 +65,6 @@ async def loc(coro): self._cell_cancel_scope = trio.CancelScope() with self._cell_cancel_scope: return await coro - self._cell_cancel_scope = None + self._cell_cancel_scope = None # type:ignore[unreachable] return trio.from_thread.run(loc, async_fn, trio_token=self._trio_token) diff --git a/pyproject.toml b/pyproject.toml index 8cb453302..21181273e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,7 +86,7 @@ path = "ipykernel/_version.py" features = ["docs"] [tool.hatch.envs.docs.scripts] build = "make -C docs html SPHINXOPTS='-W'" -api = "sphinx-apidoc -o docs/api -f -E ipykernel ipykernel/tests ipykernel/inprocess/tests ipykernel/datapub.py ipykernel/pickleutil.py ipykernel/serialize.py ipykernel/gui ipykernel/pylab" +api = "sphinx-apidoc -o docs/api -f -E ipykernel tests ipykernel/datapub.py ipykernel/pickleutil.py ipykernel/serialize.py ipykernel/gui ipykernel/pylab" [tool.hatch.envs.test] features = ["test"] @@ -112,7 +112,7 @@ matrix.qt.features = [ [tool.hatch.envs.typing] features = ["test"] -dependencies = ["mypy>=0.990"] +dependencies = ["mypy>=1.5.1"] [tool.hatch.envs.typing.scripts] test = "mypy --install-types --non-interactive {args:.}" @@ -135,6 +135,7 @@ fmt = [ check_untyped_defs = true disallow_incomplete_defs = true disallow_untyped_decorators = true +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] follow_imports = "normal" ignore_missing_imports = true no_implicit_optional = true @@ -147,13 +148,34 @@ strict_optional = true warn_unused_configs = true warn_redundant_casts = true warn_return_any = true +warn_unreachable = true warn_unused_ignores = true +[[tool.mypy.overrides]] +module = "tests.*" +disable_error_code = ["ignore-without-code"] +warn_unreachable = false + [tool.pytest.ini_options] -addopts = "-raXs --durations 10 --color=yes --doctest-modules --ignore=ipykernel/pylab/backend_inline.py --ignore=ipykernel/pylab/config.py --ignore=ipykernel/gui/gtk3embed.py --ignore=ipykernel/gui/gtkembed.py --ignore=ipykernel/datapub.py --ignore=ipykernel/log.py --ignore=ipykernel/pickleutil.py --ignore=ipykernel/serialize.py --ignore=ipykernel/_eventloop_macos.py" +minversion = "6.0" +xfail_strict = true +log_cli_level = "info" +addopts = [ + "-raXs", "--durations=10", "--color=yes", "--doctest-modules", + "--showlocals", "--strict-markers", "--strict-config", + "--ignore=ipykernel/pylab/backend_inline.py", + "--ignore=ipykernel/pylab/config.py", + "--ignore=ipykernel/gui/gtk3embed.py", + "--ignore=ipykernel/gui/gtkembed.py", + "--ignore=ipykernel/datapub.py", + "--ignore=ipykernel/log.py", + "--ignore=ipykernel/pickleutil.py", + "--ignore=ipykernel/serialize.py", + "--ignore=ipykernel/_eventloop_macos.py" +] testpaths = [ - "ipykernel/tests", - "ipykernel/inprocess/tests" + "tests", + "tests/inprocess" ] asyncio_mode = "auto" timeout = 300 @@ -195,14 +217,13 @@ exclude_lines = [ relative_files = true source = ["ipykernel"] omit = [ - "ipykernel/tests/*", + "tests/*", "ipykernel/datapub.py", "ipykernel/debugger.py", "ipykernel/eventloops.py", "ipykernel/log.py", "ipykernel/pickleutil.py", "ipykernel/serialize.py", - "ipykernel/inprocess/tests/*", "ipykernel/gui/*", "ipykernel/pylab/*", ] @@ -304,7 +325,7 @@ unfixable = [ # PLC1901 `stderr == ""` can be simplified to `not stderr` as an empty string is falsey # B018 Found useless expression. Either assign it to a variable or remove it. # S603 `subprocess` call: check for execution of untrusted input -"ipykernel/tests/*" = ["B011", "F841", "C408", "E402", "T201", "B007", "N802", "F841", "EM101", +"tests/*" = ["B011", "F841", "C408", "E402", "T201", "B007", "N802", "F841", "EM101", "EM102", "EM103", "PLR2004", "PLW0603", "PLW2901", "PLC1901", "B018", "S603"] [tool.interrogate] @@ -315,8 +336,11 @@ ignore-property-decorators=true ignore-nested-functions=true ignore-nested-classes=true fail-under=95 -exclude = ["docs", "*/tests"] +exclude = ["docs", "tests"] [tool.check-wheel-contents] toplevel = ["ipykernel/", "ipykernel_launcher.py"] ignore = ["W002"] + +[tool.repo-review] +ignore = ["PY007", "PP308", "GH102", "PC140", "MY101"] diff --git a/ipykernel/tests/__init__.py b/tests/__init__.py similarity index 100% rename from ipykernel/tests/__init__.py rename to tests/__init__.py diff --git a/ipykernel/tests/_asyncio_utils.py b/tests/_asyncio_utils.py similarity index 100% rename from ipykernel/tests/_asyncio_utils.py rename to tests/_asyncio_utils.py diff --git a/ipykernel/tests/conftest.py b/tests/conftest.py similarity index 100% rename from ipykernel/tests/conftest.py rename to tests/conftest.py diff --git a/ipykernel/inprocess/tests/__init__.py b/tests/inprocess/__init__.py similarity index 100% rename from ipykernel/inprocess/tests/__init__.py rename to tests/inprocess/__init__.py diff --git a/ipykernel/inprocess/tests/test_kernel.py b/tests/inprocess/test_kernel.py similarity index 98% rename from ipykernel/inprocess/tests/test_kernel.py rename to tests/inprocess/test_kernel.py index b85c4bdfe..793485d95 100644 --- a/ipykernel/inprocess/tests/test_kernel.py +++ b/tests/inprocess/test_kernel.py @@ -12,7 +12,8 @@ from ipykernel.inprocess.blocking import BlockingInProcessKernelClient from ipykernel.inprocess.ipkernel import InProcessKernel from ipykernel.inprocess.manager import InProcessKernelManager -from ipykernel.tests.utils import assemble_output + +from ..utils import assemble_output orig_msg = Session.msg diff --git a/ipykernel/inprocess/tests/test_kernelmanager.py b/tests/inprocess/test_kernelmanager.py similarity index 100% rename from ipykernel/inprocess/tests/test_kernelmanager.py rename to tests/inprocess/test_kernelmanager.py diff --git a/ipykernel/tests/test_async.py b/tests/test_async.py similarity index 100% rename from ipykernel/tests/test_async.py rename to tests/test_async.py diff --git a/ipykernel/tests/test_comm.py b/tests/test_comm.py similarity index 100% rename from ipykernel/tests/test_comm.py rename to tests/test_comm.py diff --git a/ipykernel/tests/test_connect.py b/tests/test_connect.py similarity index 100% rename from ipykernel/tests/test_connect.py rename to tests/test_connect.py diff --git a/ipykernel/tests/test_debugger.py b/tests/test_debugger.py similarity index 98% rename from ipykernel/tests/test_debugger.py rename to tests/test_debugger.py index c46064425..48fafb42e 100644 --- a/ipykernel/tests/test_debugger.py +++ b/tests/test_debugger.py @@ -121,7 +121,11 @@ def test_set_breakpoints(kernel_with_debug): assert reply["body"]["breakpoints"][0]["source"]["path"] == source r = wait_for_debug_request(kernel_with_debug, "debugInfo") - assert source in map(lambda b: b["source"], r["body"]["breakpoints"]) # noqa + + def func(b): + return b["source"] + + assert source in map(func, r["body"]["breakpoints"]) r = wait_for_debug_request(kernel_with_debug, "configurationDone") assert r["success"] @@ -208,7 +212,11 @@ def test_rich_inspect_not_at_breakpoint(kernel_with_debug): get_reply(kernel_with_debug, msg_id) r = wait_for_debug_request(kernel_with_debug, "inspectVariables") - assert var_name in list(map(lambda v: v["name"], r["body"]["variables"])) # noqa + + def func(v): + return v["name"] + + assert var_name in list(map(func, r["body"]["variables"])) reply = wait_for_debug_request( kernel_with_debug, diff --git a/ipykernel/tests/test_embed_kernel.py b/tests/test_embed_kernel.py similarity index 100% rename from ipykernel/tests/test_embed_kernel.py rename to tests/test_embed_kernel.py diff --git a/ipykernel/tests/test_eventloop.py b/tests/test_eventloop.py similarity index 97% rename from ipykernel/tests/test_eventloop.py rename to tests/test_eventloop.py index a4d18d114..26924cfbe 100644 --- a/ipykernel/tests/test_eventloop.py +++ b/tests/test_eventloop.py @@ -57,7 +57,7 @@ def teardown(): async_code = """ -from ipykernel.tests._asyncio_utils import async_func +from tests._asyncio_utils import async_func async_func() """ @@ -144,7 +144,7 @@ def test_qt_enable_gui(kernel, capsys): enable_gui(gui, kernel) assert app == kernel.app - # Event loop intergration can be turned off. + # Event loop integration can be turned off. enable_gui(None, kernel) assert not hasattr(kernel, 'app') diff --git a/ipykernel/tests/test_heartbeat.py b/tests/test_heartbeat.py similarity index 100% rename from ipykernel/tests/test_heartbeat.py rename to tests/test_heartbeat.py diff --git a/ipykernel/tests/test_io.py b/tests/test_io.py similarity index 99% rename from ipykernel/tests/test_io.py rename to tests/test_io.py index fee1e6020..98f047899 100644 --- a/ipykernel/tests/test_io.py +++ b/tests/test_io.py @@ -125,7 +125,6 @@ async def test_event_pipe_gc(iopub_thread): isatty=True, watchfd=False, ) - save_stdout = sys.stdout assert iopub_thread._event_pipes == {} with stream, mock.patch.object(sys, "stdout", stream), ThreadPoolExecutor(1) as pool: pool.submit(print, "x").result() @@ -201,7 +200,6 @@ def test_echo_watch(ctx): port = s.bind_to_random_port("tcp://127.0.0.1") url = f"tcp://127.0.0.1:{port}" session = Session(key=b'abc') - messages = [] stdout_chunks = [] with s: env = dict(os.environ) diff --git a/ipykernel/tests/test_ipkernel_direct.py b/tests/test_ipkernel_direct.py similarity index 98% rename from ipykernel/tests/test_ipkernel_direct.py rename to tests/test_ipkernel_direct.py index b0dbb01f5..c9201348c 100644 --- a/ipykernel/tests/test_ipkernel_direct.py +++ b/tests/test_ipkernel_direct.py @@ -96,7 +96,8 @@ async def test_direct_interrupt_request(ipkernel): # test failure on interrupt request def raiseOSError(): - raise OSError("evalue") + msg = "evalue" + raise OSError(msg) ipkernel._send_interrupt_children = raiseOSError reply = await ipkernel.test_control_message("interrupt_request", {}) @@ -212,5 +213,5 @@ def test_finish_metadata(ipkernel: IPythonKernel) -> None: async def test_do_debug_request(ipkernel: IPythonKernel) -> None: msg = ipkernel.session.msg("debug_request", {}) - msg_list = ipkernel.session.serialize(msg) + ipkernel.session.serialize(msg) await ipkernel.do_debug_request(msg) diff --git a/ipykernel/tests/test_jsonutil.py b/tests/test_jsonutil.py similarity index 97% rename from ipykernel/tests/test_jsonutil.py rename to tests/test_jsonutil.py index faace16a7..2f7e5dbcd 100644 --- a/ipykernel/tests/test_jsonutil.py +++ b/tests/test_jsonutil.py @@ -11,8 +11,8 @@ import pytest from jupyter_client._version import version_info as jupyter_client_version -from .. import jsonutil -from ..jsonutil import encode_images, json_clean +from ipykernel import jsonutil +from ipykernel.jsonutil import encode_images, json_clean JUPYTER_CLIENT_MAJOR_VERSION: int = jupyter_client_version[0] # type:ignore diff --git a/ipykernel/tests/test_kernel.py b/tests/test_kernel.py similarity index 98% rename from ipykernel/tests/test_kernel.py rename to tests/test_kernel.py index 49fc1c08d..07411bd13 100644 --- a/ipykernel/tests/test_kernel.py +++ b/tests/test_kernel.py @@ -42,7 +42,7 @@ def _check_master(kc, expected=True, stream="stdout"): def _check_status(content): """If status=error, show the traceback""" if content["status"] == "error": - assert False, "".join(["\n"] + content["traceback"]) + raise AssertionError("".join(["\n"] + content["traceback"])) # printing tests @@ -196,12 +196,10 @@ def test_subprocess_error(): def test_raw_input(): """test input""" with kernel() as kc: - iopub = kc.iopub_channel - input_f = "input" theprompt = "prompt> " code = f'print({input_f}("{theprompt}"))' - msg_id = kc.execute(code, allow_stdin=True) + kc.execute(code, allow_stdin=True) msg = kc.get_stdin_msg(timeout=TIMEOUT) assert msg["header"]["msg_type"] == "input_request" content = msg["content"] @@ -232,7 +230,7 @@ def test_save_history(): def test_smoke_faulthandler(): - faulthadler = pytest.importorskip("faulthandler", reason="this test needs faulthandler") + pytest.importorskip("faulthandler", reason="this test needs faulthandler") with kernel() as kc: # Note: faulthandler.register is not available on windows. code = "\n".join( diff --git a/ipykernel/tests/test_kernel_direct.py b/tests/test_kernel_direct.py similarity index 99% rename from ipykernel/tests/test_kernel_direct.py rename to tests/test_kernel_direct.py index 7f47aaedd..dfb8a70fe 100644 --- a/ipykernel/tests/test_kernel_direct.py +++ b/tests/test_kernel_direct.py @@ -75,7 +75,8 @@ async def test_direct_interrupt_request(kernel): # test failure on interrupt request def raiseOSError(): - raise OSError("evalue") + msg = "evalue" + raise OSError(msg) kernel._send_interrupt_children = raiseOSError reply = await kernel.test_control_message("interrupt_request", {}) diff --git a/ipykernel/tests/test_kernelapp.py b/tests/test_kernelapp.py similarity index 100% rename from ipykernel/tests/test_kernelapp.py rename to tests/test_kernelapp.py diff --git a/ipykernel/tests/test_kernelspec.py b/tests/test_kernelspec.py similarity index 100% rename from ipykernel/tests/test_kernelspec.py rename to tests/test_kernelspec.py diff --git a/ipykernel/tests/test_message_spec.py b/tests/test_message_spec.py similarity index 98% rename from ipykernel/tests/test_message_spec.py rename to tests/test_message_spec.py index 5710cf297..0c9e777cd 100644 --- a/ipykernel/tests/test_message_spec.py +++ b/tests/test_message_spec.py @@ -53,7 +53,7 @@ def check(self, d): try: setattr(self, key, d[key]) except TraitError as e: - assert False, str(e) + raise AssertionError(str(e)) from None class Version(Unicode): @@ -65,9 +65,11 @@ def __init__(self, *args, **kwargs): def validate(self, obj, value): if self.min and V(value) < V(self.min): - raise TraitError(f"bad version: {value} < {self.min}") + msg = f"bad version: {value} < {self.min}" + raise TraitError(msg) if self.max and (V(value) > V(self.max)): - raise TraitError(f"bad version: {value} > {self.max}") + msg = f"bad version: {value} > {self.max}" + raise TraitError(msg) class RMessage(Reference): @@ -469,7 +471,7 @@ def test_oinfo_detail(): def test_oinfo_not_found(): flush_channels() - msg_id = KC.inspect("dne") + msg_id = KC.inspect("does_not_exist") reply = get_reply(KC, msg_id, TIMEOUT) validate_message(reply, "inspect_reply", msg_id) content = reply["content"] diff --git a/ipykernel/tests/test_parentpoller.py b/tests/test_parentpoller.py similarity index 95% rename from ipykernel/tests/test_parentpoller.py rename to tests/test_parentpoller.py index 22df132e7..c40a47204 100644 --- a/ipykernel/tests/test_parentpoller.py +++ b/tests/test_parentpoller.py @@ -20,7 +20,8 @@ def exit_mock(*args): poller.run() def mock_getppid(): - raise ValueError("hi") + msg = "hi" + raise ValueError(msg) with mock.patch("os.getppid", mock_getppid), pytest.raises(ValueError): poller.run() diff --git a/ipykernel/tests/test_pickleutil.py b/tests/test_pickleutil.py similarity index 100% rename from ipykernel/tests/test_pickleutil.py rename to tests/test_pickleutil.py diff --git a/ipykernel/tests/test_start_kernel.py b/tests/test_start_kernel.py similarity index 96% rename from ipykernel/tests/test_start_kernel.py rename to tests/test_start_kernel.py index b2b2d3b8c..f2a632be0 100644 --- a/ipykernel/tests/test_start_kernel.py +++ b/tests/test_start_kernel.py @@ -17,13 +17,13 @@ def test_ipython_start_kernel_userns(): cmd = dedent( """ from ipykernel.kernelapp import launch_new_instance - ns = {"tre": 123} + ns = {"custom": 123} launch_new_instance(user_ns=ns) """ ) with setup_kernel(cmd) as client: - client.inspect("tre") + client.inspect("custom") msg = client.get_shell_msg(timeout=TIMEOUT) content = msg["content"] assert content["found"] diff --git a/ipykernel/tests/test_zmq_shell.py b/tests/test_zmq_shell.py similarity index 100% rename from ipykernel/tests/test_zmq_shell.py rename to tests/test_zmq_shell.py diff --git a/ipykernel/tests/utils.py b/tests/utils.py similarity index 100% rename from ipykernel/tests/utils.py rename to tests/utils.py