From a86bbcb7d02e08ae945ad6dfc2f452e585ca2e23 Mon Sep 17 00:00:00 2001
From: Yann Leboulanger <asterix@lagaule.org>
Date: Sat, 17 Mar 2012 19:28:48 +0100
Subject: [PATCH] update ipyton_view for ipython 0.12

---
 src/ipython_view.py | 172 +++++++++++++++++++++++++++++---------------
 1 file changed, 115 insertions(+), 57 deletions(-)

diff --git a/src/ipython_view.py b/src/ipython_view.py
index d3507efea..c26a0bbf9 100644
--- a/src/ipython_view.py
+++ b/src/ipython_view.py
@@ -51,12 +51,6 @@ from StringIO import StringIO
 
 try:
     import IPython
-    import IPython.iplib
-    import IPython.prefilter
-    import IPython.Shell
-    import IPython.genutils
-    import IPython.shadowns
-    import IPython.history
 except ImportError:
     IPython = None
 
@@ -96,33 +90,52 @@ class IterableIPShell:
         @type input_func: function
         """
         if input_func:
-            IPython.iplib.raw_input_original = input_func
+            IPython.frontend.terminal.interactiveshell.raw_input_original = input_func
         if cin:
-            IPython.Shell.Term.cin = cin
+            IPython.utils.io.stdin = IPython.utils.io.IOStream(cin)
         if cout:
-            IPython.Shell.Term.cout = cout
+            IPython.utils.io.stdout = IPython.utils.io.IOStream(cout)
         if cerr:
-            IPython.Shell.Term.cerr = cerr
+            IPython.utils.io.stderr = IPython.utils.io.IOStream(cerr)
 
         # This is to get rid of the blockage that accurs during
         # IPython.Shell.InteractiveShell.user_setup()
-        IPython.iplib.raw_input = lambda x: None
+        IPython.utils.io.raw_input = lambda x: None
 
-        self.term = IPython.genutils.IOTerm(cin=cin, cout=cout, cerr=cerr)
+        self.term = IPython.utils.io.IOTerm(stdin=cin, stdout=cout, stderr=cerr)
         os.environ['TERM'] = 'dumb'
         excepthook = sys.excepthook
-        self.IP = IPython.Shell.make_IPython(
-          argv, user_ns=user_ns,
-          user_global_ns=user_global_ns,
-          embedded=True,
-          shell_class=IPython.Shell.InteractiveShell)
+
+        from IPython.config.loader import Config
+        cfg = Config()
+        cfg.InteractiveShell.colors = "Linux"
+
+        self.IP = IPython.frontend.terminal.embed.InteractiveShellEmbed(config=cfg, user_ns=user_ns)
         self.IP.system = lambda cmd: self.shell(self.IP.var_expand(cmd),
                                                 header='IPython system call: ',
-                                                verbose=self.IP.rc.system_verbose)
+                                                local_ns=user_ns)
+                                                #global_ns=user_global_ns)
+                                                #verbose=self.IP.rc.system_verbose)
+
+        self.IP.raw_input = input_func
         sys.excepthook = excepthook
         self.iter_more = 0
         self.history_level = 0
         self.complete_sep =  re.compile('[\s\{\}\[\]\(\)]')
+        self.updateNamespace({'exit':lambda:None})
+        self.updateNamespace({'quit':lambda:None})
+        self.IP.readline_startup_hook(self.IP.pre_readline)
+        # Workaround for updating namespace with sys.modules
+        #
+        self.__update_namespace()
+        
+    def __update_namespace(self):
+        '''
+        Update self.IP namespace for autocompletion with sys.modules
+        '''
+        for k,v in sys.modules.items():
+            if not '.' in k:
+                self.IP.user_ns.update({k:v})
 
     def execute(self):
         """
@@ -130,34 +143,69 @@ class IterableIPShell:
         """
         self.history_level = 0
         orig_stdout = sys.stdout
-        sys.stdout = IPython.Shell.Term.cout
-        try:
-            line = self.IP.raw_input(None, self.iter_more)
+        sys.stdout = self.term.stdout
+
+        orig_stdin = sys.stdin
+        sys.stdin = IPython.utils.io.stdin;
+        self.prompt = self.generatePrompt(self.iter_more)
+
+        self.IP.hooks.pre_prompt_hook()
+        if self.iter_more:
+            try:
+                self.prompt = self.generatePrompt(True)
+            except:
+                self.IP.showtraceback()
             if self.IP.autoindent:
-                self.IP.readline_startup_hook(None)
+                self.IP.rl_do_indent = True
+
+        try:
+            line = self.IP.raw_input(self.prompt)
         except KeyboardInterrupt:
             self.IP.write('\nKeyboardInterrupt\n')
-            self.IP.resetbuffer()
-            # keep cache in sync with the prompt counter:
-            self.IP.outputcache.prompt_count -= 1
-
-            if self.IP.autoindent:
-                self.IP.indent_current_nsp = 0
-            self.iter_more = 0
+            self.IP.input_splitter.reset()
         except:
             self.IP.showtraceback()
         else:
-            self.iter_more = self.IP.push(line)
+            self.IP.input_splitter.push(line)
+            self.iter_more = self.IP.input_splitter.push_accepts_more()
+            self.prompt = self.generatePrompt(self.iter_more)
             if (self.IP.SyntaxTB.last_syntax_error and
-                self.IP.rc.autoedit_syntax):
+                    self.IP.autoedit_syntax):
                 self.IP.edit_syntax_error()
-        if self.iter_more:
-            self.prompt = str(self.IP.outputcache.prompt2).strip()
-            if self.IP.autoindent:
-                self.IP.readline_startup_hook(self.IP.pre_readline)
-        else:
-            self.prompt = str(self.IP.outputcache.prompt1).strip()
+            if not self.iter_more:
+                source_raw = self.IP.input_splitter.source_raw_reset()[1]
+                self.IP.run_cell(source_raw, store_history=True)
+            else:
+                # TODO: Auto-indent
+                #
+                pass
+
         sys.stdout = orig_stdout
+        sys.stdin = orig_stdin
+    def generatePrompt(self, is_continuation):
+        '''
+        Generate prompt depending on is_continuation value
+
+        @param is_continuation
+        @type is_continuation: boolean 
+
+        @return: The prompt string representation
+        @rtype: string
+
+        '''
+
+        # Backwards compatibility with ipyton-0.11
+        #
+        ver = IPython.__version__
+        if '0.11' in ver:
+            prompt = self.IP.hooks.generate_prompt(is_continuation)
+        else:
+            if is_continuation:
+                prompt = self.IP.prompt_manager.render('in2')
+            else:
+                prompt = self.IP.prompt_manager.render('in')
+
+        return prompt
 
     def historyBack(self):
         """
@@ -214,28 +262,37 @@ class IterableIPShell:
         @rtype: tuple
         """
         split_line = self.complete_sep.split(line)
-        possibilities = self.IP.complete(split_line[-1])
-
-        try:
-            __builtins__.all()
-        except AttributeError:
-            def all(iterable):
-                for element in iterable:
-                    if not element:
-                        return False
-                return True
-
-        def common_prefix(seq):
-            """
-                      Return the common prefix of a sequence of strings
-                      """
-            return "".join(c for i, c in enumerate(seq[0])
-                    if all(s.startswith(c, i) for s in seq))
+        if split_line[-1]:
+            possibilities = self.IP.complete(split_line[-1])
+        else:
+            completed = line
+            possibilities = ['',[]]
         if possibilities:
-            completed = line[:-len(split_line[-1])]+common_prefix(possibilities)
+            def _commonPrefix(str1, str2):
+                '''
+                Reduction function. returns common prefix of two given strings.
+
+                @param str1: First string.
+                @type str1: string
+                @param str2: Second string
+                @type str2: string
+
+                @return: Common prefix to both strings.
+                @rtype: string
+                '''
+                for i in range(len(str1)):
+                    if not str2.startswith(str1[:i+1]):
+                        return str1[:i]
+                return str1
+
+            if possibilities[1]:
+                common_prefix = reduce(_commonPrefix, possibilities[1]) or line[-1]
+                completed = line[:-len(split_line[-1])]+common_prefix
+            else:
+                completed = line
         else:
             completed = line
-        return completed, possibilities
+        return completed, possibilities[1]
 
 
     def shell(self, cmd,verbose=0,debug=0,header=''):
@@ -332,7 +389,7 @@ class ConsoleView(gtk.TextView):
             for tag in ansi_tags:
                 i = segments.index(tag)
                 self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(),
-                                                     segments[i+1], tag)
+                                                     segments[i+1], str(tag))
                 segments.pop(i)
         if not editable:
             self.text_buffer.apply_tag_by_name('notouch',
@@ -472,6 +529,7 @@ class IPythonView(ConsoleView, IterableIPShell):
                                  input_func=self.raw_input)
 #    self.connect('key_press_event', self.keyPress)
         self.execute()
+        self.prompt = self.generatePrompt(False)
         self.cout.truncate(0)
         self.showPrompt(self.prompt)
         self.interrupt = False
-- 
GitLab