def mapping_for()

in neptune-python-utils/neptune_python_utils/mappings.py [0:0]


    def mapping_for(self, key):
        if key in self.mappings:
            return self.mappings[key]
            
        kwargs = {}
        kwargs['key'] = key
        
        if self.token_mappings.is_token(key):
            kwargs['name'] = key
            kwargs['datatype'] = None
            kwargs['cardinality'] = None
            kwargs['token_mappings'] = self.token_mappings
            mapping = Mapping(**kwargs)
            self.add(mapping)
            return mapping

        parts = key.rsplit(':', 1)
        
        name = parts[0]
        metadata = parts[1] if len(parts) > 1 else None
        
        if metadata:
            metadata_match = re.search('([^\\[\\]\\(\\)]+)(\\((single|set)\\))?(\\[\\])?', metadata)
            
            datatype = metadata_match.group(1).lower() if metadata_match.group(1) else None
            
            if datatype not in ['string', 'bool', 'boolean', 'byte', 'short', 'int', 'long', 'float', 'double', 'date']:
                
                name = key
            
            else:
                
                kwargs['datatype'] = datatype
                
                if datatype == 'byte':
                    kwargs['converter'] = lambda x: int(x)
                elif datatype == 'short':
                    kwargs['converter'] = lambda x: int(x)
                elif datatype == 'int':
                    kwargs['converter'] = lambda x: int(x)
                elif datatype == 'long':
                    kwargs['converter'] = lambda x: int(x)
                elif datatype == 'float':
                    kwargs['converter'] = lambda x: float(x)
                elif datatype == 'double':
                    kwargs['converter'] = lambda x: float(x)
                elif datatype == 'date':
                    kwargs['converter'] = lambda x: self.datetime_formatter.format(x)
                elif datatype.startswith('bool'):
                    kwargs['converter'] = lambda x: x.lower() == 'true'
                    
                cardinality = 'set'
                    
                if metadata_match.group(3) and metadata_match.group(3).lower() == 'single':
                    cardinality = 'single'
                    kwargs['cardinality'] = cardinality
                    
                if metadata_match.group(4) and metadata_match.group(4) == '[]':
                    kwargs['is_multi_valued'] = True
                    kwargs['separator'] = self.separator
                    if cardinality == 'single':
                        raise Exception('Invalid mapping: single cardinality multi-valued property')
                    
        if name.endswith('[]'):
            name = name[:-2]
            kwargs['is_multi_valued'] = True
            kwargs['separator'] = self.separator
        
        kwargs['name'] = name        
        
        mapping = Mapping(**kwargs)
      
        self.add(mapping)
        
        return mapping