Mercurial > piecrust2
annotate piecrust/commands/builtin/scaffolding.py @ 1186:2ead9dcb6bec
prepare: Fix scaffolding refactor code.
For some reason the previous commit was missing some changes.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 23 Oct 2020 23:50:42 -0700 |
parents | 31e8ee0bf5b2 |
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) |