# -*- coding: utf-8 -*-
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Module for instantiating builders.

Typically builder classes/objects are obtained indirectly via the helpers in
this module.  This is because the config_lib settings can't import this
module (and children directly): it might lead to circular references, and it
would add a lot of overhead to that module.  Generally only the main cbuildbot
module needs to care about the builder classes.

If you're looking for a specific builder implementation, then check out the
*_builders.py modules that are in this same directory.  The config_lib
has a builder_class_name member that controls the type of builder that is used
for each config.  e.g. builder_class_name='Simple' would look for the class
whose name is 'SimpleBuilder' in all the *_builders.py modules.
"""

from __future__ import print_function

import glob
import os

from chromite.lib import cros_import


def GetBuilderClass(name):
  """Locate the builder class with |name|.

  Examples:
    If you want to create a new SimpleBuilder, you'd do:
    cls = builders.GetBuilderClass('simple_builders.SimpleBuilder')
    builder = cls(...)

    If you want a site specific builder class, do:
    cls = builders.GetBuilderClass('config.my_builders.MyBuilder')
    builder = cls(...)

  Args:
    name: The base name of the builder class.

  Returns:
    The class used to instantiate this type of builder.

  Raises:
    AttributeError when |name| could not be found.
  """
  if '.' not in name:
    raise ValueError('name should be "<module>.<builder>" not "%s"' % name)

  name_parts = name.split('.')

  # Last part is the class name.
  builder_class_name = name_parts.pop()

  if name_parts[0] == 'config':
    # config means pull from the site specific config.
    # config.my_builders -> chromite.config.my_builders
    name_parts = ['chromite'] + name_parts
  else:
    # Otherwise pull from chromite.
    # simple_builders -> chromite.cbuidlbot.builders.simple_builders
    name_parts = ['chromite', 'cbuildbot', 'builders'] + name_parts

  target = '.'.join(name_parts)
  module = cros_import.ImportModule(target)

  # See if this module has the builder we care about.
  if hasattr(module, builder_class_name):
    return getattr(module, builder_class_name)

  raise AttributeError('could not locate %s builder' % builder_class_name)


def Builder(builder_run, buildstore):
  """Given a |builder_run| runtime, return an instantiated builder

  This is a helper wrapper that resolves the builder_class_name field in the
  builder settings (which was declared in the build config) to the actual class
  found in the builder modules.

  Args:
    builder_run: A cbuildbot_run.BuilderRun object.
    buildstore: BuildStore instance to make DB calls with.

  Returns:
    An object of type generic_builders.Builder.
  """
  cls = GetBuilderClass(builder_run.config.builder_class_name)
  return cls(builder_run, buildstore)
