Issues (19)

synergine/core/ActionManager.py (1 issue)

1
from synergine.core.exception.NotFoundError import NotFoundError
2
3
4
class ActionManager():
5
    """
6
    Manaer of Action object
7
    """
8
9
    def get_steps_for_actions(self, actions: list):
10
        """
11
        Return a list of hierarchical list of action where an action is always
12
        placed in list after list containing his Action dependencies
13
        :param actions: list of Action
14
        :return: list of steps where step contain list of Event
15
        """
16
        actions_copy = actions[:]
17
        steps = [[]]
18
        count = 0
19
        for action in actions_copy:
20
            count += 1
21
            if count > 10000:  # TODO: hard code
22
                raise Exception("Impossible to find dependencies of action", actions)
23
            last_action = action
24
            action_dependencies = action.get_dependencies()
25
            if action_dependencies:
26
                try:
27
                    step_index = self._get_step_index_for_dependencies(steps, action_dependencies)
28
                    if step_index is not None:
29
                        try:
30
                            steps[step_index+1].append(action)
31
                        except IndexError:
32
                            steps.append([action])
33
                    else:
34
                        step = []
35
                        step.extend(action_dependencies)
36
                        steps.append(step)
37
                # Si une des dependences n'est pas encore dans les steps, on s'occupera de cette action plus tard
38
                except NotFoundError:
39
                    # TODO: Prevoir le cas ou la dependance n'existera jamais dans la liste et lever une erreur
40
                    actions_copy.append(action)
41
            else:
42
                steps[0].append(action)
43
        return steps
44
45
    def _get_step_index_for_dependencies(self, steps, dependencies):
0 ignored issues
show
Coding Style Naming introduced by
The name _get_step_index_for_dependencies does not conform to the method naming conventions ([a-z_][a-z0-9_]{2,30}$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
46
        step_index_found = None
47
        for dependency in dependencies:
48
            step_index = self._get_step_index_for_dependency(steps, dependency)
49
            if step_index_found is None:
50
                step_index_found = step_index
51
            else:
52
                if step_index > step_index_found:
53
                    step_index_found = step_index
54
        return step_index_found
55
56
    def _get_step_index_for_dependency(self, steps, dependency):
57
        for step_index, step_actions in enumerate(steps):
58
            for step_action in step_actions:
59
                if issubclass(step_action, dependency):
60
                    return step_index
61
        raise NotFoundError()