# Copyright 2015 The ChromiumOS Authors
# 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.
"""

import importlib


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 = importlib.import_module(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)
