Source code for flask_webpackext.ext

# -*- coding: utf-8 -*-
#
# This file is part of Flask-WebpackExt
# Copyright (C) 2017 CERN.
#
# Flask-WebpackExt is free software; you can redistribute it and/or modify
# it under the terms of the Revised BSD License; see LICENSE file for
# more details.

"""Webpack integration for Flask."""

from __future__ import absolute_import, print_function

from os.path import join

from pywebpack import FileStorage, ManifestLoader
from werkzeug.utils import import_string

from . import config
from ._compat import string_types
from .manifest import JinjaManifestLoader
from .proxies import current_manifest


[docs]class FlaskWebpackExt(object): """Flask-WebpackExt extension.""" def __init__(self, app=None): """Extension initialization.""" if app: self.init_app(app)
[docs] def init_app(self, app): """Flask application initialization.""" self.init_config(app) app.add_template_global(current_manifest, name='webpack') app.extensions['flask-webpackext'] = _FlaskWebpackExtState(app)
[docs] def init_config(self, app): """Initialize configuration.""" app.config.setdefault( 'WEBPACKEXT_PROJECT_DISTDIR', join(app.static_folder, 'dist'), ) app.config.setdefault( 'WEBPACKEXT_PROJECT_DISTURL', join(app.static_url_path, 'dist'), ) app.config.setdefault( 'WEBPACKEXT_PROJECT_BUILDDIR', join(app.instance_path, 'assets'), ) app.config.setdefault( 'WEBPACKEXT_STORAGE_CLS', FileStorage ) app.config.setdefault( 'WEBPACKEXT_MANIFEST_LOADER', JinjaManifestLoader, ) for k in dir(config): if k.startswith('WEBPACKEXT_'): app.config.setdefault(k, getattr(config, k))
class _FlaskWebpackExtState(object): """Flask webpack state object.""" def __init__(self, app): """Initialize state.""" self.app = app @property def manifest_loader(self): """Manifest loader.""" loader = self.app.config['WEBPACKEXT_MANIFEST_LOADER'] if isinstance(loader, string_types): return import_string(loader) return loader @property def manifest(self): """Manifest.""" path = self.app.config['WEBPACKEXT_MANIFEST_PATH'] if path: return self.manifest_loader().load( join(self.app.static_folder, path)) return None @property def project(self): """Webpack project.""" project = self.app.config['WEBPACKEXT_PROJECT'] if isinstance(project, string_types): return import_string(project) return project @property def storage_cls(self): """Default storage class.""" cls_ = self.app.config['WEBPACKEXT_STORAGE_CLS'] if isinstance(cls_, string_types): return import_string(cls_) return cls_