diff piecrust/processing/base.py @ 205:e725af1d48fb

bake: Changes in how assets directories are configured. Change `skip_patterns` and `force_patterns` to `ignore` and `force`. Put less responsibility on the `bake` command to specify all those settings, and more on the `Baker` and `ProcessorPipeline` themselves. Add some tests.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 18 Jan 2015 12:12:57 -0800
parents 29165f2f315d
children c5330cb35794
line wrap: on
line diff
--- a/piecrust/processing/base.py	Sun Jan 18 11:53:18 2015 -0800
+++ b/piecrust/processing/base.py	Sun Jan 18 12:12:57 2015 -0800
@@ -113,45 +113,51 @@
 
 
 class ProcessorPipeline(object):
-    def __init__(self, app, mounts, out_dir, force=False,
-            skip_patterns=None, force_patterns=None, num_workers=4):
+    def __init__(self, app, out_dir, force=False):
         assert app and out_dir
         self.app = app
-        self.mounts = mounts
+        self.out_dir = out_dir
+        self.force = force
+
         tmp_dir = app.cache_dir
         if not tmp_dir:
             import tempfile
             tmp_dir = os.path.join(tempfile.gettempdir(), 'piecrust')
         self.tmp_dir = os.path.join(tmp_dir, 'proc')
-        self.out_dir = out_dir
-        self.force = force
-        self.skip_patterns = skip_patterns or []
-        self.force_patterns = force_patterns or []
-        self.processors = app.plugin_loader.getProcessors()
-        self.num_workers = num_workers
+
+        baker_params = app.config.get('baker') or {}
+
+        assets_dirs = baker_params.get('assets_dirs', app.assets_dirs)
+        self.mounts = make_mount_info(assets_dirs)
 
-        self.mounts = make_mount_info(self.mounts)
+        self.num_workers = baker_params.get('workers', 4)
 
-        self.skip_patterns += ['_cache', '_counter',
+        ignores = baker_params.get('ignore', [])
+        ignores += [
+                '_cache', '_counter',
                 'theme_info.yml',
                 '.DS_Store', 'Thumbs.db',
                 '.git*', '.hg*', '.svn']
+        self.skip_patterns = make_re(ignores)
+        self.force_patterns = make_re(baker_params.get('force', []))
 
-        self.skip_patterns = make_re(self.skip_patterns)
-        self.force_patterns = make_re(self.force_patterns)
+        self.processors = app.plugin_loader.getProcessors()
 
     def addSkipPatterns(self, patterns):
         self.skip_patterns += make_re(patterns)
 
     def filterProcessors(self, authorized_names):
-        if not authorized_names or authorized_names == '*':
+        self.processors = self.getFilteredProcessors(authorized_names)
+
+    def getFilteredProcessors(self, authorized_names):
+        if not authorized_names or authorized_names == 'all':
             return self.processors
 
         if isinstance(authorized_names, str):
             authorized_names = split_processor_names_re.split(authorized_names)
 
         procs = []
-        has_star = '*' in authorized_names
+        has_star = 'all' in authorized_names
         for p in self.processors:
             for name in authorized_names:
                 if name == p.PROCESSOR_NAME:
@@ -164,10 +170,6 @@
                     procs.append(p)
         return procs
 
-        return list(filter(
-            lambda p: p.PROCESSOR_NAME in authorized_names,
-            self.processors))
-
     def run(self, src_dir_or_file=None, *,
             new_only=False, delete=True,
             previous_record=None, save_record=True):
@@ -346,7 +348,8 @@
                     '%s [not baked, overridden]' % rel_path))
             return
 
-        processors = pipeline.filterProcessors(job.mount_info['processors'])
+        processors = pipeline.getFilteredProcessors(
+                job.mount_info['processors'])
         try:
             builder = ProcessingTreeBuilder(processors)
             tree_root = builder.build(rel_path)
@@ -390,7 +393,7 @@
         if not isinstance(info, dict):
             raise Exception("Asset directory info for '%s' is not a "
                             "dictionary." % name)
-        info.setdefault('processors', '*')
+        info.setdefault('processors', 'all -uglifyjs -cleancss')
 
     return mounts