Esempio n. 1
0
  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)
Esempio n. 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 '}'
Esempio n. 3
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 '}'
Esempio n. 4
0
  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
Esempio n. 5
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)
Esempio n. 6
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)