Mercurial > piecrust2
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 |
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) |