[z3-checkins] r26075 - in
z3/jsonserver/branch/merge/concatresource: . compression test
reebalazs at codespeak.net
reebalazs at codespeak.net
Fri Apr 21 09:32:09 CEST 2006
Author: reebalazs
Date: Fri Apr 21 09:32:05 2006
New Revision: 26075
Added:
z3/jsonserver/branch/merge/concatresource/README
Modified:
z3/jsonserver/branch/merge/concatresource/compression/__init__.py
z3/jsonserver/branch/merge/concatresource/compression/css.py
z3/jsonserver/branch/merge/concatresource/compression/javascript.py
z3/jsonserver/branch/merge/concatresource/concatfileresource.py
z3/jsonserver/branch/merge/concatresource/concatresource.py
z3/jsonserver/branch/merge/concatresource/directives.py
z3/jsonserver/branch/merge/concatresource/meta.py
z3/jsonserver/branch/merge/concatresource/test/configure.zcml
Log:
Adding compress_level as attribute, choices are "none", "safe", "full"
Added: z3/jsonserver/branch/merge/concatresource/README
==============================================================================
--- (empty file)
+++ z3/jsonserver/branch/merge/concatresource/README Fri Apr 21 09:32:05 2006
@@ -0,0 +1,72 @@
+
+Objectives
+----------
+
+I made this utility for the works in the jsonserver integration and
+AZAX/kukit. This was meant to be a temporary, lightweight solution but it
+has long term merits too. I needed this because I wanted a solution that
+works right now, works on zope3 and zope 2.8 even (so zc.resourcelibraries
+was not a choice), does not depend on Plone (so ResourceRegistries is out
+too).
+
+The interesting point of the utility is: instead of building registries to
+emit include tags in the HTML, it simply makes one resource that needs to
+be imported in a single line::
+
+ <browser:concatresource
+ name="test.js"
+ files="test1.js
+ test2.js"
+ />
+
+Also:
+
+- it compresses the JS or CSS files with Florian Schulze's compressor
+ from ResourceRegistries
+
+- it contains an utility interface that another component can implement
+ to dynamically extend the list of files (like I did with AZAX). So the
+ "registry" is not really implemented but can be plugged in.
+
+- it is tested (although not much) to work with Zope 2.8, 2.9, 3.1, 3.2
+
+Meanwhile I implemented the cache headers for the resources correctly
+here, the current implementation of caching is broken in Five and I
+believe in Z3 resources as well; beware that I considered the original
+Zope3 code only and did not look at additional utilities. According to my
+observation: in Z3 the original resources attempt to handle the cache
+headers correctly but never really check if the file gets changed on the
+filesystem (only on restart). If this is really a problem and not just I
+believe, then it is fixed in my code.
+
+More information on this issue:
+
+http://article.gmane.org/gmane.comp.web.zope.z3base.general/53
+
+Compression
+-----------
+
+You can use more levels of compressions with the compress_level attribute.
+
+ <browser:concatresource
+ name="test.js"
+ files="test1.js
+ test2.js"
+ compress_level="full"
+ />
+
+Some explanation:
+
+- compression is only implemented for JavaScript and CSS
+
+- The default level is "safe", this is useable with all scripts
+
+- The "full" level gives even better compression by taking out all newlines
+ and mangling private variable names, but some preparation must be made
+ in the scripts for that (like putting a ; after }-s I think, and
+ also maybe more).
+
+- Specifying "none" will leave your resource uncompressed. This
+ can be useful for debugging.
+
+
Modified: z3/jsonserver/branch/merge/concatresource/compression/__init__.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/compression/__init__.py (original)
+++ z3/jsonserver/branch/merge/concatresource/compression/__init__.py Fri Apr 21 09:32:05 2006
@@ -14,7 +14,7 @@
default_compress_method = lambda text: text
-def compress(data, content_type):
+def compress(data, content_type, compress_level):
'Returns compressed text for a given content type'
method = compress_methods.get(content_type, default_compress_method)
- return method(data)
+ return method(data, compress_level)
Modified: z3/jsonserver/branch/merge/concatresource/compression/css.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/compression/css.py (original)
+++ z3/jsonserver/branch/merge/concatresource/compression/css.py Fri Apr 21 09:32:05 2006
@@ -5,7 +5,14 @@
from thirdparty.packer import CSSPacker
-csspacker_full = CSSPacker('safe')
+csspacker_safe = CSSPacker('safe')
+csspacker_full = CSSPacker('full')
-def compress(data):
- return csspacker_full.pack(data)
+def compress(data, compress_level):
+ if compress_level == "safe":
+ return csspacker_safe.pack(data)
+ elif compress_level == "full":
+ return csspacker_full.pack(data)
+ else:
+ # none
+ return data
Modified: z3/jsonserver/branch/merge/concatresource/compression/javascript.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/compression/javascript.py (original)
+++ z3/jsonserver/branch/merge/concatresource/compression/javascript.py Fri Apr 21 09:32:05 2006
@@ -4,7 +4,14 @@
from thirdparty.packer import JavascriptPacker
-jspacker_full = JavascriptPacker('safe')
+jspacker_safe = JavascriptPacker('safe')
+jspacker_full = JavascriptPacker('full')
-def compress(data):
- return jspacker_full.pack(data)
+def compress(data, compress_level):
+ if compress_level == "safe":
+ return jspacker_safe.pack(data)
+ elif compress_level == "full":
+ return jspacker_full.pack(data)
+ else:
+ # none
+ return data
Modified: z3/jsonserver/branch/merge/concatresource/concatfileresource.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/concatfileresource.py (original)
+++ z3/jsonserver/branch/merge/concatresource/concatfileresource.py Fri Apr 21 09:32:05 2006
@@ -24,7 +24,7 @@
'''
implements(IContextFile)
- def __init__(self, pathlist, name):
+ def __init__(self, pathlist, name, compress_level):
# Path is now a list.
assert isinstance(pathlist, (list, tuple))
# check all files, just to raise error if don't exist
@@ -33,6 +33,7 @@
#
self.pathlist_base = pathlist
self.__name__ = name
+ self.compress_level = compress_level
# markers for pathlist modification
self.pathlist = []
self.fileslist_changed = None
@@ -88,6 +89,7 @@
assert d['content_type'] == content_type
data.append(d['data'])
result['data'] = '\n'.join(data)
+ result['compress_level'] = self.compress_level
# Do compression on the result
result['data'] = compress(**result)
return result
Modified: z3/jsonserver/branch/merge/concatresource/concatresource.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/concatresource.py (original)
+++ z3/jsonserver/branch/merge/concatresource/concatresource.py Fri Apr 21 09:32:05 2006
@@ -104,9 +104,10 @@
factory = None
resource = None
- def __init__(self, path, name, resource_factory=None, checker=None):
+ def __init__(self, path, name, compress_level, resource_factory=None, checker=None):
self.__name = name
self.__path = path
+ self.__compress_level = compress_level
if resource_factory is not None:
self.resource = resource_factory
# z3 only
@@ -117,7 +118,7 @@
rsrc = self.__rsrc
except AttributeError:
# Delayed creation. That assures that registry is set up by this time.
- rsrc = self.__rsrc = ICachedResource(self.factory(self.__path, self.__name))
+ rsrc = self.__rsrc = ICachedResource(self.factory(self.__path, self.__name, self.__compress_level))
resource = self.resource(rsrc, request)
# z3 only
resource.__name__ = self.__name
Modified: z3/jsonserver/branch/merge/concatresource/directives.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/directives.py (original)
+++ z3/jsonserver/branch/merge/concatresource/directives.py Fri Apr 21 09:32:05 2006
@@ -1,7 +1,7 @@
from zope.interface import Interface
from zope.configuration.fields import GlobalObject, Tokens, Path, \
PythonIdentifier, MessageID
-from zope.schema import TextLine, Text, Id
+from zope.schema import TextLine, Text, Id, Choice
from zope.app.security.fields import Permission
from fields import PathList
from zope.app.component.metadirectives import IBasicViewInformation
@@ -29,3 +29,10 @@
description=u"A space separated list of resource files",
required=True
)
+
+ compress_level = Choice(
+ title=u"Compress level",
+ description=u"Level of compression applied, by default 'safe'.",
+ values=(u'none', u'safe', u'full'),
+ required=False,
+ )
Modified: z3/jsonserver/branch/merge/concatresource/meta.py
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/meta.py (original)
+++ z3/jsonserver/branch/merge/concatresource/meta.py Fri Apr 21 09:32:05 2006
@@ -39,7 +39,7 @@
},
}
-def concatresource(_context, name, files=None, layer=_layer, permission='zope.Public'):
+def concatresource(_context, name, files=None, compress_level='safe', layer=_layer, permission='zope.Public'):
if not files:
raise ConfigurationError(
@@ -78,7 +78,7 @@
checker = NamesChecker(allowed_names, permission)
- factory = res_factory(res, name, resource_factory=new_class, checker=checker)
+ factory = res_factory(res, name, compress_level, resource_factory=new_class, checker=checker)
if __pre_3_2__:
_context.action(
Modified: z3/jsonserver/branch/merge/concatresource/test/configure.zcml
==============================================================================
--- z3/jsonserver/branch/merge/concatresource/test/configure.zcml (original)
+++ z3/jsonserver/branch/merge/concatresource/test/configure.zcml Fri Apr 21 09:32:05 2006
@@ -8,4 +8,11 @@
test2.js"
/>
+ <browser:concatresource
+ name="test_fullcompress.js"
+ files="test1.js
+ test2.js"
+ compress_level="full"
+ />
+
</configure>
More information about the z3-checkins
mailing list