mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			109 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import macfs
							 | 
						||
| 
								 | 
							
								import marshal
							 | 
						||
| 
								 | 
							
								import types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								kOnSystemDisk = 0x8000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PrefObject:
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __init__(self, dict = None):
							 | 
						||
| 
								 | 
							
										if dict == None:
							 | 
						||
| 
								 | 
							
											self._prefsdict = {}
							 | 
						||
| 
								 | 
							
										else:
							 | 
						||
| 
								 | 
							
											self._prefsdict = dict
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __len__(self):
							 | 
						||
| 
								 | 
							
										return len(self._prefsdict)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __delattr__(self, attr):
							 | 
						||
| 
								 | 
							
										if self._prefsdict.has_key(attr):
							 | 
						||
| 
								 | 
							
											del self._prefsdict[attr]
							 | 
						||
| 
								 | 
							
										else:
							 | 
						||
| 
								 | 
							
											raise AttributeError, 'delete non-existing instance attribute'
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __getattr__(self, attr):
							 | 
						||
| 
								 | 
							
										if attr == '__members__':
							 | 
						||
| 
								 | 
							
											keys = self._prefsdict.keys()
							 | 
						||
| 
								 | 
							
											keys.sort()
							 | 
						||
| 
								 | 
							
											return keys
							 | 
						||
| 
								 | 
							
										try:
							 | 
						||
| 
								 | 
							
											return self._prefsdict[attr]
							 | 
						||
| 
								 | 
							
										except KeyError:
							 | 
						||
| 
								 | 
							
											raise AttributeError, attr
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __setattr__(self, attr, value):
							 | 
						||
| 
								 | 
							
										if attr[0] <> '_':
							 | 
						||
| 
								 | 
							
											self._prefsdict[attr] = value
							 | 
						||
| 
								 | 
							
										else:
							 | 
						||
| 
								 | 
							
											self.__dict__[attr] = value
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def getprefsdict(self):
							 | 
						||
| 
								 | 
							
										return self._prefsdict
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PrefFile(PrefObject):
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __init__(self, path, creator = 'Pyth'):
							 | 
						||
| 
								 | 
							
										# Find the preferences folder and our prefs file, create if needed.
							 | 
						||
| 
								 | 
							
										self.__path = path
							 | 
						||
| 
								 | 
							
										self.__creator = creator
							 | 
						||
| 
								 | 
							
										self._prefsdict = {}
							 | 
						||
| 
								 | 
							
										try:
							 | 
						||
| 
								 | 
							
											prefdict = marshal.load(open(self.__path, 'rb'))
							 | 
						||
| 
								 | 
							
										except IOError:
							 | 
						||
| 
								 | 
							
											pass
							 | 
						||
| 
								 | 
							
										else:
							 | 
						||
| 
								 | 
							
											for key, value in prefdict.items():
							 | 
						||
| 
								 | 
							
												if type(value) == types.DictType:
							 | 
						||
| 
								 | 
							
													self._prefsdict[key] = PrefObject(value)
							 | 
						||
| 
								 | 
							
												else:
							 | 
						||
| 
								 | 
							
													self._prefsdict[key] = value
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def save(self):
							 | 
						||
| 
								 | 
							
										prefdict = {}
							 | 
						||
| 
								 | 
							
										for key, value in self._prefsdict.items():
							 | 
						||
| 
								 | 
							
											if type(value) == types.InstanceType:
							 | 
						||
| 
								 | 
							
												prefdict[key] = value.getprefsdict()
							 | 
						||
| 
								 | 
							
												if not prefdict[key]:
							 | 
						||
| 
								 | 
							
													del prefdict[key]
							 | 
						||
| 
								 | 
							
											else:
							 | 
						||
| 
								 | 
							
												prefdict[key] = value
							 | 
						||
| 
								 | 
							
										marshal.dump(prefdict, open(self.__path, 'wb'))
							 | 
						||
| 
								 | 
							
										fss = macfs.FSSpec(self.__path)
							 | 
						||
| 
								 | 
							
										fss.SetCreatorType(self.__creator, 'pref')
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __getattr__(self, attr):
							 | 
						||
| 
								 | 
							
										if attr == '__members__':
							 | 
						||
| 
								 | 
							
											keys = self._prefsdict.keys()
							 | 
						||
| 
								 | 
							
											keys.sort()
							 | 
						||
| 
								 | 
							
											return keys
							 | 
						||
| 
								 | 
							
										try:
							 | 
						||
| 
								 | 
							
											return self._prefsdict[attr]
							 | 
						||
| 
								 | 
							
										except KeyError:
							 | 
						||
| 
								 | 
							
											if attr[0] <> '_':
							 | 
						||
| 
								 | 
							
												self._prefsdict[attr] = PrefObject()
							 | 
						||
| 
								 | 
							
												return self._prefsdict[attr]
							 | 
						||
| 
								 | 
							
											else:
							 | 
						||
| 
								 | 
							
												raise AttributeError, attr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_prefscache = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def GetPrefs(prefname, creator = 'Pyth'):
							 | 
						||
| 
								 | 
							
									import macostools, os
							 | 
						||
| 
								 | 
							
									if _prefscache.has_key(prefname):
							 | 
						||
| 
								 | 
							
										return _prefscache[prefname]
							 | 
						||
| 
								 | 
							
									# Find the preferences folder and our prefs file, create if needed.
							 | 
						||
| 
								 | 
							
									vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
							 | 
						||
| 
								 | 
							
									prefsfolder_fss = macfs.FSSpec((vrefnum, dirid, ''))
							 | 
						||
| 
								 | 
							
									prefsfolder = prefsfolder_fss.as_pathname()
							 | 
						||
| 
								 | 
							
									path = os.path.join(prefsfolder, prefname)
							 | 
						||
| 
								 | 
							
									head, tail = os.path.split(path)
							 | 
						||
| 
								 | 
							
									# make sure the folder(s) exist
							 | 
						||
| 
								 | 
							
									macostools.mkdirs(head)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									preffile = PrefFile(path, creator)
							 | 
						||
| 
								 | 
							
									_prefscache[prefname] = preffile
							 | 
						||
| 
								 | 
							
									return preffile
							 |