[Checkins] SVN: megrok.menu/trunk/ Cleaning process : dependencies and tests have been cleared from all the unused packages AND updated to the most recent ZTK use.
Souheil CHELFOUH
souheil at chelfouh.com
Sat Mar 6 13:13:02 EST 2010
Log message for revision 109713:
Cleaning process : dependencies and tests have been cleared from all the unused packages AND updated to the most recent ZTK use.
Changed:
U megrok.menu/trunk/CHANGES.txt
U megrok.menu/trunk/buildout.cfg
U megrok.menu/trunk/setup.py
U megrok.menu/trunk/src/megrok/menu/__init__.py
U megrok.menu/trunk/src/megrok/menu/component.py
U megrok.menu/trunk/src/megrok/menu/grokker.py
U megrok.menu/trunk/src/megrok/menu/tests/__init__.py
U megrok.menu/trunk/src/megrok/menu/tests/test_functional.py
U megrok.menu/trunk/src/megrok/menu/tests/test_menu.py
U megrok.menu/trunk/src/megrok/menu/tests/test_order.py
-=-
Modified: megrok.menu/trunk/CHANGES.txt
===================================================================
--- megrok.menu/trunk/CHANGES.txt 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/CHANGES.txt 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,13 +1,25 @@
Changelog
=========
-0.4 (unreleased)
+0.4 (2010-03-06)
----------------
-* ...
+* Cleaned the tests module. Now, we only use the ZTK packages to test.
+* The dependencies have been cleared. We no longer depend on zope.app
+ packages.
+
+* Updated the security grokking in the menu items grokker. We don't
+ need the protect_getattr, as the view security grokker already does
+ it for us.
+
+* Fixed the dependencies in the package requires. All dependencies are
+ now clearly declared.
+
+
0.3 (2009-11-02)
----------------
+
* Added the support of the grokcore.viewlet 'order' directive to
reorder the menu items and sub menus. This permits to have a
baseclass defining the basic menu and to keep the ordering
@@ -15,7 +27,9 @@
different arguments of the menuitem directive. That would allow more
genericity and reusability. Note : this change is 100% backward
compatible. Simply added tests to show the behavior. [trollfot]
+
* Get rid of the grok dependency. Now depends only on grokcore.* packages
+
* Updated the build process
@@ -23,9 +37,13 @@
----------------
* Compatible with grok1.0a1
+
* Add the SubMenuItem base class and it's grokker SubMenuItemGrokker
+
* Add the `extra` parameter to the menuitem directive
+
* Tests for added functionality
+
* Remove version.cfg
Modified: megrok.menu/trunk/buildout.cfg
===================================================================
--- megrok.menu/trunk/buildout.cfg 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/buildout.cfg 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,7 +1,7 @@
[buildout]
develop = .
parts = interpreter test
-extends = http://grok.zope.org/releaseinfo/grok-1.0a4.cfg
+extends = http://grok.zope.org/releaseinfo/grok-1.1rc1.cfg
versions = versions
[interpreter]
@@ -11,5 +11,5 @@
[test]
recipe = zc.recipe.testrunner
-eggs = megrok.menu
+eggs = megrok.menu [test]
defaults = ['--tests-pattern', '^f?tests$', '-v']
Modified: megrok.menu/trunk/setup.py
===================================================================
--- megrok.menu/trunk/setup.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/setup.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,21 +1,17 @@
from setuptools import setup, find_packages
-long_description = (open("README.txt").read()
- + '\n\n' +
- open("CHANGES.txt").read())
+long_description = (
+ open("README.txt").read() + '\n\n' + open("CHANGES.txt").read())
+test_requires = []
+
setup(name='megrok.menu',
- version='0.4dev',
+ version='0.4',
description="Grok extension to configure browser menus",
long_description=long_description,
- classifiers=['Programming Language :: Python',
- 'Environment :: Web Environment',
- 'Framework :: Zope3',
- 'License :: OSI Approved :: Zope Public License',
- ],
keywords='',
- author='Philipp von Weitershausen',
- author_email='philipp at weitershausen.de',
+ author='The Grok community',
+ author_email='grok-dev at zope.org',
url='http://pypi.python.org/pypi/megrok.menu',
license='ZPL',
packages=find_packages('src'),
@@ -23,14 +19,30 @@
namespace_packages=['megrok'],
include_package_data=True,
zip_safe=False,
+ extras_require={'test': [
+ 'zope.component',
+ 'zope.interface',
+ 'zope.principalregistry',
+ 'zope.security',
+ 'zope.securitypolicy',
+ 'zope.site',
+ 'zope.testing',
+ ]},
install_requires=[
- 'setuptools',
'grokcore.component',
+ 'grokcore.security',
'grokcore.view',
'grokcore.viewlet',
- 'grokcore.security',
+ 'martian',
+ 'setuptools',
+ 'zope.browsermenu',
+ 'zope.configuration',
+ 'zope.publisher',
],
- entry_points="""
- # -*- Entry points: -*-
- """,
+ classifiers=[
+ 'Programming Language :: Python',
+ 'Environment :: Web Environment',
+ 'Framework :: Zope3',
+ 'License :: OSI Approved :: Zope Public License',
+ ],
)
Modified: megrok.menu/trunk/src/megrok/menu/__init__.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/__init__.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/__init__.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
from megrok.menu.component import menuitem, Menu, SubMenuItem
# Provide these directives here as well:
@@ -2 +4,2 @@
from grokcore.component import name, title, description
+from grokcore.viewlet import order
Modified: megrok.menu/trunk/src/megrok/menu/component.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/component.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/component.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,11 +1,15 @@
+# -*- coding: utf-8 -*-
+
import martian.util
import grokcore.component
from martian.error import GrokImportError
-from zope.app.publisher.browser.menu import BrowserMenu
+from zope.browsermenu.menu import BrowserMenu
+
class Menu(BrowserMenu):
pass
+
class SubMenuItem(BrowserMenu):
pass
@@ -22,4 +26,3 @@
"You can only pass unicode, ASCII, or a subclass "
"of megrok.menu.Menu to the '%s' directive." % self.name)
return (menu, icon, filter, order, extra)
-
Modified: megrok.menu/trunk/src/megrok/menu/grokker.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/grokker.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/grokker.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,24 +1,23 @@
+
+# -*- coding: utf-8 -*-
+
import martian
-from martian.error import GrokError
+import megrok.menu
import grokcore.view
import grokcore.viewlet
import grokcore.security
import grokcore.component
-from grokcore.security.util import protect_getattr
from grokcore.view.meta.views import ViewSecurityGrokker, default_view_name
-
+from martian.error import GrokError
+from zope.browsermenu.metaconfigure import (
+ menuDirective, menuItemDirective, subMenuItemDirective)
from zope.configuration.exceptions import ConfigurationError
-from zope.app.publisher.browser.menumeta import menuDirective, \
- menuItemDirective, subMenuItemDirective
-
-from zope.publisher.interfaces.browser import IDefaultBrowserLayer
from zope.publisher.interfaces.browser import IBrowserPage
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
-import megrok.menu
-
class MenuGrokker(martian.ClassGrokker):
martian.component(megrok.menu.Menu)
martian.priority(1500)
@@ -76,15 +75,6 @@
filter=filter, permission=permission, layer=layer,
order=enforced_order, action='', extra=extra
)
-
- for method_name in IBrowserPage:
- if method_name == '__call__':
- continue
- config.action(
- discriminator=('protectMenuName', factory, method_name),
- callable=protect_getattr,
- args=(factory, method_name, permission),
- )
return True
@@ -96,6 +86,8 @@
martian.directive(grokcore.component.name, get_default=default_view_name)
martian.directive(grokcore.component.title, default=u'')
martian.directive(grokcore.component.description, default=u'')
+ martian.directive(
+ grokcore.view.require, default="zope.View", name='permission')
def execute(self, factory, config, permission, order, context=None,
layer=None, name=u'', menuitem=None, description=u'',
@@ -115,29 +107,9 @@
raise GrokError("The %r menu could not be found. Please use "
"megrok.menu.Menu to register a menu first."
% menu_id, factory)
+
menuItemDirective(config, menu=menu, for_=context, action=name,
title=title, description=description, icon=icon,
filter=filter, permission=permission, layer=layer,
order=enforced_order, extra=extra)
-
- # Menu items check whether the view that they refer to can be
- # traversed to. Unfortunately, views will end up being
- # security proxied during that fake traversal. For this to
- # work then, we must define a checker not only for __call__
- # but also for browserDefault and those other methods from
- # IBrowserPage:
- ######
- # This is no longer needed. protect_getattr function will take care.
- #if permission is None:
- # permission = 'zope.Public'
-
- for method_name in IBrowserPage:
- if method_name == '__call__':
- continue
- config.action(
- discriminator=('protectMenuName', factory, method_name),
- callable=protect_getattr,
- args=(factory, method_name, permission),
- )
-
return True
Modified: megrok.menu/trunk/src/megrok/menu/tests/__init__.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/tests/__init__.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/tests/__init__.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,8 +1,31 @@
-import os.path
-import megrok.menu
-from zope.app.testing.functional import ZCMLLayer
-ftesting_zcml = os.path.join(os.path.dirname(megrok.menu.__file__),
- 'ftesting.zcml')
-FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer',
- allow_teardown=True)
+# -*- coding: utf-8 -*-
+
+import zope.component
+from zope.component.interfaces import IComponentLookup
+from zope.component.testlayer import ZCMLFileLayer
+from zope.interface import Interface
+from zope.site.folder import rootFolder
+from zope.site.site import LocalSiteManager, SiteManagerAdapter
+
+
+class MegrokMenuLayer(ZCMLFileLayer):
+
+ def setUp(self):
+ ZCMLFileLayer.setUp(self)
+
+ # Set up site manager adapter
+ zope.component.provideAdapter(
+ SiteManagerAdapter, (Interface,), IComponentLookup)
+
+ # Set up site
+ site = rootFolder()
+ site.setSiteManager(LocalSiteManager(site))
+ zope.component.hooks.setSite(site)
+
+ return site
+
+ def tearDown(self):
+ ZCMLFileLayer.tearDown(self)
+ zope.component.hooks.resetHooks()
+ zope.component.hooks.setSite()
Modified: megrok.menu/trunk/src/megrok/menu/tests/test_functional.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/tests/test_functional.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/tests/test_functional.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,16 +1,21 @@
"""
+
Let's create a Mammoth object in the root folder so we can access
views through the publisher:
- >>> from zope.app.testing.functional import getRootFolder
- >>> root = getRootFolder()
- >>> root['manfred'] = Mammoth()
+ >>> from zope.component.hooks import getSite
+ >>> root = getSite()
+ >>> manfred = root['manfred'] = Mammoth()
As an anonymous user, we only see the unprotected menu items:
- >>> from zope.testbrowser.testing import Browser
- >>> browser = Browser('http://localhost/manfred/showmenu')
- >>> print browser.contents
+ >>> from zope.publisher.browser import TestRequest
+
+ >>> newInteraction(Participation(Principal('zope.anybody')))
+ >>> request = TestRequest()
+
+ >>> page = getMultiAdapter((manfred, TestRequest()), name='showmenu')
+ >>> print page()
[{'action': '',
'description': '',
'extra': None,
@@ -41,9 +46,11 @@
After logging in as a manager, we also see the protected one:
- >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
- >>> browser.open('http://localhost/manfred/showmenu')
- >>> print browser.contents
+ >>> endInteraction()
+ >>> newInteraction(Participation(Principal('zope.mgr')))
+
+ >>> page = getMultiAdapter((manfred, TestRequest()), name='showmenu')
+ >>> print page()
[{'action': '',
'description': '',
'extra': None,
@@ -92,27 +99,32 @@
'submenu': None,
'title': 'Manage'}]
+ >>> endInteraction()
"""
+import megrok.menu
+
from grokcore.component import Context, name, title, description
from grokcore.view import View
from grokcore.security import Permission, require
-import megrok.menu
-
from pprint import pformat
-from zope.component import getUtility
-from zope.app.publisher.interfaces.browser import IBrowserMenu
+from zope.component import getUtility, getMultiAdapter
+from zope.browsermenu.interfaces import IBrowserMenu
+from zope.security.management import newInteraction, endInteraction
+from zope.security.testing import Principal, Participation
+
class Mammoth(Context):
pass
+
class Actions(megrok.menu.Menu):
name('actions')
title('Actions')
description('')
+
# You can either refer to the menu class itself:
-
class Index(View):
title('View')
megrok.menu.menuitem(Actions)
@@ -120,8 +132,8 @@
def render(self):
return 'index'
+
# or you can refer to its identifier:
-
class Edit(View):
title('Edit')
megrok.menu.menuitem('actions')
@@ -129,6 +141,7 @@
def render(self):
return 'edit'
+
# also you can define sub-menus items
class Options(megrok.menu.SubMenuItem):
name('options')
@@ -137,6 +150,7 @@
megrok.menu.menuitem('actions')
+
class OptionOne(View):
title('Option one')
megrok.menu.menuitem('options')
@@ -144,12 +158,13 @@
def render(self):
return 'option one'
+
# Here's a view that's protected by a permission. We expect the menu
# item that we configure for it to have the same permission setting:
-
class ManageStuff(Permission):
name('my.ManageStuff')
+
class Manage(View):
require(ManageStuff)
title('Manage')
@@ -158,6 +173,7 @@
def render(self):
return 'manage'
+
#Sub menus item are also available to be protected using a permission
class Setup(megrok.menu.SubMenuItem):
require(ManageStuff)
@@ -167,6 +183,7 @@
megrok.menu.menuitem('actions')
+
class ConfigOption(View):
title('Protected configuration')
megrok.menu.menuitem('setup')
@@ -174,15 +191,15 @@
def render(self):
return 'Configuration'
+
class ShowMenu(View):
-
def render(self):
menu = getUtility(IBrowserMenu, 'actions')
return pformat(menu.getMenuItems(self.context, self.request))
+
def test_suite():
from zope.testing import doctest
- from megrok.menu.tests import FunctionalLayer
suite = doctest.DocTestSuite()
- suite.layer = FunctionalLayer
+ suite.layer = megrok.menu.tests.MegrokMenuLayer(megrok.menu.tests)
return suite
Modified: megrok.menu/trunk/src/megrok/menu/tests/test_menu.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/tests/test_menu.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/tests/test_menu.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,10 +1,14 @@
"""
- >>> from zope.component import getUtility
- >>> from zope.app.publisher.interfaces.browser import IBrowserMenu
- >>> from zope.publisher.browser import TestRequest
+We log as anonymous::
+ >>> newInteraction(Participation(Principal('zope.anybody')))
+
A menu is available as a named utility providing ``IBrowserMenu``.
+ >>> from zope.publisher.browser import TestRequest
+ >>> from zope.browsermenu.interfaces import IBrowserMenu
+ >>> from zope.component import getUtility
+
>>> menu = getUtility(IBrowserMenu, 'tabs')
>>> manfred = Mammoth()
>>> request = TestRequest()
@@ -31,23 +35,29 @@
'submenu': None,
'title': 'View'}]
+ >>> endInteraction()
+
"""
+import megrok.menu
from grokcore.component import Context, name, title, description
+from grokcore.security import Permission, require
from grokcore.view import View
-from grokcore.security import Permission, require
-import megrok.menu
+from zope.security.management import newInteraction, endInteraction
+from zope.security.testing import Principal, Participation
+
class Mammoth(Context):
pass
+
class Tabs(megrok.menu.Menu):
name('tabs')
title('Tabs')
description('')
+
# You can either refer to the menu class itself:
-
class Index(View):
title('View')
megrok.menu.menuitem(Tabs)
@@ -55,8 +65,8 @@
def render(self):
return 'index'
+
# or you can refer to its identifier:
-
class Edit(View):
title('Edit')
megrok.menu.menuitem('tabs')
@@ -67,7 +77,6 @@
def test_suite():
from zope.testing import doctest
- from megrok.menu.tests import FunctionalLayer
suite = doctest.DocTestSuite()
- suite.layer = FunctionalLayer
+ suite.layer = megrok.menu.tests.MegrokMenuLayer(megrok.menu.tests)
return suite
Modified: megrok.menu/trunk/src/megrok/menu/tests/test_order.py
===================================================================
--- megrok.menu/trunk/src/megrok/menu/tests/test_order.py 2010-03-06 18:09:20 UTC (rev 109712)
+++ megrok.menu/trunk/src/megrok/menu/tests/test_order.py 2010-03-06 18:13:02 UTC (rev 109713)
@@ -1,8 +1,12 @@
"""
>>> from zope.component import getUtility
- >>> from zope.app.publisher.interfaces.browser import IBrowserMenu
+ >>> from zope.browsermenu.interfaces import IBrowserMenu
>>> from zope.publisher.browser import TestRequest
+We log as anonymous::
+
+ >>> newInteraction(Participation(Principal('zope.anybody')))
+
A menu is available as a named utility providing ``IBrowserMenu``.
>>> menu = getUtility(IBrowserMenu, 'ordered')
@@ -45,10 +49,13 @@
'submenu': None,
'title': 'my third view'}]
+ >>> endInteraction()
+
"""
-
import megrok.menu
import grokcore.viewlet as grok
+from zope.security.management import newInteraction, endInteraction
+from zope.security.testing import Principal, Participation
class Mammoth(grok.Context):
@@ -99,7 +106,6 @@
def test_suite():
from zope.testing import doctest
- from megrok.menu.tests import FunctionalLayer
suite = doctest.DocTestSuite()
- suite.layer = FunctionalLayer
+ suite.layer = megrok.menu.tests.MegrokMenuLayer(megrok.menu.tests)
return suite
More information about the checkins
mailing list