aboutsummaryrefslogtreecommitdiffstats
path: root/nikola/plugins/task/bundles.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-02-03 19:17:00 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2021-02-03 19:17:00 -0500
commit3a0d66f07b112b6d2bdc2b57bbf717a89a351ce6 (patch)
treea7cf56282e54f05785243bc1e903d6594f2c06ba /nikola/plugins/task/bundles.py
parent787b97a4cb24330b36f11297c6d3a7a473a907d0 (diff)
New upstream version 8.1.2.upstream/8.1.2
Diffstat (limited to 'nikola/plugins/task/bundles.py')
-rw-r--r--nikola/plugins/task/bundles.py89
1 files changed, 36 insertions, 53 deletions
diff --git a/nikola/plugins/task/bundles.py b/nikola/plugins/task/bundles.py
index b9c57b9..aa4ce78 100644
--- a/nikola/plugins/task/bundles.py
+++ b/nikola/plugins/task/bundles.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright © 2012-2015 Roberto Alsina and others.
+# Copyright © 2012-2020 Roberto Alsina and others.
# Permission is hereby granted, free of charge, to any
# person obtaining a copy of this software and associated
@@ -24,38 +24,26 @@
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-"""Bundle assets using WebAssets."""
+"""Bundle assets."""
-from __future__ import unicode_literals
+import configparser
+import io
+import itertools
import os
-
-try:
- import webassets
-except ImportError:
- webassets = None # NOQA
+import shutil
from nikola.plugin_categories import LateTask
from nikola import utils
class BuildBundles(LateTask):
-
- """Bundle assets using WebAssets."""
+ """Bundle assets."""
name = "create_bundles"
- def set_site(self, site):
- """Set Nikola site."""
- self.logger = utils.get_logger('bundles', utils.STDERR_HANDLER)
- if webassets is None and site.config['USE_BUNDLES']:
- utils.req_missing(['webassets'], 'USE_BUNDLES', optional=True)
- self.logger.warn('Setting USE_BUNDLES to False.')
- site.config['USE_BUNDLES'] = False
- super(BuildBundles, self).set_site(site)
-
def gen_tasks(self):
- """Bundle assets using WebAssets."""
+ """Bundle assets."""
kw = {
'filters': self.site.config['FILTERS'],
'output_folder': self.site.config['OUTPUT_FOLDER'],
@@ -69,28 +57,21 @@ class BuildBundles(LateTask):
def build_bundle(output, inputs):
out_dir = os.path.join(kw['output_folder'],
os.path.dirname(output))
- inputs = [os.path.relpath(i, out_dir) for i in inputs if os.path.isfile(i)]
- cache_dir = os.path.join(kw['cache_folder'], 'webassets')
- utils.makedirs(cache_dir)
- env = webassets.Environment(out_dir, os.path.dirname(output),
- cache=cache_dir)
- if inputs:
- bundle = webassets.Bundle(*inputs, output=os.path.basename(output))
- env.register(output, bundle)
- # This generates the file
- try:
- env[output].urls()
- except Exception as e:
- self.logger.error("Failed to build bundles.")
- self.logger.exception(e)
- self.logger.notice("Try running ``nikola clean`` and building again.")
- else:
- with open(os.path.join(out_dir, os.path.basename(output)), 'wb+'):
- pass # Create empty file
+ inputs = [
+ os.path.join(
+ out_dir,
+ os.path.relpath(i, out_dir))
+ for i in inputs if os.path.isfile(i)
+ ]
+ with open(os.path.join(out_dir, os.path.basename(output)), 'wb+') as out_fh:
+ for i in inputs:
+ with open(i, 'rb') as in_fh:
+ shutil.copyfileobj(in_fh, out_fh)
+ out_fh.write(b'\n')
yield self.group_task()
- if (webassets is not None and self.site.config['USE_BUNDLES'] is not
- False):
+
+ if self.site.config['USE_BUNDLES']:
for name, _files in kw['theme_bundles'].items():
output_path = os.path.join(kw['output_folder'], name)
dname = os.path.dirname(name)
@@ -100,7 +81,11 @@ class BuildBundles(LateTask):
files.append(os.path.join(dname, fname))
file_dep = [os.path.join(kw['output_folder'], fname)
for fname in files if
- utils.get_asset_path(fname, self.site.THEMES, self.site.config['FILES_FOLDERS']) or fname == os.path.join('assets', 'css', 'code.css')]
+ utils.get_asset_path(
+ fname,
+ self.site.THEMES,
+ self.site.config['FILES_FOLDERS'],
+ output_dir=kw['output_folder']) or fname == os.path.join('assets', 'css', 'code.css')]
# code.css will be generated by us if it does not exist in
# FILES_FOLDERS or theme assets. It is guaranteed that the
# generation will happen before this task.
@@ -123,19 +108,17 @@ class BuildBundles(LateTask):
def get_theme_bundles(themes):
"""Given a theme chain, return the bundle definitions."""
- bundles = {}
for theme_name in themes:
bundles_path = os.path.join(
utils.get_theme_path(theme_name), 'bundles')
if os.path.isfile(bundles_path):
- with open(bundles_path) as fd:
- for line in fd:
- try:
- name, files = line.split('=')
- files = [f.strip() for f in files.split(',')]
- bundles[name.strip().replace('/', os.sep)] = files
- except ValueError:
- # for empty lines
- pass
- break
- return bundles
+ config = configparser.ConfigParser()
+ header = io.StringIO('[bundles]\n')
+ with open(bundles_path, 'rt') as fd:
+ config.read_file(itertools.chain(header, fd))
+ bundles = {}
+ for name, files in config['bundles'].items():
+ name = name.strip().replace('/', os.sep)
+ files = [f.strip() for f in files.split(',') if f.strip()]
+ bundles[name] = files
+ return bundles