Пример #1
0
    def readValue(self, itemReader, offset, data, withSchema, view, name,
                  afterLoadHooks):

        if data[offset] == '\0':
            return offset+1, None
        
        return offset+17, SingleRef(UUID(data[offset+1:offset+17]))
Пример #2
0
    def _makeValidValues(self):
        """ create valid values of appropriate types"""

        class myStruct(object):
            __slots__ = ('name', 'rank')
            
        self.uuid = self.attrKind.itsUUID
        self.uuidString = str(self.uuid)
        self.pathString = '//Schema/Core/Item'
        self.path = Path(self.pathString)
        self.singleRef = SingleRef(self.uuid)
        self.itemClass = eval('repository.item.Item.Item')
        self.dateTimeString = '2004-01-08 12:34:56 US/Mountain'
        self.dateTime = datetime(2004, 1, 8, 12, 34, 56,
                                 tzinfo=ICUtzinfo.getInstance('US/Mountain'))
        self.timeDeltaString= '-8+45.000012'
        self.timeDelta = timedelta(-8, 45, 12)
        
        self.enum = self.types['Enumeration'].newItem('myEnum', self.rep)
        self.enum.values = ['red', 'green', 'blue']

        self.structType = self.types['Struct'].newItem('myStruct', self.rep)
        self.structType.fields=['name','rank']
        self.structType.implementationTypes = {'python': myStruct }
        self.struct = myStruct()

        self.lob = self.types['Lob'].makeValue("aba;dsjfa;jfdl;ajru87z.vncxyt89q47654", encoding='utf-8', mimetype='text/plain')
Пример #3
0
    def prepareValue(cls, item, attribute, value, setDirty=True):

        if isinstance(value, ItemValue):
            if value._item is not None:
                value = value._copy(item, attribute, 'copy')
            else:
                value._setOwner(item, attribute)
        elif isinstance(value, list):
            value = PersistentList(item, attribute, value, setDirty)
        elif isinstance(value, dict):
            value = PersistentDict(item, attribute, value, setDirty)
        elif isinstance(value, tuple):
            value = PersistentTuple(item, attribute, value, setDirty)
        elif isinstance(value, set):
            value = PersistentSet(item, attribute, value, setDirty)
        elif isinstance(value, CItem):
            value = SingleRef(value._uuid)

        return value
Пример #4
0
    def _useValue(self, value):

        if isinstance(value, PersistentCollection):
            return value

        if isinstance(value, CItem):
            return SingleRef(value._uuid)
        elif isinstance(value, list):
            return [self._useValue(v) for v in value]
        elif isinstance(value, set):
            return set([self._useValue(v) for v in value])
        elif isinstance(value, tuple):
            return tuple([self._useValue(v) for v in value])
        elif isinstance(value, dict):
            d = {}
            for k, v in value.itervalues():
                d[k] = self._useValue(v)
            return d
        else:
            return value
Пример #5
0
    def filterItem(self, item, level=0, key=0, _remove=True):

        sup = super(PersistentTuple, self)

        if level == 0:
            if sup.__getitem__(key) == SingleRef(item.itsUUID):
                if _remove:
                    raise TypeError, 'tuple is immutable'
                return True

        else:
            count = len(self)
            values = [
                value for value in sup.__iter__()
                if not value.filterItem(item, level - 1, key, False)
            ]
            if len(values) < count:
                raise TypeError, 'tuple is immutable'

        return False
Пример #6
0
    def filterItem(self, item, level=0, key=0, _remove=True):

        sup = super(PersistentDict, self)

        if level == 0:
            if sup.__getitem__(key) == SingleRef(item.itsUUID):
                if _remove:
                    self.__delitem__(key)
                return True

        else:
            dirty = False
            for k, value in sup.items():
                if value.filterItem(item, level - 1, key, False):
                    sup.__delitem__(k)
                    dirty = True
            if dirty:
                self._setDirty()

        return False
Пример #7
0
    def filterItem(self, item, level=0, key=0, _remove=True):

        sup = super(PersistentList, self)

        if level == 0:
            if sup.__getitem__(key) == SingleRef(item.itsUUID):
                if _remove:
                    self.__delitem__(key)
                return True

        else:
            count = len(self)
            values = [
                value for value in sup.__iter__()
                if not value.filterItem(item, level - 1, key, False)
            ]
            if len(values) < count:
                sup.__setslice__(0, count, values)
                self._setDirty()

        return False
Пример #8
0
    def filterItem(self, item, level=0, key=0, _remove=True):

        sup = super(PersistentSet, self)

        if level == 0:
            if sup.__contains__(SingleRef(item.itsUUID)):
                if _remove:
                    self.remove(item)
                return True

        else:
            count = len(self)
            values = [
                value for value in sup.__iter__()
                if not value.filterItem(item, level - 1, key, False)
            ]
            if len(values) < count:
                sup.clear()
                sup.update(values)
                self._setDirty()

        return False
Пример #9
0
    def _copy(self, orig, copyPolicy, copyFn):

        item = self._item
        for name, value in orig.iteritems():
            if isinstance(value, ItemValue):
                value = value._copy(item, name, copyPolicy, copyFn)
                value._setOwner(item, name)
                self[name] = value

            elif isinstance(value, SingleRef):
                policy = (copyPolicy or item.getAttributeAspect(
                    name, 'copyPolicy', False, None, 'copy'))
                other = item.find(value.itsUUID)
                if other is None:
                    self[name] = value
                else:
                    copyOther = copyFn(item, other, policy)
                    if copyOther is not Nil:
                        self[name] = SingleRef(copyOther.itsUUID)

            else:
                self[name] = value

            self._copyFlags(orig, name)
Пример #10
0
class TypeHandler(object):

    def typeHandler(cls, view, value):

        try:
            for t in cls.typeHandlers[view][type(value)]:
                if t.recognizes(value):
                    return t
        except KeyError:
            pass

        from repository.item.Item import Item
        if isinstance(value, Item):
            return cls.typeHandlers[view][SingleRef][0]

        try:
            typeKind = cls.typeHandlers[view][None]
        except KeyError:
            print type(value), value
            raise
        
        types = typeKind.findTypes(value)
        if types:
            return types[0]
            
        raise TypeError, 'No handler for values of type %s' %(type(value))

    def makeString(cls, view, value):

        return cls.typeHandler(view, value).makeString(value)

    def makeValue(cls, typeName, data):

        try:
            return cls.typeDispatch[typeName](data)
        except KeyError:
            raise ValueError, "Unknown type %s for data: %s" %(typeName, data)

    def hashValue(cls, view, value):

        return cls.typeHandler(view, value).hashValue(value)

    def clear(cls, view):

        try:
            cls.typeHandlers[view].clear()
        except KeyError:
            pass


    typeHandler = classmethod(typeHandler)
    makeString = classmethod(makeString)
    makeValue = classmethod(makeValue)
    hashValue = classmethod(hashValue)
    clear = classmethod(clear)

    typeHandlers = {}
    typeDispatch = {
        'str': str,
        'unicode': unicode,
        'uuid': UUID,
        'path': Path,
        'ref': lambda(data): SingleRef(UUID(data)),
        'bool': lambda(data): data != 'False',
        'int': int,
        'long': long,
        'float': float,
        'complex': complex,
        'class': lambda(data): ClassLoader.loadClass(data),
        'none': lambda(data): None,
    }
Пример #11
0
    def hashValue(self, value):

        if value is None:
            return 0

        return TypeHandler.hashValue(self.itsView, SingleRef(value.itsUUID))
Пример #12
0
    def makeString(self, data):

        if data is None:
            return Kind.NoneString
        
        return SingleRef(UUID(data))
Пример #13
0
    def makeValue(self, data):

        if data == Kind.NoneString:
            return None
        
        return SingleRef(UUID(data))