[Checkins] SVN: z3c.sampledata/trunk/src/z3c/sampledata/ merged
jukart-feature branch into trunk
Jürgen Kartnaller
juergen at kartnaller.at
Mon Sep 4 02:05:43 EDT 2006
Log message for revision 69953:
merged jukart-feature branch into trunk
Changed:
U z3c.sampledata/trunk/src/z3c/sampledata/README.txt
U z3c.sampledata/trunk/src/z3c/sampledata/browser/README.txt
A z3c.sampledata/trunk/src/z3c/sampledata/browser/testmanager.zcml
U z3c.sampledata/trunk/src/z3c/sampledata/browser/views.py
U z3c.sampledata/trunk/src/z3c/sampledata/configure.zcml
U z3c.sampledata/trunk/src/z3c/sampledata/ftesting.zcml
U z3c.sampledata/trunk/src/z3c/sampledata/ftests.py
A z3c.sampledata/trunk/src/z3c/sampledata/generator/
U z3c.sampledata/trunk/src/z3c/sampledata/interfaces.py
U z3c.sampledata/trunk/src/z3c/sampledata/manager.py
U z3c.sampledata/trunk/src/z3c/sampledata/meta.zcml
U z3c.sampledata/trunk/src/z3c/sampledata/metaconfigure.py
U z3c.sampledata/trunk/src/z3c/sampledata/metadirectives.py
D z3c.sampledata/trunk/src/z3c/sampledata/principal.py
D z3c.sampledata/trunk/src/z3c/sampledata/principal.txt
D z3c.sampledata/trunk/src/z3c/sampledata/site.py
D z3c.sampledata/trunk/src/z3c/sampledata/site.zcml
D z3c.sampledata/trunk/src/z3c/sampledata/testprincipals.txt
U z3c.sampledata/trunk/src/z3c/sampledata/tests.py
-=-
Modified: z3c.sampledata/trunk/src/z3c/sampledata/README.txt
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/README.txt 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/README.txt 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,7 +1,17 @@
-==========================================
-Pluggable sample data framework for Lovely
-==========================================
+===============================
+Pluggable sample data framework
+===============================
+Creating a good testing environment is the most important way to create
+high quality software.
+
+But most of the time it is a pain !
+
+This package tries to do the best to support the development of sample
+data generators.
+A sample data generator is a pluggable tool to create data needed for tests.
+
+
There are several goals to this framework:
- provide the developers with an automatic setup that is close to
@@ -19,7 +29,7 @@
Generators
----------
-A generator generates a setup.
+A generator generates sample data.
>>> from zope import interface
>>> from zope import component
@@ -27,75 +37,132 @@
>>> class GeneratePrincipals(object):
... interface.implements(ISampleDataPlugin)
- ... name = 'z3c.principals'
... dependencies = []
... schema = None
- ... def generate(self, context, param={}, seed=None):
- ... if context != 'This is a site':
- ... print 'Expected string "This is a site" !'
+ ... def generate(self, context, param={}, dataSource=None, seed=None):
+ ... print self.__class__.__name__
+ ... if dataSource is not None:
+ ... for data in dataSource:
+ ... print '- %s'%data['login']
>>> principalPlugin = GeneratePrincipals()
-For the sample manager the plugin must be registered as a utility.
-
- >>> component.provideUtility(principalPlugin, ISampleDataPlugin,'z3c.principals')
-
For our tests we provide another generator :
>>> class GenerateSite(object):
... interface.implements(ISampleDataPlugin)
- ... name = 'z3c.site'
... dependencies = []
... schema = None
- ... def generate(self, context, param={}, seed=None):
- ... return 'This is a site'
+ ... def generate(self, context, param={}, dataSource=None, seed=None):
+ ... if 'sitename' in param:
+ ... print 'This is site %r'%param['sitename']
+ ... else:
+ ... print self.__class__.__name__
+ ... return 'I am from the site'
>>> sitePlugin = GenerateSite()
- >>> component.provideUtility(sitePlugin, ISampleDataPlugin,'z3c.site')
Generator Manager
-----------------
-A generator manager groups a collection of generators and allows to define
-dependencies between generator.
+A generator manager groups a collection of generators.
+The manager allows to :
+ - define dependencies between generators
+
+ - define data connections between dependent generators
+
+ - provide default configuration data
+
>>> from z3c.sampledata import Manager
>>> manager = Manager('manager', '')
+
+Generator Plugin
+~~~~~~~~~~~~~~~~
+
+For the manager our sample generators must be registered as named utilities.
+
+ >>> component.provideUtility(sitePlugin,
+ ... ISampleDataPlugin,'z3c.sampledata.site')
+ >>> component.provideUtility(principalPlugin,
+ ... ISampleDataPlugin,'z3c.sampledata.principals')
+
+
+Generating Sample Data
+~~~~~~~~~~~~~~~~~~~~~~
+
Now we can add generators to the manager.
-In addition to the "hardwired" dependencies in each generator it is possible
-to add dependencies in the generator manager.
- >>> manager.add('z3c.principals',
- ... dependsOn=['z3c.site',],
- ... contextFrom='z3c.site')
+ >>> manager.add('z3c.sampledata.principals',
+ ... dependsOn=['z3c.sampledata.site',],
+ ... contextFrom='z3c.sampledata.site')
+In addition to the "hardwired" dependencies defined by the dependencies
+property in each generator it is possible to add dependencies in the generator
+manager.
+
A manager provides it's generators.
>>> manager.generators.keys()
- ['z3c.principals']
+ ['z3c.sampledata.principals']
We can tell the manager to generate all samples.
-There is no need to add the sample generator 'z3c.site', it is added
-automatically because of the dependency of 'z3c.principals'.
+There is no need to add the sample generator 'z3c.sampledata.site', it is added
+automatically because of the dependency of 'z3c.sampledata.principals'.
>>> infos = manager.generate(context=None, param={}, seed='something')
+ GenerateSite
+ GeneratePrincipals
+
>>> [info.name for info in infos]
- ['z3c.site', 'z3c.principals']
+ ['z3c.sampledata.site', 'z3c.sampledata.principals']
-Cycles are detected.
+Parameters for the sample generators
+------------------------------------
+
+To have more control over the sample generation process it is possible to
+setup parameters for the generators.
+
>>> manager = Manager('manager', '')
- >>> manager.add('z3c.principals',
- ... dependsOn=['z3c.site',],
- ... contextFrom='z3c.site')
- >>> manager.add('z3c.site',
- ... dependsOn=['z3c.principals',])
+ >>> manager.add('z3c.sampledata.site',
+ ... param={'sitename':'samplesite'})
+
+ >>> manager.add('z3c.sampledata.principals',
+ ... dependsOn=['z3c.sampledata.site',],
+ ... contextFrom='z3c.sampledata.site')
+
>>> infos = manager.generate(context=None, param={}, seed='something')
+ This is site 'samplesite'
+ GeneratePrincipals
+
+It is also possible to overwrite the parameters from the configuration.
+
+ >>> infos = manager.generate(context=None,
+ ... param={'z3c.sampledata.site':
+ ... {'sitename':'managers site'}},
+ ... seed='something')
+ This is site 'managers site'
+ GeneratePrincipals
+
+
+Cycles in the generator definition
+----------------------------------
+
+ >>> manager = Manager('manager', '')
+ >>> manager.add('z3c.sampledata.principals',
+ ... dependsOn=['z3c.sampledata.site',],
+ ... contextFrom='z3c.sampledata.site')
+ >>> manager.add('z3c.sampledata.site',
+ ... dependsOn=['z3c.sampledata.principals',])
+
+ >>> infos = manager.generate(context=None, param={}, seed='something')
Traceback (most recent call last):
...
- CyclicDependencyError: cyclic dependency at 'z3c.principals'
+ CyclicDependencyError: cyclic dependency at 'z3c.sampledata.principals'
+
A test for a complex dependency.
>>> class Generator(object):
@@ -103,7 +170,7 @@
... name = 'generator'
... dependencies = []
... schema = None
- ... def generate(self, context, param={}, seed=None):
+ ... def generate(self, context, param={}, dataSource=None, seed=None):
... return 'I am a generator'
>>> component.provideUtility(Generator(), ISampleDataPlugin,'g.1')
>>> component.provideUtility(Generator(), ISampleDataPlugin,'g.2')
@@ -117,68 +184,67 @@
['g.1', 'g.2', 'g.3']
-BuiltIn sample generators
--------------------------
+Sample Data Source
+------------------
-To support functional tests some basic sample generators are already
-implemented.
+A sample data generator usually gets its sample data from a data source.
+Mostly it is necessary to have different data sources for different uses.
-Site
-~~~~
+As an example, it is always a pain if the sample data for the tests use the
+same data as the UI uses later to provide data for the customer to click
+around.
-Creates a simple folder and makes it a site.
-
- >>> from z3c.sampledata.site import SampleSite
- >>> component.provideUtility(SampleSite(),
- ... ISampleDataPlugin,
- ... 'z3c.sampledata.site')
>>> manager = Manager('manager', '')
- >>> manager.add('z3c.sampledata.site')
- >>> from zope.app.folder.folder import Folder
- >>> baseContext = Folder()
- >>> infos = manager.generate(context=baseContext, param={'sitename':'test'}, seed=None)
- >>> [info.name for info in infos]
- ['z3c.sampledata.site']
- >>> 'test' in baseContext
- True
+ >>> manager.addSource('z3c.datasource.principals',
+ ... data=[{'login':'jukart', 'password':'trakuj'},
+ ... {'login':'srichter', 'password':'rethcirs'}])
-IntIds
-~~~~~~
+ >>> manager.add('z3c.sampledata.principals',
+ ... dataSource='z3c.datasource.principals',
+ ... dependsOn=['z3c.sampledata.site',],
+ ... contextFrom='z3c.sampledata.site')
-Creates an IntIds utility inside the site given as context.
-This generator depends on the creation of a site.
+ >>> infos = manager.generate(context=None, param={}, seed='something')
+ GenerateSite
+ GeneratePrincipals
+ - jukart
+ - srichter
- >>> from z3c.sampledata.site import SampleIntIds
- >>> component.provideUtility(SampleIntIds(),
- ... ISampleDataPlugin,
- ... 'z3c.sampledata.intids')
- >>> manager.add('z3c.sampledata.intids',
- ... contextFrom='z3c.sampledata.site',
- ... )
- >>> baseContext = Folder()
- >>> infos = manager.generate(context=baseContext, param={'sitename':'intids'}, seed=None)
- >>> [info.name for info in infos]
- ['z3c.sampledata.site', 'z3c.sampledata.intids']
- >>> site = baseContext['intids']
- >>> site.getSiteManager()['default']['intid']
- <zope.app.intid.IntIds object at ...>
+It is also possible to use adapters to act as a data source.
-How do I create a sample data plugin?
--------------------------------------
+ >>> manager = Manager('manager', '')
-In order to create a sample data plugin, you only have to register a
-named utility that implements the interface
-`z3c.sampledata.interfaces.ISampleDataPlugin`.
+ >>> class IPrincipalDataSource(interface.Interface):
+ ... pass
-A plugin must provide :
+ >>> def principalDataFactory(object):
+ ... return [{'login':'jukart', 'password':'trakuj'},
+ ... {'login':'srichter', 'password':'rethcirs'}]
- - name
- - dependencies on other plugins (list of names of ISampleDataPlugin utilities)
- - schema for the parameters
+ >>> component.provideAdapter(
+ ... factory=principalDataFactory,
+ ... adapts=(ISampleDataPlugin,),
+ ... provides=IPrincipalDataSource,
+ ... name='testprincipals')
+ >>> manager.addSource('z3c.datasource.principals',
+ ... adapterName='testprincipals',
+ ... adaptTo=IPrincipalDataSource)
+ >>> manager.add('z3c.sampledata.principals',
+ ... dataSource='z3c.datasource.principals',
+ ... dependsOn=['z3c.sampledata.site',],
+ ... contextFrom='z3c.sampledata.site')
+
+ >>> infos = manager.generate(context=None, param={}, seed='something')
+ GenerateSite
+ GeneratePrincipals
+ - jukart
+ - srichter
+
+
How to setup configuration for the generator manager
----------------------------------------------------
@@ -217,8 +283,8 @@
</configure>
-Data Generator
-==============
+Data Sources
+============
This package implements the base functionality for data generators.
A data generator is used to provide the raw data for a sample generator.
Modified: z3c.sampledata/trunk/src/z3c/sampledata/browser/README.txt
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/browser/README.txt 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/browser/README.txt 2006-09-04 06:05:42 UTC (rev 69953)
@@ -10,14 +10,26 @@
>>> browser.addHeader('Authorization','Basic mgr:mgrpw')
>>> browser.handleErrors = False
+We select the sample data manager overview.
+
>>> browser.open('http://localhost/@@managesamples.html')
- >>> link = browser.getLink(text='samplemanager')
- >>> link.click()
+
+Now we select our samplemanager.
+
+ >>> browser.getLink(text='samplemanager').click()
>>> browser.url
'http://localhost/@@generatesample.html?manager=samplemanager'
+We are now in the configuration view for the selected manager.
+
>>> browser.getControl(name='generator.seed').value = 'lovely'
- >>> browser.getControl(name='z3c.principals.minPrincipals').value = '2'
- >>> browser.getControl(name='z3c.principals.maxPrincipals').value = '34'
+ >>> browser.getControl(
+ ... name='z3c.sampledata.site.sitename').value = 'testsite'
+ >>> browser.getControl(
+ ... name='z3c.sampledata.principals.minPrincipals').value = '2'
+ >>> browser.getControl(
+ ... name='z3c.sampledata.principals.maxPrincipals').value = '34'
+ >>> browser.getControl(
+ ... name='z3c.sampledata.principals.pauLocation').value = 'default/pau'
>>> browser.getControl('Generate').click()
Copied: z3c.sampledata/trunk/src/z3c/sampledata/browser/testmanager.zcml (from rev 69952, z3c.sampledata/branches/jukart-features/src/z3c/sampledata/browser/testmanager.zcml)
Modified: z3c.sampledata/trunk/src/z3c/sampledata/browser/views.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/browser/views.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/browser/views.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -77,13 +77,19 @@
def handle_generate_action(self, action, data):
managerName = self.request['manager']
manager = component.getUtility(ISampleManager, name=managerName)
+ generatorData = {}
for subform in self.subforms:
subform.update()
- errors = form.getWidgetsData(subform.widgets, subform.prefix, data)
- seed = None
- if 'seed' in data:
- seed = data['seed']
- self.workedOn = manager.generate(self.context, data, seed)
+ formData = {}
+ errors = form.getWidgetsData(subform.widgets,
+ subform.prefix,
+ formData)
+ generatorData[subform.prefix] = formData
+ gen = data.get('generator', {})
+ seed = gen.get('seed', None)
+ self.workedOn = manager.generate(context=self.context,
+ param=generatorData,
+ seed=seed)
self.workDone = True
self.actions = []
Modified: z3c.sampledata/trunk/src/z3c/sampledata/configure.zcml
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/configure.zcml 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/configure.zcml 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,18 +1,6 @@
<configure xmlns="http://namespaces.zope.org/zope">
- <utility
- name="z3c.site"
- factory="z3c.sampledata.site.SampleSite"
- provides="z3c.sampledata.interfaces.ISampleDataPlugin"
- />
-
- <utility
- name="z3c.principals"
- factory="z3c.sampledata.principal.SamplePrincipals"
- provides="z3c.sampledata.interfaces.ISampleDataPlugin"
- />
-
- <include file="site.zcml" />
+ <include package=".generator" />
<include package=".browser" />
</configure>
Modified: z3c.sampledata/trunk/src/z3c/sampledata/ftesting.zcml
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/ftesting.zcml 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/ftesting.zcml 2006-09-04 06:05:42 UTC (rev 69953)
@@ -21,49 +21,20 @@
<include package="z3c.sampledata"/>
<role id="zope.Anonymous" title="Everybody"
- description="All users have this role implicitly" />
+ description="All users have this role implicitly" />
<role id="zope.Manager" title="Site Manager" />
<grantAll role="zope.Manager" />
+
<principal
- id="zope.manager"
- title="Administrator"
- login="mgr"
- password="mgrpw" />
+ id="zope.manager"
+ title="Administrator"
+ login="mgr"
+ password="mgrpw" />
<grant
- role="zope.Manager"
- principal="zope.manager"
- />
-
- <unauthenticatedPrincipal
- id="zope.anybody"
- title="Unauthenticated User" />
+ role="zope.Manager"
+ principal="zope.manager"
+ />
- <unauthenticatedGroup
- id="zope.Anybody"
- title="Unauthenticated Users"
- />
+ <include package="z3c.sampledata.browser" file="testmanager.zcml" />
- <authenticatedGroup
- id="zope.Authenticated"
- title="Authenticated Users"
- />
-
- <everybodyGroup
- id="zope.Everybody"
- title="All Users"
- />
-
- <grant permission="zope.View"
- role="zope.Anonymous" />
- <grant permission="zope.app.dublincore.view"
- role="zope.Anonymous" />
-
- <SampleManager
- name="samplemanager"
- >
- <generator
- name="z3c.principals"
- />
- </SampleManager>
-
</configure>
Modified: z3c.sampledata/trunk/src/z3c/sampledata/ftests.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/ftests.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/ftests.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,5 +1,7 @@
import unittest
+from zope import interface
+
import zope.event
from zope.lifecycleevent import ObjectCreatedEvent
@@ -13,6 +15,15 @@
functional.defineLayer('TestLayer', 'ftesting.zcml')
+class IPrincipalDataSource(interface.Interface):
+ pass
+
+def principalDataFactory(object):
+ return [{'login':'jukart', 'password':'trakuj'},
+ {'login':'srichter', 'password':'rethcirs'}]
+
+
+
def setUp(test):
site = functional.getRootFolder()
sm = site.getSiteManager()
Copied: z3c.sampledata/trunk/src/z3c/sampledata/generator (from rev 69952, z3c.sampledata/branches/jukart-features/src/z3c/sampledata/generator)
Modified: z3c.sampledata/trunk/src/z3c/sampledata/interfaces.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/interfaces.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/interfaces.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -12,7 +12,7 @@
#
###############################################################################
"""
-$Id$
+$Id: $
"""
import zope.interface
@@ -30,21 +30,19 @@
dependencies by these names.
"""
- name = zope.schema.Id(title=u"Sample data generator name")
-
dependencies = zope.schema.List(
title=u"A list of dependenies",
value_type=zope.schema.Id(title=u"Sample data generator name"),
description=u"""
A list of names of sample data generators this one depends on.
""")
-
+
schema = zope.schema.InterfaceField(
title=u"Parameters",
description=u"The schema which provides the parameters.",
)
- def generate(app, param={}, seed=None):
+ def generate(context, param={}, dataSource=None, seed=None):
"""Generate sample data of this plugin.
This method assumes the sample data this plugin depends on has
@@ -63,11 +61,23 @@
description = _(u'The unique name of the sample manager'),
)
- def add(generator, dependsOn=[], contextFrom=None):
+ def addSource(name, data):
+ """Add a new data source to the manager.
+
+ A data source can be assigned to generator plugins.
+ """
+
+ def add(generator,
+ param={},
+ dataSource=None,
+ dependsOn=[],
+ contextFrom=None):
"""Add a generator to the manager.
generator:
The name of a utility providing 'ISampleDataPlugin'.
+ dataSource
+ The name of the data source for the generator.
dependsOn:
The names of generators this generator depends on.
This is used in addition to the dependencies defined in the
@@ -90,6 +100,12 @@
Returns a dict with names of plugins run as keys and CPU times as
values.
+
+ context:
+ The context to be used to generate the sample data.
+ param:
+ A mapping containing the parameters for the generator plugins.
+ The key is the name of the plugin.
"""
Modified: z3c.sampledata/trunk/src/z3c/sampledata/manager.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/manager.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/manager.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -33,14 +33,28 @@
self.name = name
self.seed = seed
self.generators = {}
+ self.sources = {}
- def add(self, generator, dependsOn=[], contextFrom=None):
+ def addSource(self,
+ name,
+ data=None,
+ adaptTo=None,
+ adapterName=u''):
+ self.sources[name] = (data, adaptTo, adapterName)
+
+ def add(self,
+ generator,
+ param={},
+ dataSource=None,
+ dependsOn=[],
+ contextFrom=None):
info = self.generators.setdefault(generator, {})
+ info['param'] = param
+ info['dataSource'] = dataSource
info['dependsOn'] = dependsOn
info['contextFrom'] = contextFrom
def orderedPlugins(self):
-
# status is a dict plugin names as keys and statuses as values.
# Statuses can be as follows:
#
@@ -75,6 +89,8 @@
pluginInfo = self.generators[name]
info.addDependents(pluginInfo['dependsOn'])
info.contextFrom = pluginInfo['contextFrom']
+ info.param = pluginInfo['param']
+ info.dataSource = pluginInfo['dataSource']
if info.contextFrom is not None:
info.addDependents([info.contextFrom])
generator = component.getUtility(ISampleDataPlugin, name)
@@ -93,7 +109,7 @@
def generate(self, context=None, param={}, seed=None):
plugins = self.orderedPlugins()
-
+
# contextFrom contains the return values of the plugins
contextFrom = {}
@@ -102,7 +118,21 @@
if info.contextFrom is not None:
genContext = contextFrom[info.contextFrom]
start = time.clock()
- contextFrom[info.name] = info.generator.generate(genContext, param, seed)
+ data, adapterInterface, adapterName = \
+ self.sources.get(info.dataSource, (None, None, None))
+ if data is None and adapterInterface is not None:
+ data = component.getAdapter(info.generator,
+ adapterInterface,
+ name=adapterName)
+ generatorParam = param.get(info.name, None)
+ if generatorParam is None:
+ generatorParam = info.param
+
+ contextFrom[info.name] = info.generator.generate(
+ context=genContext,
+ param=generatorParam,
+ dataSource=data,
+ seed=seed)
info.time = time.clock() - start
return plugins
@@ -111,6 +141,8 @@
class PluginInfo(object):
def __init__(self, name):
self.name = name
+ self.param = {}
+ self.dataSource = None
self.dependencies = []
self.contextFrom = None
self.generator = None
Modified: z3c.sampledata/trunk/src/z3c/sampledata/meta.zcml
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/meta.zcml 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/meta.zcml 2006-09-04 06:05:42 UTC (rev 69953)
@@ -15,6 +15,11 @@
schema=".metadirectives.IGeneratorSubDirective"
/>
+ <meta:subdirective
+ name="datasource"
+ schema=".metadirectives.IDataSourceSubDirective"
+ />
+
</meta:complexDirective>
</meta:directives>
Modified: z3c.sampledata/trunk/src/z3c/sampledata/metaconfigure.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/metaconfigure.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/metaconfigure.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -11,12 +11,26 @@
self.manager = Manager(name, seed)
utility(_context, ISampleManager, component=self.manager, name=name)
- def generator(self, _context, name, dependsOn=None, contextFrom=None):
+ def generator(self, _context,
+ name,
+ dependsOn=None,
+ contextFrom=None,
+ dataSource=None):
dependencies = []
if dependsOn is not None:
- dependencies = dependsOn.split(' ')
- self.manager.add(name, dependencies, contextFrom)
+ dependencies = dependsOn.split()
+ self.manager.add(name,
+ dependsOn=dependencies,
+ contextFrom=contextFrom,
+ dataSource=dataSource)
+ def datasource(self, _context, name, adapterInterface, adapterName=u''):
+ self.manager.addSource(name,
+ data=[],
+ adaptTo=adapterInterface,
+ adapterName=adapterName)
+
+
def __call__(self):
return
Modified: z3c.sampledata/trunk/src/z3c/sampledata/metadirectives.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/metadirectives.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/metadirectives.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,5 +1,6 @@
from zope import interface
from zope import schema
+from zope.configuration.fields import GlobalInterface
from z3c.sampledata import _
@@ -44,3 +45,32 @@
required = False,
)
+ dataSource = schema.TextLine(
+ title = _(u"Datasource"),
+ description = _(u'The data source for the generator'),
+ default = u'',
+ required = False,
+ )
+
+
+class IDataSourceSubDirective(interface.Interface):
+ """Parameters for the 'datasource' subdirective."""
+
+ name = schema.TextLine(
+ title = _(u"Name"),
+ description = _(u'The unique name of the datasource'),
+ )
+
+ adapterInterface = GlobalInterface(
+ title = _(u"Interface"),
+ description = _(u'The interface to adapt to'),
+ required = True
+ )
+
+ adapterName = schema.TextLine(
+ title = _(u"Adapter"),
+ description = _(u'The name of the adapter providing the data.'),
+ required = False,
+ default = u''
+ )
+
Deleted: z3c.sampledata/trunk/src/z3c/sampledata/principal.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/principal.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/principal.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,129 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Lovely Systems and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Sample generator for principals
-
-$Id$
-"""
-__docformat__ = "reStructuredText"
-
-import zope.interface
-import zope.component
-import zope.event
-import zope.schema
-import zope.lifecycleevent
-from zope.interface import implements
-from zope.security.proxy import removeSecurityProxy
-from zope.app.security.interfaces import IAuthentication
-from zope.app.authentication import principalfolder
-from zope.app.component import hooks
-
-from interfaces import ISampleDataPlugin
-
-from data import DataGenerator
-
-from z3c.sampledata import _
-
-
-class ISamplePrincipalParameters(zope.interface.Interface):
- """The parameters for the sample principal generator."""
-
- minPrincipals = zope.schema.Int(
- title = _(u'Min principals'),
- description = _(u'Create at least this number of pricipals from'
- u' the principals file.\n'
- u'This has higher priority than maxPricipals.\n'
- u'-1 : create all principals from the file.'
- ),
- required = False,
- default = -1,
- )
-
- maxPrincipals = zope.schema.Int(
- title = _(u'Max principals'),
- description = _(u'The maximum number of principals to create.'),
- required = False,
- default = -1,
- )
-
- pauLocation = zope.schema.TextLine(
- title = _(u'PAU location'),
- description = _(u'Path to the PAU inside the site manager.'),
- required = False,
- default = u'default/pau',
- )
-
-
-class SamplePrincipals(object):
-
- implements(ISampleDataPlugin)
-
- name = 'lovely.principals'
- dependencies = []
- schema = ISamplePrincipalParameters
-
- maxPrincipals = None
- minPrincipals = None
-
- def generate(self, context, param={}, seed=None):
- """Generate sample pricipals"""
- self.minPrincipals = int(param['minPrincipals'])
- if self.minPrincipals<0:
- self.minPrincipals = None
- self.maxPrincipals = int(param['maxPrincipals'])
- if self.maxPrincipals<0:
- self.maxPrincipals = None
- originalSite = hooks.getSite()
- hooks.setSite(context)
- sm = zope.component.getSiteManager(context)
- self.pau = sm
- for loc in param['pauLocation'].split('/'):
- self.pau = self.pau[loc]
-
- numCreated = 0
- self.logins = []
- generator = DataGenerator(str(seed) + self.name)
- principals = generator.readCSV('testprincipals.txt')
- for info in principals:
- if ( self.maxPrincipals is not None
- and numCreated>=self.maxPrincipals):
- break
- login = unicode(info[1])
- if login in self.logins:
- # ignore duplicate principals
- continue
- self._createPrincipal(info)
- numCreated+=1
-
- if ( self.minPrincipals is not None
- and numCreated<self.minPrincipals):
- for i in range(self.minPrincipals-numCreated):
- info = ['group','login%i'%i,'name%i'%i,'%i'%i]
- self._createPrincipal(info)
-
- hooks.setSite(originalSite)
-
- def _createPrincipal(self, info):
- login = unicode(info[1])
- self.logins.append(login)
- if login in self.pau['members']:
- return
- groupId = unicode(info[0])
- name = unicode(info[2])
- password = unicode(info[3])
- principal = principalfolder.InternalPrincipal(login,
- password, name, passwordManagerName="SHA1")
- zope.event.notify(
- zope.lifecycleevent.ObjectCreatedEvent(principal))
- self.pau['members'][login] = principal
-
Deleted: z3c.sampledata/trunk/src/z3c/sampledata/principal.txt
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/principal.txt 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/principal.txt 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,64 +0,0 @@
-================================
-Principal Sample Data Generation
-================================
-
-This gerator creates principals from a CSV file.
-
- >>> from z3c.sampledata.principal import SamplePrincipals
- >>> generator = SamplePrincipals()
-
-Before we can use the generator we need to setup principal authentication.
-
- >>> import zope.event
- >>> from zope.lifecycleevent import ObjectCreatedEvent
- >>> from zope.app.authentication.interfaces import IAuthenticatorPlugin
- >>> from zope.app.security.interfaces import IAuthentication
- >>> from zope.app.authentication.authentication import PluggableAuthentication
- >>> from zope.app.authentication.principalfolder import PrincipalFolder
-
- >>> sm = root.getSiteManager()
- >>> default = sm['default']
- >>> pau = PluggableAuthentication()
- >>> zope.event.notify(ObjectCreatedEvent(pau))
- >>> default['pau'] = pau
- >>> sm.registerUtility(pau, IAuthentication)
- >>> # we can do this always
- >>> pau.credentialsPlugins = ('Session Credentials', )
- >>> pfNames = (u'members',)
- >>> pau.authenticatorPlugins = pfNames
- >>> for name in pfNames:
- ... if name in pau:
- ... continue
- ... pf = PrincipalFolder(name +'.')
- ... default['pau'][name] = pf
- ... sm.registerUtility(pf, IAuthenticatorPlugin, name)
-
-Now that everything is set up we can generate the principals for the root
-object.
-
-We can define a maximum number of users.
-
- >>> generator.generate(root, param={'minPrincipals':-1,
- ... 'maxPrincipals': 2,
- ... 'pauLocation':'default/pau'})
- >>> len(pau['members'])
- 2
-
-With both parameter set to -1 all members from "testprincipals.txt" are generated.
-
- >>> generator.generate(root, param={'minPrincipals':-1,
- ... 'maxPrincipals':-1,
- ... 'pauLocation':'default/pau'})
- >>> principal = pau['members']['batlogg']
- >>> principal.title
- u'Jodok Batlogg'
-
-We can define a minimum number of users.
-
- >>> numMembers = len(pau['members'])
- >>> generator.generate(root, param={'minPrincipals': numMembers+10,
- ... 'maxPrincipals':-1,
- ... 'pauLocation':'default/pau'})
- >>> len(pau['members']) == numMembers+10
- True
-
Deleted: z3c.sampledata/trunk/src/z3c/sampledata/site.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/site.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/site.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,94 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Lovely Systems and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Sample generator for site generation.
-
-Contains some general purpose generators related to site specific data.
-
-$Id$
-"""
-__docformat__ = "reStructuredText"
-
-import zope.interface
-import zope.component
-import zope.event
-import zope.schema
-import zope.lifecycleevent
-from zope.interface import implements
-from zope.app.component import hooks
-
-from zope.app.component.site import LocalSiteManager
-from zope.app.folder.folder import Folder
-from zope.app.intid import IntIds
-from zope.app.intid.interfaces import IIntIds
-
-from interfaces import ISampleDataPlugin
-
-from z3c.sampledata import _
-
-
-class ISampleSiteParameters(zope.interface.Interface):
- """The parameters for the site creation."""
-
- sitename = zope.schema.TextLine(
- title = _(u'Sitename'),
- required = True,
- default = u'',
- )
-
-
-class SampleSite(object):
-
- implements(ISampleDataPlugin)
-
- name = 'lovely.sampledata.site'
- dependencies = []
- schema = ISampleSiteParameters
-
- def generate(self, context, param={}, seed=None):
- """Generate the site inside context"""
- name = param['sitename']
- folder = Folder()
- zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(folder))
- context[name] = folder
- sm = LocalSiteManager(folder)
- folder.setSiteManager(sm)
- hooks.setSite(folder)
- return folder
-
-
-class SampleIntIds(object):
-
- implements(ISampleDataPlugin)
-
- name = 'lovely.sampledata.intids'
- dependencies = []
- schema = None
-
- def generate(self, context, param={}, seed=None):
- """Generate an IntId utility inside context.
-
- 'context' must be a site manager.
- """
- sm = context.getSiteManager()
- default = sm['default']
-
- if 'intid' not in default:
- intid = IntIds()
- zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(intid))
- default['intid'] = intid
- sm.registerUtility(intid, IIntIds)
- return intid
- else:
- return default['intid']
-
Deleted: z3c.sampledata/trunk/src/z3c/sampledata/site.zcml
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/site.zcml 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/site.zcml 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,40 +0,0 @@
-<configure xmlns="http://namespaces.zope.org/zope">
-
- <configure
- xmlns:zcml="http://namespaces.zope.org/zcml"
- zcml:condition="have devmode">
-
- <!-- This is a configuration for the testing environment -->
-
- <utility
- factory=".site.SampleSite"
- provides="z3c.sampledata.interfaces.ISampleDataPlugin"
- name="z3c.sampledata.site"
- />
-
- <utility
- factory=".site.SampleIntIds"
- provides="z3c.sampledata.interfaces.ISampleDataPlugin"
- name="z3c.sampledata.intids"
- />
-
- <utility
- factory=".principal.SamplePrincipals"
- provides="z3c.sampledata.interfaces.ISampleDataPlugin"
- name="z3c.sampledata.principals"
- />
-
- <SampleManager
- name="Site with intid utility"
- >
- <generator name="z3c.sampledata.site" />
- <generator
- name="z3c.sampledata.intids"
- dependsOn="z3c.sampledata.site"
- contextFrom="z3c.sampledata.site" />
- </SampleManager>
-
- </configure>
-
-</configure>
-
Deleted: z3c.sampledata/trunk/src/z3c/sampledata/testprincipals.txt
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/testprincipals.txt 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/testprincipals.txt 2006-09-04 06:05:42 UTC (rev 69953)
@@ -1,6 +0,0 @@
-group.Administrator,batlogg,Jodok Batlogg,bJB
-group.Administrator,jukart,Juergen Kartnaller,jJK
-group.Administrator,dobee,Bernd Dorn,dBD
-group.Administrator,srichter,Stephan Richter,sSR
-group.Administrator,byzo,Michael Breidenbruecker,bMB
-group.Administrator,oli,Oliver Ruhm,oOR
Modified: z3c.sampledata/trunk/src/z3c/sampledata/tests.py
===================================================================
--- z3c.sampledata/trunk/src/z3c/sampledata/tests.py 2006-09-03 18:51:47 UTC (rev 69952)
+++ z3c.sampledata/trunk/src/z3c/sampledata/tests.py 2006-09-04 06:05:42 UTC (rev 69953)
@@ -33,17 +33,29 @@
def test_suite():
-
+
return unittest.TestSuite(
(
DocFileSuite('README.txt',
optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
),
- DocFileSuite('principal.txt',
+ DocFileSuite('generator/site.txt',
setUp=setUp, tearDown=tearDown,
optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
),
+ DocFileSuite('generator/intids.txt',
+ setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
+ DocFileSuite('generator/pau.txt',
+ setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
+ DocFileSuite('generator/principals.txt',
+ setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
))
-
+
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')
More information about the Checkins
mailing list