##// END OF EJS Templates
add kernel banner to terminal and qt frontends
MinRK -
Show More
@@ -32,6 +32,7 b' from IPython.core.error import UsageError'
32 from IPython.core.magics import MacroToEdit, CodeMagics
32 from IPython.core.magics import MacroToEdit, CodeMagics
33 from IPython.core.magic import magics_class, line_magic, Magics
33 from IPython.core.magic import magics_class, line_magic, Magics
34 from IPython.core.payloadpage import install_payload_page
34 from IPython.core.payloadpage import install_payload_page
35 from IPython.core.usage import default_gui_banner
35 from IPython.display import display, Javascript
36 from IPython.display import display, Javascript
36 from IPython.kernel.inprocess.socket import SocketABC
37 from IPython.kernel.inprocess.socket import SocketABC
37 from IPython.kernel import (
38 from IPython.kernel import (
@@ -423,6 +424,9 b' class ZMQInteractiveShell(InteractiveShell):'
423 kernel = Any()
424 kernel = Any()
424 parent_header = Any()
425 parent_header = Any()
425
426
427 def _banner1_default(self):
428 return default_gui_banner
429
426 # Override the traitlet in the parent class, because there's no point using
430 # Override the traitlet in the parent class, because there's no point using
427 # readline for the kernel. Can be removed when the readline code is moved
431 # readline for the kernel. Can be removed when the readline code is moved
428 # to the terminal frontend.
432 # to the terminal frontend.
@@ -82,6 +82,7 b' class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):'
82
82
83 # The text to show when the kernel is (re)started.
83 # The text to show when the kernel is (re)started.
84 banner = Unicode(config=True)
84 banner = Unicode(config=True)
85 kernel_banner = Unicode()
85
86
86 # An option and corresponding signal for overriding the default kernel
87 # An option and corresponding signal for overriding the default kernel
87 # interrupt behavior.
88 # interrupt behavior.
@@ -639,6 +640,9 b' class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):'
639 if clear:
640 if clear:
640 self._control.clear()
641 self._control.clear()
641 self._append_plain_text(self.banner)
642 self._append_plain_text(self.banner)
643 if self.kernel_banner:
644 self._append_plain_text(self.kernel_banner)
645
642 # update output marker for stdout/stderr, so that startup
646 # update output marker for stdout/stderr, so that startup
643 # messages appear after banner:
647 # messages appear after banner:
644 self._append_before_prompt_pos = self._get_cursor().position()
648 self._append_before_prompt_pos = self._get_cursor().position()
@@ -17,6 +17,7 b' from textwrap import dedent'
17 from IPython.external.qt import QtCore, QtGui
17 from IPython.external.qt import QtCore, QtGui
18
18
19 from IPython.core.inputsplitter import IPythonInputSplitter
19 from IPython.core.inputsplitter import IPythonInputSplitter
20 from IPython.core.release import version
20 from IPython.core.inputtransformer import ipy_prompt
21 from IPython.core.inputtransformer import ipy_prompt
21 from IPython.utils.traitlets import Bool, Unicode
22 from IPython.utils.traitlets import Bool, Unicode
22 from .frontend_widget import FrontendWidget
23 from .frontend_widget import FrontendWidget
@@ -107,6 +108,7 b' class IPythonWidget(FrontendWidget):'
107 _payload_source_next_input = 'set_next_input'
108 _payload_source_next_input = 'set_next_input'
108 _payload_source_page = 'page'
109 _payload_source_page = 'page'
109 _retrying_history_request = False
110 _retrying_history_request = False
111 _starting = False
110
112
111 #---------------------------------------------------------------------------
113 #---------------------------------------------------------------------------
112 # 'object' interface
114 # 'object' interface
@@ -253,31 +255,28 b' class IPythonWidget(FrontendWidget):'
253 self._append_plain_text(u'\n', True)
255 self._append_plain_text(u'\n', True)
254
256
255 def _handle_kernel_info_reply(self, rep):
257 def _handle_kernel_info_reply(self, rep):
256 """ Handle kernel info replies.
258 """Handle kernel info replies."""
257 """
259 content = rep['content']
258 if not self._guiref_loaded:
260 if not self._guiref_loaded:
259 if rep['content'].get('language') == 'python':
261 if content.get('language') == 'python':
260 self._load_guiref_magic()
262 self._load_guiref_magic()
261 self._guiref_loaded = True
263 self._guiref_loaded = True
262
264
263 def _started_channels(self):
265 self.kernel_banner = content.get('banner', '')
264 """Reimplemented to make a history request and load %guiref."""
266 if self._starting:
267 # finish handling started channels
268 self._starting = False
265 super(IPythonWidget, self)._started_channels()
269 super(IPythonWidget, self)._started_channels()
266
270
271 def _started_channels(self):
272 """Reimplemented to make a history request and load %guiref."""
273 self._starting = True
267 # The reply will trigger %guiref load provided language=='python'
274 # The reply will trigger %guiref load provided language=='python'
268 self.kernel_client.kernel_info()
275 self.kernel_client.kernel_info()
269
276
270 self.kernel_client.shell_channel.history(hist_access_type='tail',
277 self.kernel_client.shell_channel.history(hist_access_type='tail',
271 n=1000)
278 n=1000)
272
279
273 def _started_kernel(self):
274 """Load %guiref when the kernel starts (if channels are also started).
275
276 Principally triggered by kernel restart.
277 """
278 if self.kernel_client.shell_channel is not None:
279 self._load_guiref_magic()
280
281 def _load_guiref_magic(self):
280 def _load_guiref_magic(self):
282 """Load %guiref magic."""
281 """Load %guiref magic."""
283 self.kernel_client.shell_channel.execute('\n'.join([
282 self.kernel_client.shell_channel.execute('\n'.join([
@@ -568,5 +567,4 b' class IPythonWidget(FrontendWidget):'
568 #------ Trait default initializers -----------------------------------------
567 #------ Trait default initializers -----------------------------------------
569
568
570 def _banner_default(self):
569 def _banner_default(self):
571 from IPython.core.usage import default_gui_banner
570 return "IPython QtConsole {version}\n".format(version=version)
572 return default_gui_banner
@@ -22,6 +22,7 b' except ImportError:'
22 from Queue import Empty # Py 2
22 from Queue import Empty # Py 2
23
23
24 from IPython.core import page
24 from IPython.core import page
25 from IPython.core import release
25 from IPython.utils.warn import warn, error
26 from IPython.utils.warn import warn, error
26 from IPython.utils import io
27 from IPython.utils import io
27 from IPython.utils.py3compat import string_types, input
28 from IPython.utils.py3compat import string_types, input
@@ -37,6 +38,7 b' class ZMQTerminalInteractiveShell(TerminalInteractiveShell):'
37 _executing = False
38 _executing = False
38 _execution_state = Unicode('')
39 _execution_state = Unicode('')
39 _pending_clearoutput = False
40 _pending_clearoutput = False
41 kernel_banner = Unicode('')
40 kernel_timeout = Float(60, config=True,
42 kernel_timeout = Float(60, config=True,
41 help="""Timeout for giving up on a kernel (in seconds).
43 help="""Timeout for giving up on a kernel (in seconds).
42
44
@@ -375,6 +377,24 b' class ZMQTerminalInteractiveShell(TerminalInteractiveShell):'
375 # handling seems rather unpredictable...
377 # handling seems rather unpredictable...
376 self.write("\nKeyboardInterrupt in interact()\n")
378 self.write("\nKeyboardInterrupt in interact()\n")
377
379
380 def _banner1_default(self):
381 return "IPython Console {version}\n".format(version=release.version)
382
383 def compute_banner(self):
384 super(ZMQTerminalInteractiveShell, self).compute_banner()
385 if self.client and not self.kernel_banner:
386 msg_id = self.client.kernel_info()
387 while True:
388 try:
389 reply = self.client.get_shell_msg(timeout=1)
390 except Empty:
391 break
392 else:
393 if reply['parent_header'].get('msg_id') == msg_id:
394 self.kernel_banner = reply['content'].get('banner', '')
395 break
396 self.banner += self.kernel_banner
397
378 def wait_for_kernel(self, timeout=None):
398 def wait_for_kernel(self, timeout=None):
379 """method to wait for a kernel to be ready"""
399 """method to wait for a kernel to be ready"""
380 tic = time.time()
400 tic = time.time()
General Comments 0
You need to be logged in to leave comments. Login now