~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-04-23 02:09:44 UTC
  • mfrom: (2432.1.33 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20070423020944-lcu3twk2zj27bw5a
(robertc) Fix bugs 107656 and 50408 by creating multiple help indices and cross referencing between them when user help requests are ambiguous. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
267
267
            warning('Unable to load plugin %r from %r'
268
268
                    % (name, zip_name))
269
269
            log_exception_quietly()
 
270
 
 
271
 
 
272
class PluginsHelpIndex(object):
 
273
    """A help index that returns help topics for plugins."""
 
274
 
 
275
    def __init__(self):
 
276
        self.prefix = 'plugins/'
 
277
 
 
278
    def get_topics(self, topic):
 
279
        """Search for topic in the loaded plugins.
 
280
 
 
281
        This will not trigger loading of new plugins.
 
282
 
 
283
        :param topic: A topic to search for.
 
284
        :return: A list which is either empty or contains a single
 
285
            RegisteredTopic entry.
 
286
        """
 
287
        if not topic:
 
288
            return []
 
289
        if topic.startswith(self.prefix):
 
290
            topic = topic[len(self.prefix):]
 
291
        plugin_module_name = 'bzrlib.plugins.%s' % topic
 
292
        try:
 
293
            module = sys.modules[plugin_module_name]
 
294
        except KeyError:
 
295
            return []
 
296
        else:
 
297
            return [ModuleHelpTopic(module)]
 
298
 
 
299
 
 
300
class ModuleHelpTopic(object):
 
301
    """A help topic which returns the docstring for a module."""
 
302
 
 
303
    def __init__(self, module):
 
304
        """Constructor.
 
305
 
 
306
        :param module: The module for which help should be generated.
 
307
        """
 
308
        self.module = module
 
309
 
 
310
    def get_help_text(self, additional_see_also=None):
 
311
        """Return a string with the help for this topic.
 
312
 
 
313
        :param additional_see_also: Additional help topics to be
 
314
            cross-referenced.
 
315
        """
 
316
        if not self.module.__doc__:
 
317
            result = "Plugin '%s' has no docstring.\n" % self.module.__name__
 
318
        else:
 
319
            result = self.module.__doc__
 
320
        if result[-1] != '\n':
 
321
            result += '\n'
 
322
        # there is code duplicated here and in bzrlib/help_topic.py's 
 
323
        # matching Topic code. This should probably be factored in
 
324
        # to a helper function and a common base class.
 
325
        if additional_see_also is not None:
 
326
            see_also = sorted(set(additional_see_also))
 
327
        else:
 
328
            see_also = None
 
329
        if see_also:
 
330
            result += 'See also: '
 
331
            result += ', '.join(see_also)
 
332
            result += '\n'
 
333
        return result
 
334
 
 
335
    def get_help_topic(self):
 
336
        """Return the modules help topic - its __name__ after bzrlib.plugins.."""
 
337
        return self.module.__name__[len('bzrlib.plugins.'):]