From 29b95d762fab6d3c7554d392229385381f8adb40 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sat, 16 Mar 2024 23:40:50 +0100 Subject: [PATCH 1/6] env vars --- spyder/plugins/ipythonconsole/utils/kernelspec.py | 3 --- spyder/plugins/ipythonconsole/widgets/shell.py | 9 +++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/spyder/plugins/ipythonconsole/utils/kernelspec.py b/spyder/plugins/ipythonconsole/utils/kernelspec.py index 4ca26655aaf..fd08256096f 100644 --- a/spyder/plugins/ipythonconsole/utils/kernelspec.py +++ b/spyder/plugins/ipythonconsole/utils/kernelspec.py @@ -179,9 +179,6 @@ def env(self): 'SPY_UMR_VERBOSE': self.get_conf( 'umr/verbose', section='main_interpreter'), 'SPY_UMR_NAMELIST': ','.join(umr_namelist), - 'SPY_AUTOCALL_O': self.get_conf('autocall'), - 'SPY_GREEDY_O': self.get_conf('greedy_completer'), - 'SPY_JEDI_O': self.get_conf('jedi_completer'), 'SPY_TESTING': running_under_pytest() or get_safe_mode(), 'SPY_HIDE_CMD': self.get_conf('hide_cmd_windows'), 'SPY_PYTHONPATH': pypath, diff --git a/spyder/plugins/ipythonconsole/widgets/shell.py b/spyder/plugins/ipythonconsole/widgets/shell.py index 772ac499dd2..fbb6bfa20aa 100644 --- a/spyder/plugins/ipythonconsole/widgets/shell.py +++ b/spyder/plugins/ipythonconsole/widgets/shell.py @@ -408,6 +408,15 @@ def send_spyder_kernel_configuration(self): # Set current cwd self.set_cwd() + # Set autocall + self.set_autocall(self.get_conf('autocall')) + + # Set greedy completer + self.greedy_completer(self.get_conf('greedy_completer')) + + # Set Jedi Completer + self.set_jedi_completer(self.get_conf('jedi_completer')) + # To apply style self.set_color_scheme(self.syntax_style, reset=False) From a5f1a7c9104d10142632b1313416263cb9b90c82 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 17 Mar 2024 07:27:03 +0100 Subject: [PATCH 2/6] git subrepo clone --branch=envvar --force https://github.com/impact27/spyder-kernels.git external-deps/spyder-kernels subrepo: subdir: "external-deps/spyder-kernels" merged: "6316ca7ed" upstream: origin: "https://github.com/impact27/spyder-kernels.git" branch: "envvar" commit: "6316ca7ed" git-subrepo: version: "0.4.5" origin: "https://github.com/ingydotnet/git-subrepo" commit: "aa416e4" --- external-deps/spyder-kernels/.gitrepo | 6 +++--- .../spyder-kernels/spyder_kernels/console/start.py | 13 ------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index 45f72f6f044..4ae9cb7ad9a 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -5,8 +5,8 @@ ; [subrepo] remote = https://github.com/spyder-ide/spyder-kernels.git - branch = master - commit = afbca2ecdb8bb4a68859f45dd4780cc077b00cf7 - parent = d5ad1effc965be479bc23d87e4a17c83a758468e + branch = envvar + commit = 6316ca7edb55a871e76a8c60a51490ebf6b905cd + parent = 29b95d762fab6d3c7554d392229385381f8adb40 method = merge cmdver = 0.4.5 diff --git a/external-deps/spyder-kernels/spyder_kernels/console/start.py b/external-deps/spyder-kernels/spyder_kernels/console/start.py index eb910305957..c9ebe04fc27 100644 --- a/external-deps/spyder-kernels/spyder_kernels/console/start.py +++ b/external-deps/spyder-kernels/spyder_kernels/console/start.py @@ -72,10 +72,6 @@ def kernel_config(): # Until we implement Issue 1052 spy_cfg.InteractiveShell.xmode = 'Plain' - # Jedi completer. - jedi_o = os.environ.get('SPY_JEDI_O') == 'True' - spy_cfg.IPCompleter.use_jedi = jedi_o - # Clear terminal arguments input. # This needs to be done before adding the exec_lines that come from # Spyder, to avoid deleting the sys module if users want to import @@ -118,18 +114,9 @@ def kernel_config(): if is_module_installed('matplotlib'): spy_cfg.IPKernelApp.matplotlib = "inline" - # Autocall - autocall_o = os.environ.get('SPY_AUTOCALL_O') - if autocall_o is not None: - spy_cfg.ZMQInteractiveShell.autocall = int(autocall_o) - # To handle the banner by ourselves spy_cfg.ZMQInteractiveShell.banner1 = '' - # Greedy completer - greedy_o = os.environ.get('SPY_GREEDY_O') == 'True' - spy_cfg.IPCompleter.greedy = greedy_o - # Disable the new mechanism to capture and forward low-level output # in IPykernel 6. For that we have Wurlitzer. spy_cfg.IPKernelApp.capture_fd_output = False From 7edbff57d6711df8ba6c384d03aa13cbdc1b247d Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 17 Mar 2024 08:41:57 +0100 Subject: [PATCH 3/6] rename return value --- spyder/plugins/ipythonconsole/widgets/shell.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spyder/plugins/ipythonconsole/widgets/shell.py b/spyder/plugins/ipythonconsole/widgets/shell.py index fbb6bfa20aa..ebb7ccfe54b 100644 --- a/spyder/plugins/ipythonconsole/widgets/shell.py +++ b/spyder/plugins/ipythonconsole/widgets/shell.py @@ -410,10 +410,10 @@ def send_spyder_kernel_configuration(self): # Set autocall self.set_autocall(self.get_conf('autocall')) - + # Set greedy completer self.greedy_completer(self.get_conf('greedy_completer')) - + # Set Jedi Completer self.set_jedi_completer(self.get_conf('jedi_completer')) @@ -463,7 +463,7 @@ def kernel_configure_callback(self, dic): for key, value in dic.items(): if key == "faulthandler": self.kernel_handler.faulthandler_setup(value) - elif key == "special_kernel_error": + elif key == "special_kernel": self.ipyclient._show_special_console_error(value) def pop_execute_queue(self): From 760accf8460bbf6947a154d8cb921ec207ca5241 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 17 Mar 2024 08:43:16 +0100 Subject: [PATCH 4/6] add set_ --- spyder/plugins/ipythonconsole/widgets/shell.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spyder/plugins/ipythonconsole/widgets/shell.py b/spyder/plugins/ipythonconsole/widgets/shell.py index ebb7ccfe54b..21c3b42d673 100644 --- a/spyder/plugins/ipythonconsole/widgets/shell.py +++ b/spyder/plugins/ipythonconsole/widgets/shell.py @@ -412,7 +412,7 @@ def send_spyder_kernel_configuration(self): self.set_autocall(self.get_conf('autocall')) # Set greedy completer - self.greedy_completer(self.get_conf('greedy_completer')) + self.set_greedy_completer(self.get_conf('greedy_completer')) # Set Jedi Completer self.set_jedi_completer(self.get_conf('jedi_completer')) From b9dee748846bf5a30864d781b533ae70fe402c1f Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 17 Mar 2024 08:43:22 +0100 Subject: [PATCH 5/6] git subrepo clone --branch=envvar --force https://github.com/impact27/spyder-kernels.git external-deps/spyder-kernels subrepo: subdir: "external-deps/spyder-kernels" merged: "73ff0e8ac" upstream: origin: "https://github.com/impact27/spyder-kernels.git" branch: "envvar" commit: "73ff0e8ac" git-subrepo: version: "0.4.5" origin: "https://github.com/ingydotnet/git-subrepo" commit: "aa416e4" --- external-deps/spyder-kernels/.gitrepo | 4 +- .../spyder_kernels/comms/decorators.py | 6 + .../spyder_kernels/console/kernel.py | 165 +++++++++--------- .../spyder_kernels/console/shell.py | 3 +- 4 files changed, 97 insertions(+), 81 deletions(-) diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index 4ae9cb7ad9a..4e8595bdc31 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/spyder-ide/spyder-kernels.git branch = envvar - commit = 6316ca7edb55a871e76a8c60a51490ebf6b905cd - parent = 29b95d762fab6d3c7554d392229385381f8adb40 + commit = 73ff0e8ac5ee86c6ea984f5e7caadc993bc4cdba + parent = 760accf8460bbf6947a154d8cb921ec207ca5241 method = merge cmdver = 0.4.5 diff --git a/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py b/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py index b2633404a07..7981c475ba7 100644 --- a/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py +++ b/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py @@ -25,3 +25,9 @@ def register_comm_handlers(instance, frontend_comm): frontend_comm.register_call_handler( method_name, method) +def kernel_config(key): + """Decorarot to mark function as kernel config for set_configuration.""" + def config_decorator(fun): + fun._is_kernel_config = key + return fun + return kernel_config \ No newline at end of file diff --git a/external-deps/spyder-kernels/spyder_kernels/console/kernel.py b/external-deps/spyder-kernels/spyder_kernels/console/kernel.py index 9c837f62a13..c283876bb79 100644 --- a/external-deps/spyder-kernels/spyder_kernels/console/kernel.py +++ b/external-deps/spyder-kernels/spyder_kernels/console/kernel.py @@ -32,7 +32,7 @@ import spyder_kernels from spyder_kernels.comms.frontendcomm import FrontendComm from spyder_kernels.comms.decorators import ( - register_comm_handlers, comm_handler) + register_comm_handlers, comm_handler, kernel_config) from spyder_kernels.utils.iofuncs import iofunctions from spyder_kernels.utils.mpl import automatic_backend, MPL_BACKENDS_TO_SPYDER from spyder_kernels.utils.nsview import ( @@ -76,6 +76,18 @@ def __init__(self, *args, **kwargs): # Socket to signal shell_stream locally self.loopback_socket = None + # load configuration functions + self.load_config_methods() + + def load_config_methods(self): + """Load config methods""" + self._config_methods = {} + for instance in [self, self.shell]: + for method_name in instance.__class__.__dict__: + method = getattr(instance, method_name) + if hasattr(method, '_is_kernel_config'): + self._config_methods[method._is_kernel_config] = method + @property def kernel_info(self): # Used for checking correct version by spyder @@ -125,11 +137,14 @@ def publish_state(self): except Exception: pass - def enable_faulthandler(self): + @kernel_config("faulthandler") + def enable_faulthandler(self, enable=True): """ Open a file to save the faulthandling and identifiers for internal threads. """ + if not enable: + return fault_dir = None if sys.platform.startswith('linux'): # Do not use /tmp for temporary files @@ -548,7 +563,7 @@ def get_mpl_interactive_backend(self): # magic but not through our Preferences. return -1 - @comm_handler + @kernel_config("matplotlib") def set_matplotlib_conf(self, conf): """Set matplotlib configuration""" pylab_autoload_n = 'pylab/autoload' @@ -623,14 +638,17 @@ def set_mpl_inline_bbox_inches(self, bbox_inches): 'InlineBackend.print_figure_kwargs', print_figure_kwargs) # -- For completions + @kernel_config("jedi_completer") def set_jedi_completer(self, use_jedi): """Enable/Disable jedi as the completer for the kernel.""" self._set_config_option('IPCompleter.use_jedi', use_jedi) + @kernel_config("greedy_completer") def set_greedy_completer(self, use_greedy): """Enable/Disable greedy completer for the kernel.""" self._set_config_option('IPCompleter.greedy', use_greedy) + @kernel_config("autocall") def set_autocall(self, autocall): """Enable/Disable autocall funtionality.""" self._set_config_option('ZMQInteractiveShell.autocall', autocall) @@ -641,42 +659,25 @@ def set_configuration(self, conf): """Set kernel configuration""" ret = {} for key, value in conf.items(): - if key == "cwd": - self._cwd_initialised = True - os.chdir(value) - self.publish_state() - elif key == "namespace_view_settings": - self.namespace_view_settings = value - self.publish_state() - elif key == "pdb": - self.shell.set_pdb_configuration(value) - elif key == "faulthandler": - if value: - ret[key] = self.enable_faulthandler() - elif key == "special_kernel": - try: - self.set_special_kernel(value) - except Exception: - ret["special_kernel_error"] = value - elif key == "color scheme": - self.set_color_scheme(value) - elif key == "jedi_completer": - self.set_jedi_completer(value) - elif key == "greedy_completer": - self.set_greedy_completer(value) - elif key == "autocall": - self.set_autocall(value) - elif key == "matplotlib": - self.set_matplotlib_conf(value) - elif key == "update_gui": - self.shell.update_gui_frontend = value - elif key == "wurlitzer": - if value: - self._load_wurlitzer() - elif key == "autoreload_magic": - self._autoreload_magic(value) + ret[key] = self._config_methods[key](value) return ret + @kernel_config("update_gui") + def set_update_gui(self, update): + self.shell.update_gui_frontend = update + + @kernel_config("namespace_view_settings") + def set_namespace_view_settings(self, namespace_view_settings): + self.namespace_view_settings = namespace_view_settings + self.publish_state() + + @kernel_config("cwd") + def set_cwd(self, cwd): + self._cwd_initialised = True + os.chdir(cwd) + self.publish_state() + + @kernel_config("color scheme") def set_color_scheme(self, color_scheme): if color_scheme == "dark": # Needed to change the colors of tracebacks @@ -712,57 +713,61 @@ def close_all_mpl_figures(self): except: pass + @kernel_config("special_kernel") def set_special_kernel(self, special): """ Check if optional dependencies are available for special consoles. """ - self.shell.special = None - if special is None: - return + try: + self.shell.special = None + if special is None: + return - if special == "pylab": - import matplotlib # noqa - exec("from pylab import *", self.shell.user_ns) - self.shell.special = special - return - - if special == "sympy": - import sympy # noqa - sympy_init = "\n".join([ - "from sympy import *", - "x, y, z, t = symbols('x y z t')", - "k, m, n = symbols('k m n', integer=True)", - "f, g, h = symbols('f g h', cls=Function)", - "init_printing()", - ]) - exec(sympy_init, self.shell.user_ns) - self.shell.special = special - return + if special == "pylab": + import matplotlib # noqa + exec("from pylab import *", self.shell.user_ns) + self.shell.special = special + return - if special == "cython": - import cython # noqa + if special == "sympy": + import sympy # noqa + sympy_init = "\n".join([ + "from sympy import *", + "x, y, z, t = symbols('x y z t')", + "k, m, n = symbols('k m n', integer=True)", + "f, g, h = symbols('f g h', cls=Function)", + "init_printing()", + ]) + exec(sympy_init, self.shell.user_ns) + self.shell.special = special + return - # Import pyximport to enable Cython files support for - # import statement - import pyximport - pyx_setup_args = {} + if special == "cython": + import cython # noqa - # Add Numpy include dir to pyximport/distutils - try: - import numpy - pyx_setup_args['include_dirs'] = numpy.get_include() - except Exception: - pass + # Import pyximport to enable Cython files support for + # import statement + import pyximport + pyx_setup_args = {} - # Setup pyximport and enable Cython files reload - pyximport.install(setup_args=pyx_setup_args, - reload_support=True) + # Add Numpy include dir to pyximport/distutils + try: + import numpy + pyx_setup_args['include_dirs'] = numpy.get_include() + except Exception: + pass - self.shell.run_line_magic("reload_ext", "Cython") - self.shell.special = special - return + # Setup pyximport and enable Cython files reload + pyximport.install(setup_args=pyx_setup_args, + reload_support=True) + + self.shell.run_line_magic("reload_ext", "Cython") + self.shell.special = special + return - raise NotImplementedError(f"{special}") + raise NotImplementedError(f"{special}") + except Exception: + return special @comm_handler def update_syspath(self, path_dict, new_path_dict): @@ -1004,6 +1009,7 @@ def set_sympy_forecolor(self, background_color='dark'): pass # --- Others + @kernel_config("autoreload_magic") def _autoreload_magic(self, enable): """Load %autoreload magic.""" try: @@ -1016,9 +1022,12 @@ def _autoreload_magic(self, enable): except Exception: pass - def _load_wurlitzer(self): + @kernel_config("wurlitzer") + def _load_wurlitzer(self, enable=True): """Load wurlitzer extension.""" # Wurlitzer has no effect on Windows + if not enable: + return if not os.name == 'nt': # Enclose this in a try/except because if it fails the # console will be totally unusable. diff --git a/external-deps/spyder-kernels/spyder_kernels/console/shell.py b/external-deps/spyder-kernels/spyder_kernels/console/shell.py index 5256bb67214..d25e8e03e2c 100644 --- a/external-deps/spyder-kernels/spyder_kernels/console/shell.py +++ b/external-deps/spyder-kernels/spyder_kernels/console/shell.py @@ -26,7 +26,7 @@ from spyder_kernels.customize.namespace_manager import NamespaceManager from spyder_kernels.customize.spyderpdb import SpyderPdb from spyder_kernels.customize.code_runner import SpyderCodeRunner -from spyder_kernels.comms.decorators import comm_handler +from spyder_kernels.comms.decorators import comm_handler, kernel_config from spyder_kernels.utils.mpl import automatic_backend @@ -98,6 +98,7 @@ def enable_matplotlib(self, gui=None): return gui, backend # --- For Pdb namespace integration + @kernel_config("pdb") def set_pdb_configuration(self, pdb_conf): """ Set Pdb configuration. From 0744177da0302bcf5efd535f9fd44214fc635283 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 17 Mar 2024 09:10:24 +0100 Subject: [PATCH 6/6] git subrepo clone --branch=envvar --force https://github.com/impact27/spyder-kernels.git external-deps/spyder-kernels subrepo: subdir: "external-deps/spyder-kernels" merged: "6e7ddbc21" upstream: origin: "https://github.com/impact27/spyder-kernels.git" branch: "envvar" commit: "6e7ddbc21" git-subrepo: version: "0.4.5" origin: "https://github.com/ingydotnet/git-subrepo" commit: "aa416e4" --- external-deps/spyder-kernels/.gitrepo | 4 ++-- .../spyder-kernels/spyder_kernels/comms/decorators.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index 4e8595bdc31..dd1f5dfcf27 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/spyder-ide/spyder-kernels.git branch = envvar - commit = 73ff0e8ac5ee86c6ea984f5e7caadc993bc4cdba - parent = 760accf8460bbf6947a154d8cb921ec207ca5241 + commit = 6e7ddbc2113b74cffb532e4a758e2b7d4165c87f + parent = c877535c288a186f361c9ab7d6b3d5b9a246c43b method = merge cmdver = 0.4.5 diff --git a/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py b/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py index 7981c475ba7..f7da877080b 100644 --- a/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py +++ b/external-deps/spyder-kernels/spyder_kernels/comms/decorators.py @@ -30,4 +30,4 @@ def kernel_config(key): def config_decorator(fun): fun._is_kernel_config = key return fun - return kernel_config \ No newline at end of file + return config_decorator \ No newline at end of file