commit:     1dd08a1ed5ad1b848a30f29f93a3b051c8bf95c4
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Thu Aug 17 01:50:21 2017 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Thu Mar 29 20:43:40 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=1dd08a1e

module.py: Extend the module loader for API version checking

If provided with an iterable of compatibility versions, The controller
will check the plugin modules module_spec 'version' variable is
compatible with the base application.

 pym/portage/module.py | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/pym/portage/module.py b/pym/portage/module.py
index c79e65518..bd7c94d4e 100644
--- a/pym/portage/module.py
+++ b/pym/portage/module.py
@@ -15,6 +15,10 @@ class InvalidModuleName(PortageException):
        """An invalid or unknown module name."""
 
 
+class ModuleVersionError(PortageException):
+       '''An incompatible module version'''
+
+
 class Module(object):
        """Class to define and hold our plug-in module
 
@@ -87,16 +91,17 @@ class Modules(object):
        @param namepath: Python import path to the "modules" directory
        """
 
-       def __init__(self, path, namepath):
+       def __init__(self, path, namepath, compat_versions=None):
                self._module_path = path
                self._namepath = namepath
+               self.compat_versions = compat_versions
                self.parents = []
                self._modules = self._get_all_modules()
                self.modules = ProtectedDict(self._modules)
                self.module_names = sorted(self._modules)
 
        def _get_all_modules(self):
-               """scans the emaint modules dir for loadable modules
+               """scans the _module_path dir for loadable modules
 
                @rtype: dictionary of module_plugins
                """
@@ -117,6 +122,7 @@ class Modules(object):
                kids = {}
                for entry in importables:
                        new_module = Module(entry, self._namepath)
+                       self._check_compat(new_module)
                        for module_name in new_module.kids:
                                kid = new_module.kids[module_name]
                                kid['parent'] = new_module
@@ -211,6 +217,8 @@ class Modules(object):
 
                @type modname: string
                @param modname: the module class name
+               @type var: string
+               @param var: the base level variable to return
                @type dictionary
                @return: the modules class exported options descriptions
                """
@@ -220,3 +228,13 @@ class Modules(object):
                        raise InvalidModuleName(
                                "Module name '%s' is invalid or not found" % 
modname)
                return value
+
+       def _check_compat(self, module):
+               if self.compat_versions:
+                       if not module.module_spec['version'] in 
self.compat_versions:
+                               raise ModuleVersionError(
+                                       "Error loading '%s' plugin module: %s, 
version: %s\n"
+                                       "Module is not compatible with the 
current application version\n"
+                                       "Compatible module API versions are: %s"
+                                       % (self._namepath, 
module.module_spec['name'],
+                                               module.module_spec['version'], 
self.compat_versions))

Reply via email to