[Checkins] SVN: grokcore.component/trunk/ fix global_adapter directive and grokker to allow for an explicit nameless registration even if the factory has a grok.name set

Jan-Wijbrand Kolman janwijbrand at gmail.com
Wed Apr 27 05:03:39 EDT 2011


Log message for revision 121468:
  fix global_adapter directive and grokker to allow for an explicit nameless registration even if the factory has a grok.name set

Changed:
  U   grokcore.component/trunk/CHANGES.txt
  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/tests/adapter/globaladapter.py

-=-
Modified: grokcore.component/trunk/CHANGES.txt
===================================================================
--- grokcore.component/trunk/CHANGES.txt	2011-04-27 08:38:44 UTC (rev 121467)
+++ grokcore.component/trunk/CHANGES.txt	2011-04-27 09:03:38 UTC (rev 121468)
@@ -4,9 +4,11 @@
 2.4 (unreleased)
 ----------------
 
-- Nothing changed yet.
+- Fix the `global_adapter` directive implementation to accept an explicit
+  "empty" name for nameless adapter registrations (as it used to be that
+  providing an empty name in the registration would actually result in
+  registering a named adapter in case the factory has a `grok.name`).
 
-
 2.3 (2011-02-14)
 ----------------
 

Modified: grokcore.component/trunk/src/grokcore/component/directive.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/directive.py	2011-04-27 08:38:44 UTC (rev 121467)
+++ grokcore.component/trunk/src/grokcore/component/directive.py	2011-04-27 09:03:38 UTC (rev 121468)
@@ -66,7 +66,7 @@
     """
     scope = martian.MODULE
 
-    def factory(self, factory, adapts=None, provides=None, name=u''):
+    def factory(self, factory, adapts=None, provides=None, name=None):
         if provides is not None and not IInterface.providedBy(provides):
             raise GrokImportError(
                 "You can only pass an interface to the "

Modified: grokcore.component/trunk/src/grokcore/component/meta.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/meta.py	2011-04-27 08:38:44 UTC (rev 121467)
+++ grokcore.component/trunk/src/grokcore/component/meta.py	2011-04-27 09:03:38 UTC (rev 121468)
@@ -199,7 +199,7 @@
                 adapts = getattr(factory, '__component_adapts__', None)
                 if adapts is None:
                     adapts = grokcore.component.context.bind().get(factory)
-            if not name:
+            if name is None:
                 name = grokcore.component.name.bind().get(factory)
 
             config.action(

Modified: grokcore.component/trunk/src/grokcore/component/tests/adapter/globaladapter.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/tests/adapter/globaladapter.py	2011-04-27 08:38:44 UTC (rev 121467)
+++ grokcore.component/trunk/src/grokcore/component/tests/adapter/globaladapter.py	2011-04-27 09:03:38 UTC (rev 121468)
@@ -1,34 +1,42 @@
 """
   >>> grok.testing.grok(__name__)
   >>> from zope.component import getAdapter, getMultiAdapter
-  
+
   >>> cave = Cave()
   >>> fireplace = Fireplace()
-  
+
   >>> home = IHome(cave)
   >>> home.id
   u'one'
-  
+
   >>> home = getAdapter(cave, IHome, name=u"two")
   >>> home.id
   u'two'
-  
+
   >>> home = getAdapter(cave, IHome, name=u"three")
   >>> home.id
   u'three'
-  
+
   >>> home = getAdapter(cave, IHome, name=u"four")
   >>> home.id
   u'four'
-  
+
   >>> home = getAdapter(fireplace, IHome, name=u"five")
   >>> home.id
   u'five'
-  
+
   >>> home = getMultiAdapter((cave, fireplace), IHome)
   >>> home.id
   u'six'
-  
+
+  >>> garage = getAdapter(cave, IGarage, name='named_garage_factory_name')
+  >>> garage.id
+  u"I'm a garage"
+
+  >>> garage = getAdapter(cave, IGarage)
+  >>> garage.id
+  u"I'm a garage"
+
 """
 
 import grokcore.component as grok
@@ -46,23 +54,23 @@
 
 class Home(object):
     grok.implements(IHome)
-    
+
     def __init__(self, id):
         self.id = id
 
 class CaveHomeFactory(object):
     grok.implements(IHome)
-    
+
     def __init__(self, id):
         self.id = id
-    
+
     def __call__(self, context):
         return Home(self.id)
 
 class CaveFireplaceHomeFactory(object):
     def __init__(self, id):
         self.id = id
-    
+
     def __call__(self, cave, fireplace):
         return Home(self.id)
 
@@ -82,9 +90,24 @@
 
 grok.adapter(Fireplace)(factory5)
 
-grok.global_adapter(factory1, Cave, IHome)                  # should accept single value for adapts
-grok.global_adapter(factory2, (Cave,), IHome, name="two")   # should accept tuple for adapts
-grok.global_adapter(factory3, Cave, name="three")           # should look at the provided interface
-grok.global_adapter(factory4, name=u"four")                 # should pick the canonical context
-grok.global_adapter(factory5, name="five")                  # should use __component_adapts__
-grok.global_adapter(factory6, (Cave, Fireplace,))           # should work as multi-adapter
+grok.global_adapter(factory1, Cave, IHome)  # should accept single value for adapts
+grok.global_adapter(factory2, (Cave,), IHome, name="two")  # should accept tuple for adapts
+grok.global_adapter(factory3, Cave, name="three")  # should look at the provided interface
+grok.global_adapter(factory4, name=u"four")  # should pick the canonical context
+grok.global_adapter(factory5, name="five")  # should use __component_adapts__
+grok.global_adapter(factory6, (Cave, Fireplace,))  # should work as multi-adapter
+
+class IGarage(interface.Interface):
+    pass
+
+class NamedGarageFactory(object):
+    grok.implements(IGarage)
+    grok.name('named_garage_factory_name')
+
+    def __init__(self, context):
+        self.id = u"I'm a garage"
+
+implementer(IGarage)(NamedGarageFactory)
+
+grok.global_adapter(NamedGarageFactory, Cave, IGarage)  # should register a named adapter
+grok.global_adapter(NamedGarageFactory, Cave, IGarage, name=u'')  # should override component's name



More information about the checkins mailing list