annotate piecrust/commands/builtin/scaffolding.py @ 1195:ae9387338db1 draft default tip

admin: add option to publish immediately
author Ludovic Chabant <ludovic@chabant.com>
date Fri, 30 Dec 2022 16:48:04 -0800
parents 2ead9dcb6bec
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import os.path
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import logging
1186
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
4 import time
1152
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
5 from piecrust.commands.base import (
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
6 ChefCommand, ExtendableChefCommand, ChefCommandExtension)
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 logger = logging.getLogger(__name__)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
1186
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
12 def build_content(source, content_metadata, tpl_name, force_overwrite=False):
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
13 app = source.app
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
14 extensions = app.getCommandExtensions('prepare')
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
15 ext = next(
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
16 filter(
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
17 lambda e: tpl_name in e.getTemplateNames(app),
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
18 extensions),
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
19 None)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
20 if ext is None:
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
21 raise Exception("No such page template: %s" % tpl_name)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
22 tpl_text = ext.getTemplate(app, tpl_name)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
23 if tpl_text is None:
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
24 raise Exception("Error loading template: %s" % tpl_name)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
25
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
26 content_item = source.createContent(content_metadata)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
27 if content_item is None:
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
28 raise Exception("Can't create item.")
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
29
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
30 from piecrust.uriutil import multi_replace
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
31
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
32 config_tokens = {
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
33 '%title%': "Untitled Content",
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
34 '%time.today%': time.strftime('%Y/%m/%d'),
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
35 '%time.now%': time.strftime('%H:%M:%S')
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
36 }
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
37 config = content_item.metadata.get('config')
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
38 if config:
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
39 for k, v in config.items():
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
40 config_tokens['%%%s%%' % k] = v
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
41 tpl_text = multi_replace(tpl_text, config_tokens)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
42
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
43 logger.info("Creating content: %s" % content_item.spec)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
44 mode = 'w' if force_overwrite else 'x'
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
45 with source.openItem(content_item, mode) as f:
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
46 f.write(tpl_text)
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
47
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
48 return content_item
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
49
2ead9dcb6bec prepare: Fix scaffolding refactor code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1182
diff changeset
50
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 class PrepareCommand(ExtendableChefCommand):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 """ Chef command for creating pages with some default content.
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 """
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 def __init__(self):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 super(PrepareCommand, self).__init__()
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 self.name = 'prepare'
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 self.description = "Prepares new content for your website."
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 def setupParser(self, parser, app):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 # Don't setup anything if this is a null app
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 # (for when `chef` is run from outside a website)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 if app.root_dir is None:
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 return
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
65 from piecrust.sources.interfaces import IPreparingSource
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
66
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 subparsers = parser.add_subparsers()
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 for src in app.sources:
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 if not isinstance(src, IPreparingSource):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 logger.debug("Skipping source '%s' because it's not "
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 "preparable." % src.name)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 continue
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 if src.is_theme_source:
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 logger.debug("Skipping source '%s' because it's a theme "
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 "source." % src.name)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 continue
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 p = subparsers.add_parser(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
78 src.config['item_name'],
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
79 help=("Creates an empty page in the '%s' source." %
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
80 src.name))
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 src.setupPrepareParser(p, app)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 p.add_argument('-t', '--template', default='default',
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 help="The template to use, which will change the "
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
84 "generated text and header. Run `chef help "
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
85 "scaffolding` for more information.")
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
86 p.add_argument('-f', '--force', action='store_true',
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
87 help="Overwrite any existing content.")
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 p.set_defaults(source=src)
773
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
89 p.set_defaults(sub_func=self._doRun)
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90
773
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
91 def checkedRun(self, ctx):
879
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
92 from piecrust.pathutil import SiteNotFoundError
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
93
773
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
94 if ctx.app.root_dir is None:
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
95 raise SiteNotFoundError(theme=ctx.app.theme_site)
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
96
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
97 if not hasattr(ctx.args, 'sub_func'):
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
98 ctx.parser.parse_args(['prepare', '--help'])
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
99 return
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
100 ctx.args.sub_func(ctx)
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
101
87f1e79d3fbe prepare: Use the same convention as other commands with sub-commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 535
diff changeset
102 def _doRun(self, ctx):
879
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
103 from piecrust.sources.fs import FSContentSourceBase
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
104
165
8355eb9dd8fe prepare: Show a more friendly user message when no arguments are given.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
105 if not hasattr(ctx.args, 'source'):
8355eb9dd8fe prepare: Show a more friendly user message when no arguments are given.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
106 raise Exception("No source specified. "
8355eb9dd8fe prepare: Show a more friendly user message when no arguments are given.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
107 "Please run `chef prepare -h` for usage.")
1182
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1154
diff changeset
108 source = ctx.args.source
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
109
1182
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1154
diff changeset
110 content_item = build_content(
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1154
diff changeset
111 source,
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1154
diff changeset
112 vars(ctx.args),
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1154
diff changeset
113 ctx.args.template,
31e8ee0bf5b2 prepare: Refactor scaffolding code.
Ludovic Chabant <ludovic@chabant.com>
parents: 1154
diff changeset
114 force_overwrite=ctx.args.force)
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
116 # If this was a file-system content item, see if we need to auto-open
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
117 # an editor on it.
774
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
118 editor = ctx.app.config.get('prepare/editor')
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
119 editor_type = ctx.app.config.get('prepare/editor_type', 'exe')
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
120 if editor and isinstance(source, FSContentSourceBase):
774
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
121 import shlex
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
122 shell = False
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
123 args = '%s "%s"' % (editor, content_item.spec)
774
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
124 if '%path%' in editor:
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
125 args = editor.replace('%path%', content_item.spec)
774
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
126
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
127 if editor_type.lower() == 'shell':
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
128 shell = True
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
129 else:
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
130 args = shlex.split(args)
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
131
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
132 import subprocess
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
133 logger.info("Running: %s" % args)
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
134 subprocess.Popen(args, shell=shell)
2bb3c1a04e98 prepare: Add ablity to run an editor program after creating the page file.
Ludovic Chabant <ludovic@chabant.com>
parents: 773
diff changeset
135
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 class DefaultPrepareTemplatesCommandExtension(ChefCommandExtension):
187
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
138 """ Provides the default scaffolding templates to the `prepare`
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 command.
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 """
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 def __init__(self):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 super(DefaultPrepareTemplatesCommandExtension, self).__init__()
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 self.command_name = 'prepare'
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 def getTemplateNames(self, app):
1154
aad9b5a0a809 prepare: Add micro-blogging template.
Ludovic Chabant <ludovic@chabant.com>
parents: 1152
diff changeset
146 return ['default', 'micro', 'rss', 'atom']
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 def getTemplateDescription(self, app, name):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 descs = {
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
150 'default': "The default template, for a simple page.",
1154
aad9b5a0a809 prepare: Add micro-blogging template.
Ludovic Chabant <ludovic@chabant.com>
parents: 1152
diff changeset
151 'micro': "A micro-post.",
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
152 'rss': "A fully functional RSS feed.",
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
153 'atom': "A fully functional Atom feed."}
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 return descs[name]
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 def getTemplate(self, app, name):
879
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
157 from piecrust import RESOURCES_DIR
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
158
1154
aad9b5a0a809 prepare: Add micro-blogging template.
Ludovic Chabant <ludovic@chabant.com>
parents: 1152
diff changeset
159 assert name in ['default', 'micro', 'rss', 'atom']
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160 src_path = os.path.join(RESOURCES_DIR, 'prepare', '%s.html' % name)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 with open(src_path, 'r', encoding='utf8') as fp:
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162 return fp.read()
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164
187
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
165 class UserDefinedPrepareTemplatesCommandExtension(ChefCommandExtension):
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
166 """ Provides user-defined scaffolding templates to the `prepare`
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
167 command.
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
168 """
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
169 def __init__(self):
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
170 super(UserDefinedPrepareTemplatesCommandExtension, self).__init__()
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
171 self.command_name = 'prepare'
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
172
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
173 def _getTemplatesDir(self, app):
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
174 return os.path.join(app.root_dir, 'scaffold/pages')
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
175
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
176 def supports(self, app):
534
5bbeb11fe8d9 bug: Fix crash running `chef help scaffolding` outside of a website.
Ludovic Chabant <ludovic@chabant.com>
parents: 363
diff changeset
177 if not app.root_dir:
5bbeb11fe8d9 bug: Fix crash running `chef help scaffolding` outside of a website.
Ludovic Chabant <ludovic@chabant.com>
parents: 363
diff changeset
178 return False
187
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
179 return os.path.isdir(self._getTemplatesDir(app))
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
180
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
181 def getTemplateNames(self, app):
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
182 names = os.listdir(self._getTemplatesDir(app))
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
183 return map(lambda n: os.path.splitext(n)[0], names)
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
184
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
185 def getTemplateDescription(self, app, name):
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
186 return "User-defined template."
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
187
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
188 def getTemplate(self, app, name):
879
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
189 import glob
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
190
187
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
191 templates_dir = self._getTemplatesDir(app)
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
192 pattern = os.path.join(templates_dir, '%s.*' % name)
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
193 matches = glob.glob(pattern)
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
194 if not matches:
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
195 raise Exception("No such page scaffolding template: %s" % name)
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
196 if len(matches) > 1:
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
197 raise Exception(
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
198 "More than one scaffolding template has name: %s" % name)
187
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
199 with open(matches[0], 'r', encoding='utf8') as fp:
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
200 return fp.read()
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
201
d5b7c2a4ec9d prepare: Add user-defined scaffolding templates.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
202
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 class DefaultPrepareTemplatesHelpTopic(ChefCommandExtension):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 """ Provides help topics for the `prepare` command.
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205 """
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 command_name = 'help'
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
208 def getHelpTopics(self):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
209 return [('scaffolding',
165
8355eb9dd8fe prepare: Show a more friendly user message when no arguments are given.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
210 "Available templates for the 'prepare' command.")]
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212 def getHelpTopic(self, topic, app):
879
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
213 import io
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
214 import textwrap
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
215 from piecrust.chefutil import print_help_item
58ae026b4c31 chef: Optimize startup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 852
diff changeset
216
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 with io.StringIO() as tplh:
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 extensions = app.plugin_loader.getCommandExtensions()
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 for e in extensions:
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 if e.command_name == 'prepare' and e.supports(app):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 for n in e.getTemplateNames(app):
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 d = e.getTemplateDescription(app, n)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 print_help_item(tplh, n, d)
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 help_list = tplh.getvalue()
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 help_txt = (
852
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
227 textwrap.fill(
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
228 "Running the 'prepare' command will let "
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
229 "PieCrust setup a page for you in the correct place, with "
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
230 "some hopefully useful default text.") +
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
231 "\n\n" +
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
232 textwrap.fill("The following templates are available:") +
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
233 "\n\n" +
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
234 help_list +
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
235 "\n" +
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
236 "You can add user-defined templates by creating pages in a "
4850f8c21b6e core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents: 774
diff changeset
237 "`scaffold/pages` sub-directory in your website.")
100
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 return help_txt
69d5eecfa449 Better `prepare` command, with templates and help topics.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239
1152
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
240
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
241 class CopyAssetCommand(ChefCommand):
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
242 """ Chef command for copying files into a page's assets folder.
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
243 """
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
244 def __init__(self):
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
245 super().__init__()
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
246 self.name = 'copyasset'
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
247 self.description = "Copies files into a page's assets folder."
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
248
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
249 def setupParser(self, parser, app):
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
250 parser.add_argument('path',
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
251 help="The path to the asset file.")
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
252 parser.add_argument('page',
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
253 help="The path to the page file.")
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
254 parser.add_argument('-n', '--rename',
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
255 help=("Rename the file so that it will be known "
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
256 "by this name in the `{{assets}}` syntax."))
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
257
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
258 def checkedRun(self, ctx):
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
259 # TODO: suppor other types of sources...
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
260 import shutil
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
261 from piecrust.sources import mixins
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
262
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
263 item = None
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
264 spec = ctx.args.page
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
265 for src in ctx.app.sources:
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
266 if not isinstance(src, mixins.SimpleAssetsSubDirMixin):
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
267 logger.warning(
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
268 "Ignoring source '%s' because it's not supported yet." %
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
269 src.name)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
270 continue
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
271
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
272 try:
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
273 item = src.findContentFromSpec(spec)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
274 break
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
275 except Exception as ex:
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
276 logger.warning(
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
277 "Ignoring source '%s' because it raised an error: %s" %
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
278 src.name, ex)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
279 continue
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
280
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
281 if item is None:
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
282 raise Exception("No such page: %s" % ctx.args.page)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
283
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
284 spec_no_ext, _ = os.path.splitext(item.spec)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
285 assets_dir = spec_no_ext + mixins.assets_suffix
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
286 if not os.path.isdir(assets_dir):
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
287 logger.info("Creating directory: %s" % assets_dir)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
288 os.makedirs(assets_dir)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
289
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
290 dest_name, dest_ext = os.path.splitext(os.path.basename(ctx.args.path))
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
291 dest_name = ctx.args.rename or dest_name
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
292
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
293 dest_path = os.path.join(assets_dir, dest_name + dest_ext)
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
294 logger.info("Copying '%s' to '%s'." % (ctx.args.path, dest_path))
74c0c7483986 copyasset: Add `copyasset` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 947
diff changeset
295 shutil.copy2(ctx.args.path, dest_path)