mirror of
				https://salsa.debian.org/freeipa-team/freeipa.git
				synced 2025-02-25 18:55:28 -06:00 
			
		
		
		
	325: API.finalize() now creates instance attribtue 'plugins', which is a tuple of PluginInfo objects; renamed show_plugins cli command to namespaces; added new cli command plugins
This commit is contained in:
		@@ -77,8 +77,8 @@ class console(frontend.Application):
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class show_plugins(frontend.Application):
 | 
			
		||||
    'Print details on the loaded plugins.'
 | 
			
		||||
class namespaces(frontend.Application):
 | 
			
		||||
    'Show details of plugable namespaces'
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        lines = self.__traverse()
 | 
			
		||||
@@ -112,6 +112,33 @@ class show_plugins(frontend.Application):
 | 
			
		||||
                    self.__traverse_namespace(n, attr, lines, tab + 2)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class plugins(frontend.Application):
 | 
			
		||||
    """Show all loaded plugins"""
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        print '%s:\n' % self.name
 | 
			
		||||
        for p in sorted(self.api.plugins, key=lambda o: o.plugin):
 | 
			
		||||
            print '  plugin: %s' % p.plugin
 | 
			
		||||
            print '  in namespaces: %s' % ', '.join(p.bases)
 | 
			
		||||
            print ''
 | 
			
		||||
        if len(self.api.plugins) == 1:
 | 
			
		||||
            print '1 plugin loaded.'
 | 
			
		||||
        else:
 | 
			
		||||
            print '%d plugins loaded.' % len(self.api.plugins)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cli_application_commands = (
 | 
			
		||||
    help,
 | 
			
		||||
    console,
 | 
			
		||||
    namespaces,
 | 
			
		||||
    plugins,
 | 
			
		||||
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class KWCollector(object):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        object.__setattr__(self, '_KWCollector__d', {})
 | 
			
		||||
@@ -168,9 +195,8 @@ class CLI(object):
 | 
			
		||||
 | 
			
		||||
    def finalize(self):
 | 
			
		||||
        api = self.api
 | 
			
		||||
        api.register(help)
 | 
			
		||||
        api.register(console)
 | 
			
		||||
        api.register(show_plugins)
 | 
			
		||||
        for klass in cli_application_commands:
 | 
			
		||||
            api.register(klass)
 | 
			
		||||
        api.finalize()
 | 
			
		||||
        for a in api.Application():
 | 
			
		||||
            a.set_application(self)
 | 
			
		||||
 
 | 
			
		||||
@@ -708,16 +708,47 @@ class API(DictProxy):
 | 
			
		||||
        """
 | 
			
		||||
        assert not self.__finalized, 'finalize() can only be called once'
 | 
			
		||||
 | 
			
		||||
        instances = {}
 | 
			
		||||
        def plugin_iter(base, classes):
 | 
			
		||||
            for klass in classes:
 | 
			
		||||
                if klass not in instances:
 | 
			
		||||
                    instances[klass] = klass()
 | 
			
		||||
                plugin = instances[klass]
 | 
			
		||||
        class PluginInstance(object):
 | 
			
		||||
            """
 | 
			
		||||
            Represents a plugin instance.
 | 
			
		||||
            """
 | 
			
		||||
 | 
			
		||||
            i = 0
 | 
			
		||||
 | 
			
		||||
            def __init__(self, klass):
 | 
			
		||||
                self.created = self.next()
 | 
			
		||||
                self.klass = klass
 | 
			
		||||
                self.instance = klass()
 | 
			
		||||
                self.bases = []
 | 
			
		||||
 | 
			
		||||
            @classmethod
 | 
			
		||||
            def next(cls):
 | 
			
		||||
                cls.i += 1
 | 
			
		||||
                return cls.i
 | 
			
		||||
 | 
			
		||||
        class PluginInfo(ReadOnly):
 | 
			
		||||
            def __init__(self, p):
 | 
			
		||||
                assert isinstance(p, PluginInstance)
 | 
			
		||||
                self.created = p.created
 | 
			
		||||
                self.name = p.klass.__name__
 | 
			
		||||
                self.module = str(p.klass.__module__)
 | 
			
		||||
                self.plugin = '%s.%s' % (self.module, self.name)
 | 
			
		||||
                self.bases = tuple(b.__name__ for b in p.bases)
 | 
			
		||||
                lock(self)
 | 
			
		||||
 | 
			
		||||
        plugins = {}
 | 
			
		||||
        def plugin_iter(base, subclasses):
 | 
			
		||||
            for klass in subclasses:
 | 
			
		||||
                assert issubclass(klass, base)
 | 
			
		||||
                if klass not in plugins:
 | 
			
		||||
                    plugins[klass] = PluginInstance(klass)
 | 
			
		||||
                p = plugins[klass]
 | 
			
		||||
                assert base not in p.bases
 | 
			
		||||
                p.bases.append(base)
 | 
			
		||||
                if base.__proxy__:
 | 
			
		||||
                    yield PluginProxy(base, plugin)
 | 
			
		||||
                    yield PluginProxy(base, p.instance)
 | 
			
		||||
                else:
 | 
			
		||||
                    yield plugin
 | 
			
		||||
                    yield p.instance
 | 
			
		||||
 | 
			
		||||
        for name in self.register:
 | 
			
		||||
            base = self.register[name]
 | 
			
		||||
@@ -731,10 +762,14 @@ class API(DictProxy):
 | 
			
		||||
            self.__d[name] = namespace
 | 
			
		||||
            object.__setattr__(self, name, namespace)
 | 
			
		||||
 | 
			
		||||
        for plugin in instances.itervalues():
 | 
			
		||||
            plugin.set_api(self)
 | 
			
		||||
            assert plugin.api is self
 | 
			
		||||
        for p in plugins.itervalues():
 | 
			
		||||
            p.instance.set_api(self)
 | 
			
		||||
            assert p.instance.api is self
 | 
			
		||||
 | 
			
		||||
        for plugin in instances.itervalues():
 | 
			
		||||
            plugin.finalize()
 | 
			
		||||
        for p in plugins.itervalues():
 | 
			
		||||
            p.instance.finalize()
 | 
			
		||||
        object.__setattr__(self, '_API__finalized', True)
 | 
			
		||||
        tuple(PluginInfo(p) for p in plugins.itervalues())
 | 
			
		||||
        object.__setattr__(self, 'plugins',
 | 
			
		||||
            tuple(PluginInfo(p) for p in plugins.itervalues())
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user