126 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| This is a convenience wrapper for dictionaries
 | |
| returned from LDAP servers containing attribute
 | |
| names of variable case.
 | |
| 
 | |
| See http://www.python-ldap.org/ for details.
 | |
| 
 | |
| $Id: cidict.py,v 1.13 2009/04/17 14:34:34 stroeder Exp $
 | |
| """
 | |
| 
 | |
| __version__ = """$Revision: 1.13 $"""
 | |
| 
 | |
| from UserDict import UserDict
 | |
| from string import lower
 | |
| 
 | |
| class cidict(UserDict):
 | |
|   """
 | |
|   Case-insensitive but case-respecting dictionary.
 | |
|   """
 | |
| 
 | |
|   def __init__(self,default=None):
 | |
|     self._keys = {}
 | |
|     UserDict.__init__(self,{})
 | |
|     self.update(default or {})
 | |
| 
 | |
|   def __getitem__(self,key):
 | |
|     return self.data[lower(key)]
 | |
| 
 | |
|   def __setitem__(self,key,value):
 | |
|     lower_key = lower(key)
 | |
|     self._keys[lower_key] = key
 | |
|     self.data[lower_key] = value
 | |
| 
 | |
|   def __delitem__(self,key):
 | |
|     lower_key = lower(key)
 | |
|     del self._keys[lower_key]
 | |
|     del self.data[lower_key]
 | |
| 
 | |
|   def update(self,dict):
 | |
|     for key in dict.keys():
 | |
|       self[key] = dict[key]
 | |
| 
 | |
|   def has_key(self,key):
 | |
|     return UserDict.has_key(self,lower(key))
 | |
| 
 | |
|   def __contains__(self,key):
 | |
|     return self.has_key(key)
 | |
| 
 | |
|   def get(self,key,failobj=None):
 | |
|     try:
 | |
|       return self[key]
 | |
|     except KeyError:
 | |
|       return failobj
 | |
| 
 | |
|   def keys(self):
 | |
|     return self._keys.values()
 | |
| 
 | |
|   def items(self):
 | |
|     result = []
 | |
|     for k in self._keys.values():
 | |
|       result.append((k,self[k]))
 | |
|     return result
 | |
| 
 | |
| 
 | |
| def strlist_minus(a,b):
 | |
|   """
 | |
|   Return list of all items in a which are not in b (a - b).
 | |
|   a,b are supposed to be lists of case-insensitive strings.
 | |
|   """
 | |
|   temp = cidict()
 | |
|   for elt in b:
 | |
|     temp[elt] = elt
 | |
|   result = [
 | |
|     elt
 | |
|     for elt in a
 | |
|     if not temp.has_key(elt)
 | |
|   ]
 | |
|   return result
 | |
| 
 | |
| 
 | |
| def strlist_intersection(a,b):
 | |
|   """
 | |
|   Return intersection of two lists of case-insensitive strings a,b.
 | |
|   """
 | |
|   temp = cidict()
 | |
|   for elt in a:
 | |
|     temp[elt] = elt
 | |
|   result = [
 | |
|     temp[elt]
 | |
|     for elt in b
 | |
|     if temp.has_key(elt)
 | |
|   ]
 | |
|   return result
 | |
| 
 | |
| 
 | |
| def strlist_union(a,b):
 | |
|   """
 | |
|   Return union of two lists of case-insensitive strings a,b.
 | |
|   """
 | |
|   temp = cidict()
 | |
|   for elt in a:
 | |
|     temp[elt] = elt
 | |
|   for elt in b:
 | |
|     temp[elt] = elt
 | |
|   return temp.values()
 | |
| 
 | |
| 
 | |
| if __debug__ and __name__ == '__main__':
 | |
|   x = { 'AbCDeF' : 123 }
 | |
|   cix = cidict(x)
 | |
|   assert cix["ABCDEF"] == 123
 | |
|   assert cix.get("ABCDEF",None) == 123
 | |
|   assert cix.get("not existent",None) is None
 | |
|   cix["xYZ"] = 987
 | |
|   assert cix["XyZ"] == 987
 | |
|   assert cix.get("XyZ",None) == 987
 | |
|   cix_keys = cix.keys()
 | |
|   cix_keys.sort()
 | |
|   assert cix_keys==['AbCDeF','xYZ'],ValueError(repr(cix_keys))
 | |
|   cix_items = cix.items()
 | |
|   cix_items.sort()
 | |
|   assert cix_items==[('AbCDeF',123),('xYZ',987)],ValueError(repr(cix_items))
 | |
|   del cix["abcdEF"]
 | |
|   assert not cix._keys.has_key("abcdef")
 | |
|   assert not cix.has_key("AbCDef")
 | 
