- Update to 6.1.5 * Fix open redirect vulnerability GHSA-c7vm-f5p4-8fqh (CVE to be assigned) - Changes for 6.1.4 * Fix broken links to jupyter documentation * Add additional entries to troubleshooting section * Revert change in page alignment * Bug fix: remove double encoding in download files * Fix typo for Check in zh_CN * Require a file name in the "Save As" dialog - Changes for 6.1.3 * Title new buttons with label if action undefined - Changes for 6.1.2 * Fix russian message format for delete/duplicate actions * Remove unnecessary import of bind_unix_socket * Tooltip style scope fix - Changes for 6.1.1 * Prevent inclusion of requests_unixsocket on Windows - Changes for 6.1.0 Please note that this repository is currently maintained by a skeleton crew of maintainers from the Jupyter community. For our approach moving forward, please see this notice from the README. Thank you. * Remove deprecated encoding parameter for Python 3.9 compatibility. * Add support for async kernel management * Fix typo in password_required help message * Gateway only: Ensure launch and request timeouts are in sync * Update Markdown Cells example to HTML5 video tag * Integrated LoginWidget into edit to enable users to logout from the t… * Update message about minimum Tornado version * Logged notebook type * Added nl language * Add UNIX socket support to notebook server. * Update CodeMirror dependency * Tree added download multiple files * Toolbar buttons tooltip: show help instead of label * Remove unnecessary import of requests_unixsocket * Add ability to cull terminals and track last activity * Code refactoring notebook.js * Install terminado for docs build * Convert notifications JS test to selenium * Add cell attachments to markdown example * Add Japanese document * Migrate Move multiselection test to selenium * Use cmdtrl-enter to run a cell * Fix broken "Raw cell MIME type" dialog * Make a notebook writable after successful save-as * Add actual watch script * Added --autoreload flag to NotebookApp * Enable check_origin on gateway websocket communication * Restore detection of missing terminado package * Culling: ensure last_activity attr exists before use * Added functionality to allow filter kernels by Jupyter Enterprise Gat… * 'Play' icon for run-cell toolbar button * Bump minimum version of jQuery to 3.5.0 * Remove old JS markdown tests, add a new one in selenium * Add support for more RTL languages * Make markdown cells stay RTL in edit mode * Unforce RTL output display * Fixed multicursor backspacing * Implemented Split Cell for multicursor * Alignment issue [FIXED] * MathJax: Support for \gdef * Another (Minor) Duplicate Code Reduction * Update readme regarding maintenance * Document contents chunks * Backspace deletes empty line * The dropdown submenu at notebook page is not keyboard accessible * Tooltips visible through keyboard navigation for specified buttons * Fix for recursive symlink * Fix for the terminal shutdown issue * Add japanese translation files * Workaround for socket permission errors on Cygwin * Implement optional markdown header and footer files * Remove double link when using custom_display_url * Respect cell.is_editable during find-and-replace * Fix exception causes all over the codebase (:ghpull:`5556` * Improve login shell heuristics * Added support for JUPYTER_TOKEN_FILE * Kill notebook itself when server cull idle kernel * Implement password hashing with bcrypt * Fix broken links * Russian internationalization support * Add a metadata tag to override notebook direction (ltr/rtl) * Paste two images from clipboard in markdown cell * Add keyboard shortcuts to menu dropdowns * Update codemirror to 5.56.0+components1 - refresh remove_nose.patch based on gh#jupyter/notebook#5826 - move the entrypoints to the flavored python package and make them alternatives - tag language files OBS-URL: https://build.opensuse.org/request/show/857913 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:jupyter/python-notebook?expand=0&rev=25
705 lines
28 KiB
Diff
705 lines
28 KiB
Diff
From 1c3dbcc6bf73c71e2cb8f1f1da846f141cc68d58 Mon Sep 17 00:00:00 2001
|
|
From: pgajdos <pgajdos@suse.cz>
|
|
Date: Thu, 22 Oct 2020 15:34:17 +0200
|
|
Subject: [PATCH 1/6] do not use nose for testing
|
|
|
|
---
|
|
notebook/auth/tests/test_security.py | 13 ++---
|
|
.../services/contents/tests/test_fileio.py | 56 +++++++++----------
|
|
.../services/contents/tests/test_manager.py | 15 ++---
|
|
notebook/tests/test_gateway.py | 33 ++++++-----
|
|
notebook/tests/test_i18n.py | 9 +--
|
|
notebook/tests/test_nbextensions.py | 9 +--
|
|
notebook/tests/test_notebookapp.py | 38 ++++++-------
|
|
notebook/tests/test_paths.py | 7 ++-
|
|
notebook/tests/test_serialize.py | 6 +-
|
|
notebook/tests/test_utils.py | 44 +++++++--------
|
|
10 files changed, 109 insertions(+), 121 deletions(-)
|
|
|
|
Index: notebook-6.1.5/notebook/auth/tests/test_security.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/auth/tests/test_security.py
|
|
+++ notebook-6.1.5/notebook/auth/tests/test_security.py
|
|
@@ -1,22 +1,21 @@
|
|
# coding: utf-8
|
|
from ..security import passwd, passwd_check
|
|
-import nose.tools as nt
|
|
|
|
def test_passwd_structure():
|
|
p = passwd('passphrase')
|
|
algorithm, hashed = p.split(':')
|
|
- nt.assert_equal(algorithm, 'argon2')
|
|
- nt.assert_true(hashed.startswith('$argon2id$'))
|
|
+ assert algorithm == 'argon2'
|
|
+ assert hashed.startswith('$argon2id$')
|
|
|
|
def test_roundtrip():
|
|
p = passwd('passphrase')
|
|
- nt.assert_equal(passwd_check(p, 'passphrase'), True)
|
|
+ assert passwd_check(p, 'passphrase') == True
|
|
|
|
def test_bad():
|
|
p = passwd('passphrase')
|
|
- nt.assert_equal(passwd_check(p, p), False)
|
|
- nt.assert_equal(passwd_check(p, 'a:b:c:d'), False)
|
|
- nt.assert_equal(passwd_check(p, 'a:b'), False)
|
|
+ assert passwd_check(p, p) == False
|
|
+ assert passwd_check(p, 'a:b:c:d') == False
|
|
+ assert passwd_check(p, 'a:b') == False
|
|
|
|
def test_passwd_check_unicode():
|
|
# GH issue #4524
|
|
Index: notebook-6.1.5/notebook/services/contents/tests/test_fileio.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/services/contents/tests/test_fileio.py
|
|
+++ notebook-6.1.5/notebook/services/contents/tests/test_fileio.py
|
|
@@ -6,11 +6,11 @@
|
|
|
|
import io as stdlib_io
|
|
import os.path
|
|
+import unittest
|
|
+import pytest
|
|
import stat
|
|
+import sys
|
|
|
|
-import nose.tools as nt
|
|
-
|
|
-from ipython_genutils.testing.decorators import skip_win32
|
|
from ..fileio import atomic_writing
|
|
|
|
from ipython_genutils.tempdir import TemporaryDirectory
|
|
@@ -39,24 +39,24 @@ def test_atomic_writing():
|
|
# OSError: The user lacks the privilege (Windows)
|
|
have_symlink = False
|
|
|
|
- with nt.assert_raises(CustomExc):
|
|
+ with pytest.raises(CustomExc):
|
|
with atomic_writing(f1) as f:
|
|
f.write(u'Failing write')
|
|
raise CustomExc
|
|
|
|
# Because of the exception, the file should not have been modified
|
|
with stdlib_io.open(f1, 'r') as f:
|
|
- nt.assert_equal(f.read(), u'Before')
|
|
+ assert f.read() == u'Before'
|
|
|
|
with atomic_writing(f1) as f:
|
|
f.write(u'Overwritten')
|
|
|
|
with stdlib_io.open(f1, 'r') as f:
|
|
- nt.assert_equal(f.read(), u'Overwritten')
|
|
+ assert f.read() == u'Overwritten'
|
|
|
|
if os.name != 'nt':
|
|
mode = stat.S_IMODE(os.stat(f1).st_mode)
|
|
- nt.assert_equal(mode, orig_mode)
|
|
+ assert mode == orig_mode
|
|
|
|
if have_symlink:
|
|
# Check that writing over a file preserves a symlink
|
|
@@ -64,33 +64,35 @@ def test_atomic_writing():
|
|
f.write(u'written from symlink')
|
|
|
|
with stdlib_io.open(f1, 'r') as f:
|
|
- nt.assert_equal(f.read(), u'written from symlink')
|
|
+ assert f.read() == u'written from symlink'
|
|
|
|
-def _save_umask():
|
|
- global umask
|
|
- umask = os.umask(0)
|
|
- os.umask(umask)
|
|
-
|
|
-def _restore_umask():
|
|
- os.umask(umask)
|
|
-
|
|
-@skip_win32
|
|
-@nt.with_setup(_save_umask, _restore_umask)
|
|
-def test_atomic_writing_umask():
|
|
- with TemporaryDirectory() as td:
|
|
- os.umask(0o022)
|
|
- f1 = os.path.join(td, '1')
|
|
- with atomic_writing(f1) as f:
|
|
- f.write(u'1')
|
|
- mode = stat.S_IMODE(os.stat(f1).st_mode)
|
|
- nt.assert_equal(mode, 0o644, '{:o} != 644'.format(mode))
|
|
-
|
|
- os.umask(0o057)
|
|
- f2 = os.path.join(td, '2')
|
|
- with atomic_writing(f2) as f:
|
|
- f.write(u'2')
|
|
- mode = stat.S_IMODE(os.stat(f2).st_mode)
|
|
- nt.assert_equal(mode, 0o620, '{:o} != 620'.format(mode))
|
|
+class TestWithSetUmask(unittest.TestCase):
|
|
+ def setUp(self):
|
|
+ # save umask
|
|
+ global umask
|
|
+ umask = os.umask(0)
|
|
+ os.umask(umask)
|
|
+
|
|
+ def tearDown(self):
|
|
+ # restore umask
|
|
+ os.umask(umask)
|
|
+
|
|
+ @pytest.mark.skipif(sys.platform == "win32", reason="do not run on windows")
|
|
+ def test_atomic_writing_umask(self):
|
|
+ with TemporaryDirectory() as td:
|
|
+ os.umask(0o022)
|
|
+ f1 = os.path.join(td, '1')
|
|
+ with atomic_writing(f1) as f:
|
|
+ f.write(u'1')
|
|
+ mode = stat.S_IMODE(os.stat(f1).st_mode)
|
|
+ assert mode == 0o644
|
|
+
|
|
+ os.umask(0o057)
|
|
+ f2 = os.path.join(td, '2')
|
|
+ with atomic_writing(f2) as f:
|
|
+ f.write(u'2')
|
|
+ mode = stat.S_IMODE(os.stat(f2).st_mode)
|
|
+ assert mode == 0o620
|
|
|
|
|
|
def test_atomic_writing_newlines():
|
|
@@ -106,21 +108,21 @@ def test_atomic_writing_newlines():
|
|
f.write(lf)
|
|
with stdlib_io.open(path, 'r', newline='') as f:
|
|
read = f.read()
|
|
- nt.assert_equal(read, plat)
|
|
+ assert read == plat
|
|
|
|
# test newline=LF
|
|
with stdlib_io.open(path, 'w', newline='\n') as f:
|
|
f.write(lf)
|
|
with stdlib_io.open(path, 'r', newline='') as f:
|
|
read = f.read()
|
|
- nt.assert_equal(read, lf)
|
|
+ assert read == lf
|
|
|
|
# test newline=CRLF
|
|
with atomic_writing(path, newline='\r\n') as f:
|
|
f.write(lf)
|
|
with stdlib_io.open(path, 'r', newline='') as f:
|
|
read = f.read()
|
|
- nt.assert_equal(read, crlf)
|
|
+ assert read == crlf
|
|
|
|
# test newline=no convert
|
|
text = u'crlf\r\ncr\rlf\n'
|
|
@@ -128,4 +130,4 @@ def test_atomic_writing_newlines():
|
|
f.write(text)
|
|
with stdlib_io.open(path, 'r', newline='') as f:
|
|
read = f.read()
|
|
- nt.assert_equal(read, text)
|
|
+ assert read == text
|
|
Index: notebook-6.1.5/notebook/services/contents/tests/test_manager.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/services/contents/tests/test_manager.py
|
|
+++ notebook-6.1.5/notebook/services/contents/tests/test_manager.py
|
|
@@ -8,16 +8,14 @@ import time
|
|
from contextlib import contextmanager
|
|
from itertools import combinations
|
|
|
|
-from nose import SkipTest
|
|
from tornado.web import HTTPError
|
|
-from unittest import TestCase
|
|
+from unittest import TestCase, skipIf
|
|
from tempfile import NamedTemporaryFile
|
|
|
|
from nbformat import v4 as nbformat
|
|
|
|
from ipython_genutils.tempdir import TemporaryDirectory
|
|
from traitlets import TraitError
|
|
-from ipython_genutils.testing import decorators as dec
|
|
|
|
from ..filemanager import FileContentsManager
|
|
|
|
@@ -108,7 +106,7 @@ class TestFileContentsManager(TestCase):
|
|
self.assertEqual(cp_dir, os.path.join(root, cpm.checkpoint_dir, cp_name))
|
|
self.assertEqual(cp_subdir, os.path.join(root, subd, cpm.checkpoint_dir, cp_name))
|
|
|
|
- @dec.skipif(sys.platform == 'win32' and sys.version_info[0] < 3)
|
|
+ @skipIf(sys.platform == 'win32' and sys.version_info[0] < 3, "will not run on windows")
|
|
def test_bad_symlink(self):
|
|
with TemporaryDirectory() as td:
|
|
cm = FileContentsManager(root_dir=td)
|
|
@@ -129,7 +127,7 @@ class TestFileContentsManager(TestCase):
|
|
# broken symlinks should still be shown in the contents manager
|
|
self.assertTrue('bad symlink' in contents)
|
|
|
|
- @dec.skipif(sys.platform == 'win32')
|
|
+ @skipIf(sys.platform == 'win32', "will not run on windows")
|
|
def test_recursive_symlink(self):
|
|
with TemporaryDirectory() as td:
|
|
cm = FileContentsManager(root_dir=td)
|
|
@@ -149,7 +147,7 @@ class TestFileContentsManager(TestCase):
|
|
# recursive symlinks should not be shown in the contents manager
|
|
self.assertNotIn('recursive', contents)
|
|
|
|
- @dec.skipif(sys.platform == 'win32' and sys.version_info[0] < 3)
|
|
+ @skipIf(sys.platform == 'win32' and sys.version_info[0] < 3, "will not run on windows")
|
|
def test_good_symlink(self):
|
|
with TemporaryDirectory() as td:
|
|
cm = FileContentsManager(root_dir=td)
|
|
@@ -169,13 +167,10 @@ class TestFileContentsManager(TestCase):
|
|
[symlink_model, file_model],
|
|
)
|
|
|
|
- def test_403(self):
|
|
- if hasattr(os, 'getuid'):
|
|
- if os.getuid() == 0:
|
|
- raise SkipTest("Can't test permissions as root")
|
|
- if sys.platform.startswith('win'):
|
|
- raise SkipTest("Can't test permissions on Windows")
|
|
|
|
+ @skipIf(hasattr(os, 'getuid') and os.getuid() == 0, "Can't test permissions as root")
|
|
+ @skipIf(sys.platform.startswith('win'), "Can't test permissions on Windows")
|
|
+ def test_403(self):
|
|
with TemporaryDirectory() as td:
|
|
cm = FileContentsManager(root_dir=td)
|
|
model = cm.new_untitled(type='file')
|
|
Index: notebook-6.1.5/notebook/tests/test_gateway.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_gateway.py
|
|
+++ notebook-6.1.5/notebook/tests/test_gateway.py
|
|
@@ -6,7 +6,6 @@ from datetime import datetime
|
|
from io import StringIO
|
|
from unittest.mock import patch
|
|
|
|
-import nose.tools as nt
|
|
from tornado import gen
|
|
from tornado.web import HTTPError
|
|
from tornado.httpclient import HTTPRequest, HTTPResponse
|
|
@@ -72,7 +71,7 @@ def mock_gateway_request(url, **kwargs):
|
|
name = json_body.get('name')
|
|
env = json_body.get('env')
|
|
kspec_name = env.get('KERNEL_KSPEC_NAME')
|
|
- nt.assert_equal(name, kspec_name) # Ensure that KERNEL_ env values get propagated
|
|
+ assert name == kspec_name # Ensure that KERNEL_ env values get propagated
|
|
model = generate_model(name)
|
|
running_kernels[model.get('id')] = model # Register model as a running kernel
|
|
response_buf = StringIO(json.dumps(model))
|
|
@@ -164,19 +163,19 @@ class TestGateway(NotebookTestBase):
|
|
super(TestGateway, self).setUp()
|
|
|
|
def test_gateway_options(self):
|
|
- nt.assert_equal(self.notebook.gateway_config.gateway_enabled, True)
|
|
- nt.assert_equal(self.notebook.gateway_config.url, TestGateway.mock_gateway_url)
|
|
- nt.assert_equal(self.notebook.gateway_config.http_user, TestGateway.mock_http_user)
|
|
- nt.assert_equal(self.notebook.gateway_config.connect_timeout, self.notebook.gateway_config.connect_timeout)
|
|
- nt.assert_equal(self.notebook.gateway_config.connect_timeout, 44.4)
|
|
- nt.assert_equal(self.notebook.gateway_config.request_timeout, 96.0)
|
|
- nt.assert_equal(os.environ['KERNEL_LAUNCH_TIMEOUT'], str(96)) # Ensure KLT gets set from request-timeout
|
|
+ assert self.notebook.gateway_config.gateway_enabled == True
|
|
+ assert self.notebook.gateway_config.url == TestGateway.mock_gateway_url
|
|
+ assert self.notebook.gateway_config.http_user == TestGateway.mock_http_user
|
|
+ assert self.notebook.gateway_config.connect_timeout == self.notebook.gateway_config.connect_timeout
|
|
+ assert self.notebook.gateway_config.connect_timeout == 44.4
|
|
+ assert self.notebook.gateway_config.request_timeout == 96.0
|
|
+ assert os.environ['KERNEL_LAUNCH_TIMEOUT'] == str(96) # Ensure KLT gets set from request-timeout
|
|
|
|
def test_gateway_class_mappings(self):
|
|
# Ensure appropriate class mappings are in place.
|
|
- nt.assert_equal(self.notebook.kernel_manager_class.__name__, 'GatewayKernelManager')
|
|
- nt.assert_equal(self.notebook.session_manager_class.__name__, 'GatewaySessionManager')
|
|
- nt.assert_equal(self.notebook.kernel_spec_manager_class.__name__, 'GatewayKernelSpecManager')
|
|
+ assert self.notebook.kernel_manager_class.__name__ == 'GatewayKernelManager'
|
|
+ assert self.notebook.session_manager_class.__name__ == 'GatewaySessionManager'
|
|
+ assert self.notebook.kernel_spec_manager_class.__name__ == 'GatewayKernelSpecManager'
|
|
|
|
def test_gateway_get_kernelspecs(self):
|
|
# Validate that kernelspecs come from gateway.
|
|
@@ -185,19 +184,19 @@ class TestGateway(NotebookTestBase):
|
|
self.assertEqual(response.status_code, 200)
|
|
content = json.loads(response.content.decode('utf-8'))
|
|
kspecs = content.get('kernelspecs')
|
|
- self.assertEqual(len(kspecs), 2)
|
|
- self.assertEqual(kspecs.get('kspec_bar').get('name'), 'kspec_bar')
|
|
+ assert len(kspecs) == 2
|
|
+ assert kspecs.get('kspec_bar').get('name') == 'kspec_bar'
|
|
|
|
def test_gateway_get_named_kernelspec(self):
|
|
# Validate that a specific kernelspec can be retrieved from gateway.
|
|
with mocked_gateway:
|
|
response = self.request('GET', '/api/kernelspecs/kspec_foo')
|
|
- self.assertEqual(response.status_code, 200)
|
|
+ assert response.status_code == 200
|
|
kspec_foo = json.loads(response.content.decode('utf-8'))
|
|
- self.assertEqual(kspec_foo.get('name'), 'kspec_foo')
|
|
+ assert kspec_foo.get('name') == 'kspec_foo'
|
|
|
|
response = self.request('GET', '/api/kernelspecs/no_such_spec')
|
|
- self.assertEqual(response.status_code, 404)
|
|
+ assert response.status_code == 404
|
|
|
|
def test_gateway_session_lifecycle(self):
|
|
# Validate session lifecycle functions; create and delete.
|
|
Index: notebook-6.1.5/notebook/tests/test_i18n.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_i18n.py
|
|
+++ notebook-6.1.5/notebook/tests/test_i18n.py
|
|
@@ -1,10 +1,7 @@
|
|
-import nose.tools as nt
|
|
-
|
|
from notebook import i18n
|
|
|
|
def test_parse_accept_lang_header():
|
|
palh = i18n.parse_accept_lang_header
|
|
- nt.assert_equal(palh(''), [])
|
|
- nt.assert_equal(palh('zh-CN,en-GB;q=0.7,en;q=0.3'),
|
|
- ['en', 'en_GB', 'zh', 'zh_CN'])
|
|
- nt.assert_equal(palh('nl,fr;q=0'), ['nl'])
|
|
+ assert palh('') == []
|
|
+ assert palh('zh-CN,en-GB;q=0.7,en;q=0.3') == ['en', 'en_GB', 'zh', 'zh_CN']
|
|
+ assert palh('nl,fr;q=0') == ['nl']
|
|
Index: notebook-6.1.5/notebook/tests/test_nbextensions.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_nbextensions.py
|
|
+++ notebook-6.1.5/notebook/tests/test_nbextensions.py
|
|
@@ -6,6 +6,7 @@
|
|
|
|
import glob
|
|
import os
|
|
+import pytest
|
|
import sys
|
|
import tarfile
|
|
import zipfile
|
|
@@ -321,7 +322,7 @@ class TestInstallNBExtension(TestCase):
|
|
assert check_nbextension([f], user=True)
|
|
assert not check_nbextension([f, pjoin('dne', f)], user=True)
|
|
|
|
- @dec.skip_win32
|
|
+ @pytest.mark.skipif(sys.platform == "win32", reason="do not run on windows")
|
|
def test_install_symlink(self):
|
|
with TemporaryDirectory() as d:
|
|
f = u'ƒ.js'
|
|
@@ -333,7 +334,7 @@ class TestInstallNBExtension(TestCase):
|
|
link = os.readlink(dest)
|
|
self.assertEqual(link, src)
|
|
|
|
- @dec.skip_win32
|
|
+ @pytest.mark.skipif(sys.platform == "win32", reason="do not run on windows")
|
|
def test_overwrite_broken_symlink(self):
|
|
with TemporaryDirectory() as d:
|
|
f = u'ƒ.js'
|
|
@@ -349,7 +350,7 @@ class TestInstallNBExtension(TestCase):
|
|
link = os.readlink(dest)
|
|
self.assertEqual(link, src2)
|
|
|
|
- @dec.skip_win32
|
|
+ @pytest.mark.skipif(sys.platform == "win32", reason="do not run on windows")
|
|
def test_install_symlink_destination(self):
|
|
with TemporaryDirectory() as d:
|
|
f = u'ƒ.js'
|
|
@@ -362,7 +363,7 @@ class TestInstallNBExtension(TestCase):
|
|
link = os.readlink(dest)
|
|
self.assertEqual(link, src)
|
|
|
|
- @dec.skip_win32
|
|
+ @pytest.mark.skipif(sys.platform == "win32", reason="do not run on windows")
|
|
def test_install_symlink_bad(self):
|
|
with self.assertRaises(ValueError):
|
|
install_nbextension("http://example.com/foo.js", symlink=True)
|
|
Index: notebook-6.1.5/notebook/tests/test_notebookapp.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_notebookapp.py
|
|
+++ notebook-6.1.5/notebook/tests/test_notebookapp.py
|
|
@@ -11,7 +11,7 @@ from tempfile import NamedTemporaryFile
|
|
|
|
from unittest.mock import patch
|
|
|
|
-import nose.tools as nt
|
|
+import pytest
|
|
|
|
from traitlets.tests.utils import check_help_all_output
|
|
|
|
@@ -37,11 +37,11 @@ def test_server_info_file():
|
|
nbapp.initialize(argv=[])
|
|
nbapp.write_server_info_file()
|
|
servers = get_servers()
|
|
- nt.assert_equal(len(servers), 1)
|
|
- nt.assert_equal(servers[0]['port'], nbapp.port)
|
|
- nt.assert_equal(servers[0]['url'], nbapp.connection_url)
|
|
+ assert len(servers) == 1
|
|
+ assert servers[0]['port'] == nbapp.port
|
|
+ assert servers[0]['url'] == nbapp.connection_url
|
|
nbapp.remove_server_info_file()
|
|
- nt.assert_equal(get_servers(), [])
|
|
+ assert get_servers() == []
|
|
|
|
# The ENOENT error should be silenced.
|
|
nbapp.remove_server_info_file()
|
|
@@ -49,43 +49,43 @@ def test_server_info_file():
|
|
def test_nb_dir():
|
|
with TemporaryDirectory() as td:
|
|
app = NotebookApp(notebook_dir=td)
|
|
- nt.assert_equal(app.notebook_dir, td)
|
|
+ assert app.notebook_dir == td
|
|
|
|
def test_no_create_nb_dir():
|
|
with TemporaryDirectory() as td:
|
|
nbdir = os.path.join(td, 'notebooks')
|
|
app = NotebookApp()
|
|
- with nt.assert_raises(TraitError):
|
|
+ with pytest.raises(TraitError):
|
|
app.notebook_dir = nbdir
|
|
|
|
def test_missing_nb_dir():
|
|
with TemporaryDirectory() as td:
|
|
nbdir = os.path.join(td, 'notebook', 'dir', 'is', 'missing')
|
|
app = NotebookApp()
|
|
- with nt.assert_raises(TraitError):
|
|
+ with pytest.raises(TraitError):
|
|
app.notebook_dir = nbdir
|
|
|
|
def test_invalid_nb_dir():
|
|
with NamedTemporaryFile() as tf:
|
|
app = NotebookApp()
|
|
- with nt.assert_raises(TraitError):
|
|
+ with pytest.raises(TraitError):
|
|
app.notebook_dir = tf
|
|
|
|
def test_nb_dir_with_slash():
|
|
with TemporaryDirectory(suffix="_slash" + os.sep) as td:
|
|
app = NotebookApp(notebook_dir=td)
|
|
- nt.assert_false(app.notebook_dir.endswith(os.sep))
|
|
+ assert not app.notebook_dir.endswith(os.sep)
|
|
|
|
def test_nb_dir_root():
|
|
root = os.path.abspath(os.sep) # gets the right value on Windows, Posix
|
|
app = NotebookApp(notebook_dir=root)
|
|
- nt.assert_equal(app.notebook_dir, root)
|
|
+ assert app.notebook_dir == root
|
|
|
|
def test_generate_config():
|
|
with TemporaryDirectory() as td:
|
|
app = NotebookApp(config_dir=td)
|
|
app.initialize(['--generate-config', '--allow-root'])
|
|
- with nt.assert_raises(NoStart):
|
|
+ with pytest.raises(NoStart):
|
|
app.start()
|
|
assert os.path.exists(os.path.join(td, 'jupyter_notebook_config.py'))
|
|
|
|
@@ -100,7 +100,7 @@ def test_pep440_version():
|
|
'1.2.3.dev1.post2',
|
|
]:
|
|
def loc():
|
|
- with nt.assert_raises(ValueError):
|
|
+ with pytest.raises(ValueError):
|
|
raise_on_bad_version(version)
|
|
yield loc
|
|
|
|
@@ -136,13 +136,13 @@ def test_notebook_password():
|
|
app.start()
|
|
nb = NotebookApp()
|
|
nb.load_config_file()
|
|
- nt.assert_not_equal(nb.password, '')
|
|
+ assert nb.password != ''
|
|
passwd_check(nb.password, password)
|
|
|
|
-class TestingStopApp(notebookapp.NbserverStopApp):
|
|
+class MyStopApp(notebookapp.NbserverStopApp):
|
|
"""For testing the logic of NbserverStopApp."""
|
|
def __init__(self, **kwargs):
|
|
- super(TestingStopApp, self).__init__(**kwargs)
|
|
+ super(MyStopApp, self).__init__(**kwargs)
|
|
self.servers_shut_down = []
|
|
|
|
def shutdown_server(self, server):
|
|
@@ -168,20 +168,20 @@ def test_notebook_stop():
|
|
|
|
# test stop with a match
|
|
with mock_servers:
|
|
- app = TestingStopApp()
|
|
+ app = MyStopApp()
|
|
app.initialize(['105'])
|
|
app.start()
|
|
- nt.assert_equal(len(app.servers_shut_down), 1)
|
|
- nt.assert_equal(app.servers_shut_down[0]['port'], 105)
|
|
+ assert len(app.servers_shut_down) == 1
|
|
+ assert app.servers_shut_down[0]['port'] == 105
|
|
|
|
# test no match
|
|
with mock_servers, patch('os.kill') as os_kill:
|
|
- app = TestingStopApp()
|
|
+ app = MyStopApp()
|
|
app.initialize(['999'])
|
|
- with nt.assert_raises(SystemExit) as exc:
|
|
+ with pytest.raises(SystemExit) as exc:
|
|
app.start()
|
|
- nt.assert_equal(exc.exception.code, 1)
|
|
- nt.assert_equal(len(app.servers_shut_down), 0)
|
|
+ assert exc.value.code == 1
|
|
+ assert len(app.servers_shut_down) == 0
|
|
|
|
|
|
class NotebookAppTests(NotebookTestBase):
|
|
Index: notebook-6.1.5/notebook/tests/test_paths.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_paths.py
|
|
+++ notebook-6.1.5/notebook/tests/test_paths.py
|
|
@@ -1,6 +1,5 @@
|
|
|
|
import re
|
|
-from nose.tools import assert_regex, assert_not_regex
|
|
|
|
from notebook.base.handlers import path_regex
|
|
from notebook.utils import url_path_join
|
|
@@ -19,7 +18,7 @@ def test_path_regex():
|
|
'/x/foo/bar',
|
|
'/x/foo/bar.txt',
|
|
):
|
|
- assert_regex(path, path_pat)
|
|
+ assert re.match(path_pat, path)
|
|
|
|
def test_path_regex_bad():
|
|
for path in (
|
|
@@ -32,7 +31,7 @@ def test_path_regex_bad():
|
|
'/y',
|
|
'/y/x/foo',
|
|
):
|
|
- assert_not_regex(path, path_pat)
|
|
+ assert not re.match(path_pat, path)
|
|
|
|
|
|
class RedirectTestCase(NotebookTestBase):
|
|
Index: notebook-6.1.5/notebook/tests/test_serialize.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_serialize.py
|
|
+++ notebook-6.1.5/notebook/tests/test_serialize.py
|
|
@@ -2,8 +2,6 @@
|
|
|
|
import os
|
|
|
|
-import nose.tools as nt
|
|
-
|
|
from jupyter_client.session import Session
|
|
from ..base.zmqhandlers import (
|
|
serialize_binary_message,
|
|
@@ -15,7 +13,7 @@ def test_serialize_binary():
|
|
msg = s.msg('data_pub', content={'a': 'b'})
|
|
msg['buffers'] = [ memoryview(os.urandom(3)) for i in range(3) ]
|
|
bmsg = serialize_binary_message(msg)
|
|
- nt.assert_is_instance(bmsg, bytes)
|
|
+ assert isinstance(bmsg, bytes)
|
|
|
|
def test_deserialize_binary():
|
|
s = Session()
|
|
@@ -23,4 +21,4 @@ def test_deserialize_binary():
|
|
msg['buffers'] = [ memoryview(os.urandom(2)) for i in range(3) ]
|
|
bmsg = serialize_binary_message(msg)
|
|
msg2 = deserialize_binary_message(bmsg)
|
|
- nt.assert_equal(msg2, msg)
|
|
+ assert msg2 == msg
|
|
Index: notebook-6.1.5/notebook/tests/test_utils.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/notebook/tests/test_utils.py
|
|
+++ notebook-6.1.5/notebook/tests/test_utils.py
|
|
@@ -5,8 +5,9 @@
|
|
|
|
import ctypes
|
|
import os
|
|
+import sys
|
|
|
|
-import nose.tools as nt
|
|
+import pytest
|
|
|
|
from traitlets.tests.utils import check_help_all_output
|
|
from notebook.utils import url_escape, url_unescape, is_hidden, is_file_hidden
|
|
@@ -26,62 +27,61 @@ def test_url_escape():
|
|
# changes path or notebook name with special characters to url encoding
|
|
# these tests specifically encode paths with spaces
|
|
path = url_escape('/this is a test/for spaces/')
|
|
- nt.assert_equal(path, '/this%20is%20a%20test/for%20spaces/')
|
|
+ assert path == '/this%20is%20a%20test/for%20spaces/'
|
|
|
|
path = url_escape('notebook with space.ipynb')
|
|
- nt.assert_equal(path, 'notebook%20with%20space.ipynb')
|
|
+ assert path == 'notebook%20with%20space.ipynb'
|
|
|
|
path = url_escape('/path with a/notebook and space.ipynb')
|
|
- nt.assert_equal(path, '/path%20with%20a/notebook%20and%20space.ipynb')
|
|
+ assert path == '/path%20with%20a/notebook%20and%20space.ipynb'
|
|
|
|
path = url_escape('/ !@$#%^&* / test %^ notebook @#$ name.ipynb')
|
|
- nt.assert_equal(path,
|
|
- '/%20%21%40%24%23%25%5E%26%2A%20/%20test%20%25%5E%20notebook%20%40%23%24%20name.ipynb')
|
|
+ assert path == '/%20%21%40%24%23%25%5E%26%2A%20/%20test%20%25%5E%20notebook%20%40%23%24%20name.ipynb'
|
|
|
|
def test_url_unescape():
|
|
|
|
# decodes a url string to a plain string
|
|
# these tests decode paths with spaces
|
|
path = url_unescape('/this%20is%20a%20test/for%20spaces/')
|
|
- nt.assert_equal(path, '/this is a test/for spaces/')
|
|
+ assert path == '/this is a test/for spaces/'
|
|
|
|
path = url_unescape('notebook%20with%20space.ipynb')
|
|
- nt.assert_equal(path, 'notebook with space.ipynb')
|
|
+ assert path == 'notebook with space.ipynb'
|
|
|
|
path = url_unescape('/path%20with%20a/notebook%20and%20space.ipynb')
|
|
- nt.assert_equal(path, '/path with a/notebook and space.ipynb')
|
|
+ assert path == '/path with a/notebook and space.ipynb'
|
|
|
|
path = url_unescape(
|
|
'/%20%21%40%24%23%25%5E%26%2A%20/%20test%20%25%5E%20notebook%20%40%23%24%20name.ipynb')
|
|
- nt.assert_equal(path, '/ !@$#%^&* / test %^ notebook @#$ name.ipynb')
|
|
+ assert path == '/ !@$#%^&* / test %^ notebook @#$ name.ipynb'
|
|
|
|
def test_is_hidden():
|
|
with TemporaryDirectory() as root:
|
|
subdir1 = os.path.join(root, 'subdir')
|
|
os.makedirs(subdir1)
|
|
- nt.assert_equal(is_hidden(subdir1, root), False)
|
|
- nt.assert_equal(is_file_hidden(subdir1), False)
|
|
+ assert is_hidden(subdir1, root) == False
|
|
+ assert is_file_hidden(subdir1) == False
|
|
|
|
subdir2 = os.path.join(root, '.subdir2')
|
|
os.makedirs(subdir2)
|
|
- nt.assert_equal(is_hidden(subdir2, root), True)
|
|
- nt.assert_equal(is_file_hidden(subdir2), True)#
|
|
+ assert is_hidden(subdir2, root) == True
|
|
+ assert is_file_hidden(subdir2) == True
|
|
# root dir is always visible
|
|
- nt.assert_equal(is_hidden(subdir2, subdir2), False)
|
|
+ assert is_hidden(subdir2, subdir2) == False
|
|
|
|
subdir34 = os.path.join(root, 'subdir3', '.subdir4')
|
|
os.makedirs(subdir34)
|
|
- nt.assert_equal(is_hidden(subdir34, root), True)
|
|
- nt.assert_equal(is_hidden(subdir34), True)
|
|
+ assert is_hidden(subdir34, root) == True
|
|
+ assert is_hidden(subdir34) == True
|
|
|
|
subdir56 = os.path.join(root, '.subdir5', 'subdir6')
|
|
os.makedirs(subdir56)
|
|
- nt.assert_equal(is_hidden(subdir56, root), True)
|
|
- nt.assert_equal(is_hidden(subdir56), True)
|
|
- nt.assert_equal(is_file_hidden(subdir56), False)
|
|
- nt.assert_equal(is_file_hidden(subdir56, os.stat(subdir56)), False)
|
|
+ assert is_hidden(subdir56, root) == True
|
|
+ assert is_hidden(subdir56) == True
|
|
+ assert is_file_hidden(subdir56) == False
|
|
+ assert is_file_hidden(subdir56, os.stat(subdir56)) == False
|
|
|
|
-@skip_if_not_win32
|
|
+@pytest.mark.skipif(sys.platform != "win32", reason="run on windows only")
|
|
def test_is_hidden_win32():
|
|
with TemporaryDirectory() as root:
|
|
root = cast_unicode(root)
|
|
Index: notebook-6.1.5/setup.py
|
|
===================================================================
|
|
--- notebook-6.1.5.orig/setup.py
|
|
+++ notebook-6.1.5/setup.py
|
|
@@ -116,8 +116,8 @@ for more information.
|
|
'prometheus_client'
|
|
],
|
|
extras_require = {
|
|
- 'test': ['nose', 'coverage', 'requests', 'nose_warnings_filters',
|
|
- 'nbval', 'nose-exclude', 'selenium', 'pytest', 'pytest-cov'],
|
|
+ 'test': ['coverage', 'requests',
|
|
+ 'nbval', 'selenium', 'pytest', 'pytest-cov'],
|
|
'docs': ['sphinx', 'nbsphinx', 'sphinxcontrib_github_alt'],
|
|
'test:sys_platform != "win32"': ['requests-unixsocket'],
|
|
},
|