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)
Example #2
0
    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 '}'
Example #3
0
 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)
Example #4
0
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
Example #5
0
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
Example #6
0
  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)