[Checkins] SVN: Products.GenericSetup/trunk/Products/GenericSetup/ merge -r89413:89846 from the ra-depends-tag branch
Rob Miller
ra at burningman.com
Thu Aug 14 19:47:12 EDT 2008
Log message for revision 89847:
merge -r89413:89846 from the ra-depends-tag branch
(svn://svn.zope.org/repos/main/Products.GenericSetup/branches/ra-depends-tag)
adds <genericsetup:upgradeDepends> ZCML tag
Changed:
U Products.GenericSetup/trunk/Products/GenericSetup/meta.zcml
U Products.GenericSetup/trunk/Products/GenericSetup/tests/test_zcml.py
U Products.GenericSetup/trunk/Products/GenericSetup/upgrade.py
U Products.GenericSetup/trunk/Products/GenericSetup/zcml.py
-=-
Modified: Products.GenericSetup/trunk/Products/GenericSetup/meta.zcml
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/meta.zcml 2008-08-14 22:24:49 UTC (rev 89846)
+++ Products.GenericSetup/trunk/Products/GenericSetup/meta.zcml 2008-08-14 23:47:11 UTC (rev 89847)
@@ -15,17 +15,16 @@
schema=".zcml.IExportStepDirective"
handler=".zcml.exportStep"
/>
+
<meta:complexDirective
name="importStep"
schema=".zcml.IImportStepDirective"
handler=".zcml.importStep"
>
-
<meta:subdirective
name="depends"
schema=".zcml.IImportStepDependsDirective"
/>
-
</meta:complexDirective>
<meta:directive
@@ -34,17 +33,25 @@
handler=".zcml.upgradeStep"
/>
+ <meta:directive
+ name="upgradeDepends"
+ schema=".zcml.IUpgradeDependsDirective"
+ handler=".zcml.upgradeDepends"
+ />
+
<meta:complexDirective
name="upgradeSteps"
schema=".zcml.IUpgradeStepsDirective"
handler=".zcml.upgradeSteps"
>
-
<meta:subdirective
- name="upgradeStep"
- schema=".zcml.IUpgradeStepsStepSubDirective"
- />
-
+ name="upgradeStep"
+ schema=".zcml.IUpgradeStepsStepSubDirective"
+ />
+ <meta:subdirective
+ name="upgradeDepends"
+ schema=".zcml.IUpgradeDependsSubDirective"
+ />
</meta:complexDirective>
Modified: Products.GenericSetup/trunk/Products/GenericSetup/tests/test_zcml.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/tests/test_zcml.py 2008-08-14 22:24:49 UTC (rev 89846)
+++ Products.GenericSetup/trunk/Products/GenericSetup/tests/test_zcml.py 2008-08-14 23:47:11 UTC (rev 89847)
@@ -145,7 +145,7 @@
def test_registerUpgradeStep(self):
"""
- Use the genericsetup:upgradeStep directive::
+ Use the standalone genericsetup:upgradeStep directive::
>>> import Products.GenericSetup
>>> from Products.Five import zcml
@@ -187,7 +187,53 @@
>>> cleanUp()
"""
+def test_registerUpgradeDepends(self):
+ """
+ Use the standalone genericsetup:upgradeDepends directive::
+ >>> import Products.GenericSetup
+ >>> from Products.Five import zcml
+ >>> configure_zcml = '''
+ ... <configure
+ ... xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
+ ... i18n_domain="foo">
+ ... <genericsetup:upgradeDepends
+ ... title="Upgrade Foo Product"
+ ... description="Upgrades Foo from 1.0 to 1.1."
+ ... source="1.0"
+ ... destination="1.1"
+ ... sortkey="1"
+ ... profile="default"
+ ... />
+ ... </configure>'''
+ >>> zcml.load_config('meta.zcml', Products.GenericSetup)
+ >>> zcml.load_string(configure_zcml)
+
+ Make sure the upgrade step is registered correctly::
+
+ >>> from Products.GenericSetup.upgrade import _upgrade_registry
+ >>> profile_steps = _upgrade_registry.getUpgradeStepsForProfile('default')
+ >>> keys = profile_steps.keys()
+ >>> len(keys)
+ 1
+ >>> step = profile_steps[keys[0]]
+ >>> step.source
+ ('1', '0')
+ >>> step.dest
+ ('1', '1')
+ >>> step.import_steps
+ []
+ >>> step.run_deps
+ False
+ >>> step.purge
+ False
+
+ Clean up and make sure the cleanup works::
+
+ >>> from zope.testing.cleanup import cleanUp
+ >>> cleanUp()
+ """
+
def test_registerUpgradeSteps(self):
"""
Use the nested genericsetup:upgradeSteps directive::
@@ -231,6 +277,13 @@
... description="Does another Bar upgrade thing."
... handler="Products.GenericSetup.tests.test_zcml.c_dummy_upgrade_handler"
... />
+ ... <genericsetup:upgradeDepends
+ ... title="Bar Upgrade dependency profile import steps"
+ ... description="Re-imports steps from the profile"
+ ... import_steps="baz bat"
+ ... run_deps="True"
+ ... purge="True"
+ ... />
... </genericsetup:upgradeSteps>
... </configure>'''
>>> zcml.load_config('meta.zcml', Products.GenericSetup)
@@ -249,11 +302,11 @@
>>> type(steps)
<type 'list'>
>>> len(steps)
- 2
- >>> step1, step2 = steps
- >>> step1['source'] == step2['source'] == ('1', '0')
+ 3
+ >>> step1, step2, step3 = steps
+ >>> step1['source'] == step2['source'] == step3['source'] == ('1', '0')
True
- >>> step1['dest'] == step2['dest'] == ('1', '1')
+ >>> step1['dest'] == step2['dest'] == step3['dest'] == ('1', '1')
True
>>> step1['step'].handler
<function b_dummy_upgrade_handler at ...>
@@ -263,6 +316,12 @@
<function c_dummy_upgrade_handler at ...>
>>> step2['title']
u'Bar Upgrade Step 2'
+ >>> step3['step'].import_steps
+ [u'baz', u'bat']
+ >>> step3['step'].run_deps
+ True
+ >>> step3['step'].purge
+ True
First one listed should be second in the registry due to sortkey:
Modified: Products.GenericSetup/trunk/Products/GenericSetup/upgrade.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/upgrade.py 2008-08-14 22:24:49 UTC (rev 89846)
+++ Products.GenericSetup/trunk/Products/GenericSetup/upgrade.py 2008-08-14 23:47:11 UTC (rev 89847)
@@ -78,11 +78,12 @@
_upgrade_registry = UpgradeRegistry()
-class UpgradeStep(object):
- """A step to upgrade a component.
+class UpgradeEntity(object):
"""
- def __init__(self, title, profile, source, dest, desc, handler,
- checker=None, sortkey=0):
+ Base class for actions to be taken during an upgrade process.
+ """
+ def __init__(self, title, profile, source, dest, desc, checker=None,
+ sortkey=0):
self.id = str(abs(hash('%s%s%s%s' % (title, source, dest, sortkey))))
self.title = title
if source == '*':
@@ -96,7 +97,6 @@
dest = tuple(dest.split('.'))
self.dest = dest
self.description = desc
- self.handler = handler
self.checker = checker
self.sortkey = sortkey
self.profile = profile
@@ -125,9 +125,47 @@
else:
return checker(tool)
+
+class UpgradeStep(UpgradeEntity):
+ """A step to upgrade a component.
+ """
+ def __init__(self, title, profile, source, dest, desc, handler,
+ checker=None, sortkey=0):
+ super(UpgradeStep, self).__init__(title, profile, source, dest,
+ desc, checker, sortkey)
+ self.handler = handler
+
def doStep(self, tool):
self.handler(tool)
+
+class UpgradeDepends(UpgradeEntity):
+ """A specialized upgrade step that re-runs a particular import
+ step from the profile.
+ """
+ def __init__(self, title, profile, source, dest, desc, import_steps=[],
+ run_deps=False, purge=False, checker=None, sortkey=0):
+ super(UpgradeDepends, self).__init__(title, profile, source, dest,
+ desc, checker, sortkey)
+ self.import_steps = import_steps
+ self.run_deps = run_deps
+ self.purge = purge
+
+ def doStep(self, tool):
+ profile_id = 'profile-%s' % self.profile
+ if self.import_steps:
+ for step in self.import_steps:
+ tool.runImportStepFromProfile(profile_id, step,
+ run_dependencies=self.run_deps,
+ purge_old=self.purge)
+ else:
+ # if no steps are specified we assume we want to reimport
+ # the entire profile
+ ign_deps = not self.run_deps
+ tool.runAllImportStepsFromProfile(profile_id,
+ purge_old=self.purge,
+ ignore_dependencies=ign_deps)
+
def _registerUpgradeStep(step):
profile_id = step.profile
profile_steps = _upgrade_registry.getUpgradeStepsForProfile(profile_id)
Modified: Products.GenericSetup/trunk/Products/GenericSetup/zcml.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/zcml.py 2008-08-14 22:24:49 UTC (rev 89846)
+++ Products.GenericSetup/trunk/Products/GenericSetup/zcml.py 2008-08-14 23:47:11 UTC (rev 89847)
@@ -196,7 +196,9 @@
#### genericsetup:upgradeStep
import zope.schema
+import zope.configuration
from upgrade import UpgradeStep
+from upgrade import UpgradeDepends
from upgrade import _registerUpgradeStep
from upgrade import _registerNestedUpgradeStep
@@ -242,10 +244,47 @@
class IUpgradeStepDirective(IUpgradeStepsDirective, IUpgradeStepsStepSubDirective):
"""
- Define multiple upgrade steps without repeating all of the parameters
+ Define a standalone upgrade step
"""
+class IUpgradeDependsSubDirective(Interface):
+ """
+ Define a profile import step dependency of an upgrade process
+ (i.e. a profile step that should be reimported when performing an
+ upgrade due to a profile change.
+ """
+ title = zope.schema.TextLine(
+ title=u"Title",
+ required=True,
+ )
+ description = zope.schema.TextLine(
+ title=u"Upgrade dependency description",
+ required=False,
+ )
+
+ import_steps = zope.configuration.fields.Tokens(
+ title=u"Import steps to rerun",
+ required=False,
+ value_type=zope.schema.TextLine(title=u"Import step"),
+ )
+
+ run_deps = zope.schema.Bool(
+ title=u"Run import step dependencies?",
+ required=False,
+ )
+
+ purge = zope.schema.Bool(
+ title=u"Import steps w/ purge=True?",
+ required=False,
+ )
+
+class IUpgradeDependsDirective(IUpgradeStepsDirective,
+ IUpgradeDependsSubDirective):
+ """
+ Define a standalone upgrade profile import step dependency
+ """
+
def upgradeStep(_context, title, profile, handler, description=None, source='*',
destination='*', sortkey=0, checker=None):
step = UpgradeStep(title, profile, source, destination, description, handler,
@@ -256,6 +295,19 @@
args = (step,),
)
+def upgradeDepends(_context, title, profile, description, import_steps=[],
+ source='*', destination='*', run_deps=False, purge=False,
+ checker=None, sortkey=0):
+ step = UpgradeDepends(title, profile, source, destination, description,
+ import_steps, run_deps, purge, checker, sortkey)
+ _context.action(
+ discriminator = ('upgradeDepends', source, destination, str(import_steps),
+ checker, sortkey),
+ callable = _registerUpgradeStep,
+ args = (step,),
+ )
+
+
class upgradeSteps(object):
"""
Allows nested upgrade steps.
@@ -269,6 +321,7 @@
def upgradeStep(self, _context, title, handler,
description=None, checker=None):
+ """ nested upgradeStep directive """
step = UpgradeStep(title, self.profile, self.source, self.dest,
description, handler, checker, self.sortkey)
if self.id is None:
@@ -281,6 +334,22 @@
args = (step, self.id),
)
+ def upgradeDepends(self, _context, title, description=None, import_steps=[],
+ run_deps=False, purge=False, checker=None):
+ """ nested upgradeDepends directive """
+ step = UpgradeDepends(title, self.profile, self.source, self.dest,
+ description, import_steps, run_deps, purge,
+ checker, self.sortkey)
+ if self.id is None:
+ self.id = str(abs(hash('%s%s%s%s' % (title, self.source, self.dest,
+ self.sortkey))))
+ _context.action(
+ discriminator = ('upgradeDepends', self.source, self.dest,
+ str(import_steps), self.sortkey),
+ callable = _registerNestedUpgradeStep,
+ args = (step, self.id)
+ )
+
def __call__(self):
return ()
More information about the Checkins
mailing list