diff --git a/taskflow/engines/action_engine/analyzer.py b/taskflow/engines/action_engine/analyzer.py index 3a88a461..f5c68722 100644 --- a/taskflow/engines/action_engine/analyzer.py +++ b/taskflow/engines/action_engine/analyzer.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +import abc import functools import itertools @@ -23,7 +24,33 @@ import six from taskflow import states as st -class IgnoreDecider(object): +@six.add_metaclass(abc.ABCMeta) +class Decider(object): + """Base class for deciders. + + Provides interface to be implemented by sub-classes + Decider checks whether next atom in flow should be executed or not + """ + + @abc.abstractmethod + def check(self, runtime): + """Returns bool of whether this decider should allow running.""" + + @abc.abstractmethod + def affect(self, runtime): + """If the :py:func:`~.check` returns false, affects associated atoms. + + """ + + def check_and_affect(self, runtime): + """Handles :py:func:`~.check` + :py:func:`~.affect` in right order.""" + proceed = self.check(runtime) + if not proceed: + self.affect(runtime) + return proceed + + +class IgnoreDecider(Decider): """Checks any provided edge-deciders and determines if ok to run.""" def __init__(self, atom, edge_deciders): @@ -51,15 +78,8 @@ class IgnoreDecider(object): runtime.reset_nodes(itertools.chain([self._atom], successors_iter), state=st.IGNORE, intention=st.IGNORE) - def check_and_affect(self, runtime): - """Handles :py:func:`~.check` + :py:func:`~.affect` in right order.""" - proceed = self.check(runtime) - if not proceed: - self.affect(runtime) - return proceed - -class NoOpDecider(object): +class NoOpDecider(Decider): """No-op decider that says it is always ok to run & has no effect(s).""" def check(self, runtime): @@ -69,13 +89,6 @@ class NoOpDecider(object): def affect(self, runtime): """Does nothing.""" - def check_and_affect(self, runtime): - """Handles :py:func:`~.check` + :py:func:`~.affect` in right order. - - Does nothing. - """ - return self.check(runtime) - class Analyzer(object): """Analyzes a compilation and aids in execution processes.