[Checkins] SVN: z3c.bobopublisher/trunk/ single file resource and its ZCML directive

Fabio Tranchitella kobold at kobold.it
Sun Aug 16 02:36:10 EDT 2009


Log message for revision 102844:
  single file resource and its ZCML directive

Changed:
  U   z3c.bobopublisher/trunk/TODO.txt
  U   z3c.bobopublisher/trunk/src/z3c/bobopublisher/README.txt
  U   z3c.bobopublisher/trunk/src/z3c/bobopublisher/meta.zcml
  U   z3c.bobopublisher/trunk/src/z3c/bobopublisher/metaconfigure.py
  U   z3c.bobopublisher/trunk/src/z3c/bobopublisher/metadirectives.py

-=-
Modified: z3c.bobopublisher/trunk/TODO.txt
===================================================================
--- z3c.bobopublisher/trunk/TODO.txt	2009-08-15 22:54:35 UTC (rev 102843)
+++ z3c.bobopublisher/trunk/TODO.txt	2009-08-16 06:36:09 UTC (rev 102844)
@@ -2,6 +2,5 @@
 ================
 
  - Views (with multiple pages) (bobo:view)
- - Single resource (bobo:resource)
  - Bobo subroutes (bobo:subroute)
 

Modified: z3c.bobopublisher/trunk/src/z3c/bobopublisher/README.txt
===================================================================
--- z3c.bobopublisher/trunk/src/z3c/bobopublisher/README.txt	2009-08-15 22:54:35 UTC (rev 102843)
+++ z3c.bobopublisher/trunk/src/z3c/bobopublisher/README.txt	2009-08-16 06:36:09 UTC (rev 102844)
@@ -233,7 +233,7 @@
 ---------
 
 z3c.bobopublisher provides a ZCML directive which can be used to publish static
-resources from a directory in the filesystem:
+resources from a directory or from a single file in the filesystem:
 
     >>> import os, tempfile
     >>> tempdir = tempfile.mktemp()
@@ -246,8 +246,12 @@
     ...       name="images"
     ...       directory="%s"
     ...       />
+    ...   <resource
+    ...       name="resource.txt"
+    ...       file="%s/resource.txt"
+    ...       />
     ... </configure>
-    ... """ % tempdir, context=context, execute=True)
+    ... """ % (tempdir, tempdir), context=context, execute=True)
 
 By the default resources are registered for the IRoot interface, as shown below:
 
@@ -268,6 +272,19 @@
     >>> 'Last-Modified' in response.headers
     True
 
+Single file resources work in a similar way:
+
+    >>> response = testapp.get('/resource.txt', status=200)
+    >>> response.content_type, response.charset, response.body
+    ('text/plain', 'UTF-8', 'RESOURCE')
+
+    >>> response.headers['Cache-Control']
+    'public,max-age=86400'
+    >>> 'Expires' in response.headers
+    True
+    >>> 'Last-Modified' in response.headers
+    True
+
 It is not possible to quit from the path of the resource directory:
 
     >>> testapp.get('/images/../images/resource.txt', status=404).body

Modified: z3c.bobopublisher/trunk/src/z3c/bobopublisher/meta.zcml
===================================================================
--- z3c.bobopublisher/trunk/src/z3c/bobopublisher/meta.zcml	2009-08-15 22:54:35 UTC (rev 102843)
+++ z3c.bobopublisher/trunk/src/z3c/bobopublisher/meta.zcml	2009-08-16 06:36:09 UTC (rev 102844)
@@ -18,6 +18,13 @@
 
   <meta:directive
       namespace="http://namespaces.zope.org/bobo"
+      name="resource"
+      schema=".metadirectives.IResourceDirective"
+      handler=".metaconfigure.resource"
+      />
+
+  <meta:directive
+      namespace="http://namespaces.zope.org/bobo"
       name="defaultView"
       schema=".metadirectives.IDefaultViewDirective"
       handler=".metaconfigure.defaultView"

Modified: z3c.bobopublisher/trunk/src/z3c/bobopublisher/metaconfigure.py
===================================================================
--- z3c.bobopublisher/trunk/src/z3c/bobopublisher/metaconfigure.py	2009-08-15 22:54:35 UTC (rev 102843)
+++ z3c.bobopublisher/trunk/src/z3c/bobopublisher/metaconfigure.py	2009-08-16 06:36:09 UTC (rev 102844)
@@ -17,13 +17,15 @@
 """
 
 import bobo
+import os
 
 from z3c.bobopublisher.interfaces import IDefaultViewName, IRequest, \
     IGETRequest, IPOSTRequest, IPUTRequest, IDELETERequest
-from z3c.bobopublisher.resources import Directory
+from z3c.bobopublisher.resources import Directory, File
 
 from zope.component import getGlobalSiteManager
 from zope.component.zcml import adapter
+from zope.configuration.exceptions import ConfigurationError
 from zope.interface import Interface
 from zope.location.interfaces import IRoot
 
@@ -52,12 +54,25 @@
 def resources(_context, name, directory, for_=IRoot, permission=None):
     def resourcesFactory(context, request):
         return Directory(directory)
+    if not os.path.isdir(directory):
+        raise ConfigurationError('Directory %s does not exist' % directory)
     adapter(
         _context, (resourcesFactory,), provides=Interface,
         for_=(for_, IGETRequest), name=name, permission=permission,
     )
 
 
+def resource(_context, name, file, for_=IRoot, permission=None):
+    def resourcesFactory(context, request):
+        return File(file)
+    if not os.path.isfile(file):
+        raise ConfigurationError('File %s does not exist' % directory)
+    adapter(
+        _context, (resourcesFactory,), provides=Interface,
+        for_=(for_, IGETRequest), name=name, permission=permission,
+    )
+
+
 def defaultView(_context, name, for_=None):
     adapter(
         _context, (lambda x: name,), provides=IDefaultViewName, for_=(for_,),

Modified: z3c.bobopublisher/trunk/src/z3c/bobopublisher/metadirectives.py
===================================================================
--- z3c.bobopublisher/trunk/src/z3c/bobopublisher/metadirectives.py	2009-08-15 22:54:35 UTC (rev 102843)
+++ z3c.bobopublisher/trunk/src/z3c/bobopublisher/metadirectives.py	2009-08-16 06:36:09 UTC (rev 102844)
@@ -83,6 +83,31 @@
     )
 
 
+class IResourceDirective(Interface):
+    """bobo:resource directive"""
+
+    name = TextLine(
+        title=u'Name',
+        required=True,
+    )
+
+    for_ = GlobalInterface(
+        title=u"The interface this resource is registered for",
+        required=False,
+        default=IRoot,
+    )
+
+    file = Path(
+        title=u"Resource path",
+        required=True,
+    )
+
+    permission = Permission(
+        title=u"Permission",
+        required=False,
+    )
+
+
 class IDefaultViewDirective(Interface):
     """bobo:defaultView directive"""
 



More information about the Checkins mailing list