[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