[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