Graph of actors =============== An Ewoks task graph is converted to a graph of *actors* before execution by the *pypushflow* engine. Source ------ A task is wrapped by an *EwoksPythonActor* followed by some binder actors, depending on the type of link between source and target. For each link in the task graph, the final actor of the source is a *NameMapperActor* which is connected to the target. Unconditional link .. mermaid:: graph LR; EwoksPythonActor-->NameMapperActor; Conditional link with one condition .. mermaid:: graph LR; EwoksPythonActor-->ConditionalActor; ConditionalActor-->NameMapperActor; On-Error conditional link .. mermaid:: graph LR; EwoksPythonActor-->NameMapperActor; Target ^^^^^^ .. mermaid:: graph LR; InputMergeActor-->EwoksPythonActor; The *NameMapperActor* of a source for a specific target is connected to the *InputMergeActor* before that target. Start actor ----------- The *StartActor* is connected to all tasks that are the start of a task scheduling thread. Stop actor ---------- Tasks without successors are connected to the *StopActor*. This actor manages a dictionary of outputs which is considered to be the "output of the graph". Error handler ------------- All actors that do not have an _on_error_ conditional link are connected to the *ErrorHandler* which directly connected to the *StopActor*. Custom actors ------------- These actors are not provided by *pypushflow* * *EwoksythonActor*: like *PythonActor* but it passes node name and attributes to the next actor. * *InputMergeActor*: like *Joinactor* (merges the input data dictionaries) triggers the downstream actors when all required input has been provided at least once. Only one non-required input passed. * *ConditionalActor*: triggers downstream actors when all conditions are fulfilled. * *NameMapperActor*: before triggering the next task it applies filtering and name mapping to the input data.