===============================================================
loops - Linked Objects for Organization and Processing Services
===============================================================
  ($Id$)
Let's do some basic setup
  >>> from zope.app.testing.setup import placefulSetUp, placefulTearDown
  >>> site = placefulSetUp(True)
  >>> from zope import component, interface
and set up a simple loops site with a concept manager and some concepts
(with all the type machinery, what in real life is done via standard
ZCML setup):
  >>> from loops.organize.setup import SetupManager
  >>> component.provideAdapter(SetupManager, name='organize')
  >>> from loops.tests.setup import TestSite
  >>> t = TestSite(site)
  >>> concepts, resources, views = t.setup()
  >>> loopsRoot = site['loops']
Let's also set up logging in a way that we get notified about problems.
  >>> import sys
  >>> from logging import getLogger, StreamHandler
  >>> getLogger('loops.organize.job').addHandler(StreamHandler(sys.stdout))
Execute Jobs via a cron Call
============================
  >>> from zope.publisher.browser import TestRequest
  >>> from loops.organize.job.browser import Executor
The executor is a view that will be called by calling its ``processJobs``
method. As we haven't yet defined any job managers nothing happens.
  >>> executor = Executor(loopsRoot, TestRequest())
  >>> executor.processJobs()
We now register a job manager via an options setting on the loops root object.
As the corresponding job manager is not yet defined an registered a
warning is issued.
  >>> loopsRoot.options = ['organize.job.managers:loops_notifier']
  >>> executor = Executor(loopsRoot, TestRequest())
  >>> executor.processJobs()
  Job manager 'loops_notifier' not found.
So let's now define a job manager class and register it as an adapter for
the loops root object.
  >>> from loops.organize.job.base import JobManager
  >>> class Notifier(JobManager):
  ...     def process(self):
  ...         print 'processing...'
  >>> component.provideAdapter(Notifier, name='loops_notifier')
  >>> loopsRoot.options = ['organize.job.managers:loops_notifier']
  >>> executor = Executor(loopsRoot, TestRequest())
  >>> executor.processJobs()
  processing...
Fin de partie
=============
  >>> placefulTearDown()