[Checkins] SVN: grokcore.component/trunk/ Merged the 'philikon-decl-dir-rules' branch:

Philipp von Weitershausen philikon at philikon.de
Wed May 14 12:18:11 EDT 2008


Log message for revision 86740:
  Merged the 'philikon-decl-dir-rules' branch:
  
  * Ported class grokkers to make use of the new declarative way of
    retrieving directive information from a class.  This requires
    Martian 0.9.6.
  
  

Changed:
  U   grokcore.component/trunk/CHANGES.txt
  U   grokcore.component/trunk/setup.py
  U   grokcore.component/trunk/src/grokcore/component/directive.py
  U   grokcore.component/trunk/src/grokcore/component/meta.py
  U   grokcore.component/trunk/src/grokcore/component/scan.py
  U   grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py
  U   grokcore.component/trunk/versions.cfg

-=-
Modified: grokcore.component/trunk/CHANGES.txt
===================================================================
--- grokcore.component/trunk/CHANGES.txt	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/CHANGES.txt	2008-05-14 16:18:11 UTC (rev 86740)
@@ -4,7 +4,9 @@
 1.3 (unreleased)
 ----------------
 
-* ...
+* Ported class grokkers to make use of the new declarative way of
+  retrieving directive information from a class.  This requires
+  Martian 0.9.6.
 
 1.2.1 (2008-05-04)
 ------------------

Modified: grokcore.component/trunk/setup.py
===================================================================
--- grokcore.component/trunk/setup.py	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/setup.py	2008-05-14 16:18:11 UTC (rev 86740)
@@ -32,7 +32,7 @@
     include_package_data=True,
     zip_safe=False,
     install_requires=['setuptools',
-                      'martian >= 0.9.5',
+                      'martian >= 0.9.6',
                       'zope.component',
                       'zope.configuration',
                       'zope.interface',

Modified: grokcore.component/trunk/src/grokcore/component/directive.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/directive.py	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/directive.py	2008-05-14 16:18:11 UTC (rev 86740)
@@ -18,7 +18,7 @@
 import grokcore.component
 from zope.interface.interfaces import IInterface
 from martian.error import GrokImportError
-from grokcore.component.scan import check_module_component
+from grokcore.component.scan import UnambiguousComponentScope
 
 class global_utility(martian.MultipleTimesDirective):
     scope = martian.MODULE
@@ -28,24 +28,15 @@
             raise GrokImportError(
                 "You can only pass an interface to the "
                 "provides argument of %s." % self.name)
-        return GlobalUtilityInfo(factory, provides, name, direct)
 
-class GlobalUtilityInfo(object):
-
-    def __init__(self, factory, provides=None, name=u'', direct=None):
-        self.factory = factory
+        if provides is None:
+            provides = grokcore.component.provides.bind().get(factory)
         if direct is None:
-            direct = grokcore.component.direct.get(factory)
-        self.direct = direct
+            direct = grokcore.component.direct.bind().get(factory)
+        if not name:
+            name = grokcore.component.name.bind().get(factory)
+        return (factory, provides, name, direct)
 
-        if provides is None:
-            provides = grokcore.component.provides.get(factory)
-        self.provides = provides
-
-        if name is u'':
-            name = grokcore.component.name.get(factory)
-        self.name = name
-
 class name(martian.Directive):
     scope = martian.CLASS
     store = martian.ONCE
@@ -53,19 +44,10 @@
     validate = martian.validateText
 
 class context(martian.Directive):
-    scope = martian.CLASS_OR_MODULE
+    scope = UnambiguousComponentScope('context')
     store = martian.ONCE
     validate = martian.validateInterfaceOrClass
 
-    @classmethod
-    def get(cls, component, module=None):
-        value = super(cls, context).get(component, module)
-        if not isinstance(component, types.ModuleType):
-            # 'component' must be a class then, so let's make sure
-            # that the context is not ambiguous or None.
-            check_module_component(component, value, 'context', cls)    
-        return value
-
 class title(martian.Directive):
     scope = martian.CLASS
     store = martian.ONCE

Modified: grokcore.component/trunk/src/grokcore/component/meta.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/meta.py	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/meta.py	2008-05-14 16:18:11 UTC (rev 86740)
@@ -24,15 +24,18 @@
 from grokcore.component.interfaces import IContext
 from grokcore.component.interfaces import IContext
 
-def get_provides(factory):
-    provides = grokcore.component.provides.get(factory)
 
-    if provides is None:
-        martian.util.check_implements_one(factory)
-        provides = list(interface.implementedBy(factory))[0]
-    return provides
+def default_provides(factory, module=None, **data):
+    martian.util.check_implements_one(factory)
+    return list(interface.implementedBy(factory))[0]
 
+def default_global_utility_provides(factory, module, direct, **data):
+    if direct:
+        martian.util.check_provides_one(factory)
+        return list(interface.providedBy(factory))[0]
+    return default_provides(factory)
 
+
 class ContextGrokker(martian.GlobalGrokker):
 
     priority = 1001
@@ -48,15 +51,17 @@
 class AdapterGrokker(martian.ClassGrokker):
     component_class = grokcore.component.Adapter
 
-    def grok(self, name, factory, module_info, config, **kw):
-        adapter_context = grokcore.component.context.get(factory, module_info.getModule())
-        provides = get_provides(factory)
-        name = grokcore.component.name.get(factory)
+    directives = [
+        grokcore.component.context.bind(),
+        grokcore.component.provides.bind(get_default=default_provides),
+        grokcore.component.name.bind(),
+        ]
 
+    def execute(self, factory, config, context, provides, name, **kw):
         config.action(
-            discriminator=('adapter', adapter_context, provides, name),
+            discriminator=('adapter', context, provides, name),
             callable=component.provideAdapter,
-            args=(factory, (adapter_context,), provides, name),
+            args=(factory, (context,), provides, name),
             )
         return True
 
@@ -64,10 +69,12 @@
 class MultiAdapterGrokker(martian.ClassGrokker):
     component_class = grokcore.component.MultiAdapter
 
-    def grok(self, name, factory, module_info, config, **kw):
-        provides = get_provides(factory)
-        name = grokcore.component.name.get(factory)
+    directives = [
+        grokcore.component.provides.bind(get_default=default_provides),
+        grokcore.component.name.bind(),
+        ]
 
+    def execute(self, factory, config, provides, name, **kw):
         if component.adaptedBy(factory) is None:
             raise GrokError("%r must specify which contexts it adapts "
                             "(use the 'adapts' directive to specify)."
@@ -89,33 +96,28 @@
     # happens, since it relies on the ITemplateFileFactories being grokked.
     priority = 1100
 
-    def grok(self, name, factory, module_info, config, **kw):
-        provides = grokcore.component.provides.get(factory)
-        direct = grokcore.component.direct.get(factory)
-        name = grokcore.component.name.get(factory)
+    directives = [
+        grokcore.component.direct.bind(),
+        grokcore.component.provides.bind(
+            get_default=default_global_utility_provides),
+        grokcore.component.name.bind(),
+        ]
 
-        if direct:
-            obj = factory
-            if provides is None:
-                martian.util.check_provides_one(factory)
-                provides = list(interface.providedBy(factory))[0]
-        else:
-            obj = factory()
-            if provides is None:
-                provides = get_provides(factory)
+    def execute(self, factory, config, direct, provides, name, **kw):
+        if not direct:
+            factory = factory()
 
         config.action(
             discriminator=('utility', provides, name),
             callable=component.provideUtility,
-            args=(obj, provides, name),
+            args=(factory, provides, name),
             )
         return True
 
-
 class AdapterDecoratorGrokker(martian.GlobalGrokker):
 
     def grok(self, name, module, module_info, config, **kw):
-        context = grokcore.component.context.get(module)
+        context = grokcore.component.context.bind().get(module=module)
         implementers = module_info.getAnnotation('implementers', [])
         for function in implementers:
             interfaces = getattr(function, '__component_adapts__', None)
@@ -137,25 +139,23 @@
 class GlobalUtilityDirectiveGrokker(martian.GlobalGrokker):
 
     def grok(self, name, module, module_info, config, **kw):
-        infos = grokcore.component.global_utility.get(module)
+        infos = grokcore.component.global_utility.bind().get(module=module)
 
-        for info in infos:
-            provides = info.provides
-
-            if info.direct:
-                obj = info.factory
+        for factory, provides, name, direct in infos:
+            if direct:
+                obj = factory
                 if provides is None:
                     martian.util.check_provides_one(obj)
                     provides = list(interface.providedBy(obj))[0]
             else:
-                obj = info.factory()
+                obj = factory()
                 if provides is None:
-                    provides = get_provides(info.factory)
+                    provides = default_provides(factory)
 
             config.action(
-                discriminator=('utility', provides, info.name),
+                discriminator=('utility', provides, name),
                 callable=component.provideUtility,
-                args=(obj, provides, info.name),
+                args=(obj, provides, name),
                 )
 
         return True

Modified: grokcore.component/trunk/src/grokcore/component/scan.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/scan.py	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/scan.py	2008-05-14 16:18:11 UTC (rev 86740)
@@ -16,6 +16,7 @@
 
 from martian.error import GrokError
 from martian.util import scan_for_classes
+from martian.directive import ClassOrModuleScope
 
 AMBIGUOUS_COMPONENT = object()
 def check_module_component(factory, component, component_name, directive):
@@ -64,7 +65,30 @@
     else:
         component= AMBIGUOUS_COMPONENT
 
-    module_component = directive.get(module)
+    module_component = directive.bind().get(module=module)
     if module_component is not None:
         component = module_component
     return component
+
+
+class UnambiguousComponentScope(ClassOrModuleScope):
+
+    def __init__(self, name):
+        self.name = name
+
+    def get(self, directive, component, module, default):
+        value = default
+        if component is not None:
+            value = directive.store.get(directive, component, default)
+        if value is default and module is not None:
+            value = directive.store.get(directive, module, default)
+
+        # When both 'component' and 'module' where passed in, perform
+        # a check for ambiguous components.
+        if None not in (component, module):
+            value_to_check = value
+            if value_to_check is default:
+                value_to_check = None
+            check_module_component(component, value_to_check, self.name,
+                                   directive)
+        return value

Modified: grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py	2008-05-14 16:18:11 UTC (rev 86740)
@@ -6,21 +6,24 @@
   >>> from martian import scan
   >>> import grokcore.component as grok
   >>> from grokcore.component.tests.directive import multipletimes
-  >>> guis = grok.global_utility.get(multipletimes)
-  >>> guis
-  [<grokcore.component.directive.GlobalUtilityInfo object at 0x...>,
-  <grokcore.component.directive.GlobalUtilityInfo object at 0x...>]
-  >>> guis[0].factory
+  >>> guis = grok.global_utility.bind().get(module=multipletimes)
+  >>> len(guis)
+  2
+
+  >>> factory, provides, name, direct = guis[0]
+  >>> factory
   <class 'grokcore.component.tests.directive.multipletimes.Club'>
-  >>> guis[0].provides
+  >>> provides
   <InterfaceClass grokcore.component.tests.directive.multipletimes.IClub>
-  >>> guis[0].name
+  >>> name
   'foo'
-  >>> guis[1].factory
+
+  >>> factory, provides, name, direct = guis[1]
+  >>> factory
   <class 'grokcore.component.tests.directive.multipletimes.Cave'>
-  >>> guis[1].provides is None
+  >>> provides is None
   True
-  >>> guis[1].name
+  >>> name
   u''
 
 """

Modified: grokcore.component/trunk/versions.cfg
===================================================================
--- grokcore.component/trunk/versions.cfg	2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/versions.cfg	2008-05-14 16:18:11 UTC (rev 86740)
@@ -1,5 +1,5 @@
 [versions]
-martian = 0.9.5
+martian = 0.9.6
 zope.configuration = 3.4.0
 zope.deferredimport = 3.4.0
 zope.deprecation = 3.4.0



More information about the Checkins mailing list