from Foundation import * from AppKit import * class FileSettings(NSObject): fsdefault_py = None fsdefault_pyw = None fsdefault_pyc = None default_py = None default_pyw = None default_pyc = None factorySettings = None prefskey = None settings = None def getFactorySettingsForFileType_(cls, filetype): if filetype == u'Python Script': curdefault = cls.fsdefault_py elif filetype == u'Python GUI Script': curdefault = cls.fsdefault_pyw elif filetype == u'Python Bytecode Document': curdefault = cls.fsdefault_pyc else: NSLog(u'Funny File Type: %s\n' % (filetype,)) curdefault = cls.fsdefault_py filetype = u'Python Script' if curdefault is None: curdefault = FileSettings.alloc().initForFSDefaultFileType_(filetype) return curdefault getFactorySettingsForFileType_ = classmethod(getFactorySettingsForFileType_) def getDefaultsForFileType_(cls, filetype): if filetype == u'Python Script': curdefault = cls.default_py elif filetype == u'Python GUI Script': curdefault = cls.default_pyw elif filetype == u'Python Bytecode Document': curdefault = cls.default_pyc else: NSLog(u'Funny File Type: %s\n' % (filetype,)) curdefault = cls.default_py filetype = u'Python Script' if curdefault is None: curdefault = FileSettings.alloc().initForDefaultFileType_(filetype) return curdefault getDefaultsForFileType_ = classmethod(getDefaultsForFileType_) def newSettingsForFileType_(cls, filetype): return FileSettings.alloc().initForFileType_(filetype) newSettingsForFileType_ = classmethod(newSettingsForFileType_) def initWithFileSettings_(self, source): self = super(FileSettings, self).init() self.settings = source.fileSettingsAsDict().copy() self.origsource = None return self def initForFileType_(self, filetype): defaults = FileSettings.getDefaultsForFileType_(filetype) self = self.initWithFileSettings_(defaults) self.origsource = defaults return self def initForFSDefaultFileType_(self, filetype): self = super(FileSettings, self).init() if type(self).factorySettings is None: bndl = NSBundle.mainBundle() path = bndl.pathForResource_ofType_(u'factorySettings', u'plist') type(self).factorySettings = NSDictionary.dictionaryWithContentsOfFile_(path) if type(self).factorySettings is None: NSLog(u'Missing %s' % (path,)) return None dct = type(self).factorySettings.get(filetype) if dct is None: NSLog(u'factorySettings.plist misses file type "%s"' % (filetype,)) return None self.applyValuesFromDict_(dct) interpreters = dct[u'interpreter_list'] mgr = NSFileManager.defaultManager() self.settings['interpreter'] = u'no default found' for filename in interpreters: filename = filename.nsstring().stringByExpandingTildeInPath() if mgr.fileExistsAtPath_(filename): self.settings['interpreter'] = filename break self.origsource = None return self def applyUserDefaults_(self, filetype): dct = NSUserDefaults.standardUserDefaults().dictionaryForKey_(filetype) if dct: self.applyValuesFromDict_(dct) def initForDefaultFileType_(self, filetype): fsdefaults = FileSettings.getFactorySettingsForFileType_(filetype) self = self.initWithFileSettings_(fsdefaults) if self is None: return self self.settings['interpreter_list'] = fsdefaults.settings['interpreter_list'] self.settings['scriptargs'] = u'' self.applyUserDefaults_(filetype) self.prefskey = filetype return self def reset(self): if self.origsource: self.updateFromSource_(self.origsource) else: fsdefaults = FileSettings.getFactorySettingsForFileType_(self.prefskey) self.updateFromSource_(fsdefaults) def updateFromSource_(self, source): self.settings.update(source.fileSettingsAsDict()) if self.origsource is None: NSUserDefaults.standardUserDefaults().setObject_forKey_(self.fileSettingsAsDict(), self.prefskey) def applyValuesFromDict_(self, dct): if self.settings is None: self.settings = {} self.settings.update(dct) def commandLineForScript_(self, script): cur_interp = None if self.settings['honourhashbang']: try: line = file(script, 'rU').next().rstrip() except: pass else: if line.startswith('#!'): cur_interp = line[2:] if cur_interp is None: cur_interp = self.settings['interpreter'] cmd = [] cmd.append('"'+cur_interp.replace('"', '\\"')+'"') if self.settings['debug']: cmd.append('-d') if self.settings['verbose']: cmd.append('-v') if self.settings['inspect']: cmd.append('-i') if self.settings['optimize']: cmd.append('-O') if self.settings['nosite']: cmd.append('-S') if self.settings['tabs']: cmd.append('-t') others = self.settings['others'] if others: cmd.append(others) cmd.append('"'+script.replace('"', '\\"')+'"') cmd.append(self.settings['scriptargs']) if self.settings['with_terminal']: cmd.append("""&& echo "Exit status: $?" && python -c 'import sys;sys.stdin.readline()' && exit 1""") else: cmd.append('&') return ' '.join(cmd) def fileSettingsAsDict(self): return self.settings