[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