##// END OF EJS Templates
AsyncResult.__getattr__ shouldn't raise TimeoutError...
MinRK -
Show More
@@ -62,6 +62,7 b' class AsyncResult(object):'
62 self._tracker = tracker
62 self._tracker = tracker
63 self._ready = False
63 self._ready = False
64 self._success = None
64 self._success = None
65 self._metadata = None
65 if len(msg_ids) == 1:
66 if len(msg_ids) == 1:
66 self._single_result = not isinstance(targets, (list, tuple))
67 self._single_result = not isinstance(targets, (list, tuple))
67 else:
68 else:
@@ -231,13 +232,13 b' class AsyncResult(object):'
231 else:
232 else:
232 raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key))
233 raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key))
233
234
234 @check_ready
235 def __getattr__(self, key):
235 def __getattr__(self, key):
236 """getattr maps to getitem for convenient attr access to metadata."""
236 """getattr maps to getitem for convenient attr access to metadata."""
237 if key not in self._metadata[0].keys():
237 try:
238 return self.__getitem__(key)
239 except (error.TimeoutError, KeyError):
238 raise AttributeError("%r object has no attribute %r"%(
240 raise AttributeError("%r object has no attribute %r"%(
239 self.__class__.__name__, key))
241 self.__class__.__name__, key))
240 return self.__getitem__(key)
241
242
242 # asynchronous iterator:
243 # asynchronous iterator:
243 def __iter__(self):
244 def __iter__(self):
@@ -70,4 +70,46 b' class AsyncResultTest(ClusterTestCase):'
70 self.assertEquals(sorted(d.keys()), sorted(self.client.ids))
70 self.assertEquals(sorted(d.keys()), sorted(self.client.ids))
71 for eid,r in d.iteritems():
71 for eid,r in d.iteritems():
72 self.assertEquals(r, 5)
72 self.assertEquals(r, 5)
73
74 def test_list_amr(self):
75 ar = self.client.load_balanced_view().map_async(wait, [0.1]*5)
76 rlist = list(ar)
77
78 def test_getattr(self):
79 ar = self.client[:].apply_async(wait, 0.5)
80 self.assertRaises(AttributeError, lambda : ar._foo)
81 self.assertRaises(AttributeError, lambda : ar.__length_hint__())
82 self.assertRaises(AttributeError, lambda : ar.foo)
83 self.assertRaises(AttributeError, lambda : ar.engine_id)
84 self.assertFalse(hasattr(ar, '__length_hint__'))
85 self.assertFalse(hasattr(ar, 'foo'))
86 self.assertFalse(hasattr(ar, 'engine_id'))
87 ar.get(5)
88 self.assertRaises(AttributeError, lambda : ar._foo)
89 self.assertRaises(AttributeError, lambda : ar.__length_hint__())
90 self.assertRaises(AttributeError, lambda : ar.foo)
91 self.assertTrue(isinstance(ar.engine_id, list))
92 self.assertEquals(ar.engine_id, ar['engine_id'])
93 self.assertFalse(hasattr(ar, '__length_hint__'))
94 self.assertFalse(hasattr(ar, 'foo'))
95 self.assertTrue(hasattr(ar, 'engine_id'))
96
97 def test_getitem(self):
98 ar = self.client[:].apply_async(wait, 0.5)
99 self.assertRaises(TimeoutError, lambda : ar['foo'])
100 self.assertRaises(TimeoutError, lambda : ar['engine_id'])
101 ar.get(5)
102 self.assertRaises(KeyError, lambda : ar['foo'])
103 self.assertTrue(isinstance(ar['engine_id'], list))
104 self.assertEquals(ar.engine_id, ar['engine_id'])
105
106 def test_single_result(self):
107 ar = self.client[-1].apply_async(wait, 0.5)
108 self.assertRaises(TimeoutError, lambda : ar['foo'])
109 self.assertRaises(TimeoutError, lambda : ar['engine_id'])
110 self.assertTrue(ar.get(5) == 0.5)
111 self.assertTrue(isinstance(ar['engine_id'], int))
112 self.assertTrue(isinstance(ar.engine_id, int))
113 self.assertEquals(ar.engine_id, ar['engine_id'])
114
73
115
@@ -68,10 +68,11 b' class TestLoadBalancedView(ClusterTestCase):'
68 data = range(16,0,-1)
68 data = range(16,0,-1)
69 reference = map(f, data)
69 reference = map(f, data)
70
70
71 amr = self.view.map_async(f, data, ordered=False)
71 amr = self.view.map_async(slow_f, data, ordered=False)
72 self.assertTrue(isinstance(amr, pmod.AsyncMapResult))
72 self.assertTrue(isinstance(amr, pmod.AsyncMapResult))
73 # check individual elements, retrieved as they come (uses __iter__)
73 # check individual elements, retrieved as they come
74 astheycame = list(amr)
74 # list comprehension uses __iter__
75 astheycame = [ r for r in amr ]
75 # Ensure that at least one result came out of order:
76 # Ensure that at least one result came out of order:
76 self.assertNotEquals(astheycame, reference, "should not have preserved order")
77 self.assertNotEquals(astheycame, reference, "should not have preserved order")
77 self.assertEquals(sorted(astheycame, reverse=True), reference, "result corrupted")
78 self.assertEquals(sorted(astheycame, reverse=True), reference, "result corrupted")
@@ -86,9 +87,10 b' class TestLoadBalancedView(ClusterTestCase):'
86 data = range(16,0,-1)
87 data = range(16,0,-1)
87 reference = map(f, data)
88 reference = map(f, data)
88
89
89 amr = self.view.map_async(f, data)
90 amr = self.view.map_async(slow_f, data)
90 self.assertTrue(isinstance(amr, pmod.AsyncMapResult))
91 self.assertTrue(isinstance(amr, pmod.AsyncMapResult))
91 # check individual elements, retrieved as they come (uses __iter__)
92 # check individual elements, retrieved as they come
93 # list(amr) uses __iter__
92 astheycame = list(amr)
94 astheycame = list(amr)
93 # Ensure that results came in order
95 # Ensure that results came in order
94 self.assertEquals(astheycame, reference)
96 self.assertEquals(astheycame, reference)
General Comments 0
You need to be logged in to leave comments. Login now