[Checkins] SVN: grok/branches/faassen-martian/martian/src/martian/ Refactor to make global-level grokking happen in the MultiMartian,

Martijn Faassen faassen at infrae.com
Tue May 1 18:08:06 EDT 2007


Log message for revision 74978:
  Refactor to make global-level grokking happen in the MultiMartian,
  which is now also the default martian used by the ModuleMartian.
  

Changed:
  U   grok/branches/faassen-martian/martian/src/martian/README.txt
  U   grok/branches/faassen-martian/martian/src/martian/core.py

-=-
Modified: grok/branches/faassen-martian/martian/src/martian/README.txt
===================================================================
--- grok/branches/faassen-martian/martian/src/martian/README.txt	2007-05-01 22:01:40 UTC (rev 74977)
+++ grok/branches/faassen-martian/martian/src/martian/README.txt	2007-05-01 22:08:06 UTC (rev 74978)
@@ -201,10 +201,11 @@
 
 The idea is that the ``ModuleMartian`` groks any components in a
 module that it recognizes. A ``ModuleMartian`` does not work alone. It
-needs to be supplied with a martian that can grok the components
-to be founded in a module::
+needs to be supplied with one or more martians that can grok the
+components to be founded in a module::
 
-  >>> module_martian = ModuleMartian(filetype_martian)
+  >>> module_martian = ModuleMartian()
+  >>> module_martian.register(filetype_martian)
 
 Note that directly putting a martian into a ``ModuleMartian`` is
 typically not recommended - normally you would put in a multi martian
@@ -322,7 +323,8 @@
   ...   blue = Color(0, 0, 255)
   ...   white = Color(255, 255, 255)
   >>> colors = fake_import(colors)
-  >>> colors_martian = ModuleMartian(color_martian)
+  >>> colors_martian = ModuleMartian() 
+  >>> colors_martian.register(color_martian)
   >>> colors_martian.grok('colors', colors)
   True
   >>> sorted(color.all_colors.items())
@@ -400,7 +402,8 @@
   >>> multi_martian.grok('something_else', something_else)
   False
 
-Let's put our ``multi_martian`` in a ``ModuleMartian``::
+Let's put our ``multi_martian`` in a ``ModuleMartian``. We can do
+this by passing it explicitly to the ``ModuleMartian`` factory::
 
   >>> module_martian = ModuleMartian(multi_martian)
 
@@ -637,6 +640,10 @@
 
   >>> mix_martian = ModuleMartian(multi)
 
+Note that this is actually equivalent to calling ``ModuleMartian``
+without arguments and then calling ``register`` for the individual
+``ClassMartian`` and ``InstanceMartian`` objects.
+
 Before we do the grokking, let's clean up our registration
 dictionaries::
 
@@ -682,14 +689,12 @@
 
 Let's construct a ``ModuleMartian`` with this ``GlobalMartian`` registered::
 
-  >>> from martian.core import MultiGlobalMartian
-  >>> multi_global_martian = MultiGlobalMartian()
-  >>> multi_global_martian.register(AmountMartian())
-  >>> mix_martian = ModuleMartian(multi, multi_global_martian)
+  >>> martian = ModuleMartian()
+  >>> martian.register(AmountMartian())
 
 Now we grok and should pick up the right value::
 
-  >>> mix_martian.grok('g', g)
+  >>> martian.grok('g', g)
   True
   >>> read_amount[None]
   50 

Modified: grok/branches/faassen-martian/martian/src/martian/core.py
===================================================================
--- grok/branches/faassen-martian/martian/src/martian/core.py	2007-05-01 22:01:40 UTC (rev 74977)
+++ grok/branches/faassen-martian/martian/src/martian/core.py	2007-05-01 22:08:06 UTC (rev 74978)
@@ -15,16 +15,24 @@
 class ModuleMartian(MartianBase):
     implements(IMultiMartian)
 
-    def __init__(self, martian, global_martian=None):
+    def __init__(self, martian=None):
+        if martian is None:
+            martian = MultiMartian()
         self._martian = martian
-        self._global_martian = global_martian
+
+    def register(self, martian):
+        self._martian.register(martian)
         
     def grok(self, name, module, **kw):
         grokked_status = False
-        if self._global_martian:
-            grokked_status = self._global_martian.grok(name, module, **kw)
         martian = self._martian
-    
+
+        # trigger any global martians
+        grokked = martian.grok(name, module, **kw)
+        if grokked:
+            grokked_status = True
+
+        # try to grok everything in module
         for name in dir(module):
             if name.startswith('__grok_'):
                 continue
@@ -72,6 +80,8 @@
 
 class MultiClassMartian(MultiMartianBase):
     def get_bases(self, obj):
+        if type(obj) is types.ModuleType:
+            return []
         return inspect.getmro(obj)
 
 class MultiGlobalMartian(MartianBase):
@@ -97,17 +107,23 @@
     def __init__(self):
         self._multi_instance_martian = MultiInstanceMartian()
         self._multi_class_martian = MultiClassMartian()
-
+        self._multi_global_martian = MultiGlobalMartian()
+        
     def register(self, martian):
         if isinstance(martian, InstanceMartian):
             self._multi_instance_martian.register(martian)
         elif isinstance(martian, ClassMartian):
             self._multi_class_martian.register(martian)
+        elif isinstance(martian, GlobalMartian):
+            self._multi_global_martian.register(martian)
         else:
             assert 0, "Unknown type of martian: %r" % martian
 
     def grok(self, name, obj, **kw):
-        if type(obj) in (type, types.ClassType):
+        obj_type = type(obj)
+        if obj_type in (type, types.ClassType):
             return self._multi_class_martian.grok(name, obj, **kw)
+        elif obj_type is types.ModuleType:
+            return self._multi_global_martian.grok(name, obj, **kw)
         else:
             return self._multi_instance_martian.grok(name, obj, **kw)



More information about the Checkins mailing list