xtuml/meta.py
def new(self, *args, **kwargs):
        '''
        Create and return a new instance.
        '''
        inst = self.clazz()
        self.storage.append(inst)
        
        # set all attributes with an initial default value
        referential_attributes = dict()
        for name, ty in self.attributes:
            if name not in self.referential_attributes:
                value = self.default_value(ty)
                setattr(inst, name, value)
            
        # set all positional arguments
        for attr, value in zip(self.attributes, args):
            name, ty = attr
            if name not in self.referential_attributes:
                setattr(inst, name, value)
            else:
                referential_attributes[name] = value
            
        # set all named arguments
        for name, value in kwargs.items():
            if name not in self.referential_attributes:
                setattr(inst, name, value)
            else:
                referential_attributes[name] = value
        
        if not referential_attributes:
            return inst
        
        # batch relate referential attributes 
        for link in self.links.values():
            if set(link.key_map.values()) - set(referential_attributes.keys()):
                continue
             
            kwargs = dict()
            for key, value in link.key_map.items():
                kwargs[key] = referential_attributes[value]
            
            if not kwargs:
                continue
            
            for other_inst in link.to_metaclass.query(kwargs):
                relate(other_inst, inst, link.rel_id, link.phrase)
        
        for name, value in referential_attributes.items():
            if getattr(inst, name) != value:
                logger.warning('unable to assign %s to %s', name, inst)
                
        return inst
def new(self, *args, **kwargs):
        '''
        Create and return a new instance.
        '''
        inst = self.clazz()
        self.storage.append(inst)
        
        # set all attributes with an initial default value
        referential_attributes = dict()
        for name, ty in self.attributes:
            if name not in self.referential_attributes:
                value = self.default_value(ty)
                setattr(inst, name, value)
            
        # set all positional arguments
        for attr, value in zip(self.attributes, args):
            name, ty = attr
            if name not in self.referential_attributes:
                setattr(inst, name, value)
            else:
                referential_attributes[name] = value
            
        # set all named arguments
        for name, value in kwargs.items():
            if name not in self.referential_attributes:
                setattr(inst, name, value)
            else:
                referential_attributes[name] = value
        
        if not referential_attributes:
            return inst
        
        # batch relate referential attributes 
        for link in self.links.values():
            if set(link.key_map.values()) - set(referential_attributes.keys()):
                continue
             
            kwargs = dict()
            for key, value in link.key_map.items():
                kwargs[key] = referential_attributes[value]
            
            if not kwargs:
                continue
            
            for other_inst in link.to_metaclass.query(kwargs):
                relate(other_inst, inst, link.rel_id, link.phrase)
        
        for name, value in referential_attributes.items():
            if getattr(inst, name) != value:
                logger.warning('unable to assign %s to %s', name, inst)
                
        return inst
def new ( self , * args , * * kwargs ) : inst = self . clazz ( ) self . storage . append ( inst ) # set all attributes with an initial default value referential_attributes = dict ( ) for name , ty in self . attributes : if name not in self . referential_attributes : value = self . default_value ( ty ) setattr ( inst , name , value ) # set all positional arguments for attr , value in zip ( self . attributes , args ) : name , ty = attr if name not in self . referential_attributes : setattr ( inst , name , value ) else : referential_attributes [ name ] = value # set all named arguments for name , value in kwargs . items ( ) : if name not in self . referential_attributes : setattr ( inst , name , value ) else : referential_attributes [ name ] = value if not referential_attributes : return inst # batch relate referential attributes  for link in self . links . values ( ) : if set ( link . key_map . values ( ) ) - set ( referential_attributes . keys ( ) ) : continue kwargs = dict ( ) for key , value in link . key_map . items ( ) : kwargs [ key ] = referential_attributes [ value ] if not kwargs : continue for other_inst in link . to_metaclass . query ( kwargs ) : relate ( other_inst , inst , link . rel_id , link . phrase ) for name , value in referential_attributes . items ( ) : if getattr ( inst , name ) != value : logger . warning ( 'unable to assign %s to %s' , name , inst ) return inst
Create and return a new instance.
Create and return a new instance .