Make DependencySolver not static only

This commit is contained in:
Christophe Bedard 2019-08-03 16:26:08 +02:00
parent 97a94947fe
commit 94cc25c791

View file

@ -153,19 +153,28 @@ class DepedencySolver():
Post-order depth-first search (ish). Does not check for circular dependencies or other errors. Post-order depth-first search (ish). Does not check for circular dependencies or other errors.
""" """
@staticmethod def __init__(
def solve(initial_dependants: List[Dependant]) -> List[Dependant]: self,
initial_dependants: List[Dependant],
) -> None:
"""
Constructor.
:param initial_dependants: the initial dependant instances, in order
"""
self._initial_deps = initial_dependants
def solve(self) -> List[Dependant]:
""" """
Solve. Solve.
:param initial_dependants: the initial dependant instances, in order
:return: the solved list, including at least the initial dependants, in order :return: the solved list, including at least the initial dependants, in order
""" """
visited: Set[Type[Dependant]] = set() visited: Set[Type[Dependant]] = set()
solution: List[Dependant] = [] solution: List[Dependant] = []
initial_map = {type(dep_instance): dep_instance for dep_instance in initial_dependants} initial_map = {type(dep_instance): dep_instance for dep_instance in self._initial_deps}
for dep_instance in initial_dependants: for dep_instance in self._initial_deps:
DepedencySolver._solve_instance( self.__solve_instance(
dep_instance, dep_instance,
visited, visited,
initial_map, initial_map,
@ -173,8 +182,8 @@ class DepedencySolver():
) )
return solution return solution
@staticmethod def __solve_instance(
def _solve_instance( self,
dep_instance: Dependant, dep_instance: Dependant,
visited: Set[Type[Dependant]], visited: Set[Type[Dependant]],
initial_map: Dict[Type[Dependant], Dependant], initial_map: Dict[Type[Dependant], Dependant],
@ -182,7 +191,7 @@ class DepedencySolver():
) -> None: ) -> None:
if type(dep_instance) not in visited: if type(dep_instance) not in visited:
for dependency_type in type(dep_instance).dependencies(): for dependency_type in type(dep_instance).dependencies():
DepedencySolver._solve_type( DepedencySolver.__solve_type(
dependency_type, dependency_type,
visited, visited,
initial_map, initial_map,
@ -192,7 +201,7 @@ class DepedencySolver():
visited.add(type(dep_instance)) visited.add(type(dep_instance))
@staticmethod @staticmethod
def _solve_type( def __solve_type(
dep_type: Type[Dependant], dep_type: Type[Dependant],
visited: Set[Type[Dependant]], visited: Set[Type[Dependant]],
initial_map: Dict[Type[Dependant], Dependant], initial_map: Dict[Type[Dependant], Dependant],
@ -200,7 +209,7 @@ class DepedencySolver():
) -> None: ) -> None:
if dep_type not in visited: if dep_type not in visited:
for dependency_type in dep_type.dependencies(): for dependency_type in dep_type.dependencies():
DepedencySolver._solve_type( DepedencySolver.__solve_type(
dependency_type, dependency_type,
visited, visited,
initial_map, initial_map,
@ -252,7 +261,7 @@ class Processor():
:param handlers: the list of primary `EventHandler`s :param handlers: the list of primary `EventHandler`s
""" """
# TODO pass on **kwargs # TODO pass on **kwargs
return DepedencySolver.solve(handlers) return DepedencySolver(handlers).solve()
def _get_handler_maps(self) -> HandlerMultimap: def _get_handler_maps(self) -> HandlerMultimap:
""" """