annotate piecrust/processing/browserify.py @ 1067:c3b15ad24a93

cm: Include Bootstrap dependencies in `package.json`.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 13 Feb 2018 21:53:11 -0800
parents c2bfa1869f0d
children a3dec0fbd9ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import os.path
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
3 import hashlib
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import logging
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import platform
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 import subprocess
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 from piecrust.processing.base import Processor, PRIORITY_FIRST, FORCE_BUILD
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 logger = logging.getLogger(__name__)
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 class BrowserifyProcessor(Processor):
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 PROCESSOR_NAME = 'browserify'
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 def __init__(self):
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 super(BrowserifyProcessor, self).__init__()
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 self.priority = PRIORITY_FIRST
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
19 self._tmp_dir = None
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 self._conf = None
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 def initialize(self, app):
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 super(BrowserifyProcessor, self).initialize(app)
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 self._conf = app.config.get('browserify')
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 if self._conf is None:
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 return
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 if self._conf is True:
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 self._conf = {}
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 self._conf.setdefault('bin', 'browserify')
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
34 def onPipelineStart(self, ctx):
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
35 self._tmp_dir = ctx.tmp_dir
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
36
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 def matches(self, path):
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 return self._conf is not None and os.path.splitext(path)[1] == '.js'
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 def getDependencies(self, path):
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
41 deps_path = self._getDepListPath(path)
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
42 try:
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
43 with open(deps_path, 'r', encoding='utf8') as f:
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
44 deps_list = f.read()
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
45 except OSError:
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
46 logger.debug("No dependency list found for Browserify target '%s' "
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
47 "at '%s'. Rebuilding" % (path, deps_path))
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
48 return FORCE_BUILD
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
49
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
50 deps_list = [d.strip() for d in deps_list.split('\n')]
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
51 return filter(lambda d: d, deps_list)
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
1041
717ac3c4ee77 bake: Fix where the Browserify processor outputs things.
Ludovic Chabant <ludovic@chabant.com>
parents: 1038
diff changeset
53 def getOutputFilenames(self, filename):
717ac3c4ee77 bake: Fix where the Browserify processor outputs things.
Ludovic Chabant <ludovic@chabant.com>
parents: 1038
diff changeset
54 return [filename]
717ac3c4ee77 bake: Fix where the Browserify processor outputs things.
Ludovic Chabant <ludovic@chabant.com>
parents: 1038
diff changeset
55
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 def process(self, path, out_dir):
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
57 # Update the dependency list file.
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
58 # Sadly there doesn't seem to be a way to get the list at the same
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
59 # time as compiling the bundle so we need to run the process twice :(
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
60 deps_list = self._runBrowserify([path, '--list'])
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
61 deps_list = deps_list.decode('utf8')
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
62 deps_path = self._getDepListPath(path)
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
63 with open(deps_path, 'w', encoding='utf8') as f:
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
64 f.write(deps_list)
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
66 # Actually compile the JS bundle.
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
67 out_path = os.path.join(out_dir, os.path.basename(path))
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
68 self._runBrowserify([path, '-o', out_path])
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
69
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
70 return True
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
71
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
72 def _runBrowserify(self, args):
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
73 args = [self._conf['bin']] + args
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 cwd = self.app.root_dir
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 logger.debug("Running Browserify: %s" % ' '.join(args))
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 try:
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
77 return subprocess.check_output(
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
78 args,
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
79 cwd=cwd,
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
80 stderr=subprocess.STDOUT)
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 except FileNotFoundError as ex:
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
82 logger.error("Tried running Browserify with command: %s" % args)
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 raise Exception("Error running Browserify. "
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 "Did you install it?") from ex
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
85 except subprocess.CalledProcessError as ex:
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
86 logger.error("Error occured while running Browserify:")
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
87 logger.info(ex.stdout)
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
88 logger.error(ex.stderr)
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
89 raise Exception("Error occured while running Browserify. "
1038
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 "Please check log messages above for "
7487e2df8a56 bake: Add support for Browserify.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 "more information.")
1049
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
92
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
93 def _getDepListPath(self, path):
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
94 deps_name = "%s_%s.deps" % (
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
95 os.path.basename(path),
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
96 hashlib.md5(path.encode('utf8')).hexdigest())
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
97 deps_path = os.path.join(self._tmp_dir, deps_name)
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
98 return deps_path
c2bfa1869f0d bake: Optimize Browserify dependency handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 1041
diff changeset
99