Metadata-Version: 2.1
Name: Flask-Static-Compress
Version: 1.0.3
Summary: Auto-detects your static files for minification, combination, and versioning. Like Django-Compressor for Flask.
Home-page: https://github.com/alanhamlett/flask-static-compress
Author: Alan Hamlett
Author-email: alan.hamlett@gmail.com
License: BSD
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Flask
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Dist: Flask
Requires-Dist: jac (>=0.18)
Flask-Static-Compress
=====================
.. image:: https://travis-ci.org/alanhamlett/flask-static-compress.svg?branch=master
:target: https://travis-ci.org/alanhamlett/flask-static-compress
:alt: Tests
.. image:: https://codecov.io/gh/alanhamlett/flask-static-compress/branch/master/graph/badge.svg
:target: https://codecov.io/gh/alanhamlett/flask-static-compress
:alt: Coverage
Auto-detects your static files for minification, combination, and versioning. Like Django-Compressor for Flask.
Installation
------------
::
pip install flask-static-compress
Usage
-----
Just wrap your existing css/js with a compress block and Flask-Static-Compress handles the rest::
{% compress 'css' %}
{% endcompress %}
{% compress 'js' %}
{% endcompress %}
Also, initialize the extension inside your Flask app::
from flask_static_compress import FlaskStaticCompress
app = Flask(__name__)
compress = FlaskStaticCompress(app)
All static assets inside a ``compress`` block are compressed into a single file, and your html is updated to the new path when rendering the template.
For example::
{% compress 'js' %}
{% endcompress %}
Is turned into::
The compressed ``a041936b125a3ec4ce9bf7a83130157d.js`` contains both ``app.js`` and ``config.js`` combined for faster page loading.
The file name is calculated based on the contents of ``app.js`` and ``config.js``.
This means any change to your static code is automatically reloaded, or cache-busted, in browsers.
With debug mode turned on, file names and line numbers are preserved while still running the compression flow::
The ``type`` attribute is used to decide which compressor to use for the asset.
Use `offline compression `_ for improved performance.
Create `custom compressors `_ to support more types of static files.
For example, to remove trailing commas with `Prettier `_ then compress with `jsmin `_::
import errno
import subprocess
from jac.compat import file, u, utf8_encode
from jac.exceptions import InvalidCompressorError
from rjsmin import jsmin
class CustomJavaScriptCompressor(object):
binary = 'prettier'
@classmethod
def compile(cls, content, mimetype='text/less', cwd=None, uri_cwd=None,
debug=None):
if debug:
return content
args = ['--no-config', '--trailing-comma', 'none']
args.insert(0, cls.binary)
try:
handler = subprocess.Popen(args,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE, cwd=None)
except OSError as e:
msg = '{0} encountered an error when executing {1}: {2}'.format(
cls.__name__,
cls.binary,
u(e),
)
if e.errno == errno.ENOENT:
msg += ' Make sure {0} is in your PATH.'.format(cls.binary)
raise InvalidCompressorError(msg)
if isinstance(content, file):
content = content.read()
(stdout, stderr) = handler.communicate(input=utf8_encode(content))
stdout = u(stdout)
if handler.returncode == 0:
return jsmin(stdout)
else:
raise RuntimeError('Error compressing: %s' % stderr)
COMPRESSOR_CLASSES = {
'text/javascript': CustomJavaScriptCompressor,
}
Configuration
-------------
``COMPRESSOR_ENABLED`` Default: True
``COMPRESSOR_OFFLINE_COMPRESS`` Default: False
``COMPRESSOR_FOLLOW_SYMLINKS`` Default: False
``COMPRESSOR_DEBUG`` Default: False
``COMPRESSOR_OUTPUT_DIR`` Default: app.static_folder + '/sdist'
``COMPRESSOR_CACHE_DIR`` Default: app.static_folder + '/sdist'
``COMPRESSOR_STATIC_PREFIX`` Default: app.static_url_path + '/sdist'
``COMPRESSOR_CLASSES`` Default::
[
'text/css': LessCompressor,
'text/coffeescript': CoffeeScriptCompressor,
'text/less': LessCompressor,
'text/javascript': JavaScriptCompressor,
'text/sass': SassCompressor,
'text/scss': SassCompressor,
]
Thanks to Jay Santos, creator of `jac `_. Flask-Static-Compress is just a wrapper around jac!