annotate piecrust/commands/builtin/scaffolding.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
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)