diff --git a/README.md b/README.md index 328526a..dc7ad69 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,12 @@ Available field names within the string: - `{kernel}` = Original kernel name (name of the folder containing the kernel spec) - `{language}` = Language (identical to `{0}`) +- `enable_debugger`: Override kernelspec debugger metadata +Default: None +Possible values are: + - True: Override environment kernelspec metadata and set the debugger flag to `true` + - False: Override environment kernelspec metadata and set the debugger flag to `false` + In order to pass a configuration option in the command line use ```python -m nb_conda_kernels list --CondaKernelSpecManager.env_filter="regex"``` where regex is the regular expression for filtering envs "this|that|and|that" works. To set it in jupyter config file, edit the jupyter configuration file (py or json) located in your ```jupyter --config-dir``` - for `jupyter_config.py` - add a line "c.CondaKernelSpecManager.env_filter = 'regex'" diff --git a/nb_conda_kernels/manager.py b/nb_conda_kernels/manager.py index ca10539..9b49c5f 100644 --- a/nb_conda_kernels/manager.py +++ b/nb_conda_kernels/manager.py @@ -75,6 +75,9 @@ class CondaKernelSpecManager(KernelSpecManager): If None, the conda kernel specs will only be available dynamically on notebook editors. """) + enable_debugger = Bool(None, config=True, allow_none=True, + help="Optional: Override debugger setting in kernelspec metadata. " + "If this parameter is unset it will default to the source kernel metadata.") @validate("kernelspec_path") def _validate_kernelspec_path(self, proposal): @@ -313,8 +316,10 @@ def _all_specs(self): metadata = spec.get('metadata', {}) metadata.update({ 'conda_env_name': env_name, - 'conda_env_path': env_path + 'conda_env_path': env_path, }) + if self.enable_debugger is not None: + metadata.update({"debugger": self.enable_debugger}) spec['metadata'] = metadata if self.kernelspec_path is not None: diff --git a/tests/test_config.py b/tests/test_config.py index 5a1e607..017ef05 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -241,5 +241,48 @@ def envs(*args): assert metadata[key] == value +@pytest.mark.parametrize("kernelspec", [ + { + "display_name": "xpython", + "argv": [ + "@XPYTHON_KERNELSPEC_PATH@xpython", + "-f", + "{connection_file}" + ], + "language": "python", + "metadata": { "debugger": True } + } +]) +def test_kernel_metadata_debugger_override(monkeypatch, tmp_path, kernelspec): + + mock_info = { + 'conda_prefix': '/' + } + + def envs(*args): + return { + 'env_name': str(tmp_path) + } + + kernel_file = tmp_path / 'share' / 'jupyter' / 'kernels' / 'my_kernel' / 'kernel.json' + kernel_file.parent.mkdir(parents=True, exist_ok=True) + if sys.version_info >= (3, 0): + kernel_file.write_text(json.dumps(kernelspec)) + else: + kernel_file.write_bytes(json.dumps(kernelspec)) + + monkeypatch.setattr(CondaKernelSpecManager, "_conda_info", mock_info) + monkeypatch.setattr(CondaKernelSpecManager, "_all_envs", envs) + + manager = CondaKernelSpecManager() + specs = manager._all_specs() + assert specs['conda-env-env_name-my_kernel']['metadata']['debugger'] is True + + manager = CondaKernelSpecManager(enable_debugger=False) + specs = manager._all_specs() + assert specs['conda-env-env_name-my_kernel']['metadata']['debugger'] is False + + + if __name__ == '__main__': test_configuration()