diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4be6497 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +2.1.0 +----- +- feature: add builder drivers using stevedore diff --git a/giftwrap/builders/__init__.py b/giftwrap/builders/__init__.py index 77c87c4..8498d72 100644 --- a/giftwrap/builders/__init__.py +++ b/giftwrap/builders/__init__.py @@ -19,9 +19,12 @@ import os import threading from giftwrap.gerrit import GerritReview +from stevedore.driver import DriverManager +from stevedore.extension import ExtensionManager from abc import abstractmethod, ABCMeta +BUILDER_DRIVER_NAMESPACE = 'giftwrap.builder.drivers' LOG = logging.getLogger(__name__) @@ -34,6 +37,12 @@ class Builder(object): self._spec = spec self._thread_exit = [] + @staticmethod + def builder_names(ext_mgr=None): + if not ext_mgr: + ext_mgr = ExtensionManager(BUILDER_DRIVER_NAMESPACE) + return ext_mgr.names() + def _get_venv_pip_path(self, venv_path): return os.path.join(venv_path, 'bin/pip') @@ -182,5 +191,8 @@ class BuilderFactory: @staticmethod def create_builder(builder_type, build_spec): - targetclass = "%sBuilder" % builder_type.capitalize() - return globals()[targetclass](build_spec) + driver_mgr = DriverManager(namespace=BUILDER_DRIVER_NAMESPACE, + name=builder_type, + invoke_args=(build_spec,), + invoke_on_load=True) + return driver_mgr.driver diff --git a/giftwrap/shell.py b/giftwrap/shell.py index 18d7019..512cc7a 100644 --- a/giftwrap/shell.py +++ b/giftwrap/shell.py @@ -19,7 +19,7 @@ import logging import signal import sys -from giftwrap.builders import BuilderFactory +from giftwrap.builders import Builder, BuilderFactory from giftwrap.build_spec import BuildSpec from giftwrap.color import ColorStreamHandler @@ -80,7 +80,7 @@ def main(): description='build giftwrap packages') build_subcmd.add_argument('-m', '--manifest', required=True) build_subcmd.add_argument('-v', '--version') - build_subcmd.add_argument('-t', '--type', choices=('docker', 'package'), + build_subcmd.add_argument('-t', '--type', choices=Builder.builder_names(), required=True) build_subcmd.add_argument('-s', '--synchronous', dest='parallel', action='store_false') diff --git a/giftwrap/tests/test_builder.py b/giftwrap/tests/test_builder.py new file mode 100644 index 0000000..0024a8a --- /dev/null +++ b/giftwrap/tests/test_builder.py @@ -0,0 +1,39 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2015, Craig Tracey +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import copy +import unittest2 as unittest + +from giftwrap.builders import Builder, BUILDER_DRIVER_NAMESPACE +from stevedore import extension + +BASE_DRIVERS = set(['docker', 'package']) + + +class TestBuilder(unittest.TestCase): + + def test_default_drivers(self): + drivers = set(Builder.builder_names()) + self.assertEqual(drivers, BASE_DRIVERS) + + def test_additional_drivers(self): + em = extension.ExtensionManager(BUILDER_DRIVER_NAMESPACE) + em.extensions.append(extension.Extension('test', None, None, None)) + drivers = set(Builder.builder_names(em)) + base_drivers = copy.copy(BASE_DRIVERS) + base_drivers.add('test') + self.assertEqual(drivers, base_drivers) diff --git a/requirements.txt b/requirements.txt index d1f50b2..f63009f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ requests pygerrit docker-py virtualenv +stevedore diff --git a/setup.cfg b/setup.cfg index dc6213d..d38e059 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = giftwrap -version = 2.0.0 +version = 2.1.0 summary = giftwrap - A tool to build full-stack native system packages. description-file = README.md @@ -23,6 +23,10 @@ setup-hooks = console_scripts = giftwrap = giftwrap.shell:main +giftwrap.builder.drivers = + package = giftwrap.builders.package_builder:PackageBuilder + docker = giftwrap.builders.docker_builder:DockerBuilder + [files] packages = giftwrap