From 0ae77ea176190307ef74598179fc8be83169628a Mon Sep 17 00:00:00 2001 From: David Kupka Date: Wed, 20 Jul 2016 13:24:03 +0200 Subject: [PATCH] help: Do not create instances to get information about commands and topics Creating instance requires that complete schema for the command is read from schema cache and passed to constructor. This operation takes a lot of time. Utilizing class properties and pregenerated help bits allows to get the necessary information directly from classes reducing time it takes significantly. https://fedorahosted.org/freeipa/ticket/6048 Reviewed-By: Jan Cholasta --- ipalib/cli.py | 15 ++++++++------- ipalib/plugable.py | 7 +++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/ipalib/cli.py b/ipalib/cli.py index 1faf8285c47d950d5fd311154b6936c8371d746c..d89a5320853ecf575c7ba710b2db2e62e1003141 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -727,8 +727,8 @@ class help(frontend.Local): self._builtins = [] # build help topics - for c in self.api.Command(): - if c is not self.api.Command[c.name]: + for c in self.api.Command: + if c is not self.api.Command.get_plugin(c.name): continue if c.NO_CLI: continue @@ -793,13 +793,14 @@ class help(frontend.Local): self.print_commands(name, outfile) elif name == "commands": mcl = 0 - for cmd in self.Command(): - if cmd is not self.Command[cmd.name]: + for cmd_plugin in self.Command: + if cmd_plugin is not self.Command.get_plugin(cmd_plugin.name): continue - if cmd.NO_CLI: + if cmd_plugin.NO_CLI: continue - mcl = max(mcl, len(cmd.name)) - writer('%s %s' % (to_cli(cmd.name).ljust(mcl), cmd.summary)) + mcl = max(mcl, len(cmd_plugin.name)) + writer('%s %s' % (to_cli(cmd_plugin.name).ljust(mcl), + cmd_plugin.summary)) else: raise HelpError(topic=name) diff --git a/ipalib/plugable.py b/ipalib/plugable.py index 073ad05d7aee5e83cae5c6e20bac8f9439505198..af35f5bae27a17230267d5b10b5fdc4f784a4760 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -318,9 +318,12 @@ class APINameSpace(collections.Mapping): self.__enumerate() return iter(self.__plugins) - def __getitem__(self, key): + def get_plugin(self, key): self.__enumerate() - plugin = self.__plugins_by_key[key] + return self.__plugins_by_key[key] + + def __getitem__(self, key): + plugin = self.get_plugin(key) return self.__api._get(plugin) def __call__(self): -- 2.7.4