# -*- 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 importlib
import sys


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


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)
