[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