changeset 1152:74c0c7483986

copyasset: Add `copyasset` command.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 19 Jan 2019 17:40:13 -0800
parents 0d699f04968c
children a9a592f655e3
files piecrust/commands/builtin/scaffolding.py piecrust/plugins/builtin.py
diffstat 2 files changed, 61 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/commands/builtin/scaffolding.py	Sat Nov 03 19:42:02 2018 -0700
+++ b/piecrust/commands/builtin/scaffolding.py	Sat Jan 19 17:40:13 2019 -0800
@@ -1,7 +1,8 @@
 import os
 import os.path
 import logging
-from piecrust.commands.base import ExtendableChefCommand, ChefCommandExtension
+from piecrust.commands.base import (
+    ChefCommand, ExtendableChefCommand, ChefCommandExtension)
 
 
 logger = logging.getLogger(__name__)
@@ -225,3 +226,59 @@
             "`scaffold/pages` sub-directory in your website.")
         return help_txt
 
+
+class CopyAssetCommand(ChefCommand):
+    """ Chef command for copying files into a page's assets folder.
+    """
+    def __init__(self):
+        super().__init__()
+        self.name = 'copyasset'
+        self.description = "Copies files into a page's assets folder."
+
+    def setupParser(self, parser, app):
+        parser.add_argument('path',
+                            help="The path to the asset file.")
+        parser.add_argument('page',
+                            help="The path to the page file.")
+        parser.add_argument('-n', '--rename',
+                            help=("Rename the file so that it will be known "
+                                  "by this name in the `{{assets}}` syntax."))
+
+    def checkedRun(self, ctx):
+        # TODO: suppor other types of sources...
+        import shutil
+        from piecrust.sources import mixins
+
+        item = None
+        spec = ctx.args.page
+        for src in ctx.app.sources:
+            if not isinstance(src, mixins.SimpleAssetsSubDirMixin):
+                logger.warning(
+                    "Ignoring source '%s' because it's not supported yet." %
+                    src.name)
+                continue
+
+            try:
+                item = src.findContentFromSpec(spec)
+                break
+            except Exception as ex:
+                logger.warning(
+                    "Ignoring source '%s' because it raised an error: %s" %
+                    src.name, ex)
+                continue
+
+        if item is None:
+            raise Exception("No such page: %s" % ctx.args.page)
+
+        spec_no_ext, _ = os.path.splitext(item.spec)
+        assets_dir = spec_no_ext + mixins.assets_suffix
+        if not os.path.isdir(assets_dir):
+            logger.info("Creating directory: %s" % assets_dir)
+            os.makedirs(assets_dir)
+
+        dest_name, dest_ext = os.path.splitext(os.path.basename(ctx.args.path))
+        dest_name = ctx.args.rename or dest_name
+
+        dest_path = os.path.join(assets_dir, dest_name + dest_ext)
+        logger.info("Copying '%s' to '%s'." % (ctx.args.path, dest_path))
+        shutil.copy2(ctx.args.path, dest_path)
--- a/piecrust/plugins/builtin.py	Sat Nov 03 19:42:02 2018 -0700
+++ b/piecrust/plugins/builtin.py	Sat Jan 19 17:40:13 2019 -0800
@@ -15,7 +15,8 @@
             ShowPathsCommand, UrlCommand)
         from piecrust.commands.builtin.plugins import PluginsCommand
         from piecrust.commands.builtin.publishing import PublishCommand
-        from piecrust.commands.builtin.scaffolding import PrepareCommand
+        from piecrust.commands.builtin.scaffolding import (
+            PrepareCommand, CopyAssetCommand)
         from piecrust.commands.builtin.serving import ServeCommand
         from piecrust.commands.builtin.tasks import TasksCommand
         from piecrust.commands.builtin.themes import ThemesCommand
@@ -31,6 +32,7 @@
             ShowConfigCommand(),
             FindCommand(),
             PrepareCommand(),
+            CopyAssetCommand(),
             ShowSourcesCommand(),
             ShowRoutesCommand(),
             ShowPathsCommand(),