From 654c9fe583fe417eff9512ffa56e9e309f3fd760 2013-10-08 21:07:11
From: Pablo de Oliveira <pablo@sifflez.org>
Date: 2013-10-08 21:07:11
Subject: [PATCH] set_next_input: squash multiple calls from the same cell execution

* When calling multiple times set_next_input in a single cell execution,
  we only keep the last input.

* Added generic support to PayloadManager for updating (instead of
  appending) payloads from a given 'source'.

Closes #1349

---

diff --git a/IPython/core/payload.py b/IPython/core/payload.py
index 75b681c..7a6c9c6 100644
--- a/IPython/core/payload.py
+++ b/IPython/core/payload.py
@@ -29,9 +29,17 @@ class PayloadManager(Configurable):
 
     _payload = List([])
 
-    def write_payload(self, data):
+    def write_payload(self, data, update=False):
         if not isinstance(data, dict):
             raise TypeError('Each payload write must be a dict, got: %r' % data)
+
+        if update and 'source' in data:
+            source = data['source']
+            for i,pl in enumerate(self._payload):
+                if 'source' in pl and pl['source'] == source:
+                    self._payload[i] = data
+                    return
+
         self._payload.append(data)
 
     def read_payload(self):
diff --git a/IPython/kernel/zmq/zmqshell.py b/IPython/kernel/zmq/zmqshell.py
index df7f5a5..62d2cb8 100644
--- a/IPython/kernel/zmq/zmqshell.py
+++ b/IPython/kernel/zmq/zmqshell.py
@@ -583,7 +583,7 @@ class ZMQInteractiveShell(InteractiveShell):
             source='set_next_input',
             text=text
         )
-        self.payload_manager.write_payload(payload)
+        self.payload_manager.write_payload(payload, update=True)
     
     #-------------------------------------------------------------------------
     # Things related to magics