def test_getitem(self): """ Test for simple getitem and getitem on an object. """ dict1 = {"foo": "bar"} dict2 = Class2() crumbs = breadcrumbs.root["foo"] self.assertEqual(breadcrumbs.collapse(crumbs, dict1), "bar") self.assertEqual(breadcrumbs.collapse(crumbs, dict2), "bar")
def test_call(self): """ Test calls with and without arguments. """ instance = Class1() crumbs = breadcrumbs.root.foo() self.assertEqual(breadcrumbs.collapse(crumbs, instance), "bar") crumbs = breadcrumbs.root.bar("foo") self.assertEqual(breadcrumbs.collapse(crumbs, instance), "foo")
def test_getattr(self): """ Test for simple getattr. """ instance1 = Class1() crumbs = breadcrumbs.root.instance_attr1 self.assertEqual(breadcrumbs.collapse(crumbs, instance1), "foo") crumbs = breadcrumbs.root.class_attr1 self.assertEqual(breadcrumbs.collapse(crumbs, instance1), "foo")
def test_combine(self): """ Test combination of breadcrumbs. """ instance1 = Class1() instance2 = Class2() crumbs = breadcrumbs.root.instance_attr2["foo"] self.assertEqual(breadcrumbs.collapse(crumbs, instance1), "bar") crumbs = breadcrumbs.root.instance.bar("foo") self.assertEqual(breadcrumbs.collapse(crumbs, instance2), "foo")
def init(self, obj): """ Instanciate the plugin for a given component instance. :param obj: The obj to instanciate this plugin for. :rtype: A deferred object that fires when the plugin is ready. """ # Calling the init method twice for the same object does not make # much sens. Maybe the exception could be avoided and a fallback # behavior implemented. However, one should never call init manually. if obj in self.values: raise ValueError("Cannot initialize a TwistMC plugin twice.") dependency, args, kwargs = self.constructor # Check if the dependency is an interface. In that case, check if the # interface is implemented already. If not, defer until an # implementation is available. if isinstance(dependency, interface.interface.InterfaceClass): if dependency in Plugin.registry: self.values[obj] = Plugin.registry[dependency][0] return defer.succeed(None) else: if dependency not in Plugin.awaiting: Plugin.awaiting[dependency] = list() deferred = defer.Deferred() deferred.addCallback(self.assign, obj) Plugin.awaiting[dependency].append(deferred) return deferred else: # Collapse any breadcrumbs. args = list(args) for index, value in enumerate(args): if type(value) is breadcrumbs.Breadcrumb: args[index] = breadcrumbs.collapse(value, obj) for index, value in kwargs.iteritems(): if type(value) is breadcrumbs.Breadcrumb: args[index] = breadcrumbs.collapse(value, obj) # Call the object constructor. This might be an actual type # for type instance construction or any callable object (function, # etc.). self.values[obj] = dependency(*args, **kwargs) # pylint: disable=W0142,C0301 if hasattr(self.values[obj], READY): return getattr(self.values[obj], READY) else: return defer.succeed(None)