:Returns : True if everything is done.
"""
- # Check progress and update status in each operation
- # Access completion.status property do the trick
- for operation in completions:
- self.log.info("<%s> is_finished:%s", operation, operation.is_finished)
+ if completions:
+ self.log.info("process: completions={0}".format(orchestrator.pretty_print(completions)))
def serve(self):
""" Mandatory for standby modules
self.__class__, self._state, val, self._on_complete, id(self), name, getattr(next, '_progress_reference', 'NA'), repr(self._next_promise)
)
+ def pretty_print_1(self):
+ if self._name:
+ name = self._name
+ elif self._on_complete is None:
+ name = 'lambda x: x'
+ elif hasattr(self._on_complete, '__name__'):
+ name = getattr(self._on_complete, '__name__')
+ else:
+ name = self._on_complete.__class__.__name__
+ val = repr(self._value) if self._value not in (self.NO_RESULT, self.ASYNC_RESULT) else '...'
+ if hasattr(val, 'debug_str'):
+ val = val.debug_str()
+ prefix = {
+ self.INITIALIZED: ' ',
+ self.RUNNING: ' >>>',
+ self.FINISHED: '(done)'
+ }[self._state]
+ return '{} {}({}),'.format(prefix, name, val)
+
def then(self, on_complete):
# type: (Any, Callable) -> Any
"""
_first_promise=_first_promise,
value=value,
on_complete=on_complete
- ).then(
+ ).add_progress(message, mgr, calc_percent)
+
+ return c._first_promise
+
+ def add_progress(self,
+ message, # type: str
+ mgr,
+ calc_percent=None # type: Optional[Callable[[], Any]]
+ ):
+ return self.then(
on_complete=ProgressReference(
message=message,
mgr=mgr,
completion=calc_percent
)
)
- return c._first_promise
def fail(self, e):
super(Completion, self).fail(e)
"""
return self.is_errored or (self.has_result)
+ def pretty_print(self):
+
+ reprs = '\n'.join(p.pretty_print_1() for p in iter(self._first_promise))
+ return """<{}>[\n{}\n]""".format(self.__class__.__name__, reprs)
+
+
+def pretty_print(completions):
+ # type: (List[Completion]) -> str
+ return ', '.join(c.pretty_print() for c in completions)
+
def raise_if_exception(c):
# type: (Completion) -> None
c = Completion().then(lambda _: 3)
c._first_promise.fail(KeyError())
assert isinstance(c.exception, KeyError)
+
+
+def test_pretty_print():
+ mgr = mock.MagicMock()
+ mgr.process = lambda cs: [c.finalize(None) for c in cs]
+
+ def add_one(x):
+ return x+1
+
+ c = Completion(value=1, on_complete=add_one).then(
+ str
+ ).add_progress('message', mgr)
+
+ assert c.pretty_print() == """<Completion>[
+ add_one(1),
+ str(...),
+ ProgressReference(...),
+]"""
+ c.finalize()
+ assert c.pretty_print() == """<Completion>[
+(done) add_one(1),
+(done) str(2),
+(done) ProgressReference('2'),
+]"""
+
+ p = some_complex_completion()
+ assert p.pretty_print() == """<Completion>[
+ <lambda>(3),
+ lambda x: x(...),
+]"""
+ p.finalize()
+ assert p.pretty_print() == """<Completion>[
+(done) <lambda>(3),
+(done) <lambda>(4),
+(done) lambda x: x(5),
+(done) lambda x: x(5),
+]"""
+
+ assert p.result == 5
+