Skip to content

Commit

Permalink
Allow in place --set-kernel
Browse files Browse the repository at this point in the history
  • Loading branch information
mwouts committed May 30, 2019
1 parent a4d6dda commit 7b6c878
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 24 deletions.
52 changes: 28 additions & 24 deletions jupytext/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ def writef_git_add(notebook_, nb_file_, fmt_):
if not args.to and not args.output and not args.sync \
and not args.pipe and not args.check \
and not args.test and not args.test_strict \
and not args.update_metadata:
and not args.update_metadata and not args.set_kernel:
raise ValueError('Please select an action')

if args.output and len(args.notebooks) != 1:
Expand Down Expand Up @@ -252,42 +252,46 @@ def writef_git_add(notebook_, nb_file_, fmt_):
elif ext:
fmt = {'extension': ext}

# Set the kernel
if args.set_kernel:
if args.set_kernel == '-':
language = notebook.metadata.get('jupytext', {}).get('main_language') \
or notebook.metadata['kernelspec']['language']
if not language:
raise ValueError('Cannot infer a kernel as notebook language is not defined')

kernelspec = kernelspec_from_language(language)
if not kernelspec:
raise ValueError('Found no kernel for {}'.format(language))
else:
try:
kernelspec = get_kernel_spec(args.set_kernel)
except KeyError:
raise KeyError('Please choose a kernel name among {}'
.format([name for name in find_kernel_specs()]))
kernelspec = {'name': args.set_kernel,
'language': kernelspec.language,
'display_name': kernelspec.display_name}

args.update_metadata['kernelspec'] = kernelspec

# Update the metadata
if args.update_metadata:
log('[jupytext] Updating notebook metadata with {}'.format(args.update_metadata))
log("[jupytext] Updating notebook metadata with '{}'".format(json.dumps(args.update_metadata)))
# Are we updating a text file that has a metadata filter? #212
if fmt['extension'] != '.ipynb' and \
notebook.metadata.get('jupytext', {}).get('notebook_metadata_filter') == '-all':
notebook.metadata.get('jupytext', {}).pop('notebook_metadata_filter')
recursive_update(notebook.metadata, args.update_metadata)

if 'kernelspec' in args.update_metadata and 'main_language' in notebook.metadata.get('jupytext', {}):
notebook.metadata['jupytext'].pop('main_language')

# Read paired notebooks
if args.sync:
set_prefix_and_suffix(fmt, notebook, nb_file)
notebook, inputs_nb_file, outputs_nb_file = load_paired_notebook(notebook, fmt, nb_file, log)

# Set the kernel
if args.set_kernel == '-':
language = notebook.metadata.get('jupytext', {})['main_language'] \
or notebook.metadata['kernelspec']['language']
if not language:
raise ValueError('Cannot infer a kernel as notebook language is not defined')
kernelspec = kernelspec_from_language(language)
if not kernelspec:
raise ValueError('Found no kernel for {}'.format(language))
notebook.metadata['kernelspec'] = kernelspec
if 'main_language' in notebook.metadata.get('jupytext', {}):
notebook.metadata['jupytext'].pop('main_language')
elif args.set_kernel:
try:
kernelspec = get_kernel_spec(args.set_kernel)
except KeyError:
raise KeyError('Please choose a kernel name among {}'
.format([name for name in find_kernel_specs()]))
notebook.metadata['kernelspec'] = {'name': args.set_kernel,
'language': kernelspec.language,
'display_name': kernelspec.display_name}

# II. ### Apply commands onto the notebook ###
# Pipe the notebook into the desired commands
for cmd in args.pipe or []:
Expand Down
13 changes: 13 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,19 @@ def test_update_metadata(py_file, tmpdir, capsys):
assert 'invalid' in err


@pytest.mark.parametrize('py_file', list_notebooks('python'))
def test_set_kernel_inplace(py_file, tmpdir):
tmp_py = str(tmpdir.join('notebook.py'))

copyfile(py_file, tmp_py)

jupytext([tmp_py, '--set-kernel', '-'])

nb = readf(tmp_py)
kernel_name = nb.metadata['kernelspec']['name']
assert get_kernel_spec(kernel_name).argv[0] in ['python', sys.executable]


@pytest.mark.parametrize('py_file', list_notebooks('python'))
def test_set_kernel_auto(py_file, tmpdir):
tmp_py = str(tmpdir.join('notebook.py'))
Expand Down

0 comments on commit 7b6c878

Please sign in to comment.