Skip to content

Commit

Permalink
take debug-mode into account, take fs last_compilation date into acco…
Browse files Browse the repository at this point in the history
…unt, cleanup.
  • Loading branch information
jensens committed Dec 1, 2016
1 parent 7bfab51 commit e06b16e
Show file tree
Hide file tree
Showing 13 changed files with 480 additions and 275 deletions.
13 changes: 13 additions & 0 deletions CHANGES.rst
Expand Up @@ -111,6 +111,17 @@ New features:

- Toolbar: Let the toolbar submenus be as wide as they need to be and do not break entries into multiple lines. [thet]

- Resource Registry:
In ``debug-mode`` (zope.conf, buildout) do not load cache the production bundle.
[jensens]

- Resource Registry:
In ``debug-mode`` (zope.conf, buildout) do not ignore development mode for anonymous users.
[jensens]

- Resource Registry: If file system version is newer than ``last_compilation`` date of a bundle, use this as ``last_compilation`` date.
[jensens]


Bug fixes:

Expand Down Expand Up @@ -197,6 +208,8 @@ Bug fixes:
- URL change for bug tracker, wording tweaks to UPGRADE.txt
[tkimnguyen]

- Cleanup code of resource registry.
[jensens]

5.1a2 (2016-08-19)
------------------
Expand Down
1 change: 1 addition & 0 deletions Products/CMFPlone/resources/browser/__init__.py
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
59 changes: 39 additions & 20 deletions Products/CMFPlone/resources/browser/combine.py
Expand Up @@ -15,23 +15,23 @@
import re


PRODUCTION_RESOURCE_DIRECTORY = "production"
PRODUCTION_RESOURCE_DIRECTORY = 'production'
logger = logging.getLogger(__name__)


def get_production_resource_directory():
persistent_directory = queryUtility(IResourceDirectory, name="persistent")
persistent_directory = queryUtility(IResourceDirectory, name='persistent')
if persistent_directory is None:
return ''
container = persistent_directory[OVERRIDE_RESOURCE_DIRECTORY_NAME]
try:
production_folder = container[PRODUCTION_RESOURCE_DIRECTORY]
except NotFound:
return "%s/++unique++1" % PRODUCTION_RESOURCE_DIRECTORY
return '%s/++unique++1' % PRODUCTION_RESOURCE_DIRECTORY
if 'timestamp.txt' not in production_folder:
return "%s/++unique++1" % PRODUCTION_RESOURCE_DIRECTORY
return '%s/++unique++1' % PRODUCTION_RESOURCE_DIRECTORY
timestamp = production_folder.readFile('timestamp.txt')
return "%s/++unique++%s" % (
return '%s/++unique++%s' % (
PRODUCTION_RESOURCE_DIRECTORY, timestamp)


Expand All @@ -47,7 +47,7 @@ def get_resource(context, path):
try:
resource = context.unrestrictedTraverse(path)
except NotFound:
logger.warn(u"Could not find resource {0}. You may have to create it first.".format(path)) # noqa
logger.warn(u'Could not find resource {0}. You may have to create it first.'.format(path)) # noqa
return

if isinstance(resource, FilesystemFile):
Expand All @@ -67,19 +67,35 @@ def write_js(context, folder, meta_bundle):
resources = []

# default resources
if meta_bundle == 'default' and registry.records.get(
'plone.resources/jquery.js'
if (
meta_bundle == 'default' and
registry.records.get('plone.resources/jquery.js')
):
resources.append(get_resource(context,
registry.records['plone.resources/jquery.js'].value))
resources.append(get_resource(context,
registry.records['plone.resources.requirejs'].value))
resources.append(get_resource(context,
registry.records['plone.resources.configjs'].value))
resources.append(
get_resource(
context,
registry.records['plone.resources/jquery.js'].value
)
)
resources.append(
get_resource(
context,
registry.records['plone.resources.requirejs'].value
)
)
resources.append(
get_resource(
context,
registry.records['plone.resources.configjs'].value
)
)

# bundles
bundles = registry.collectionOfInterface(
IBundleRegistry, prefix="plone.bundles", check=False)
IBundleRegistry,
prefix='plone.bundles',
check=False
)
for bundle in bundles.values():
if bundle.merge_with == meta_bundle and bundle.jscompilation:
resource = get_resource(context, bundle.jscompilation)
Expand All @@ -90,15 +106,18 @@ def write_js(context, folder, meta_bundle):
fi = StringIO()
for script in resources:
fi.write(script + '\n')
folder.writeFile(meta_bundle + ".js", fi)
folder.writeFile(meta_bundle + '.js', fi)


def write_css(context, folder, meta_bundle):
registry = getUtility(IRegistry)
resources = []

bundles = registry.collectionOfInterface(
IBundleRegistry, prefix="plone.bundles", check=False)
IBundleRegistry,
prefix='plone.bundles',
check=False
)
for bundle in bundles.values():
if bundle.merge_with == meta_bundle and bundle.csscompilation:
css = get_resource(context, bundle.csscompilation)
Expand All @@ -117,11 +136,11 @@ def write_css(context, folder, meta_bundle):
fi = StringIO()
for script in resources:
fi.write(script + '\n')
folder.writeFile(meta_bundle + ".css", fi)
folder.writeFile(meta_bundle + '.css', fi)


def get_override_directory(context):
persistent_directory = queryUtility(IResourceDirectory, name="persistent")
persistent_directory = queryUtility(IResourceDirectory, name='persistent')
if persistent_directory is None:
return
if OVERRIDE_RESOURCE_DIRECTORY_NAME not in persistent_directory:
Expand All @@ -138,7 +157,7 @@ def combine_bundles(context):
# store timestamp
fi = StringIO()
fi.write(datetime.now().isoformat())
production_folder.writeFile("timestamp.txt", fi)
production_folder.writeFile('timestamp.txt', fi)

# generate new combined bundles
write_js(context, production_folder, 'default')
Expand Down
6 changes: 4 additions & 2 deletions Products/CMFPlone/resources/browser/configjs.py
Expand Up @@ -87,8 +87,10 @@ class ConfigJsView(RequireJsView):

def __call__(self):
(paths, shims) = self.get_requirejs_config()
self.request.response.setHeader("Content-Type",
"application/javascript")
self.request.response.setHeader(
'Content-Type',
'application/javascript'
)
return configjs % (
json.dumps(paths, indent=4),
_format_shims(shims)
Expand Down
99 changes: 53 additions & 46 deletions Products/CMFPlone/resources/browser/cook.py
Expand Up @@ -22,6 +22,27 @@

logger = logging.getLogger('Products.CMFPlone')

REQUIREJS_RESET_PREFIX = """
/* reset requirejs definitions so that people who
put requirejs in legacy compilation do not get errors */
var _old_define = define;
var _old_require = require;
define = undefined;
require = undefined;
try{
"""
REQUIREJS_RESET_POSTFIX = """
}catch(e){
// log it
if (typeof console !== "undefined"){
console.log('Error loading javascripts!' + e);
}
}finally{
define = _old_define;
require = _old_require;
}
"""


def cookWhenChangingSettings(context, bundle=None):
"""When our settings are changed, re-cook the not compilable bundles
Expand All @@ -39,60 +60,46 @@ def cookWhenChangingSettings(context, bundle=None):
bundle = bundles.setdefault('plone-legacy')
bundle.resources = []


if not bundle.resources:
# you can have a bundle without any resources defined and it's just shipped
# as a legacy compiled js file
# you can have a bundle without any resources defined and it's just
# shipped as a legacy compiled js file
return

# Let's join all css and js
css_file = ""
cooked_js = """
/* reset requirejs definitions so that people who
put requirejs in legacy compilation do not get errors */
var _old_define = define;
var _old_require = require;
define = undefined;
require = undefined;
try{
"""
css_file = ''
cooked_js = REQUIREJS_RESET_PREFIX
siteUrl = getSite().absolute_url()
request = getRequest()
for package in bundle.resources or []:
if package in resources:
resource = resources[package]
for css in resource.css:
response = subrequest(siteUrl + '/' + css)
if response.status == 200:
css_file += response.getBody()
css_file += '\n'

if resource.js:
response = subrequest(siteUrl + '/' + resource.js)
if response.status == 200:
js = response.getBody()
try:
cooked_js += '\n/* resource: %s */\n%s' % (
resource.js,
minify(js, mangle=False, mangle_toplevel=False)
)
except SyntaxError:
cooked_js += '\n/* resource(error cooking): %s */\n%s' % (
resource.js, js)
else:
cooked_js += '\n/* Could not find resource: %s */\n\n' % resource.js
if package not in resources:
continue
resource = resources[package]
for css in resource.css:
url = siteUrl + '/' + css
response = subrequest(url)
if response.status == 200:
css_file += response.getBody()
css_file += '\n'
else:
css_file += '\n/* Could not find resource: %s */\n\n' % url
if not resource.js:
continue
url = siteUrl + '/' + resource.js
response = subrequest(url)
if response.status == 200:
js = response.getBody()
try:
cooked_js += '\n/* resource: %s */\n%s' % (
resource.js,
minify(js, mangle=False, mangle_toplevel=False)
)
except SyntaxError:
cooked_js += '\n/* resource(error cooking): %s */\n%s' % (
resource.js, js)
else:
cooked_js += '\n/* Could not find resource: %s */\n\n' % url

cooked_js += """
}catch(e){
// log it
if (typeof console !== "undefined"){
console.log('Error loading javascripts!' + e);
}
}finally{
define = _old_define;
require = _old_require;
}
"""
cooked_js += REQUIREJS_RESET_POSTFIX
cooked_css = cssmin(css_file)

js_path = bundle.jscompilation
Expand Down

0 comments on commit e06b16e

Please sign in to comment.