changeset 25:65ae19c4e8a3

Copy page assets to bake output, use correct slashes when serving assets.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 19 Aug 2014 11:07:42 -0700
parents 644869022b6e
children 3701daa97927
files piecrust/baking/baker.py piecrust/data/assetor.py piecrust/rendering.py
diffstat 3 files changed, 48 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/baking/baker.py	Tue Aug 19 11:06:48 2014 -0700
+++ b/piecrust/baking/baker.py	Tue Aug 19 11:07:42 2014 -0700
@@ -1,10 +1,11 @@
 import time
 import os.path
 import codecs
-import urllib.request, urllib.error, urllib.parse
+import shutil
 import hashlib
 import logging
 import threading
+import urllib.request, urllib.error, urllib.parse
 from queue import Queue, Empty
 from piecrust.baking.records import TransitionalBakeRecord, BakeRecordPageEntry
 from piecrust.chefutil import format_timed
@@ -21,13 +22,14 @@
 
 class PageBaker(object):
     def __init__(self, app, out_dir, force=False, record=None,
-            copy_assets=False):
+            copy_assets=True):
         self.app = app
         self.out_dir = out_dir
         self.force = force
         self.record = record
         self.force = force
         self.copy_assets = copy_assets
+        self.site_root = app.config.get('site/root')
         self.pretty_urls = app.config.get('site/pretty_urls')
         self.pagination_suffix = app.config.get('site/pagination_suffix')
 
@@ -158,6 +160,26 @@
                 raise Exception("Error baking page '%s' for URI '%s'." %
                         (page.ref_spec, uri)) from ex
 
+            # Copy page assets.
+            if (cur_sub == 1 and self.copy_assets and
+                    ctx.used_assets is not None):
+                if self.pretty_urls:
+                    out_assets_dir = os.path.dirname(out_path)
+                else:
+                    out_assets_dir, out_name = os.path.split(out_path)
+                    if sub_uri != self.site_root:
+                        out_name_noext, _ = os.path.splitext(out_name)
+                        out_assets_dir += out_name_noext
+
+                logger.debug("Copying page assets to: %s" % out_assets_dir)
+                if not os.path.isdir(out_assets_dir):
+                    os.makedirs(out_assets_dir, 0o755)
+                for ap in ctx.used_assets._getAssetPaths():
+                    dest_ap = os.path.join(out_assets_dir, os.path.basename(ap))
+                    logger.debug("  %s -> %s" % (ap, dest_ap))
+                    shutil.copy(ap, dest_ap)
+
+            # Record what we did and figure out if we have more work.
             cur_record_entry.out_uris.append(sub_uri)
             cur_record_entry.out_paths.append(out_path)
             cur_record_entry.used_source_names |= ctx.used_source_names
--- a/piecrust/data/assetor.py	Tue Aug 19 11:06:48 2014 -0700
+++ b/piecrust/data/assetor.py	Tue Aug 19 11:07:42 2014 -0700
@@ -14,7 +14,7 @@
 def build_base_url(app, uri, assets_path):
     base_url_format = app.env.base_asset_url_format
     site_root = app.config.get('site/root')
-    rel_path = os.path.relpath(assets_path, app.root_dir)
+    rel_path = os.path.relpath(assets_path, app.root_dir).replace('\\', '/')
     pretty = app.config.get('site/pretty_urls')
     if not pretty:
         uri, _ = os.path.splitext(uri)
@@ -44,17 +44,21 @@
     def __getattr__(self, name):
         try:
             self._cacheAssets()
-            return self._cache[name]
+            return self._cache[name][0]
         except KeyError:
             raise AttributeError()
 
     def __getitem__(self, key):
         self._cacheAssets()
-        return self._cache[key]
+        return self._cache[key][0]
 
     def __iter__(self):
         self._cacheAssets()
-        return iter(self._cache.values())
+        return map(lambda i: i[0], self._cache.values())
+
+    def _getAssetPaths(self):
+        self._cacheAssets()
+        return map(lambda i: i[1], self._cache.values())
 
     def _debugRenderAssetNames(self):
         self._cacheAssets()
@@ -71,11 +75,19 @@
             return
 
         base_url = build_base_url(self._page.app, self._uri, assets_dir)
-        for _, __, filenames in os.walk(assets_dir):
-            for fn in filenames:
-                name, ext = os.path.splitext(fn)
-                if name in self._cache:
-                    raise UnsupportedAssetsError(
-                            "Multiple asset files are named '%s'." % name)
-                self._cache[name] = base_url + fn
+        for fn in os.listdir(assets_dir):
+            full_fn = os.path.join(assets_dir, fn)
+            if not os.path.isfile(full_fn):
+                raise Exception("Skipping: %s" % full_fn)
+                continue
 
+            name, ext = os.path.splitext(fn)
+            if name in self._cache:
+                raise UnsupportedAssetsError(
+                        "Multiple asset files are named '%s'." % name)
+            self._cache[name] = (base_url + fn, full_fn)
+
+        cpi = self._page.app.env.exec_info_stack.current_page_info
+        if cpi is not None:
+            cpi.render_ctx.used_assets = self
+
--- a/piecrust/rendering.py	Tue Aug 19 11:06:48 2014 -0700
+++ b/piecrust/rendering.py	Tue Aug 19 11:07:42 2014 -0700
@@ -42,6 +42,7 @@
         self.pagination_filter = None
         self.custom_data = None
         self.use_cache = False
+        self.used_assets = None
         self.used_pagination = None
         self.used_source_names = set()
         self.used_taxonomy_terms = set()