diff --git a/IPython/parallel/client/view.py b/IPython/parallel/client/view.py index 47bf0aa..ca29e84 100644 --- a/IPython/parallel/client/view.py +++ b/IPython/parallel/client/view.py @@ -128,13 +128,20 @@ class View(HasTraits): assert not self.__class__ is View, "Don't use base View objects, use subclasses" - def __repr__(self): strtargets = str(self.targets) if len(strtargets) > 16: strtargets = strtargets[:12]+'...]' return "<%s %s>"%(self.__class__.__name__, strtargets) - + + def __len__(self): + if isinstance(self.targets, list): + return len(self.targets) + elif isinstance(self.targets, int): + return 1 + else: + return len(self.client) + def set_flags(self, **kwargs): """set my attribute flags by keyword. diff --git a/IPython/parallel/tests/test_view.py b/IPython/parallel/tests/test_view.py index 8c524c1..88caa9b 100644 --- a/IPython/parallel/tests/test_view.py +++ b/IPython/parallel/tests/test_view.py @@ -25,6 +25,7 @@ import zmq from nose import SkipTest from IPython.testing import decorators as dec +from IPython.testing.ipunittest import ParametricTestCase from IPython import parallel as pmod from IPython.parallel import error @@ -39,7 +40,7 @@ from .clienttest import ClusterTestCase, crash, wait, skip_without def setup(): add_engines(3, total=True) -class TestView(ClusterTestCase): +class TestView(ClusterTestCase, ParametricTestCase): def test_z_crash_mux(self): """test graceful handling of engine death (direct)""" @@ -550,4 +551,21 @@ class TestView(ClusterTestCase): check = [ -1*i for i in r ] result = e0.map_sync(lambda x: -1*x, r) self.assertEquals(result, check) + + def test_len(self): + """len(view) makes sense""" + e0 = self.client[self.client.ids[0]] + yield self.assertEquals(len(e0), 1) + v = self.client[:] + yield self.assertEquals(len(v), len(self.client.ids)) + v = self.client.direct_view('all') + yield self.assertEquals(len(v), len(self.client.ids)) + v = self.client[:2] + yield self.assertEquals(len(v), 2) + v = self.client[:1] + yield self.assertEquals(len(v), 1) + v = self.client.load_balanced_view() + yield self.assertEquals(len(v), len(self.client.ids)) + # parametric tests seem to require manual closing? + self.client.close()