S3/SortedDict.py
ec50b5a7
 ## Amazon S3 manager
 ## Author: Michal Ludvig <michal@logix.cz>
 ##         http://www.logix.cz/michal
 ## License: GPL Version 2
 
29941bdf
 from BidirMap import BidirMap
 
ec50b5a7
 class SortedDictIterator(object):
29941bdf
 	def __init__(self, sorted_dict, keys):
 		self.sorted_dict = sorted_dict
 		self.keys = keys
df9fa4b5
 
 	def next(self):
29941bdf
 		try:
 			return self.keys.pop(0)
 		except IndexError:
df9fa4b5
 			raise StopIteration
 
 class SortedDict(dict):
dc1c96cf
 	def __init__(self, mapping = {}, ignore_case = True, **kwargs):
 		"""
 		WARNING: SortedDict() with ignore_case==True will
 		         drop entries differing only in capitalisation!
 				 Eg: SortedDict({'auckland':1, 'Auckland':2}).keys() => ['Auckland']
 				 With ignore_case==False it's all right
 		"""
 		dict.__init__(self, mapping, **kwargs)
 		self.ignore_case = ignore_case
df9fa4b5
 
 	def keys(self):
 		keys = dict.keys(self)
dc1c96cf
 		if self.ignore_case:
29941bdf
 			# Translation map
 			xlat_map = BidirMap()
 			for key in keys:
 				xlat_map[key.lower()] = key
 			# Lowercase keys
 			lc_keys = xlat_map.keys()
 			lc_keys.sort()
 			return [xlat_map[k] for k in lc_keys]
 		else:
 			keys.sort()
 			return keys
df9fa4b5
 
29941bdf
 	def __iter__(self):
 		return SortedDictIterator(self, self.keys())
 
 if __name__ == "__main__":
dc1c96cf
 	d = { 'AWS' : 1, 'Action' : 2, 'america' : 3, 'Auckland' : 4, 'America' : 5 }
 	sd = SortedDict(d)
 	print "Wanted: Action, america, Auckland, AWS,    [ignore case]"
29941bdf
 	print "Got:   ",
dc1c96cf
 	for key in sd:
29941bdf
 		print "%s," % key,
dc1c96cf
 	print "   [used: __iter__()]"
 	d = SortedDict(d, ignore_case = False)
 	print "Wanted: AWS, Action, Auckland, america,    [case sensitive]"
29941bdf
 	print "Got:   ",
 	for key in d.keys():
 		print "%s," % key,
dc1c96cf
 	print "   [used: keys()]"