Ejemplo n.º 1
0
 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")
Ejemplo n.º 2
0
 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")
Ejemplo n.º 3
0
 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")
Ejemplo n.º 4
0
 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")
Ejemplo n.º 5
0
    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)