[merge] LazyFactory
Adeodato Simó
dato at net.com.org.es
Tue Aug 15 19:07:30 BST 2006
* John Arbash Meinel [Mon, 14 Aug 2006 23:05:48 -0500]:
> Adeodato Simó wrote:
> > * John Arbash Meinel [Mon, 14 Aug 2006 11:34:32 -0500]:
> You can convince me if you have an actual use case for fallback_key.
As discussed on IRC, I've killed fallback_key.
> We need a way to specify what the real default is (just having it set at
> to the first key doesn't let something later on update it to a new key).
And this was already there with the "default_key" property().
> > I hope this can make it into 0.10, maybe even with making log.py use it.
> > BTW, would this addition need a NEWS entry under "INTERNALS"?
> Probably would be good to add something to INTERNALS.
Done that, too (full commit in the HTTP branch):
INTERNALS:
+ * New Registry class to provide name-to-object registry-like support,
+ for example for schemes where plugins can register new classes to
+ do certain tasks (e.g. log formatters). Subclass LazyImportRegistry
+ provides support modules to be loaded on request. (John Arbash
+ Meinel, Adeodato Simó)
> I'm not sure what will use it.
I know I want to look into Aaron's optparse branch and move from
EnumOption for --log-format to an option that gets the possible values
from a registry. That should solve the "formats registered by plugins
don't show in help" problem. And ditto for my commit --template option.
> It just needs to be accepted before Monday, though.
I hope it does. :-)
Thanks again,
--
Adeodato Simó dato at net.com.org.es
Debian Developer adeodato at debian.org
Listening to: Leonard Cohen - Bird on the wire
-------------- next part --------------
# Bazaar revision bundle v0.8
#
# message:
# Kill fallback_key parameter in Registry.get(), as discussed with John.
#
# This frees up the base class from unneeded complexity, and a subclass
# can implement that feature should it ever be needed (there are no known
# use cases at the moment).
#
# committer: Adeodato Simó <dato at net.com.org.es>
# date: Tue 2006-08-15 19:51:35.053999901 +0200
=== modified file bzrlib/registry.py
--- bzrlib/registry.py
+++ bzrlib/registry.py
@@ -17,9 +17,6 @@
"""Classes to provide name-to-object registry-like support."""
-_marker = object()
-
-
class Registry(object):
"""A class that registers objects to a name."""
@@ -43,30 +40,20 @@
self._default_key = key
self._dict[key] = object
- def get(self, key=None, fallback_key=_marker):
- """Return the object register()'ed by the given key.
-
- This may raise KeyError if the key is not present.
-
- :param key: The key to obtain the object for. If no object was
- registered to that key, the object registered for :param
- fallback_key:, if exists, will be returned instead.
- :param fallback_key: Key to use if an object for :param key: can't be
- found; defaults to self.default_key. Set it to None if you'd like
- to ensure an exception is raised for non-found keys.
+ def get(self, key=None):
+ """Return the object register()'ed to the given key.
+
+ :param key: The key to obtain the object for. If no object has been
+ registered to that key, the object registered for self.default_key
+ will be returned instead, if it exists. Otherwise KeyError will be
+ raised.
:return: The previously registered object.
"""
- if fallback_key is _marker:
- fallback_key = self.default_key
-
try:
- if key is None:
- return self._dict[fallback_key]
- else:
- return self._dict[key]
+ return self._dict[key]
except KeyError:
- if fallback_key is not None:
- return self._dict[fallback_key]
+ if self.default_key is not None:
+ return self._dict[self.default_key]
else:
raise
@@ -99,13 +86,13 @@
"""
Registry.register(self, key, (module_name, member_name))
- def get(self, key=None, default_key=_marker):
+ def get(self, key=None):
"""Load the module and return the object specified by the given key.
May raise ImportError if there are any problems, or AttributeError if
the module does not have the supplied member.
"""
- module_name, member_name = Registry.get(self, key, default_key)
+ module_name, member_name = Registry.get(self, key)
module = __import__(module_name, globals(), locals(), [member_name])
if member_name:
return getattr(module, member_name)
=== modified file bzrlib/tests/test_registry.py
--- bzrlib/tests/test_registry.py
+++ bzrlib/tests/test_registry.py
@@ -45,13 +45,12 @@
self.assertRaises(KeyError, registry_.get, None)
self.assertEqual(2, registry_.get('two'))
self.assertRaises(KeyError, registry_.get, 'three')
- self.assertEqual(4, registry_.get('three', 'four'))
- self.assertEqual(4, registry_.get(None, 'four'))
- self.assertRaises(KeyError, registry_.get, 'three', 'no-such-key')
# test _set_default_key
registry_.default_key = 'five'
self.failUnless(registry_.default_key == 'five')
+ self.assertEqual(5, registry_.get())
+ self.assertEqual(5, registry_.get(None))
self.assertEqual(5, registry_.get('six'))
self.assertRaises(KeyError, registry_._set_default_key, 'six')
@@ -69,13 +68,12 @@
self.assertEqual(1, registry_.get(None))
self.assertEqual(2, registry_.get('two'))
self.assertEqual(1, registry_.get('three'))
- self.assertEqual(4, registry_.get('three', 'four'))
- self.assertEqual(4, registry_.get(None, 'four'))
- self.assertRaises(KeyError, registry_.get, 'three', 'no-such-key')
# test _set_default_key
registry_.default_key = 'five'
self.failUnless(registry_.default_key == 'five')
+ self.assertEqual(5, registry_.get())
+ self.assertEqual(5, registry_.get(None))
self.assertEqual(5, registry_.get('six'))
self.assertRaises(KeyError, registry_._set_default_key, 'six')
# revision id: dato at net.com.org.es-20060815175135-c8390000cdf6561a
# sha1: 94e351cba87496061ca75e4baaaa6f4e8fae3b89
# inventory sha1: 7c10eb1f824377d21f9a412b13415ec5333bfeb8
# parent ids:
# dato at net.com.org.es-20060815020435-5972a9c8ad16b7de
# base id: dato at net.com.org.es-20060815020435-5972a9c8ad16b7de
# properties:
# branch-nick: registry_class
More information about the bazaar
mailing list