diff piecrust/processing/compressors.py @ 206:cba781477bd0

processing: Add `concat`, `uglifyjs` and `cleancss` processors.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 18 Jan 2015 12:13:28 -0800
parents
children d1490028e211
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/piecrust/processing/compressors.py	Sun Jan 18 12:13:28 2015 -0800
@@ -0,0 +1,93 @@
+import os
+import os.path
+import logging
+import platform
+import subprocess
+from piecrust.processing.base import SimpleFileProcessor
+
+
+logger = logging.getLogger(__name__)
+
+
+class CleanCssProcessor(SimpleFileProcessor):
+    PROCESSOR_NAME = 'cleancss'
+
+    def __init__(self):
+        super(CleanCssProcessor, self).__init__({'css': 'css'})
+        self._conf = None
+
+    def _doProcess(self, in_path, out_path):
+        self._ensureInitialized()
+
+        args = [self._conf['bin'], '-o', out_path]
+        args += self._conf['options']
+        args.append(in_path)
+        logger.debug("Cleaning CSS file: %s" % args)
+
+        # On Windows, we need to run the process in a shell environment
+        # otherwise it looks like `PATH` isn't taken into account.
+        shell = (platform.system() == 'Windows')
+        try:
+            retcode = subprocess.call(args, shell=shell)
+        except FileNotFoundError as ex:
+            logger.error("Tried running CleanCSS processor with command: %s" %
+                         args)
+            raise Exception("Error running CleanCSS processor. "
+                            "Did you install it?") from ex
+        if retcode != 0:
+            raise Exception("Error occured in CleanCSS. Please check "
+                            "log messages above for more information.")
+        return True
+
+    def _ensureInitialized(self):
+        if self._conf is not None:
+            return
+
+        self._conf = self.app.config.get('cleancss') or {}
+        self._conf.setdefault('bin', 'cleancss')
+        self._conf.setdefault('options', ['--skip-rebase'])
+        if not isinstance(self._conf['options'], list):
+            raise Exception("The `cleancss/options` configuration setting "
+                            "must be an array of arguments.")
+
+
+class UglifyJSProcessor(SimpleFileProcessor):
+    PROCESSOR_NAME = 'uglifyjs'
+
+    def __init__(self):
+        super(UglifyJSProcessor, self).__init__({'js': 'js'})
+        self._conf = None
+
+    def _doProcess(self, in_path, out_path):
+        self._ensureInitialized()
+
+        args = [self._conf['bin'], in_path, '-o', out_path]
+        args += self._conf['options']
+        logger.debug("Uglifying JS file: %s" % args)
+
+        # On Windows, we need to run the process in a shell environment
+        # otherwise it looks like `PATH` isn't taken into account.
+        shell = (platform.system() == 'Windows')
+        try:
+            retcode = subprocess.call(args, shell=shell)
+        except FileNotFoundError as ex:
+            logger.error("Tried running UglifyJS processor with command: %s" %
+                         args)
+            raise Exception("Error running UglifyJS processor. "
+                            "Did you install it?") from ex
+        if retcode != 0:
+            raise Exception("Error occured in UglifyJS. Please check "
+                            "log messages above for more information.")
+        return True
+
+    def _ensureInitialized(self):
+        if self._conf is not None:
+            return
+
+        self._conf = self.app.config.get('uglifyjs') or {}
+        self._conf.setdefault('bin', 'uglifyjs')
+        self._conf.setdefault('options', ['--compress'])
+        if not isinstance(self._conf['options'], list):
+            raise Exception("The `uglify/options` configuration setting "
+                            "must be an array of arguments.")
+