forked from nicolas-van/pygreen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassetmanager.py
115 lines (98 loc) · 3.47 KB
/
assetmanager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import haml
import webassets
from webassets.bundle import wrap
import pathlib
import os
import logging
import time
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
class AssetManager(object):
def _load_asset_bundles(self, config_path):
if os.path.isfile(config_path):
loader = webassets.loaders.YAMLLoader(config_path)
return loader.load_bundles()
return None
def _adjust_bundle_outputs(self, bundles):
for bundle in bundles.values():
old_path, old_ext = os.path.splitext(bundle.output)
bundle.output = ''.join((old_path, '.%(version)s', old_ext))
return bundles
def _setup_environment(self, bundles, production):
if bundles is None:
return None
if production:
bundles = self._adjust_bundle_outputs(bundles)
env_config = {
'directory': self._resolve_assets_dir(),
'UGLIFYJS_EXTRA_ARGS': ['-c', '-m'],
'SASS_DEBUG_INFO': False
}
if production:
env_config.update({
'debug': False,
'manifest': 'cache',
'cache': True,
'auto_build': False,
'url_expire': True
})
else:
env_config.update({
'debug': 'merge',
'manifest': None,
'cache': False,
'auto_build': False,
'url_expire': False
})
environment = webassets.Environment(**env_config)
environment.url= ''
for name, bundle in bundles.iteritems():
log.debug("registering %s" % name)
environment.register(name, bundle)
return environment
def __init__(self, config_path, production=False):
log.debug("production %s" % production)
bundles = self._load_asset_bundles(config_path)
self.environment = self._setup_environment(bundles, production)
def _resolve_assets_dir(self):
for dirpath, dirnames, files in os.walk('.'):
if 'assets' in dirnames:
return os.path.join(dirpath, 'assets')
return None
def files_to_watch(self):
"""
List of paths resolved from globs in bundle configs
"""
files, depends = [], []
ctx = wrap(self.environment, None)
for bundle in self.environment:
files.extend(bundle.resolve_contents(force=True))
depends.extend(bundle.resolve_depends(ctx))
orig, abspaths = zip(*files)
abspaths = list(abspaths)
abspaths.extend(depends)
return set(abspaths)
def globs_to_watch(self):
"""
List of raw globs from bundle configs
"""
globs = []
if self.environment:
for bundle in self.environment:
if bundle.contents:
globs.extend(bundle.contents)
if bundle.depends:
globs.extend(bundle.depends)
return globs
def build_environment(self, force=False):
if self.environment:
log.debug("building environment...")
if force:
log.debug("forcing update...")
for bundle in self.environment:
bundle.build(force=force)
def asset_urls(self):
urls = {}
for name, bundle in self.environment._named_bundles.iteritems():
urls[name] = [url.split('?')[0] for url in bundle.urls()]
return urls