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 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)
def gen_goals_phases_reference_data(): """Generate the goals reference rst doc.""" phase_dict = {} phase_names = [] for phase, raw_goals in Phase.all(): parser = optparse.OptionParser(add_help_option=False) phase.setup_parser(parser, [], [phase]) options_by_title = defaultdict(lambda: None) for group in parser.option_groups: options_by_title[group.title] = group found_option_groups = set() goals = [] for goal in sorted(raw_goals, key=(lambda x: x.name.lower())): doc = indent_docstring_by_n(goal.task_type.__doc__ or "", 2) options_title = goal.title_for_option_group(phase) og = options_by_title[options_title] if og: found_option_groups.add(options_title) goals.append( TemplateData(name=goal.task_type.__name__, doc=doc, ogroup=gref_template_data_from_options(og))) leftover_option_groups = [] for group in parser.option_groups: if group.title in found_option_groups: continue leftover_option_groups.append( gref_template_data_from_options(group)) leftover_options = [] for option in parser.option_list: leftover_options.append(TemplateData(st=str(option))) phase_dict[phase.name] = TemplateData( phase=phase, goals=goals, leftover_opts=leftover_options, leftover_ogs=leftover_option_groups) phase_names.append(phase.name) phases = [phase_dict[name] for name in sorted(phase_names, key=_lower)] return phases
def gen_goals_phases_reference_data(): """Generate the template data for the goals reference rst doc.""" phase_dict = {} phase_names = [] for phase, raw_goals in Phase.all(): parser = optparse.OptionParser(add_help_option=False) phase.setup_parser(parser, [], [phase]) options_by_title = defaultdict(lambda: None) for group in parser.option_groups: options_by_title[group.title] = group found_option_groups = set() goals = [] for goal in sorted(raw_goals, key=(lambda x: x.name.lower())): doc = indent_docstring_by_n(goal.task_type.__doc__ or "", 2) options_title = goal.title_for_option_group(phase) og = options_by_title[options_title] if og: found_option_groups.add(options_title) impl = "{0}.{1}".format(goal.task_type.__module__, goal.task_type.__name__) goals.append(TemplateData( impl=impl, doc=doc, ogroup=gref_template_data_from_options(og))) leftover_option_groups = [] for group in parser.option_groups: if group.title in found_option_groups: continue leftover_option_groups.append(gref_template_data_from_options(group)) leftover_options = [] for option in parser.option_list: leftover_options.append(TemplateData(st=str(option))) phase_dict[phase.name] = TemplateData(phase=phase, goals=goals, leftover_opts=leftover_options, leftover_ogs=leftover_option_groups) phase_names.append(phase.name) phases = [phase_dict[name] for name in sorted(phase_names, key=_lower)] return phases
def _gen_goals_reference(self): """Generate the goals reference rst doc.""" phase_dict = {} phase_names = [] for phase, raw_goals in Phase.all(): goals = [] for g in raw_goals: # TODO(lahosken) generalize indent_docstring, use here doc = (g.task_type.__doc__ or '').replace('\n\'', ' \'').strip() goals.append(TemplateData(name=g.task_type.__name__, doc=doc)) phase_dict[phase.name] = TemplateData(phase=phase, goals=goals) phase_names.append(phase.name) phases = [phase_dict[name] for name in sorted(phase_names, key=_lower)] template = resource_string(__name__, os.path.join(self._templates_dir, 'goals_reference.mustache')) filename = os.path.join(self._outdir, 'goals_reference.rst') self.context.log.info('Generating %s' % filename) with safe_open(filename, 'w') as outfile: generator = Generator(template, phases=phases) generator.write(outfile)