Beispiel #1
0
class AliasAnnotations(MutableMapping):
    """Layer draft annotations atop target annotations
    """
    def __init__(self, proxy):
        self.proxy = proxy

        self.draft = self.proxy._DraftProxy__draft
        self.target = self.proxy._DraftProxy__target

        self.draftAnnotations = IAnnotations(self.draft)
        self.targetAnnotations = IAnnotations(self.target)

    def __bool__(self):
        return self.targetAnnotations.__bool__() or \
            self.draftAnnotations.__bool__()

    def get(self, key, default=None):

        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        if key in deleted:
            return default

        value = self.draftAnnotations.get(key, _marker)
        if value is _marker:
            value = self.targetAnnotations.get(key, _marker)
        if value is _marker:
            return default

        return value

    def __getitem__(self, key):
        value = self.get(key, _marker)
        if value is _marker:
            raise KeyError(key)
        return value

    def __iter__(self):
        # adhere to MutableMapping interface
        for val in self.draftAnnotations.values():
            yield val

    def __len__(self):
        # adhere to MutableMapping interface
        return len(self.draftAnnotations)

    def keys(self):
        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        keys = set(self.draftAnnotations.keys())
        keys.update(self.targetAnnotations.keys())
        return tuple(keys - deleted)

    def __setitem__(self, key, value):
        self.draftAnnotations[key] = value

        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        if key in deleted:
            deleted.remove(key)
            self.draft._proxyAnnotationsDeleted = deleted

    def setdefault(self, key, default=None):
        value = self.get(key, _marker)
        if value is _marker:
            self[key] = value = default

            deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
            if key in deleted:
                deleted.remove(key)
                self.draft._proxyAnnotationsDeleted = deleted

        return value

    def __delitem__(self, key):
        self[key]  # allow KeyError to be raised if we don't have this key

        if key in self.draftAnnotations:
            del self.draftAnnotations[key]

        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        deleted.add(key)
        self.draft._proxyAnnotationsDeleted = deleted
Beispiel #2
0
class AliasAnnotations(MutableMapping):
    """Layer draft annotations atop target annotations
    """

    def __init__(self, proxy):
        self.proxy = proxy

        self.draft = self.proxy._DraftProxy__draft
        self.target = self.proxy._DraftProxy__target

        self.draftAnnotations = IAnnotations(self.draft)
        self.targetAnnotations = IAnnotations(self.target)

    def __bool__(self):
        return self.targetAnnotations.__bool__() or \
            self.draftAnnotations.__bool__()

    def get(self, key, default=None):

        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        if key in deleted:
            return default

        value = self.draftAnnotations.get(key, _marker)
        if value is _marker:
            value = self.targetAnnotations.get(key, _marker)
        if value is _marker:
            return default

        return value

    def __getitem__(self, key):
        value = self.get(key, _marker)
        if value is _marker:
            raise KeyError(key)
        return value

    def __iter__(self):
        # adhere to MutableMapping interface
        for val in self.draftAnnotations.values():
            yield val

    def __len__(self):
        # adhere to MutableMapping interface
        return len(self.draftAnnotations)

    def keys(self):
        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        keys = set(self.draftAnnotations.keys())
        keys.update(self.targetAnnotations.keys())
        return tuple(keys - deleted)

    def __setitem__(self, key, value):
        self.draftAnnotations[key] = value

        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        if key in deleted:
            deleted.remove(key)
            self.draft._proxyAnnotationsDeleted = deleted

    def setdefault(self, key, default=None):
        value = self.get(key, _marker)
        if value is _marker:
            self[key] = value = default

            deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
            if key in deleted:
                deleted.remove(key)
                self.draft._proxyAnnotationsDeleted = deleted

        return value

    def __delitem__(self, key):
        self[key]  # allow KeyError to be raised if we don't have this key

        if key in self.draftAnnotations:
            del self.draftAnnotations[key]

        deleted = getattr(self.draft, '_proxyAnnotationsDeleted', set())
        deleted.add(key)
        self.draft._proxyAnnotationsDeleted = deleted