diff options
author | Jan Cholasta <jcholast@redhat.com> | 2016-03-16 11:22:00 +0100 |
---|---|---|
committer | Jan Cholasta <jcholast@redhat.com> | 2016-05-25 16:06:26 +0200 |
commit | 0d62968b6f853246d38b06e8378cb9cae7f9bbb4 (patch) | |
tree | c453875c1200991eac44825e4d3237ed55419715 | |
parent | 3f5091b55abed3a2d3f4b6b940fdb6bacabbf4fe (diff) | |
download | freeipa-0d62968b6f853246d38b06e8378cb9cae7f9bbb4.tar.gz freeipa-0d62968b6f853246d38b06e8378cb9cae7f9bbb4.tar.xz freeipa-0d62968b6f853246d38b06e8378cb9cae7f9bbb4.zip |
plugable: replace API.import_plugins with new API.add_package
Replace API.import_plugins with a new method API.add_package which allows
loading plugin packages into an API object from a package object.
This makes loading of plugin packages loading consistent with loading of
plugin modules and classes.
Rename API.modules to API.packages and use package objects where
implemented to reflect the change.
https://fedorahosted.org/freeipa/ticket/4739
Reviewed-By: David Kupka <dkupka@redhat.com>
-rw-r--r-- | ipalib/__init__.py | 14 | ||||
-rw-r--r-- | ipalib/plugable.py | 49 | ||||
-rw-r--r-- | ipaserver/advise/base.py | 6 |
3 files changed, 34 insertions, 35 deletions
diff --git a/ipalib/__init__.py b/ipalib/__init__.py index e163b292c..788fc8ead 100644 --- a/ipalib/__init__.py +++ b/ipalib/__init__.py @@ -902,12 +902,18 @@ class API(plugable.API): bases = (Command, Object, Method, Backend, Updater) @property - def modules(self): - result = ('ipalib.plugins.*',) + def packages(self): + import ipalib.plugins + result = (ipalib.plugins,) + if self.env.in_server: - result += ('ipaserver.plugins.*',) + import ipaserver.plugins + result += (ipaserver.plugins,) + if self.env.context in ('installer', 'updates'): - result += ('ipaserver.install.plugins.*',) + import ipaserver.install.plugins + result += (ipaserver.install.plugins,) + return result diff --git a/ipalib/plugable.py b/ipalib/plugable.py index 76b933c30..260eb443b 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -306,7 +306,7 @@ class API(ReadOnly): raise NotImplementedError @property - def modules(self): + def packages(self): raise NotImplementedError def __len__(self): @@ -532,41 +532,30 @@ class API(ReadOnly): self.__do_if_not_done('bootstrap') if self.env.mode in ('dummy', 'unit_test'): return - for module in self.modules: - self.import_plugins(module) + for package in self.packages: + self.add_package(package) # FIXME: This method has no unit test - def import_plugins(self, module): + def add_package(self, package): """ - Import plugins from ``module``. + Add plugin modules from the ``package``. - :param module: Name of the module to import. This might be a wildcard - in the form ```package.*``` in which case all modules - from the given package are loaded. + :param package: A package from which to add modules. """ - if module.endswith('.*'): - subpackage = module[:-2] - try: - plugins = importlib.import_module(subpackage) - except ImportError as e: - self.log.error("cannot import plugins sub-package %s: %s", - subpackage, e) - raise - package, dot, part = subpackage.rpartition('.') - parent = sys.modules[package] - - parent_dir = path.dirname(path.abspath(parent.__file__)) - plugins_dir = path.dirname(path.abspath(plugins.__file__)) - if parent_dir == plugins_dir: - raise errors.PluginsPackageError( - name=subpackage, file=plugins.__file__ - ) + package_name = package.__name__ + package_file = package.__file__ + package_dir = path.dirname(path.abspath(package_file)) - self.log.debug("importing all plugin modules in %s...", subpackage) - modules = find_modules_in_dir(plugins_dir) - modules = ['.'.join((subpackage, name)) for name in modules] - else: - modules = [module] + parent = sys.modules[package_name.rpartition('.')[0]] + parent_dir = path.dirname(path.abspath(parent.__file__)) + if parent_dir == package_dir: + raise errors.PluginsPackageError( + name=package_name, file=package_file + ) + + self.log.debug("importing all plugin modules in %s...", package_name) + modules = find_modules_in_dir(package_dir) + modules = ['.'.join((package_name, name)) for name in modules] for name in modules: self.log.debug("importing plugin module %s", name) diff --git a/ipaserver/advise/base.py b/ipaserver/advise/base.py index f7f2ad821..c80a13b6c 100644 --- a/ipaserver/advise/base.py +++ b/ipaserver/advise/base.py @@ -127,7 +127,11 @@ class Advice(Plugin): class AdviseAPI(API): bases = (Advice,) - modules = ('ipaserver.advise.plugins.*',) + + @property + def packages(self): + import ipaserver.advise.plugins + return (ipaserver.advise.plugins,) advise_api = AdviseAPI() |