[Checkins] SVN: grok/branches/gotcha-configuration-actions/src/grok/ replace single grok configuration action with zope 3 actions; work in progress

Godefroid Chapelle gotcha at bubblenet.be
Tue Oct 9 07:19:20 EDT 2007


Log message for revision 80735:
  replace single grok configuration action with zope 3 actions; work in progress

Changed:
  U   grok/branches/gotcha-configuration-actions/src/grok/_grok.py
  U   grok/branches/gotcha-configuration-actions/src/grok/meta.py
  U   grok/branches/gotcha-configuration-actions/src/grok/zcml.py

-=-
Modified: grok/branches/gotcha-configuration-actions/src/grok/_grok.py
===================================================================
--- grok/branches/gotcha-configuration-actions/src/grok/_grok.py	2007-10-09 10:55:48 UTC (rev 80734)
+++ grok/branches/gotcha-configuration-actions/src/grok/_grok.py	2007-10-09 11:19:19 UTC (rev 80735)
@@ -75,13 +75,13 @@
 def skip_tests(name):
     return name in ['tests', 'ftests']
 
-def do_grok(dotted_name):
+def do_grok(dotted_name, config):
     global _bootstrapped
     if not _bootstrapped:
         bootstrap()
         _bootstrapped = True
     martian.grok_dotted_name(
-        dotted_name, the_module_grokker, exclude_filter=skip_tests)
+        dotted_name, the_module_grokker, exclude_filter=skip_tests, config=config)
 
 def grok_component(name, component,
                    context=None, module_info=None, templates=None):
@@ -90,6 +90,13 @@
                                   module_info=module_info,
                                   templates=templates)
 
+class GrokkingInfo(object):
+    def __init__(self, config, context, module_info, templates):
+        self.config = config
+        self.context = context
+        self.module_info = module_info
+        self.templates = templates
+
 def prepare_grok(name, module, kw):
     module_info = scan.module_info_from_module(
         module, exclude_filter=skip_tests)
@@ -100,13 +107,19 @@
                                                           grok.Container])
     context = determine_module_context(module_info, possible_contexts)
 
-    kw['context'] = context
-    kw['module_info'] = module_info
-    kw['templates'] = templatereg.TemplateRegistry()
+    if kw.has_key('config'):
+        config = kw['config']
+        del kw['config']
+    else:
+        config = None
+    info =  GrokkingInfo(context=context, config=config, 
+        module_info=module_info, templates=templatereg.TemplateRegistry())
+    kw['info'] = info
 
 def finalize_grok(name, module, kw):
-    module_info = kw['module_info']
-    templates = kw['templates']
+    info =  kw['info']
+    module_info = info.module_info
+    templates = info.templates
     unassociated = list(templates.listUnassociated())
     if unassociated:
         raise GrokError("Found the following unassociated template(s) when "

Modified: grok/branches/gotcha-configuration-actions/src/grok/meta.py
===================================================================
--- grok/branches/gotcha-configuration-actions/src/grok/meta.py	2007-10-09 10:55:48 UTC (rev 80734)
+++ grok/branches/gotcha-configuration-actions/src/grok/meta.py	2007-10-09 11:19:19 UTC (rev 80735)
@@ -48,51 +48,82 @@
 from grok import components, formlib
 from grok.util import check_adapts, get_default_permission, make_checker
 
-
 class AdapterGrokker(martian.ClassGrokker):
     component_class = grok.Adapter
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         adapter_context = util.determine_class_context(factory, context)
         provides = util.class_annotation(factory, 'grok.provides', None)
         if provides is None:
             util.check_implements_one(factory)
         name = util.class_annotation(factory, 'grok.name', '')
-        component.provideAdapter(factory, adapts=(adapter_context,),
-                                 provides=provides,
-                                 name=name)
+        config.action( 
+            discriminator=('grokadapter', adapter_context, provides, name),
+            callable=component.provideAdapter,
+            args=(factory,),
+            kw=dict(
+                    adapts=(adapter_context,),
+                    provides=provides,
+                    name=name
+                   )
+            )
         return True
 
-
 class MultiAdapterGrokker(martian.ClassGrokker):
     component_class = grok.MultiAdapter
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         provides = util.class_annotation(factory, 'grok.provides', None)
         if provides is None:
             util.check_implements_one(factory)
         check_adapts(factory)
         name = util.class_annotation(factory, 'grok.name', '')
-        component.provideAdapter(factory, provides=provides, name=name)
+        config.action(
+            discriminator=('grokmultiadapter', provides, name),
+            callable=component.provideAdapter,
+            args=(factory,),
+            kw=dict(
+                    provides=provides,
+                    name=name
+                   )
+            )
         return True
 
 
 class GlobalUtilityGrokker(martian.ClassGrokker):
     component_class = grok.GlobalUtility
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         provides = util.class_annotation(factory, 'grok.provides', None)
         if provides is None:
             util.check_implements_one(factory)
         name = util.class_annotation(factory, 'grok.name', '')
-        component.provideUtility(factory(), provides=provides, name=name)
+        config.action(
+            discriminator=('grokglobalutility', provides, name),
+            callable=component.provideUtility,
+            args=(factory(),),
+            kw=dict(
+                    provides=provides,
+                    name=name
+                   )
+            )
         return True
 
 
 class XMLRPCGrokker(martian.ClassGrokker):
     component_class = grok.XMLRPC
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         view_context = util.determine_class_context(factory, context)
         # XXX We should really not make __FOO__ methods available to
         # the outside -- need to discuss how to restrict such things.
@@ -124,7 +155,9 @@
 class ViewGrokker(martian.ClassGrokker):
     component_class = grok.View
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
 
         view_context = util.determine_class_context(factory, context)
 
@@ -175,22 +208,6 @@
                 raise GrokError("View %r has no associated template or "
                                 "'render' method." % factory, factory)
 
-        # grab layer from class or module
-        view_layer = determine_class_directive('grok.layer', factory, module_info, default=IDefaultBrowserLayer)
-
-        view_name = util.class_annotation(factory, 'grok.name',
-                                          factory_name)
-        # __view_name__ is needed to support IAbsoluteURL on views
-        factory.__view_name__ = view_name
-        component.provideAdapter(factory,
-                                 adapts=(view_context, view_layer),
-                                 provides=interface.Interface,
-                                 name=view_name)
-
-        # protect view, public by default
-        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.
         methods = util.methods_from_class(factory)
@@ -200,13 +217,43 @@
                                 'method %r in view %r. It may only be used '
                                 'for XML-RPC methods.'
                                 % (method.__name__, factory), factory)
+
+        # grab layer from class or module
+        view_layer = determine_class_directive('grok.layer', factory, module_info, default=IDefaultBrowserLayer)
+
+        view_name = util.class_annotation(factory, 'grok.name',
+                                          factory_name)
+        # __view_name__ is needed to support IAbsoluteURL on views
+        factory.__view_name__ = view_name
+        adapts = (view_context, view_layer)
+        config.action(
+            discriminator=('grokview', adapts, view_name),
+            callable=setupView,
+            args=(factory,),
+            kw=dict(
+                    provides=interface.Interface,
+                    adapts=adapts,
+                    name=view_name
+                   )
+            )
+        
         return True
 
+def setupView(factory, provides, adapts, name):
+    component.provideAdapter(factory, provides=provides,
+        adapts=adapts, name=name)
+    # protect view, public by default
+    default_permission = get_default_permission(factory)
+    make_checker(factory, factory, default_permission)
 
+
+
 class JSONGrokker(martian.ClassGrokker):
     component_class = grok.JSON
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         view_context = util.determine_class_context(factory, context)
         methods = util.methods_from_class(factory)
 
@@ -237,7 +284,9 @@
 class TraverserGrokker(martian.ClassGrokker):
     component_class = grok.Traverser
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         factory_context = util.determine_class_context(factory, context)
         component.provideAdapter(factory,
                                  adapts=(factory_context, IBrowserRequest),
@@ -252,7 +301,9 @@
 
     component_class = grok.PageTemplate
 
-    def grok(self, name, instance, context, module_info, templates):
+    def grok(self, name, instance, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         templates.register(name, instance)
         instance._annotateGrokInfo(name, module_info.dotted_name)
         return True
@@ -269,14 +320,18 @@
     # already grokked for error reporting
     priority = 999
 
-    def grok(self, name, module, context, module_info, templates):
+    def grok(self, name, module, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         templates.findFilesystem(module_info)
         return True
 
 
 class SubscriberGrokker(martian.GlobalGrokker):
 
-    def grok(self, name, module, context, module_info, templates):
+    def grok(self, name, module, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         subscribers = module_info.getAnnotation('grok.subscribers', [])
 
         for factory, subscribed in subscribers:
@@ -288,7 +343,9 @@
 
 class AdapterDecoratorGrokker(martian.GlobalGrokker):
 
-    def grok(self, name, module, context, module_info, templates):
+    def grok(self, name, module, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         implementers = module_info.getAnnotation('implementers', [])
         for function in implementers:
             interfaces = getattr(function, '__component_adapts__', None)
@@ -304,7 +361,9 @@
 
 class StaticResourcesGrokker(martian.GlobalGrokker):
 
-    def grok(self, name, module, context, module_info, templates):
+    def grok(self, name, module, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         # we're only interested in static resources if this module
         # happens to be a package
         if not module_info.isPackage():
@@ -335,7 +394,9 @@
 
 class GlobalUtilityDirectiveGrokker(martian.GlobalGrokker):
 
-    def grok(self, name, module, context, module_info, templates):
+    def grok(self, name, module, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         infos = module_info.getAnnotation('grok.global_utility', [])
 
         for info in infos:
@@ -355,7 +416,9 @@
     component_class = grok.Site
     priority = 500
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         infos = util.class_annotation_list(factory, 'grok.local_utility', None)
         if infos is None:
             return False
@@ -419,9 +482,15 @@
 
         # store infos on site class
         factory.__grok_utilities_to_install__ = overridden_infos
-        component.provideHandler(localUtilityRegistrationSubscriber,
-                                 adapts=(factory, grok.IObjectAddedEvent))
-
+        adapts = (factory, grok.IObjectAddedEvent)
+        config.action( 
+            discriminator=('groksubscriber', adapts),
+            callable=component.provideHandler,
+            args=(localUtilityRegistrationSubscriber,),
+            kw=dict(
+                    adapts=adapts,
+                   )
+            )
         return True
 
 
@@ -483,7 +552,9 @@
     component_class = grok.Permission
     priority = 1500
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         id = util.class_annotation(factory, 'grok.name', None)
         if id is None:
             raise GrokError(
@@ -496,14 +567,24 @@
             id,
             unicode(util.class_annotation(factory, 'grok.title', id)),
             unicode(util.class_annotation(factory, 'grok.description', '')))
-        component.provideUtility(permission, name=id)
+        config.action( 
+            discriminator=('grokpermission', name),
+            callable=component.provideUtility,
+            args=(permission,),
+            kw=dict(
+                    name=id
+                   ),
+            order = self.priority
+            )
         return True
 
 class DefineRoleGrokker(martian.ClassGrokker):
     component_class = grok.Role
     priority = DefinePermissionGrokker.priority - 1
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         id = util.class_annotation(factory, 'grok.name', None)
         if id is None:
             raise GrokError(
@@ -516,16 +597,29 @@
             id,
             unicode(util.class_annotation(factory, 'grok.title', id)),
             unicode(util.class_annotation(factory, 'grok.description', '')))
-        component.provideUtility(role, name=id)
+        config.action( 
+            discriminator=('grokpermission', name),
+            callable=setupRole,
+            args=(factory, role),
+            kw=dict(
+                    name=id
+                   ),
+            order = self.priority
+            )
+        return True
+
+def setupRole(factory, role, name):
+        component.provideUtility(role, name=name)
         permissions = util.class_annotation(factory, 'grok.permissions', ())
         for permission in permissions:
             rolePermissionManager.grantPermissionToRole(permission, id)
-        return True
 
 class AnnotationGrokker(martian.ClassGrokker):
     component_class = grok.Annotation
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         adapter_context = util.determine_class_context(factory, context)
         provides = util.class_annotation(factory, 'grok.provides', None)
         if provides is None:
@@ -564,7 +658,9 @@
     component_class = grok.Application
     priority = 500
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         # XXX fail loudly if the same application name is used twice.
         zope.component.provideUtility(factory,
                                       provides=grok.interfaces.IApplication,
@@ -576,7 +672,9 @@
 class IndexesGrokker(martian.InstanceGrokker):
     component_class = components.IndexesClass
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
         site = util.class_annotation(factory, 'grok.site', None)
         if site is None:
             raise GrokError("No site specified for grok.Indexes "
@@ -649,7 +747,9 @@
 class SkinGrokker(martian.ClassGrokker):
     component_class = grok.Skin
 
-    def grok(self, name, factory, context, module_info, templates):
+    def grok(self, name, factory, info):
+        context, module_info, templates, config = (
+            info.context, info.module_info, info.templates, info.config)
 
         layer = determine_class_directive('grok.layer', factory, module_info, default=IBrowserRequest)
         name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())

Modified: grok/branches/gotcha-configuration-actions/src/grok/zcml.py
===================================================================
--- grok/branches/gotcha-configuration-actions/src/grok/zcml.py	2007-10-09 10:55:48 UTC (rev 80734)
+++ grok/branches/gotcha-configuration-actions/src/grok/zcml.py	2007-10-09 11:19:19 UTC (rev 80735)
@@ -30,8 +30,5 @@
 
 
 def grokDirective(_context, package):
-    _context.action(
-        discriminator=('grok', package.__name__),
-        callable=grok.grok,
-        args=(package.__name__,)
-        )
+    grok.grok(package.__name__, config=_context)
+



More information about the Checkins mailing list