コード例 #1
0
ファイル: stamping.py プロジェクト: HackLinux/chandler
    def __init__(cls, name, bases, cdict):
        cls.__initialValues__ = iv = []
        for name,ob in cdict.items():
            if isinstance(ob,schema.Descriptor) and hasattr(ob,'initialValue'):
                iv.append((name, ob.initialValue))
                del ob.initialValue

        super(StampClass,cls).__init__(name, bases, cdict)

        cls.__all_ivs__, cls.__setup__ = schema._initializers_for(cls)
コード例 #2
0
    def __init__(cls, name, bases, cdict):
        cls.__initialValues__ = iv = []
        for name, ob in cdict.items():
            if isinstance(ob, schema.Descriptor) and hasattr(
                    ob, 'initialValue'):
                iv.append((name, ob.initialValue))
                del ob.initialValue

        super(StampClass, cls).__init__(name, bases, cdict)

        cls.__all_ivs__, cls.__setup__ = schema._initializers_for(cls)
コード例 #3
0
ファイル: eim.py プロジェクト: HackLinux/chandler
    def deferredItem(self, uuid, itype=schema.Item, **attrs):
        """Return deferred for a stamp or item by UUID+type w/optional attrs"""
        if isinstance(uuid, Deferred):
            d = Deferred()
            @uuid.addCallback
            def uuid_to_item(uuid):
                if uuid in (None, NoChange):
                    d.callback(uuid)
                else:
                    self.deferredItem(uuid, itype, **attrs).addCallback(d.callback)
                return uuid
            uuid.addErrback(self.recordFailure)
            return d

        def setattrs(ob):
            # Set specified attributes, skipping NoChange attrs, and deleting
            # Inherit attrs
            for attr, val in attrs.items(): self.smart_setattr(val, ob, attr)
            return ob   # return value for deferreds

        if issubclass(itype, pim.Stamp):
            d = self.deferredItem(uuid, itype.targetType())
            @d.addCallback
            def add_stamp(item):
                stamp = itype(item)
                if not stamp.stamp_types or itype not in stamp.stamp_types:
                    stamp.add()
                return setattrs(stamp)  # return value for deferreds
            return d.addErrback(self.recordFailure)
            
        item = self.rv.findUUID(uuid)
        d = Deferred().addCallback(setattrs).addErrback(self.recordFailure)
        if item is None:    # Create the item
            if isinstance(uuid, basestring):
                uuid = UUID(uuid)
            item = itype(itsView=self.rv, _uuid=uuid)
            
        if isinstance(item, itype):
            d.callback(item)
            return d
            
        if not issubclass(itype, type(item)):
            # Can't load the item yet; put callbacks on the queue
            self.loadQueue.setdefault(item, []).append((itype, d))
            return d
           
        # Upgrade the item type, set attributes, and run setups       
        old_type = item.__class__
        item.__class__ = itype
        item.itsKind = itype.getKind(self.rv)

        ivs, setups = schema._initializers_for(itype, old_type.__mro__)
        for k,f in ivs: setattr(item, k, f(item))
        setattrs(item)
        for c,s in setups: s(item)

        # run callbacks for any pending types that are now resolved
        if item in self.loadQueue:
            q = self.loadQueue[item]
            for t, cbd in q[:]:
                if isinstance(item, t):
                    cbd.callback(item)
                    q.remove((t,cbd))
                    if not q:
                        del self.loadQueue[item]
        d.callback(item)
        return d
コード例 #4
0
    def deferredItem(self, uuid, itype=schema.Item, **attrs):
        """Return deferred for a stamp or item by UUID+type w/optional attrs"""
        if isinstance(uuid, Deferred):
            d = Deferred()

            @uuid.addCallback
            def uuid_to_item(uuid):
                if uuid in (None, NoChange):
                    d.callback(uuid)
                else:
                    self.deferredItem(uuid, itype,
                                      **attrs).addCallback(d.callback)
                return uuid

            uuid.addErrback(self.recordFailure)
            return d

        def setattrs(ob):
            # Set specified attributes, skipping NoChange attrs, and deleting
            # Inherit attrs
            for attr, val in attrs.items():
                self.smart_setattr(val, ob, attr)
            return ob  # return value for deferreds

        if issubclass(itype, pim.Stamp):
            d = self.deferredItem(uuid, itype.targetType())

            @d.addCallback
            def add_stamp(item):
                stamp = itype(item)
                if not stamp.stamp_types or itype not in stamp.stamp_types:
                    stamp.add()
                return setattrs(stamp)  # return value for deferreds

            return d.addErrback(self.recordFailure)

        item = self.rv.findUUID(uuid)
        d = Deferred().addCallback(setattrs).addErrback(self.recordFailure)
        if item is None:  # Create the item
            if isinstance(uuid, basestring):
                uuid = UUID(uuid)
            item = itype(itsView=self.rv, _uuid=uuid)

        if isinstance(item, itype):
            d.callback(item)
            return d

        if not issubclass(itype, type(item)):
            # Can't load the item yet; put callbacks on the queue
            self.loadQueue.setdefault(item, []).append((itype, d))
            return d

        # Upgrade the item type, set attributes, and run setups
        old_type = item.__class__
        item.__class__ = itype
        item.itsKind = itype.getKind(self.rv)

        ivs, setups = schema._initializers_for(itype, old_type.__mro__)
        for k, f in ivs:
            setattr(item, k, f(item))
        setattrs(item)
        for c, s in setups:
            s(item)

        # run callbacks for any pending types that are now resolved
        if item in self.loadQueue:
            q = self.loadQueue[item]
            for t, cbd in q[:]:
                if isinstance(item, t):
                    cbd.callback(item)
                    q.remove((t, cbd))
                    if not q:
                        del self.loadQueue[item]
        d.callback(item)
        return d