Merge branch 'master' of https://github.com/jupyter/notebook into list_hidden_files

This commit is contained in:
Maxime Mouchet 2019-01-09 14:19:30 +01:00
commit 533e1984e2
6 changed files with 72 additions and 104 deletions

2
.gitignore vendored
View File

@ -27,6 +27,7 @@ __pycache__
\#*#
.#*
.coverage
.pytest_cache
src
*.swp
@ -39,3 +40,4 @@ config.rst
/.pydevproject
package-lock.json
geckodriver.log

View File

@ -36,10 +36,11 @@ before_install:
- |
if [[ $GROUP == docs ]]; then
pip install -r docs/doc-requirements.txt
pip install --upgrade pytest
fi
- |
if [[ $GROUP == selenium ]]; then
pip install selenium
pip install --upgrade selenium pytest
# Install Webdriver backend for Firefox:
wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
mkdir geckodriver

View File

@ -11,7 +11,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"First and foremost, the Jupyter Notebook is an interactive environment for writing and running code. The notebook is capable of running code in a wide range of languages. However, each notebook is associated with a single kernel. This notebook is associated with the IPython kernel, therefor runs Python code."
"First and foremost, the Jupyter Notebook is an interactive environment for writing and running code. The notebook is capable of running code in a wide range of languages. However, each notebook is associated with a single kernel. This notebook is associated with the IPython kernel, therefore runs Python code."
]
},
{

View File

@ -1,100 +0,0 @@
// Test
casper.notebook_test(function () {
var that = this;
var a = 'print("a")';
var index = this.append_cell(a);
var b = 'print("b")';
index = this.append_cell(b);
var c = 'print("c")';
index = this.append_cell(c);
this.then(function () {
var selectedIndex = this.evaluate(function () {
Jupyter.notebook.select(0);
return Jupyter.notebook.get_selected_index();
});
this.test.assertEquals(this.evaluate(function() {
return Jupyter.notebook.get_selected_cells().length;
}), 1, 'only one cell is selected programmatically');
this.test.assertEquals(this.evaluate(function() {
return $('.cell.jupyter-soft-selected, .cell.selected').length;
}), 1, 'one cell is selected');
this.test.assertEquals(this.evaluate(function() {
Jupyter.notebook.extend_selection_by(1);
return Jupyter.notebook.get_selected_cells().length;
}), 2, 'extend selection by one');
this.test.assertEquals(this.evaluate(function() {
Jupyter.notebook.extend_selection_by(-1);
return Jupyter.notebook.get_selected_cells().length;
}), 1, 'contract selection by one');
this.test.assertEquals(this.evaluate(function() {
Jupyter.notebook.select(1);
Jupyter.notebook.extend_selection_by(-1);
return Jupyter.notebook.get_selected_cells().length;
}), 2, 'extend selection by one up');
// Test multiple markdown conversions.
var cell_types = this.evaluate(function() {
Jupyter.notebook.select(0);
Jupyter.notebook.extend_selection_by(2);
var indices = Jupyter.notebook.get_selected_cells_indices();
Jupyter.notebook.cells_to_markdown();
return indices.map(function(i) {
return Jupyter.notebook.get_cell(i).cell_type;
});
});
this.test.assert(cell_types.every(function(cell_type) {
return cell_type === 'markdown';
}), 'selected cells converted to markdown');
this.test.assertEquals(this.evaluate(function() {
return Jupyter.notebook.get_selected_cells_indices();
}).length, 1, 'one cell selected after convert');
// Test multiple raw conversions.
cell_types = this.evaluate(function() {
Jupyter.notebook.select(0);
Jupyter.notebook.extend_selection_by(2);
var indices = Jupyter.notebook.get_selected_cells_indices();
Jupyter.notebook.cells_to_raw();
return indices.map(function(i) {
return Jupyter.notebook.get_cell(i).cell_type;
});
});
this.test.assert(cell_types.every(function(cell_type) {
return cell_type === 'raw';
}), 'selected cells converted to raw');
this.test.assertEquals(this.evaluate(function() {
return Jupyter.notebook.get_selected_cells_indices();
}).length, 1, 'one cell selected after convert');
// Test multiple code conversions.
cell_types = this.evaluate(function() {
Jupyter.notebook.select(0);
Jupyter.notebook.extend_selection_by(2);
var indices = Jupyter.notebook.get_selected_cells_indices();
Jupyter.notebook.cells_to_code();
return indices.map(function(i) {
return Jupyter.notebook.get_cell(i).cell_type;
});
});
this.test.assert(cell_types.every(function(cell_type) {
return cell_type === 'code';
}), 'selected cells converted to code');
this.test.assertEquals(this.evaluate(function() {
return Jupyter.notebook.get_selected_cells_indices();
}).length, 1, 'one cell selected after convert');
});
});

View File

@ -0,0 +1,65 @@
def test_multiselect(notebook):
def extend_selection_by(delta):
notebook.browser.execute_script(
"Jupyter.notebook.extend_selection_by(arguments[0]);", delta)
def n_selected_cells():
return notebook.browser.execute_script(
"return Jupyter.notebook.get_selected_cells().length;")
a = 'print("a")'
b = 'print("b")'
c = 'print("c")'
notebook.edit_cell(index=0, content=a)
notebook.append(b, c)
notebook.focus_cell(0)
assert n_selected_cells() == 1
# Check that only one cell is selected according to CSS classes as well
selected_css = notebook.browser.find_elements_by_css_selector(
'.cell.jupyter-soft-selected, .cell.selected')
assert len(selected_css) == 1
# Extend the selection down one
extend_selection_by(1)
assert n_selected_cells() == 2
# Contract the selection up one
extend_selection_by(-1)
assert n_selected_cells() == 1
# Extend the selection up one
notebook.focus_cell(1)
extend_selection_by(-1)
assert n_selected_cells() == 2
# Convert selected cells to Markdown
notebook.browser.execute_script("Jupyter.notebook.cells_to_markdown();")
cell_types = notebook.browser.execute_script(
"return Jupyter.notebook.get_cells().map(c => c.cell_type)")
assert cell_types == ['markdown', 'markdown', 'code']
# One cell left selected after conversion
assert n_selected_cells() == 1
# Convert selected cells to raw
notebook.focus_cell(1)
extend_selection_by(1)
assert n_selected_cells() == 2
notebook.browser.execute_script("Jupyter.notebook.cells_to_raw();")
cell_types = notebook.browser.execute_script(
"return Jupyter.notebook.get_cells().map(c => c.cell_type)")
assert cell_types == ['markdown', 'raw', 'raw']
# One cell left selected after conversion
assert n_selected_cells() == 1
# Convert selected cells to code
notebook.focus_cell(0)
extend_selection_by(2)
assert n_selected_cells() == 3
notebook.browser.execute_script("Jupyter.notebook.cells_to_code();")
cell_types = notebook.browser.execute_script(
"return Jupyter.notebook.get_cells().map(c => c.cell_type)")
assert cell_types == ['code'] * 3
# One cell left selected after conversion
assert n_selected_cells() == 1

View File

@ -98,7 +98,7 @@ for more information.
zip_safe = False,
install_requires = [
'jinja2',
'tornado>=4',
'tornado>=4, <6',
# pyzmq>=17 is not technically necessary,
# but hopefully avoids incompatibilities with Tornado 5. April 2018
'pyzmq>=17',