[Checkins] SVN: grok/branches/grok-martian/src/grok/ Move generic
utility functions from grok core into martian.
Martijn Faassen
faassen at infrae.com
Wed Jun 20 09:06:22 EDT 2007
Log message for revision 76839:
Move generic utility functions from grok core into martian.
Changed:
U grok/branches/grok-martian/src/grok/_grok.py
U grok/branches/grok-martian/src/grok/components.py
U grok/branches/grok-martian/src/grok/directive.py
U grok/branches/grok-martian/src/grok/meta.py
U grok/branches/grok-martian/src/grok/tests/util/class_annotation.py
U grok/branches/grok-martian/src/grok/util.py
-=-
Modified: grok/branches/grok-martian/src/grok/_grok.py
===================================================================
--- grok/branches/grok-martian/src/grok/_grok.py 2007-06-20 12:49:51 UTC (rev 76838)
+++ grok/branches/grok-martian/src/grok/_grok.py 2007-06-20 13:06:22 UTC (rev 76839)
@@ -26,11 +26,11 @@
import martian
from martian import scan
from martian.error import GrokError, GrokImportError
-from martian.util import frame_is_module
+from martian.util import frame_is_module, determine_module_context
import grok
-from grok import util, components, meta
+from grok import components, meta
from grok import templatereg
_bootstrapped = False
@@ -87,7 +87,7 @@
possible_contexts = martian.scan_for_classes(module, [grok.Model,
grok.LocalUtility,
grok.Container])
- context = util.determine_module_context(module_info, possible_contexts)
+ context = determine_module_context(module_info, possible_contexts)
kw['context'] = context
kw['module_info'] = module_info
Modified: grok/branches/grok-martian/src/grok/components.py
===================================================================
--- grok/branches/grok-martian/src/grok/components.py 2007-06-20 12:49:51 UTC (rev 76838)
+++ grok/branches/grok-martian/src/grok/components.py 2007-06-20 13:06:22 UTC (rev 76839)
@@ -50,8 +50,10 @@
from zope.app.container.interfaces import IReadContainer
from zope.app.component.site import SiteManagerContainer
-from grok import util, interfaces, formlib
+from martian import util
+from grok import interfaces, formlib
+from grok.util import url
class Model(Contained, persistent.Persistent):
# XXX Inheritance order is important here. If we reverse this,
@@ -151,7 +153,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)
+ return url(self.request, obj, name)
def application_url(self, name=None):
obj = self.context
Modified: grok/branches/grok-martian/src/grok/directive.py
===================================================================
--- grok/branches/grok-martian/src/grok/directive.py 2007-06-20 12:49:51 UTC (rev 76838)
+++ grok/branches/grok-martian/src/grok/directive.py 2007-06-20 13:06:22 UTC (rev 76839)
@@ -27,7 +27,7 @@
ClassDirectiveContext,
ClassOrModuleDirectiveContext)
-from grok import util
+from martian import util
class GlobalUtilityDirective(MultipleTimesDirective):
def check_arguments(self, factory, provides=None, name=u'',
Modified: grok/branches/grok-martian/src/grok/meta.py
===================================================================
--- grok/branches/grok-martian/src/grok/meta.py 2007-06-20 12:49:51 UTC (rev 76838)
+++ grok/branches/grok-martian/src/grok/meta.py 2007-06-20 13:06:22 UTC (rev 76839)
@@ -24,9 +24,11 @@
import martian
from martian.error import GrokError
+from martian import util
import grok
-from grok import util, components, formlib
+from grok import components, formlib
+from grok.util import check_adapts, get_default_permission, make_checker
class ModelGrokker(martian.ClassGrokker):
component_class = grok.Model
@@ -65,7 +67,7 @@
provides = util.class_annotation(factory, 'grok.provides', None)
if provides is None:
util.check_implements_one(factory)
- util.check_adapts(factory)
+ check_adapts(factory)
name = util.class_annotation(factory, 'grok.name', '')
component.provideAdapter(factory, provides=provides, name=name)
return True
@@ -90,7 +92,7 @@
# the outside -- need to discuss how to restrict such things.
methods = util.methods_from_class(factory)
- default_permission = util.get_default_permission(factory)
+ default_permission = get_default_permission(factory)
for method in methods:
# Make sure that the class inherits MethodPublisher, so that the
@@ -109,7 +111,7 @@
# level or zope.Public.
permission = getattr(method, '__grok_require__',
default_permission)
- util.make_checker(factory, method_view, permission)
+ make_checker(factory, method_view, permission)
return True
class ViewGrokker(martian.ClassGrokker):
@@ -175,8 +177,8 @@
name=view_name)
# protect view, public by default
- default_permission = util.get_default_permission(factory)
- util.make_checker(factory, factory, default_permission)
+ default_permission = get_default_permission(factory)
+ make_checker(factory, factory, default_permission)
# safety belt: make sure that the programmer didn't use
# @grok.require on any of the view's methods.
@@ -197,7 +199,7 @@
view_context = util.determine_class_context(factory, context)
methods = util.methods_from_class(factory)
- default_permission = util.get_default_permission(factory)
+ default_permission = get_default_permission(factory)
for method in methods:
# Create a new class with a __view_name__ attribute so the
@@ -217,7 +219,7 @@
permission = getattr(method, '__grok_require__',
default_permission)
- util.make_checker(factory, method_view, permission)
+ make_checker(factory, method_view, permission)
return True
class TraverserGrokker(martian.ClassGrokker):
Modified: grok/branches/grok-martian/src/grok/tests/util/class_annotation.py
===================================================================
--- grok/branches/grok-martian/src/grok/tests/util/class_annotation.py 2007-06-20 12:49:51 UTC (rev 76838)
+++ grok/branches/grok-martian/src/grok/tests/util/class_annotation.py 2007-06-20 13:06:22 UTC (rev 76839)
@@ -10,7 +10,7 @@
"""
import grok
-from grok import util
+from martian import util
class A(object):
__grok_foo__ = [5]
Modified: grok/branches/grok-martian/src/grok/util.py
===================================================================
--- grok/branches/grok-martian/src/grok/util.py 2007-06-20 12:49:51 UTC (rev 76838)
+++ grok/branches/grok-martian/src/grok/util.py 2007-06-20 13:06:22 UTC (rev 76839)
@@ -14,14 +14,9 @@
"""Grok utility functions.
"""
-import re
-import types
-import sys
-import inspect
import urllib
from zope import component
-from zope import interface
from zope.traversing.browser.interfaces import IAbsoluteURL
from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
@@ -29,109 +24,14 @@
from zope.security.interfaces import IPermission
from martian.error import GrokError, GrokImportError
+from martian.util import class_annotation
-from martian.util import (not_unicode_or_ascii, is_not_ascii,
- isclass, check_subclass)
-
-def caller_module():
- return sys._getframe(2).f_globals['__name__']
-
-
-def class_annotation(obj, name, default):
- return getattr(obj, '__%s__' % name.replace('.', '_'), default)
-
-def class_annotation_nobase(obj, name, default):
- """This will only look in the given class obj for the annotation.
-
- It will not look in the inheritance chain.
- """
- return obj.__dict__.get('__%s__' % name.replace('.', '_'), default)
-
-def class_annotation_list(obj, name, default):
- """This will process annotations that are lists correctly in the face of
- inheritance.
- """
- if class_annotation(obj, name, default) is default:
- return default
-
- result = []
- for base in reversed(obj.mro()):
- list = class_annotation(base, name, [])
- if list not in result:
- result.append(list)
-
- result_flattened = []
- for entry in result:
- result_flattened.extend(entry)
- return result_flattened
-
-def defined_locally(obj, dotted_name):
- obj_module = getattr(obj, '__grok_module__', None)
- if obj_module is None:
- obj_module = getattr(obj, '__module__', None)
- return obj_module == dotted_name
-
-
-AMBIGUOUS_CONTEXT = object()
-def check_context(component, context):
- if context is None:
- raise GrokError("No module-level context for %r, please use "
- "grok.context." % component, component)
- elif context is AMBIGUOUS_CONTEXT:
- raise GrokError("Multiple possible contexts for %r, please use "
- "grok.context." % component, component)
-
-
-def check_implements_one(class_):
- check_implements_one_from_list(list(interface.implementedBy(class_)), class_)
-
-def check_implements_one_from_list(list, class_):
- if len(list) < 1:
- raise GrokError("%r must implement at least one interface "
- "(use grok.implements to specify)."
- % class_, class_)
- elif len(list) > 1:
- raise GrokError("%r is implementing more than one interface "
- "(use grok.provides to specify which one to use)."
- % class_, class_)
-
-
def check_adapts(class_):
if component.adaptedBy(class_) is None:
raise GrokError("%r must specify which contexts it adapts "
"(use grok.adapts to specify)."
% class_, class_)
-
-def determine_module_context(module_info, models):
- if len(models) == 0:
- context = None
- elif len(models) == 1:
- context = models[0]
- else:
- context = AMBIGUOUS_CONTEXT
-
- module_context = module_info.getAnnotation('grok.context', None)
- if module_context:
- context = module_context
-
- return context
-
-
-def determine_class_context(class_, module_context):
- context = class_annotation(class_, 'grok.context', module_context)
- check_context(class_, context)
- return context
-
-
-def methods_from_class(class_):
- # XXX Problem with zope.interface here that makes us special-case
- # __provides__.
- candidates = [getattr(class_, name) for name in dir(class_)
- if name != '__provides__' ]
- methods = [c for c in candidates if inspect.ismethod(c)]
- return methods
-
def make_checker(factory, view_factory, permission):
"""Make a checker for a view_factory associated with factory.
More information about the Checkins
mailing list