annotate piecrust/commands/builtin/plugins.py @ 854:08e02c2a2a1a

core: Keep refactoring, this time to prepare for generator sources. - Make a few APIs simpler. - Content pipelines create their own jobs, so that generator sources can keep aborting in `getContents`, but rely on their pipeline to generate pages for baking.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 04 Jun 2017 23:34:28 -0700
parents 3900169ac81b
children 58ae026b4c31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
305
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import logging
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 from piecrust.commands.base import ChefCommand
796
3900169ac81b plugins: Don't crash when running the `chef plugins` command outside a site.
Ludovic Chabant <ludovic@chabant.com>
parents: 764
diff changeset
3 from piecrust.pathutil import SiteNotFoundError
305
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 logger = logging.getLogger(__name__)
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 class PluginsCommand(ChefCommand):
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 def __init__(self):
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 super(PluginsCommand, self).__init__()
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 self.name = 'plugins'
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 self.description = "Manage the plugins for the current website."
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 def setupParser(self, parser, app):
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 # Don't setup anything if this is a null app
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 # (for when `chef` is run from outside a website)
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 if app.root_dir is None:
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 return
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 subparsers = parser.add_subparsers()
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 p = subparsers.add_parser(
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 'list',
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 help="Lists the plugins installed in the current website.")
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 p.add_argument(
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 '-a', '--all',
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 action='store_true',
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 help=("Also list all the available plugins for the "
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 "current environment. The installed one will have an "
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 "asterix (*)."))
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 p.set_defaults(sub_func=self._listPlugins)
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def checkedRun(self, ctx):
764
f7ddd730c08d plugins: Abort the command if there's no site.
Ludovic Chabant <ludovic@chabant.com>
parents: 305
diff changeset
34 if ctx.app.root_dir is None:
f7ddd730c08d plugins: Abort the command if there's no site.
Ludovic Chabant <ludovic@chabant.com>
parents: 305
diff changeset
35 raise SiteNotFoundError(theme=ctx.app.theme_site)
f7ddd730c08d plugins: Abort the command if there's no site.
Ludovic Chabant <ludovic@chabant.com>
parents: 305
diff changeset
36
305
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 if not hasattr(ctx.args, 'sub_func'):
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 ctx.parser.parse_args(['plugins', '--help'])
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 return
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 ctx.args.sub_func(ctx)
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 def _listPlugins(self, ctx):
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 names = {}
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 installed_suffix = ''
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 if ctx.args.all:
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 import pip
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 prefix = 'PieCrust-'
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 installed_packages = pip.get_installed_distributions()
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 for plugin in installed_packages:
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 if not plugin.project_name.startswith(prefix):
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 continue
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 name = plugin.project_name[len(prefix):]
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 names[name] = False
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 installed_suffix = '*'
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 for plugin in ctx.app.plugin_loader.plugins:
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 names[plugin.name] = True
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 for name, inst in names.items():
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 logger.info("%s%s" % (name, installed_suffix if inst else ''))
9ae23409d6e9 plugins: Change how plugins are loaded. Add a `plugins` command.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61