diff --git a/last_commit.txt b/last_commit.txt index ca2fbef167..2e5f05f114 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,162 +1,956 @@ -Repository: plone.app.robotframework +Repository: plone.app.iterate Branch: refs/heads/master -Date: 2016-02-25T23:57:18+01:00 -Author: Maurits van Rees (mauritsvanrees) -Commit: https://github.com/plone/plone.app.robotframework/commit/117f780e81a642673a24e67478e792f538e5e10e +Date: 2016-02-26T14:57:59+01:00 +Author: Markus Hilbert (iham) +Commit: https://github.com/plone/plone.app.iterate/commit/9b79455de7ac6576f05d2947cb0d8d06eda6f7cf -Do not require argparse, decorator, and simplejson in Python 2.7. - -Only lower. +Added profile id "default" and deprecated id "plone.app.iterate". Files changed: -M CHANGES.txt +A plone/app/iterate/setuphandlers.py +M CHANGES.rst +M plone/app/iterate/configure.zcml +M plone/app/iterate/testing.py M setup.py -diff --git a/CHANGES.txt b/CHANGES.txt -index ba785e2..c5c720a 100644 ---- a/CHANGES.txt -+++ b/CHANGES.txt -@@ -4,9 +4,14 @@ Changelog - 0.9.15 (unreleased) - ------------------- +diff --git a/CHANGES.rst b/CHANGES.rst +index c2b6c42..5ec2bbc 100644 +--- a/CHANGES.rst ++++ b/CHANGES.rst +@@ -8,10 +8,26 @@ New: + + - *add item here* + ++- plone.app.iterate depends on GenericSetup >= 1.8.2 ++ for using a post_handler on registerProfile ++ [iham] ++ ++- Added naming of default GenericSetup profile as "default". ++ "plone.app.iterate" also exists to keep compatibility. ++ [iham] ++ ++- Added deprecation warning to GS profile "plone.app.iterate" ++ [iham] ++ + Fixes: + + - *add item here* + ++- No need to register as Zope2 Product anymore. ++ [iham] ++ ++- Some minor pep8 cleanup. ++ [iham] + + 3.1.4 (2015-11-16) + ------------------ +diff --git a/plone/app/iterate/configure.zcml b/plone/app/iterate/configure.zcml +index f4b5074..282a5e2 100644 +--- a/plone/app/iterate/configure.zcml ++++ b/plone/app/iterate/configure.zcml +@@ -5,79 +5,92 @@ + xmlns:zcml="http://namespaces.zope.org/zcml" + i18n_domain="plone"> + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ + +- ++ ++ ++ ++ ++ + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ -+Fixes: + +diff --git a/plone/app/iterate/setuphandlers.py b/plone/app/iterate/setuphandlers.py +new file mode 100644 +index 0000000..595e04f +--- /dev/null ++++ b/plone/app/iterate/setuphandlers.py +@@ -0,0 +1,12 @@ ++# -*- coding: utf-8 -*- ++"""Deprecation warning for plone.app.iterate:plone.app.iterate profile.""" + -+- Do not require argparse, decorator, and simplejson in Python 2.7, -+ only lower. [maurits] ++import warnings + - - Replace import of ``zope.testing.testrunner`` with ``zope.testrunner``. - [thet] -- + ++def deprecate_profile(tool): ++ """Deprecation profile plone.app.iterate.""" ++ warnings.warn( ++ 'The profile with id "plone.app.iterate" was renamed to "default".', ++ DeprecationWarning ++ ) +diff --git a/plone/app/iterate/testing.py b/plone/app/iterate/testing.py +index 7668d38..5d6676b 100644 +--- a/plone/app/iterate/testing.py ++++ b/plone/app/iterate/testing.py +@@ -1,3 +1,4 @@ ++"""Testing setup for integration and functional tests.""" + # -*- coding: utf-8 -*- + from plone.app.contenttypes.testing import PloneAppContenttypes + from plone.app.testing import PLONE_FIXTURE +@@ -8,37 +9,39 @@ + from plone.testing import z2 + + +-admin = { ++ADMIN = { + 'id': 'admin', + 'password': 'secret', + 'roles': ['Manager'], + } +-editor = { ++EDITOR = { + 'id': 'editor', + 'password': 'secret', + 'roles': ['Editor'], + } +-contributor = { ++CONTRIBUTOR = { + 'id': 'contributor', + 'password': 'secret', + 'roles': ['Contributor'], + } +-users_to_be_added = ( +- admin, +- editor, +- contributor, ++USERS_TO_BE_ADDED = ( ++ ADMIN, ++ EDITOR, ++ CONTRIBUTOR, + ) +-users_with_member_folder = ( +- editor, +- contributor, ++USERS_WITH_MEMBER_FOLDER = ( ++ EDITOR, ++ CONTRIBUTOR, + ) + + + class PloneAppIterateLayer(PloneSandboxLayer): ++ """Plone Sandbox Layer for plone.app.iterate.""" + + defaultBases = (PLONE_FIXTURE,) + + def setUpZope(self, app, configurationContext): ++ """Setup Zope with Addons.""" + import Products.ATContentTypes + self.loadZCML(package=Products.ATContentTypes) + z2.installProduct(app, 'Products.ATContentTypes') +@@ -50,19 +53,19 @@ def setUpZope(self, app, configurationContext): + + import plone.app.iterate + self.loadZCML(package=plone.app.iterate) +- z2.installProduct(app, 'plone.app.iterate') + + def setUpPloneSite(self, portal): ++ """Setup Plone Site with Addons.""" + # restore default workflow + applyProfile(portal, 'Products.CMFPlone:testfixture') + + # add default content + applyProfile(portal, 'Products.ATContentTypes:content') + +- applyProfile(portal, 'plone.app.iterate:plone.app.iterate') ++ applyProfile(portal, 'plone.app.iterate:default') + applyProfile(portal, 'plone.app.iterate:test') - 0.9.14 (2015-10-11) - ------------------- +- for user in users_to_be_added: ++ for user in USERS_TO_BE_ADDED: + portal.portal_membership.addMember( + user['id'], + user['password'], +@@ -70,7 +73,7 @@ def setUpPloneSite(self, portal): + [], + ) + +- for user in users_with_member_folder: ++ for user in USERS_WITH_MEMBER_FOLDER: + mtool = portal.portal_membership + if not mtool.getMemberareaCreationFlag(): + mtool.setMemberareaCreationFlag() +@@ -111,15 +114,20 @@ def setUpPloneSite(self, portal): + + + class DexPloneAppIterateLayer(PloneAppContenttypes): ++ """Dexterity based Plone Sandbox Layer for plone.app.iterate.""" ++ + def setUpZope(self, app, configurationContext): +- super(DexPloneAppIterateLayer, self).setUpZope(app, configurationContext) ++ """Setup Zope with Addons.""" ++ super(DexPloneAppIterateLayer, ++ self).setUpZope(app, configurationContext) ++ + import plone.app.iterate + self.loadZCML(package=plone.app.iterate) +- z2.installProduct(app, 'plone.app.iterate') + + def setUpPloneSite(self, portal): ++ """Setup Plone Site with Addons.""" + super(DexPloneAppIterateLayer, self).setUpPloneSite(portal) +- applyProfile(portal, 'plone.app.iterate:plone.app.iterate') ++ applyProfile(portal, 'plone.app.iterate:default') + + + PLONEAPPITERATEDEX_FIXTURE = DexPloneAppIterateLayer() diff --git a/setup.py b/setup.py -index 0bb1daa..b2f7511 100644 +index 99db45c..8b54414 100644 --- a/setup.py +++ b/setup.py -@@ -1,5 +1,6 @@ - from setuptools import setup - from setuptools import find_packages -+import sys - - version = '0.9.15.dev0' - -@@ -43,9 +44,7 @@ def indent(line): - 'Products.MailHost', - 'Products.PlonePAS', - 'Products.PluggableAuthService', -- 'argparse', - 'babel', -- 'decorator', # required by r.selenium2library on Python 2.6.x - 'five.globalrequest', - 'plone.app.testing', - 'plone.testing', -@@ -55,7 +54,6 @@ def indent(line): - 'robotsuite', # not a direct dependency, but required for convenience - 'selenium', - 'setuptools', -- 'simplejson', # required for SauceLabs-keywords on Python 2.6.x - 'zope.component', - 'zope.configuration', - 'zope.i18n', -@@ -63,6 +61,13 @@ def indent(line): - 'zope.testrunner', - ] - -+if sys.version_info < (2, 7): -+ install_requires.extend([ -+ 'argparse', -+ 'decorator', # required by r.selenium2library on Python 2.6.x -+ 'simplejson', # required for SauceLabs-keywords on Python 2.6.x -+ ]) -+ - test_requires = [ - 'plone.app.dexterity', - 'plone.app.textfield', +@@ -1,61 +1,70 @@ ++"""Setup plone.app.iterate.""" + from setuptools import setup, find_packages + +-version = '3.1.5.dev0' ++VERSION = '3.1.5.dev0' + +-setup(name='plone.app.iterate', +- version=version, +- description="check-out/check-in staging for Plone", +- long_description=open("README.rst").read() + "\n" + open("CHANGES.rst").read(), +- classifiers=[ +- "Environment :: Web Environment", +- "Framework :: Plone", +- "Framework :: Plone :: 5.0", +- "Framework :: Zope2", +- "License :: OSI Approved :: GNU General Public License (GPL)", +- "Operating System :: OS Independent", +- "Programming Language :: Python", +- "Programming Language :: Python :: 2.7", +- ], +- keywords='check-out check-in staging', +- author='Plone Foundation', +- author_email='plone-developers@lists.sourceforge.net', +- url='https://pypi.python.org/pypi/plone.app.iterate', +- license='GPL version 2', +- packages=find_packages(exclude=['ez_setup']), +- namespace_packages=['plone', 'plone.app'], +- include_package_data=True, +- zip_safe=False, +- extras_require=dict( +- test=[ +- 'plone.app.testing', +- 'plone.app.contenttypes' +- ] +- ), +- install_requires=[ +- 'setuptools', +- 'plone.locking', +- 'plone.memoize', +- 'zope.annotation', +- 'zope.component', +- 'zope.event', +- 'zope.i18nmessageid', +- 'zope.interface', +- 'zope.lifecycleevent', +- 'zope.schema', +- 'zope.viewlet', +- 'Acquisition', +- 'DateTime', +- 'Products.Archetypes', +- 'Products.CMFCore', +- 'Products.CMFEditions', +- 'Products.CMFPlacefulWorkflow', +- 'Products.DCWorkflow', +- 'Products.statusmessages', +- 'ZODB3', +- 'Zope2', +- ], +- entry_points=''' +- [z3c.autoinclude.plugin] +- target = plone +- ''', +- ) ++LONG_DESCRIPTION = ( ++ open('README.rst').read() + ++ '\n' + ++ open('CHANGES.rst').read() + ++ '\n') ++ ++setup( ++ name='plone.app.iterate', ++ version=VERSION, ++ description="check-out/check-in staging for Plone", ++ long_description=LONG_DESCRIPTION, ++ classifiers=[ ++ "Environment :: Web Environment", ++ "Framework :: Plone", ++ "Framework :: Plone :: 5.0", ++ "Framework :: Zope2", ++ "License :: OSI Approved :: GNU General Public License (GPL)", ++ "Operating System :: OS Independent", ++ "Programming Language :: Python", ++ "Programming Language :: Python :: 2.7", ++ ], ++ keywords='check-out check-in staging', ++ author='Plone Foundation', ++ author_email='plone-developers@lists.sourceforge.net', ++ url='https://pypi.python.org/pypi/plone.app.iterate', ++ license='GPL version 2', ++ packages=find_packages(exclude=['ez_setup']), ++ namespace_packages=['plone', 'plone.app'], ++ include_package_data=True, ++ zip_safe=False, ++ install_requires=[ ++ 'setuptools', ++ 'Products.GenericSetup>=1.8.2', ++ 'plone.locking', ++ 'plone.memoize', ++ 'zope.annotation', ++ 'zope.component', ++ 'zope.event', ++ 'zope.i18nmessageid', ++ 'zope.interface', ++ 'zope.lifecycleevent', ++ 'zope.schema', ++ 'zope.viewlet', ++ 'Acquisition', ++ 'DateTime', ++ 'Products.Archetypes', ++ 'Products.CMFCore', ++ 'Products.CMFEditions', ++ 'Products.CMFPlacefulWorkflow', ++ 'Products.DCWorkflow', ++ 'Products.statusmessages', ++ 'ZODB3', ++ 'Zope2', ++ ], ++ extras_require={ ++ 'test': [ ++ 'plone.app.testing', ++ 'plone.app.contenttypes' ++ ] ++ }, ++ entry_points=""" ++ [z3c.autoinclude.plugin] ++ target = plone ++ """, ++) -Repository: plone.app.robotframework +Repository: plone.app.iterate Branch: refs/heads/master -Date: 2016-02-26T13:57:52+01:00 -Author: Maurits van Rees (mauritsvanrees) -Commit: https://github.com/plone/plone.app.robotframework/commit/0cfabf9b4b18ce52a0463a4511cf3381b13fcd22 +Date: 2016-02-26T18:15:11+01:00 +Author: Jens W. Klein (jensens) +Commit: https://github.com/plone/plone.app.iterate/commit/74ed979393b72b9a3fd6d5344629cdc2f5107eea -Merge pull request #53 from plone/cleanup-requires-27 +Merge pull request #20 from iham/master -Do not require argparse, decorator, and simplejson in Python 2.7. +Cleanup + Added profile id "default" and deprecated id "plone.app.iterate". Files changed: -M CHANGES.txt +A plone/app/iterate/setuphandlers.py +M CHANGES.rst +M plone/app/iterate/configure.zcml +M plone/app/iterate/testing.py M setup.py -diff --git a/CHANGES.txt b/CHANGES.txt -index ba785e2..c5c720a 100644 ---- a/CHANGES.txt -+++ b/CHANGES.txt -@@ -4,9 +4,14 @@ Changelog - 0.9.15 (unreleased) - ------------------- +diff --git a/CHANGES.rst b/CHANGES.rst +index c2b6c42..5ec2bbc 100644 +--- a/CHANGES.rst ++++ b/CHANGES.rst +@@ -8,10 +8,26 @@ New: -+Fixes: + - *add item here* + ++- plone.app.iterate depends on GenericSetup >= 1.8.2 ++ for using a post_handler on registerProfile ++ [iham] ++ ++- Added naming of default GenericSetup profile as "default". ++ "plone.app.iterate" also exists to keep compatibility. ++ [iham] ++ ++- Added deprecation warning to GS profile "plone.app.iterate" ++ [iham] ++ + Fixes: + + - *add item here* + ++- No need to register as Zope2 Product anymore. ++ [iham] + -+- Do not require argparse, decorator, and simplejson in Python 2.7, -+ only lower. [maurits] ++- Some minor pep8 cleanup. ++ [iham] + + 3.1.4 (2015-11-16) + ------------------ +diff --git a/plone/app/iterate/configure.zcml b/plone/app/iterate/configure.zcml +index f4b5074..282a5e2 100644 +--- a/plone/app/iterate/configure.zcml ++++ b/plone/app/iterate/configure.zcml +@@ -5,79 +5,92 @@ + xmlns:zcml="http://namespaces.zope.org/zcml" + i18n_domain="plone"> + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ + +- + - - Replace import of ``zope.testing.testrunner`` with ``zope.testrunner``. - [thet] -- ++ ++ + ++ + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- - 0.9.14 (2015-10-11) - ------------------- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +diff --git a/plone/app/iterate/setuphandlers.py b/plone/app/iterate/setuphandlers.py +new file mode 100644 +index 0000000..595e04f +--- /dev/null ++++ b/plone/app/iterate/setuphandlers.py +@@ -0,0 +1,12 @@ ++# -*- coding: utf-8 -*- ++"""Deprecation warning for plone.app.iterate:plone.app.iterate profile.""" ++ ++import warnings ++ ++ ++def deprecate_profile(tool): ++ """Deprecation profile plone.app.iterate.""" ++ warnings.warn( ++ 'The profile with id "plone.app.iterate" was renamed to "default".', ++ DeprecationWarning ++ ) +diff --git a/plone/app/iterate/testing.py b/plone/app/iterate/testing.py +index 7668d38..5d6676b 100644 +--- a/plone/app/iterate/testing.py ++++ b/plone/app/iterate/testing.py +@@ -1,3 +1,4 @@ ++"""Testing setup for integration and functional tests.""" + # -*- coding: utf-8 -*- + from plone.app.contenttypes.testing import PloneAppContenttypes + from plone.app.testing import PLONE_FIXTURE +@@ -8,37 +9,39 @@ + from plone.testing import z2 + + +-admin = { ++ADMIN = { + 'id': 'admin', + 'password': 'secret', + 'roles': ['Manager'], + } +-editor = { ++EDITOR = { + 'id': 'editor', + 'password': 'secret', + 'roles': ['Editor'], + } +-contributor = { ++CONTRIBUTOR = { + 'id': 'contributor', + 'password': 'secret', + 'roles': ['Contributor'], + } +-users_to_be_added = ( +- admin, +- editor, +- contributor, ++USERS_TO_BE_ADDED = ( ++ ADMIN, ++ EDITOR, ++ CONTRIBUTOR, + ) +-users_with_member_folder = ( +- editor, +- contributor, ++USERS_WITH_MEMBER_FOLDER = ( ++ EDITOR, ++ CONTRIBUTOR, + ) + + + class PloneAppIterateLayer(PloneSandboxLayer): ++ """Plone Sandbox Layer for plone.app.iterate.""" + + defaultBases = (PLONE_FIXTURE,) + + def setUpZope(self, app, configurationContext): ++ """Setup Zope with Addons.""" + import Products.ATContentTypes + self.loadZCML(package=Products.ATContentTypes) + z2.installProduct(app, 'Products.ATContentTypes') +@@ -50,19 +53,19 @@ def setUpZope(self, app, configurationContext): + + import plone.app.iterate + self.loadZCML(package=plone.app.iterate) +- z2.installProduct(app, 'plone.app.iterate') + + def setUpPloneSite(self, portal): ++ """Setup Plone Site with Addons.""" + # restore default workflow + applyProfile(portal, 'Products.CMFPlone:testfixture') + + # add default content + applyProfile(portal, 'Products.ATContentTypes:content') + +- applyProfile(portal, 'plone.app.iterate:plone.app.iterate') ++ applyProfile(portal, 'plone.app.iterate:default') + applyProfile(portal, 'plone.app.iterate:test') + +- for user in users_to_be_added: ++ for user in USERS_TO_BE_ADDED: + portal.portal_membership.addMember( + user['id'], + user['password'], +@@ -70,7 +73,7 @@ def setUpPloneSite(self, portal): + [], + ) + +- for user in users_with_member_folder: ++ for user in USERS_WITH_MEMBER_FOLDER: + mtool = portal.portal_membership + if not mtool.getMemberareaCreationFlag(): + mtool.setMemberareaCreationFlag() +@@ -111,15 +114,20 @@ def setUpPloneSite(self, portal): + + + class DexPloneAppIterateLayer(PloneAppContenttypes): ++ """Dexterity based Plone Sandbox Layer for plone.app.iterate.""" ++ + def setUpZope(self, app, configurationContext): +- super(DexPloneAppIterateLayer, self).setUpZope(app, configurationContext) ++ """Setup Zope with Addons.""" ++ super(DexPloneAppIterateLayer, ++ self).setUpZope(app, configurationContext) ++ + import plone.app.iterate + self.loadZCML(package=plone.app.iterate) +- z2.installProduct(app, 'plone.app.iterate') + + def setUpPloneSite(self, portal): ++ """Setup Plone Site with Addons.""" + super(DexPloneAppIterateLayer, self).setUpPloneSite(portal) +- applyProfile(portal, 'plone.app.iterate:plone.app.iterate') ++ applyProfile(portal, 'plone.app.iterate:default') + + + PLONEAPPITERATEDEX_FIXTURE = DexPloneAppIterateLayer() diff --git a/setup.py b/setup.py -index 0bb1daa..b2f7511 100644 +index 99db45c..8b54414 100644 --- a/setup.py +++ b/setup.py -@@ -1,5 +1,6 @@ - from setuptools import setup - from setuptools import find_packages -+import sys - - version = '0.9.15.dev0' - -@@ -43,9 +44,7 @@ def indent(line): - 'Products.MailHost', - 'Products.PlonePAS', - 'Products.PluggableAuthService', -- 'argparse', - 'babel', -- 'decorator', # required by r.selenium2library on Python 2.6.x - 'five.globalrequest', - 'plone.app.testing', - 'plone.testing', -@@ -55,7 +54,6 @@ def indent(line): - 'robotsuite', # not a direct dependency, but required for convenience - 'selenium', - 'setuptools', -- 'simplejson', # required for SauceLabs-keywords on Python 2.6.x - 'zope.component', - 'zope.configuration', - 'zope.i18n', -@@ -63,6 +61,13 @@ def indent(line): - 'zope.testrunner', - ] - -+if sys.version_info < (2, 7): -+ install_requires.extend([ -+ 'argparse', -+ 'decorator', # required by r.selenium2library on Python 2.6.x -+ 'simplejson', # required for SauceLabs-keywords on Python 2.6.x -+ ]) -+ - test_requires = [ - 'plone.app.dexterity', - 'plone.app.textfield', +@@ -1,61 +1,70 @@ ++"""Setup plone.app.iterate.""" + from setuptools import setup, find_packages + +-version = '3.1.5.dev0' ++VERSION = '3.1.5.dev0' + +-setup(name='plone.app.iterate', +- version=version, +- description="check-out/check-in staging for Plone", +- long_description=open("README.rst").read() + "\n" + open("CHANGES.rst").read(), +- classifiers=[ +- "Environment :: Web Environment", +- "Framework :: Plone", +- "Framework :: Plone :: 5.0", +- "Framework :: Zope2", +- "License :: OSI Approved :: GNU General Public License (GPL)", +- "Operating System :: OS Independent", +- "Programming Language :: Python", +- "Programming Language :: Python :: 2.7", +- ], +- keywords='check-out check-in staging', +- author='Plone Foundation', +- author_email='plone-developers@lists.sourceforge.net', +- url='https://pypi.python.org/pypi/plone.app.iterate', +- license='GPL version 2', +- packages=find_packages(exclude=['ez_setup']), +- namespace_packages=['plone', 'plone.app'], +- include_package_data=True, +- zip_safe=False, +- extras_require=dict( +- test=[ +- 'plone.app.testing', +- 'plone.app.contenttypes' +- ] +- ), +- install_requires=[ +- 'setuptools', +- 'plone.locking', +- 'plone.memoize', +- 'zope.annotation', +- 'zope.component', +- 'zope.event', +- 'zope.i18nmessageid', +- 'zope.interface', +- 'zope.lifecycleevent', +- 'zope.schema', +- 'zope.viewlet', +- 'Acquisition', +- 'DateTime', +- 'Products.Archetypes', +- 'Products.CMFCore', +- 'Products.CMFEditions', +- 'Products.CMFPlacefulWorkflow', +- 'Products.DCWorkflow', +- 'Products.statusmessages', +- 'ZODB3', +- 'Zope2', +- ], +- entry_points=''' +- [z3c.autoinclude.plugin] +- target = plone +- ''', +- ) ++LONG_DESCRIPTION = ( ++ open('README.rst').read() + ++ '\n' + ++ open('CHANGES.rst').read() + ++ '\n') ++ ++setup( ++ name='plone.app.iterate', ++ version=VERSION, ++ description="check-out/check-in staging for Plone", ++ long_description=LONG_DESCRIPTION, ++ classifiers=[ ++ "Environment :: Web Environment", ++ "Framework :: Plone", ++ "Framework :: Plone :: 5.0", ++ "Framework :: Zope2", ++ "License :: OSI Approved :: GNU General Public License (GPL)", ++ "Operating System :: OS Independent", ++ "Programming Language :: Python", ++ "Programming Language :: Python :: 2.7", ++ ], ++ keywords='check-out check-in staging', ++ author='Plone Foundation', ++ author_email='plone-developers@lists.sourceforge.net', ++ url='https://pypi.python.org/pypi/plone.app.iterate', ++ license='GPL version 2', ++ packages=find_packages(exclude=['ez_setup']), ++ namespace_packages=['plone', 'plone.app'], ++ include_package_data=True, ++ zip_safe=False, ++ install_requires=[ ++ 'setuptools', ++ 'Products.GenericSetup>=1.8.2', ++ 'plone.locking', ++ 'plone.memoize', ++ 'zope.annotation', ++ 'zope.component', ++ 'zope.event', ++ 'zope.i18nmessageid', ++ 'zope.interface', ++ 'zope.lifecycleevent', ++ 'zope.schema', ++ 'zope.viewlet', ++ 'Acquisition', ++ 'DateTime', ++ 'Products.Archetypes', ++ 'Products.CMFCore', ++ 'Products.CMFEditions', ++ 'Products.CMFPlacefulWorkflow', ++ 'Products.DCWorkflow', ++ 'Products.statusmessages', ++ 'ZODB3', ++ 'Zope2', ++ ], ++ extras_require={ ++ 'test': [ ++ 'plone.app.testing', ++ 'plone.app.contenttypes' ++ ] ++ }, ++ entry_points=""" ++ [z3c.autoinclude.plugin] ++ target = plone ++ """, ++)