From 4043b271fee4f6c36c99c8038018d54cd86b94eb 2014-10-31 01:54:33 From: Nathaniel J. Smith Date: 2014-10-31 01:54:33 Subject: [PATCH] Remove EventManager reset methods, because they violate encapsulation. The whole idea of the EventManager is that you can register hooks without worrying about what hooks other pieces of code might be registering. The reset methods violate this separation of concerns, since they will blow away everyone else's hooks too. (See gh-6680 for an example of this breaking things.) Since there is never any safe way to use them, we simply remove them entirely. --- diff --git a/IPython/core/events.py b/IPython/core/events.py index dcdc669..798ef01 100644 --- a/IPython/core/events.py +++ b/IPython/core/events.py @@ -63,14 +63,6 @@ class EventManager(object): """Remove a callback from the given event.""" self.callbacks[event].remove(function) - def reset(self, event): - """Clear all callbacks for the given event.""" - self.callbacks[event] = [] - - def reset_all(self): - """Clear all callbacks for all events.""" - self.callbacks = {n:[] for n in self.callbacks} - def trigger(self, event, *args, **kwargs): """Call callbacks for ``event``. diff --git a/IPython/core/tests/test_events.py b/IPython/core/tests/test_events.py index e265999..8e8402c 100644 --- a/IPython/core/tests/test_events.py +++ b/IPython/core/tests/test_events.py @@ -25,22 +25,8 @@ class CallbackTests(unittest.TestCase): self.em.trigger('ping_received') self.assertEqual(cb.call_count, 1) - def test_reset(self): - cb = Mock() - self.em.register('ping_received', cb) - self.em.reset('ping_received') - self.em.trigger('ping_received') - assert not cb.called - - def test_reset_all(self): - cb = Mock() - self.em.register('ping_received', cb) - self.em.reset_all() - self.em.trigger('ping_received') - assert not cb.called - def test_cb_error(self): cb = Mock(side_effect=ValueError) self.em.register('ping_received', cb) with tt.AssertPrints("Error in callback"): - self.em.trigger('ping_received') \ No newline at end of file + self.em.trigger('ping_received') diff --git a/IPython/core/tests/test_interactiveshell.py b/IPython/core/tests/test_interactiveshell.py index 4d95a68..b9e76c2 100644 --- a/IPython/core/tests/test_interactiveshell.py +++ b/IPython/core/tests/test_interactiveshell.py @@ -301,7 +301,10 @@ class InteractiveShellTestCase(unittest.TestCase): assert post_explicit.called finally: # remove post-exec - ip.events.reset_all() + ip.events.unregister('pre_run_cell', pre_explicit) + ip.events.unregister('pre_execute', pre_always) + ip.events.unregister('post_run_cell', post_explicit) + ip.events.unregister('post_execute', post_always) def test_silent_noadvance(self): """run_cell(silent=True) doesn't advance execution_count"""