[Checkins] SVN: lovely.remotetask/trunk/ 1. Now handles the use-case where a task service is registered directly at the

Satchidanand Haridas satchit at zope.com
Thu Jul 26 15:56:31 EDT 2007


Log message for revision 78363:
  1. Now handles the use-case where a task service is registered directly at the
    root. References to such services in the product configuration must begin
    with `@` instead of the `<sitename>@`
  
  2. bumped up the version.
  

Changed:
  U   lovely.remotetask/trunk/CHANGES.txt
  U   lovely.remotetask/trunk/setup.py
  U   lovely.remotetask/trunk/src/lovely/remotetask/README.txt
  U   lovely.remotetask/trunk/src/lovely/remotetask/service.py
  U   lovely.remotetask/trunk/src/lovely/remotetask/tests.py

-=-
Modified: lovely.remotetask/trunk/CHANGES.txt
===================================================================
--- lovely.remotetask/trunk/CHANGES.txt	2007-07-26 19:55:17 UTC (rev 78362)
+++ lovely.remotetask/trunk/CHANGES.txt	2007-07-26 19:56:31 UTC (rev 78363)
@@ -2,9 +2,17 @@
 Changes for lovely.remotetask
 =============================
 
-after 0.2.2:
+after 0.2.3:
 ============
 
+2007/07/26 0.2.3:
+=================
+
+- Now handles the use-case where a task service is registered directly at the
+  root. References to such services in the product configuration must begin
+  with `@` instead of the `<sitename>@`.
+
+
 2007/07/02 0.2.2:
 =================
 

Modified: lovely.remotetask/trunk/setup.py
===================================================================
--- lovely.remotetask/trunk/setup.py	2007-07-26 19:55:17 UTC (rev 78362)
+++ lovely.remotetask/trunk/setup.py	2007-07-26 19:56:31 UTC (rev 78363)
@@ -3,7 +3,7 @@
 
 setup (
     name='lovely.remotetask',
-    version='0.2.2',
+    version='0.2.3',
     author = "Lovely Systems",
     author_email = "office at lovelysystems.com",
     description = "A remotetask client utiltiy for zope 3",

Modified: lovely.remotetask/trunk/src/lovely/remotetask/README.txt
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/README.txt	2007-07-26 19:55:17 UTC (rev 78362)
+++ lovely.remotetask/trunk/src/lovely/remotetask/README.txt	2007-07-26 19:56:31 UTC (rev 78363)
@@ -18,15 +18,19 @@
 Installation
 ------------
 
-Define the remotetasks that should be started on startup in zope.conf like 
+Define the remotetasks that should be started on startup in zope.conf like
 this::
 
   <product-config lovely.remotetask>
-    autostart site1 at TestTaskService1, site2 at TestTaskService2 
+    autostart site1 at TestTaskService1, site2 at TestTaskService2, @RootTaskService
   </product-config>
 
-This causes the Remotetasks beeing started upon zope startup.
+Note that services registered directly in the root folder can be referred to
+by just prefixing them with the `@` symbol. The site name can be omitted. An
+example of this is `RootTaskService` defined above.
 
+This causes the Remotetasks being started upon zope startup.
+
 Usage
 _____
 
@@ -34,14 +38,14 @@
 
   >>> from lovely import remotetask
   >>> service = remotetask.TaskService()
-  
+
 Let's register it under the name `TestTaskService`:
 
   >>> from zope import component
   >>> from lovely.remotetask import interfaces
-  >>> component.provideUtility(service, interfaces.ITaskService, 
+  >>> component.provideUtility(service, interfaces.ITaskService,
   ...                          name='TestTaskService1')
-  
+
 The object should be located, so it get's a name:
 
   >>> root['testTaskService1'] = service
@@ -50,7 +54,7 @@
   u'testTaskService1'
   >>> service.__parent__ is root
   True
-    
+
 We can discover the available tasks:
 
   >>> service.getAvailableTasks()
@@ -81,7 +85,6 @@
   >>> service.getAvailableTasks()
   {u'echo': <SimpleTask <function echo ...>>}
 
-
 Since the service cannot instantaneously complete a task, incoming jobs are
 managed by a queue. First we request the echo task to be executed:
 
@@ -91,7 +94,7 @@
 
 The ``add()`` function schedules the task called "echo" to be executed with
 the specified arguments. The method returns a job id with which we can inquire
-about the job.
+about the job. 
 
   >>> service.getStatus(jobid)
   'queued'
@@ -114,7 +117,7 @@
   False
 
 The TaskService is beeing started automatically - if specified in zope.conf -
-as soon as the `IDatabaseOpenedEvent` is fired. Let's emulate the zope.conf 
+as soon as the `IDatabaseOpenedEvent` is fired. Let's emulate the zope.conf
 settings:
 
   >>> class Config(object):
@@ -122,15 +125,20 @@
   ...     def getSectionName(self):
   ...         return 'lovely.remotetask'
   >>> config = Config()
-  >>> servicenames = 'site1 at TestTaskService1, site2 at TestTaskService2'
+  >>> servicenames = ('site1 at TestTaskService1, site2 at TestTaskService2'
+  ...     ', at RootTaskService')
   >>> config.mapping['autostart'] = servicenames
   >>> from zope.app.appsetup.product import setProductConfigurations
   >>> setProductConfigurations([config])
   >>> from lovely.remotetask.service import getAutostartServiceNames
   >>> getAutostartServiceNames()
-  ['site1 at TestTaskService1', 'site2 at TestTaskService2']
-  
-On Zope startup the IDatabaseOpenedEvent is beeing fired, and will call
+  ['site1 at TestTaskService1', 'site2 at TestTaskService2', '@RootTaskService']
+
+Note that `RootTaskService` is for a use-case where the service is directly
+registered at the root. We test this use-case in a separate footnote so that
+the flow of this document is not broken. [#1]_
+
+On Zope startup the IDatabaseOpenedEvent is being fired, and will call
 the bootStrap method:
 
   >>> from ZODB.tests import util
@@ -155,7 +163,10 @@
   >>> service.isProcessing()
   True
 
-Finally stop processing and kill the thread. We'll call service.process() 
+The verification for the jobs in the root-level service is done in another
+footnote [#2]_
+
+Finally stop processing and kill the thread. We'll call service.process()
 manually as we don't have the right environment in the tests.
 
   >>> service.stopProcessing()
@@ -203,7 +214,7 @@
   >>> jobid = service.add(u'echo', {'blah': 'blah'})
   >>> sorted([job.status for job in service.jobs.values()])
   ['cancelled', 'completed', 'error', 'queued']
-  
+
   >>> service.clean()
 
   >>> sorted([job.status for job in service.jobs.values()])
@@ -392,3 +403,49 @@
   >>> service.getResult(jobid)
   3
 
+
+Footnotes
+---------
+
+.. [#1] Tests for use-cases where a service is registered at `root` level.
+
+   Register service for RootLevelTask
+
+     >>> root_service = remotetask.TaskService()
+     >>> component.provideUtility(root_service, interfaces.ITaskService,
+     ...                          name='RootTaskService')
+
+   The object should be located, so it get's a name::
+
+     >>> root['rootTaskService'] = root_service
+     >>> root_service = root['rootTaskService'] # caution! proxy
+     >>> root_service.__name__
+     u'rootTaskService'
+     >>> root_service.__parent__ is root
+     True
+
+     >>> r_jobid = root_service.add(u'echo', {'foo': 'this is for root_service'})
+     >>> r_jobid
+     1
+
+
+.. [#2] We verify the root_service does get processed:
+
+     >>> root_service.isProcessing()
+     True
+
+   Cleaning up root-level service:
+
+     >>> print root_service.getStatus(r_jobid)
+     queued
+
+   Thus the root-service is indeed enabled, which is what we wanted to verify.
+   The rest of the API is tested in the main content above; so we don't need to
+   test it again. We just clean up the the root service.
+
+     >>> root_service.stopProcessing()
+     >>> root_service.isProcessing()
+     False
+
+     >>> root_service.clean()
+

Modified: lovely.remotetask/trunk/src/lovely/remotetask/service.py
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/service.py	2007-07-26 19:55:17 UTC (rev 78362)
+++ lovely.remotetask/trunk/src/lovely/remotetask/service.py	2007-07-26 19:56:31 UTC (rev 78363)
@@ -322,7 +322,10 @@
 
     for siteName, serviceName in [name.split('@')
                                   for name in serviceNames if name]:
-        site = root_folder.get(siteName)
+        if siteName == '':
+            site = root_folder
+        else:
+            site = root_folder.get(siteName)
         if site is not None:
             service = component.queryUtility(interfaces.ITaskService,
                                            context=site,

Modified: lovely.remotetask/trunk/src/lovely/remotetask/tests.py
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/tests.py	2007-07-26 19:55:17 UTC (rev 78362)
+++ lovely.remotetask/trunk/src/lovely/remotetask/tests.py	2007-07-26 19:56:31 UTC (rev 78363)
@@ -23,6 +23,7 @@
 from zope.app.testing.setup import (placefulSetUp,
                                     placefulTearDown)
 from zope.testing.doctestunit import DocFileSuite
+from zope.testing.doctest import INTERPRET_FOOTNOTES
 
 def setUp(test):
     root = placefulSetUp(site=True)
@@ -36,7 +37,9 @@
         DocFileSuite('README.txt',
                      setUp=setUp,
                      tearDown=tearDown,
-                     optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+                     optionflags=doctest.NORMALIZE_WHITESPACE
+                     |doctest.ELLIPSIS
+                     |INTERPRET_FOOTNOTES
                      ),
         DocFileSuite('TESTING.txt',
                      setUp=placelesssetup.setUp,



More information about the Checkins mailing list