[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