summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mailman/commands/cli_withlist.py32
-rw-r--r--src/mailman/config/schema.cfg9
-rw-r--r--src/mailman/interact.py4
3 files changed, 41 insertions, 4 deletions
diff --git a/src/mailman/commands/cli_withlist.py b/src/mailman/commands/cli_withlist.py
index 61e1bec7c..bc25363b1 100644
--- a/src/mailman/commands/cli_withlist.py
+++ b/src/mailman/commands/cli_withlist.py
@@ -28,6 +28,8 @@ __all__ = [
import re
+from lazr.config import as_boolean
+
from zope.component import getUtility
from zope.interface import implements
@@ -148,8 +150,34 @@ class Withlist:
commit=config.db.commit,
abort=config.db.abort,
config=config,
- )
- interact(upframe=False, banner=banner, overrides=overrides)
+ )
+ banner = '\n'.join([unicode(config.shell.banner), banner])
+ if as_boolean(config.shell.use_ipython):
+ self._start_ipython(overrides, banner) #config.shell.banner)
+ else:
+ self._start_python(overrides, banner) #config.shell.banner)
+
+ def _start_ipython(self, overrides, banner):
+ try:
+ from IPython.frontend.terminal.embed import InteractiveShellEmbed
+ ipshell = InteractiveShellEmbed(banner1=banner,
+ user_ns=overrides)
+ ipshell()
+ except ImportError:
+ print _("ipython is not available, set use_ipython to no")
+
+ def _start_python(self, overrides, banner):
+ # set the tab completion
+ import sys
+ try:
+ import readline, rlcompleter
+ readline.parse_and_bind('tab: complete')
+ except ImportError:
+ pass
+ else:
+ sys.ps1 = config.shell.ps1 + ' '
+ interact(upframe=False, banner=config.shell.banner,
+ overrides=overrides)
def _details(self):
"""Print detailed usage."""
diff --git a/src/mailman/config/schema.cfg b/src/mailman/config/schema.cfg
index cde01cbd7..22ad878c7 100644
--- a/src/mailman/config/schema.cfg
+++ b/src/mailman/config/schema.cfg
@@ -62,6 +62,15 @@ post_hook:
# Which paths.* file system layout to use.
layout: dev
+[shell]
+
+# customize the interpreter prompt
+ps1: << MM >>
+# banner to show on startup
+banner: welcome to the mailman shell
+# if IPython is found use it as the shell
+use_ipython: no
+
[paths.master]
# Important directories for Mailman operation. These are defined here so that
diff --git a/src/mailman/interact.py b/src/mailman/interact.py
index 3e7715c00..613a85b0d 100644
--- a/src/mailman/interact.py
+++ b/src/mailman/interact.py
@@ -28,7 +28,7 @@ import os
import sys
import code
-DEFAULT_BANNER = object()
+DEFAULT_BANNER = ""
@@ -69,7 +69,7 @@ def interact(upframe=True, banner=DEFAULT_BANNER, overrides=None):
except:
pass
# We don't want the funky console object in parentheses in the banner.
- if banner is DEFAULT_BANNER:
+ if banner == DEFAULT_BANNER:
banner = '''\
Python %s on %s
Type "help", "copyright", "credits" or "license" for more information.''' % (