Mercurial > piecrust2
comparison piecrust/commands/builtin/scaffolding.py @ 1152:74c0c7483986
copyasset: Add `copyasset` command.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 19 Jan 2019 17:40:13 -0800 |
parents | a85b2827ba1a |
children | aad9b5a0a809 |
comparison
equal
deleted
inserted
replaced
1151:0d699f04968c | 1152:74c0c7483986 |
---|---|
1 import os | 1 import os |
2 import os.path | 2 import os.path |
3 import logging | 3 import logging |
4 from piecrust.commands.base import ExtendableChefCommand, ChefCommandExtension | 4 from piecrust.commands.base import ( |
5 ChefCommand, ExtendableChefCommand, ChefCommandExtension) | |
5 | 6 |
6 | 7 |
7 logger = logging.getLogger(__name__) | 8 logger = logging.getLogger(__name__) |
8 | 9 |
9 | 10 |
223 "\n" + | 224 "\n" + |
224 "You can add user-defined templates by creating pages in a " | 225 "You can add user-defined templates by creating pages in a " |
225 "`scaffold/pages` sub-directory in your website.") | 226 "`scaffold/pages` sub-directory in your website.") |
226 return help_txt | 227 return help_txt |
227 | 228 |
229 | |
230 class CopyAssetCommand(ChefCommand): | |
231 """ Chef command for copying files into a page's assets folder. | |
232 """ | |
233 def __init__(self): | |
234 super().__init__() | |
235 self.name = 'copyasset' | |
236 self.description = "Copies files into a page's assets folder." | |
237 | |
238 def setupParser(self, parser, app): | |
239 parser.add_argument('path', | |
240 help="The path to the asset file.") | |
241 parser.add_argument('page', | |
242 help="The path to the page file.") | |
243 parser.add_argument('-n', '--rename', | |
244 help=("Rename the file so that it will be known " | |
245 "by this name in the `{{assets}}` syntax.")) | |
246 | |
247 def checkedRun(self, ctx): | |
248 # TODO: suppor other types of sources... | |
249 import shutil | |
250 from piecrust.sources import mixins | |
251 | |
252 item = None | |
253 spec = ctx.args.page | |
254 for src in ctx.app.sources: | |
255 if not isinstance(src, mixins.SimpleAssetsSubDirMixin): | |
256 logger.warning( | |
257 "Ignoring source '%s' because it's not supported yet." % | |
258 src.name) | |
259 continue | |
260 | |
261 try: | |
262 item = src.findContentFromSpec(spec) | |
263 break | |
264 except Exception as ex: | |
265 logger.warning( | |
266 "Ignoring source '%s' because it raised an error: %s" % | |
267 src.name, ex) | |
268 continue | |
269 | |
270 if item is None: | |
271 raise Exception("No such page: %s" % ctx.args.page) | |
272 | |
273 spec_no_ext, _ = os.path.splitext(item.spec) | |
274 assets_dir = spec_no_ext + mixins.assets_suffix | |
275 if not os.path.isdir(assets_dir): | |
276 logger.info("Creating directory: %s" % assets_dir) | |
277 os.makedirs(assets_dir) | |
278 | |
279 dest_name, dest_ext = os.path.splitext(os.path.basename(ctx.args.path)) | |
280 dest_name = ctx.args.rename or dest_name | |
281 | |
282 dest_path = os.path.join(assets_dir, dest_name + dest_ext) | |
283 logger.info("Copying '%s' to '%s'." % (ctx.args.path, dest_path)) | |
284 shutil.copy2(ctx.args.path, dest_path) |