annotate piecrust/commands/base.py @ 147:ab6e7e0e9d44

Pass date information to routing when building URLs. This is so that URLs with dates in them can be built even when the date information is not coming from the source metadata, but from the page's config.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 29 Nov 2014 21:00:44 -0800
parents 028df35a690e
children c2ca72fb7f0b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import logging
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
2 import argparse
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
3 import functools
1
aaa8fb7c8918 Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
4 from piecrust.pathutil import SiteNotFoundError
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 logger = logging.getLogger(__name__)
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 class CommandContext(object):
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
11 def __init__(self, app, parser, args):
1
aaa8fb7c8918 Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
12 self.app = app
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
13 self.parser = parser
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 self.args = args
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 class ChefCommand(object):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def __init__(self):
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 self.name = '__unknown__'
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 self.description = '__unknown__'
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 self.requires_website = True
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
23 def setupParser(self, parser, app):
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 raise NotImplementedError()
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 def run(self, ctx):
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
27 raise NotImplementedError("Command '%s' doesn't implement the `run` "
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
28 "method." % type(self))
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
30 def checkedRun(self, ctx):
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
31 if ctx.app.root_dir is None and self.requires_website:
1
aaa8fb7c8918 Re-arranged modules to reduce dependencies to builtin stuff.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
32 raise SiteNotFoundError()
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
33 return self.run(ctx)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
34
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
35
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
36 class ExtendableChefCommand(ChefCommand):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
37 def __init__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
38 super(ExtendableChefCommand, self).__init__()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
39 self._extensions = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
40
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
41 def getExtensions(self, app):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
42 self._loadExtensions(app)
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
43 return self._extensions
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
44
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
45 def setupExtensionParsers(self, subparsers, app):
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
46 for e in self.getExtensions(app):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
47 p = subparsers.add_parser(e.name, help=e.description)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
48 e.setupParser(p, app)
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
49 p.set_defaults(sub_func=e.checkedRun)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
50
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
51 def _loadExtensions(self, app):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
52 if self._extensions is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
53 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
54 self._extensions = []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
55 for e in app.plugin_loader.getCommandExtensions():
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
56 if e.command_name == self.name and e.supports(app):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
57 self._extensions.append(e)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
58
0
a212a3f2e3ee Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
60 class ChefCommandExtension(object):
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
61 command_name = '__unknown__'
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
62
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
63 def supports(self, app):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
64 return True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
65
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
66
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
67 class HelpCommand(ExtendableChefCommand):
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
68 def __init__(self):
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
69 super(HelpCommand, self).__init__()
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
70 self.name = 'help'
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
71 self.description = "Prints help about PieCrust's chef."
103
028df35a690e Fix using `chef` outside of a website.
Ludovic Chabant <ludovic@chabant.com>
parents: 99
diff changeset
72 self.requires_website = False
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
73 self._topic_providers = []
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
74
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
75 @property
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
76 def has_topics(self):
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
77 return len(self._topic_providers) > 0
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
78
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
79 def getTopics(self):
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
80 return [(n, d) for (n, d, e) in self._topic_providers]
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
81
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
82 def setupParser(self, parser, app):
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
83 parser.add_argument('topic', nargs='?',
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
84 help="The command name or topic on which to get help.")
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
85
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
86 extensions = self.getExtensions(app)
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
87 for ext in extensions:
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
88 for name, desc in ext.getHelpTopics():
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
89 self._topic_providers.append((name, desc, ext))
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
90
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
91 def run(self, ctx):
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
92 topic = ctx.args.topic
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
93
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
94 if topic is None:
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
95 ctx.parser.print_help()
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
96 return 0
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
97
99
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
98 for name, desc, ext in self._topic_providers:
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
99 if name == topic:
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
100 print(ext.getHelpTopic(topic, ctx.app))
8703be118430 Changes to `help` command and extendable commands:
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
101 return 0
57
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
102
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
103 for c in ctx.app.plugin_loader.getCommands():
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
104 if c.name == topic:
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
105 fake = argparse.ArgumentParser(
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
106 prog='%s %s' % (ctx.parser.prog, c.name),
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
107 description=c.description)
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
108 c.setupParser(fake, ctx.app)
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
109 fake.print_help()
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
110 return 0
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
111
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
112 raise Exception("No such command or topic: %s" % topic)
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
113
c8c522dacfea Add `help` function, cleanup argument handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
114
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
115 class _WrappedCommand(ChefCommand):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
116 def __init__(self, func, name, description):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
117 super(_WrappedCommand, self).__init__()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
118 self.func = func
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
119 self.name = name
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
120 self.description = description
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
121
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
122 def run(self, ctx):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
123 self.func(ctx)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
124
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
125
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
126 def simple_command(f, name, description=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
127 @functools.wraps(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
128 def wrapper(*args, **kwargs):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
129 return f(*args, **kwargs)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
130 cmd = _WrappedCommand(f, name, description)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
131 f.__command_class__ = cmd
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
132 return wrapper
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
133
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
134
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
135 def get_func_command(f):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
136 return getattr(f, '__command_class__')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents: 1
diff changeset
137