示例#1
0
 def __init__(self, entityClass):
     self.entityClass = IEntity(entityClass)
示例#2
0
class Packer(object):
    
    def __init__(self, entityClass):
        self.entityClass = IEntity(entityClass)
        
    def unpack_field(self, entity, field):
        
        def check((entity, field)):
            return self.check_field(entity, field)
        
        def unpack((entity, field)):
            return defer.succeed((entity, field, gettattr(entity, field)))
        
        def complete((entity, field, value)):
            return defer.succeed(value)
        
        d = defer.Deferred()
        
        d.addCallback(check)
        d.addCallback(unpack)
        d.addCallback(complete)
        
        d.callback((entity, field))
        return d
    
    def unpack_identity(self, entity):
        
        def check(entity):
            return self.check(entity)
        
        def unpack(entity):
            
            def get_identity(entity):
                return defer.succeed((entity, self.entityClass.identity()))
            
            def get_names((entity, identity)):
                return defer.succeed((entity, map(lambda f: f.name, identity)))
            
            def get_fields((entity, names)):
                
                def unpack((entity, names)):
                    list = map(lambda name: self.unpack_field(entity, name), names)
                    d = defer.DeferredList(list, fireOnOneErrback=True)
                    d.addCallback(lambda results: (entity, results))
                    return d
                
                def complete((entity, results)):
                    identity = ()
                    for (sucess, value) in results:
                        identity += (value,)
                    return defer.succeed((entity, identity))
                
                d = defer.Deferred()
                
                d.addCallback(unpack)
                d.addCallback(complete)
                
                d.callback((entity, names))
                return d
            
            def complete((entity, identity)):
                return defer.succeed((entity, identity))
            
            d = defer.Deferred()
            
            d.addCallback(get_identity)
            d.addCallback(get_fields)
            d.addCallback(complete)
            
            d.callback(entity)
            return d
        
        def complete(entity, identity):
            return defer.succeed(identity)
        
        d = defer.Deferred()
        
        d.addCallback(check)
        d.addCallback(unpack)
        d.addCallback(complete)
        
        d.callback(entity)
        return d
    
    def unpack_indexes(self, entity):
        
        def check(entity):
            return self.check(entity)
        
        def unpack(entity):
            
            def get_indexes(entity):
                identity = list(self.entityClass.identity())
                indexes = list(self.entityClass.indexed_fields())
                return defer.succeed((entity, filter(lambda f: f not in indentity, indexes)))
            
            def get_names((entity, indexes)):
                return defer.succeed((entity, map(lambda f: f.name, indexes)))
            
            def get_fields((entity, names)):
                
                def unpack((entity, names)):
                    list = map(lambda name: self.unpack_field(entity, name), names)
                    d = defer.DeferredList(list, fireOnOneErrback=True)
                    d.addCallback(lambda results: (entity, results))
                    return d
                
                def complete((entity, results)):
                    indexes = {}
                    for (name, (sucess, value)) in map(lambda name, result: (name, result), names, results):
                        indexes[name] = value
                    return defer.succeed((entity, indexes))
                
                d = defer.Deferred()
                
                d.addCallback(unpack)
                d.addCallback(complete)
                
                d.callback((entity, names))
                return d
            
            def complete((entity, indexes)):
                return defer.succeed((entity, indexes))
        
        def complete((entity, indexes)):
            return defer.succeed(indexes)
        
        d = defer.Deferred()
        
        d.addCallback(check)
        d.addCallback(unpack)
        d.addCallback(complete)
        
        d.callback(entity)
        return d
    
    def check(self, entity):
        
        def check(entity):
            if self.entityClass.providedBy(entity):
                return defer.succeed(entity)
            else:
                return defer.fail(TypeError("Entity must provide %s" % self.entityClass.__name__))
        
        d = defer.Deferred()
        d.addCallback(check)
        d.callback(entity)
        return d
    
    def check_field(self, entity, field):
        
        def check_entity(entity):
            return self.check(entity)
            
        def check_field(field):
            names = map(lambda field: field.name, self.entityClass.fields())
            if field in names:
                return defer.succeed((entity, field))
            else:
                return defer.fail(AttributeError("Field not exists."))
            
        def complete(((entity_success, entity), (field_sucess, field))):
            return defer.succeed((entity, field))
            
        d = defer.DeferredList([check_entity(entity), check_field(field)], fireOnOneErrback=True)
        d.addCallback(complete)
        return d