Mercurial > piecrust2
diff piecrust/commands/base.py @ 99:8703be118430
Changes to `help` command and extendable commands:
- The `help` command has a prettier output, with descriptions of help
topics.
- `ExtendableChefCommand` is not assuming extensions are sub-commands
anymore.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 13 Sep 2014 14:47:01 -0700 |
parents | c8c522dacfea |
children | 028df35a690e |
line wrap: on
line diff
--- a/piecrust/commands/base.py Mon Sep 08 00:04:29 2014 -0700 +++ b/piecrust/commands/base.py Sat Sep 13 14:47:01 2014 -0700 @@ -38,13 +38,15 @@ super(ExtendableChefCommand, self).__init__() self._extensions = None - def setupParser(self, parser, app): + def getExtensions(self, app): self._loadExtensions(app) - subparsers = parser.add_subparsers() - for e in self._extensions: + return self._extensions + + def setupExtensionParsers(self, subparsers, app): + for e in self.getExtensions(app): p = subparsers.add_parser(e.name, help=e.description) e.setupParser(p, app) - p.set_defaults(func=e.checkedRun) + p.set_defaults(sub_func=e.checkedRun) def _loadExtensions(self, app): if self._extensions is not None: @@ -55,36 +57,36 @@ self._extensions.append(e) -class ChefCommandExtension(ChefCommand): - def __init__(self): - super(ChefCommandExtension, self).__init__() - self.command_name = '__unknown__' +class ChefCommandExtension(object): + command_name = '__unknown__' def supports(self, app): return True -class HelpCommand(ChefCommand): +class HelpCommand(ExtendableChefCommand): def __init__(self): super(HelpCommand, self).__init__() self.name = 'help' self.description = "Prints help about PieCrust's chef." - self._topic_providers = {} + self._topic_providers = [] @property def has_topics(self): - return any(self._topic_providers) + return len(self._topic_providers) > 0 - def addTopic(self, name, provider): - self._topic_providers[name] = provider - - def getTopicNames(self): - return self._topic_providers.keys() + def getTopics(self): + return [(n, d) for (n, d, e) in self._topic_providers] def setupParser(self, parser, app): parser.add_argument('topic', nargs='?', help="The command name or topic on which to get help.") + extensions = self.getExtensions(app) + for ext in extensions: + for name, desc in ext.getHelpTopics(): + self._topic_providers.append((name, desc, ext)) + def run(self, ctx): topic = ctx.args.topic @@ -92,9 +94,10 @@ ctx.parser.print_help() return 0 - if topic in self._topic_providers: - print(self._topic_providers[topic].getHelpTopic(topic, ctx.app)) - return 0 + for name, desc, ext in self._topic_providers: + if name == topic: + print(ext.getHelpTopic(topic, ctx.app)) + return 0 for c in ctx.app.plugin_loader.getCommands(): if c.name == topic: