comparison piecrust/commands/base.py @ 852:4850f8c21b6e

core: Start of the big refactor for PieCrust 3.0. * Everything is a `ContentSource`, including assets directories. * Most content sources are subclasses of the base file-system source. * A source is processed by a "pipeline", and there are 2 built-in pipelines, one for assets and one for pages. The asset pipeline is vaguely functional, but the page pipeline is completely broken right now. * Rewrite the baking process as just running appropriate pipelines on each content item. This should allow for better parallelization.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 17 May 2017 00:11:48 -0700
parents 3ceeca7bb71c
children 07c23be08029
comparison
equal deleted inserted replaced
851:2c7e57d80bba 852:4850f8c21b6e
6 6
7 logger = logging.getLogger(__name__) 7 logger = logging.getLogger(__name__)
8 8
9 9
10 class CommandContext(object): 10 class CommandContext(object):
11 def __init__(self, app, parser, args): 11 def __init__(self, appfactory, app, parser, args):
12 self.appfactory = appfactory
12 self.app = app 13 self.app = app
13 self.parser = parser 14 self.parser = parser
14 self.args = args 15 self.args = args
15 self.config_variant = None
16 self.config_values = None
17 16
18 17
19 class ChefCommand(object): 18 class ChefCommand(object):
20 def __init__(self): 19 def __init__(self):
21 self.name = '__unknown__' 20 self.name = '__unknown__'
25 24
26 def setupParser(self, parser, app): 25 def setupParser(self, parser, app):
27 raise NotImplementedError() 26 raise NotImplementedError()
28 27
29 def run(self, ctx): 28 def run(self, ctx):
30 raise NotImplementedError("Command '%s' doesn't implement the `run` " 29 raise NotImplementedError(
31 "method." % type(self)) 30 "Command '%s' doesn't implement the `run` "
31 "method." % type(self))
32 32
33 def checkedRun(self, ctx): 33 def checkedRun(self, ctx):
34 if ctx.app.root_dir is None and self.requires_website: 34 if ctx.app.root_dir is None and self.requires_website:
35 raise SiteNotFoundError(theme=ctx.app.theme_site) 35 raise SiteNotFoundError(theme=ctx.app.theme_site)
36 return self.run(ctx) 36 return self.run(ctx)
81 81
82 def getTopics(self): 82 def getTopics(self):
83 return [(n, d) for (n, d, e) in self._topic_providers] 83 return [(n, d) for (n, d, e) in self._topic_providers]
84 84
85 def setupParser(self, parser, app): 85 def setupParser(self, parser, app):
86 parser.add_argument('topic', nargs='?', 86 parser.add_argument(
87 help="The command name or topic on which to get help.") 87 'topic', nargs='?',
88 help="The command name or topic on which to get help.")
88 89
89 extensions = self.getExtensions(app) 90 extensions = self.getExtensions(app)
90 for ext in extensions: 91 for ext in extensions:
91 for name, desc in ext.getHelpTopics(): 92 for name, desc in ext.getHelpTopics():
92 self._topic_providers.append((name, desc, ext)) 93 self._topic_providers.append((name, desc, ext))
104 return 0 105 return 0
105 106
106 for c in ctx.app.plugin_loader.getCommands(): 107 for c in ctx.app.plugin_loader.getCommands():
107 if c.name == topic: 108 if c.name == topic:
108 fake = argparse.ArgumentParser( 109 fake = argparse.ArgumentParser(
109 prog='%s %s' % (ctx.parser.prog, c.name), 110 prog='%s %s' % (ctx.parser.prog, c.name),
110 description=c.description) 111 description=c.description)
111 c.setupParser(fake, ctx.app) 112 c.setupParser(fake, ctx.app)
112 fake.print_help() 113 fake.print_help()
113 return 0 114 return 0
114 115
115 raise Exception("No such command or topic: %s" % topic) 116 raise Exception("No such command or topic: %s" % topic)