[Checkins] SVN: z3c.versionedresource/trunk/ * Feature: Implemented SVN Version Manager.

Stephan Richter srichter at gmail.com
Thu Jul 30 12:23:26 EDT 2009


Log message for revision 102376:
  * Feature: Implemented SVN Version Manager.
  
  * Feature: Updated to work with latest package versions.
  
  Get ready for release.
  

Changed:
  U   z3c.versionedresource/trunk/CHANGES.txt
  U   z3c.versionedresource/trunk/buildout.cfg
  U   z3c.versionedresource/trunk/setup.py
  U   z3c.versionedresource/trunk/src/z3c/versionedresource/README.txt
  U   z3c.versionedresource/trunk/src/z3c/versionedresource/list.py
  U   z3c.versionedresource/trunk/src/z3c/versionedresource/resource.py
  U   z3c.versionedresource/trunk/src/z3c/versionedresource/tests/test_doc.py
  U   z3c.versionedresource/trunk/src/z3c/versionedresource/version.py

-=-
Modified: z3c.versionedresource/trunk/CHANGES.txt
===================================================================
--- z3c.versionedresource/trunk/CHANGES.txt	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/CHANGES.txt	2009-07-30 16:23:25 UTC (rev 102376)
@@ -2,11 +2,17 @@
 CHANGES
 =======
 
-Version 0.4.1 (unreleased)
+Version 0.5.0 (2009-07-30)
+--------------------------
 
-* Bug: Fix registering of Resources and move configure.zcml to overrides.zcml,
-  because it overrides the zope.app.publisher's registration.
+* Feature: Implemented SVN Version Manager.
 
+* Feature: Updated to work with latest package versions.
+
+* Bug: Fix registering of ``Resources`` and move ``configure.zcml`` to
+  ``overrides.zcml``, because it overrides the ``zope.app.publisher``'s
+  registration.
+
 Version 0.4.0 (2008-09-27)
 --------------------------
 

Modified: z3c.versionedresource/trunk/buildout.cfg
===================================================================
--- z3c.versionedresource/trunk/buildout.cfg	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/buildout.cfg	2009-07-30 16:23:25 UTC (rev 102376)
@@ -1,13 +1,7 @@
 [buildout]
 develop = .
 parts = test coverage-test coverage-report resource-list python
-index = http://download.zope.org/zope3.4
-find-links = http://pypi.python.org/pypi/zope.app.publisher/3.5.0
-versions = versions
 
-[versions]
-zope.app.publisher = 3.5.0
-
 [test]
 recipe = zc.recipe.testrunner
 eggs = z3c.versionedresource [test]

Modified: z3c.versionedresource/trunk/setup.py
===================================================================
--- z3c.versionedresource/trunk/setup.py	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/setup.py	2009-07-30 16:23:25 UTC (rev 102376)
@@ -23,7 +23,7 @@
 
 setup (
     name='z3c.versionedresource',
-    version='0.5.0dev',
+    version='0.5.0',
     author = "Stephan Richter and the Zope Community",
     author_email = "zope3-dev at zope.org",
     description = "Versioned Resources",

Modified: z3c.versionedresource/trunk/src/z3c/versionedresource/README.txt
===================================================================
--- z3c.versionedresource/trunk/src/z3c/versionedresource/README.txt	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/src/z3c/versionedresource/README.txt	2009-07-30 16:23:25 UTC (rev 102376)
@@ -47,7 +47,16 @@
 Clearly, there is not much to version managers and they are only interesting
 within the larger context of this package.
 
+An advanced implementation of the version manager uses the SVN revision number
+to produce the version string. You simply pass in a working path and the
+version is computed:
 
+  >>> import os
+  >>> manager = version.SVNVersionManager(os.path.dirname(__file__))
+  >>> manager
+  <SVNVersionManager 'r...'>
+
+
 Versioned Resource Traversal
 ----------------------------
 

Modified: z3c.versionedresource/trunk/src/z3c/versionedresource/list.py
===================================================================
--- z3c.versionedresource/trunk/src/z3c/versionedresource/list.py	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/src/z3c/versionedresource/list.py	2009-07-30 16:23:25 UTC (rev 102376)
@@ -57,7 +57,7 @@
         if not isinstance(res, DirectoryResource):
             # Avoid duplicate paths
             if res() not in paths:
-                paths.append(res())
+                paths.append(unicode(res()))
         # For directory resources, we want to walk the tree.
         baseURL = res()
         path = res.context.path

Modified: z3c.versionedresource/trunk/src/z3c/versionedresource/resource.py
===================================================================
--- z3c.versionedresource/trunk/src/z3c/versionedresource/resource.py	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/src/z3c/versionedresource/resource.py	2009-07-30 16:23:25 UTC (rev 102376)
@@ -17,11 +17,16 @@
 """
 __docformat__ = "reStructuredText"
 import zope.component
+import zope.interface
+import zope.site.hooks
+import zope.traversing.browser.absoluteurl
 from zope.publisher.interfaces import NotFound
+from zope.publisher.interfaces.browser import IBrowserRequest
 from zope.app.publisher.browser import resource, resources
 from zope.app.publisher.browser import directoryresource
 from zope.app.publisher.browser import fileresource
 from zope.app.publisher.browser import pagetemplateresource
+from zope.traversing.browser.interfaces import IAbsoluteURL
 from z3c.versionedresource import interfaces
 
 class Resources(resources.Resources):
@@ -42,17 +47,39 @@
         return res
 
 
-class VersionedResourceBase(object):
+class AbsoluteURL(zope.traversing.browser.absoluteurl.AbsoluteURL):
+    zope.interface.implementsOnly(IAbsoluteURL)
+    zope.component.adapts(interfaces.IVersionedResource, IBrowserRequest)
 
-    def _createUrl(self, baseUrl, name):
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __str__(self):
+        name = self.context.__name__
+        if name.startswith('++resource++'):
+            name = name[12:]
+
+        site = zope.site.hooks.getSite()
+        base = zope.component.queryMultiAdapter(
+            (site, self.request), IAbsoluteURL, name="resource")
+        if base is None:
+            url = str(zope.component.getMultiAdapter(
+                (site, self.request), IAbsoluteURL))
+        else:
+            url = str(base)
+
         vm = zope.component.queryUtility(interfaces.IVersionManager)
-        return '%s/@@/%s/%s' %(baseUrl, vm.version, name)
 
-class Resource(VersionedResourceBase, resource.Resource):
-    pass
+        return '%s/@@/%s/%s' % (url, vm.version, name)
 
 
-class FileResource(VersionedResourceBase, fileresource.FileResource):
+class Resource(resource.Resource):
+    zope.interface.implements(interfaces.IVersionedResource)
+
+class FileResource(fileresource.FileResource):
+    zope.interface.implements(interfaces.IVersionedResource)
+
     # 10 years expiration date
     cacheTimeout = 10 * 365 * 24 * 3600
 
@@ -66,8 +93,8 @@
     resourceClass = FileResource
 
 
-class DirectoryResource(VersionedResourceBase,
-                        directoryresource.DirectoryResource):
+class DirectoryResource(directoryresource.DirectoryResource):
+    zope.interface.implements(interfaces.IVersionedResource)
 
     resource_factories = {
         '.gif':  ImageResourceFactory,

Modified: z3c.versionedresource/trunk/src/z3c/versionedresource/tests/test_doc.py
===================================================================
--- z3c.versionedresource/trunk/src/z3c/versionedresource/tests/test_doc.py	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/src/z3c/versionedresource/tests/test_doc.py	2009-07-30 16:23:25 UTC (rev 102376)
@@ -23,6 +23,7 @@
 from zope.testing import doctest
 from zope.app.testing import placelesssetup
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.app.publisher.browser.resource import AbsoluteURL
 from z3c.versionedresource import interfaces, resource
 
 class ITestLayer(IDefaultBrowserLayer):
@@ -51,11 +52,16 @@
             name,
             os.stat(path).st_size)
 
+def setUp(test):
+    placelesssetup.setUp(test)
+    zope.component.provideAdapter(AbsoluteURL)
+    zope.component.provideAdapter(resource.AbsoluteURL)
+
 def test_suite():
     return unittest.TestSuite((
         doctest.DocFileSuite(
             '../README.txt',
-            setUp=placelesssetup.setUp, tearDown=placelesssetup.tearDown,
+            setUp=setUp, tearDown=placelesssetup.tearDown,
             globs = {'ls': ls, 'unregister': unregister},
             optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS),
         ))

Modified: z3c.versionedresource/trunk/src/z3c/versionedresource/version.py
===================================================================
--- z3c.versionedresource/trunk/src/z3c/versionedresource/version.py	2009-07-30 11:44:45 UTC (rev 102375)
+++ z3c.versionedresource/trunk/src/z3c/versionedresource/version.py	2009-07-30 16:23:25 UTC (rev 102376)
@@ -16,7 +16,7 @@
 $Id$
 """
 __docformat__ = "reStructuredText"
-
+import subprocess
 import zope.interface
 from zope.schema.fieldproperty import FieldProperty
 from z3c.versionedresource import interfaces
@@ -32,3 +32,18 @@
 
     def __repr__(self):
         return '<%s %r>' %(self.__class__.__name__, self.version)
+
+class SVNVersionManager(VersionManager):
+    zope.interface.implements(interfaces.IVersionManager)
+
+    COMMAND = 'svnversion -n %s'
+
+    def __init__(self, path):
+        process = subprocess.Popen(
+            [self.COMMAND %path],
+            shell=True, close_fds=True,
+            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        status = process.wait()
+        if status != 0:
+            print process.stderr.read()
+        self.version = 'r' + process.stdout.read()



More information about the Checkins mailing list