def test_load_valid_partial_goals(self): def register_goals(): Phase('jack').install(Goal('jill', lambda: 42)) with self.create_register(register_goals=register_goals) as backend_package: Phase.clear() self.assertEqual(0, len(Phase.all())) load_backend(self.build_configuration, backend_package) self.assert_empty_aliases() self.assertEqual(1, len(Phase.all())) goals = Phase('jack').goals() self.assertEqual(1, len(goals)) goal = goals[0] self.assertEqual('jill', goal.name)
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 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 parse_args(args): goals = OrderedSet() specs = OrderedSet() explicit_multi = False logger = logging.getLogger(__name__) has_double_dash = u'--' in args goal_names = [phase.name for phase, goal in Phase.all()] if not goal_names: raise GoalError( 'Arguments cannot be parsed before the list of goals from Phase.all() is populated.') def is_spec(spec): if os.sep in spec or ':' in spec: return True # Definitely not a goal. if not (spec in goal_names): return True # Definitely not a (known) goal. if has_double_dash: # This means that we're parsing the half of the expression before a --, so assume it's a # goal without warning. return False # Here, it's possible we have a goal and target with the same name. For now, always give # priority to the goal, but give a warning if they might have meant the target (if the BUILD # file exists). try: BuildFile(get_buildroot(), spec) msg = (' Command-line argument "{spec}" is ambiguous, and was assumed to be a goal.' ' If this is incorrect, disambiguate it with the "--" argument to separate goals' ' from targets.') logger.warning(msg.format(spec=spec)) except IOError: pass # Awesome, it's unambiguous. return False for i, arg in enumerate(args): if not arg.startswith('-'): specs.add(arg) if is_spec(arg) else goals.add(arg) elif '--' == arg: if specs: raise Goal.IntermixedArgumentsError('Cannot intermix targets with goals when using --. ' 'Targets should appear on the right') explicit_multi = True del args[i] break if explicit_multi: specs.update(arg for arg in args[len(goals):] if not arg.startswith('-')) return goals, specs
def report(): yield 'Installed goals:' documented_rows = [] undocumented = [] max_width = 0 for phase, _ in Phase.all(): if phase.description: documented_rows.append((phase.name, phase.description)) max_width = max(max_width, len(phase.name)) elif self.context.options.goal_list_all: undocumented.append(phase.name) for name, description in documented_rows: yield ' %s: %s' % (name.rjust(max_width), description) if undocumented: yield '' yield 'Undocumented goals:' yield ' %s' % ' '.join(undocumented)