1from Foundation import * 2from AppKit import * 3 4class FileSettings(NSObject): 5 fsdefault_py = None 6 fsdefault_pyw = None 7 fsdefault_pyc = None 8 default_py = None 9 default_pyw = None 10 default_pyc = None 11 factorySettings = None 12 prefskey = None 13 settings = None 14 15 def getFactorySettingsForFileType_(cls, filetype): 16 if filetype == u'Python Script': 17 curdefault = cls.fsdefault_py 18 elif filetype == u'Python GUI Script': 19 curdefault = cls.fsdefault_pyw 20 elif filetype == u'Python Bytecode Document': 21 curdefault = cls.fsdefault_pyc 22 else: 23 NSLog(u'Funny File Type: %s\n' % (filetype,)) 24 curdefault = cls.fsdefault_py 25 filetype = u'Python Script' 26 if curdefault is None: 27 curdefault = FileSettings.alloc().initForFSDefaultFileType_(filetype) 28 return curdefault 29 getFactorySettingsForFileType_ = classmethod(getFactorySettingsForFileType_) 30 31 def getDefaultsForFileType_(cls, filetype): 32 if filetype == u'Python Script': 33 curdefault = cls.default_py 34 elif filetype == u'Python GUI Script': 35 curdefault = cls.default_pyw 36 elif filetype == u'Python Bytecode Document': 37 curdefault = cls.default_pyc 38 else: 39 NSLog(u'Funny File Type: %s\n' % (filetype,)) 40 curdefault = cls.default_py 41 filetype = u'Python Script' 42 if curdefault is None: 43 curdefault = FileSettings.alloc().initForDefaultFileType_(filetype) 44 return curdefault 45 getDefaultsForFileType_ = classmethod(getDefaultsForFileType_) 46 47 def newSettingsForFileType_(cls, filetype): 48 return FileSettings.alloc().initForFileType_(filetype) 49 newSettingsForFileType_ = classmethod(newSettingsForFileType_) 50 51 def initWithFileSettings_(self, source): 52 self = super(FileSettings, self).init() 53 self.settings = source.fileSettingsAsDict().copy() 54 self.origsource = None 55 return self 56 57 def initForFileType_(self, filetype): 58 defaults = FileSettings.getDefaultsForFileType_(filetype) 59 self = self.initWithFileSettings_(defaults) 60 self.origsource = defaults 61 return self 62 63 def initForFSDefaultFileType_(self, filetype): 64 self = super(FileSettings, self).init() 65 if type(self).factorySettings is None: 66 bndl = NSBundle.mainBundle() 67 path = bndl.pathForResource_ofType_(u'factorySettings', u'plist') 68 type(self).factorySettings = NSDictionary.dictionaryWithContentsOfFile_(path) 69 if type(self).factorySettings is None: 70 NSLog(u'Missing %s' % (path,)) 71 return None 72 dct = type(self).factorySettings.get(filetype) 73 if dct is None: 74 NSLog(u'factorySettings.plist misses file type "%s"' % (filetype,)) 75 return None 76 77 self.applyValuesFromDict_(dct) 78 interpreters = dct[u'interpreter_list'] 79 mgr = NSFileManager.defaultManager() 80 self.settings['interpreter'] = u'no default found' 81 for filename in interpreters: 82 filename = filename.nsstring().stringByExpandingTildeInPath() 83 if mgr.fileExistsAtPath_(filename): 84 self.settings['interpreter'] = filename 85 break 86 self.origsource = None 87 return self 88 89 def applyUserDefaults_(self, filetype): 90 dct = NSUserDefaults.standardUserDefaults().dictionaryForKey_(filetype) 91 if dct: 92 self.applyValuesFromDict_(dct) 93 94 def initForDefaultFileType_(self, filetype): 95 fsdefaults = FileSettings.getFactorySettingsForFileType_(filetype) 96 self = self.initWithFileSettings_(fsdefaults) 97 if self is None: 98 return self 99 self.settings['interpreter_list'] = fsdefaults.settings['interpreter_list'] 100 self.settings['scriptargs'] = u'' 101 self.applyUserDefaults_(filetype) 102 self.prefskey = filetype 103 return self 104 105 def reset(self): 106 if self.origsource: 107 self.updateFromSource_(self.origsource) 108 else: 109 fsdefaults = FileSettings.getFactorySettingsForFileType_(self.prefskey) 110 self.updateFromSource_(fsdefaults) 111 112 def updateFromSource_(self, source): 113 self.settings.update(source.fileSettingsAsDict()) 114 if self.origsource is None: 115 NSUserDefaults.standardUserDefaults().setObject_forKey_(self.fileSettingsAsDict(), self.prefskey) 116 117 def applyValuesFromDict_(self, dct): 118 if self.settings is None: 119 self.settings = {} 120 self.settings.update(dct) 121 122 def commandLineForScript_(self, script): 123 cur_interp = None 124 if self.settings['honourhashbang']: 125 try: 126 line = file(script, 'rU').next().rstrip() 127 except: 128 pass 129 else: 130 if line.startswith('#!'): 131 cur_interp = line[2:] 132 if cur_interp is None: 133 cur_interp = self.settings['interpreter'] 134 cmd = [] 135 cmd.append('"'+cur_interp.replace('"', '\\"')+'"') 136 if self.settings['debug']: 137 cmd.append('-d') 138 if self.settings['verbose']: 139 cmd.append('-v') 140 if self.settings['inspect']: 141 cmd.append('-i') 142 if self.settings['optimize']: 143 cmd.append('-O') 144 if self.settings['nosite']: 145 cmd.append('-S') 146 if self.settings['tabs']: 147 cmd.append('-t') 148 others = self.settings['others'] 149 if others: 150 cmd.append(others) 151 cmd.append('"'+script.replace('"', '\\"')+'"') 152 cmd.append(self.settings['scriptargs']) 153 if self.settings['with_terminal']: 154 cmd.append("""&& echo "Exit status: $?" && python -c 'import sys;sys.stdin.readline()' && exit 1""") 155 else: 156 cmd.append('&') 157 return ' '.join(cmd) 158 159 def fileSettingsAsDict(self): 160 return self.settings 161