diff options
Diffstat (limited to 'Mac/Tools/IDE/PackageManager.py')
-rwxr-xr-x | Mac/Tools/IDE/PackageManager.py | 892 |
1 files changed, 446 insertions, 446 deletions
diff --git a/Mac/Tools/IDE/PackageManager.py b/Mac/Tools/IDE/PackageManager.py index ee6355b..0041a17 100755 --- a/Mac/Tools/IDE/PackageManager.py +++ b/Mac/Tools/IDE/PackageManager.py @@ -1,37 +1,37 @@ # Prelude to allow running this as a main program def _init(): - import macresource - import sys, os - macresource.need('DITL', 468, "PythonIDE.rsrc") - widgetrespathsegs = [sys.exec_prefix, "Mac", "Tools", "IDE", "Widgets.rsrc"] - widgetresfile = os.path.join(*widgetrespathsegs) - if not os.path.exists(widgetresfile): - widgetrespathsegs = [os.pardir, "Tools", "IDE", "Widgets.rsrc"] - widgetresfile = os.path.join(*widgetrespathsegs) - refno = macresource.need('CURS', 468, widgetresfile) - if os.environ.has_key('PYTHONIDEPATH'): - # For development set this environment variable - ide_path = os.environ['PYTHONIDEPATH'] - elif refno: - # We're not a fullblown application - idepathsegs = [sys.exec_prefix, "Mac", "Tools", "IDE"] - ide_path = os.path.join(*idepathsegs) - if not os.path.exists(ide_path): - idepathsegs = [os.pardir, "Tools", "IDE"] - for p in sys.path: - ide_path = os.path.join(*([p]+idepathsegs)) - if os.path.exists(ide_path): - break - - else: - # We are a fully frozen application - ide_path = sys.argv[0] - if ide_path not in sys.path: - sys.path.insert(0, ide_path) - + import macresource + import sys, os + macresource.need('DITL', 468, "PythonIDE.rsrc") + widgetrespathsegs = [sys.exec_prefix, "Mac", "Tools", "IDE", "Widgets.rsrc"] + widgetresfile = os.path.join(*widgetrespathsegs) + if not os.path.exists(widgetresfile): + widgetrespathsegs = [os.pardir, "Tools", "IDE", "Widgets.rsrc"] + widgetresfile = os.path.join(*widgetrespathsegs) + refno = macresource.need('CURS', 468, widgetresfile) + if os.environ.has_key('PYTHONIDEPATH'): + # For development set this environment variable + ide_path = os.environ['PYTHONIDEPATH'] + elif refno: + # We're not a fullblown application + idepathsegs = [sys.exec_prefix, "Mac", "Tools", "IDE"] + ide_path = os.path.join(*idepathsegs) + if not os.path.exists(ide_path): + idepathsegs = [os.pardir, "Tools", "IDE"] + for p in sys.path: + ide_path = os.path.join(*([p]+idepathsegs)) + if os.path.exists(ide_path): + break + + else: + # We are a fully frozen application + ide_path = sys.argv[0] + if ide_path not in sys.path: + sys.path.insert(0, ide_path) + if __name__ == '__main__': - _init() - + _init() + import W import Wapplication from Carbon import Evt @@ -48,424 +48,424 @@ import pimp PACKMAN_HOMEPAGE="http://www.python.org/packman" ELIPSES = '...' - + USER_INSTALL_DIR = os.path.join(os.environ.get('HOME', ''), - 'Library', - 'Python', - sys.version[:3], - 'site-packages') - + 'Library', + 'Python', + sys.version[:3], + 'site-packages') + class PackageManagerMain(Wapplication.Application): - - def __init__(self): - self.preffilepath = os.path.join("Python", "Package Install Manager Prefs") - Wapplication.Application.__init__(self, 'Pimp') - from Carbon import AE - from Carbon import AppleEvents - self.defaulturl = "" - - AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication, - self.ignoreevent) - AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEReopenApplication, - self.ignoreevent) - AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments, - self.ignoreevent) - AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication, - self.quitevent) - if 1: - import PyConsole - # With -D option (OSX command line only) keep stderr, for debugging the IDE - # itself. - debug_stderr = None - if len(sys.argv) >= 2 and sys.argv[1] == '-D': - debug_stderr = sys.stderr - del sys.argv[1] - PyConsole.installoutput() - if debug_stderr: - sys.stderr = debug_stderr - self.domenu_openstandard() - self.mainloop() - - def makeusermenus(self): - m = Wapplication.Menu(self.menubar, "File") - newitem = FrameWork.MenuItem(m, "Open Standard Database", "N", 'openstandard') - newexpitem = FrameWork.MenuItem(m, "Open Experimental Database", None, 'openexperimental') - newexpitem.enable(pimp.PIMP_VERSION >= "0.4") - openitem = FrameWork.MenuItem(m, "Open"+ELIPSES, "O", 'open') - openURLitem = FrameWork.MenuItem(m, "Open URL"+ELIPSES, "D", 'openURL') - FrameWork.Separator(m) - moreinfoitem = FrameWork.MenuItem(m, "More Databases", None, 'opendatabasepage') - FrameWork.Separator(m) - closeitem = FrameWork.MenuItem(m, "Close", "W", 'close') -## saveitem = FrameWork.MenuItem(m, "Save", "S", 'save') -## saveasitem = FrameWork.MenuItem(m, "Save as"+ELIPSES, None, 'save_as') -## FrameWork.Separator(m) - - m = Wapplication.Menu(self.menubar, "Edit") - undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo") - FrameWork.Separator(m) - cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut") - copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy") - pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste") - FrameWork.MenuItem(m, "Clear", None, "clear") - FrameWork.Separator(m) - selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall") - - m = Wapplication.Menu(self.menubar, "Package") - runitem = FrameWork.MenuItem(m, "Install", "I", 'install') - homepageitem = FrameWork.MenuItem(m, "Visit Homepage", None, 'homepage') - - self.openwindowsmenu = Wapplication.Menu(self.menubar, 'Windows') - self.makeopenwindowsmenu() - self.makehelpmenu() - self._menustocheck = [closeitem, - undoitem, cutitem, copyitem, pasteitem, - selallitem, - runitem, homepageitem] - - def makehelpmenu(self): - python_app = os.path.join(sys.prefix, 'Resources/Python.app') - help_source = os.path.join(python_app, 'Contents/Resources/English.lproj/Documentation') - hashelp = os.path.isdir(help_source) - - self.helpmenu = m = self.gethelpmenu() - helpitem1 = FrameWork.MenuItem(m, "PackageManager Help", None, self.domenu_packmanhelp) - helpitem1.enable(hashelp) - helpitem2 = FrameWork.MenuItem(m, "MacPython Help", None, self.domenu_pythonhelp) - helpitem2.enable(hashelp) - - def quitevent(self, theAppleEvent, theReply): - self._quit() - - def ignoreevent(self, theAppleEvent, theReply): - pass - - def opendocsevent(self, theAppleEvent, theReply): - W.SetCursor('watch') - import aetools - parameters, args = aetools.unpackevent(theAppleEvent) - docs = parameters['----'] - if type(docs) <> type([]): - docs = [docs] - for doc in docs: - fsr, a = doc.FSResolveAlias(None) - path = fsr.as_pathname() - path = urllib.pathname2url(path) - self.opendoc(path) - - def opendoc(self, url): - if url: - self.defaulturl = url - PackageBrowser(url) - - def getabouttext(self): - return "About Package Manager"+ELIPSES - - def do_about(self, id, item, window, event): - EasyDialogs.Message("Package Install Manager for Python\nPackMan engine (pimp) version: %s" % - pimp.PIMP_VERSION) - - def domenu_openstandard(self, *args): - if pimp.PIMP_VERSION >= "0.4": - url = pimp.getDefaultDatabase() - else: - # 0.3 compatibility - url = None - self.opendoc(url) - - def domenu_openexperimental(self, *args): - database = pimp.getDefaultDatabase(experimental=True) - self.opendoc(database) - - def domenu_open(self, *args): - filename = EasyDialogs.AskFileForOpen(typeList=("TEXT",)) - if filename: - filename = urllib.pathname2url(filename) - self.opendoc(filename) - - def domenu_openURL(self, *args): - ok = EasyDialogs.AskYesNoCancel( - "Warning: by opening a non-standard database " - "you are trusting the maintainer of it " - "to run arbitrary code on your machine.", - yes="OK", no="") - if ok <= 0: return - url = EasyDialogs.AskString("URL of database to open:", - default=self.defaulturl, ok="Open") - if url: - self.opendoc(url) - - def domenu_opendatabasepage(self): - import ic - - icr = ic.IC() - icr.launchurl(PACKMAN_HOMEPAGE) - def makeopenwindowsmenu(self): - for i in range(len(self.openwindowsmenu.items)): - self.openwindowsmenu.menu.DeleteMenuItem(1) - self.openwindowsmenu.items = [] - windows = [] - self._openwindows = {} - for window in self._windows.keys(): - title = window.GetWTitle() - if not title: - title = "<no title>" - windows.append((title, window)) - windows.sort() - for title, window in windows: - shortcut = None - item = FrameWork.MenuItem(self.openwindowsmenu, title, shortcut, callback = self.domenu_openwindows) - self._openwindows[item.item] = window - self._openwindowscheckmark = 0 - self.checkopenwindowsmenu() - - def domenu_openwindows(self, id, item, window, event): - w = self._openwindows[item] - w.ShowWindow() - w.SelectWindow() - - def domenu_quit(self): - self._quit() - - def domenu_save(self, *args): - print "Save" - - def domenu_pythonhelp(self, *args): - from Carbon import AH - AH.AHGotoPage("MacPython Help", None, None) - - def domenu_packmanhelp(self, *args): - from Carbon import AH - AH.AHGotoPage("MacPython Help", "packman.html", None) - - def _quit(self): -## import PyConsole, PyEdit - for window in self._windows.values(): - try: - rv = window.close() # ignore any errors while quitting - except: - rv = 0 # (otherwise, we can get stuck!) - if rv and rv > 0: - return -## try: -## PyConsole.console.writeprefs() -## PyConsole.output.writeprefs() -## PyEdit.searchengine.writeprefs() -## except: -## # Write to __stderr__ so the msg end up in Console.app and has -## # at least _some_ chance of getting read... -## # But: this is a workaround for way more serious problems with -## # the Python 2.2 Jaguar addon. -## sys.__stderr__.write("*** PythonIDE: Can't write preferences ***\n") - self.quitting = 1 - + + def __init__(self): + self.preffilepath = os.path.join("Python", "Package Install Manager Prefs") + Wapplication.Application.__init__(self, 'Pimp') + from Carbon import AE + from Carbon import AppleEvents + self.defaulturl = "" + + AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication, + self.ignoreevent) + AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEReopenApplication, + self.ignoreevent) + AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments, + self.ignoreevent) + AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication, + self.quitevent) + if 1: + import PyConsole + # With -D option (OSX command line only) keep stderr, for debugging the IDE + # itself. + debug_stderr = None + if len(sys.argv) >= 2 and sys.argv[1] == '-D': + debug_stderr = sys.stderr + del sys.argv[1] + PyConsole.installoutput() + if debug_stderr: + sys.stderr = debug_stderr + self.domenu_openstandard() + self.mainloop() + + def makeusermenus(self): + m = Wapplication.Menu(self.menubar, "File") + newitem = FrameWork.MenuItem(m, "Open Standard Database", "N", 'openstandard') + newexpitem = FrameWork.MenuItem(m, "Open Experimental Database", None, 'openexperimental') + newexpitem.enable(pimp.PIMP_VERSION >= "0.4") + openitem = FrameWork.MenuItem(m, "Open"+ELIPSES, "O", 'open') + openURLitem = FrameWork.MenuItem(m, "Open URL"+ELIPSES, "D", 'openURL') + FrameWork.Separator(m) + moreinfoitem = FrameWork.MenuItem(m, "More Databases", None, 'opendatabasepage') + FrameWork.Separator(m) + closeitem = FrameWork.MenuItem(m, "Close", "W", 'close') +## saveitem = FrameWork.MenuItem(m, "Save", "S", 'save') +## saveasitem = FrameWork.MenuItem(m, "Save as"+ELIPSES, None, 'save_as') +## FrameWork.Separator(m) + + m = Wapplication.Menu(self.menubar, "Edit") + undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo") + FrameWork.Separator(m) + cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut") + copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy") + pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste") + FrameWork.MenuItem(m, "Clear", None, "clear") + FrameWork.Separator(m) + selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall") + + m = Wapplication.Menu(self.menubar, "Package") + runitem = FrameWork.MenuItem(m, "Install", "I", 'install') + homepageitem = FrameWork.MenuItem(m, "Visit Homepage", None, 'homepage') + + self.openwindowsmenu = Wapplication.Menu(self.menubar, 'Windows') + self.makeopenwindowsmenu() + self.makehelpmenu() + self._menustocheck = [closeitem, + undoitem, cutitem, copyitem, pasteitem, + selallitem, + runitem, homepageitem] + + def makehelpmenu(self): + python_app = os.path.join(sys.prefix, 'Resources/Python.app') + help_source = os.path.join(python_app, 'Contents/Resources/English.lproj/Documentation') + hashelp = os.path.isdir(help_source) + + self.helpmenu = m = self.gethelpmenu() + helpitem1 = FrameWork.MenuItem(m, "PackageManager Help", None, self.domenu_packmanhelp) + helpitem1.enable(hashelp) + helpitem2 = FrameWork.MenuItem(m, "MacPython Help", None, self.domenu_pythonhelp) + helpitem2.enable(hashelp) + + def quitevent(self, theAppleEvent, theReply): + self._quit() + + def ignoreevent(self, theAppleEvent, theReply): + pass + + def opendocsevent(self, theAppleEvent, theReply): + W.SetCursor('watch') + import aetools + parameters, args = aetools.unpackevent(theAppleEvent) + docs = parameters['----'] + if type(docs) <> type([]): + docs = [docs] + for doc in docs: + fsr, a = doc.FSResolveAlias(None) + path = fsr.as_pathname() + path = urllib.pathname2url(path) + self.opendoc(path) + + def opendoc(self, url): + if url: + self.defaulturl = url + PackageBrowser(url) + + def getabouttext(self): + return "About Package Manager"+ELIPSES + + def do_about(self, id, item, window, event): + EasyDialogs.Message("Package Install Manager for Python\nPackMan engine (pimp) version: %s" % + pimp.PIMP_VERSION) + + def domenu_openstandard(self, *args): + if pimp.PIMP_VERSION >= "0.4": + url = pimp.getDefaultDatabase() + else: + # 0.3 compatibility + url = None + self.opendoc(url) + + def domenu_openexperimental(self, *args): + database = pimp.getDefaultDatabase(experimental=True) + self.opendoc(database) + + def domenu_open(self, *args): + filename = EasyDialogs.AskFileForOpen(typeList=("TEXT",)) + if filename: + filename = urllib.pathname2url(filename) + self.opendoc(filename) + + def domenu_openURL(self, *args): + ok = EasyDialogs.AskYesNoCancel( + "Warning: by opening a non-standard database " + "you are trusting the maintainer of it " + "to run arbitrary code on your machine.", + yes="OK", no="") + if ok <= 0: return + url = EasyDialogs.AskString("URL of database to open:", + default=self.defaulturl, ok="Open") + if url: + self.opendoc(url) + + def domenu_opendatabasepage(self): + import ic + + icr = ic.IC() + icr.launchurl(PACKMAN_HOMEPAGE) + def makeopenwindowsmenu(self): + for i in range(len(self.openwindowsmenu.items)): + self.openwindowsmenu.menu.DeleteMenuItem(1) + self.openwindowsmenu.items = [] + windows = [] + self._openwindows = {} + for window in self._windows.keys(): + title = window.GetWTitle() + if not title: + title = "<no title>" + windows.append((title, window)) + windows.sort() + for title, window in windows: + shortcut = None + item = FrameWork.MenuItem(self.openwindowsmenu, title, shortcut, callback = self.domenu_openwindows) + self._openwindows[item.item] = window + self._openwindowscheckmark = 0 + self.checkopenwindowsmenu() + + def domenu_openwindows(self, id, item, window, event): + w = self._openwindows[item] + w.ShowWindow() + w.SelectWindow() + + def domenu_quit(self): + self._quit() + + def domenu_save(self, *args): + print "Save" + + def domenu_pythonhelp(self, *args): + from Carbon import AH + AH.AHGotoPage("MacPython Help", None, None) + + def domenu_packmanhelp(self, *args): + from Carbon import AH + AH.AHGotoPage("MacPython Help", "packman.html", None) + + def _quit(self): +## import PyConsole, PyEdit + for window in self._windows.values(): + try: + rv = window.close() # ignore any errors while quitting + except: + rv = 0 # (otherwise, we can get stuck!) + if rv and rv > 0: + return +## try: +## PyConsole.console.writeprefs() +## PyConsole.output.writeprefs() +## PyEdit.searchengine.writeprefs() +## except: +## # Write to __stderr__ so the msg end up in Console.app and has +## # at least _some_ chance of getting read... +## # But: this is a workaround for way more serious problems with +## # the Python 2.2 Jaguar addon. +## sys.__stderr__.write("*** PythonIDE: Can't write preferences ***\n") + self.quitting = 1 + class PimpInterface: - def setuppimp(self, url): - self.pimpprefs = pimp.PimpPreferences() - self.pimpdb = pimp.PimpDatabase(self.pimpprefs) - if not url: - url = self.pimpprefs.pimpDatabase - try: - self.pimpdb.appendURL(url) - except IOError, arg: - rv = "Cannot open %s: %s\n" % (url, arg) - rv += "\nSee MacPython Package Manager help page." - return rv - except: - rv = "Unspecified error while parsing database: %s\n" % url - rv += "Usually, this means the database is not correctly formatted.\n" - rv += "\nSee MacPython Package Manager help page." - return rv - # Check whether we can write the installation directory. - # If not, set to the per-user directory, possibly - # creating it, if needed. - installDir = self.pimpprefs.installDir - if not os.access(installDir, os.R_OK|os.W_OK|os.X_OK): - rv = self.setuserinstall(1) - if rv: return rv - return self.pimpprefs.check() - - def closepimp(self): - self.pimpdb.close() - self.pimpprefs = None - self.pimpdb = None - self.packages = [] - - def setuserinstall(self, onoff): - rv = "" - if onoff: - if not os.path.exists(USER_INSTALL_DIR): - try: - os.makedirs(USER_INSTALL_DIR) - except OSError, arg: - rv = rv + arg + "\n" - if not USER_INSTALL_DIR in sys.path: - import site - reload(site) - self.pimpprefs.setInstallDir(USER_INSTALL_DIR) - else: - self.pimpprefs.setInstallDir(None) - rv = rv + self.pimpprefs.check() - return rv - - def getuserinstall(self): - return self.pimpprefs.installDir == USER_INSTALL_DIR - - def getbrowserdata(self, show_hidden=1): - packages = self.pimpdb.list() - if show_hidden: - self.packages = packages - else: - self.packages = [] - for pkg in packages: - name = pkg.fullname() - if name[0] == '(' and name[-1] == ')' and not show_hidden: - continue - self.packages.append(pkg) - rv = [] - for pkg in self.packages: - name = pkg.fullname() - status, _ = pkg.installed() - description = pkg.description() - description_line1 = description.split('\n')[0] - rv.append((status, name, description_line1)) - return rv - - def getstatus(self, number): - pkg = self.packages[number] - return pkg.installed() - - def installpackage(self, sel, output, recursive, force): - pkg = self.packages[sel] - pimpinstaller = pimp.PimpInstaller(self.pimpdb) - list, messages = pimpinstaller.prepareInstall(pkg, force, recursive) - if messages: - return messages - messages = pimpinstaller.install(list, output) - return messages - + def setuppimp(self, url): + self.pimpprefs = pimp.PimpPreferences() + self.pimpdb = pimp.PimpDatabase(self.pimpprefs) + if not url: + url = self.pimpprefs.pimpDatabase + try: + self.pimpdb.appendURL(url) + except IOError, arg: + rv = "Cannot open %s: %s\n" % (url, arg) + rv += "\nSee MacPython Package Manager help page." + return rv + except: + rv = "Unspecified error while parsing database: %s\n" % url + rv += "Usually, this means the database is not correctly formatted.\n" + rv += "\nSee MacPython Package Manager help page." + return rv + # Check whether we can write the installation directory. + # If not, set to the per-user directory, possibly + # creating it, if needed. + installDir = self.pimpprefs.installDir + if not os.access(installDir, os.R_OK|os.W_OK|os.X_OK): + rv = self.setuserinstall(1) + if rv: return rv + return self.pimpprefs.check() + + def closepimp(self): + self.pimpdb.close() + self.pimpprefs = None + self.pimpdb = None + self.packages = [] + + def setuserinstall(self, onoff): + rv = "" + if onoff: + if not os.path.exists(USER_INSTALL_DIR): + try: + os.makedirs(USER_INSTALL_DIR) + except OSError, arg: + rv = rv + arg + "\n" + if not USER_INSTALL_DIR in sys.path: + import site + reload(site) + self.pimpprefs.setInstallDir(USER_INSTALL_DIR) + else: + self.pimpprefs.setInstallDir(None) + rv = rv + self.pimpprefs.check() + return rv + + def getuserinstall(self): + return self.pimpprefs.installDir == USER_INSTALL_DIR + + def getbrowserdata(self, show_hidden=1): + packages = self.pimpdb.list() + if show_hidden: + self.packages = packages + else: + self.packages = [] + for pkg in packages: + name = pkg.fullname() + if name[0] == '(' and name[-1] == ')' and not show_hidden: + continue + self.packages.append(pkg) + rv = [] + for pkg in self.packages: + name = pkg.fullname() + status, _ = pkg.installed() + description = pkg.description() + description_line1 = description.split('\n')[0] + rv.append((status, name, description_line1)) + return rv + + def getstatus(self, number): + pkg = self.packages[number] + return pkg.installed() + + def installpackage(self, sel, output, recursive, force): + pkg = self.packages[sel] + pimpinstaller = pimp.PimpInstaller(self.pimpdb) + list, messages = pimpinstaller.prepareInstall(pkg, force, recursive) + if messages: + return messages + messages = pimpinstaller.install(list, output) + return messages + class PackageBrowser(PimpInterface): - - def __init__(self, url = None): - self.ic = None - messages = self.setuppimp(url) - self.setupwidgets() - self.updatestatus() - self.showmessages(messages) - - def close(self): - self.closepimp() - - def setupwidgets(self): - DESCRIPTION_HEIGHT = 140 - INSTALL_POS = -30 - STATUS_POS = INSTALL_POS - (70 + DESCRIPTION_HEIGHT) - self.w = W.Window((580, 600), "Python Install Manager", minsize = (400, 400), tabbable = 0) - self.w.titlebar = W.TextBox((4, 8, 60, 18), 'Packages:') - self.w.hidden_button = W.CheckBox((-100, 4, 0, 18), 'Show Hidden', self.updatestatus) - data = self.getbrowserdata() - self.w.packagebrowser = W.MultiList((4, 24, 0, STATUS_POS-2), data, self.listhit, cols=3) - - self.w.installed_l = W.TextBox((4, STATUS_POS, 70, 12), 'Installed:') - self.w.installed = W.TextBox((74, STATUS_POS, 0, 12), '') - self.w.message_l = W.TextBox((4, STATUS_POS+20, 70, 12), 'Status:') - self.w.message = W.TextBox((74, STATUS_POS+20, 0, 12), '') - self.w.homepage_button = W.Button((4, STATUS_POS+40, 96, 18), 'View homepage', self.do_homepage) - self.w.description_l = W.TextBox((4, STATUS_POS+70, 70, 12), 'Description:') - self.w.description = W.EditText((74, STATUS_POS+70, 0, DESCRIPTION_HEIGHT-4)) - - self.w.divline = W.HorizontalLine((0, INSTALL_POS-4, 0, 0)) - self.w.verbose_button = W.CheckBox((84, INSTALL_POS+4, 60, 18), 'Verbose') - self.w.recursive_button = W.CheckBox((146, INSTALL_POS+4, 120, 18), 'Install dependencies', self.updatestatus) - self.w.recursive_button.set(1) - self.w.force_button = W.CheckBox((268, INSTALL_POS+4, 70, 18), 'Overwrite', self.updatestatus) - self.w.user_button = W.CheckBox((340, INSTALL_POS+4, 140, 18), 'For Current User Only', self.do_user) - self.w.install_button = W.Button((4, INSTALL_POS+4, 56, 18), 'Install:', self.do_install) - self.w.open() - self.w.description.enable(0) - - def updatestatus(self): - topcell = self.w.packagebrowser.gettopcell() - sel = self.w.packagebrowser.getselection() - data = self.getbrowserdata(self.w.hidden_button.get()) - self.w.packagebrowser.setitems(data) - self.w.user_button.set(self.getuserinstall()) - if len(sel) != 1: - self.w.installed.set('') - self.w.message.set('') - self.w.install_button.enable(0) - self.w.homepage_button.enable(0) - self.w.description.set('') - self.w.verbose_button.enable(0) - self.w.recursive_button.enable(0) - self.w.force_button.enable(0) - self.w.user_button.enable(0) - else: - sel = sel[0] - if sel >= len(self.packages): - sel = 0 - self.w.packagebrowser.setselection([sel]) - installed, message = self.getstatus(sel) - self.w.installed.set(installed) - self.w.message.set(message) - self.w.install_button.enable(installed != "yes" or self.w.force_button.get()) - self.w.homepage_button.enable(not not self.packages[sel].homepage()) - description = self.packages[sel].description() - description = description.splitlines() - description = '\r'.join(description) - self.w.description.set(description) - self.w.verbose_button.enable(1) - self.w.recursive_button.enable(1) - self.w.force_button.enable(1) - self.w.user_button.enable(1) - self.w.packagebrowser.settopcell(topcell) - - def listhit(self, *args, **kwargs): - self.updatestatus() - - def do_install(self): - sel = self.w.packagebrowser.getselection()[0] - if self.w.verbose_button.get(): - output = sys.stdout - else: - output = None - recursive = self.w.recursive_button.get() - force = self.w.force_button.get() - messages = self.installpackage(sel, output, recursive, force) - - # Re-read .pth files - import site - reload(site) - - self.updatestatus() - self.showmessages(messages) - - def showmessages(self, messages): - if messages: - # To be on the safe side we always show the hidden packages, - # they may be referred to in the error messages. - if not self.w.hidden_button.get(): - self.w.hidden_button.set(1) - self.updatestatus() - if type(messages) == list: - messages = '\n'.join(messages) - if self.w.verbose_button.get(): - sys.stdout.write(messages + '\n') - EasyDialogs.Message(messages) - - def do_homepage(self): - sel = self.w.packagebrowser.getselection()[0] - if not self.ic: - import ic - - self.ic = ic.IC() - self.ic.launchurl(self.packages[sel].homepage()) - - def do_user(self): - messages = self.setuserinstall(self.w.user_button.get()) - self.updatestatus() - self.showmessages(messages) - + + def __init__(self, url = None): + self.ic = None + messages = self.setuppimp(url) + self.setupwidgets() + self.updatestatus() + self.showmessages(messages) + + def close(self): + self.closepimp() + + def setupwidgets(self): + DESCRIPTION_HEIGHT = 140 + INSTALL_POS = -30 + STATUS_POS = INSTALL_POS - (70 + DESCRIPTION_HEIGHT) + self.w = W.Window((580, 600), "Python Install Manager", minsize = (400, 400), tabbable = 0) + self.w.titlebar = W.TextBox((4, 8, 60, 18), 'Packages:') + self.w.hidden_button = W.CheckBox((-100, 4, 0, 18), 'Show Hidden', self.updatestatus) + data = self.getbrowserdata() + self.w.packagebrowser = W.MultiList((4, 24, 0, STATUS_POS-2), data, self.listhit, cols=3) + + self.w.installed_l = W.TextBox((4, STATUS_POS, 70, 12), 'Installed:') + self.w.installed = W.TextBox((74, STATUS_POS, 0, 12), '') + self.w.message_l = W.TextBox((4, STATUS_POS+20, 70, 12), 'Status:') + self.w.message = W.TextBox((74, STATUS_POS+20, 0, 12), '') + self.w.homepage_button = W.Button((4, STATUS_POS+40, 96, 18), 'View homepage', self.do_homepage) + self.w.description_l = W.TextBox((4, STATUS_POS+70, 70, 12), 'Description:') + self.w.description = W.EditText((74, STATUS_POS+70, 0, DESCRIPTION_HEIGHT-4)) + + self.w.divline = W.HorizontalLine((0, INSTALL_POS-4, 0, 0)) + self.w.verbose_button = W.CheckBox((84, INSTALL_POS+4, 60, 18), 'Verbose') + self.w.recursive_button = W.CheckBox((146, INSTALL_POS+4, 120, 18), 'Install dependencies', self.updatestatus) + self.w.recursive_button.set(1) + self.w.force_button = W.CheckBox((268, INSTALL_POS+4, 70, 18), 'Overwrite', self.updatestatus) + self.w.user_button = W.CheckBox((340, INSTALL_POS+4, 140, 18), 'For Current User Only', self.do_user) + self.w.install_button = W.Button((4, INSTALL_POS+4, 56, 18), 'Install:', self.do_install) + self.w.open() + self.w.description.enable(0) + + def updatestatus(self): + topcell = self.w.packagebrowser.gettopcell() + sel = self.w.packagebrowser.getselection() + data = self.getbrowserdata(self.w.hidden_button.get()) + self.w.packagebrowser.setitems(data) + self.w.user_button.set(self.getuserinstall()) + if len(sel) != 1: + self.w.installed.set('') + self.w.message.set('') + self.w.install_button.enable(0) + self.w.homepage_button.enable(0) + self.w.description.set('') + self.w.verbose_button.enable(0) + self.w.recursive_button.enable(0) + self.w.force_button.enable(0) + self.w.user_button.enable(0) + else: + sel = sel[0] + if sel >= len(self.packages): + sel = 0 + self.w.packagebrowser.setselection([sel]) + installed, message = self.getstatus(sel) + self.w.installed.set(installed) + self.w.message.set(message) + self.w.install_button.enable(installed != "yes" or self.w.force_button.get()) + self.w.homepage_button.enable(not not self.packages[sel].homepage()) + description = self.packages[sel].description() + description = description.splitlines() + description = '\r'.join(description) + self.w.description.set(description) + self.w.verbose_button.enable(1) + self.w.recursive_button.enable(1) + self.w.force_button.enable(1) + self.w.user_button.enable(1) + self.w.packagebrowser.settopcell(topcell) + + def listhit(self, *args, **kwargs): + self.updatestatus() + + def do_install(self): + sel = self.w.packagebrowser.getselection()[0] + if self.w.verbose_button.get(): + output = sys.stdout + else: + output = None + recursive = self.w.recursive_button.get() + force = self.w.force_button.get() + messages = self.installpackage(sel, output, recursive, force) + + # Re-read .pth files + import site + reload(site) + + self.updatestatus() + self.showmessages(messages) + + def showmessages(self, messages): + if messages: + # To be on the safe side we always show the hidden packages, + # they may be referred to in the error messages. + if not self.w.hidden_button.get(): + self.w.hidden_button.set(1) + self.updatestatus() + if type(messages) == list: + messages = '\n'.join(messages) + if self.w.verbose_button.get(): + sys.stdout.write(messages + '\n') + EasyDialogs.Message(messages) + + def do_homepage(self): + sel = self.w.packagebrowser.getselection()[0] + if not self.ic: + import ic + + self.ic = ic.IC() + self.ic.launchurl(self.packages[sel].homepage()) + + def do_user(self): + messages = self.setuserinstall(self.w.user_button.get()) + self.updatestatus() + self.showmessages(messages) + if __name__ == '__main__': - PackageManagerMain() + PackageManagerMain() |