diff options
author | Jan Cholasta <jcholast@redhat.com> | 2016-05-16 14:15:19 +0200 |
---|---|---|
committer | Jan Cholasta <jcholast@redhat.com> | 2016-06-03 09:00:34 +0200 |
commit | fe18adb25839bf191aa748f13e75bfccb10f4a57 (patch) | |
tree | b0cacfe9e54e8d15219a1b1925026c2ed037772a | |
parent | cd5ecdbaeef153523afdeff77f07945944118115 (diff) | |
download | freeipa-fe18adb25839bf191aa748f13e75bfccb10f4a57.tar.gz freeipa-fe18adb25839bf191aa748f13e75bfccb10f4a57.tar.xz freeipa-fe18adb25839bf191aa748f13e75bfccb10f4a57.zip |
help, makeapi: do not use hardcoded plugin package name
Iterate over all plugin packages defined in the API to find the given
topic module. The last module found has priority.
This will allow topics to be defined in client-side plugins.
https://fedorahosted.org/freeipa/ticket/4739
Reviewed-By: David Kupka <dkupka@redhat.com>
-rw-r--r-- | ipalib/cli.py | 34 | ||||
-rwxr-xr-x | makeapi | 31 |
2 files changed, 43 insertions, 22 deletions
diff --git a/ipalib/cli.py b/ipalib/cli.py index 5286032fb..1897a3431 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -691,17 +691,26 @@ class help(frontend.Local): topic = None - _PLUGIN_BASE_MODULE = 'ipalib.plugins' - def _get_topic(self, topic): - module_name = '%s.%s' % (self._PLUGIN_BASE_MODULE, topic) - try: - module = sys.modules[module_name] - except KeyError: - module = importlib.import_module(module_name) + doc = u'' + parent_topic = None + + for package in self.api.packages: + module_name = '%s.%s' % (package.__name__, topic) + try: + module = sys.modules[module_name] + except KeyError: + try: + module = importlib.import_module(module_name) + except ImportError: + continue - doc = unicode(module.__doc__ or '').strip() - parent_topic = getattr(module, 'topic', None) + if module.__doc__ is not None: + doc = unicode(module.__doc__ or '').strip() + try: + parent_topic = module.topic + except AttributeError: + pass return doc, parent_topic @@ -763,7 +772,6 @@ class help(frontend.Local): outfile = sys.stdout writer = self._writer(outfile) name = from_cli(key) - mod_name = '%s.%s' % (self._PLUGIN_BASE_MODULE, name) if key is None: self.api.parser.print_help(outfile) return @@ -777,7 +785,8 @@ class help(frontend.Local): if cmd.NO_CLI: raise HelpError(topic=name) self.Backend.cli.build_parser(cmd).print_help(outfile) - elif mod_name in sys.modules: + elif any(name in t[2] for t in self._topics.values() + if type(t[2]) is dict): self.print_commands(name, outfile) elif name == "commands": mcl = max(len(s) for s in (self.Command)) @@ -827,8 +836,7 @@ class help(frontend.Local): commands = self._topics[t][2][topic][2] break - m = '%s.%s' % (self._PLUGIN_BASE_MODULE, topic) - doc = (unicode(_(sys.modules[m].__doc__)) or '').strip() + doc, _topic = self._get_topic(topic) if topic not in self.Command and len(commands) == 0: raise HelpError(topic=topic) @@ -171,23 +171,36 @@ def validate_doc(): while topic is not None: if not topics.setdefault(topic, 0): # First time seeing this module, validate the module contents - module = 'ipalib.plugins.%s' % topic - try: - mod = sys.modules[module] - except KeyError: - mod = importlib.import_module(module) + doc = None + next_topic = None - # See if there is a module topic, if so validate it - next_topic = getattr(mod, 'topic', None) + for package in api.packages: + module = '%s.%s' % (package.__name__, topic) + try: + mod = sys.modules[module] + except KeyError: + try: + mod = importlib.import_module(module) + except ImportError: + continue + + if mod.__doc__ is not None: + doc = mod.__doc__ + + # See if there is a module topic, if so validate it + try: + next_topic = mod.topic + except AttributeError: + pass # Does the module have documentation? - if mod.__doc__ is None: + if doc is None: src_file = inspect.getsourcefile(mod) n_missing_mod_doc += 1 print("%s: module \"%s\" has no doc" % (src_file, module)) # Yes the module has doc, but is it internationalized? - elif not is_i18n(mod.__doc__): + elif not is_i18n(doc): src_file = inspect.getsourcefile(cmd_class) n_missing_mod_i18n += 1 print("%s: module \"%s\" doc is not internationalized" % |