def graph(): def get_cluster_name(phase): return 'cluster_%s' % phase.name.replace('-', '_') def get_goal_name(phase, goal): name = '%s_%s' % (phase.name, goal.name) return name.replace('-', '_') phase_by_phasename = {} for phase, goals in Phase.all(): phase_by_phasename[phase.name] = phase yield '\n'.join([ 'digraph G {', ' rankdir=LR;', ' graph [compound=true];', ]) for phase, installed_goals in Phase.all(): yield '\n'.join([ ' subgraph %s {' % get_cluster_name(phase), ' node [style=filled];', ' color = blue;', ' label = "%s";' % phase.name, ]) for installed_goal in installed_goals: yield ' %s [label="%s"];' % (get_goal_name(phase, installed_goal), installed_goal.name) yield ' }' edges = set() for phase, installed_goals in Phase.all(): for installed_goal in installed_goals: for dependency in installed_goal.dependencies: tail_goal = phase_by_phasename.get(dependency.name).goals()[-1] edge = 'ltail=%s lhead=%s' % (get_cluster_name(phase), get_cluster_name(Phase.of(tail_goal))) if edge not in edges: yield ' %s -> %s [%s];' % (get_goal_name(phase, installed_goal), get_goal_name(Phase.of(tail_goal), tail_goal), edge) edges.add(edge) yield '}'
def _record(self, goal, elapsed): phase = Phase.of(goal) phase_timings = self._timings.get(phase) if phase_timings is None: phase_timings = OrderedDict(()) self._timings[phase] = phase_timings goal_timings = phase_timings.get(goal) if goal_timings is None: goal_timings = [] phase_timings[goal] = goal_timings goal_timings.append(elapsed)