[Checkins] SVN: grokcore.view/trunk/ Reduced dependencies by removing zope.app.zcmfiles.
Souheil CHELFOUH
souheil at chelfouh.com
Mon Mar 8 14:34:03 EST 2010
Log message for revision 109844:
Reduced dependencies by removing zope.app.zcmfiles.
Rewrote a test to avoid useless dependencies.
Cleaned the code to respect pep8 formatting.
Removed the "default_fallback_to_name" function as required by bug #395061 on lauchpad.
Changed:
U grokcore.view/trunk/CHANGES.txt
U grokcore.view/trunk/buildout.cfg
U grokcore.view/trunk/setup.py
U grokcore.view/trunk/src/grokcore/view/components.py
U grokcore.view/trunk/src/grokcore/view/directive.py
U grokcore.view/trunk/src/grokcore/view/ftesting.zcml
U grokcore.view/trunk/src/grokcore/view/ftests/view/require.py
U grokcore.view/trunk/src/grokcore/view/ftests/view/skindirective.py
U grokcore.view/trunk/src/grokcore/view/interfaces.py
U grokcore.view/trunk/src/grokcore/view/meta/directoryresource.py
U grokcore.view/trunk/src/grokcore/view/meta/skin.py
U grokcore.view/trunk/src/grokcore/view/meta/templates.py
U grokcore.view/trunk/src/grokcore/view/meta/views.py
U grokcore.view/trunk/src/grokcore/view/templatereg.py
U grokcore.view/trunk/src/grokcore/view/testing.py
U grokcore.view/trunk/src/grokcore/view/util.py
-=-
Modified: grokcore.view/trunk/CHANGES.txt
===================================================================
--- grokcore.view/trunk/CHANGES.txt 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/CHANGES.txt 2010-03-08 19:33:58 UTC (rev 109844)
@@ -4,6 +4,13 @@
2.0 (unreleased)
----------------
+- Fixed launchpad bug #395061 : removed the default_fallback_to_name
+ function. It can be imported from ``grokcore.security`` if needed.
+
+- ``grokcore.view`` no longer depends on ``zope.app.zcmlfiles``. We
+ removed all the extra dependencies and fixed one test that used
+ ``zope.app.rotterdam`` and ``zope.app.basicskin``.
+
- Back-ported the changes of the 1.13 branch related to the directory
resource registration, using the latest ztk packages.
Modified: grokcore.view/trunk/buildout.cfg
===================================================================
--- grokcore.view/trunk/buildout.cfg 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/buildout.cfg 2010-03-08 19:33:58 UTC (rev 109844)
@@ -13,6 +13,7 @@
martian = 0.12
grokcore.component = 2.0
+
[interpreter]
recipe = zc.recipe.egg
eggs = grokcore.view
Modified: grokcore.view/trunk/setup.py
===================================================================
--- grokcore.view/trunk/setup.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/setup.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -21,20 +21,25 @@
'zope.pagetemplate',
'zope.ptresource >= 3.9.0',
'zope.publisher',
- 'zope.schema',
'zope.security',
'zope.traversing',
]
tests_require = [
- 'zope.app.authentication',
- 'zope.app.zcmlfiles',
+ 'zope.app.testing',
'zope.container',
'zope.securitypolicy',
'zope.site',
'zope.testbrowser',
'zope.testing',
'zope.login',
+ 'zope.app.testing',
+ 'zope.configuration',
+ 'zope.app.appsetup',
+ 'zope.app.publication',
+ 'zope.browserpage',
+ 'zope.password',
+ 'zope.principalregistry',
]
setup(
Modified: grokcore.view/trunk/src/grokcore/view/components.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/components.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/components.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -21,11 +21,10 @@
from zope import component
from zope import interface
from zope.browserresource import directory
-from zope.browserresource.file import FileResourceFactory
from zope.browserresource.interfaces import IResourceFactoryFactory
from zope.pagetemplate import pagetemplate, pagetemplatefile
from zope.pagetemplate.engine import TrustedAppPT
-from zope.ptresource.ptresource import PageTemplateResourceFactory
+from zope.ptresource.ptresource import PageTemplateResourceFactory
from zope.publisher.browser import BrowserPage
from zope.publisher.interfaces import NotFound
from zope.publisher.publish import mapply
@@ -38,10 +37,11 @@
"""Mixin class providing methods and properties generally
useful for view-ish components.
"""
+
@property
def response(self):
return self.request.response
-
+
@property
def body(self):
return self.request.bodyStream.getCacheStream().read()
@@ -68,7 +68,7 @@
elif name is not None and obj is None:
# create URL to view on context
obj = self.context
-
+
return util.url(self.request, obj, name, data)
@@ -83,8 +83,7 @@
self.static = component.queryAdapter(
self.request,
interface.Interface,
- name=self.module_info.package_dotted_name
- )
+ name=self.module_info.package_dotted_name)
else:
self.static = None
@@ -127,7 +126,7 @@
"View %r, macro %s" % (self, key),
DeprecationWarning, 1)
return value
-
+
def update(self, **kwargs):
pass
@@ -140,6 +139,7 @@
# please start using grokcore.view.View again.
CodeView = View
+
class BaseTemplate(object):
"""Any sort of page template"""
@@ -231,6 +231,7 @@
self._template = TrustedFilePageTemplate(filename, _prefix)
def _initFactory(self, factory):
+
def _get_macros(self):
return self.template._template.macros
# _template.macros is a property that does template reloading in debug
@@ -247,6 +248,7 @@
class PageTemplateFile(PageTemplate):
# For BBB
+
def __init__(self, filename, _prefix=None):
self.__grok_module__ = martian.util.caller_module()
if _prefix is None:
@@ -257,9 +259,10 @@
_marker = object()
+
class DirectoryResource(directory.DirectoryResource):
forbidden_names = ('.svn', )
-
+
def get(self, name, default=_marker):
for pat in self.forbidden_names:
@@ -268,7 +271,7 @@
raise NotFound(None, name)
else:
return default
-
+
path = self.context.path
filename = os.path.join(path, name)
isfile = os.path.isfile(filename)
Modified: grokcore.view/trunk/src/grokcore/view/directive.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/directive.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/directive.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -24,11 +24,14 @@
def validateLocalPath(directive, value):
martian.validateText(directive, value)
if os.path.sep in value:
- raise GrokImportError("The '%s' directive can not contain path separator."
- % directive.name)
+ raise GrokImportError(
+ "The '%s' directive can not contain path separator."
+ % directive.name)
+
# Define grok directives
+
class template(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
Modified: grokcore.view/trunk/src/grokcore/view/ftesting.zcml
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftesting.zcml 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/ftesting.zcml 2010-03-08 19:33:58 UTC (rev 109844)
@@ -3,17 +3,31 @@
xmlns:grok="http://namespaces.zope.org/grok"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="grokcore.view"
- package="grokcore.view"
- >
+ package="grokcore.view">
- <include package="zope.app.zcmlfiles" file="meta.zcml" />
+ <include package="zope.component" file="meta.zcml" />
+ <include package="zope.security" file="meta.zcml" />
<include package="zope.securitypolicy" file="meta.zcml" />
+ <include package="zope.principalregistry" file="meta.zcml" />
+ <include package="zope.publisher" file="meta.zcml" />
+ <include package="zope.browserpage" file="meta.zcml" />
+ <include package="zope.app.publication" file="meta.zcml" />
<include package="grokcore.view" file="meta.zcml" />
+
+ <include package="zope.security" />
+ <include package="zope.principalregistry" />
+ <include package="zope.login" />
+ <include package="zope.password" />
+ <include package="zope.site" />
+ <include package="zope.container" />
+ <include package="zope.publisher" />
+ <include package="zope.traversing" />
+ <include package="zope.browserresource" />
+ <include package="zope.traversing.browser" />
+ <include package="zope.app.appsetup" />
+ <include package="zope.app.publication" />
- <include package="zope.app.zcmlfiles" />
- <include package="zope.app.authentication" />
<include package="grokcore.view" />
- <include package="zope.login" />
<grok:grok package="grokcore.view.ftests" />
<securityPolicy
Modified: grokcore.view/trunk/src/grokcore/view/ftests/view/require.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/view/require.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/ftests/view/require.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -27,9 +27,11 @@
import grokcore.view as grok
import zope.interface
+
class ViewPainting(grok.Permission):
grok.name('cave.ViewPainting')
+
class Painting(grok.View):
grok.context(zope.interface.Interface)
grok.require(ViewPainting)
@@ -37,6 +39,7 @@
def render(self):
return 'What a beautiful painting.'
+
class PublicNudity(grok.View):
grok.context(zope.interface.Interface)
grok.require(grok.Public)
Modified: grokcore.view/trunk/src/grokcore/view/ftests/view/skindirective.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/view/skindirective.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/ftests/view/skindirective.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -4,58 +4,79 @@
>>> from zope.testbrowser.testing import Browser
>>> browser = Browser()
>>> browser.handleErrors = False
- >>> browser.open("http://localhost/++skin++Basic/manfred/@@cavedrawings")
+ >>> browser.open("http://localhost/++skin++casual/manfred/@@hello")
>>> print browser.contents
<html>
<body>
- <h1>Hello, world!</h1>
+ <h1>Hi sir !</h1>
</body>
</html>
- >>> browser.open("http://localhost/++skin++Rotterdam/manfred/@@moredrawings")
+ >>> browser.open("http://localhost/++skin++party/manfred/@@happy")
>>> print browser.contents
- Pretty
+ Hee yay !
- >>> browser.open("http://localhost/++skin++myskin/manfred/@@evenmoredrawings")
+ >>> browser.open("http://localhost/++skin++rainy/manfred/@@sad")
>>> print browser.contents
- Awesome
+ Aw... It rains.
"""
import grokcore.view as grok
-from zope.app.basicskin import IBasicSkin
-from zope.app.rotterdam import rotterdam
-grok.layer(IBasicSkin)
-class MySkinLayer(grok.IBrowserRequest):
+class CasualLayer(grok.IBrowserRequest):
pass
-class MySkin(MySkinLayer):
- grok.skin('myskin')
+class PartyLayer(grok.IBrowserRequest):
+ pass
+
+
+class RainyLayer(grok.IBrowserRequest):
+ pass
+
+
+class PartySkin(PartyLayer):
+ grok.skin('party')
+
+
+class CasualSkin(CasualLayer):
+ grok.skin('casual')
+
+
+class RainySkin(RainyLayer):
+ grok.skin('rainy')
+
+
+grok.layer(CasualLayer)
+
+
class Mammoth(grok.Context):
pass
-class CaveDrawings(grok.View):
+
+class Hello(grok.View):
pass
-cavedrawings = grok.PageTemplate("""\
+
+hello = grok.PageTemplate("""\
<html>
<body>
-<h1>Hello, world!</h1>
+<h1>Hi sir !</h1>
</body>
</html>
""")
-class MoreDrawings(grok.View):
- grok.layer(rotterdam)
+class Happy(grok.View):
+ grok.layer(PartyLayer)
+
def render(self):
- return "Pretty"
+ return u"Hee yay !"
-class EvenMoreDrawings(grok.View):
- grok.layer(MySkinLayer)
+class Sad(grok.View):
+ grok.layer(RainyLayer)
def render(self):
- return "Awesome"
+ return u"Aw... It rains."
Modified: grokcore.view/trunk/src/grokcore/view/interfaces.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/interfaces.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/interfaces.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -22,6 +22,7 @@
DirectoryResource = Attribute("Base class to create new "
"directory resource.")
+
class IDirectives(Interface):
def layer(layer):
@@ -87,7 +88,7 @@
"the static files of the view's package.")
def redirect(url):
- """Redirect to given URL"""
+ """Redirect to given URL"""
def url(obj=None, name=None, data=None):
"""Construct URL.
@@ -158,6 +159,7 @@
_prefix is the directory the file is located in
"""
+
class ITemplate(Interface):
"""Template objects
"""
Modified: grokcore.view/trunk/src/grokcore/view/meta/directoryresource.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta/directoryresource.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/meta/directoryresource.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -30,6 +30,7 @@
allowed_resourcedir_names = allowed_resource_names + ('__getitem__', 'get')
+
def _get_resource_path(module_info, path):
resource_path = module_info.getResourcePath(path)
if os.path.isdir(resource_path):
@@ -46,6 +47,7 @@
"'%s.py'" % (path, path), module_info.getModule())
return resource_path
+
def _register(config, resource_path, name, layer):
# public checker by default
checker = NamesChecker(allowed_resourcedir_names)
@@ -61,6 +63,7 @@
)
return True
+
class DirectoryResourceGrokker(martian.ClassGrokker):
martian.component(components.DirectoryResource)
@@ -80,6 +83,7 @@
name = name or factory.module_info.dotted_name
return _register(config, resource_path, name, layer)
+
class StaticResourcesGrokker(martian.GlobalGrokker):
def grok(self, name, module, module_info, config, **kw):
@@ -88,10 +92,10 @@
if not module_info.isPackage():
return False
resource_path = _get_resource_path(module_info, 'static')
-
+
if not os.path.exists(resource_path):
return False
-
+
name = module_info.dotted_name
layer = IDefaultBrowserLayer
return _register(config, resource_path, name, layer)
Modified: grokcore.view/trunk/src/grokcore/view/meta/skin.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta/skin.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/meta/skin.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -26,6 +26,7 @@
_skin_not_used = object()
+
class SkinInterfaceDirectiveGrokker(martian.InstanceGrokker):
martian.component(InterfaceClass)
@@ -43,11 +44,10 @@
"required for interfaces that are used as layers and are to "
"be registered as a skin."
% (interface.__identifier__, interface.__identifier__),
- interface
+ interface,
)
config.action(
discriminator=('utility', IBrowserSkinType, skin),
callable=zope.component.interface.provideInterface,
- args=(skin, interface, IBrowserSkinType)
- )
+ args=(skin, interface, IBrowserSkinType))
return True
Modified: grokcore.view/trunk/src/grokcore/view/meta/templates.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta/templates.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/meta/templates.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -42,12 +42,12 @@
config.action(
discriminator=None,
callable=templates.register,
- args=(name, instance)
+ args=(name, instance),
)
config.action(
discriminator=None,
callable=instance._annotateGrokInfo,
- args=(name, module_info.dotted_name)
+ args=(name, module_info.dotted_name),
)
return True
@@ -65,7 +65,7 @@
config.action(
discriminator=None,
callable=templates.findFilesystem,
- args=(module_info,)
+ args=(module_info,),
)
return True
@@ -81,7 +81,6 @@
config.action(
discriminator=None,
callable=templates.checkUnassociated,
- args=(module_info,)
+ args=(module_info,),
)
return True
-
Modified: grokcore.view/trunk/src/grokcore/view/meta/views.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta/views.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/meta/views.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -26,13 +26,11 @@
from grokcore.security.util import protect_getattr
from grokcore.view import components
+
def default_view_name(factory, module=None, **data):
return factory.__name__.lower()
-def default_fallback_to_name(factory, module, name, **data):
- return name
-
class ViewGrokker(martian.ClassGrokker):
martian.component(components.View)
martian.directive(grokcore.component.context,
@@ -53,7 +51,7 @@
config.action(
discriminator=None,
callable=self.checkTemplates,
- args=(templates, factory.module_info, factory)
+ args=(templates, factory.module_info, factory),
)
# safety belt: make sure that the programmer didn't use
@@ -86,7 +84,7 @@
def has_no_render(factory):
return not has_render(factory)
-
+
templates.checkTemplates(module_info, factory, 'view',
has_render, has_no_render)
@@ -103,6 +101,3 @@
args=(factory, method_name, permission),
)
return True
-
-
-
Modified: grokcore.view/trunk/src/grokcore/view/templatereg.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/templatereg.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/templatereg.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -1,3 +1,18 @@
+##############################################################################
+#
+# Copyright (c) 2006-2010 Zope Corporation 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.
+#
+##############################################################################
+"""Template registry
+"""
import os
import warnings
import zope.component
@@ -7,6 +22,7 @@
from grokcore.view.interfaces import ITemplateFileFactory, ITemplate
from grokcore.view.components import PageTemplate
+
class TemplateRegistry(object):
def __init__(self):
Modified: grokcore.view/trunk/src/grokcore/view/testing.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/testing.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/testing.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -18,6 +18,7 @@
from zope.configuration.config import ConfigurationMachine
from grokcore.component import zcml
+
def grok(module_name):
config = ConfigurationMachine()
zcml.do_grok('grokcore.component.meta', config)
@@ -27,7 +28,10 @@
zcml.do_grok(module_name, config)
config.execute_actions()
+
lastwarning = '' # Here we collect warnings.
+
+
def warn(message, category=None, stacklevel=1):
"""Intended to replace warnings.warn in tests.
@@ -50,7 +54,7 @@
for i in range(lineno):
line = file.readline()
- warning ="%s:%s: %s: %s\n %s" % (
+ warning = "%s:%s: %s: %s\n %s" % (
path,
frame.f_lineno,
category.__name__,
Modified: grokcore.view/trunk/src/grokcore/view/util.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/util.py 2010-03-08 17:04:29 UTC (rev 109843)
+++ grokcore.view/trunk/src/grokcore/view/util.py 2010-03-08 19:33:58 UTC (rev 109844)
@@ -18,23 +18,24 @@
from zope.traversing.browser.interfaces import IAbsoluteURL
from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
+
def url(request, obj, name=None, data=None):
url = getMultiAdapter((obj, request), IAbsoluteURL)()
if name is not None:
url += '/' + urllib.quote(name.encode('utf-8'), SAFE_URL_CHARACTERS)
-
+
if data is None:
return url
-
+
if not isinstance(data, dict):
raise TypeError('url() data argument must be a dict.')
-
- for k,v in data.items():
+
+ for k, v in data.items():
if isinstance(v, unicode):
data[k] = v.encode('utf-8')
if isinstance(v, (list, set, tuple)):
data[k] = [
isinstance(item, unicode) and item.encode('utf-8')
or item for item in v]
-
+
return url + '?' + urllib.urlencode(data, doseq=True)
More information about the checkins
mailing list